@@ -110,9 +110,6 @@ static int32_t string_inplace_fix( char* str, int32_t len )
110
110
}
111
111
112
112
113
- #define STRLIT_LEN (lit ) (sizeof(lit)-1)
114
- #define STRLIT_BUF (lit ) lit, STRLIT_LEN(lit)
115
-
116
113
static int ident_equal ( const char * ptr , int size , const char * what , int wlen )
117
114
{
118
115
return size == wlen && memcmp ( ptr , what , (size_t ) size ) == 0 ;
@@ -138,29 +135,29 @@ static void readident( SGS_CTX, sgs_MemBuf* out, const char* code, int32_t* at,
138
135
}
139
136
if ( sz >= 255 ) sz = 255 ;
140
137
out -> ptr [ pos_rev + 1 ] = (char ) sz ;
141
- if ( ident_equal ( out -> ptr + pos_rev + 2 , sz , STRLIT_BUF ("var" ) ) ||
142
- ident_equal ( out -> ptr + pos_rev + 2 , sz , STRLIT_BUF ("global" ) ) ||
143
- ident_equal ( out -> ptr + pos_rev + 2 , sz , STRLIT_BUF ("thread" ) ) ||
144
- ident_equal ( out -> ptr + pos_rev + 2 , sz , STRLIT_BUF ("subthread" ) ) ||
145
- ident_equal ( out -> ptr + pos_rev + 2 , sz , STRLIT_BUF ("sync" ) ) ||
146
- ident_equal ( out -> ptr + pos_rev + 2 , sz , STRLIT_BUF ("race" ) ) ||
147
- ident_equal ( out -> ptr + pos_rev + 2 , sz , STRLIT_BUF ("null" ) ) ||
148
- ident_equal ( out -> ptr + pos_rev + 2 , sz , STRLIT_BUF ("true" ) ) ||
149
- ident_equal ( out -> ptr + pos_rev + 2 , sz , STRLIT_BUF ("false" ) ) ||
150
- ident_equal ( out -> ptr + pos_rev + 2 , sz , STRLIT_BUF ("if" ) ) ||
151
- ident_equal ( out -> ptr + pos_rev + 2 , sz , STRLIT_BUF ("else" ) ) ||
152
- ident_equal ( out -> ptr + pos_rev + 2 , sz , STRLIT_BUF ("do" ) ) ||
153
- ident_equal ( out -> ptr + pos_rev + 2 , sz , STRLIT_BUF ("while" ) ) ||
154
- ident_equal ( out -> ptr + pos_rev + 2 , sz , STRLIT_BUF ("for" ) ) ||
155
- ident_equal ( out -> ptr + pos_rev + 2 , sz , STRLIT_BUF ("foreach" ) ) ||
156
- ident_equal ( out -> ptr + pos_rev + 2 , sz , STRLIT_BUF ("break" ) ) ||
157
- ident_equal ( out -> ptr + pos_rev + 2 , sz , STRLIT_BUF ("continue" ) ) ||
158
- ident_equal ( out -> ptr + pos_rev + 2 , sz , STRLIT_BUF ("function" ) ) ||
159
- ident_equal ( out -> ptr + pos_rev + 2 , sz , STRLIT_BUF ("use" ) ) ||
160
- ident_equal ( out -> ptr + pos_rev + 2 , sz , STRLIT_BUF ("return" ) ) ||
161
- ident_equal ( out -> ptr + pos_rev + 2 , sz , STRLIT_BUF ("this" ) ) ||
162
- ident_equal ( out -> ptr + pos_rev + 2 , sz , STRLIT_BUF ("new" ) ) ||
163
- ident_equal ( out -> ptr + pos_rev + 2 , sz , STRLIT_BUF ("defer" ) ) )
138
+ if ( ident_equal ( out -> ptr + pos_rev + 2 , sz , SGS_STRLITBUF ("var" ) ) ||
139
+ ident_equal ( out -> ptr + pos_rev + 2 , sz , SGS_STRLITBUF ("global" ) ) ||
140
+ ident_equal ( out -> ptr + pos_rev + 2 , sz , SGS_STRLITBUF ("thread" ) ) ||
141
+ ident_equal ( out -> ptr + pos_rev + 2 , sz , SGS_STRLITBUF ("subthread" ) ) ||
142
+ ident_equal ( out -> ptr + pos_rev + 2 , sz , SGS_STRLITBUF ("sync" ) ) ||
143
+ ident_equal ( out -> ptr + pos_rev + 2 , sz , SGS_STRLITBUF ("race" ) ) ||
144
+ ident_equal ( out -> ptr + pos_rev + 2 , sz , SGS_STRLITBUF ("null" ) ) ||
145
+ ident_equal ( out -> ptr + pos_rev + 2 , sz , SGS_STRLITBUF ("true" ) ) ||
146
+ ident_equal ( out -> ptr + pos_rev + 2 , sz , SGS_STRLITBUF ("false" ) ) ||
147
+ ident_equal ( out -> ptr + pos_rev + 2 , sz , SGS_STRLITBUF ("if" ) ) ||
148
+ ident_equal ( out -> ptr + pos_rev + 2 , sz , SGS_STRLITBUF ("else" ) ) ||
149
+ ident_equal ( out -> ptr + pos_rev + 2 , sz , SGS_STRLITBUF ("do" ) ) ||
150
+ ident_equal ( out -> ptr + pos_rev + 2 , sz , SGS_STRLITBUF ("while" ) ) ||
151
+ ident_equal ( out -> ptr + pos_rev + 2 , sz , SGS_STRLITBUF ("for" ) ) ||
152
+ ident_equal ( out -> ptr + pos_rev + 2 , sz , SGS_STRLITBUF ("foreach" ) ) ||
153
+ ident_equal ( out -> ptr + pos_rev + 2 , sz , SGS_STRLITBUF ("break" ) ) ||
154
+ ident_equal ( out -> ptr + pos_rev + 2 , sz , SGS_STRLITBUF ("continue" ) ) ||
155
+ ident_equal ( out -> ptr + pos_rev + 2 , sz , SGS_STRLITBUF ("function" ) ) ||
156
+ ident_equal ( out -> ptr + pos_rev + 2 , sz , SGS_STRLITBUF ("use" ) ) ||
157
+ ident_equal ( out -> ptr + pos_rev + 2 , sz , SGS_STRLITBUF ("return" ) ) ||
158
+ ident_equal ( out -> ptr + pos_rev + 2 , sz , SGS_STRLITBUF ("this" ) ) ||
159
+ ident_equal ( out -> ptr + pos_rev + 2 , sz , SGS_STRLITBUF ("new" ) ) ||
160
+ ident_equal ( out -> ptr + pos_rev + 2 , sz , SGS_STRLITBUF ("defer" ) ) )
164
161
{
165
162
out -> ptr [ pos_rev ] = SGS_ST_KEYWORD ;
166
163
}
@@ -229,7 +226,7 @@ static void readstring( SGS_CTX, sgs_MemBuf* out, sgs_LineNum* line, const char*
229
226
230
227
static const char * sgs_opchars = "=<>+-*/%?!~&|^.$@" ;
231
228
static const char * sgs_operators = "<=>;===;!==;==;!=;<=;>=;+=;-=;*=;/=;%=;&=;|=;^=;<<=;>>=;$=;..=;"
232
- "<<;>>;&&=;||=;?" "?=;&&;||;?" "?;..;<;>;=;++;--;+;-;*;/;%;&;|;^;.;$;!;~;@" ; /* trigraphs detected */
229
+ "<<;>>;&&=;||=;?" "?=;&&;||;?" "?;..;<;>;=;++;--;+;-;*;/;%;&;|;^;.;$;!;~;@;? " ; /* trigraphs detected */
233
230
static const sgs_TokenType sgs_optable [] =
234
231
{
235
232
SGS_ST_OP_RWCMP , SGS_ST_OP_SEQ , SGS_ST_OP_SNEQ , SGS_ST_OP_EQ , SGS_ST_OP_NEQ , SGS_ST_OP_LEQ , SGS_ST_OP_GEQ ,
@@ -238,7 +235,7 @@ static const sgs_TokenType sgs_optable[] =
238
235
SGS_ST_OP_LSH , SGS_ST_OP_RSH , SGS_ST_OP_BLAEQ , SGS_ST_OP_BLOEQ , SGS_ST_OP_NLOEQ , SGS_ST_OP_BLAND ,
239
236
SGS_ST_OP_BLOR , SGS_ST_OP_NLOR , SGS_ST_OP_CAT , SGS_ST_OP_LESS , SGS_ST_OP_GRTR , SGS_ST_OP_SET , SGS_ST_OP_INC , SGS_ST_OP_DEC ,
240
237
SGS_ST_OP_ADD , SGS_ST_OP_SUB , SGS_ST_OP_MUL , SGS_ST_OP_DIV , SGS_ST_OP_MOD , SGS_ST_OP_AND ,
241
- SGS_ST_OP_OR , SGS_ST_OP_XOR , SGS_ST_OP_MMBR , SGS_ST_OP_CAT , SGS_ST_OP_NOT , SGS_ST_OP_INV , SGS_ST_OP_ERSUP
238
+ SGS_ST_OP_OR , SGS_ST_OP_XOR , SGS_ST_OP_MMBR , SGS_ST_OP_CAT , SGS_ST_OP_NOT , SGS_ST_OP_INV , SGS_ST_OP_ERSUP , SGS_ST_OP_QMARK
242
239
};
243
240
static const char sgs_opsep = ';' ;
244
241
@@ -333,7 +330,7 @@ sgs_TokenList sgsT_Gen( SGS_CTX, const char* code, size_t length )
333
330
|| code [ i + 1 ] == '*' ) ) skipcomment ( C , & line , code , & i , ilen );
334
331
335
332
/* special symbol */
336
- else if ( sgs_isoneof ( fc , "()[]{},;:#" ) ) sgs_membuf_appchr ( & s , C , fc );
333
+ else if ( sgs_isoneof ( fc , "()[]{},;:#\\ " ) ) sgs_membuf_appchr ( & s , C , fc );
337
334
338
335
/* identifier */
339
336
else if ( fc == '_' || sgs_isalpha ( fc ) || ( fc == '$' && pcfg .ident_dollar_sign ) )
@@ -490,6 +487,8 @@ static void tp_token( SGS_CTX, sgs_MemBuf* out, sgs_TokenList t )
490
487
case SGS_ST_ARGSEP :
491
488
case SGS_ST_STSEP :
492
489
case SGS_ST_PICKSEP :
490
+ case SGS_ST_HASH :
491
+ case SGS_ST_BACKSLASH :
493
492
sgs_membuf_appchr ( out , C , (char ) * t );
494
493
break ;
495
494
case SGS_ST_IDENT :
@@ -543,7 +542,7 @@ static void tp_token( SGS_CTX, sgs_MemBuf* out, sgs_TokenList t )
543
542
}
544
543
}
545
544
break ;
546
- #define OPR ( op ) sgs_membuf_appbuf( out, C, STRLIT_BUF (op) )
545
+ #define OPR ( op ) sgs_membuf_appbuf( out, C, SGS_STRLITBUF (op) )
547
546
case SGS_ST_OP_RWCMP : OPR ( "<=>" ); break ;
548
547
case SGS_ST_OP_SEQ : OPR ( "===" ); break ;
549
548
case SGS_ST_OP_SNEQ : OPR ( "!==" ); break ;
@@ -585,6 +584,7 @@ static void tp_token( SGS_CTX, sgs_MemBuf* out, sgs_TokenList t )
585
584
case SGS_ST_OP_INV : OPR ( "~" ); break ;
586
585
case SGS_ST_OP_INC : OPR ( "++" ); break ;
587
586
case SGS_ST_OP_DEC : OPR ( "--" ); break ;
587
+ case SGS_ST_OP_QMARK : OPR ( "?" ); break ;
588
588
#undef OPR
589
589
default :
590
590
sgs_membuf_appbuf ( out , C , "<error>" , 7 );
@@ -653,6 +653,8 @@ void sgsT_DumpToken( SGS_CTX, sgs_TokenList tok )
653
653
case SGS_ST_ARGSEP :
654
654
case SGS_ST_STSEP :
655
655
case SGS_ST_PICKSEP :
656
+ case SGS_ST_HASH :
657
+ case SGS_ST_BACKSLASH :
656
658
sgs_ErrWritef ( C , "%c" , * tok );
657
659
break ;
658
660
case SGS_ST_IDENT :
0 commit comments