From c0c57b3ae8efb33700affa4f554f3aa4f60917c9 Mon Sep 17 00:00:00 2001 From: Marrub Date: Mon, 17 Aug 2015 13:42:31 -0400 Subject: [PATCH] fix a lot of things resultant of inadequate testing --- src/lt.c | 32 ++++++++++++++++++++++---------- src/lt.h | 6 ++++-- 2 files changed, 26 insertions(+), 12 deletions(-) diff --git a/src/lt.c b/src/lt.c index 157752d..d61708a 100644 --- a/src/lt.c +++ b/src/lt.c @@ -447,7 +447,6 @@ LT_BOOL LT_Assert(LT_BOOL assertion, const char *fmt, ...) LT_SetGarbage(assertString); - free(ftString); free(asBuffer); } @@ -546,7 +545,7 @@ char *LT_ReadNumber() return LT_SetGarbage(LT_ReAlloc(str, i)); } -char *LT_ReadString(char term) +void LT_ReadString(LT_Token *tk, char term) { size_t i = 0, strBlocks = 1; char *str = LT_Alloc(TOKEN_STR_BLOCK_LENGTH); @@ -563,10 +562,14 @@ char *LT_ReadString(char term) if(LT_Assert(c == EOF || c == '\n', "LT_ReadString: Unterminated string literal")) { - char *emptyString = LT_Alloc(1); + char *emptyString = LT_Alloc(2); emptyString[0] = '\0'; + emptyString[1] = '\0'; - return LT_SetGarbage(emptyString); + tk->string = LT_SetGarbage(emptyString); + tk->strlen = 0; + + return; } if(c == '\\' && cfg.escapeChars) @@ -575,8 +578,10 @@ char *LT_ReadString(char term) if(LT_Assert(c == EOF || c == '\n', "LT_ReadString: Unterminated string literal")) { - str[i] = '\0'; - return str; + str[i++] = '\0'; + tk->strlen = (unsigned)i - 1; + tk->string = LT_SetGarbage(LT_ReAlloc(str, i)); + return; } if(i > (TOKEN_STR_BLOCK_LENGTH * strBlocks)) @@ -611,12 +616,16 @@ char *LT_ReadString(char term) } #endif - return LT_SetGarbage(LT_ReAlloc(str, i)); + tk->strlen = (unsigned)i - 1; + tk->string = LT_SetGarbage(LT_ReAlloc(str, i)); + + return; } char *LT_Escaper(char *str, size_t pos, char escape) { unsigned i; + LT_BOOL exitloop; switch(escape) { @@ -629,7 +638,9 @@ char *LT_Escaper(char *str, size_t pos, char escape) case 't': str[pos] = '\t'; break; case 'v': str[pos] = '\v'; break; case 'x': // [marrub] THIS ONE IS FUN - for(i = 0;;) + i = 0; + exitloop = LT_FALSE; + while(!exitloop) { int c = fgetc(parseFile); @@ -655,6 +666,7 @@ char *LT_Escaper(char *str, size_t pos, char escape) default: ungetc(c, parseFile); str[pos] = i; + exitloop = LT_TRUE; break; } } @@ -941,7 +953,7 @@ LT_Token LT_GetToken() else if(c == cc) { tk.token = LT_TkNames[TOK_String]; - tk.string = LT_ReadString(c); + LT_ReadString(&tk, c); return tk; } } @@ -962,7 +974,7 @@ LT_Token LT_GetToken() else if(c == cc) { tk.token = LT_TkNames[TOK_Charac]; - tk.string = LT_ReadString(c); + LT_ReadString(&tk, c); return tk; } } diff --git a/src/lt.h b/src/lt.h index bc96fae..c7b9d7b 100644 --- a/src/lt.h +++ b/src/lt.h @@ -108,6 +108,7 @@ typedef struct { const char *token; char *string; + unsigned strlen; int pos; } LT_Token; @@ -128,7 +129,8 @@ typedef struct LT_GarbageList_s */ #ifdef __cplusplus -extern "C" { +extern "C" +{ #endif LT_DLLEXPORT void LT_EXPORT LT_Init(LT_Config initCfg); @@ -148,7 +150,7 @@ LT_DLLEXPORT void LT_EXPORT LT_SetPos(int newPos); LT_DLLEXPORT void LT_EXPORT LT_CloseFile(void); LT_DLLEXPORT char *LT_EXPORT LT_ReadNumber(void); -LT_DLLEXPORT char *LT_EXPORT LT_ReadString(char term); +LT_DLLEXPORT void LT_EXPORT LT_ReadString(LT_Token *tk, char term); LT_DLLEXPORT char *LT_EXPORT LT_Escaper(char *str, size_t pos, char escape); LT_DLLEXPORT LT_Token LT_EXPORT LT_GetToken(void); LT_DLLEXPORT void LT_EXPORT LT_SkipWhite(void);