diff --git a/src/language.yacc b/src/language.yacc index c473d5bc0d47e3968e124212fbdf0c02e6147bc1..29d0cfcb71fc26e56cd2190859549bb26b4d3233 100644 --- a/src/language.yacc +++ b/src/language.yacc @@ -109,6 +109,7 @@ %token F_MIXED_ID %token F_MOD_EQ %token F_MULT_EQ +%token F_MULT %token F_NO_MASK %token F_OBJECT_ID %token F_OR_EQ @@ -146,7 +147,7 @@ %left '>' F_GE '<' F_LE /* nonassoc? */ %left F_LSH F_RSH %left '+' '-' -%left '*' '%' '/' +%left '*' '%' '/' F_MULT %right F_NOT '~' %nonassoc F_INC F_DEC @@ -906,6 +907,7 @@ expr1: expr2 | expr1 '+' expr1 { $$=mkopernode("`+",$1,$3); } | expr1 '-' expr1 { $$=mkopernode("`-",$1,$3); } | expr1 '*' expr1 { $$=mkopernode("`*",$1,$3); } + | expr1 F_MULT expr1 { $$=mkopernode("`*",$1,$3); } | expr1 '%' expr1 { $$=mkopernode("`%",$1,$3); } | expr1 '/' expr1 { $$=mkopernode("`/",$1,$3); } ; diff --git a/src/lex.c b/src/lex.c index 97266f0d42436f25ab2210873f3f56d5fd90066f..4f056db44e644c8352bc952963a071b8751cff8d 100644 --- a/src/lex.c +++ b/src/lex.c @@ -385,7 +385,7 @@ struct inputstate { struct inputstate *next; int fd; - char *data; + unsigned char *data; INT32 buflen; INT32 pos; int dont_free_data; @@ -611,7 +611,7 @@ static struct inputstate *prot_memory_inputstate(char *data,INT32 len) #define READAHEAD 8192 static int file_getc() { - char buf[READAHEAD]; + unsigned char buf[READAHEAD]; int got; do { got=read(istate->fd, buf, READAHEAD); @@ -1083,6 +1083,11 @@ static void do_skip(int to) { do{ SKIPTO('*'); + if(LOOK()==MY_EOF) + { + yyerror("Unexpected end of file while skipping comment."); + return; + } }while(!GOBBLE('/')); } continue; @@ -1507,6 +1512,10 @@ static int do_lex2(int literal, YYSTYPE *yylval) if(GOBBLE('=')) return F_MULT_EQ; return '*'; + case (unsigned)('�'&0xff): + if(GOBBLE('=')) return F_MULT_EQ; + return F_MULT; + case '%': if(GOBBLE('=')) return F_MOD_EQ; return '%'; @@ -1516,13 +1525,20 @@ static int do_lex2(int literal, YYSTYPE *yylval) { do{ SKIPTO('*'); - }while(!GOBBLE('/')); + if(LOOK()==MY_EOF) + { + yyerror("Unexpected end of file while skipping comment."); + return 0; + } + } while(!GOBBLE('/')); continue; }else if(GOBBLE('/')) { SKIPUPTO('\n'); continue; } + /* Fallthrough */ + case ((unsigned)('�'&0xff)): if(GOBBLE('=')) return F_DIV_EQ; return '/'; @@ -1550,6 +1566,7 @@ static int do_lex2(int literal, YYSTYPE *yylval) return '>'; case '!': + case 0xac: /* ('�') */ if(GOBBLE('=')) return F_NE; return F_NOT; diff --git a/src/macros.h b/src/macros.h index e14120bf8f5e372c7cd5a5b9001a2bab24d0c97a..0794644657afeb416fb1c5bd8b081c5b98f260de 100644 --- a/src/macros.h +++ b/src/macros.h @@ -18,7 +18,10 @@ #define MINIMUM(X,Y) ((X)<(Y)?(X):(Y)) #define MAXIMUM(X,Y) ((X)>(Y)?(X):(Y)) -#define isidchar(X) (isalnum(X) || (X)=='_') + +#define is8bitalnum(X) ("0000000000000000000000000000100000000000000000000111111111000000011111111111111111111111111000010111111111111111111111111110000000000000000000000000000000000000101111010110001011110110011011100000000001111111111111101111111111111111111111111111111011111111"[((unsigned)X)&0xff] == '1') + +#define isidchar(X) is8bitalnum(X) #define ALIGN_BOUND sizeof(char *) #define DO_ALIGN(X,Y) (((long)(X)+(Y-1)) & -(Y)) diff --git a/src/pike_types.c b/src/pike_types.c index 37e6c2fe298cc5e764727c663d6027e5550512a1..782e93c6195d8b2e800b2fac8bb10a9b4a0d8d8d 100644 --- a/src/pike_types.c +++ b/src/pike_types.c @@ -198,11 +198,12 @@ struct pike_string *pop_type() -static void internal_parse_typeA(char **s) +static void internal_parse_typeA(char **_s) { - char buf[80]; + unsigned char buf[80]; unsigned int len; - + unsigned char **s = (unsigned char **)_s; + while(ISSPACE(**s)) ++*s; len=0; @@ -242,7 +243,7 @@ static void internal_parse_typeA(char **s) type_stack_mark(); type_stack_mark(); type_stack_mark(); - internal_parse_type(s); + internal_parse_type((char **)s); type_stack_reverse(); if(**s==',') { @@ -264,7 +265,7 @@ static void internal_parse_typeA(char **s) } ++*s; type_stack_mark(); - internal_parse_type(s); /* return type */ + internal_parse_type((char **)s); /* return type */ type_stack_reverse(); if(**s != ')') error("Missing ')' in function type.\n"); ++*s; @@ -284,12 +285,12 @@ static void internal_parse_typeA(char **s) type_stack_mark(); ++*s; type_stack_mark(); - internal_parse_type(s); + internal_parse_type((char **)s); type_stack_reverse(); if(**s != ':') error("Expecting ':'.\n"); ++*s; type_stack_mark(); - internal_parse_type(s); + internal_parse_type((char **)s); type_stack_reverse(); if(**s != ')') error("Expecting ')'.\n"); ++*s; @@ -306,7 +307,7 @@ static void internal_parse_typeA(char **s) if(**s == '(') { ++*s; - internal_parse_type(s); + internal_parse_type((char **)s); if(**s != ')') error("Expecting ')'.\n"); ++*s; }else{ @@ -320,7 +321,7 @@ static void internal_parse_typeA(char **s) if(**s == '(') { ++*s; - internal_parse_type(s); + internal_parse_type((char **)s); if(**s != ')') error("Expecting ')'.\n"); ++*s; }else{