URI: 
       tbetter handling of C++ names. - plan9port - [fork] Plan 9 from user space
  HTML git clone git://src.adamsgaard.dk/plan9port
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
   DIR commit e3de25fea4065d017fc344c3c7d757738a922c17
   DIR parent 6c7ed6b0e6086e32710a0d42e034bce6bdaad7b0
  HTML Author: rsc <devnull@localhost>
       Date:   Tue, 29 Nov 2005 05:12:33 +0000
       
       better handling of C++ names.
       
       Diffstat:
         M src/cmd/acidtypes/dat.h             |       5 +++++
         M src/cmd/acidtypes/main.c            |       1 +
         M src/cmd/acidtypes/sym.c             |       2 +-
         M src/cmd/acidtypes/type.c            |      50 ++++++++++++++++++-------------
         M src/cmd/acidtypes/util.c            |      29 +++++++++++++++++++++++++++++
       
       5 files changed, 65 insertions(+), 22 deletions(-)
       ---
   DIR diff --git a/src/cmd/acidtypes/dat.h b/src/cmd/acidtypes/dat.h
       t@@ -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
        
   DIR diff --git a/src/cmd/acidtypes/main.c b/src/cmd/acidtypes/main.c
       t@@ -22,6 +22,7 @@ main(int argc, char **argv)
                char err[ERRMAX];
        
                quotefmtinstall();
       +        fmtinstall('B', Bfmt);
        
                ARGBEGIN{
                case 'v':
   DIR diff --git a/src/cmd/acidtypes/sym.c b/src/cmd/acidtypes/sym.c
       t@@ -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));
                }
        
   DIR diff --git a/src/cmd/acidtypes/type.c b/src/cmd/acidtypes/type.c
       t@@ -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)
       t@@ -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]);
       t@@ -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;
                                }
                        }
       t@@ -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]);
       t@@ -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;
                                }
       t@@ -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;
   DIR diff --git a/src/cmd/acidtypes/util.c b/src/cmd/acidtypes/util.c
       t@@ -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);
       +}