this shouldn't be in svn
[supertux.git] / src / squirrel / squirrel / sqlexer.cpp
index 93bd577..7244e73 100644 (file)
@@ -65,6 +65,7 @@ void SQLexer::Init(SQSharedState *ss, SQLEXREADFUNC rg, SQUserPointer up,Compile
        ADD_KEYWORD(vargv,TK_VARGV);\r
        ADD_KEYWORD(true,TK_TRUE);\r
        ADD_KEYWORD(false,TK_FALSE);\r
+       ADD_KEYWORD(static,TK_STATIC);\r
 \r
        _readf = rg;\r
        _up = up;\r
@@ -84,7 +85,7 @@ void SQLexer::Next()
        SQInteger t = _readf(_up);\r
        if(t > MAX_CHAR) Error(_SC("Invalid character"));\r
        if(t != 0) {\r
-               _currdata = t;\r
+               _currdata = (LexChar)t;\r
                return;\r
        }\r
        _currdata = SQUIRREL_EOB;\r
@@ -249,7 +250,7 @@ SQInteger SQLexer::Lex()
                                }\r
                                else {\r
                                        SQInteger c = CUR_CHAR;\r
-                                       if (sciscntrl(c)) Error(_SC("unexpected character(control)"));\r
+                                       if (sciscntrl((int)c)) Error(_SC("unexpected character(control)"));\r
                                        NEXT();\r
                                        RETURN_TOKEN(c);  \r
                                }\r
@@ -351,8 +352,28 @@ SQInteger SQLexer::ReadString(SQInteger ndelim,bool verbatim)
        return TK_STRING_LITERAL;\r
 }\r
 \r
-SQInteger isexponent(SQInteger c) { return c == 'e' || c=='E'; }\r
+void LexHexadecimal(const SQChar *s,SQUnsignedInteger *res)\r
+{\r
+       *res = 0;\r
+       while(*s != 0)\r
+       {\r
+               if(scisdigit(*s)) *res = (*res)*16+((*s++)-'0');\r
+               else if(scisxdigit(*s)) *res = (*res)*16+(toupper(*s++)-'A'+10);\r
+               else { assert(0); }\r
+       }\r
+}\r
 \r
+void LexInteger(const SQChar *s,SQUnsignedInteger *res)\r
+{\r
+       *res = 0;\r
+       while(*s != 0)\r
+       {\r
+               *res = (*res)*10+((*s++)-'0');\r
+       }\r
+}\r
+\r
+SQInteger isexponent(SQInteger c) { return c == 'e' || c=='E'; }\r
+#define MAX_HEX_DIGITS (sizeof(SQInteger)*2)\r
 SQInteger SQLexer::ReadNumber()\r
 {\r
 #define TINT 1\r
@@ -360,7 +381,6 @@ SQInteger SQLexer::ReadNumber()
 #define THEX 3\r
 #define TSCIENTIFIC 4\r
        SQInteger type = TINT, firstchar = CUR_CHAR;\r
-       bool isfloat = false;\r
        SQChar *sTemp;\r
        INIT_TEMP_STRING();\r
        NEXT();\r
@@ -371,10 +391,10 @@ SQInteger SQLexer::ReadNumber()
                        APPEND_CHAR(CUR_CHAR);\r
                        NEXT();\r
                }\r
-               if(_longstr.size() > 8) Error(_SC("Hex number over 8 digits"));\r
+               if(_longstr.size() > MAX_HEX_DIGITS) Error(_SC("too many digits for an Hex number"));\r
        }\r
        else {\r
-               APPEND_CHAR(firstchar);\r
+               APPEND_CHAR((int)firstchar);\r
                while (CUR_CHAR == _SC('.') || scisdigit(CUR_CHAR) || isexponent(CUR_CHAR)) {\r
             if(CUR_CHAR == _SC('.')) type = TFLOAT;\r
                        if(isexponent(CUR_CHAR)) {\r
@@ -400,10 +420,10 @@ SQInteger SQLexer::ReadNumber()
                _fvalue = (SQFloat)scstrtod(&_longstr[0],&sTemp);\r
                return TK_FLOAT;\r
        case TINT:\r
-               _nvalue = (SQInteger)scstrtol(&_longstr[0],&sTemp,10);\r
+               LexInteger(&_longstr[0],(SQUnsignedInteger *)&_nvalue);\r
                return TK_INTEGER;\r
        case THEX:\r
-               *((SQUnsignedInteger *)&_nvalue) = scstrtoul(&_longstr[0],&sTemp,16);\r
+               LexHexadecimal(&_longstr[0],(SQUnsignedInteger *)&_nvalue);\r
                return TK_INTEGER;\r
        }\r
        return 0;\r
@@ -411,7 +431,7 @@ SQInteger SQLexer::ReadNumber()
 \r
 SQInteger SQLexer::ReadID()\r
 {\r
-       SQInteger res, size = 0;\r
+       SQInteger res;\r
        INIT_TEMP_STRING();\r
        do {\r
                APPEND_CHAR(CUR_CHAR);\r
@@ -419,7 +439,7 @@ SQInteger SQLexer::ReadID()
        } while(scisalnum(CUR_CHAR) || CUR_CHAR == _SC('_'));\r
        TERMINATE_BUFFER();\r
        res = GetIDType(&_longstr[0]);\r
-       if(res == TK_IDENTIFIER) {\r
+       if(res == TK_IDENTIFIER || res == TK_CONSTRUCTOR) {\r
                _svalue = &_longstr[0];\r
        }\r
        return res;\r