fixed EVERY BUG EVER thanks to davidph
This commit is contained in:
parent
a94f42eb81
commit
8ec9fc2abd
157
src/lt.c
157
src/lt.c
|
@ -80,9 +80,23 @@ static void LT_DoConvert(char **str)
|
|||
*str = strbuf;
|
||||
}
|
||||
|
||||
static void *LT_Alloc(size_t size)
|
||||
{
|
||||
void *p = malloc(size);
|
||||
LT_Assert(p == NULL, "LT_Alloc: Out of memory");
|
||||
return p;
|
||||
}
|
||||
|
||||
static void *LT_ReAlloc(void *ptr, size_t newSize)
|
||||
{
|
||||
void *p = realloc(ptr, newSize);
|
||||
LT_Assert(p == NULL, "LT_ReAlloc: Out of memory");
|
||||
return p;
|
||||
}
|
||||
|
||||
void LT_Init(LT_InitInfo initInfo)
|
||||
{
|
||||
gbHead = malloc(sizeof(LT_GarbageList));
|
||||
gbHead = LT_Alloc(sizeof(LT_GarbageList));
|
||||
gbHead->next = NULL;
|
||||
gbHead->ptr = NULL;
|
||||
|
||||
|
@ -113,11 +127,11 @@ void LT_Init(LT_InitInfo initInfo)
|
|||
{
|
||||
int i;
|
||||
|
||||
stringChars = malloc(6);
|
||||
stringChars = LT_Alloc(6);
|
||||
|
||||
for(i = 0; i < 6; i++)
|
||||
{
|
||||
char c = info.stringChars[i];
|
||||
int c = info.stringChars[i];
|
||||
|
||||
if(c != '\0')
|
||||
{
|
||||
|
@ -131,7 +145,7 @@ void LT_Init(LT_InitInfo initInfo)
|
|||
|
||||
stringChars[i] = '\0';
|
||||
|
||||
gbRover->next = malloc(sizeof(LT_GarbageList));
|
||||
gbRover->next = LT_Alloc(sizeof(LT_GarbageList));
|
||||
gbRover = gbRover->next;
|
||||
gbRover->ptr = stringChars;
|
||||
gbRover->next = NULL;
|
||||
|
@ -141,11 +155,11 @@ void LT_Init(LT_InitInfo initInfo)
|
|||
{
|
||||
int i;
|
||||
|
||||
charChars = malloc(6);
|
||||
charChars = LT_Alloc(6);
|
||||
|
||||
for(i = 0; i < 6; i++)
|
||||
{
|
||||
char c = info.charChars[i];
|
||||
int c = info.charChars[i];
|
||||
|
||||
if(c != '\0')
|
||||
{
|
||||
|
@ -159,7 +173,7 @@ void LT_Init(LT_InitInfo initInfo)
|
|||
|
||||
charChars[i] = '\0';
|
||||
|
||||
gbRover->next = malloc(sizeof(LT_GarbageList));
|
||||
gbRover->next = LT_Alloc(sizeof(LT_GarbageList));
|
||||
gbRover = gbRover->next;
|
||||
gbRover->ptr = charChars;
|
||||
gbRover->next = NULL;
|
||||
|
@ -228,11 +242,10 @@ bool LT_OpenFile(const char *filePath)
|
|||
|
||||
if(parseFile == NULL)
|
||||
{
|
||||
char *errorStr = malloc(256);
|
||||
char *errorStr = LT_Alloc(256);
|
||||
|
||||
snprintf(errorStr, 256, "LT_OpenFile: %s", strerror(errno));
|
||||
LT_Assert(true, errorStr);
|
||||
free(errorStr);
|
||||
|
||||
return false;
|
||||
}
|
||||
|
@ -250,22 +263,23 @@ void LT_CloseFile()
|
|||
|
||||
char *LT_ReadNumber()
|
||||
{
|
||||
size_t i = 0, str_blocks = 1;
|
||||
char c, *str = malloc(TOKEN_STR_BLOCK_LENGTH);
|
||||
size_t i = 0, strBlocks = 1;
|
||||
char *str = LT_Alloc(TOKEN_STR_BLOCK_LENGTH);
|
||||
int c = '\0';
|
||||
|
||||
while(!feof(parseFile))
|
||||
while(c != EOF)
|
||||
{
|
||||
fread(&c, 1, 1, parseFile);
|
||||
c = fgetc(parseFile);
|
||||
|
||||
if(!isalnum(c))
|
||||
{
|
||||
fseek(parseFile, -1, SEEK_CUR);
|
||||
ungetc(c, parseFile);
|
||||
break;
|
||||
}
|
||||
|
||||
if(i > TOKEN_STR_BLOCK_LENGTH)
|
||||
if(i > (TOKEN_STR_BLOCK_LENGTH * strBlocks))
|
||||
{
|
||||
realloc(str, TOKEN_STR_BLOCK_LENGTH * str_blocks++);
|
||||
str = LT_ReAlloc(str, TOKEN_STR_BLOCK_LENGTH * ++strBlocks);
|
||||
}
|
||||
|
||||
str[i++] = c;
|
||||
|
@ -283,9 +297,9 @@ char *LT_ReadNumber()
|
|||
LT_DoConvert(&str);
|
||||
}
|
||||
|
||||
gbRover->next = malloc(sizeof(LT_GarbageList));
|
||||
gbRover->next = LT_Alloc(sizeof(LT_GarbageList));
|
||||
gbRover = gbRover->next;
|
||||
gbRover->ptr = realloc(str, i);
|
||||
gbRover->ptr = LT_ReAlloc(str, i);
|
||||
gbRover->next = NULL;
|
||||
|
||||
return gbRover->ptr;
|
||||
|
@ -293,45 +307,46 @@ char *LT_ReadNumber()
|
|||
|
||||
char *LT_ReadString(char term)
|
||||
{
|
||||
size_t i = 0, str_blocks = 1;
|
||||
char c, *str = malloc(TOKEN_STR_BLOCK_LENGTH);
|
||||
size_t i = 0, strBlocks = 1;
|
||||
char *str = LT_Alloc(TOKEN_STR_BLOCK_LENGTH);
|
||||
int c;
|
||||
|
||||
while(true)
|
||||
{
|
||||
fread(&c, 1, 1, parseFile);
|
||||
c = fgetc(parseFile);
|
||||
|
||||
if(c == term)
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
if(LT_Assert(feof(parseFile) || c == '\n', "LT_ReadString: Unterminated string literal"))
|
||||
if(LT_Assert(c == EOF || c == '\n', "LT_ReadString: Unterminated string literal"))
|
||||
{
|
||||
return "";
|
||||
}
|
||||
|
||||
if(c == '\\' && info.escapeChars)
|
||||
{
|
||||
fread(&c, 1, 1, parseFile);
|
||||
c = fgetc(parseFile);
|
||||
|
||||
if(LT_Assert(feof(parseFile) || c == '\n', "LT_ReadString: Unterminated string literal"))
|
||||
if(LT_Assert(c == EOF || c == '\n', "LT_ReadString: Unterminated string literal"))
|
||||
{
|
||||
str[i] = '\0';
|
||||
return str;
|
||||
}
|
||||
|
||||
if(i > TOKEN_STR_BLOCK_LENGTH)
|
||||
if(i > (TOKEN_STR_BLOCK_LENGTH * strBlocks))
|
||||
{
|
||||
realloc(str, TOKEN_STR_BLOCK_LENGTH * str_blocks++);
|
||||
str = LT_ReAlloc(str, TOKEN_STR_BLOCK_LENGTH * ++strBlocks);
|
||||
}
|
||||
|
||||
str = LT_Escaper(str, i++, c);
|
||||
}
|
||||
else
|
||||
{
|
||||
if(i > TOKEN_STR_BLOCK_LENGTH)
|
||||
if(i > (TOKEN_STR_BLOCK_LENGTH * strBlocks))
|
||||
{
|
||||
realloc(str, TOKEN_STR_BLOCK_LENGTH * str_blocks++);
|
||||
str = LT_ReAlloc(str, TOKEN_STR_BLOCK_LENGTH * ++strBlocks);
|
||||
}
|
||||
|
||||
str[i++] = c;
|
||||
|
@ -350,9 +365,9 @@ char *LT_ReadString(char term)
|
|||
LT_DoConvert(&str);
|
||||
}
|
||||
|
||||
gbRover->next = malloc(sizeof(LT_GarbageList));
|
||||
gbRover->next = LT_Alloc(sizeof(LT_GarbageList));
|
||||
gbRover = gbRover->next;
|
||||
gbRover->ptr = realloc(str, i);
|
||||
gbRover->ptr = LT_ReAlloc(str, i);
|
||||
gbRover->next = NULL;
|
||||
|
||||
return gbRover->ptr;
|
||||
|
@ -363,7 +378,6 @@ char *LT_Escaper(char *str, size_t pos, char escape)
|
|||
switch(escape)
|
||||
{
|
||||
case '\\': case '\'': case '"': str[pos] = escape; break;
|
||||
case 'C': str[pos] = '\x1C'; break;
|
||||
case 'a': str[pos] = '\a'; break;
|
||||
case 'b': str[pos] = '\b'; break;
|
||||
case 'f': str[pos] = '\f'; break;
|
||||
|
@ -374,8 +388,7 @@ char *LT_Escaper(char *str, size_t pos, char escape)
|
|||
case 'x': // [marrub] THIS ONE IS FUN
|
||||
for(unsigned int i = 0;;)
|
||||
{
|
||||
char c;
|
||||
fread(&c, 1, 1, parseFile);
|
||||
int c = fgetc(parseFile);
|
||||
|
||||
switch(c)
|
||||
{
|
||||
|
@ -397,7 +410,7 @@ char *LT_Escaper(char *str, size_t pos, char escape)
|
|||
case 'f': case 'F': i = i * 16 + 0xF; break;
|
||||
|
||||
default:
|
||||
fseek(parseFile, -1, SEEK_CUR);
|
||||
ungetc(c, parseFile);
|
||||
str[pos] = i;
|
||||
break;
|
||||
}
|
||||
|
@ -408,7 +421,7 @@ char *LT_Escaper(char *str, size_t pos, char escape)
|
|||
case '0': case '1': case '2': case '3':
|
||||
case '4': case '5': case '6': case '7':
|
||||
{
|
||||
char c = escape;
|
||||
int c = escape;
|
||||
unsigned int i = 0;
|
||||
|
||||
for(unsigned int n = 2; n != 0; n--)
|
||||
|
@ -424,12 +437,12 @@ char *LT_Escaper(char *str, size_t pos, char escape)
|
|||
case '6': i = i * 8 + 06; break;
|
||||
case '7': i = i * 8 + 07; break;
|
||||
default:
|
||||
fseek(parseFile, -1, SEEK_CUR);
|
||||
ungetc(c, parseFile);
|
||||
str[pos] = i;
|
||||
return str;
|
||||
}
|
||||
|
||||
fread(&c, 1, 1, parseFile);
|
||||
c = fgetc(parseFile);
|
||||
}
|
||||
|
||||
str[pos] = i;
|
||||
|
@ -447,12 +460,10 @@ char *LT_Escaper(char *str, size_t pos, char escape)
|
|||
|
||||
LT_Token LT_GetToken()
|
||||
{
|
||||
char c;
|
||||
LT_Token tk = { 0 };
|
||||
int c = fgetc(parseFile);
|
||||
|
||||
fread(&c, 1, 1, parseFile);
|
||||
|
||||
if(feof(parseFile))
|
||||
if(c == EOF)
|
||||
{
|
||||
tk.token = LT_TkNames[TOK_EOF];
|
||||
tk.string = NULL;
|
||||
|
@ -462,9 +473,9 @@ LT_Token LT_GetToken()
|
|||
|
||||
while(isspace(c) && c != '\n')
|
||||
{
|
||||
fread(&c, 1, 1, parseFile);
|
||||
c = fgetc(parseFile);
|
||||
|
||||
if(feof(parseFile)) // [marrub] This could have caused issues if there was whitespace before EOF.
|
||||
if(c == EOF) // [marrub] This could have caused issues if there was whitespace before EOF.
|
||||
{
|
||||
tk.token = LT_TkNames[TOK_EOF];
|
||||
tk.string = NULL;
|
||||
|
@ -496,7 +507,7 @@ LT_Token LT_GetToken()
|
|||
// but sometimes I really do care about my sanity. And wrists.
|
||||
#define DoubleTokDef(ch, t1, t2) \
|
||||
case ch: \
|
||||
fread(&c, 1, 1, parseFile); \
|
||||
c = fgetc(parseFile); \
|
||||
\
|
||||
if(c == ch) \
|
||||
{ \
|
||||
|
@ -505,7 +516,7 @@ LT_Token LT_GetToken()
|
|||
else \
|
||||
{ \
|
||||
tk.token = LT_TkNames[t1]; \
|
||||
fseek(parseFile, -1, SEEK_CUR); \
|
||||
ungetc(c, parseFile); \
|
||||
} \
|
||||
\
|
||||
return tk;
|
||||
|
@ -519,7 +530,7 @@ LT_Token LT_GetToken()
|
|||
|
||||
// [marrub] Special god damn snowflakes
|
||||
case '>':
|
||||
fread(&c, 1, 1, parseFile);
|
||||
c = fgetc(parseFile);
|
||||
|
||||
if(c == '=')
|
||||
{
|
||||
|
@ -532,12 +543,12 @@ LT_Token LT_GetToken()
|
|||
else
|
||||
{
|
||||
tk.token = LT_TkNames[TOK_CmpGT];
|
||||
fseek(parseFile, -1, SEEK_CUR);
|
||||
ungetc(c, parseFile);
|
||||
}
|
||||
|
||||
return tk;
|
||||
case '<':
|
||||
fread(&c, 1, 1, parseFile);
|
||||
c = fgetc(parseFile);
|
||||
|
||||
if(c == '=')
|
||||
{
|
||||
|
@ -554,12 +565,12 @@ LT_Token LT_GetToken()
|
|||
else
|
||||
{
|
||||
tk.token = LT_TkNames[TOK_CmpLT];
|
||||
fseek(parseFile, -1, SEEK_CUR);
|
||||
ungetc(c, parseFile);
|
||||
}
|
||||
|
||||
return tk;
|
||||
case '!':
|
||||
fread(&c, 1, 1, parseFile);
|
||||
c = fgetc(parseFile);
|
||||
|
||||
if(c == '=')
|
||||
{
|
||||
|
@ -568,12 +579,12 @@ LT_Token LT_GetToken()
|
|||
else
|
||||
{
|
||||
tk.token = LT_TkNames[TOK_Not];
|
||||
fseek(parseFile, -1, SEEK_CUR);
|
||||
ungetc(c, parseFile);
|
||||
}
|
||||
|
||||
return tk;
|
||||
case '~':
|
||||
fread(&c, 1, 1, parseFile);
|
||||
c = fgetc(parseFile);
|
||||
|
||||
if(c == '=')
|
||||
{
|
||||
|
@ -581,14 +592,14 @@ LT_Token LT_GetToken()
|
|||
}
|
||||
else
|
||||
{
|
||||
fseek(parseFile, -1, SEEK_CUR);
|
||||
ungetc(c, parseFile);
|
||||
LT_Assert(true, "LT_GetToken: Syntax error"); // [marrub] Yet more error checking that was forgotten before.
|
||||
}
|
||||
|
||||
return tk;
|
||||
// [zombie] extra tokens
|
||||
case '/':
|
||||
fread(&c, 1, 1, parseFile);
|
||||
c = fgetc(parseFile);
|
||||
|
||||
if(c == '/')
|
||||
{
|
||||
|
@ -605,12 +616,12 @@ LT_Token LT_GetToken()
|
|||
else
|
||||
{
|
||||
tk.token = LT_TkNames[TOK_Div];
|
||||
fseek(parseFile, -1, SEEK_CUR);
|
||||
ungetc(c, parseFile);
|
||||
}
|
||||
|
||||
return tk;
|
||||
case '*':
|
||||
fread(&c, 1, 1, parseFile);
|
||||
c = fgetc(parseFile);
|
||||
|
||||
if(c == '/')
|
||||
{
|
||||
|
@ -623,12 +634,12 @@ LT_Token LT_GetToken()
|
|||
else
|
||||
{
|
||||
tk.token = LT_TkNames[TOK_Mul];
|
||||
fseek(parseFile, -1, SEEK_CUR);
|
||||
ungetc(c, parseFile);
|
||||
}
|
||||
|
||||
return tk;
|
||||
case '-':
|
||||
fread(&c, 1, 1, parseFile);
|
||||
c = fgetc(parseFile);
|
||||
|
||||
if(c == '-')
|
||||
{
|
||||
|
@ -641,12 +652,12 @@ LT_Token LT_GetToken()
|
|||
else
|
||||
{
|
||||
tk.token = LT_TkNames[TOK_Sub];
|
||||
fseek(parseFile, -1, SEEK_CUR);
|
||||
ungetc(c, parseFile);
|
||||
}
|
||||
|
||||
return tk;
|
||||
case '+':
|
||||
fread(&c, 1, 1, parseFile);
|
||||
c = fgetc(parseFile);
|
||||
|
||||
if (c == '/')
|
||||
{
|
||||
|
@ -659,7 +670,7 @@ LT_Token LT_GetToken()
|
|||
else
|
||||
{
|
||||
tk.token = LT_TkNames[TOK_Add];
|
||||
fseek(parseFile, -1, SEEK_CUR);
|
||||
ungetc(c, parseFile);
|
||||
}
|
||||
|
||||
return tk;
|
||||
|
@ -699,7 +710,7 @@ LT_Token LT_GetToken()
|
|||
|
||||
if(isdigit(c))
|
||||
{
|
||||
fseek(parseFile, -1, SEEK_CUR);
|
||||
ungetc(c, parseFile);
|
||||
|
||||
tk.string = LT_ReadNumber();
|
||||
tk.token = LT_TkNames[TOK_Number];
|
||||
|
@ -708,14 +719,14 @@ LT_Token LT_GetToken()
|
|||
|
||||
if(isalpha(c) || c == '_')
|
||||
{
|
||||
size_t i = 0, str_blocks = 1;
|
||||
char *str = malloc(TOKEN_STR_BLOCK_LENGTH);
|
||||
size_t i = 0, strBlocks = 1;
|
||||
char *str = LT_Alloc(TOKEN_STR_BLOCK_LENGTH);
|
||||
|
||||
while(!(feof(parseFile)) && (isalnum(c) || c == '_'))
|
||||
while(c != EOF && (isalnum(c) || c == '_'))
|
||||
{
|
||||
if(i > TOKEN_STR_BLOCK_LENGTH)
|
||||
if(i > (TOKEN_STR_BLOCK_LENGTH * strBlocks))
|
||||
{
|
||||
realloc(str, TOKEN_STR_BLOCK_LENGTH * str_blocks++);
|
||||
str = LT_ReAlloc(str, TOKEN_STR_BLOCK_LENGTH * ++strBlocks);
|
||||
}
|
||||
|
||||
str[i++] = c;
|
||||
|
@ -725,7 +736,7 @@ LT_Token LT_GetToken()
|
|||
str[i++] = (isspace(c) || isprint(c)) ? c : ' ';
|
||||
}
|
||||
|
||||
fread(&c, 1, 1, parseFile);
|
||||
c = fgetc(parseFile);
|
||||
}
|
||||
|
||||
str[i++] = '\0'; // [marrub] Completely forgot this line earlier. Really screwed up everything.
|
||||
|
@ -735,23 +746,23 @@ LT_Token LT_GetToken()
|
|||
LT_DoConvert(&str);
|
||||
}
|
||||
|
||||
gbRover->next = malloc(sizeof(LT_GarbageList));
|
||||
gbRover->next = LT_Alloc(sizeof(LT_GarbageList));
|
||||
gbRover = gbRover->next;
|
||||
gbRover->ptr = realloc(str, i);
|
||||
gbRover->ptr = LT_ReAlloc(str, i);
|
||||
gbRover->next = NULL;
|
||||
|
||||
fseek(parseFile, -1, SEEK_CUR);
|
||||
ungetc(c, parseFile);
|
||||
|
||||
tk.string = gbRover->ptr;
|
||||
tk.token = LT_TkNames[TOK_Identi];
|
||||
return tk;
|
||||
}
|
||||
|
||||
tk.string = malloc(2);
|
||||
tk.string = LT_Alloc(2);
|
||||
tk.string[0] = c;
|
||||
tk.string[1] = '\0';
|
||||
|
||||
gbRover->next = malloc(sizeof(LT_GarbageList));
|
||||
gbRover->next = LT_Alloc(sizeof(LT_GarbageList));
|
||||
gbRover = gbRover->next;
|
||||
gbRover->ptr = tk.string;
|
||||
gbRover->next = NULL;
|
||||
|
|
Reference in New Issue
Block a user