commit - 6c7ed6b0e6086e32710a0d42e034bce6bdaad7b0
commit + e3de25fea4065d017fc344c3c7d757738a922c17
blob - 5039070a5002562ceca610f2714965a6c070fabc
blob + 1c26e6bd07b3b1c531b434668f3b6889fa7282ae
--- src/cmd/acidtypes/dat.h
+++ src/cmd/acidtypes/dat.h
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
char err[ERRMAX];
quotefmtinstall();
+ fmtinstall('B', Bfmt);
ARGBEGIN{
case 'v':
blob - 3c9bd49e7bf00f6dacdb665f6d84e933b33ed5ce
blob + 9aaaa487ce620f152682bd62c4aa8765f647d26d
--- src/cmd/acidtypes/sym.c
+++ src/cmd/acidtypes/sym.c
}
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
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)
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]);
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;
}
}
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]);
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;
}
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
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);
+}