Commit Diff


commit - 6c7ed6b0e6086e32710a0d42e034bce6bdaad7b0
commit + e3de25fea4065d017fc344c3c7d757738a922c17
blob - 5039070a5002562ceca610f2714965a6c070fabc
blob + 1c26e6bd07b3b1c531b434668f3b6889fa7282ae
--- src/cmd/acidtypes/dat.h
+++ src/cmd/acidtypes/dat.h
@@ -87,4 +87,9 @@ char *cleanstl(char*);
 void addsymx(char*, char*, Type*);
 void dumpsyms(Biobuf*);
 
+int Bfmt(Fmt*);
 
+#ifdef VARARGCK
+#pragma varargck type "B" char*
+#endif
+
blob - 1efff63a1c08374475899de375b7b55b64f869cf
blob + 066e8bad65e37d90706321fe9aa3810a00550369
--- src/cmd/acidtypes/main.c
+++ src/cmd/acidtypes/main.c
@@ -22,6 +22,7 @@ main(int argc, char **argv)
 	char err[ERRMAX];
 
 	quotefmtinstall();
+	fmtinstall('B', Bfmt);
 
 	ARGBEGIN{
 	case 'v':
blob - 3c9bd49e7bf00f6dacdb665f6d84e933b33ed5ce
blob + 9aaaa487ce620f152682bd62c4aa8765f647d26d
--- src/cmd/acidtypes/sym.c
+++ src/cmd/acidtypes/sym.c
@@ -41,7 +41,7 @@ dumpsyms(Biobuf *b)
 		}
 		if(t == nil || t->ty != Aggr)
 			continue;
-		Bprint(b, "complex %s %s%s%s;\n", cleanstl(nameof(t, 1)),
+		Bprint(b, "complex %B %B%s%B;\n", nameof(t, 1),
 			s->fn ? fixname(s->fn) : "", s->fn ? ":" : "", fixname(s->name));
 	}
 
blob - b8dccb57061561581f5fdbe523234e26b9227831
blob + 01ecc3e7e141914d3f93c84a607fa2fc05ddd392
--- src/cmd/acidtypes/type.c
+++ src/cmd/acidtypes/type.c
@@ -439,6 +439,14 @@ dorange(Type *t)
 		t->xsizeof = countbytes(t->hi);
 }
 
+char*
+mkname(char *prefix, char *name)
+{
+	static char buf[65536];
+	
+	snprint(buf, sizeof buf, "%s%s", prefix, name);
+	return buf;
+}
 
 char*
 nameof(Type *t, int doanon)
@@ -581,9 +589,9 @@ printtype(Biobuf *b, Type *t)
 	t->printed = 1;
 	switch(t->ty){
 	case Aggr:
-		name = cleanstl(nameof(t, 1));
-		Bprint(b, "sizeof%s = %lud;\n", name, t->xsizeof);
-		Bprint(b, "aggr %s {\n", name);
+		name = nameof(t, 1);
+		Bprint(b, "%B = %lud;\n", mkname("sizeof", name), t->xsizeof);
+		Bprint(b, "aggr %B {\n", name);
 		nprint = 0;
 		for(j=0; j<t->n; j++){
 			tt = defer(t->t[j]);
@@ -611,11 +619,11 @@ ttt=ttt->sub;
 			case Array:
 			case Function:
 				nprint++;
-				Bprint(b, "\t'%c' %lud %s;\n", basecharof(tt), t->val[j], fixname(t->tname[j]));
+				Bprint(b, "\t'%c' %lud %B;\n", basecharof(tt), t->val[j], fixname(t->tname[j]));
 				break;
 			case Aggr:
 				nprint++;
-				Bprint(b, "\t%s %lud %s;\n", nameof(tt, 1), t->val[j], fixname(t->tname[j]));
+				Bprint(b, "\t%B %lud %B;\n", nameof(tt, 1), t->val[j], fixname(t->tname[j]));
 				break;
 			}
 		}
@@ -623,10 +631,10 @@ ttt=ttt->sub;
 			Bprint(b, "\t'X' 0 __dummy;\n");
 		Bprint(b, "};\n\n");
 	
-		name = cleanstl(nameof(t, 1));	/* might have smashed it */
-		Bprint(b, "defn %s(addr) { indent_%s(addr, \"\"); }\n", name, name);
-		Bprint(b, "defn indent_%s(addr, indent) {\n", name);
-		Bprint(b, "\tcomplex %s addr;\n", name);
+		name = nameof(t, 1);	/* might have smashed it */
+		Bprint(b, "defn %B(addr) { %B(addr, \"\"); }\n", name, mkname("indent_", name));
+		Bprint(b, "defn %B(addr, indent) {\n", mkname("indent_", name));
+		Bprint(b, "\tcomplex %B addr;\n", name);
 		for(j=0; j<t->n; j++){
 			name = fixname(t->tname[j]);
 			tt = defer(t->t[j]);
@@ -637,30 +645,30 @@ ttt=ttt->sub;
 			switch(tt->ty){
 			case Base:
 			base:
-				Bprint(b, "\tprint(indent, \"%s\t\", addr.%s, \"\\n\");\n",
+				Bprint(b, "\tprint(indent, \"%s\t\", addr.%B, \"\\n\");\n",
 					name, name);
 				break;
 			case Pointer:
 				ttt = defer(tt->sub);
 				if(ttt && ttt->ty == Aggr)
-					Bprint(b, "\tprint(indent, \"%s\t(%s)\", addr.%s, \"\\n\");\n",
+					Bprint(b, "\tprint(indent, \"%s\t(%s)\", addr.%B, \"\\n\");\n",
 						name, nameof(ttt, 1), name);
 				else
 					goto base;
 				break;
 			case Array:
-				Bprint(b, "\tprint(indent, \"%s\t\", addr.%s\\X, \"\\n\");\n",
+				Bprint(b, "\tprint(indent, \"%s\t\", addr.%B\\X, \"\\n\");\n",
 					name, name);
 				break;
 			case Enum:
-				Bprint(b, "\tprint(indent, \"%s\t\", addr.%s, \" \", %s(addr.%s), \"\\n\");\n",
+				Bprint(b, "\tprint(indent, \"%s\t\", addr.%B, \" \", %B(addr.%B), \"\\n\");\n",
 					name, name, nameof(tt, 1), name);
 				break;
 			case Aggr:
 				Bprint(b, "\tprint(indent, \"%s\t%s{\\n\");\n",
 					name, nameof(tt, 0));
-				Bprint(b, "\tindent_%s(addr+%lud, indent+\"  \");\n",
-					nameof(tt, 1), t->val[j]);
+				Bprint(b, "\t%B(addr+%lud, indent+\"  \");\n",
+					mkname("indent_", nameof(tt, 1)), t->val[j]);
 				Bprint(b, "\tprint(indent, \"}\\n\");\n");
 				break;
 			}
@@ -672,20 +680,20 @@ ttt=ttt->sub;
 		name = nameof(t, 1);
 		Bprint(b, "// enum %s\n", name);
 		for(j=0; j<t->n; j++)
-			Bprint(b, "%s = %ld;\n", fixname(t->tname[j]), t->val[j]);
+			Bprint(b, "%B = %ld;\n", fixname(t->tname[j]), t->val[j]);
 	
-		Bprint(b, "vals_%s = {\n", name);
+		Bprint(b, "%B = {\n", mkname("vals_", name));
 		for(j=0; j<t->n; j++)
 			Bprint(b, "\t%lud,\n", t->val[j]);
 		Bprint(b, "};\n");
-		Bprint(b, "names_%s = {\n", name);
+		Bprint(b, "%B = {\n", mkname("names_", name));
 		for(j=0; j<t->n; j++)
 			Bprint(b, "\t\"%s\",\n", fixname(t->tname[j]));
 		Bprint(b, "};\n");
-		Bprint(b, "defn %s(val) {\n", name);
+		Bprint(b, "defn %B(val) {\n", name);
 		Bprint(b, "\tlocal i;\n");
-		Bprint(b, "\ti = match(val, vals_%s);\n", name);
-		Bprint(b, "\tif i >= 0 then return names_%s[i];\n", name);
+		Bprint(b, "\ti = match(val, %B);\n", mkname("vals_", name));
+		Bprint(b, "\tif i >= 0 then return %B[i];\n", mkname("names_", name));
 		Bprint(b, "\treturn \"???\";\n");
 		Bprint(b, "};\n");
 		break;
blob - 0dbc63e991a4ab84f0f5709bf3754471077b9e2a
blob + 47fe193d77abe135d5ef48e3f2fcb976a8565a56
--- src/cmd/acidtypes/util.c
+++ src/cmd/acidtypes/util.c
@@ -61,3 +61,32 @@ mktl(Type *hd, TypeList *tail)
 	return tl;
 }
 
+static int isBfrog[256];
+
+int
+Bfmt(Fmt *fmt)
+{
+	int i;
+	char *s, *t;
+	
+	if(!isBfrog['.']){
+		for(i=0; i<256; i++)
+			if(i != '_' && i != '$' && i < Runeself && !isalnum(i))
+				isBfrog[i] = 1;
+	}
+
+	s = va_arg(fmt->args, char*);
+	for(t=s; *t; t++){
+		if(isBfrog[(uchar)*t]){
+			if(*t == ':' && *(t+1) == ':'){
+				t++;
+				continue;
+			}
+			goto encode;
+		}
+	}
+	return fmtstrcpy(fmt, s);
+
+encode:
+	return fmtprint(fmt, "`%s`", s);
+}