Example #1
0
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);
}
Example #2
0
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);
}
Example #3
0
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);
}
Example #4
0
File: brlan.c Project: Ente/benzin
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");
}
Example #5
0
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);
            }
        }
    }
}
Example #6
0
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);
}
Example #7
0
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);
}
Example #8
0
File: brlan.c Project: Ente/benzin
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);
}