void AMFString::read(FILE *fp) { unsigned short len = fread_16(fp); s.reserve(len); while (len > 0) { unsigned char c = fread_8(fp); s += c; len--; } }
class AMF * fread_AMF(FILE *fp) { unsigned char type; type = fread_8(fp); switch (type) { case AMF_Double: // double return new AMFDouble(fp); case AMF_Boolean: // boolean return new AMFBoolean(fp); case AMF_String: // string return new AMFString(fp); case AMF_Object: // object return new AMFObject(fp); case AMF_Mixed_Array: // mixed_array return new AMFMixed_Array(fp); case AMF_Array: // array return new AMFArray(fp); case AMF_Date: // date return new AMFDate(fp); } return NULL; }
void AMFBoolean::read(FILE *fp) { unsigned char tmp = fread_8(fp); b = (tmp != 0); }
int main(int argc, char *argv[]) { const char *infile, *outfile; FILE *in, *out; static const uint8_t buf[4096]; size_t elems; uint8_t properties; uint32_t dictsize; uint64_t datasize; uint32_t magic = 0xfeed1281L; uint32_t reclength = 0; fpos_t reclengthpos; uint32_t loadaddress = 0; uint32_t type = 0x075a0201L; /* might be 7Z 2.1? */ uint32_t checksum = 0; uint32_t compsize = 0; fpos_t compsizepos; uint32_t datasize32 = 0; uint32_t datacrc32 = crc32(0, 0, 0); uint32_t entry = 0; if (argc != 5) usage(); /* "parse" command line */ loadaddress = strtoul(argv[1], 0, 0); entry = strtoul(argv[2], 0, 0); infile = argv[3]; outfile = argv[4]; in = fopen(infile, "rb"); if (!in) pexit("fopen"); out = fopen(outfile, "w+b"); if (!out) pexit("fopen"); /* read LZMA header */ if (fread_8(&properties, in)) pexit("fread"); if (fread_le32(&dictsize, in)) pexit("fread"); if (fread_le64(&datasize, in)) pexit("fread"); /* write EVA header */ if (fwrite_le32(magic, out)) pexit("fwrite"); if (fgetpos(out, &reclengthpos)) pexit("fgetpos"); if (fwrite_le32(reclength, out)) pexit("fwrite"); if (fwrite_le32(loadaddress, out)) pexit("fwrite"); if (fwrite_le32(type, out)) pexit("fwrite"); /* write EVA LZMA header */ if (fgetpos(out, &compsizepos)) pexit("fgetpos"); if (fwrite_le32(compsize, out)) pexit("fwrite"); /* XXX check length */ datasize32 = (uint32_t)datasize; if (fwrite_le32(datasize32, out)) pexit("fwrite"); if (fwrite_le32(datacrc32, out)) pexit("fwrite"); /* write modified LZMA header */ if (fwrite_8(properties, out)) pexit("fwrite"); if (fwrite_le32(dictsize, out)) pexit("fwrite"); if (fwrite_le32(0, out)) pexit("fwrite"); /* copy compressed data, calculate crc32 */ while (0 < (elems = fread(&buf, sizeof buf[0], sizeof buf, in))) { compsize += elems; if (elems != fwrite(&buf, sizeof buf[0], elems, out)) pexit("fwrite"); datacrc32 = crc32(datacrc32, buf, elems); } if (ferror(in)) pexit("fread"); fclose(in); /* re-write record length */ reclength = compsize + 24; if (fsetpos(out, &reclengthpos)) pexit("fsetpos"); if (fwrite_le32(reclength, out)) pexit("fwrite"); /* re-write EVA LZMA header including size and data crc */ if (fsetpos(out, &compsizepos)) pexit("fsetpos"); if (fwrite_le32(compsize, out)) pexit("fwrite"); if (fwrite_le32(datasize32, out)) pexit("fwrite"); if (fwrite_le32(datacrc32, out)) pexit("fwrite"); /* calculate record checksum */ checksum += reclength; checksum += loadaddress; checksum_add32(checksum, type); checksum_add32(checksum, compsize); checksum_add32(checksum, datasize32); checksum_add32(checksum, datacrc32); if (fseek(out, 0, SEEK_CUR)) pexit("fseek"); while (0 < (elems = fread(&buf, sizeof buf[0], sizeof buf, out))) { size_t i; for (i = 0; i < elems; ++i) checksum += buf[i]; } if (ferror(out)) pexit("fread"); if (fseek(out, 0, SEEK_CUR)) pexit("fseek"); checksum = ~checksum + 1; if (fwrite_le32(checksum, out)) pexit("fwrite"); /* write entry record */ if (fwrite_le32(0, out)) pexit("fwrite"); if (fwrite_le32(entry, out)) pexit("fwrite"); if (fclose(out)) pexit("fclose"); return 0; }