From b432bbeb9e801fccb2b497f1c07d206f37eba9d4 Mon Sep 17 00:00:00 2001 From: Per Hedbor <ph@opera.com> Date: Tue, 29 Oct 1996 22:39:44 +0100 Subject: [PATCH] Fix for 8bit-character support and infinite loop in lex.c Rev: src/language.yacc:1.2 Rev: src/lex.c:1.4 Rev: src/macros.h:1.2 Rev: src/pike_types.c:1.3 --- src/language.yacc | 4 +++- src/lex.c | 23 ++++++++++++++++++++--- src/macros.h | 5 ++++- src/pike_types.c | 19 ++++++++++--------- 4 files changed, 37 insertions(+), 14 deletions(-) diff --git a/src/language.yacc b/src/language.yacc index c473d5bc0d..29d0cfcb71 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 97266f0d42..4f056db44e 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 e14120bf8f..0794644657 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 37e6c2fe29..782e93c619 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{ -- GitLab