From 286e0c375091d0ebfb08001c9c7321e56bab3ea9 Mon Sep 17 00:00:00 2001 From: Roman Fomin Date: Tue, 28 Nov 2023 12:04:15 +0700 Subject: [PATCH] add U_GetString function (#1289) Revert '-' in TK_Identifier. U_GetString accepts all data except whitespace. --- src/s_musinfo.c | 2 +- src/u_scanner.c | 47 +++++++++++++++++++++++++++++++++++++++++++---- src/u_scanner.h | 1 + 3 files changed, 45 insertions(+), 5 deletions(-) diff --git a/src/s_musinfo.c b/src/s_musinfo.c index c17e92ce..f792e282 100644 --- a/src/s_musinfo.c +++ b/src/s_musinfo.c @@ -75,7 +75,7 @@ void S_ParseMusInfo (const char *mapid) // Check number in range if (num > 0 && num < MAX_MUS_ENTRIES) { - U_MustGetToken(s, TK_Identifier); + U_GetString(s); lumpnum = W_CheckNumForName(s->string); if (lumpnum > 0) { diff --git a/src/u_scanner.c b/src/u_scanner.c index d21ea2c2..4d9bbc0d 100644 --- a/src/u_scanner.c +++ b/src/u_scanner.c @@ -166,7 +166,7 @@ boolean U_CheckToken(u_scanner_t* s, char token) if(s->needNext) { if(!U_GetNextToken(s, false)) - return false; + return false; } // An int can also be a float. @@ -216,6 +216,46 @@ static void U_RestoreState(u_scanner_t* s, u_scanner_t savedstate) } } +boolean U_GetString(u_scanner_t* scanner) +{ + unsigned int start; + char cur; + u_parserstate_t* nextState = &scanner->nextState; + + if(!scanner->needNext) + { + scanner->needNext = true; + U_ExpandState(scanner); + return true; + } + + nextState->tokenLine = scanner->line; + nextState->tokenLinePosition = scanner->scanPos - scanner->lineStart; + nextState->token = TK_NoToken; + if(scanner->scanPos >= scanner->length) + { + U_ExpandState(scanner); + return false; + } + + start = scanner->scanPos; + cur = scanner->data[scanner->scanPos++]; + + while(scanner->scanPos < scanner->length) + { + cur = scanner->data[scanner->scanPos]; + + if(cur == ' ' || cur == '\t' || cur == '\n' || cur == '\r' || cur == 0) + break; + else + scanner->scanPos++; + } + + U_SetString(&(nextState->string), scanner->data + start, scanner->scanPos - start); + U_ExpandState(scanner); + return true; +} + boolean U_GetNextToken(u_scanner_t* scanner, boolean expandState) { unsigned int start; @@ -250,7 +290,7 @@ boolean U_GetNextToken(u_scanner_t* scanner, boolean expandState) cur = scanner->data[scanner->scanPos++]; // Determine by first character - if(cur == '_' || cur == '-' || (cur >= 'A' && cur <= 'Z') || (cur >= 'a' && cur <= 'z')) + if(cur == '_' || (cur >= 'A' && cur <= 'Z') || (cur >= 'a' && cur <= 'z')) nextState->token = TK_Identifier; else if(cur >= '0' && cur <= '9') { @@ -325,7 +365,7 @@ boolean U_GetNextToken(u_scanner_t* scanner, boolean expandState) default: break; case TK_Identifier: - if(cur != '_' && cur != '-' && (cur < 'A' || cur > 'Z') && (cur < 'a' || cur > 'z') && (cur < '0' || cur > '9')) + if(cur != '_' && (cur < 'A' || cur > 'Z') && (cur < 'a' || cur > 'z') && (cur < '0' || cur > '9')) end = scanner->scanPos; break; case TK_IntConst: @@ -464,7 +504,6 @@ boolean U_GetNextLineToken(u_scanner_t* scanner) return retval; } - void U_ErrorToken(u_scanner_t* s, int token) { if (token < TK_NumSpecialTokens && s->token >= TK_Identifier && s->token < TK_NumSpecialTokens) diff --git a/src/u_scanner.h b/src/u_scanner.h index 83f8417d..1bf1d64e 100644 --- a/src/u_scanner.h +++ b/src/u_scanner.h @@ -101,6 +101,7 @@ boolean U_CheckToken(u_scanner_t* scanner, char token); boolean U_CheckInteger(u_scanner_t* s); boolean U_CheckFloat(u_scanner_t* s); void U_Unget(u_scanner_t* s); +boolean U_GetString(u_scanner_t* s); void PRINTF_ATTR(2, 0) U_Error(u_scanner_t* s, const char *msg, ...); void U_ErrorToken(u_scanner_t* s, int token);