From 60befe7df166ae7464c665394ba3793d9d26e184 Mon Sep 17 00:00:00 2001 From: glenda Date: Mon, 26 Feb 2018 22:39:49 -0500 Subject: [PATCH] games/mix: fix incorrect line numbers --- rc/bin/g | 2 +- sys/src/games/mix/mix.c | 70 ++++++++++++++++++++--------------------- sys/src/games/mix/mix.h | 1 + 3 files changed, 37 insertions(+), 36 deletions(-) diff --git a/rc/bin/g b/rc/bin/g index 69656dfcc..d3505e3d4 100755 --- a/rc/bin/g +++ b/rc/bin/g @@ -14,7 +14,7 @@ case 0 exit usage case 1 pattern=$1 - files=(`{ls *.[bcChlmsy] *.asm *.awk *.cc *.cgi *.cpp *.cs *.go *.goc *.java *.lx *.ms *.pl *.py *.rc *.tex *.xy >[2]/dev/null}) + files=(`{ls *.[bcChlmsy] *.ml[iyl] *.ml *.asm *.awk *.cc *.cgi *.cpp *.cs *.go *.goc *.java *.lx *.ms *.pl *.py *.rc *.tex *.xy >[2]/dev/null}) case * pattern=$1 shift diff --git a/sys/src/games/mix/mix.c b/sys/src/games/mix/mix.c index 2eb993fca..b7f451c0c 100644 --- a/sys/src/games/mix/mix.c +++ b/sys/src/games/mix/mix.c @@ -320,6 +320,14 @@ getr(void) return r; } +void +ungetr(Rune r) +{ + if(r == '\n') + line--; + Bungetrune(&bin); +} + long yylex(void) { @@ -339,22 +347,16 @@ Loop: case '\t': case ' ': goto Loop; - case '\n': - case '*': - case '+': - case '-': - case ':': - case ',': - case '(': - case ')': - case '=': + case '\n': case '*': case '+': + case '-': case ':': case ',': + case '(': case ')': case '=': return r; case '/': r = getr(); - if(r == '/') { + if(r == '/') return LSS; - } else - Bungetrune(&bin); + else + ungetr(r); return '/'; case '"': for(bp = buf; bp < buf+5; bp++) { @@ -369,30 +371,20 @@ Loop: ep = buf+nelem(buf)-1; isnum = 1; for(;;) { - if(runetomix(r) == -1) + if(runetomix(r) == -1) yyerror("Invalid character %C", r); if(bp == ep) yyerror("Symbol or number too long"); *bp++ = r; if(isnum && (r >= Runeself || !isdigit(r))) isnum = 0; - r = getr(); - switch(r) { - case Beof: - case '\t': - case '\n': - case '+': - case '-': - case '*': - case ':': - case ',': - case '(': - case ')': - case '=': - case ' ': - case '/': - case '#': - Bungetrune(&bin); + switch(r = getr()) { + case Beof: case '\t': case '\n': + case '+': case '-': case '*': + case ':': case ',': case '(': + case ')': case '=': case ' ': + case '/': case '#': + ungetr(r); *bp = '\0'; goto End; } @@ -407,6 +399,18 @@ End: return yylval.sym->lex; } +Sym* +getsym(char *name) +{ + Sym *s; + + s = emallocz(sizeof(*s) + strlen(name)); + strcpy(s->nbuf, name); + s->name = s->nbuf; + s->lex = LSYMREF; + return s; +} + Sym* sym(char *name) { @@ -416,11 +420,7 @@ sym(char *name) s = (Sym*)avllookup(syms, &l, 0); if(s != nil) return s; - - s = emallocz(sizeof(*s) + strlen(name)); - strcpy(s->nbuf, name); - s->name = s->nbuf; - s->lex = LSYMREF; + s = getsym(name); avlinsert(syms, s); return s; } diff --git a/sys/src/games/mix/mix.h b/sys/src/games/mix/mix.h index 59e1c70c5..197ad1b36 100644 --- a/sys/src/games/mix/mix.h +++ b/sys/src/games/mix/mix.h @@ -39,6 +39,7 @@ void yyerror(char*, ...); void vmerror(char*, ...); void skipto(char); Sym *sym(char*); +Sym *getsym(char*); void sinit(void); int asmfile(char*); int V(u32int, int);