thandling of C++ names. - plan9port - [fork] Plan 9 from user space
 (HTM) git clone git://src.adamsgaard.dk/plan9port
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit 62faed57a5bc13e14ee55aef32c210c713b315da
 (DIR) parent e3de25fea4065d017fc344c3c7d757738a922c17
 (HTM) Author: rsc <devnull@localhost>
       Date:   Tue, 29 Nov 2005 05:12:48 +0000
       
       handling of C++ names.
       
       Diffstat:
         M src/cmd/acid/acid.h                 |       2 +-
         M src/cmd/acid/lex.c                  |      16 ++++++++++++++--
         M src/cmd/acid/util.c                 |      15 ++++++++++++---
       
       3 files changed, 27 insertions(+), 6 deletions(-)
       ---
 (DIR) diff --git a/src/cmd/acid/acid.h b/src/cmd/acid/acid.h
       t@@ -4,7 +4,7 @@
        enum
        {
                Eof                = -1,
       -        Strsize                = 4096,
       +        Strsize                = 65536,
                Hashsize        = 128,
                Maxarg                = 512,
                NFD                = 100,
 (DIR) diff --git a/src/cmd/acid/lex.c b/src/cmd/acid/lex.c
       t@@ -348,7 +348,6 @@ bqsymbol(void)
                char *p;
                Lsym *s;
        
       -        symbol[0] = 0;
                p = symbol;
                while((c = lexc()) != '`'){
                        if(c == Eof)
       t@@ -361,6 +360,7 @@ bqsymbol(void)
                        sysfatal("overflow in bqsymbol");
                *p = 0;
                
       +fprint(2, "bq: %s\n", symbol);
                s = look(symbol);
                if(s == 0)
                        s = enter(symbol, Tid);
       t@@ -601,7 +601,19 @@ numsym(char first)
                                error("%d <eof> eating symbols", line);
                        if(c == '\n')
                                line++;
       -                if(c != '_' && c != '$' && c <= '~' && !isalnum(c)) {        /* checking against ~ lets UTF names through */
       +                /* allow :: in name */
       +                if(c == ':'){
       +                        c = lexc();
       +                        if(c == ':'){
       +                                *p++ = ':';
       +                                *p++ = ':';
       +                                continue;
       +                        }
       +                        unlexc(c);
       +                        unlexc(':');
       +                        break;
       +                }
       +                if(c != '_' && c != '$' && c < Runeself && !isalnum(c)) {
                                unlexc(c);
                                break;
                        }
 (DIR) diff --git a/src/cmd/acid/util.c b/src/cmd/acid/util.c
       t@@ -16,7 +16,7 @@ unique(char *buf, Symbol *s)
                int i, renamed;
        
                renamed = 0;
       -        strcpy(buf, s->name);
       +        strcpy(buf, s->xname);
                for(;;) {
                        l = look(buf);
                        if(l == 0 || (l->lexval == Tid && l->v->set == 0))
       t@@ -36,9 +36,10 @@ unique(char *buf, Symbol *s)
                        }
                }
                if(renamed && !quiet)
       -                print("\t%s=%s %c/%L\n", s->name, buf, s->type, s->loc);
       +                print("\t%s=%s %c/%L\n", s->xname, buf, s->type, s->loc);
                if(l == 0)
                        l = enter(buf, Tid);
       +        s->aux = l;
                return l;        
        }
        
       t@@ -116,23 +117,31 @@ addvarsym(Fhdr *fp)
                                if(l->v->store.comt == 0)
                                        l->v->store.fmt = 'X';
        
       -                        /* Enter as list of { name, type, value, file } */
       +                        /* Enter as list of { name, type, value, file, xname } */
                                list = al(TSTRING);
                                tl->store.u.l = list;
                                list->store.u.string = strnode(buf);
                                list->store.fmt = 's';
       +                        
                                list->next = al(TINT);
                                list = list->next;
                                list->store.fmt = 'c';
                                list->store.u.ival = s.type;
       +                        
                                list->next = al(TINT);
                                list = list->next;
                                list->store.fmt = 'X';
                                list->store.u.ival = v;
       +                        
                                list->next = al(TSTRING);
                                list = list->next;
                                list->store.fmt = 's';
                                list->store.u.string = file;
       +                        
       +                        list->next = al(TSTRING);
       +                        list = list->next;
       +                        list->store.fmt = 's';
       +                        list->store.u.string = strnode(s.xname);
                        }
                }
                *tail = nil;