t64-bit safe. (Taj Khattra) - plan9port - [fork] Plan 9 from user space
 (HTM) git clone git://src.adamsgaard.dk/plan9port
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit 0aae8d3d0969e8e593ce39434586c9b3160bf850
 (DIR) parent d5233ccb3ac0850ca335ec58fb96bd0ce41709be
 (HTM) Author: rsc <devnull@localhost>
       Date:   Mon, 31 Oct 2005 19:57:47 +0000
       
       64-bit safe. (Taj Khattra)
       
       Diffstat:
         M src/cmd/bc.y                        |     124 ++++++++++++++++---------------
       
       1 file changed, 64 insertions(+), 60 deletions(-)
       ---
 (DIR) diff --git a/src/cmd/bc.y b/src/cmd/bc.y
       t@@ -6,10 +6,8 @@
                #define        bsp_max        5000
        
                Biobuf        *in;
       -        #define stdin bstdin
       -        #define stdout bstdout
       -        Biobuf        stdin;
       -        Biobuf        stdout;
       +        Biobuf        bstdin;
       +        Biobuf        bstdout;
                char        cary[1000];
                char*        cp = { cary };
                char        string[1000];
       t@@ -19,7 +17,7 @@
                int        bindx = 0;
                int        lev = 0;
                int        ln;
       -        int*        ttp;
       +        char*        ttp;
                char*        ss = "";
                int        bstack[10] = { 0 };
                char*        numb[15] =
       t@@ -28,8 +26,8 @@
                        " 6", " 7", " 8", " 9", " 10", " 11",
                        " 12", " 13", " 14"
                };
       -        int*        pre;
       -        int*        post;
       +        char*        pre;
       +        char*        post;
        
                long        peekc = -1;
                int        sargc;
       t@@ -61,40 +59,39 @@
                        "u","v","w","x","y","z"
                };
                char*        dot = { "." };
       -        int        bspace[bsp_max];
       -        int*        bsp_nxt = { bspace };
       +        char*        bspace[bsp_max];
       +        char**        bsp_nxt = bspace;
                int        bdebug = 0;
                int        lflag;
                int        cflag;
                int        sflag;
        
       -        int*        bundle(int, ...);
       -        void        conout(int*, char*);
       +        char*        bundle(int, ...);
       +        void        conout(char*, char*);
                int        cpeek(int, int, int);
                int        getch(void);
       -        int*        geta(char*);
       -        int*        getf(char*);
       +        char*        geta(char*);
       +        char*        getf(char*);
                void        getout(void);
       -        void        output(int*);
       +        void        output(char*);
                void        pp(char*);
       -        void        routput(int*);
       +        void        routput(char*);
                void        tp(char*);
                void        yyerror(char*, ...);
                int        yyparse(void);
        
                typedef        void*        pointer;
       -/*        #pragma        varargck        type        "lx"        pointer */
       +        #pragma        varargck        type        "lx"        pointer
        
        %}
        %union
        {
       -        int*        iptr;
                char*        cptr;
                int        cc;
        }
        
       -%type        <iptr>        pstat stat stat1 def slist dlets e ase nase
       -%type        <iptr>        slist re fprefix cargs eora cons constant lora
       +%type        <cptr>        pstat stat stat1 def slist dlets e ase nase
       +%type        <cptr>        slist re fprefix cargs eora cons constant lora
        %type        <cptr>        crs
        
        %token        <cptr>        LETTER EQOP _AUTO DOT
       t@@ -124,7 +121,7 @@ stuff:
                        ttp = bundle(6, pre, $6, post , "0", numb[lev], "Q");
                        conout(ttp, (char*)$1);
                        rcrs = crs;
       -                output((int*)"");        /* this is horse puk!! */
       +                output("");
                        lev = bindx = 0;
                }
        
       t@@ -550,8 +547,8 @@ def:
                _DEFINE LETTER '('
                {
                        $$ = getf($2);
       -                pre = (int*)"";
       -                post = (int*)"";
       +                pre = (char*)"";
       +                post = (char*)"";
                        lev = 1;
                        bindx = 0;
                        bstack[bindx] = 0;
       t@@ -793,12 +790,13 @@ loop:
                if(ifile > sargc) {
                        if(ifile >= sargc+2)
                                getout();
       -                in = &stdin;
       +                in = &bstdin;
                        Binit(in, 0, OREAD);
                        ln = 0;
                        goto loop;
                }
       -        Bterm(in);
       +        if(in)
       +                Bterm(in);
                if((in = Bopen(sargv[ifile], OREAD)) != 0){
                        ln = 0;
                        ss = sargv[ifile];
       t@@ -808,57 +806,63 @@ loop:
                return 0;                /* shut up ken */
        }
        
       -int*
       +char*
        bundle(int a, ...)
        {
       -        int i, *p, *q;
       -
       -        p = &a;
       -        i = *p++;
       +        int i;
       +        char **q;
       +        va_list arg;
       +        
       +        i = a;
       +        va_start(arg, a);
                q = bsp_nxt;
                if(bdebug)
                        fprint(2, "bundle %d elements at %lx\n", i, q);
                while(i-- > 0) {
                        if(bsp_nxt >= &bspace[bsp_max])
                                yyerror("bundling space exceeded");
       -                *bsp_nxt++ = *p++;
       +                *bsp_nxt++ = va_arg(arg, char*);
                }
                *bsp_nxt++ = 0;
       -        yyval.iptr = q;
       -        return q;
       +        va_end(arg);
       +        yyval.cptr = (char*)q;
       +        return (char*)q;
        }
        
        void
       -routput(int *p)
       +routput(char *p)
        {
       +        char **pp;
       +        
                if(bdebug)
                        fprint(2, "routput(%lx)\n", p);
       -        if(p >= &bspace[0] && p < &bspace[bsp_max]) {
       +        if((char**)p >= &bspace[0] && (char**)p < &bspace[bsp_max]) {
                        /* part of a bundle */
       -                while(*p != 0)
       -                        routput((int*)(*p++));
       +                pp = (char**)p;
       +                while(*pp != 0)
       +                        routput(*pp++);
                } else
       -                Bprint(&stdout, (char*)p);        /* character string */
       +                Bprint(&bstdout, p);        /* character string */
        }
        
        void
       -output(int *p)
       +output(char *p)
        {
                routput(p);
                bsp_nxt = &bspace[0];
       -        Bprint(&stdout, "\n");
       -        Bflush(&stdout);
       +        Bprint(&bstdout, "\n");
       +        Bflush(&bstdout);
                cp = cary;
                crs = rcrs;
        }
        
        void
       -conout(int *p, char *s)
       +conout(char *p, char *s)
        {
       -        Bprint(&stdout, "[");
       +        Bprint(&bstdout, "[");
                routput(p);
       -        Bprint(&stdout, "]s%s\n", s);
       -        Bflush(&stdout);
       +        Bprint(&bstdout, "]s%s\n", s);
       +        Bflush(&bstdout);
                lev--;
        }
        
       t@@ -867,8 +871,8 @@ yyerror(char *s, ...)
        {
                if(ifile > sargc)
                        ss = "teletype";
       -        Bprint(&stdout, "c[%s on line %d, %s]pc\n", s, ln+1, ss);
       -        Bflush(&stdout);
       +        Bprint(&bstdout, "c[%s on line %d, %s]pc\n", s, ln+1, ss);
       +        Bflush(&bstdout);
                cp = cary;
                crs = rcrs;
                bindx = 0;
       t@@ -881,9 +885,9 @@ pp(char *s)
        {
                /* puts the relevant stuff on pre and post for the letter s */
                bundle(3, "S", s, pre);
       -        pre = yyval.iptr;
       +        pre = yyval.cptr;
                bundle(4, post, "L", s, "s.");
       -        post = yyval.iptr;
       +        post = yyval.cptr;
        }
        
        void
       t@@ -891,19 +895,19 @@ tp(char *s)
        {
                /* same as pp, but for temps */
                bundle(3, "0S", s, pre);
       -        pre = yyval.iptr;
       +        pre = yyval.cptr;
                bundle(4, post, "L", s, "s.");
       -        post = yyval.iptr;
       +        post = yyval.cptr;
        }
        
        void
        yyinit(int argc, char **argv)
        {
       -        Binit(&stdout, 1, OWRITE);
       +        Binit(&bstdout, 1, OWRITE);
                sargv = argv;
                sargc = argc - 1;
                if(sargc == 0) {
       -                in = &stdin;
       +                in = &bstdin;
                        Binit(in, 0, OREAD);
                } else if((in = Bopen(sargv[1], OREAD)) == 0)
                        yyerror("cannot open input file");
       t@@ -915,21 +919,21 @@ yyinit(int argc, char **argv)
        void
        getout(void)
        {
       -        Bprint(&stdout, "q");
       -        Bflush(&stdout);
       +        Bprint(&bstdout, "q");
       +        Bflush(&bstdout);
                exits(0);
        }
        
       -int*
       +char*
        getf(char *p)
        {
       -        return (int*)funtab[*p - 'a'];
       +        return funtab[*p - 'a'];
        }
        
       -int*
       +char*
        geta(char *p)
        {
       -        return (int*)atab[*p - 'a'];
       +        return atab[*p - 'a'];
        }
        
        void
       t@@ -967,7 +971,7 @@ main(int argc, char **argv)
                        yyinit(argc, argv);
                        for(;;)
                                yyparse();
       -                /* exits(0); */
       +                exits(0);
                }
                pipe(p);
                if(fork() == 0) {
       t@@ -981,5 +985,5 @@ main(int argc, char **argv)
                dup(p[0], 0);
                close(p[0]);
                close(p[1]);
       -        execlp("dc", "dc", (char*)0);
       +        execl("dc", "dc", nil);
        }