void REFRRecord::REFRXSED::Write(FileWriter &writer) { if(isOffset) writer.record_write_subrecord(REV32(XSED), &offset, 1); else writer.record_write_subrecord(REV32(XSED), &seed, 4); }
SINT32 GMSTRecord::WriteRecord(FileWriter &writer) { if(EDID.IsLoaded()) //Should only be false if the record was marked deleted { WRITE(EDID); UINT8 null = 0; switch(DATA.format) { case 'i': writer.record_write_subrecord(REV32(DATA), &DATA.i, 4); break; case 'f': writer.record_write_subrecord(REV32(DATA), &DATA.f, 4); break; case 's': if(DATA.s != NULL) writer.record_write_subrecord(REV32(DATA), DATA.s, (UINT32)strlen(DATA.s) + 1); else writer.record_write_subrecord(REV32(DATA), &null, 1); break; default: printer("Unknown GMST format (%c) when writing: %s\n", DATA.format, EDID.value); break; } } return -1; }
int32_t RGDLRecord::ParseRecord(unsigned char *buffer, unsigned char *end_buffer, bool CompressedOnDisk) { uint32_t subType = 0; uint32_t subSize = 0; while(buffer < end_buffer){ subType = *(uint32_t *)buffer; buffer += 4; switch(subType) { case REV32(XXXX): buffer += 2; subSize = *(uint32_t *)buffer; buffer += 4; subType = *(uint32_t *)buffer; buffer += 6; break; default: subSize = *(uint16_t *)buffer; buffer += 2; break; } switch(subType) { case REV32(EDID): EDID.Read(buffer, subSize, CompressedOnDisk); break; case REV32(NVER): NVER.Read(buffer, subSize); break; case REV32(DATA): DATA.Read(buffer, subSize); break; case REV32(XNAM): XNAM.Read(buffer, subSize); break; case REV32(TNAM): TNAM.Read(buffer, subSize); break; case REV32(RAFD): RAFD.Read(buffer, subSize); break; case REV32(RAFB): RAFB.Read(buffer, subSize); break; case REV32(RAPS): RAPS.Read(buffer, subSize); break; case REV32(ANAM): ANAM.Read(buffer, subSize, CompressedOnDisk); break; default: UnrecognizedSubRecord(formID, subType, subSize, buffer, end_buffer); break; } }; return 0; }
void VMADRecord::Read(unsigned char *&buffer, const uint32_t &subSize, const uint32_t &recordType, bool CompressedOnDisk) { unsigned char *end_buffer = buffer + subSize; // objFormat/version int16_t version = *(int16_t *)buffer; buffer += 2; int16_t objFormat = *(int16_t *)buffer; buffer += 2; // Scripts uint16_t count = *(uint16_t *)buffer; buffer += 2; for (uint16_t i = 0; i < count; ++i) { scripts.push_back(new Script); scripts.back()->Read(buffer, version, objFormat, CompressedOnDisk); } // Check for script fragments fragment = NULL; if (buffer < end_buffer) { switch (recordType) { case REV32(INFO): fragment = (Fragments *)new FragmentINFO; ((FragmentINFO *)fragment)->Read(buffer, CompressedOnDisk); break; case REV32(PACK): fragment = (Fragments *)new FragmentPACK; ((FragmentPACK *)fragment)->Read(buffer, CompressedOnDisk); break; case REV32(PERK): fragment = (Fragments *)new FragmentPERK; ((FragmentPERK *)fragment)->Read(buffer, CompressedOnDisk); break; case REV32(QUST): fragment = (Fragments *)new FragmentQUST; ((FragmentQUST *)fragment)->Read(buffer, version, objFormat, CompressedOnDisk); break; case REV32(SCEN): fragment = (Fragments *)new FragmentSCEN; ((FragmentSCEN *)fragment)->Read(buffer, CompressedOnDisk); break; default: // TODO: error message break; }; } else if (buffer > end_buffer) { // TODO: error message } buffer = end_buffer; }
int readSecondary(OPENML_SECONDARY_INDEX *index,FILE *fd) { if(1!=fread(index,sizeof(OPENML_SECONDARY_INDEX),1,fd)) return 0; #ifdef ADM_BIG_ENDIAN REV16(longsPerEntry); REV32(nbEntryInUse); REV32(chunkId); REV64(base); REV32(reserver); #endif return 1; }
SINT32 LVSPRecord::ParseRecord(unsigned char *buffer, unsigned char *end_buffer, bool CompressedOnDisk) { UINT32 subType = 0; UINT32 subSize = 0; while(buffer < end_buffer){ subType = *(UINT32 *)buffer; buffer += 4; switch(subType) { case REV32(XXXX): buffer += 2; subSize = *(UINT32 *)buffer; buffer += 4; subType = *(UINT32 *)buffer; buffer += 6; break; default: subSize = *(UINT16 *)buffer; buffer += 2; break; } switch(subType) { case REV32(EDID): EDID.Read(buffer, subSize, CompressedOnDisk); break; case REV32(LVLD): LVLD.Read(buffer, subSize); if((LVLD.value & fAltCalcFromAllLevels) != 0) { LVLD.value &= ~fAltCalcFromAllLevels; IsCalcFromAllLevels(true); } break; case REV32(LVLF): LVLF.Read(buffer, subSize); break; case REV32(LVLO): Entries.Read(buffer, subSize); break; default: //printer("FileName = %s\n", FileName); printer(" LVSP: %08X - Unknown subType = %04x\n", formID, subType); CBASH_CHUNK_DEBUG printer(" Size = %i\n", subSize); printer(" CurPos = %04x\n\n", buffer - 6); buffer = end_buffer; break; } }; return 0; }
SINT32 STATRecord::ParseRecord(unsigned char *buffer, unsigned char *end_buffer, bool CompressedOnDisk) { UINT32 subType = 0; UINT32 subSize = 0; while(buffer < end_buffer){ subType = *(UINT32 *)buffer; buffer += 4; switch(subType) { case REV32(XXXX): buffer += 2; subSize = *(UINT32 *)buffer; buffer += 4; subType = *(UINT32 *)buffer; buffer += 6; break; default: subSize = *(UINT16 *)buffer; buffer += 2; break; } switch(subType) { case REV32(EDID): EDID.Read(buffer, subSize, CompressedOnDisk); break; case REV32(MODL): MODL.Load(); MODL->MODL.Read(buffer, subSize, CompressedOnDisk); break; case REV32(MODB): MODL.Load(); MODL->MODB.Read(buffer, subSize); break; case REV32(MODT): MODL.Load(); MODL->MODT.Read(buffer, subSize, CompressedOnDisk); break; default: //printer("FileName = %s\n", FileName); printer(" STAT: %08X - Unknown subType = %04x\n", formID, subType); CBASH_CHUNK_DEBUG printer(" Size = %i\n", subSize); printer(" CurPos = %04x\n\n", buffer - 6); buffer = end_buffer; break; } }; return 0; }
/* Go here to solve endianness issues */ int readMasterIndex(OPENDML_INDEX *index,FILE *fd) { if(1!=fread(index,sizeof(OPENDML_INDEX),1,fd)) return 0; #ifdef ADM_BIG_ENDIAN #define REV16(x) index->x=R16(index->x) #define REV32(x) index->x=R32(index->x) #define REV64(x) index->x=R64(index->x) REV16(longsPerEntry); REV32(nbEntryInUse); REV32(chunkId); #endif return 1; }
int32_t SHOURecord::ParseRecord(unsigned char *buffer, unsigned char *end_buffer, bool CompressedOnDisk) { uint32_t subType = 0; uint32_t subSize = 0; StringLookups *LookupStrings = GetParentMod()->TES4.LookupStrings; while(buffer < end_buffer) { subType = *(uint32_t *)buffer; buffer += 4; switch(subType) { case REV32(XXXX): buffer += 2; subSize = *(uint32_t *)buffer; buffer += 4; subType = *(uint32_t *)buffer; buffer += 6; break; default: subSize = *(uint16_t *)buffer; buffer += 2; break; } switch(subType) { case REV32(EDID): EDID.Read(buffer, subSize, CompressedOnDisk); break; case REV32(FULL): FULL.Read(buffer, subSize, CompressedOnDisk, LookupStrings); break; case REV32(MDOB): MDOB.Read(buffer, subSize); break; case REV32(SNAM): SNAM.Read(buffer, subSize); break; default: //printer("Filename = %s\n", FileName); printer(" AACT: %08X - Unknown subType = %04x\n", formID, subType); CBASH_CHUNK_DEBUG printer(" Size = %i\n", subSize); printer(" CurPos = %04x\n", buffer - 6); buffer = end_buffer; break; } }; return 0; }
//read big endian 32-Bit from fileposition(position) uint32_t AudioPlaySdAac::fread32(size_t position) { uint32_t tmp32; fseek(position); fread((uint8_t *) &tmp32, sizeof(tmp32)); return REV32(tmp32); }
int32_t CREARecord::WriteRecord(FileWriter &writer) { WRITE(EDID); WRITE(FULL); MODL.Write(writer); WRITE(SPLO); WRITE(NIFZ); WRITE(NIFT); WRITE(ACBS); WRITE(SNAM); WRITE(INAM); WRITE(SCRI); WRITE(CNTO); WRITE(AIDT); PKID.Write(REV32(PKID), writer, true); WRITE(KFFZ); WRITE(DATA); WRITE(RNAM); WRITE(ZNAM); WRITE(TNAM); WRITE(BNAM); WRITE(WNAM); WRITE(CSCR); WRITE(NAM0); WRITE(NAM1); Sounds.Write(writer); return -1; }
int readSuperEntries(OPENDML_ENTRY *entries,int count,FILE *fd) { if(1!=fread(entries,sizeof(OPENDML_ENTRY)*count,1,fd)) return 0; #ifdef ADM_BIG_ENDIAN OPENDML_ENTRY *index; for(int i=0;i<count;i++) { index=&(entries[i]); REV64(offset); REV32(size); REV32(duration); } #endif return 1; }
int32_t EYESRecord::ParseRecord(unsigned char *buffer, unsigned char *end_buffer, bool CompressedOnDisk) { uint32_t subType = 0; uint32_t subSize = 0; while(buffer < end_buffer){ subType = *(uint32_t *)buffer; buffer += 4; switch(subType) { case REV32(XXXX): buffer += 2; subSize = *(uint32_t *)buffer; buffer += 4; subType = *(uint32_t *)buffer; buffer += 6; break; default: subSize = *(uint16_t *)buffer; buffer += 2; break; } switch(subType) { case REV32(EDID): EDID.Read(buffer, subSize, CompressedOnDisk); break; case REV32(FULL): FULL.Read(buffer, subSize, CompressedOnDisk); break; case REV32(ICON): ICON.Read(buffer, subSize, CompressedOnDisk); break; case REV32(DATA): DATA.Read(buffer, subSize); break; default: //printer("FileName = %s\n", FileName); printer(" EYES: %08X - Unknown subType = %04x\n", formID, subType); CBASH_CHUNK_DEBUG printer(" Size = %i\n", subSize); printer(" CurPos = %04x\n\n", buffer - 6); buffer = end_buffer; break; } }; return 0; }
SINT32 EYESRecord::ParseRecord(unsigned char *buffer, unsigned char *end_buffer, bool CompressedOnDisk) { UINT32 subType = 0; UINT32 subSize = 0; while(buffer < end_buffer){ subType = *(UINT32 *)buffer; buffer += 4; switch(subType) { case REV32(XXXX): buffer += 2; subSize = *(UINT32 *)buffer; buffer += 4; subType = *(UINT32 *)buffer; buffer += 6; break; default: subSize = *(UINT16 *)buffer; buffer += 2; break; } switch(subType) { case REV32(EDID): EDID.Read(buffer, subSize, CompressedOnDisk); break; case REV32(FULL): FULL.Read(buffer, subSize, CompressedOnDisk); break; case REV32(ICON): ICON.Read(buffer, subSize, CompressedOnDisk); break; case REV32(DATA): DATA.Read(buffer, subSize); break; default: //printer("FileName = %s\n", FileName); printer(" EYES: Unknown subType = %04X\n", subType); printer(" Size = %i\n", subSize); printer(" CurPos = %04x\n\n", buffer - 6); buffer = end_buffer; break; } }; return 0; }
int32_t RCPERecord::ParseRecord(unsigned char *buffer, unsigned char *end_buffer, bool CompressedOnDisk) { uint32_t subType = 0; uint32_t subSize = 0; while(buffer < end_buffer){ subType = *(uint32_t *)buffer; buffer += 4; switch(subType) { case REV32(XXXX): buffer += 2; subSize = *(uint32_t *)buffer; buffer += 4; subType = *(uint32_t *)buffer; buffer += 6; break; default: subSize = *(uint16_t *)buffer; buffer += 2; break; } switch(subType) { case REV32(EDID): EDID.Read(buffer, subSize, CompressedOnDisk); break; case REV32(FULL): FULL.Read(buffer, subSize, CompressedOnDisk); break; case REV32(CTDA): //CTDA.Read(buffer, subSize); break; case REV32(DATA): //DATA.Read(buffer, subSize); break; case REV32(RCIL): //RCIL.Read(buffer, subSize); break; case REV32(RCQY): //RCQY.Read(buffer, subSize); break; case REV32(RCOD): //RCOD.Read(buffer, subSize); break; default: //printf("FileName = %s\n", FileName); printf(" RCPE: %08X - Unknown subType = %04x\n", formID, subType); printf(" Size = %i\n", subSize); printf(" CurPos = %04x\n\n", buffer - 6); buffer = end_buffer; break; } }; return 0; }
//read big endian 32-Bit from fileposition(position) uint32_t fread32(File file, size_t position) { uint32_t tmp32; file.seek(position); file.read((uint8_t *) &tmp32, sizeof(tmp32)); return REV32(tmp32); }
SINT32 RCCTRecord::ParseRecord(unsigned char *buffer, const UINT32 &recSize) { UINT32 subType = 0; UINT32 subSize = 0; while(buffer < end_buffer){ subType = *(UINT32 *)buffer; buffer += 4; switch(subType) { case REV32(XXXX): buffer += 2; subSize = *(UINT32 *)buffer; buffer += 4; subType = *(UINT32 *)buffer; buffer += 6; break; default: subSize = *(UINT16 *)buffer; buffer += 2; break; } switch(subType) { case REV32(EDID): EDID.Read(buffer, subSize); break; case REV32(FULL): FULL.Read(buffer, subSize, CompressedOnDisk); break; case REV32(DATA): DATA.Read(buffer, subSize); break; default: //printf("FileName = %s\n", FileName); printf(" RCCT: %08X - Unknown subType = %04x\n", formID, subType); printf(" Size = %i\n", subSize); printf(" CurPos = %04x\n\n", buffer - 6); buffer = end_buffer; break; } }; return 0; }
int32_t ROADRecord::ParseRecord(unsigned char *buffer, unsigned char *end_buffer, bool CompressedOnDisk) { uint32_t subType = 0; uint32_t subSize = 0; while(buffer < end_buffer){ subType = *(uint32_t *)buffer; buffer += 4; switch(subType) { case REV32(XXXX): buffer += 2; subSize = *(uint32_t *)buffer; buffer += 4; subType = *(uint32_t *)buffer; buffer += 6; break; default: subSize = *(uint16_t *)buffer; buffer += 2; break; } switch(subType) { case REV32(PGRP): PGRP.Read(buffer, subSize); break; case REV32(PGRR): PGRR.Read(buffer, subSize); break; default: //printer("FileName = %s\n", FileName); printer(" ROADPGRR: %08X - Unknown subType = %04x\n", formID, subType); CBASH_CHUNK_DEBUG printer(" Size = %i\n", subSize); printer(" CurPos = %04x\n\n", buffer - 6); buffer = end_buffer; break; } }; return 0; }
int32_t FLSTRecord::ParseRecord(unsigned char *buffer, unsigned char *end_buffer, bool CompressedOnDisk) { uint32_t subType = 0; uint32_t subSize = 0; while(buffer < end_buffer){ subType = *(uint32_t *)buffer; buffer += 4; switch(subType) { case REV32(XXXX): buffer += 2; subSize = *(uint32_t *)buffer; buffer += 4; subType = *(uint32_t *)buffer; buffer += 6; break; default: subSize = *(uint16_t *)buffer; buffer += 2; break; } switch(subType) { case REV32(EDID): EDID.Read(buffer, subSize, CompressedOnDisk); break; case REV32(LNAM): LNAM.Read(buffer, subSize); break; default: //printf("FileName = %s\n", FileName); printf(" FLST: %08X - Unknown subType = %04x\n", formID, subType); printf(" Size = %i\n", subSize); printf(" CurPos = %04x\n\n", buffer - 6); buffer = end_buffer; break; } }; return 0; }
SINT32 LVLNRecord::WriteRecord(FileWriter &writer) { WRITE(EDID); WRITE(OBND); WRITE(LVLD); WRITE(LVLF); // Write LLCT UINT8 count = Entries.value.size(); writer.record_write_subrecord(REV32(LLCT),&count,sizeof(count)); Entries.Write(writer); WRITE(MODL); return -1; }
SINT32 LSCRRecord::ParseRecord(unsigned char *buffer, unsigned char *end_buffer, bool CompressedOnDisk) { UINT32 subType = 0; UINT32 subSize = 0; while(buffer < end_buffer){ subType = *(UINT32 *)buffer; buffer += 4; switch(subType) { case REV32(XXXX): buffer += 2; subSize = *(UINT32 *)buffer; buffer += 4; subType = *(UINT32 *)buffer; buffer += 6; break; default: subSize = *(UINT16 *)buffer; buffer += 2; break; } switch(subType) { case REV32(EDID): EDID.Read(buffer, subSize, CompressedOnDisk); break; case REV32(ICON): ICON.Read(buffer, subSize, CompressedOnDisk); break; case REV32(MICO): MICO.Read(buffer, subSize, CompressedOnDisk); break; case REV32(DESC): DESC.Read(buffer, subSize, CompressedOnDisk); break; case REV32(LNAM): LNAM.Read(buffer, subSize); break; case REV32(WMI1): WMI1.Read(buffer, subSize); break; default: //printer("FileName = %s\n", FileName); printer(" LSCR: %08X - Unknown subType = %04x\n", formID, subType); CBASH_CHUNK_DEBUG printer(" Size = %i\n", subSize); printer(" CurPos = %04x\n\n", buffer - 6); buffer = end_buffer; break; } }; return 0; }
SINT32 CCRDRecord::WriteRecord(FileWriter &writer) { WRITE(EDID); WRITE(OBND); WRITE(FULL); MODL.Write(writer); WRITE(ICON); WRITE(MICO); WRITE(SCRI); WRITE(YNAM); WRITE(ZNAM); if(TX00.IsLoaded()) { if(TX00->TX00.IsLoaded()) SaveHandler.writeSubRecord(REV32(TX00), TX00->TX00.value, TX00->TX00.GetSize()); if(TX00->TX01.IsLoaded()) SaveHandler.writeSubRecord(REV32(TX01), TX00->TX01.value, TX00->TX01.GetSize()); } if(INTV.IsLoaded()) { if(INTV->INTV.IsLoaded()) SaveHandler.writeSubRecord(REV32(INTV), INTV->INTV.value, INTV->INTV.GetSize()); } WRITE(INTV); WRITE(DATA); return -1; }
SINT32 TES4Record::WriteRecord(FileWriter &writer) { UINT8 DATA[8] = {0}; switch(whichGame) { case eIsOblivion: WRITE(HEDR); WRITE(OFST); WRITE(DELE); WRITE(CNAM); WRITE(SNAM); for(UINT32 p = 0; p < MAST.size(); p++) { writer.record_write_subrecord(REV32(MAST), MAST[p], (UINT32)strlen(MAST[p]) + 1); writer.record_write_subrecord(REV32(DATA), &DATA[0], sizeof(DATA)); } break; case eIsFallout3: printer("TES4Record::WriteRecord: Error - Unable to write TES4 record. Fallout 3 support not yet implemented.\n"); return -1; case eIsFalloutNewVegas: WRITE(HEDR); WRITE(OFST); WRITE(DELE); WRITE(CNAM); WRITE(SNAM); for(UINT32 p = 0; p < MAST.size(); p++) { writer.record_write_subrecord(REV32(MAST), MAST[p], (UINT32)strlen(MAST[p]) + 1); writer.record_write_subrecord(REV32(DATA), &DATA[0], sizeof(DATA)); } WRITE(ONAM); WRITE(SCRN); break; case eIsSkyrim: WRITE(HEDR); WRITE(OFST); WRITE(DELE); WRITE(CNAM); WRITE(SNAM); for(UINT32 p = 0; p < MAST.size(); p++) { writer.record_write_subrecord(REV32(MAST), MAST[p], (UINT32)strlen(MAST[p]) + 1); writer.record_write_subrecord(REV32(DATA), &DATA[0], sizeof(DATA)); } WRITE(INTV); WRITE(PURG); break; } return -1; }
SINT32 DIALRecord::ParseRecord(unsigned char *buffer, unsigned char *end_buffer, bool CompressedOnDisk) { UINT32 subType = 0; UINT32 subSize = 0; while(buffer < end_buffer){ subType = *(UINT32 *)buffer; buffer += 4; switch(subType) { case REV32(XXXX): buffer += 2; subSize = *(UINT32 *)buffer; buffer += 4; subType = *(UINT32 *)buffer; buffer += 6; break; default: subSize = *(UINT16 *)buffer; buffer += 2; break; } switch(subType) { case REV32(EDID): EDID.Read(buffer, subSize, CompressedOnDisk); break; case REV32(QSTI): QSTI.Read(buffer, subSize); break; case REV32(QSTR): QSTR.Read(buffer, subSize); break; case REV32(FULL): FULL.Read(buffer, subSize, CompressedOnDisk); break; case REV32(DATA): DATA.Read(buffer, subSize); break; default: //printer("FileName = %s\n", FileName); printer(" DIAL: %08X - Unknown subType = %04x\n", formID, subType); CBASH_CHUNK_DEBUG printer(" Size = %i\n", subSize); printer(" CurPos = %04x\n\n", buffer - 6); buffer = end_buffer; break; } }; return 0; }
SINT32 CPTHRecord::ParseRecord(unsigned char *buffer, unsigned char *end_buffer, bool CompressedOnDisk) { UINT32 subType = 0; UINT32 subSize = 0; while(buffer < end_buffer){ subType = *(UINT32 *)buffer; buffer += 4; switch(subType) { case REV32(XXXX): buffer += 2; subSize = *(UINT32 *)buffer; buffer += 4; subType = *(UINT32 *)buffer; buffer += 6; break; default: subSize = *(UINT16 *)buffer; buffer += 2; break; } switch(subType) { case REV32(EDID): EDID.Read(buffer, subSize, CompressedOnDisk); break; case REV32(CTDA): CTDA.Read(buffer, subSize); break; case REV32(ANAM): ANAM.Read(buffer, subSize); break; case REV32(DATA): DATA.Read(buffer, subSize); break; case REV32(SNAM): SNAM.Read(buffer, subSize); break; default: //printf("FileName = %s\n", FileName); printf(" CPTH: %08X - Unknown subType = %04x\n", formID, subType); printf(" Size = %i\n", subSize); printf(" CurPos = %04x\n\n", buffer - 6); buffer = end_buffer; break; } }; return 0; }
_ATOM AudioPlaySdAac::findMp4Atom(const char *atom, const uint32_t posi, const bool loop = true) { bool r; _ATOM ret; _ATOMINFO atomInfo; ret.position = posi; do { r = fseek(ret.position); fread((uint8_t *) &atomInfo, sizeof(atomInfo)); ret.size = REV32(atomInfo.size); //ret.size = atomInfo.size; if (strncmp(atom, atomInfo.name, 4)==0){ return ret; } ret.position += ret.size ; } while (loop && r); ret.position = 0; ret.size = 0; return ret; }
int32_t WTHRRecord::WriteRecord(FileWriter &writer) { WRITE(EDID); _0IAD.Write(REV32(_IAD) & 0xFFFFFF00 | 0x00, writer); _1IAD.Write(REV32(_IAD) & 0xFFFFFF00 | 0x01, writer); _2IAD.Write(REV32(_IAD) & 0xFFFFFF00 | 0x02, writer); _3IAD.Write(REV32(_IAD) & 0xFFFFFF00 | 0x03, writer); _4IAD.Write(REV32(_IAD) & 0xFFFFFF00 | 0x04, writer); _5IAD.Write(REV32(_IAD) & 0xFFFFFF00 | 0x05, writer); WRITE(DNAM); WRITE(CNAM); WRITE(ANAM); WRITE(BNAM); MODL.Write(writer); WRITE(LNAM); WRITE(ONAM); WRITE(PNAM); WRITE(NAM0); WRITE(FNAM); WRITE(INAM); WRITE(DATA); WRITEAS(Sounds,SNAM); return -1; }
UINT32 ALCHRecord::GetType() { return REV32(ALCH); }
SINT32 ALCHRecord::ParseRecord(unsigned char *buffer, unsigned char *end_buffer, bool CompressedOnDisk) { UINT32 subType = 0; UINT32 subSize = 0; bool bNoOBME = true; while(buffer < end_buffer){ subType = *(UINT32 *)buffer; buffer += 4; switch(subType) { case REV32(XXXX): buffer += 2; subSize = *(UINT32 *)buffer; buffer += 4; subType = *(UINT32 *)buffer; buffer += 6; break; default: subSize = *(UINT16 *)buffer; buffer += 2; break; } switch(subType) { case REV32(EDID): EDID.Read(buffer, subSize, CompressedOnDisk); break; case REV32(OBME): OBME.Load(); OBME->OBME.Read(buffer, subSize); break; case REV32(FULL): if(Effects.value.size()) Effects.value.back()->FULL.Read(buffer, subSize, CompressedOnDisk); else FULL.Read(buffer, subSize, CompressedOnDisk); break; case REV32(MODL): MODL.Load(); MODL->MODL.Read(buffer, subSize, CompressedOnDisk); break; case REV32(MODB): MODL.Load(); MODL->MODB.Read(buffer, subSize); break; case REV32(MODT): MODL.Load(); MODL->MODT.Read(buffer, subSize, CompressedOnDisk); break; case REV32(ICON): ICON.Read(buffer, subSize, CompressedOnDisk); break; case REV32(SCRI): SCRI.Read(buffer, subSize); break; case REV32(DATA): DATA.Read(buffer, subSize); break; case REV32(ENIT): ENIT.Read(buffer, subSize); break; case REV32(EFME): bNoOBME = false; Effects.value.push_back(new GENEffect); Effects.value.back()->OBME.Load(); Effects.value.back()->OBME->EFME.Read(buffer, subSize); break; case REV32(EFID): if(bNoOBME || Effects.value.size() == 0) Effects.value.push_back(new GENEffect); Effects.value.back()->EFID.Read(buffer, subSize); bNoOBME = true; break; case REV32(EFIT): if(Effects.value.size() == 0) Effects.value.push_back(new GENEffect); Effects.value.back()->EFIT.Read(buffer, subSize); break; case REV32(SCIT): if(Effects.value.size() == 0) Effects.value.push_back(new GENEffect); Effects.value.back()->SCIT.Read(buffer, subSize); break; case REV32(EFII): if(Effects.value.size() == 0) Effects.value.push_back(new GENEffect); Effects.value.back()->OBME.Load(); Effects.value.back()->OBME->EFII.Read(buffer, subSize, CompressedOnDisk); break; case REV32(EFIX): if(Effects.value.size() == 0) Effects.value.push_back(new GENEffect); Effects.value.back()->OBME.Load(); Effects.value.back()->OBME->EFIX.Read(buffer, subSize); break; case REV32(EFXX): buffer += subSize; break; case REV32(DATX): OBME.Load(); OBME->DATX.Read(buffer, subSize, CompressedOnDisk); break; default: //printer("FileName = %s\n", FileName); printer(" ALCH: %08X - Unknown subType = %04x\n", formID, subType); CBASH_CHUNK_DEBUG printer(" Size = %i\n", subSize); printer(" CurPos = %04x\n\n", buffer - 6); buffer = end_buffer; break; } }; return 0; }
SINT32 CSNORecord::ParseRecord(unsigned char *buffer, unsigned char *end_buffer, bool CompressedOnDisk) { UINT32 subType = 0; UINT32 subSize = 0; while(buffer < end_buffer){ subType = *(UINT32 *)buffer; buffer += 4; switch(subType) { case REV32(XXXX): buffer += 2; subSize = *(UINT32 *)buffer; buffer += 4; subType = *(UINT32 *)buffer; buffer += 6; break; default: subSize = *(UINT16 *)buffer; buffer += 2; break; } switch(subType) { case REV32(EDID): EDID.Read(buffer, subSize, CompressedOnDisk); break; case REV32(FULL): FULL.Read(buffer, subSize, CompressedOnDisk); break; case REV32(DATA): DATA.Read(buffer, subSize); break; case REV32(MODL): MODL.Load(); MODL.Read(buffer, subSize, CompressedOnDisk); break; // TODO: handle MODL records better //case REV32(MODL): // MODL.Read(buffer, subSize); // break; case REV32(MOD2): MOD2.Read(buffer, subSize, CompressedOnDisk); break; case REV32(MOD3): MOD3.Read(buffer, subSize, CompressedOnDisk); break; case REV32(MOD4): MOD4.Read(buffer, subSize, CompressedOnDisk); break; case REV32(ICON): ICON1.Load(); ICON1.Read(buffer, subSize, CompressedOnDisk); break; case REV32(ICO2): ICON2.Load(); ICON2.Read(buffer, subSize, CompressedOnDisk); break; // TODO: The rest of the ICO* subrecords default: //printf("FileName = %s\n", FileName); printf(" CSNO: %08X - Unknown subType = %04x\n", formID, subType); printf(" Size = %i\n", subSize); printf(" CurPos = %04x\n\n", buffer - 6); buffer = end_buffer; break; } }; return 0; }