add U_GetString function (#1289)

Revert '-' in TK_Identifier. U_GetString accepts all data except whitespace.
This commit is contained in:
Roman Fomin 2023-11-28 12:04:15 +07:00 committed by GitHub
parent 2b8ae8f4e4
commit 286e0c3750
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 45 additions and 5 deletions

View File

@ -75,7 +75,7 @@ void S_ParseMusInfo (const char *mapid)
// Check number in range // Check number in range
if (num > 0 && num < MAX_MUS_ENTRIES) if (num > 0 && num < MAX_MUS_ENTRIES)
{ {
U_MustGetToken(s, TK_Identifier); U_GetString(s);
lumpnum = W_CheckNumForName(s->string); lumpnum = W_CheckNumForName(s->string);
if (lumpnum > 0) if (lumpnum > 0)
{ {

View File

@ -166,7 +166,7 @@ boolean U_CheckToken(u_scanner_t* s, char token)
if(s->needNext) if(s->needNext)
{ {
if(!U_GetNextToken(s, false)) if(!U_GetNextToken(s, false))
return false; return false;
} }
// An int can also be a float. // 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) boolean U_GetNextToken(u_scanner_t* scanner, boolean expandState)
{ {
unsigned int start; unsigned int start;
@ -250,7 +290,7 @@ boolean U_GetNextToken(u_scanner_t* scanner, boolean expandState)
cur = scanner->data[scanner->scanPos++]; cur = scanner->data[scanner->scanPos++];
// Determine by first character // 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; nextState->token = TK_Identifier;
else if(cur >= '0' && cur <= '9') else if(cur >= '0' && cur <= '9')
{ {
@ -325,7 +365,7 @@ boolean U_GetNextToken(u_scanner_t* scanner, boolean expandState)
default: default:
break; break;
case TK_Identifier: 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; end = scanner->scanPos;
break; break;
case TK_IntConst: case TK_IntConst:
@ -464,7 +504,6 @@ boolean U_GetNextLineToken(u_scanner_t* scanner)
return retval; return retval;
} }
void U_ErrorToken(u_scanner_t* s, int token) void U_ErrorToken(u_scanner_t* s, int token)
{ {
if (token < TK_NumSpecialTokens && s->token >= TK_Identifier && s->token < TK_NumSpecialTokens) if (token < TK_NumSpecialTokens && s->token >= TK_Identifier && s->token < TK_NumSpecialTokens)

View File

@ -101,6 +101,7 @@ boolean U_CheckToken(u_scanner_t* scanner, char token);
boolean U_CheckInteger(u_scanner_t* s); boolean U_CheckInteger(u_scanner_t* s);
boolean U_CheckFloat(u_scanner_t* s); boolean U_CheckFloat(u_scanner_t* s);
void U_Unget(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 PRINTF_ATTR(2, 0) U_Error(u_scanner_t* s, const char *msg, ...);
void U_ErrorToken(u_scanner_t* s, int token); void U_ErrorToken(u_scanner_t* s, int token);