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