Code:
#include <ctype.h>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "main.h"
void spaceOut(char ........tr, char *dStr)
{
strncpy(dStr, sStr, 8);
dStr[8] = '\0';
char *p = strchr(sStr,' ') + 1;
strncat(dStr, p, 8);
dStr[16] = '\0';
}
void str2Bin(char *hstr, char *dstr)
{
int num = 0;
char sstr[2];
hToIkey key[16] = {
{'0',0},
{'1',1},
{'2',2},
{'3',3},
{'4',4},
{'5',5},
{'6',6},
{'7',7},
{'8',8},
{'9',9},
{'A',10},
{'B',11},
{'C',12},
{'D',13},
{'E',14},
{'F',15}
};
int dindex = 0;
for (int i = 0; i < 16; i++)
{
for (int k = 0; k < 16; k++)
{
if (hstr[i] == key[k].keyHex)
{
num += key[k].keyDec*pow(16,(i%2)^1);
if (i%2 == 1)
{
dstr[dindex] = num;
dindex++;
num = 0;
break;
}
}
}
}
dstr[dindex] = '\0';
}
void writeFile(txtData *data, int lines)
{
char fileStart[8] = {
0,
208,
192,
222,
0,
208,
192,
222
};
char fileEnd[8] = {
240,
0,
0,
0,
0,
0,
0,
0
};
char filename[11];
int printed = 0;
for(int i = 0; i < 6; i++)
{
data[0].lineText[i] = toupper(data[0].lineText[i]);
}
sprintf(filename, "%s.gct", data[0].lineText);
data[5].lineActive = 1;
FILE *gct = fopen(filename, "w");
fwrite(&fileStart, 1, 8, gct);
for(int i = 0; i < lines; i++)
{
if (data[i].lineType == LINE_CODE)
{
if(data[data[i].parentLine].lineActive)
{
str2Bin(data[i].lineText, data[i].codeValue);
fwrite(data[i].codeValue, 1, 8, gct);
printed++;
}
}
}
fwrite(&fileEnd, 1, 8, gct);
fclose(gct);
if(printed == 0)
{
remove(filename);
printf("Create failed. No codes selected!");
}
fclose(gct);
}
int main()
{
FILE *textFile = fopen("Metroid Prime Trilogy.txt", "r");
char text[256];
char nospace[9];
char match[17] = "0123456789ABCDEF ";
char xmatch[18] = "0123456789ABCDEFX ";
int line = 0;
int parent = 0;
while(fgets(text, 255, textFile))
{
if(feof(textFile))
break;
line++;
}
txtData data[line+1];
rewind(textFile);
line = 0;
while(fgets(text, 255, textFile))
{
strncpy(data[line].lineText, text, strlen(text) - 1);
data[line].lineText[strlen(text) - 1] = '\0';
data[line].lineNum = line;
data[line].lineActive = 0;
data[line].parentLine = 0;
if(feof(textFile))
break;
line++;
}
for(int i = 0; i < line; i++)
{
int span = strspn(data[i].lineText, match);
int xspan = strspn(data[i].lineText, xmatch);
if(i == 0)
{
data[i].lineType = LINE_ID;
}
else if(strlen(data[i].lineText) == 0)
{
data[i].lineType = LINE_BLANK;
}
else if(data[i-1].lineType == LINE_ID)
{
data[i].lineType = LINE_TITLE;
}
else if((span == 17) || (xspan == 17))
{
data[i].lineType = LINE_CODE;
data[i].parentLine = parent;
spaceOut(data[i].lineText, nospace);
strcpy(data[i].lineText, nospace);
}
else if(data[i-1].lineType == LINE_BLANK)
{
if(strlen(data[i+1].lineText) == 0)
{
data[i].lineType = LINE_CATEGORY;
}
else
{
data[i].lineType = LINE_DESCR;
parent = data[i].lineNum;
}
}
else if(data[i-1].lineType == LINE_CODE)
{
data[i].lineType = LINE_COMMENT;
data[i].parentLine = parent;
}
else
{
data[i].lineType = LINE_UNKNOWN;
}
}
typeStruct types[8] = {
"ID\0",
"TITLE\0",
"CATEGORY\0",
"DESCR\0",
"CODE\0",
"COMMENT\0",
"BLANK\0",
"UNKNOWN\0"
};
writeFile(&data, line);
return 0;
}
And the header: