=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/awk/lex.c,v retrieving revision 1.5 retrieving revision 1.6 diff -u -r1.5 -r1.6 --- src/usr.bin/awk/lex.c 2001/09/08 00:12:40 1.5 +++ src/usr.bin/awk/lex.c 2002/12/19 21:24:28 1.6 @@ -1,4 +1,4 @@ -/* $OpenBSD: lex.c,v 1.5 2001/09/08 00:12:40 millert Exp $ */ +/* $OpenBSD: lex.c,v 1.6 2002/12/19 21:24:28 millert Exp $ */ /**************************************************************** Copyright (C) Lucent Technologies 1997 All Rights Reserved @@ -39,7 +39,7 @@ int parencnt = 0; typedef struct Keyword { - char *word; + const char *word; int sub; int type; } Keyword; @@ -106,7 +106,7 @@ int gettok(char **pbuf, int *psz) /* get next input token */ { - int c; + int c, retc; char *buf = *pbuf; int sz = *psz; char *bp = buf; @@ -134,6 +134,7 @@ } } *bp = 0; + retc = 'a'; /* alphanumeric */ } else { /* it's a number */ char *rem; /* read input until can't be a number */ @@ -152,11 +153,17 @@ *bp = 0; strtod(buf, &rem); /* parse the number */ unputstr(rem); /* put rest back for later */ - rem[0] = 0; + if (rem == buf) { /* it wasn't a valid number at all */ + buf[1] = 0; /* so return one character as token */ + retc = buf[0]; /* character is its own type */ + } else { /* some prefix was a number */ + rem[0] = 0; /* so truncate where failure started */ + retc = '0'; /* number */ + } } *pbuf = buf; *psz = sz; - return buf[0]; + return retc; } int word(char *); @@ -187,7 +194,7 @@ return 0; if (isalpha(c) || c == '_') return word(buf); - if (isdigit(c) || c == '.') { + if (isdigit(c)) { yylval.cp = setsymtab(buf, tostring(buf), atof(buf), CON|NUM, symtab); /* should this also have STR set? */ RET(NUMBER); @@ -312,6 +319,9 @@ } yylval.cp = setsymtab(buf, "", 0.0, STR|NUM, symtab); RET(IVAR); + } else if (c == 0) { /* */ + SYNTAX( "unexpected end of input after $" ); + RET(';'); } else { unputstr(buf); RET(INDIRECT); @@ -367,6 +377,8 @@ case 0: SYNTAX( "non-terminated string %.10s...", buf ); lineno++; + if (c == 0) /* hopeless */ + FATAL( "giving up" ); break; case '\\': c = input(); @@ -488,7 +500,7 @@ } } -void startreg(void) /* next call to yyles will return a regular expression */ +void startreg(void) /* next call to yylex will return a regular expression */ { reg = 1; } @@ -563,7 +575,7 @@ ep = ebuf + sizeof(ebuf) - 1; } -void unputstr(char *s) /* put a string back on input */ +void unputstr(const char *s) /* put a string back on input */ { int i;