handling of C++ names.
diff --git a/src/cmd/acid/acid.h b/src/cmd/acid/acid.h
index 9ac983b..266175e 100644
--- a/src/cmd/acid/acid.h
+++ b/src/cmd/acid/acid.h
@@ -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
index f265d6c..b9b9976 100644
--- a/src/cmd/acid/lex.c
+++ b/src/cmd/acid/lex.c
@@ -348,7 +348,6 @@
 	char *p;
 	Lsym *s;
 
-	symbol[0] = 0;
 	p = symbol;
 	while((c = lexc()) != '`'){
 		if(c == Eof)
@@ -361,6 +360,7 @@
 		sysfatal("overflow in bqsymbol");
 	*p = 0;
 	
+fprint(2, "bq: %s\n", symbol);
 	s = look(symbol);
 	if(s == 0)
 		s = enter(symbol, Tid);
@@ -601,7 +601,19 @@
 			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;
 		}
diff --git a/src/cmd/acid/util.c b/src/cmd/acid/util.c
index 15859db..a0ae47f 100644
--- a/src/cmd/acid/util.c
+++ b/src/cmd/acid/util.c
@@ -16,7 +16,7 @@
 	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))
@@ -36,9 +36,10 @@
 		}
 	}
 	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;	
 }
 
@@ -116,23 +117,31 @@
 			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;