void WriteBRLANTagEntryinfos(tag_entryinfo entryinfo, FILE* fp) { tag_entryinfo writeentryinfo; writeentryinfo.type = short_swap_bytes(entryinfo.type); writeentryinfo.unk1 = short_swap_bytes(entryinfo.unk1); writeentryinfo.coord_count = short_swap_bytes(entryinfo.coord_count); writeentryinfo.pad1 = short_swap_bytes(entryinfo.pad1); writeentryinfo.unk2 = be32(entryinfo.unk2); fwrite(&writeentryinfo, sizeof(tag_entryinfo), 1, fp); }
void WriteBRLANHeader(brlan_header rlanhead, FILE* fp) { brlan_header writehead; writehead.magic[0] = rlanhead.magic[0]; writehead.magic[1] = rlanhead.magic[1]; writehead.magic[2] = rlanhead.magic[2]; writehead.magic[3] = rlanhead.magic[3]; writehead.unk1 = be32(rlanhead.unk1); writehead.file_size = be32(rlanhead.file_size); writehead.pai1_offset = short_swap_bytes(rlanhead.pai1_offset); writehead.pai1_count = short_swap_bytes(rlanhead.pai1_count); fwrite(&writehead, sizeof(brlan_header), 1, fp); }
void WriteBRLANPaiHeader(brlan_pai1_header_type1 paihead, FILE* fp) { brlan_pai1_header_type1 writehead; writehead.magic[0] = paihead.magic[0]; writehead.magic[1] = paihead.magic[1]; writehead.magic[2] = paihead.magic[2]; writehead.magic[3] = paihead.magic[3]; writehead.size = be32(paihead.size); writehead.framesize = short_swap_bytes(paihead.framesize); writehead.flags = paihead.flags; writehead.unk1 = paihead.unk1; writehead.num_timgs = short_swap_bytes(paihead.num_timgs); writehead.num_entries = short_swap_bytes(paihead.num_entries); writehead.entry_offset = be32(paihead.entry_offset); fwrite(&writehead, sizeof(brlan_pai1_header_type1), 1, fp); }
void BRLAN_CreateXMLTag(tag_header tagHeader, void* data, u32 offset) { BRLAN_fileoffset = offset; BRLAN_ReadDataFromMemory(&tagHeader, data, sizeof(tag_header)); printf("\t\t<tag type=\"%c%c%c%c\">\n", tagHeader.magic[0], tagHeader.magic[1], tagHeader.magic[2], tagHeader.magic[3]); tag_entryinfo tagEntryInfo; u32 tagentrylocations[tagHeader.entry_count]; BRLAN_ReadDataFromMemory(&tagentrylocations, data, tagHeader.entry_count * sizeof(u32)); u32 i, j; for ( i = 0; i < tagHeader.entry_count; i++) { BRLAN_fileoffset = offset + be32(tagentrylocations[i]); BRLAN_ReadDataFromMemory(&tagEntryInfo, data, sizeof(tag_entryinfo)); if(short_swap_bytes(tagEntryInfo.type) < 16) printf("\t\t\t<entry type=\"%s\">\n", tag_types_list[short_swap_bytes(tagEntryInfo.type)]); else printf("\t\t\t<entry type=\"%u\">\n", short_swap_bytes(tagEntryInfo.type)); for( j = 0; j < short_swap_bytes(tagEntryInfo.coord_count); j++) { if ( tagEntryInfo.unk1 == 0x2 ) { tag_data tagData; BRLAN_ReadDataFromMemory(&tagData, data, sizeof(tag_data)); u32 p1 = be32(tagData.part1); u32 p2 = be32(tagData.part2); u32 p3 = be32(tagData.part3); printf("\t\t\t\t<triplet>\n"); printf("\t\t\t\t\t<frame>%.15f</frame>\n", *(f32*)(&p1)); printf("\t\t\t\t\t<value>%.15f</value>\n", *(f32*)(&p2)); printf("\t\t\t\t\t<blend>%.15f</blend>\n", *(f32*)(&p3)); printf("\t\t\t\t</triplet>\n"); } else { tag_data2 tagData2; BRLAN_ReadDataFromMemory(&tagData2, data, sizeof(tag_data2)); u32 p1 = be32(tagData2.part1); u16 p2 = short_swap_bytes(tagData2.part2); u16 p3 = short_swap_bytes(tagData2.padding); printf("\t\t\t\t<pair>\n"); printf("\t\t\t\t\t<data1>%.15f</data1>\n", *(f32*)(&p1)); printf("\t\t\t\t\t<data2>%04x</data2>\n", p2); printf("\t\t\t\t\t<padding>%04x</padding>\n", p3); printf("\t\t\t\t</pair>\n"); } } printf("\t\t\t</entry>\n"); } printf("\t\t</tag>\n"); }
void BRLAN_CreateXMLTag(tag_header tagHeader, void* data, u32 offset, mxml_node_t *pane) { BRLAN_fileoffset = offset; BRLAN_ReadDataFromMemory(&tagHeader, data, sizeof(tag_header)); mxml_node_t *tag; tag = mxmlNewElement(pane, "tag"); mxmlElementSetAttrf(tag, "type", "%c%c%c%c", tagHeader.magic[0], tagHeader.magic[1], tagHeader.magic[2], tagHeader.magic[3]); tag_entryinfo tagEntryInfo; u32 tagentrylocations[tagHeader.entry_count]; BRLAN_ReadDataFromMemory(&tagentrylocations, data, tagHeader.entry_count * sizeof(u32)); u32 i, j; for ( i = 0; i < tagHeader.entry_count; i++) { mxml_node_t *entry; BRLAN_fileoffset = offset + be32(tagentrylocations[i]); BRLAN_ReadDataFromMemory(&tagEntryInfo, data, sizeof(tag_entryinfo)); if(short_swap_bytes(tagEntryInfo.type) < 16) { char type_rlmc[4] = {'R', 'L', 'M', 'C'}; char type_rlvc[4] = {'R', 'L', 'V', 'C'}; if(memcmp(tagHeader.magic, type_rlmc, 4) == 0) { entry = mxmlNewElement(tag, "entry"); mxmlElementSetAttrf(entry, "type", "%s", tag_types_rlmc_list[short_swap_bytes(tagEntryInfo.type)]); } else if (memcmp(tagHeader.magic, type_rlvc, 4) == 0) { entry = mxmlNewElement(tag, "entry"); mxmlElementSetAttrf(entry, "type", "%s", tag_types_rlvc_list[short_swap_bytes(tagEntryInfo.type)]); } else { entry = mxmlNewElement(tag, "entry"); mxmlElementSetAttrf(entry, "type", "%s", tag_types_list[short_swap_bytes(tagEntryInfo.type)]); } } else { entry = mxmlNewElement(tag, "entry"); mxmlElementSetAttrf(entry, "type", "%u", short_swap_bytes(tagEntryInfo.type)); } for( j = 0; j < short_swap_bytes(tagEntryInfo.coord_count); j++) { if ( tagEntryInfo.unk1 == 0x2 ) { mxml_node_t *triplet; mxml_node_t *frame; mxml_node_t *value; mxml_node_t *blend; tag_data tagData; BRLAN_ReadDataFromMemory(&tagData, data, sizeof(tag_data)); u32 p1 = be32(tagData.part1); u32 p2 = be32(tagData.part2); u32 p3 = be32(tagData.part3); triplet = mxmlNewElement(entry, "triplet"); frame = mxmlNewElement(triplet, "frame"); mxmlNewTextf(frame, 0, "%.15f", *(f32*)(&p1)); value = mxmlNewElement(triplet, "value"); mxmlNewTextf(value, 0, "%.15f", *(f32*)(&p2)); blend = mxmlNewElement(triplet, "blend"); mxmlNewTextf(blend, 0, "%.15f", *(f32*)(&p3)); } else { tag_data2 tagData2; BRLAN_ReadDataFromMemory(&tagData2, data, sizeof(tag_data2)); mxml_node_t *pair; mxml_node_t *data1; mxml_node_t *data2; mxml_node_t *padding; u32 p1 = be32(tagData2.part1); u16 p2 = short_swap_bytes(tagData2.part2); u16 p3 = short_swap_bytes(tagData2.padding); pair = mxmlNewElement(entry, "pair"); data1 = mxmlNewElement(pair, "data1"); mxmlNewTextf(data1, 0, "%.15f", *(f32*)(&p1)); data2 = mxmlNewElement(pair, "data2"); mxmlNewTextf(data2, 0, "%04x", p2); padding = mxmlNewElement(pair, "padding"); mxmlNewTextf(padding, 0, "%04x", p3); } } } }
void create_entries_from_xml(mxml_node_t *tree, mxml_node_t *node, brlan_entry *entr, tag_header* head, FILE* fp) { tag_entry* entry = NULL; tag_entryinfo* entryinfo = NULL; tag_data** data = NULL; tag_data2** data2 = NULL; mxml_node_t *tempnode = NULL; mxml_node_t *subnode = NULL; mxml_node_t *subsubnode = NULL; char temp[256]; char temp2[256]; char temp3[16][24]; int i, x; char tag_type[256]; if(mxmlElementGetAttr(node, "type") != NULL) strcpy(tag_type, mxmlElementGetAttr(node, "type")); char rlmc_type[5] = {'R', 'L', 'M', 'C'}; char rlvc_type[5] = {'R', 'L', 'V', 'C'}; for(i = 0; i < 16; i++) memset(temp3[i], 0, 24); for(x = 0; x < 16; x++) if(memcmp(tag_type, rlmc_type, 4) == 0) { for(i = 0; i < strlen(tag_types_rlmc_list[x]); i++) { temp3[x][i] = toupper(tag_types_rlmc_list[x][i]); } } else if(memcmp(tag_type, rlvc_type, 4) == 0) { for(i = 0; i < strlen(tag_types_rlvc_list[x]); i++) { temp3[x][i] = toupper(tag_types_rlvc_list[x][i]); } } else { for(i = 0; i < strlen(tag_types_list[x]); i++) { temp3[x][i] = toupper(tag_types_list[x][i]); } } head->entry_count = 0; subnode = node; for (x = 0, subnode = mxmlFindElement(subnode, node, "entry", NULL, NULL, MXML_DESCEND); subnode != NULL; subnode = mxmlFindElement(subnode, node, "entry", NULL, NULL, MXML_DESCEND), x++) { head->entry_count++; entry = realloc(entry, sizeof(tag_entry) * head->entry_count); entryinfo = realloc(entryinfo, sizeof(tag_entryinfo) * head->entry_count); if(data == NULL) { data = (tag_data**)malloc(sizeof(tag_data*) * head->entry_count); data2 = (tag_data2**)malloc(sizeof(tag_data2*) * head->entry_count); } else { data = (tag_data**)realloc(data, sizeof(tag_data*) * head->entry_count); data2 = (tag_data2**)realloc(data, sizeof(tag_data2*) * head->entry_count); } data[x] = NULL; data2[x] = NULL; memset(temp, 0, 256); memset(temp2, 0, 256); if(mxmlElementGetAttr(subnode, "type") != NULL) strcpy(temp, mxmlElementGetAttr(subnode, "type")); else{ printf("No type attribute found!\nSkipping this entry!\n"); head->entry_count--; continue; } for(i = 0; i < strlen(temp); i++) temp2[i] = toupper(temp[i]); for(i = 0; (i < 17) && (strcmp(temp3[i - 1], temp2) != 0); i++); if(i == 17) { i = atoi(temp2); } else { i--; } entry[x].offset = 0; entryinfo[x].type = i; entryinfo[x].unk1 = 0x0200; entryinfo[x].pad1 = 0x0000; entryinfo[x].unk2 = 0x0000000C; entryinfo[x].coord_count = 0; subsubnode = subnode; for (i = 0, subsubnode = mxmlFindElement(subsubnode, subnode, "triplet", NULL, NULL, MXML_DESCEND); subsubnode != NULL; subsubnode = mxmlFindElement(subsubnode, subnode, "triplet", NULL, NULL, MXML_DESCEND), i++) { entryinfo[x].coord_count++; data[x] = realloc(data[x], sizeof(tag_data) * entryinfo[x].coord_count); tempnode = mxmlFindElement(subsubnode, subsubnode, "frame", NULL, NULL, MXML_DESCEND); if(tempnode == NULL) { printf("Couldn't find attribute \"frame\"!\n"); exit(1); } get_value(tempnode, temp, 256); *(f32*)(&(data[x][i].part1)) = atof(temp); tempnode = mxmlFindElement(subsubnode, subsubnode, "value", NULL, NULL, MXML_DESCEND); if(tempnode == NULL) { printf("Couldn't find attribute \"value\"!\n"); exit(1); } get_value(tempnode, temp, 256); *(f32*)(&(data[x][i].part2)) = atof(temp); tempnode = mxmlFindElement(subsubnode, subsubnode, "blend", NULL, NULL, MXML_DESCEND); if(tempnode == NULL) { printf("Couldn't find attribute \"blend\"!\n"); exit(1); } get_value(tempnode, temp, 256); *(f32*)(&(data[x][i].part3)) = atof(temp); } for (i = 0, subsubnode = mxmlFindElement(subnode, subnode, "pair", NULL, NULL, MXML_DESCEND); subsubnode != NULL; subsubnode = mxmlFindElement(subsubnode, subnode, "pair", NULL, NULL, MXML_DESCEND), i++) { entryinfo[x].unk1 = 0x100; entryinfo[x].coord_count++; data2[x] = realloc(data2[x], sizeof(tag_data2) * entryinfo[x].coord_count); tempnode = mxmlFindElement(subsubnode, subsubnode, "data1", NULL, NULL, MXML_DESCEND); if(tempnode == NULL) { printf("Couldn't find attribute \"data1\"!\n"); exit(1); } get_value(tempnode, temp, 256); *(f32*)(&(data2[x][i].part1)) = atof(temp); tempnode = mxmlFindElement(subsubnode, subsubnode, "data2", NULL, NULL, MXML_DESCEND); if(tempnode == NULL) { printf("Couldn't find attribute \"data2\"!\n"); exit(1); } get_value(tempnode, temp, 256); data2[x][i].part2 = short_swap_bytes(strtoul(temp, NULL, 16)); tempnode = mxmlFindElement(subsubnode, subsubnode, "padding", NULL, NULL, MXML_DESCEND); if(tempnode == NULL) { printf("Couldn't find attribute \"padding\"!\n"); exit(1); } get_value(tempnode, temp, 256); data2[x][i].padding = short_swap_bytes(strtoul(temp, NULL, 16)); } } head->pad1 = 0x0; head->pad2 = 0x0; head->pad3 = 0x0; WriteBRLANTagHeader(head, fp); u32 entryloc = ftell(fp); u32 animLen; WriteBRLANTagEntries(entry, head->entry_count, fp); u32* entryinfolocs = (u32*)calloc(head->entry_count, sizeof(u32)); for(x = 0; x < head->entry_count; x++) { entryinfolocs[x] = ftell(fp); if (x>0) { if ( entryinfo[x].unk1 == (0x200) ) { entry[x].offset = entry[x-1].offset + sizeof(tag_entryinfo) + (entryinfo[x-1].coord_count * sizeof(tag_data)); } if ( entryinfo[x].unk1 == (0x100) ) { entry[x].offset = entry[x-1].offset + sizeof(tag_entryinfo) + (entryinfo[x-1].coord_count * sizeof(tag_data2)); } } else { entry[x].offset = x * (sizeof(tag_entryinfo) + sizeof(tag_data)); } WriteBRLANTagEntryinfos(entryinfo[x], fp); if (x==0) animLen = ftell(fp); if ( entryinfo[x].unk1 == 0x200 ) WriteBRLANTagData(data[x], entryinfo[x].coord_count, fp); if ( entryinfo[x].unk1 == 0x100 ) { tag_data2 writedata; for(i = 0; i < entryinfo[x].coord_count; i++) { writedata.part1 = be32(data2[x][i].part1); writedata.part2 = (data2[x][i].part2); writedata.padding = (data2[x][i].padding); fwrite(&writedata, sizeof(tag_data2), 1, fp); } } } if ( entryinfo[0].unk1 == 0x200 ) free(data); if ( entryinfo[0].unk1 == 0x100 ) free(data2); u32 oldpos = ftell(fp); fseek(fp, entryloc, SEEK_SET); for( x = 0; x < head->entry_count; x++) entry[x].offset += sizeof(u32) * (head->entry_count) + 8; WriteBRLANTagEntries(entry, head->entry_count, fp); fseek(fp, oldpos, SEEK_SET); free(entry); free(entryinfo); }
void parse_brlan(char* filename, char *filenameout) { FILE* fp = fopen(filename, "rb"); if(fp == NULL) { printf("Error! Couldn't open %s!\n", filename); exit(1); } fseek(fp, 0, SEEK_END); u32 lengthOfFile = ftell(fp); fseek(fp, 0, SEEK_SET); u8 data[lengthOfFile]; fread(data, lengthOfFile, 1, fp); int i, j; for(i = 0; i < 16; i++) { memset(tag_types_list[i], 0, 24); memset(tag_types_rlmc_list[i], 0, 24); memset(tag_types_rlvc_list[i], 0, 24); } strcpy(tag_types_list[0], "X Translation"); strcpy(tag_types_list[1], "Y Translation"); strcpy(tag_types_list[2], "Z Translation"); strcpy(tag_types_list[3], "X Flip"); strcpy(tag_types_list[4], "Y Flip"); strcpy(tag_types_list[5], "Angle"); strcpy(tag_types_list[6], "X Zoom"); strcpy(tag_types_list[7], "Y Zoom"); strcpy(tag_types_list[8], "Width"); strcpy(tag_types_list[9], "Height"); strcpy(tag_types_list[10], "0x0A"); strcpy(tag_types_list[11], "0x0B"); strcpy(tag_types_list[12], "0x0C"); strcpy(tag_types_list[13], "0x0D"); strcpy(tag_types_list[14], "0x0E"); strcpy(tag_types_list[15], "0x0F"); strcpy(tag_types_rlmc_list[0], "0x00"); strcpy(tag_types_rlmc_list[1], "0x01"); strcpy(tag_types_rlmc_list[2], "0x02"); strcpy(tag_types_rlmc_list[3], "0x03"); strcpy(tag_types_rlmc_list[4], "Blackcolor R"); strcpy(tag_types_rlmc_list[5], "Blackcolor G"); strcpy(tag_types_rlmc_list[6], "Blackcolor B"); strcpy(tag_types_rlmc_list[7], "Blackcolor A"); strcpy(tag_types_rlmc_list[8], "Whitecolor R"); strcpy(tag_types_rlmc_list[9], "Whitecolor G"); strcpy(tag_types_rlmc_list[10], "Whitecolor B"); strcpy(tag_types_rlmc_list[11], "Whitecolor A"); strcpy(tag_types_rlmc_list[12], "0x0C"); strcpy(tag_types_rlmc_list[13], "0x0D"); strcpy(tag_types_rlmc_list[14], "0x0E"); strcpy(tag_types_rlmc_list[15], "0x0F"); strcpy(tag_types_rlvc_list[0], "Top Left R"); strcpy(tag_types_rlvc_list[1], "Top Left G"); strcpy(tag_types_rlvc_list[2], "Top Left B"); strcpy(tag_types_rlvc_list[3], "Top Left A"); strcpy(tag_types_rlvc_list[4], "Top Right R"); strcpy(tag_types_rlvc_list[5], "Top Right G"); strcpy(tag_types_rlvc_list[6], "Top Right B"); strcpy(tag_types_rlvc_list[7], "Top Right A"); strcpy(tag_types_rlvc_list[8], "Bottom Left R"); strcpy(tag_types_rlvc_list[9], "Bottom Left G"); strcpy(tag_types_rlvc_list[10], "Bottom Left B"); strcpy(tag_types_rlvc_list[11], "Bottom Left A"); strcpy(tag_types_rlvc_list[12], "Bottom Right R"); strcpy(tag_types_rlvc_list[13], "Bottom Right G"); strcpy(tag_types_rlvc_list[14], "Bottom Right B"); strcpy(tag_types_rlvc_list[15], "Bottom Right A"); BRLAN_fileoffset = 0; brlan_header header; BRLAN_ReadDataFromMemoryX(&header, data, sizeof(brlan_header)); BRLAN_fileoffset = short_swap_bytes(header.pai1_offset); brlan_pai1_universal universal; BRLAN_ReadDataFromMemoryX(&universal, data, sizeof(brlan_pai1_universal)); int pai1_header_type; brlan_pai1_header_type1 pai1_header1; brlan_pai1_header_type2 pai1_header2; brlan_pai1_header_type2 pai1_header; if((be32(universal.flags) & (1 << 25)) >= 1) { pai1_header_type = 2; BRLAN_ReadDataFromMemory(&pai1_header2, data, sizeof(brlan_pai1_header_type2)); } else { pai1_header_type = 1; BRLAN_ReadDataFromMemory(&pai1_header1, data, sizeof(brlan_pai1_header_type1)); } CreateGlobal_pai1(&pai1_header, pai1_header1, pai1_header2, pai1_header_type); FILE *xmlFile; xmlFile = fopen(filenameout, "w"); mxml_node_t *xml; mxml_node_t *xmlan; xml = mxmlNewXML("1.0"); xmlan = mxmlNewElement(xml, "xmlan"); mxmlElementSetAttrf(xmlan, "version", "%d.%d.%d%s", BENZIN_VERSION_MAJOR, BENZIN_VERSION_MINOR, BENZIN_VERSION_BUILD, BENZIN_VERSION_OTHER); mxmlElementSetAttrf(xmlan, "framesize", "%lu", (long unsigned int)short_swap_bytes(pai1_header.framesize)); mxmlElementSetAttrf(xmlan, "flags", "%02x", pai1_header.flags); int timgs = short_swap_bytes(pai1_header.num_timgs); BRLAN_fileoffset = short_swap_bytes(header.pai1_offset) + sizeof(brlan_pai1_header_type1); if ( pai1_header_type == 2 ) BRLAN_fileoffset += 4; int tableoff = BRLAN_fileoffset; int currtableoff = BRLAN_fileoffset; mxml_node_t *timg; for( i = 0; i < timgs; i++) { u32 curr_timg_off = 0; BRLAN_ReadDataFromMemory(&curr_timg_off, data, 4); char timgname[256]; memset(timgname, 0, 256); int z = tableoff + be32(curr_timg_off); for( j = 0; data[z] != 0; timgname[j++] = data[z], z++); { timg = mxmlNewElement(xmlan, "timg"); mxmlElementSetAttrf(timg, "name", "%s", timgname); } currtableoff += 4; } int tagcount = short_swap_bytes(pai1_header.num_entries); u32 taglocations[tagcount]; BRLAN_fileoffset = be32(pai1_header.entry_offset) + short_swap_bytes(header.pai1_offset); BRLAN_ReadDataFromMemory(taglocations, data, tagcount * sizeof(u32)); for( i = 0; i < tagcount; i++) { brlan_entry brlanEntry; tag_header tagHeader; BRLAN_fileoffset = be32(taglocations[i]) + short_swap_bytes(header.pai1_offset); u32 brlanEntryOffset = BRLAN_fileoffset; BRLAN_ReadDataFromMemory(&brlanEntry, data, sizeof(brlan_entry)); mxml_node_t *pane; pane = mxmlNewElement(xmlan, "pane"); mxmlElementSetAttrf(pane, "name", "%s", brlanEntry.name); mxmlElementSetAttrf(pane, "type", "%u", brlanEntry.is_material); u32 entrylocations[brlanEntry.num_tags]; BRLAN_ReadDataFromMemory(entrylocations, data, brlanEntry.num_tags * sizeof(u32)); for ( j = 0; j < brlanEntry.num_tags; j++) { BRLAN_CreateXMLTag(tagHeader, data, brlanEntryOffset + be32(entrylocations[j]), pane); } } mxmlSaveFile(xml, xmlFile, whitespace_cb); mxmlDelete(xml); fclose(xmlFile); fclose(fp); }
void parse_brlan(char* filename) { FILE* fp = fopen(filename, "rb"); if(fp == NULL) { printf("Error! Couldn't open %s!\n", filename); exit(1); } fseek(fp, 0, SEEK_END); u32 lengthOfFile = ftell(fp); fseek(fp, 0, SEEK_SET); u8 data[lengthOfFile]; fread(data, lengthOfFile, 1, fp); int i, j; for(i = 0; i < 16; i++) memset(tag_types_list[i], 0, 24); strcpy(tag_types_list[0], "X Translation"); strcpy(tag_types_list[1], "Y Translation"); strcpy(tag_types_list[2], "Z Translation"); strcpy(tag_types_list[3], "0x03"); strcpy(tag_types_list[4], "0x04"); strcpy(tag_types_list[5], "Angle"); strcpy(tag_types_list[6], "X Zoom"); strcpy(tag_types_list[7], "Y Zoom"); strcpy(tag_types_list[8], "Width"); strcpy(tag_types_list[9], "Height"); strcpy(tag_types_list[10], "0x0A"); strcpy(tag_types_list[11], "0x0B"); strcpy(tag_types_list[12], "0x0C"); strcpy(tag_types_list[13], "0x0D"); strcpy(tag_types_list[14], "0x0E"); strcpy(tag_types_list[15], "0x0F"); BRLAN_fileoffset = 0; brlan_header header; BRLAN_ReadDataFromMemoryX(&header, data, sizeof(brlan_header)); dbgprintf("brlan_header read to.\n"); BRLAN_fileoffset = short_swap_bytes(header.pai1_offset); brlan_pai1_universal universal; BRLAN_ReadDataFromMemoryX(&universal, data, sizeof(brlan_pai1_universal)); dbgprintf("pa1_universal read to.\n"); int pai1_header_type; brlan_pai1_header_type1 pai1_header1; brlan_pai1_header_type2 pai1_header2; brlan_pai1_header_type2 pai1_header; if((be32(universal.flags) & (1 << 25)) >= 1) { pai1_header_type = 2; BRLAN_ReadDataFromMemory(&pai1_header2, data, sizeof(brlan_pai1_header_type2)); } else { pai1_header_type = 1; BRLAN_ReadDataFromMemory(&pai1_header1, data, sizeof(brlan_pai1_header_type1)); } CreateGlobal_pai1(&pai1_header, pai1_header1, pai1_header2, pai1_header_type); printf("<?xml version=\"1.0\"?>\n" \ "<xmlan framesize=\"%lu\" flags=\"%02x\">\n", (long unsigned int)short_swap_bytes(pai1_header.framesize), pai1_header.flags); int timgs = short_swap_bytes(pai1_header.num_timgs); BRLAN_fileoffset = short_swap_bytes(header.pai1_offset) + sizeof(brlan_pai1_header_type1); if ( pai1_header_type == 2 ) BRLAN_fileoffset += 4; int tableoff = BRLAN_fileoffset; int currtableoff = BRLAN_fileoffset; for( i = 0; i < timgs; i++) { u32 curr_timg_off = 0; BRLAN_ReadDataFromMemory(&curr_timg_off, data, 4); char timgname[256]; memset(timgname, 0, 256); int z = tableoff + be32(curr_timg_off); for( j = 0; data[z] != 0; timgname[j++] = data[z], z++); printf("\t<timg name=\"%s\" />\n", timgname); currtableoff += 4; } int tagcount = short_swap_bytes(pai1_header.num_entries); u32 taglocations[tagcount]; BRLAN_fileoffset = be32(pai1_header.entry_offset) + short_swap_bytes(header.pai1_offset); BRLAN_ReadDataFromMemory(taglocations, data, tagcount * sizeof(u32)); for( i = 0; i < tagcount; i++) { brlan_entry brlanEntry; tag_header tagHeader; tag_entry tagEntry; tag_entryinfo tagEntryInfo; BRLAN_fileoffset = be32(taglocations[i]) + short_swap_bytes(header.pai1_offset); u32 brlanEntryOffset = BRLAN_fileoffset; BRLAN_ReadDataFromMemory(&brlanEntry, data, sizeof(brlan_entry)); printf("\t<pane name=\"%s\" type=\"%u\">\n", brlanEntry.name, brlanEntry.is_material); u32 entrylocations[brlanEntry.num_tags]; BRLAN_ReadDataFromMemory(entrylocations, data, brlanEntry.num_tags * sizeof(u32)); for ( j = 0; j < brlanEntry.num_tags; j++) { BRLAN_CreateXMLTag(tagHeader, data, brlanEntryOffset + be32(entrylocations[j])); } printf("\t</pane>\n"); } printf("</xmlan>\n"); fclose(fp); }