2
0
Эх сурвалжийг харах

Small simplification that removes one level of indirection.

mingodad 9 жил өмнө
parent
commit
df3ad41bfc

+ 95 - 90
SquiLu/samples/sqlexer.nut

@@ -497,11 +497,15 @@ struct SQLexerNut
 
     SQInteger Error(const SQChar_ptr_t err, ...)
     {
+	_lasterror = err;
+	if(0)
+	{
 	throw err;
         va_list vl;
         va_start(vl, fmt);
         scvsprintf(_lasterror, sizeof(_lasterror), fmt, vl);
         va_end(vl);
+	}
         if(_errfunc) _errfunc(_errtarget,_lasterror);
         return -1;
     }
@@ -518,17 +522,17 @@ struct SQLexerNut
             case '\t':
             case '\r':
             case ' ':
-                /*NEXT()*/{SQInteger rc = Next();if(rc < 0) return rc;_currentcolumn++;};
+                if(Next()) return -1;
                 continue;
             case '\n':
                 _currentline++;
                 _prevtoken=_curtoken;
                 _curtoken='\n';
-                /*NEXT()*/{SQInteger rc = Next();if(rc < 0) return rc;_currentcolumn++;};
+                if(Next()) return -1;
                 _currentcolumn=1;
                 continue;
             case '#':
-                /*NEXT()*/{SQInteger rc = Next();if(rc < 0) return rc;_currentcolumn++;};
+                if(Next()) return -1;
                 if(CUR_CHAR == '!') //shell shebang
                 {
                     if(LexLineComment()) return -1;
@@ -538,7 +542,7 @@ struct SQLexerNut
                 return RETURN_TOKEN(TK_PRAGMA);
                 continue;
             case '/':
-                /*NEXT()*/{SQInteger rc = Next();if(rc < 0) return rc;_currentcolumn++;};
+                if(Next()) return -1;
                 switch(CUR_CHAR)
                 {
                 case '*':
@@ -550,28 +554,28 @@ struct SQLexerNut
                     if(_want_comments) return RETURN_TOKEN(TK_COMMENT_LINE)
                         continue;
                 case '=':
-                    /*NEXT()*/{SQInteger rc = Next();if(rc < 0) return rc;_currentcolumn++;};
+                    if(Next()) return -1;
                     return RETURN_TOKEN(TK_DIVEQ);
                     continue;
                 case '>':
-                    /*NEXT()*/{SQInteger rc = Next();if(rc < 0) return rc;_currentcolumn++;};
+                    if(Next()) return -1;
                     return RETURN_TOKEN(TK_ATTR_CLOSE);
                     continue;
                 default:
                     return RETURN_TOKEN('/');
                 }
             case '=':
-                /*NEXT()*/{SQInteger rc = Next();if(rc < 0) return rc;_currentcolumn++;};
+                if(Next()) return -1;
                 if (CUR_CHAR != '=')
                 {
                     return RETURN_TOKEN('=')
                 }
                 else
                 {
-                    /*NEXT()*/{SQInteger rc = Next();if(rc < 0) return rc;_currentcolumn++;};
+                    if(Next()) return -1;
                     if (CUR_CHAR == '=')
                     {
-                        /*NEXT()*/{SQInteger rc = Next();if(rc < 0) return rc;_currentcolumn++;};
+                        if(Next()) return -1;
                         return RETURN_TOKEN(TK_EQ_IDENTITY)
                     }
                     else
@@ -580,45 +584,45 @@ struct SQLexerNut
                     }
                 }
             case '<':
-                /*NEXT()*/{SQInteger rc = Next();if(rc < 0) return rc;_currentcolumn++;};
+                if(Next()) return -1;
                 switch(CUR_CHAR)
                 {
                 case '=':
-                    /*NEXT()*/{SQInteger rc = Next();if(rc < 0) return rc;_currentcolumn++;};
+                    if(Next()) return -1;
                     if(CUR_CHAR == '>')
                     {
-                        /*NEXT()*/{SQInteger rc = Next();if(rc < 0) return rc;_currentcolumn++;};
+                        if(Next()) return -1;
                         return RETURN_TOKEN(TK_3WAYSCMP);
                     }
                     return RETURN_TOKEN(TK_LE)
                     break;
                 case '-':
-                    /*NEXT()*/{SQInteger rc = Next();if(rc < 0) return rc;_currentcolumn++;};
+                    if(Next()) return -1;
                     return RETURN_TOKEN(TK_NEWSLOT);
                     break;
                 case '<':
-                    /*NEXT()*/{SQInteger rc = Next();if(rc < 0) return rc;_currentcolumn++;};
+                    if(Next()) return -1;
                     return RETURN_TOKEN(TK_SHIFTL);
                     break;
                 case '/':
-                    /*NEXT()*/{SQInteger rc = Next();if(rc < 0) return rc;_currentcolumn++;};
+                    if(Next()) return -1;
                     return RETURN_TOKEN(TK_ATTR_OPEN);
                     break;
                 }
                 return RETURN_TOKEN('<');
             case '>':
-                /*NEXT()*/{SQInteger rc = Next();if(rc < 0) return rc;_currentcolumn++;};
+                if(Next()) return -1;
                 if (CUR_CHAR == '=')
                 {
-                    /*NEXT()*/{SQInteger rc = Next();if(rc < 0) return rc;_currentcolumn++;};
+                    if(Next()) return -1;
                     return RETURN_TOKEN(TK_GE);
                 }
                 else if(CUR_CHAR == '>')
                 {
-                    /*NEXT()*/{SQInteger rc = Next();if(rc < 0) return rc;_currentcolumn++;};
+                    if(Next()) return -1;
                     if(CUR_CHAR == '>')
                     {
-                        /*NEXT()*/{SQInteger rc = Next();if(rc < 0) return rc;_currentcolumn++;};
+                        if(Next()) return -1;
                         return RETURN_TOKEN(TK_USHIFTR);
                     }
                     return RETURN_TOKEN(TK_SHIFTR);
@@ -628,17 +632,17 @@ struct SQLexerNut
                     return RETURN_TOKEN('>')
                 }
             case '!':
-                /*NEXT()*/{SQInteger rc = Next();if(rc < 0) return rc;_currentcolumn++;};
+                if(Next()) return -1;
                 if (CUR_CHAR != '=')
                 {
                     return RETURN_TOKEN('!')
                 }
                 else
                 {
-                    /*NEXT()*/{SQInteger rc = Next();if(rc < 0) return rc;_currentcolumn++;};
+                    if(Next()) return -1;
                     if (CUR_CHAR == '=')
                     {
-                        /*NEXT()*/{SQInteger rc = Next();if(rc < 0) return rc;_currentcolumn++;};
+                        if(Next()) return -1;
                         return RETURN_TOKEN(TK_NE_IDENTITY)
                     }
                     else
@@ -649,7 +653,7 @@ struct SQLexerNut
             case '@':
             {
                 SQInteger stype;
-                /*NEXT()*/{SQInteger rc = Next();if(rc < 0) return rc;_currentcolumn++;};
+                if(Next()) return -1;
                 if(CUR_CHAR != '"')
                 {
                     return RETURN_TOKEN('@');
@@ -682,7 +686,7 @@ struct SQLexerNut
             case '~':
             {
                 SQInteger ret = CUR_CHAR;
-                /*NEXT()*/{SQInteger rc = Next();if(rc < 0) return rc;_currentcolumn++;};
+                if(Next()) return -1;
                 if((ret == '[' || ret == '{' || ret == '(') && CUR_CHAR == '=')
                 {
                     //lets try lua literal delimiters
@@ -696,101 +700,101 @@ struct SQLexerNut
                 else return RETURN_TOKEN(ret);
             }
             case '.':
-                /*NEXT()*/{SQInteger rc = Next();if(rc < 0) return rc;_currentcolumn++;};
+                if(Next()) return -1;
                 if (CUR_CHAR != '.')
                 {
                     return RETURN_TOKEN('.')
                 }
-                /*NEXT()*/{SQInteger rc = Next();if(rc < 0) return rc;_currentcolumn++;};
+                if(Next()) return -1;
                 if (CUR_CHAR != '.')
                 {
                     return Error("invalid token '..'");
                 }
-                /*NEXT()*/{SQInteger rc = Next();if(rc < 0) return rc;_currentcolumn++;};
+                if(Next()) return -1;
                 return RETURN_TOKEN(TK_VARPARAMS);
             case '^':
-                /*NEXT()*/{SQInteger rc = Next();if(rc < 0) return rc;_currentcolumn++;};
-                //if (CUR_CHAR == '='){ /*NEXT()*/{SQInteger rc = Next();if(rc < 0) return rc;_currentcolumn++;}; return RETURN_TOKEN(TK_BIT_XOR_EQ);}
+                if(Next()) return -1;
+                //if (CUR_CHAR == '='){ if(Next()) return -1; return RETURN_TOKEN(TK_BIT_XOR_EQ);}
                 return RETURN_TOKEN('^');
             case '&':
-                /*NEXT()*/{SQInteger rc = Next();if(rc < 0) return rc;_currentcolumn++;};
-                //if (CUR_CHAR == '='){ /*NEXT()*/{SQInteger rc = Next();if(rc < 0) return rc;_currentcolumn++;}; return RETURN_TOKEN(TK_BIT_AND_EQ);}
+                if(Next()) return -1;
+                //if (CUR_CHAR == '='){ if(Next()) return -1; return RETURN_TOKEN(TK_BIT_AND_EQ);}
                 if (CUR_CHAR != '&')
                 {
                     return RETURN_TOKEN('&')
                 }
                 else
                 {
-                    /*NEXT()*/{SQInteger rc = Next();if(rc < 0) return rc;_currentcolumn++;};
+                    if(Next()) return -1;
                     return RETURN_TOKEN(TK_AND);
                 }
             case '|':
-                /*NEXT()*/{SQInteger rc = Next();if(rc < 0) return rc;_currentcolumn++;};
-                //if (CUR_CHAR == '='){ /*NEXT()*/{SQInteger rc = Next();if(rc < 0) return rc;_currentcolumn++;}; return RETURN_TOKEN(TK_BIT_OR_EQ);}
+                if(Next()) return -1;
+                //if (CUR_CHAR == '='){ if(Next()) return -1; return RETURN_TOKEN(TK_BIT_OR_EQ);}
                 if (CUR_CHAR != '|')
                 {
                     return RETURN_TOKEN('|')
                 }
                 else
                 {
-                    /*NEXT()*/{SQInteger rc = Next();if(rc < 0) return rc;_currentcolumn++;};
+                    if(Next()) return -1;
                     return RETURN_TOKEN(TK_OR);
                 }
             case ':':
-                /*NEXT()*/{SQInteger rc = Next();if(rc < 0) return rc;_currentcolumn++;};
+                if(Next()) return -1;
                 if (CUR_CHAR != ':')
                 {
                     return RETURN_TOKEN(':')
                 }
                 else
                 {
-                    /*NEXT()*/{SQInteger rc = Next();if(rc < 0) return rc;_currentcolumn++;};
+                    if(Next()) return -1;
                     return RETURN_TOKEN(TK_DOUBLE_COLON);
                 }
             case '*':
-                /*NEXT()*/{SQInteger rc = Next();if(rc < 0) return rc;_currentcolumn++;};
+                if(Next()) return -1;
                 if (CUR_CHAR == '=')
                 {
-                    /*NEXT()*/{SQInteger rc = Next();if(rc < 0) return rc;_currentcolumn++;};
+                    if(Next()) return -1;
                     return RETURN_TOKEN(TK_MULEQ);
                 }
                 else return RETURN_TOKEN('*');
             case '%':
-                /*NEXT()*/{SQInteger rc = Next();if(rc < 0) return rc;_currentcolumn++;};
+                if(Next()) return -1;
                 if (CUR_CHAR == '=')
                 {
-                    /*NEXT()*/{SQInteger rc = Next();if(rc < 0) return rc;_currentcolumn++;};
+                    if(Next()) return -1;
                     return RETURN_TOKEN(TK_MODEQ);
                 }
                 else return RETURN_TOKEN('%');
             case '-':
-                /*NEXT()*/{SQInteger rc = Next();if(rc < 0) return rc;_currentcolumn++;};
+                if(Next()) return -1;
                 if (CUR_CHAR == '=')
                 {
-                    /*NEXT()*/{SQInteger rc = Next();if(rc < 0) return rc;_currentcolumn++;};
+                    if(Next()) return -1;
                     return RETURN_TOKEN(TK_MINUSEQ);
                 }
                 else if  (CUR_CHAR == '-')
                 {
-                    /*NEXT()*/{SQInteger rc = Next();if(rc < 0) return rc;_currentcolumn++;};
+                    if(Next()) return -1;
                     return RETURN_TOKEN(TK_MINUSMINUS);
                 }
                 else if  (CUR_CHAR == '>')
                 {
-                    /*NEXT()*/{SQInteger rc = Next();if(rc < 0) return rc;_currentcolumn++;};    //accept C/C++ like pointers
+                    if(Next()) return -1;    //accept C/C++ like pointers
                     return RETURN_TOKEN('.');
                 }
                 else return RETURN_TOKEN('-');
             case '+':
-                /*NEXT()*/{SQInteger rc = Next();if(rc < 0) return rc;_currentcolumn++;};
+                if(Next()) return -1;
                 if (CUR_CHAR == '=')
                 {
-                    /*NEXT()*/{SQInteger rc = Next();if(rc < 0) return rc;_currentcolumn++;};
+                    if(Next()) return -1;
                     return RETURN_TOKEN(TK_PLUSEQ);
                 }
                 else if (CUR_CHAR == '+')
                 {
-                    /*NEXT()*/{SQInteger rc = Next();if(rc < 0) return rc;_currentcolumn++;};
+                    if(Next()) return -1;
                     return RETURN_TOKEN(TK_PLUSPLUS);
                 }
                 else return RETURN_TOKEN('+');
@@ -814,7 +818,7 @@ struct SQLexerNut
                 {
                     SQInteger c = CUR_CHAR;
                     if (sciscntrl((int)c)) return Error("unexpected character(control)");
-                    /*NEXT()*/{SQInteger rc = Next();if(rc < 0) return rc;_currentcolumn++;};
+                    if(Next()) return -1;
                     return RETURN_TOKEN(c);
                 }
                 return RETURN_TOKEN(0);
@@ -906,7 +910,7 @@ struct SQLexerNut
             while(!IS_EOB() && CUR_CHAR == '=')
             {
                 ++start_equals;
-                /*NEXT()*/{SQInteger rc = Next();if(rc < 0) return rc;_currentcolumn++;};
+                if(Next()) return -1;
             }
             if(CUR_CHAR != cdelim1)
             {
@@ -915,14 +919,14 @@ struct SQLexerNut
             }
             ndelim = cdelim2;
         }
-        /*NEXT()*/{SQInteger rc = Next();if(rc < 0) return rc;_currentcolumn++;};
+        if(Next()) return -1;
         if(IS_EOB()) return -1;
         if(start_equals)
         {
             int cr_nl = CUR_CHAR == '\r';
-            if(cr_nl) /*NEXT()*/{SQInteger rc = Next();if(rc < 0) return rc;_currentcolumn++;};
+            if(cr_nl) if(Next()) return -1;
             cr_nl = CUR_CHAR == '\n';
-            if(cr_nl) /*NEXT()*/{SQInteger rc = Next();if(rc < 0) return rc;_currentcolumn++;};
+            if(cr_nl) if(Next()) return -1;
             if(cr_nl)  //if a new line follows the start of delimiter drop it
             {
                 ++_currentline;
@@ -944,18 +948,18 @@ struct SQLexerNut
                 case '\n':
                     if(!verbatim) return Error("newline in a constant");
                     APPEND_CHAR(CUR_CHAR);
-                    /*NEXT()*/{SQInteger rc = Next();if(rc < 0) return rc;_currentcolumn++;};
+                    if(Next()) return -1;
                     _currentline++;
                     break;
                 case '\\':
                     if(verbatim)
                     {
                         APPEND_CHAR('\\');
-                        /*NEXT()*/{SQInteger rc = Next();if(rc < 0) return rc;_currentcolumn++;};
+                        if(Next()) return -1;
                     }
                     else
                     {
-                        /*NEXT()*/{SQInteger rc = Next();if(rc < 0) return rc;_currentcolumn++;};
+                        if(Next()) return -1;
                         switch(CUR_CHAR)
                         {
                         case 'x':
@@ -989,47 +993,47 @@ struct SQLexerNut
                         break;
                         case 't':
                             APPEND_CHAR('\t');
-                            /*NEXT()*/{SQInteger rc = Next();if(rc < 0) return rc;_currentcolumn++;};
+                            if(Next()) return -1;
                             break;
                         case 'a':
                             APPEND_CHAR('\a');
-                            /*NEXT()*/{SQInteger rc = Next();if(rc < 0) return rc;_currentcolumn++;};
+                            if(Next()) return -1;
                             break;
                         case 'b':
                             APPEND_CHAR('\b');
-                            /*NEXT()*/{SQInteger rc = Next();if(rc < 0) return rc;_currentcolumn++;};
+                            if(Next()) return -1;
                             break;
                         case 'n':
                             APPEND_CHAR('\n');
-                            /*NEXT()*/{SQInteger rc = Next();if(rc < 0) return rc;_currentcolumn++;};
+                            if(Next()) return -1;
                             break;
                         case 'r':
                             APPEND_CHAR('\r');
-                            /*NEXT()*/{SQInteger rc = Next();if(rc < 0) return rc;_currentcolumn++;};
+                            if(Next()) return -1;
                             break;
                         case 'v':
                             APPEND_CHAR('\v');
-                            /*NEXT()*/{SQInteger rc = Next();if(rc < 0) return rc;_currentcolumn++;};
+                            if(Next()) return -1;
                             break;
                         case 'f':
                             APPEND_CHAR('\f');
-                            /*NEXT()*/{SQInteger rc = Next();if(rc < 0) return rc;_currentcolumn++;};
+                            if(Next()) return -1;
                             break;
                         case '0':
                             APPEND_CHAR('\0');
-                            /*NEXT()*/{SQInteger rc = Next();if(rc < 0) return rc;_currentcolumn++;};
+                            if(Next()) return -1;
                             break;
                         case '\\':
                             APPEND_CHAR('\\');
-                            /*NEXT()*/{SQInteger rc = Next();if(rc < 0) return rc;_currentcolumn++;};
+                            if(Next()) return -1;
                             break;
                         case '"':
                             APPEND_CHAR('"');
-                            /*NEXT()*/{SQInteger rc = Next();if(rc < 0) return rc;_currentcolumn++;};
+                            if(Next()) return -1;
                             break;
                         case '\'':
                             APPEND_CHAR('\'');
-                            /*NEXT()*/{SQInteger rc = Next();if(rc < 0) return rc;_currentcolumn++;};
+                            if(Next()) return -1;
                             break;
                         default:
                             return Error("unrecognised escaper char");
@@ -1039,28 +1043,28 @@ struct SQLexerNut
                     break;
                 default:
                     APPEND_CHAR(CUR_CHAR);
-                    /*NEXT()*/{SQInteger rc = Next();if(rc < 0) return rc;_currentcolumn++;};
+                    if(Next()) return -1;
                 }
             }
-            /*NEXT()*/{SQInteger rc = Next();if(rc < 0) return rc;_currentcolumn++;};
+            if(Next()) return -1;
             if(start_equals)
             {
                 bool lastBraceAdded = false;
                 if(CUR_CHAR == '=')
                 {
                     SQInteger end_equals = start_equals;
-                    /*NEXT()*/{SQInteger rc = Next();if(rc < 0) return rc;_currentcolumn++;};
+                    if(Next()) return -1;
                     if(CUR_CHAR == '=' || CUR_CHAR == cdelim2)
                     {
                         --end_equals;
                         while(!IS_EOB() && CUR_CHAR == '=')
                         {
                             --end_equals;
-                            /*NEXT()*/{SQInteger rc = Next();if(rc < 0) return rc;_currentcolumn++;};
+                            if(Next()) return -1;
                         }
                         if(end_equals) return Error("expect same number of '=' on literal delimiter");
                         if(CUR_CHAR != cdelim2) return Error("expect '%c' to close literal delimiter", cdelim2);
-                        /*NEXT()*/{SQInteger rc = Next();if(rc < 0) return rc;_currentcolumn++;};
+                        if(Next()) return -1;
                         break;
                     }
                     APPEND_CHAR(cdelim2); //the first NEXT() after break the while loop
@@ -1069,12 +1073,12 @@ struct SQLexerNut
                 }
                 if(!lastBraceAdded) APPEND_CHAR(cdelim2); //the first NEXT() after break the while loop
                 APPEND_CHAR(CUR_CHAR);
-                /*NEXT()*/{SQInteger rc = Next();if(rc < 0) return rc;_currentcolumn++;};
+                if(Next()) return -1;
             }
             else if(verbatim && CUR_CHAR == '"')   //double quotation
             {
                 APPEND_CHAR(CUR_CHAR);
-                /*NEXT()*/{SQInteger rc = Next();if(rc < 0) return rc;_currentcolumn++;};
+                if(Next()) return -1;
             }
             else
             {
@@ -1106,7 +1110,7 @@ struct SQLexerNut
         SQUnsignedInteger itmp=0;
         SQChar_ptr_t sTemp;
         INIT_TEMP_STRING();
-        /*NEXT()*/{SQInteger rc = Next();if(rc < 0) return rc;_currentcolumn++;};
+        if(Next()) return -1;
         if(firstchar == '0' && (sctoupper(CUR_CHAR) == 'X' || scisodigit(CUR_CHAR)) )
         {
             if(scisodigit(CUR_CHAR))
@@ -1115,18 +1119,18 @@ struct SQLexerNut
                 while(scisodigit(CUR_CHAR))
                 {
                     APPEND_CHAR(CUR_CHAR);
-                    /*NEXT()*/{SQInteger rc = Next();if(rc < 0) return rc;_currentcolumn++;};
+                    if(Next()) return -1;
                 }
                 if(scisdigit(CUR_CHAR)) return Error("invalid octal number");
             }
             else
             {
-                /*NEXT()*/{SQInteger rc = Next();if(rc < 0) return rc;_currentcolumn++;};
+                if(Next()) return -1;
                 type = THEX;
                 while(scisxdigit(CUR_CHAR))
                 {
                     APPEND_CHAR(CUR_CHAR);
-                    /*NEXT()*/{SQInteger rc = Next();if(rc < 0) return rc;_currentcolumn++;};
+                    if(Next()) return -1;
                 }
                 if(_longstr.size() > MAX_HEX_DIGITS) return Error("too many digits for an Hex number");
             }
@@ -1142,17 +1146,17 @@ struct SQLexerNut
                     if(type != TFLOAT) return Error("invalid numeric format");
                     type = TSCIENTIFIC;
                     APPEND_CHAR(CUR_CHAR);
-                    /*NEXT()*/{SQInteger rc = Next();if(rc < 0) return rc;_currentcolumn++;};
+                    if(Next()) return -1;
                     if(CUR_CHAR == '+' || CUR_CHAR == '-')
                     {
                         APPEND_CHAR(CUR_CHAR);
-                        /*NEXT()*/{SQInteger rc = Next();if(rc < 0) return rc;_currentcolumn++;};
+                        if(Next()) return -1;
                     }
                     if(!scisdigit(CUR_CHAR)) return Error("exponent expected");
                 }
 
                 APPEND_CHAR(CUR_CHAR);
-                /*NEXT()*/{SQInteger rc = Next();if(rc < 0) return rc;_currentcolumn++;};
+                if(Next()) return -1;
             }
         }
         TERMINATE_BUFFER();
@@ -1198,18 +1202,18 @@ struct SQLexerNut
         */
         bool done = false;
         if(_want_comments) INIT_TEMP_STRING();
-        /*NEXT()*/{SQInteger rc = Next();if(rc < 0) return rc;_currentcolumn++;}; //remove the comment token '*'
+        if(Next()) return -1; //remove the comment token '*'
         while(!done)
         {
             switch(CUR_CHAR)
             {
             case '*':
             {
-                /*NEXT()*/{SQInteger rc = Next();if(rc < 0) return rc;_currentcolumn++;};
+                if(Next()) return -1;
                 if(CUR_CHAR == '/')
                 {
                     done = true;
-                    /*NEXT()*/{SQInteger rc = Next();if(rc < 0) return rc;_currentcolumn++;};
+                    if(Next()) return -1;
                     continue;
                 }
             };
@@ -1221,7 +1225,7 @@ struct SQLexerNut
                 return Error("missing \"*/\" in comment");
             }
             if(_want_comments) APPEND_CHAR(CUR_CHAR);
-            /*NEXT()*/{SQInteger rc = Next();if(rc < 0) return rc;_currentcolumn++;};
+            if(Next()) return -1;
         }
         if(_want_comments)
         {
@@ -1235,11 +1239,11 @@ struct SQLexerNut
     SQInteger LexLineComment()
     {
         if(_want_comments) INIT_TEMP_STRING();
-        /*NEXT()*/{SQInteger rc = Next();if(rc < 0) return rc;_currentcolumn++;}; //remove the comment token
+        if(Next()) return -1; //remove the comment token
         while (CUR_CHAR != '\n' && (!IS_EOB()))
         {
             if(_want_comments) APPEND_CHAR(CUR_CHAR);
-            /*NEXT()*/{SQInteger rc = Next();if(rc < 0) return rc;_currentcolumn++;};
+            if(Next()) return -1;
         }
         if(_want_comments)
         {
@@ -1256,7 +1260,7 @@ struct SQLexerNut
         do
         {
             APPEND_CHAR(CUR_CHAR);
-            /*NEXT()*/{SQInteger rc = Next();if(rc < 0) return rc;_currentcolumn++;};
+            if(Next()) return -1;
         }
         while(scisalnum(CUR_CHAR) || CUR_CHAR == '_');
         TERMINATE_BUFFER();	
@@ -1275,6 +1279,7 @@ struct SQLexerNut
         if(t != 0)
         {
             CUR_CHAR = _currdata = /*(LexChar)*/t;
+	    ++_currentcolumn;
             return 0;
         }
         CUR_CHAR = _currdata = SQUIRREL_EOB;
@@ -1324,14 +1329,14 @@ struct SQLexerNut
 
     SQInteger ProcessStringHexEscape(SQChar_ptr_t dest, SQInteger maxdigits)
     {
-        /*NEXT()*/{SQInteger rc = Next();if(rc < 0) return rc;_currentcolumn++;};
+        if(Next()) return -1;
         if (!isxdigit(CUR_CHAR)) return Error("hexadecimal number expected");
         SQInteger n = 0;
         while (isxdigit(CUR_CHAR) && n < maxdigits)
         {
             dest[n] = CUR_CHAR;
             n++;
-            /*NEXT()*/{SQInteger rc = Next();if(rc < 0) return rc;_currentcolumn++;};
+            if(Next()) return -1;
         }
         dest[n] = 0;
         return n;

+ 460 - 458
SquiLu/squirrel/sqlexer.cpp

@@ -1,55 +1,56 @@
-/*
-	see copyright notice in squirrel.h
-*/
-#include "sqpcheader.h"
-#include <ctype.h>
-#include <stdlib.h>
-#include <limits.h>
-#include "sqtable.h"
-#include "sqstring.h"
-#include "sqcompiler.h"
-#include "sqlexer.h"
-
-#define CUR_CHAR (_currdata)
-#define RETURN_TOKEN(t) { _prevtoken = _curtoken; _curtoken = t; return t;}
-#define IS_EOB() (CUR_CHAR <= SQUIRREL_EOB)
-#define NEXT() {SQInteger rc = Next(); if(rc < 0) return rc; _currentcolumn++;}
-#define INIT_TEMP_STRING() { _longstr.resize(0);}
-#define APPEND_CHAR(c) { _longstr.push_back(c);}
-#define TERMINATE_BUFFER() {_longstr.push_back(_SC('\0'));}
-#define ADD_KEYWORD(key,id) tbl->NewSlot( SQString::Create(_sharedstate, _SC(#key)) ,SQInteger(id))
-
-SQLexer::SQLexer(){_keywords=0;}
-SQLexer::~SQLexer()
-{
-	_keywords->Release();
-}
-
+/*
+	see copyright notice in squirrel.h
+*/
+#include "sqpcheader.h"
+#include <ctype.h>
+#include <stdlib.h>
+#include <limits.h>
+#include "sqtable.h"
+#include "sqstring.h"
+#include "sqcompiler.h"
+#include "sqlexer.h"
+
+#define CUR_CHAR (_currdata)
+#define RETURN_TOKEN(t) { _prevtoken = _curtoken; _curtoken = t; return t;}
+#define IS_EOB() (CUR_CHAR <= SQUIRREL_EOB)
+//#define NEXT() {SQInteger rc = Next(); if(rc < 0) return rc; _currentcolumn++;}
+#define NEXT() {if(Next()) return -1;}
+#define INIT_TEMP_STRING() { _longstr.resize(0);}
+#define APPEND_CHAR(c) { _longstr.push_back(c);}
+#define TERMINATE_BUFFER() {_longstr.push_back(_SC('\0'));}
+#define ADD_KEYWORD(key,id) tbl->NewSlot( SQString::Create(_sharedstate, _SC(#key)) ,SQInteger(id))
+
+SQLexer::SQLexer(){_keywords=0;}
+SQLexer::~SQLexer()
+{
+	_keywords->Release();
+}
+
 SQInteger SQLexer::Init(SQSharedState *ss, SQLEXREADFUNC rg,
-                        SQUserPointer up,CompilerErrorFunc efunc,void *ed, SQBool want_comments)
+                        SQUserPointer up,CompilerErrorFunc efunc,void *ed, SQBool want_comments)
 {
     _want_comments = want_comments;
-    _lasterror[0] = '\0';
-    _svalue = NULL;
-	_errfunc = efunc;
-	_errtarget = ed;
+    _lasterror[0] = '\0';
+    _svalue = NULL;
+	_errfunc = efunc;
+	_errtarget = ed;
 	_sharedstate = ss;
-	if(_keywords) _keywords->Release();
-    _keywords = GetKeywords();
-	return ResetReader(rg, up, 1);
-}
+	if(_keywords) _keywords->Release();
+    _keywords = GetKeywords();
+	return ResetReader(rg, up, 1);
+}
 
-SQInteger SQLexer::ResetReader(SQLEXREADFUNC rg, SQUserPointer up, SQInteger line)
-{
-	_readf = rg;
-	_up = up;
+SQInteger SQLexer::ResetReader(SQLEXREADFUNC rg, SQUserPointer up, SQInteger line)
+{
+	_readf = rg;
+	_up = up;
 	_lasttokenline = _currentline = line;
-	_lasttokencolumn = 0;
-	_currentcolumn = 0;
-	_prevtoken = -1;
-	_reached_eof = SQFalse;
-	return Next();
-}
+	_lasttokencolumn = 0;
+	_currentcolumn = 0;
+	_prevtoken = -1;
+	_reached_eof = SQFalse;
+	return Next();
+}
 
 SQTable * SQLexer::GetKeywords()
 {
@@ -142,40 +143,41 @@ SQTable * SQLexer::GetKeywords()
 
 	return tbl;
 }
-
-SQInteger SQLexer::Error(const SQChar *fmt, ...)
-{
-    va_list vl;
-    va_start(vl, fmt);
-    scvsprintf(_lasterror, sizeof(_lasterror), fmt, vl);
-    va_end(vl);
+
+SQInteger SQLexer::Error(const SQChar *fmt, ...)
+{
+    va_list vl;
+    va_start(vl, fmt);
+    scvsprintf(_lasterror, sizeof(_lasterror), fmt, vl);
+    va_end(vl);
 	if(_errfunc) _errfunc(_errtarget,_lasterror);
-	return -1;
-}
-
-SQInteger SQLexer::Next()
-{
-	SQInteger t = _readf(_up);
-	if(t > MAX_CHAR) return Error(_SC("Invalid character"));
-	if(t != 0) {
-		_currdata = (LexChar)t;
-		return 0;
-	}
-	_currdata = SQUIRREL_EOB;
+	return -1;
+}
+
+SQInteger SQLexer::Next()
+{
+	SQInteger t = _readf(_up);
+	if(t > MAX_CHAR) return Error(_SC("Invalid character"));
+	if(t != 0) {
+		_currdata = (LexChar)t;
+		++_currentcolumn;
+		return 0;
+	}
+	_currdata = SQUIRREL_EOB;
 	_reached_eof = SQTrue;
-	return 0;
-}
-
-const SQChar *SQLexer::Tok2Str(SQInteger tok)
-{
-	SQObjectPtr itr, key, val;
-	SQInteger nitr;
-	while((nitr = _keywords->Next(false,itr, key, val)) != -1) {
-		itr = (SQInteger)nitr;
-		if(((SQInteger)_integer(val)) == tok)
-			return _stringval(key);
-	}
-	return NULL;
+	return 0;
+}
+
+const SQChar *SQLexer::Tok2Str(SQInteger tok)
+{
+	SQObjectPtr itr, key, val;
+	SQInteger nitr;
+	while((nitr = _keywords->Next(false,itr, key, val)) != -1) {
+		itr = (SQInteger)nitr;
+		if(((SQInteger)_integer(val)) == tok)
+			return _stringval(key);
+	}
+	return NULL;
 }
 
 const SQChar *SQLexer::GetTokenName(int tk_code) {
@@ -190,9 +192,9 @@ const SQChar *SQLexer::GetTokenName(int tk_code) {
     }
     return str_tk;
 }
-
-
-SQInteger SQLexer::LexBlockComment()
+
+
+SQInteger SQLexer::LexBlockComment()
 {
 /*
     if(CUR_CHAR == _SC('*'))
@@ -202,18 +204,18 @@ SQInteger SQLexer::LexBlockComment()
             printf("Doument comment found at line %d\n", _currentline);
         }
     }
-*/
+*/
 	bool done = false;
 	if(_want_comments) INIT_TEMP_STRING();
-	NEXT(); //remove the comment token '*'
-	while(!done) {
-		switch(CUR_CHAR) {
-			case _SC('*'): { NEXT(); if(CUR_CHAR == _SC('/')) { done = true; NEXT(); continue;}}; break;
-			case _SC('\n'): _currentline++; break;
-			case SQUIRREL_EOB: return Error(_SC("missing \"*/\" in comment"));
+	NEXT(); //remove the comment token '*'
+	while(!done) {
+		switch(CUR_CHAR) {
+			case _SC('*'): { NEXT(); if(CUR_CHAR == _SC('/')) { done = true; NEXT(); continue;}}; break;
+			case _SC('\n'): _currentline++; break;
+			case SQUIRREL_EOB: return Error(_SC("missing \"*/\" in comment"));
 		}
 		if(_want_comments) APPEND_CHAR(CUR_CHAR);
-		NEXT();
+		NEXT();
 	}
     if(_want_comments)
     {
@@ -221,35 +223,35 @@ SQInteger SQLexer::LexBlockComment()
         if(_longstr.size() > 0) _longstr.pop_back(); //remove the last '*'
         _svalue = &_longstr[0];
     }
-	return 0;
-}
-SQInteger SQLexer::LexLineComment()
+	return 0;
+}
+SQInteger SQLexer::LexLineComment()
 {
     if(_want_comments) INIT_TEMP_STRING();
-    NEXT(); //remove the comment token
+    NEXT(); //remove the comment token
 	while (CUR_CHAR != _SC('\n') && (!IS_EOB())) {if(_want_comments) APPEND_CHAR(CUR_CHAR); NEXT();}
     if(_want_comments)
     {
         TERMINATE_BUFFER();
         _svalue = &_longstr[0];
     }
-	return 0;
-}
-
-SQInteger SQLexer::Lex()
-{
+	return 0;
+}
+
+SQInteger SQLexer::Lex()
+{
 	_lasttokenline = _currentline;
-	_lasttokencolumn = _currentcolumn;
-	while(CUR_CHAR != SQUIRREL_EOB) {
-		switch(CUR_CHAR){
-		case _SC('\t'): case _SC('\r'): case _SC(' '): NEXT(); continue;
-		case _SC('\n'):
-			_currentline++;
-			_prevtoken=_curtoken;
-			_curtoken=_SC('\n');
-			NEXT();
-			_currentcolumn=1;
-			continue;
+	_lasttokencolumn = _currentcolumn;
+	while(CUR_CHAR != SQUIRREL_EOB) {
+		switch(CUR_CHAR){
+		case _SC('\t'): case _SC('\r'): case _SC(' '): NEXT(); continue;
+		case _SC('\n'):
+			_currentline++;
+			_prevtoken=_curtoken;
+			_curtoken=_SC('\n');
+			NEXT();
+			_currentcolumn=1;
+			continue;
 		case _SC('#'):
 		    NEXT();
 		    if(CUR_CHAR == '!') //shell shebang
@@ -260,184 +262,184 @@ SQInteger SQLexer::Lex()
             }
             RETURN_TOKEN(TK_PRAGMA);
             continue;
-		case _SC('/'):
-			NEXT();
-			switch(CUR_CHAR){
-			case _SC('*'):
-				if(LexBlockComment()) return -1;
+		case _SC('/'):
+			NEXT();
+			switch(CUR_CHAR){
+			case _SC('*'):
+				if(LexBlockComment()) return -1;
                 if(_want_comments) RETURN_TOKEN(TK_COMMENT_BLOCK)
-				continue;
-			case _SC('/'):
-				if(LexLineComment()) return -1;
+				continue;
+			case _SC('/'):
+				if(LexLineComment()) return -1;
                 if(_want_comments) RETURN_TOKEN(TK_COMMENT_LINE)
-				continue;
-			case _SC('='):
-				NEXT();
-				RETURN_TOKEN(TK_DIVEQ);
-				continue;
-			case _SC('>'):
-				NEXT();
-				RETURN_TOKEN(TK_ATTR_CLOSE);
-				continue;
-			default:
-				RETURN_TOKEN('/');
-			}
-		case _SC('='):
-			NEXT();
-			if (CUR_CHAR != _SC('=')){ RETURN_TOKEN('=') }
+				continue;
+			case _SC('='):
+				NEXT();
+				RETURN_TOKEN(TK_DIVEQ);
+				continue;
+			case _SC('>'):
+				NEXT();
+				RETURN_TOKEN(TK_ATTR_CLOSE);
+				continue;
+			default:
+				RETURN_TOKEN('/');
+			}
+		case _SC('='):
+			NEXT();
+			if (CUR_CHAR != _SC('=')){ RETURN_TOKEN('=') }
 			else {
                 NEXT();
                 if (CUR_CHAR == _SC('=')){ NEXT(); RETURN_TOKEN(TK_EQ_IDENTITY) }
                 else { RETURN_TOKEN(TK_EQ); }
-            }
-		case _SC('<'):
-			NEXT();
-			switch(CUR_CHAR) {
-			case _SC('='):
-				NEXT();
-				if(CUR_CHAR == _SC('>')) {
-					NEXT();
-					RETURN_TOKEN(TK_3WAYSCMP);
-				}
-				RETURN_TOKEN(TK_LE)
-				break;
-			case _SC('-'): NEXT(); RETURN_TOKEN(TK_NEWSLOT); break;
-			case _SC('<'): NEXT(); RETURN_TOKEN(TK_SHIFTL); break;
-			case _SC('/'): NEXT(); RETURN_TOKEN(TK_ATTR_OPEN); break;
-			}
-			RETURN_TOKEN('<');
-		case _SC('>'):
-			NEXT();
-			if (CUR_CHAR == _SC('=')){ NEXT(); RETURN_TOKEN(TK_GE);}
-			else if(CUR_CHAR == _SC('>')){
-				NEXT();
-				if(CUR_CHAR == _SC('>')){
-					NEXT();
-					RETURN_TOKEN(TK_USHIFTR);
-				}
-				RETURN_TOKEN(TK_SHIFTR);
-			}
-			else { RETURN_TOKEN('>') }
-		case _SC('!'):
-			NEXT();
-			if (CUR_CHAR != _SC('=')){ RETURN_TOKEN('!')}
+            }
+		case _SC('<'):
+			NEXT();
+			switch(CUR_CHAR) {
+			case _SC('='):
+				NEXT();
+				if(CUR_CHAR == _SC('>')) {
+					NEXT();
+					RETURN_TOKEN(TK_3WAYSCMP);
+				}
+				RETURN_TOKEN(TK_LE)
+				break;
+			case _SC('-'): NEXT(); RETURN_TOKEN(TK_NEWSLOT); break;
+			case _SC('<'): NEXT(); RETURN_TOKEN(TK_SHIFTL); break;
+			case _SC('/'): NEXT(); RETURN_TOKEN(TK_ATTR_OPEN); break;
+			}
+			RETURN_TOKEN('<');
+		case _SC('>'):
+			NEXT();
+			if (CUR_CHAR == _SC('=')){ NEXT(); RETURN_TOKEN(TK_GE);}
+			else if(CUR_CHAR == _SC('>')){
+				NEXT();
+				if(CUR_CHAR == _SC('>')){
+					NEXT();
+					RETURN_TOKEN(TK_USHIFTR);
+				}
+				RETURN_TOKEN(TK_SHIFTR);
+			}
+			else { RETURN_TOKEN('>') }
+		case _SC('!'):
+			NEXT();
+			if (CUR_CHAR != _SC('=')){ RETURN_TOKEN('!')}
 			else {
                 NEXT();
                 if (CUR_CHAR == _SC('=')){ NEXT(); RETURN_TOKEN(TK_NE_IDENTITY)}
                 else { RETURN_TOKEN(TK_NE); }
-            }
-		case _SC('@'): {
-			SQInteger stype;
-			NEXT();
-			if(CUR_CHAR != _SC('"')) {
-				RETURN_TOKEN('@');
-			}
-			if((stype=ReadString('"',true))!=-1) {
-				RETURN_TOKEN(stype);
-			}
-			return Error(_SC("error parsing the string"));
-					   }
-		case _SC('"'):
-		case _SC('\''): {
-			SQInteger stype;
-			if((stype=ReadString(CUR_CHAR,false))!=-1){
-				RETURN_TOKEN(stype);
-			}
-			return Error(_SC("error parsing the string"));
-			}
-		case _SC('{'): case _SC('}'): case _SC('('): case _SC(')'): case _SC('['): case _SC(']'):
-		case _SC(';'): case _SC(','): case _SC('?'): case _SC('~'):
+            }
+		case _SC('@'): {
+			SQInteger stype;
+			NEXT();
+			if(CUR_CHAR != _SC('"')) {
+				RETURN_TOKEN('@');
+			}
+			if((stype=ReadString('"',true))!=-1) {
+				RETURN_TOKEN(stype);
+			}
+			return Error(_SC("error parsing the string"));
+					   }
+		case _SC('"'):
+		case _SC('\''): {
+			SQInteger stype;
+			if((stype=ReadString(CUR_CHAR,false))!=-1){
+				RETURN_TOKEN(stype);
+			}
+			return Error(_SC("error parsing the string"));
+			}
+		case _SC('{'): case _SC('}'): case _SC('('): case _SC(')'): case _SC('['): case _SC(']'):
+		case _SC(';'): case _SC(','): case _SC('?'): case _SC('~'):
 			{
-			    SQInteger ret = CUR_CHAR;
+			    SQInteger ret = CUR_CHAR;
                 NEXT();
                 if((ret == _SC('[') || ret == _SC('{') || ret == _SC('(')) && CUR_CHAR == _SC('=')){
                     //lets try lua literal delimiters
-                    SQInteger stype;
-                    if((stype=ReadString(ret,true))!=-1){
-                        RETURN_TOKEN(stype);
-                    }
-                    return Error(_SC("error parsing the string"));
+                    SQInteger stype;
+                    if((stype=ReadString(ret,true))!=-1){
+                        RETURN_TOKEN(stype);
+                    }
+                    return Error(_SC("error parsing the string"));
                 }
                 else RETURN_TOKEN(ret);
-            }
-		case _SC('.'):
-			NEXT();
-			if (CUR_CHAR != _SC('.')){ RETURN_TOKEN('.') }
-			NEXT();
-			if (CUR_CHAR != _SC('.')){ return Error(_SC("invalid token '..'")); }
-			NEXT();
-			RETURN_TOKEN(TK_VARPARAMS);
-		case _SC('^'):
-			NEXT();
-			//if (CUR_CHAR == _SC('=')){ NEXT(); RETURN_TOKEN(TK_BIT_XOR_EQ);}
-			RETURN_TOKEN('^');
-		case _SC('&'):
-			NEXT();
-			//if (CUR_CHAR == _SC('=')){ NEXT(); RETURN_TOKEN(TK_BIT_AND_EQ);}
-			if (CUR_CHAR != _SC('&')){ RETURN_TOKEN('&') }
-			else { NEXT(); RETURN_TOKEN(TK_AND); }
-		case _SC('|'):
+            }
+		case _SC('.'):
+			NEXT();
+			if (CUR_CHAR != _SC('.')){ RETURN_TOKEN('.') }
 			NEXT();
-			//if (CUR_CHAR == _SC('=')){ NEXT(); RETURN_TOKEN(TK_BIT_OR_EQ);}
-			if (CUR_CHAR != _SC('|')){ RETURN_TOKEN('|') }
-			else { NEXT(); RETURN_TOKEN(TK_OR); }
-		case _SC(':'):
-			NEXT();
-			if (CUR_CHAR != _SC(':')){ RETURN_TOKEN(':') }
-			else { NEXT(); RETURN_TOKEN(TK_DOUBLE_COLON); }
-		case _SC('*'):
-			NEXT();
-			if (CUR_CHAR == _SC('=')){ NEXT(); RETURN_TOKEN(TK_MULEQ);}
-			else RETURN_TOKEN('*');
-		case _SC('%'):
-			NEXT();
-			if (CUR_CHAR == _SC('=')){ NEXT(); RETURN_TOKEN(TK_MODEQ);}
-			else RETURN_TOKEN('%');
-		case _SC('-'):
-			NEXT();
-			if (CUR_CHAR == _SC('=')){ NEXT(); RETURN_TOKEN(TK_MINUSEQ);}
-			else if  (CUR_CHAR == _SC('-')){ NEXT(); RETURN_TOKEN(TK_MINUSMINUS);}
-			else if  (CUR_CHAR == _SC('>')){ NEXT(); RETURN_TOKEN('.');} //accept C/C++ like pointers
-			else RETURN_TOKEN('-');
-		case _SC('+'):
-			NEXT();
-			if (CUR_CHAR == _SC('=')){ NEXT(); RETURN_TOKEN(TK_PLUSEQ);}
-			else if (CUR_CHAR == _SC('+')){ NEXT(); RETURN_TOKEN(TK_PLUSPLUS);}
-			else RETURN_TOKEN('+');
-		case SQUIRREL_EOB:
-			return 0;
-		default:{
-				if (scisdigit(CUR_CHAR)) {
+			if (CUR_CHAR != _SC('.')){ return Error(_SC("invalid token '..'")); }
+			NEXT();
+			RETURN_TOKEN(TK_VARPARAMS);
+		case _SC('^'):
+			NEXT();
+			//if (CUR_CHAR == _SC('=')){ NEXT(); RETURN_TOKEN(TK_BIT_XOR_EQ);}
+			RETURN_TOKEN('^');
+		case _SC('&'):
+			NEXT();
+			//if (CUR_CHAR == _SC('=')){ NEXT(); RETURN_TOKEN(TK_BIT_AND_EQ);}
+			if (CUR_CHAR != _SC('&')){ RETURN_TOKEN('&') }
+			else { NEXT(); RETURN_TOKEN(TK_AND); }
+		case _SC('|'):
+			NEXT();
+			//if (CUR_CHAR == _SC('=')){ NEXT(); RETURN_TOKEN(TK_BIT_OR_EQ);}
+			if (CUR_CHAR != _SC('|')){ RETURN_TOKEN('|') }
+			else { NEXT(); RETURN_TOKEN(TK_OR); }
+		case _SC(':'):
+			NEXT();
+			if (CUR_CHAR != _SC(':')){ RETURN_TOKEN(':') }
+			else { NEXT(); RETURN_TOKEN(TK_DOUBLE_COLON); }
+		case _SC('*'):
+			NEXT();
+			if (CUR_CHAR == _SC('=')){ NEXT(); RETURN_TOKEN(TK_MULEQ);}
+			else RETURN_TOKEN('*');
+		case _SC('%'):
+			NEXT();
+			if (CUR_CHAR == _SC('=')){ NEXT(); RETURN_TOKEN(TK_MODEQ);}
+			else RETURN_TOKEN('%');
+		case _SC('-'):
+			NEXT();
+			if (CUR_CHAR == _SC('=')){ NEXT(); RETURN_TOKEN(TK_MINUSEQ);}
+			else if  (CUR_CHAR == _SC('-')){ NEXT(); RETURN_TOKEN(TK_MINUSMINUS);}
+			else if  (CUR_CHAR == _SC('>')){ NEXT(); RETURN_TOKEN('.');} //accept C/C++ like pointers
+			else RETURN_TOKEN('-');
+		case _SC('+'):
+			NEXT();
+			if (CUR_CHAR == _SC('=')){ NEXT(); RETURN_TOKEN(TK_PLUSEQ);}
+			else if (CUR_CHAR == _SC('+')){ NEXT(); RETURN_TOKEN(TK_PLUSPLUS);}
+			else RETURN_TOKEN('+');
+		case SQUIRREL_EOB:
+			return 0;
+		default:{
+				if (scisdigit(CUR_CHAR)) {
 					SQInteger ret = ReadNumber();
-					if(ret < 0) return -1;
-					RETURN_TOKEN(ret);
-				}
-				else if (scisalpha(CUR_CHAR) || CUR_CHAR == _SC('_')) {
+					if(ret < 0) return -1;
+					RETURN_TOKEN(ret);
+				}
+				else if (scisalpha(CUR_CHAR) || CUR_CHAR == _SC('_')) {
 					SQInteger t = ReadID();
-					if(t < 0) return -1;
-					RETURN_TOKEN(t);
-				}
-				else {
-					SQInteger c = CUR_CHAR;
-					if (sciscntrl((int)c)) return Error(_SC("unexpected character(control)"));
-					NEXT();
-					RETURN_TOKEN(c);
-				}
-				RETURN_TOKEN(0);
-			}
-		}
-	}
-	return 0;
-}
-
+					if(t < 0) return -1;
+					RETURN_TOKEN(t);
+				}
+				else {
+					SQInteger c = CUR_CHAR;
+					if (sciscntrl((int)c)) return Error(_SC("unexpected character(control)"));
+					NEXT();
+					RETURN_TOKEN(c);
+				}
+				RETURN_TOKEN(0);
+			}
+		}
+	}
+	return 0;
+}
+
 SQInteger SQLexer::GetIDType(const SQChar *s,SQInteger len)
 {
 	SQObjectPtr t;
 	if(_keywords->GetStr(s,len, t)) {
-		return SQInteger(_integer(t));
-	}
-	return TK_IDENTIFIER;
-}
+		return SQInteger(_integer(t));
+	}
+	return TK_IDENTIFIER;
+}
 
 #ifdef SQUNICODE
 #if WCHAR_SIZE == 2
@@ -498,10 +500,10 @@ SQInteger SQLexer::ProcessStringHexEscape(SQChar *dest, SQInteger maxdigits)
     dest[n] = 0;
     return n;
 }
-
-SQInteger SQLexer::ReadString(SQInteger ndelim,bool verbatim)
-{
-	INIT_TEMP_STRING();
+
+SQInteger SQLexer::ReadString(SQInteger ndelim,bool verbatim)
+{
+	INIT_TEMP_STRING();
 	SQInteger start_equals = 0;
 	SQChar cdelim1, cdelim2;
 	if(ndelim == _SC('{')){
@@ -527,9 +529,9 @@ SQInteger SQLexer::ReadString(SQInteger ndelim,bool verbatim)
 	        return Error(_SC("expect '%c' on literal delimiter"), cdelim1);
 	    }
 	    ndelim = cdelim2;
-	}
-	NEXT();
-	if(IS_EOB()) return -1;
+	}
+	NEXT();
+	if(IS_EOB()) return -1;
 	if(start_equals) {
 	    int cr_nl = CUR_CHAR == _SC('\r');
         if(cr_nl) NEXT();
@@ -541,26 +543,26 @@ SQInteger SQLexer::ReadString(SQInteger ndelim,bool verbatim)
             {
                 return Error(_SC("unfinished string"));
             }
-        }
+        }
 	}
-	for(;;) {
+	for(;;) {
 		while(CUR_CHAR != ndelim) {
-            SQInteger x = CUR_CHAR;
-			switch(x) {
-			case SQUIRREL_EOB:
-				return Error(_SC("unfinished string"));
-			case _SC('\n'):
-				if(!verbatim) return Error(_SC("newline in a constant"));
-				APPEND_CHAR(CUR_CHAR); NEXT();
-				_currentline++;
-				break;
-			case _SC('\\'):
-				if(verbatim) {
-					APPEND_CHAR('\\'); NEXT();
-				}
-				else {
-					NEXT();
-					switch(CUR_CHAR) {
+            SQInteger x = CUR_CHAR;
+			switch(x) {
+			case SQUIRREL_EOB:
+				return Error(_SC("unfinished string"));
+			case _SC('\n'):
+				if(!verbatim) return Error(_SC("newline in a constant"));
+				APPEND_CHAR(CUR_CHAR); NEXT();
+				_currentline++;
+				break;
+			case _SC('\\'):
+				if(verbatim) {
+					APPEND_CHAR('\\'); NEXT();
+				}
+				else {
+					NEXT();
+					switch(CUR_CHAR) {
                     case _SC('x'):  {
                         const SQInteger maxdigits = sizeof(SQChar) * 2;
                         SQChar temp[maxdigits + 1];
@@ -584,31 +586,31 @@ SQInteger SQLexer::ReadString(SQInteger ndelim,bool verbatim)
 #else
                         AddUTF8(scstrtoul(temp, &stemp, 16));
 #endif
-					}
-				    break;
-					case _SC('t'): APPEND_CHAR(_SC('\t')); NEXT(); break;
-					case _SC('a'): APPEND_CHAR(_SC('\a')); NEXT(); break;
-					case _SC('b'): APPEND_CHAR(_SC('\b')); NEXT(); break;
-					case _SC('n'): APPEND_CHAR(_SC('\n')); NEXT(); break;
-					case _SC('r'): APPEND_CHAR(_SC('\r')); NEXT(); break;
-					case _SC('v'): APPEND_CHAR(_SC('\v')); NEXT(); break;
-					case _SC('f'): APPEND_CHAR(_SC('\f')); NEXT(); break;
-					case _SC('0'): APPEND_CHAR(_SC('\0')); NEXT(); break;
-					case _SC('\\'): APPEND_CHAR(_SC('\\')); NEXT(); break;
-					case _SC('"'): APPEND_CHAR(_SC('"')); NEXT(); break;
-					case _SC('\''): APPEND_CHAR(_SC('\'')); NEXT(); break;
-					default:
-						return Error(_SC("unrecognised escaper char"));
-					break;
-					}
-				}
-				break;
-			default:
-				APPEND_CHAR(CUR_CHAR);
-				NEXT();
-			}
-		}
-		NEXT();
+					}
+				    break;
+					case _SC('t'): APPEND_CHAR(_SC('\t')); NEXT(); break;
+					case _SC('a'): APPEND_CHAR(_SC('\a')); NEXT(); break;
+					case _SC('b'): APPEND_CHAR(_SC('\b')); NEXT(); break;
+					case _SC('n'): APPEND_CHAR(_SC('\n')); NEXT(); break;
+					case _SC('r'): APPEND_CHAR(_SC('\r')); NEXT(); break;
+					case _SC('v'): APPEND_CHAR(_SC('\v')); NEXT(); break;
+					case _SC('f'): APPEND_CHAR(_SC('\f')); NEXT(); break;
+					case _SC('0'): APPEND_CHAR(_SC('\0')); NEXT(); break;
+					case _SC('\\'): APPEND_CHAR(_SC('\\')); NEXT(); break;
+					case _SC('"'): APPEND_CHAR(_SC('"')); NEXT(); break;
+					case _SC('\''): APPEND_CHAR(_SC('\'')); NEXT(); break;
+					default:
+						return Error(_SC("unrecognised escaper char"));
+					break;
+					}
+				}
+				break;
+			default:
+				APPEND_CHAR(CUR_CHAR);
+				NEXT();
+			}
+		}
+		NEXT();
 		if(start_equals){
 		    bool lastBraceAdded = false;
 		    if(CUR_CHAR == _SC('=')){
@@ -632,154 +634,154 @@ SQInteger SQLexer::ReadString(SQInteger ndelim,bool verbatim)
 		    if(!lastBraceAdded) APPEND_CHAR(cdelim2); //the first NEXT() after break the while loop
 		    APPEND_CHAR(CUR_CHAR);
 		    NEXT();
-		}
-		else if(verbatim && CUR_CHAR == '"') { //double quotation
-			APPEND_CHAR(CUR_CHAR);
-			NEXT();
-		}
-		else {
-			break;
-		}
-	}
-	TERMINATE_BUFFER();
-	SQInteger len = _longstr.size()-1;
-	if(ndelim == _SC('\'')) {
-		if(len == 0) return Error(_SC("empty constant"));
-		if(len > 1) return Error(_SC("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(scisdigit(*s)) *res = (*res)*16+((*s++)-'0');
-		else if(scisxdigit(*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');
+		}
+		else if(verbatim && CUR_CHAR == '"') { //double quotation
+			APPEND_CHAR(CUR_CHAR);
+			NEXT();
+		}
+		else {
+			break;
+		}
+	}
+	TERMINATE_BUFFER();
+	SQInteger len = _longstr.size()-1;
+	if(ndelim == _SC('\'')) {
+		if(len == 0) return Error(_SC("empty constant"));
+		if(len > 1) return Error(_SC("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(scisdigit(*s)) *res = (*res)*16+((*s++)-'0');
+		else if(scisxdigit(*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(SQInteger c) { return c >= _SC('0') && c <= _SC('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 scisodigit(SQInteger c) { return c >= _SC('0') && c <= _SC('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'; }
-
-
-#define MAX_HEX_DIGITS (sizeof(SQInteger)*2)
-SQInteger SQLexer::ReadNumber()
-{
-#define TINT 1
-#define TFLOAT 2
-#define THEX 3
-#define TSCIENTIFIC 4
-#define TOCTAL 5
+}
+
+SQInteger isexponent(SQInteger c) { return c == 'e' || c=='E'; }
+
+
+#define MAX_HEX_DIGITS (sizeof(SQInteger)*2)
+SQInteger SQLexer::ReadNumber()
+{
+#define TINT 1
+#define TFLOAT 2
+#define THEX 3
+#define TSCIENTIFIC 4
+#define TOCTAL 5
 	SQInteger type = TINT, firstchar = CUR_CHAR;
-	SQUnsignedInteger itmp=0;
-	SQChar *sTemp;
-	INIT_TEMP_STRING();
-	NEXT();
-	if(firstchar == _SC('0') && (toupper(CUR_CHAR) == _SC('X') || scisodigit(CUR_CHAR)) ) {
-		if(scisodigit(CUR_CHAR)) {
-			type = TOCTAL;
-			while(scisodigit(CUR_CHAR)) {
-				APPEND_CHAR(CUR_CHAR);
-				NEXT();
-			}
-			if(scisdigit(CUR_CHAR)) return Error(_SC("invalid octal number"));
-		}
-		else {
-			NEXT();
-			type = THEX;
-			while(isxdigit(CUR_CHAR)) {
-				APPEND_CHAR(CUR_CHAR);
-				NEXT();
-			}
-			if(_longstr.size() > MAX_HEX_DIGITS) return Error(_SC("too many digits for an Hex number"));
-		}
-	}
-	else {
-		APPEND_CHAR((int)firstchar);
-		while (CUR_CHAR == _SC('.') || scisdigit(CUR_CHAR) || isexponent(CUR_CHAR)) {
-            if(CUR_CHAR == _SC('.') || isexponent(CUR_CHAR)) type = TFLOAT;
-			if(isexponent(CUR_CHAR)) {
-				if(type != TFLOAT) return Error(_SC("invalid numeric format"));
-				type = TSCIENTIFIC;
-				APPEND_CHAR(CUR_CHAR);
-				NEXT();
-				if(CUR_CHAR == '+' || CUR_CHAR == '-'){
-					APPEND_CHAR(CUR_CHAR);
-					NEXT();
-				}
-				if(!scisdigit(CUR_CHAR)) return Error(_SC("exponent expected"));
-			}
-
-			APPEND_CHAR(CUR_CHAR);
-			NEXT();
-		}
-	}
-	TERMINATE_BUFFER();
-	switch(type) {
-	case TSCIENTIFIC:
-	case TFLOAT:
-		_fvalue = (SQFloat)scstrtod(&_longstr[0],&sTemp);
-		return TK_FLOAT;
-	case TINT:
+	SQUnsignedInteger itmp=0;
+	SQChar *sTemp;
+	INIT_TEMP_STRING();
+	NEXT();
+	if(firstchar == _SC('0') && (toupper(CUR_CHAR) == _SC('X') || scisodigit(CUR_CHAR)) ) {
+		if(scisodigit(CUR_CHAR)) {
+			type = TOCTAL;
+			while(scisodigit(CUR_CHAR)) {
+				APPEND_CHAR(CUR_CHAR);
+				NEXT();
+			}
+			if(scisdigit(CUR_CHAR)) return Error(_SC("invalid octal number"));
+		}
+		else {
+			NEXT();
+			type = THEX;
+			while(isxdigit(CUR_CHAR)) {
+				APPEND_CHAR(CUR_CHAR);
+				NEXT();
+			}
+			if(_longstr.size() > MAX_HEX_DIGITS) return Error(_SC("too many digits for an Hex number"));
+		}
+	}
+	else {
+		APPEND_CHAR((int)firstchar);
+		while (CUR_CHAR == _SC('.') || scisdigit(CUR_CHAR) || isexponent(CUR_CHAR)) {
+            if(CUR_CHAR == _SC('.') || isexponent(CUR_CHAR)) type = TFLOAT;
+			if(isexponent(CUR_CHAR)) {
+				if(type != TFLOAT) return Error(_SC("invalid numeric format"));
+				type = TSCIENTIFIC;
+				APPEND_CHAR(CUR_CHAR);
+				NEXT();
+				if(CUR_CHAR == '+' || CUR_CHAR == '-'){
+					APPEND_CHAR(CUR_CHAR);
+					NEXT();
+				}
+				if(!scisdigit(CUR_CHAR)) return Error(_SC("exponent expected"));
+			}
+
+			APPEND_CHAR(CUR_CHAR);
+			NEXT();
+		}
+	}
+	TERMINATE_BUFFER();
+	switch(type) {
+	case TSCIENTIFIC:
+	case TFLOAT:
+		_fvalue = (SQFloat)scstrtod(&_longstr[0],&sTemp);
+		return TK_FLOAT;
+	case TINT:
 		LexInteger(&_longstr[0],&itmp);
-		break;
-	case THEX:
-		LexHexadecimal(&_longstr[0],&itmp);
-		break;
-	case TOCTAL:
-		LexOctal(&_longstr[0],&itmp);
-		break;
-	}
-	switch(type) {
-	case TINT:
-	case THEX:
+		break;
+	case THEX:
+		LexHexadecimal(&_longstr[0],&itmp);
+		break;
+	case TOCTAL:
+		LexOctal(&_longstr[0],&itmp);
+		break;
+	}
+	switch(type) {
+	case TINT:
+	case THEX:
 	case TOCTAL:
 	    //to allow 64 bits integers comment bellow
         //if(itmp > INT_MAX) return Error(_SC("integer overflow %ulld %d"));
-        _nvalue = (SQInteger) itmp;
-		return TK_INTEGER;
-	}
-	return 0;
-}
-
-SQInteger SQLexer::ReadID()
-{
-	SQInteger res;
-	INIT_TEMP_STRING();
-	do {
-		APPEND_CHAR(CUR_CHAR);
-		NEXT();
-	} while(scisalnum(CUR_CHAR) || CUR_CHAR == _SC('_'));
-	TERMINATE_BUFFER();
+        _nvalue = (SQInteger) itmp;
+		return TK_INTEGER;
+	}
+	return 0;
+}
+
+SQInteger SQLexer::ReadID()
+{
+	SQInteger res;
+	INIT_TEMP_STRING();
+	do {
+		APPEND_CHAR(CUR_CHAR);
+		NEXT();
+	} while(scisalnum(CUR_CHAR) || CUR_CHAR == _SC('_'));
+	TERMINATE_BUFFER();
 	res = GetIDType(&_longstr[0],_longstr.size() - 1);
-	if(res == TK_IDENTIFIER || res == TK_CONSTRUCTOR || res == TK_DESTRUCTOR) {
-		_svalue = &_longstr[0];
-	}
-	return res;
-}
+	if(res == TK_IDENTIFIER || res == TK_CONSTRUCTOR || res == TK_DESTRUCTOR) {
+		_svalue = &_longstr[0];
+	}
+	return res;
+}