thandling of C++ names. - plan9port - [fork] Plan 9 from user space
git clone git://src.adamsgaard.dk/plan9port
Log
Files
Refs
README
LICENSE
---
commit 62faed57a5bc13e14ee55aef32c210c713b315da
parent e3de25fea4065d017fc344c3c7d757738a922c17
Author: rsc 
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(-)
---
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,
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  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;
                 }
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;