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
if (num > 0 && num < MAX_MUS_ENTRIES)
{
U_MustGetToken(s, TK_Identifier);
U_GetString(s);
lumpnum = W_CheckNumForName(s->string);
if (lumpnum > 0)
{

View File

@ -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)

View File

@ -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);