]> Cypherpunks repositories - gostls13.git/commitdiff
more nihan
authorKen Thompson <ken@golang.org>
Mon, 9 Jun 2008 02:02:27 +0000 (19:02 -0700)
committerKen Thompson <ken@golang.org>
Mon, 9 Jun 2008 02:02:27 +0000 (19:02 -0700)
SVN=121622

src/cmd/gc/go.h
src/cmd/gc/lex.c

index eaaf172925c813e1a3abcb465c89aaa77a5e0e19..1598a8e69e95a4ab931d79b62638a01089967716 100644 (file)
@@ -387,7 +387,7 @@ void        lexinit(void);
 char*  lexname(int);
 long   getr(void);
 int    getnsc(void);
-int    escchar(int, vlong*);
+int    escchar(int, int*, vlong*);
 int    getc(void);
 void   ungetc(int);
 void   mkpackage(char*);
index 95d1409f277f8abbfa41abf276364f20ef7dc118..84a7b89015f9acf73eeeba0b48008cfc3598fd8b 100644 (file)
@@ -175,6 +175,7 @@ yylex(void)
        vlong v;
        char *cp;
        Rune rune;
+       int escflag;
        Sym *s;
 
 l0:
@@ -224,19 +225,19 @@ l0:
 
        caseq:
                for(;;) {
-                       if(escchar('"', &v))
+                       if(escchar('"', &escflag, &v))
                                break;
-                       if(v >= Runeself) {
+                       if(escflag || v < Runeself) {
+                               cp = remal(cp, c1, 1);
+                               cp[c1++] = v;
+                       } else {
                                // botch - this limits size of runes
                                rune = v;
                                c = runelen(rune);
                                cp = remal(cp, c1, c);
                                runetochar(cp+c1, &rune);
                                c1 += c;
-                               continue;
                        }
-                       cp = remal(cp, c1, 1);
-                       cp[c1++] = v;
                }
                goto catem;
 
@@ -281,9 +282,9 @@ l0:
 
        case '\'':
                /* '.' */
-               if(escchar('\'', &v))
+               if(escchar('\'', &escflag, &v))
                        v = '\'';       // allow '''
-               if(!escchar('\'', &v)) {
+               if(!escchar('\'', &escflag, &v)) {
                        yyerror("missing '");
                        ungetc(v);
                }
@@ -695,12 +696,13 @@ getnsc(void)
 
 
 int
-escchar(int e, vlong *val)
+escchar(int e, int *escflg, vlong *val)
 {
-       int i;
-       long c;
+       int i, c;
        vlong l;
 
+       *escflg = 0;
+
 loop:
        c = getr();
        if(c == '\n') {
@@ -720,6 +722,7 @@ loop:
                goto loop;
 
        case 'x':
+               *escflg = 1;    // it's a byte
                i = 2;
                goto hex;
 
@@ -739,6 +742,7 @@ loop:
        case '5':
        case '6':
        case '7':
+               *escflg = 1;    // it's a byte
                goto oct;
 
        case 'a': c = '\a'; break;
@@ -793,6 +797,7 @@ oct:
        }
        if(l > 255)
                warn("oct escape value > 255: %d", l);
+
        *val = l;
        return 0;
 }