diff --git a/src/3rdparty/squirrel/squirrel/sqcompiler.cpp b/src/3rdparty/squirrel/squirrel/sqcompiler.cpp index 496e7b6192..2d7c7d5703 100644 --- a/src/3rdparty/squirrel/squirrel/sqcompiler.cpp +++ b/src/3rdparty/squirrel/squirrel/sqcompiler.cpp @@ -88,7 +88,7 @@ public: //do nothing } else { - const SQChar *etypename; + std::string_view etypename; if(tok > 255) { switch(tok) { @@ -105,7 +105,7 @@ public: etypename = "FLOAT"; break; default: - etypename = _lex.Tok2Str(tok); + etypename = _lex.Tok2Str(tok).value_or(""); } throw CompileException(fmt::format("expected '{}'", etypename)); } @@ -116,10 +116,10 @@ public: switch(tok) { case TK_IDENTIFIER: - ret = _fs->CreateString(_lex._svalue); + ret = _fs->CreateString(_lex.View()); break; case TK_STRING_LITERAL: - ret = _fs->CreateString(std::string_view(_lex._svalue,_lex._longstr.size()-1)); + ret = _fs->CreateString(_lex.View()); break; case TK_INTEGER: ret = SQObjectPtr(_lex._nvalue); @@ -594,7 +594,7 @@ public: switch(_token) { case TK_STRING_LITERAL: { - _fs->AddInstruction(_OP_LOAD, _fs->PushTarget(), _fs->GetConstant(_fs->CreateString(std::string_view(_lex._svalue,_lex._longstr.size()-1)))); + _fs->AddInstruction(_OP_LOAD, _fs->PushTarget(), _fs->GetConstant(_fs->CreateString(_lex.View()))); Lex(); } break; @@ -614,7 +614,7 @@ public: SQObject id; SQObject constant; switch(_token) { - case TK_IDENTIFIER: id = _fs->CreateString(_lex._svalue); break; + case TK_IDENTIFIER: id = _fs->CreateString(_lex.View()); break; case TK_THIS: id = _fs->CreateString("this"); break; case TK_CONSTRUCTOR: id = _fs->CreateString("constructor"); break; } @@ -1099,7 +1099,7 @@ public: val._unVal.fFloat = _lex._fvalue; break; case TK_STRING_LITERAL: - val = _fs->CreateString(std::string_view(_lex._svalue,_lex._longstr.size()-1)); + val = _fs->CreateString(_lex.View()); break; case '-': Lex(); diff --git a/src/3rdparty/squirrel/squirrel/sqlexer.cpp b/src/3rdparty/squirrel/squirrel/sqlexer.cpp index 6523540880..56296969a3 100644 --- a/src/3rdparty/squirrel/squirrel/sqlexer.cpp +++ b/src/3rdparty/squirrel/squirrel/sqlexer.cpp @@ -85,7 +85,6 @@ SQLexer::SQLexer(SQSharedState *ss, SQLEXREADFUNC rg, SQUserPointer up) _prevtoken = -1; _curtoken = -1; - _svalue = nullptr; _nvalue = 0; _fvalue = 0; @@ -103,7 +102,7 @@ void SQLexer::Next() _currdata = SQUIRREL_EOB; } -const SQChar *SQLexer::Tok2Str(SQInteger tok) +std::optional SQLexer::Tok2Str(SQInteger tok) { SQObjectPtr itr, key, val; SQInteger nitr; @@ -112,7 +111,7 @@ const SQChar *SQLexer::Tok2Str(SQInteger tok) if(((SQInteger)_integer(val)) == tok) return _stringval(key); } - return nullptr; + return std::nullopt; } void SQLexer::LexBlockComment() @@ -270,7 +269,7 @@ SQInteger SQLexer::Lex() return 0; } -SQInteger SQLexer::GetIDType(SQChar *s) +SQInteger SQLexer::GetIDType(std::string_view s) { SQObjectPtr t; if(_keywords->Get(SQString::Create(_sharedstate, s), t)) { @@ -349,50 +348,17 @@ SQInteger SQLexer::ReadString(char32_t ndelim,bool verbatim) break; } } - TERMINATE_BUFFER(); - SQInteger len = _longstr.size()-1; if(ndelim == '\'') { - if(len == 0) throw CompileException("empty constant"); - if(len > 1) throw CompileException("constant too long"); + if(_longstr.empty()) throw CompileException("empty constant"); + if(_longstr.size() > 1) throw CompileException("constant too long"); _nvalue = _longstr[0]; return TK_INTEGER; } - _svalue = &_longstr[0]; return TK_STRING_LITERAL; } -void LexHexadecimal(const SQChar *s,SQUnsignedInteger *res) -{ - *res = 0; - while(*s != 0) - { - if(isdigit(*s)) *res = (*res)*16+((*s++)-'0'); - else if(isxdigit(*s)) *res = (*res)*16+(toupper(*s++)-'A'+10); - else { assert(0); } - } -} - -void LexInteger(const SQChar *s,SQUnsignedInteger *res) -{ - *res = 0; - while(*s != 0) - { - *res = (*res)*10+((*s++)-'0'); - } -} - SQInteger scisodigit(SQChar c) { return c >= '0' && c <= '7'; } -void LexOctal(const SQChar *s,SQUnsignedInteger *res) -{ - *res = 0; - while(*s != 0) - { - if(scisodigit(*s)) *res = (*res)*8+((*s++)-'0'); - else { assert(0); } - } -} - SQInteger isexponent(SQInteger c) { return c == 'e' || c=='E'; } @@ -447,20 +413,21 @@ SQInteger SQLexer::ReadNumber() NEXT(); } } - TERMINATE_BUFFER(); switch(type) { case TSCIENTIFIC: - case TFLOAT: - _fvalue = (SQFloat)strtod(&_longstr[0],&sTemp); + case TFLOAT: { + std::string str{View()}; + _fvalue = (SQFloat)strtod(str.c_str(),&sTemp); return TK_FLOAT; + } case TINT: - LexInteger(&_longstr[0],(SQUnsignedInteger *)&_nvalue); + _nvalue = ParseInteger(View(), 10).value_or(0); return TK_INTEGER; case THEX: - LexHexadecimal(&_longstr[0],(SQUnsignedInteger *)&_nvalue); + _nvalue = ParseInteger(View(), 16).value_or(0); return TK_INTEGER; case TOCTAL: - LexOctal(&_longstr[0],(SQUnsignedInteger *)&_nvalue); + _nvalue = ParseInteger(View(), 8).value_or(0); return TK_INTEGER; } return 0; @@ -474,10 +441,6 @@ SQInteger SQLexer::ReadID() APPEND_CHAR(CUR_CHAR); NEXT(); } while(isalnum(CUR_CHAR) || CUR_CHAR == '_'); - TERMINATE_BUFFER(); - res = GetIDType(&_longstr[0]); - if(res == TK_IDENTIFIER || res == TK_CONSTRUCTOR) { - _svalue = &_longstr[0]; - } + res = GetIDType(View()); return res; } diff --git a/src/3rdparty/squirrel/squirrel/sqlexer.h b/src/3rdparty/squirrel/squirrel/sqlexer.h index 818c7a8d81..a2342646f8 100644 --- a/src/3rdparty/squirrel/squirrel/sqlexer.h +++ b/src/3rdparty/squirrel/squirrel/sqlexer.h @@ -7,9 +7,9 @@ struct SQLexer ~SQLexer(); SQLexer(SQSharedState *ss,SQLEXREADFUNC rg,SQUserPointer up); SQInteger Lex(); - const SQChar *Tok2Str(SQInteger tok); + std::optional Tok2Str(SQInteger tok); private: - SQInteger GetIDType(SQChar *s); + SQInteger GetIDType(std::string_view s); SQInteger ReadString(char32_t ndelim,bool verbatim); SQInteger ReadNumber(); void LexBlockComment(); @@ -19,14 +19,12 @@ private: SQTable *_keywords; void INIT_TEMP_STRING() { _longstr.resize(0); } void APPEND_CHAR(char32_t c); - void TERMINATE_BUFFER() { _longstr.push_back('\0'); } public: SQInteger _prevtoken; SQInteger _currentline; SQInteger _lasttokenline; SQInteger _currentcolumn; - const SQChar *_svalue; SQInteger _nvalue; SQFloat _fvalue; SQLEXREADFUNC _readf; @@ -34,6 +32,8 @@ public: char32_t _currdata; SQSharedState *_sharedstate; sqvector _longstr; + + std::string_view View() const { return std::string_view(_longstr._vals, _longstr.size()); } }; #endif