t64-bit fixes - 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 2c0f3733ade43a38576aec82eced8768b42f9980
 (DIR) parent f8e39513f37e870d6be6aad7b5013b603f12cae8
 (HTM) Author: rsc <devnull@localhost>
       Date:   Thu, 20 Apr 2006 20:49:00 +0000
       
       64-bit fixes
       
       Diffstat:
         M src/cmd/sam/cmd.c                   |      37 +++++++++++++++++++++----------
         M src/cmd/sam/list.c                  |      73 ++++++++++++++++++++++++++-----
         M src/cmd/sam/mesg.c                  |      69 ++++++++++++++++++++-----------
         M src/cmd/sam/multi.c                 |       6 +++---
         M src/cmd/sam/rasp.c                  |       2 +-
         M src/cmd/sam/sam.c                   |      17 ++++++++---------
         M src/cmd/sam/sam.h                   |      30 +++++++++++-------------------
       
       7 files changed, 153 insertions(+), 81 deletions(-)
       ---
 (DIR) diff --git a/src/cmd/sam/cmd.c b/src/cmd/sam/cmd.c
       t@@ -50,10 +50,12 @@ Rune        termline[BLOCKSIZE];
        Rune        *linep = line;
        Rune        *terminp = termline;
        Rune        *termoutp = termline;
       -List        cmdlist;
       -List        addrlist;
       -List        relist;
       -List        stringlist;
       +
       +List        cmdlist = { 'p' };
       +List        addrlist = { 'p' };
       +List        relist = { 'p' };
       +List        stringlist = { 'p' };
       +
        int        eof;
        
        void
       t@@ -108,15 +110,26 @@ inputc(void)
        int
        inputline(void)
        {
       -        int i, c;
       -
       -        linep = line;
       -        i = 0;
       +        int i, c, start;
       +
       +        /*
       +         * Could set linep = line and i = 0 here and just
       +         * error(Etoolong) below, but this way we keep
       +         * old input buffer history around for a while.
       +         * This is useful only for debugging.
       +         */
       +        i = linep - line;
                do{
                        if((c = inputc())<=0)
                                return -1;
       -                if(i == (sizeof line)/RUNESIZE-1)
       -                        error(Etoolong);
       +                if(i == nelem(line)-1){
       +                        if(linep == line)
       +                                error(Etoolong);
       +                        start = linep - line;
       +                        runemove(line, linep, i-start);
       +                        i -= start;
       +                        linep = line;
       +                }
                }while((line[i++]=c) != '\n');
                line[i] = 0;
                return 1;
       t@@ -275,9 +288,9 @@ freecmd(void)
                int i;
        
                while(cmdlist.nused > 0)
       -                free(cmdlist.ucharpptr[--cmdlist.nused]);
       +                free(cmdlist.voidpptr[--cmdlist.nused]);
                while(addrlist.nused > 0)
       -                free(addrlist.ucharpptr[--addrlist.nused]);
       +                free(addrlist.voidpptr[--addrlist.nused]);
                while(relist.nused > 0){
                        i = --relist.nused;
                        Strclose(relist.stringpptr[i]);
 (DIR) diff --git a/src/cmd/sam/list.c b/src/cmd/sam/list.c
       t@@ -3,16 +3,20 @@
        /*
         * Check that list has room for one more element.
         */
       -void
       -growlist(List *l)
       +static void
       +growlist(List *l, int esize)
        {
       -        if(l->listptr==0 || l->nalloc==0){
       +        uchar *p;
       +
       +        if(l->listptr == nil || l->nalloc == 0){
                        l->nalloc = INCR;
       -                l->listptr = emalloc(INCR*sizeof(long));
       +                l->listptr = emalloc(INCR*esize);
                        l->nused = 0;
       -        }else if(l->nused == l->nalloc){
       -                l->listptr = erealloc(l->listptr, (l->nalloc+INCR)*sizeof(long));
       -                memset((void*)(l->longptr+l->nalloc), 0, INCR*sizeof(long));
       +        }
       +        else if(l->nused == l->nalloc){
       +                p = erealloc(l->listptr, (l->nalloc+INCR)*esize);
       +                l->listptr = p;
       +                memset(p+l->nalloc*esize, 0, INCR*esize);
                        l->nalloc += INCR;
                }
        }
       t@@ -23,19 +27,51 @@ growlist(List *l)
        void
        dellist(List *l, int i)
        {
       -        memmove(&l->longptr[i], &l->longptr[i+1], (l->nused-(i+1))*sizeof(long));
       +        Posn *pp;
       +        void **vpp;
       +
                l->nused--;
       +
       +        switch(l->type){
       +        case 'P':
       +                pp = l->posnptr+i;
       +                memmove(pp, pp+1, (l->nused-i)*sizeof(*pp));
       +                break;
       +        case 'p':
       +                vpp = l->voidpptr+i;
       +                memmove(vpp, vpp+1, (l->nused-i)*sizeof(*vpp));
       +                break;
       +        }
        }
        
        /*
         * Add a new element, whose position is i, to the list
         */
        void
       -inslist(List *l, int i, long val)
       +inslist(List *l, int i, ...)
        {
       -        growlist(l);
       -        memmove(&l->longptr[i+1], &l->longptr[i], (l->nused-i)*sizeof(long));
       -        l->longptr[i] = val;
       +        Posn *pp;
       +        void **vpp;
       +        va_list list;
       +
       +
       +        va_start(list, i);
       +        switch(l->type){
       +        case 'P':
       +                growlist(l, sizeof(*pp));
       +                pp = l->posnptr+i;
       +                memmove(pp+1, pp, (l->nused-i)*sizeof(*pp));
       +                *pp = va_arg(list, Posn);
       +                break;
       +        case 'p':
       +                growlist(l, sizeof(*vpp));
       +                vpp = l->voidpptr+i;
       +                memmove(vpp+1, vpp, (l->nused-i)*sizeof(*vpp));
       +                *vpp = va_arg(list, void*);
       +                break;
       +        }
       +        va_end(list);
       +
                l->nused++;
        }
        
       t@@ -45,3 +81,16 @@ listfree(List *l)
                free(l->listptr);
                free(l);
        }
       +
       +List*
       +listalloc(int type)
       +{
       +        List *l;
       +
       +        l = emalloc(sizeof(List));
       +        l->type = type;
       +        l->nalloc = 0;
       +        l->nused = 0;
       +
       +        return l;
       +}
 (DIR) diff --git a/src/cmd/sam/mesg.c b/src/cmd/sam/mesg.c
       t@@ -13,10 +13,18 @@ int        waitack;
        int        noflush;
        int        tversion;
        
       -long        inlong(void);
       -long        invlong(void);
        int        inshort(void);
       +long        inlong(void);
       +vlong        invlong(void);
        int        inmesg(Tmesg);
       +
       +void        outshort(int);
       +void        outlong(long);
       +void        outvlong(vlong);
       +void        outcopy(int, void*);
       +void        outsend(void);
       +void        outstart(Hmesg);
       +
        void        setgenstr(File*, Posn, Posn);
        
        #ifdef DEBUG
       t@@ -90,9 +98,19 @@ journaln(int out, long n)
        {
                char buf[32];
        
       -        sprint(buf, "%ld", n);
       +        snprint(buf, sizeof buf, "%ld", n);
                journal(out, buf);
        }
       +
       +void
       +journalv(int out, vlong v)
       +{
       +        char buf[32];
       +
       +        snprint(buf, sizeof buf, "%lld", v);
       +        journal(out, buf);
       +}
       +
        #else
        #define        journal(a, b)
        #define journaln(a, b)
       t@@ -176,6 +194,7 @@ inmesg(Tmesg type)
                int i, m;
                short s;
                long l, l1;
       +        vlong v;
                File *f;
                Posn p0, p1, p;
                Range r;
       t@@ -204,15 +223,15 @@ inmesg(Tmesg type)
                        break;
        
                case Tstartcmdfile:
       -                l = invlong();                /* for 64-bit pointers */
       -                journaln(0, l);
       +                v = invlong();                /* for 64-bit pointers */
       +                journaln(0, v);
                        Strdupl(&genstr, samname);
                        cmd = newfile();
                        cmd->unread = 0;
       -                outTsv(Hbindname, cmd->tag, l);
       +                outTsv(Hbindname, cmd->tag, v);
                        outTs(Hcurrent, cmd->tag);
                        logsetname(cmd, &genstr);
       -                cmd->rasp = emalloc(sizeof(List));
       +                cmd->rasp = listalloc('P');
                        cmd->mod = 0;
                        if(cmdstr.n){
                                loginsert(cmd, 0L, cmdstr.s, cmdstr.n);
       t@@ -263,7 +282,7 @@ inmesg(Tmesg type)
                        termlocked++;
                        f = whichfile(inshort());
                        if(!f->rasp)        /* this might be a duplicate message */
       -                        f->rasp = emalloc(sizeof(List));
       +                        f->rasp = listalloc('P');
                        current(f);
                        outTsv(Hbindname, f->tag, invlong());        /* for 64-bit pointers */
                        outTs(Hcurrent, f->tag);
       t@@ -353,11 +372,11 @@ inmesg(Tmesg type)
                        break;
        
                case Tstartnewfile:
       -                l = invlong();
       +                v = invlong();
                        Strdupl(&genstr, empty);
                        f = newfile();
       -                f->rasp = emalloc(sizeof(List));
       -                outTsv(Hbindname, f->tag, l);
       +                f->rasp = listalloc('P');
       +                outTsv(Hbindname, f->tag, v);
                        logsetname(f, &genstr);
                        outTs(Hcurrent, f->tag);
                        current(f);
       t@@ -593,16 +612,16 @@ inlong(void)
                return n;
        }
        
       -long
       +vlong
        invlong(void)
        {
       -        ulong n;
       +        vlong v;
                
       -        n = (inp[7]<<24) | (inp[6]<<16) | (inp[5]<<8) | inp[4];
       -        n = (n<<16) | (inp[3]<<8) | inp[2];
       -        n = (n<<16) | (inp[1]<<8) | inp[0];
       +        v = (inp[7]<<24) | (inp[6]<<16) | (inp[5]<<8) | inp[4];
       +        v = (v<<16) | (inp[3]<<8) | inp[2];
       +        v = (v<<16) | (inp[1]<<8) | inp[0];
                inp += 8;
       -        return n;
       +        return v;
        }
        
        void
       t@@ -732,12 +751,12 @@ outTsl(Hmesg type, int s, Posn l)
        }
        
        void
       -outTsv(Hmesg type, int s, Posn l)
       +outTsv(Hmesg type, int s, vlong v)
        {
                outstart(type);
                outshort(s);
       -        outvlong((void*)l);
       -        journaln(1, l);
       +        outvlong(v);
       +        journaln(1, v);
                outsend();
        }
        
       t@@ -773,14 +792,14 @@ outlong(long l)
        }
        
        void
       -outvlong(void *v)
       +outvlong(vlong v)
        {
                int i;
       -        ulong l;
        
       -        l = (ulong) v;
       -        for(i = 0; i < 8; i++, l >>= 8)
       -                *outp++ = l;
       +        for(i = 0; i < 8; i++){
       +                *outp++ = v;
       +                v >>= 8;
       +        }
        }
        
        void
 (DIR) diff --git a/src/cmd/sam/multi.c b/src/cmd/sam/multi.c
       t@@ -1,6 +1,6 @@
        #include "sam.h"
        
       -List        file;
       +List        file = { 'p' };
        ushort        tag;
        
        File *
       t@@ -9,7 +9,7 @@ newfile(void)
                File *f;
        
                f = fileopen();
       -        inslist(&file, 0, (long)f);
       +        inslist(&file, 0, f);
                f->tag = tag++;
                if(downloaded)
                        outTs(Hnewname, f->tag);
       t@@ -88,7 +88,7 @@ sortname(File *f)
                                        break;
                        }
                }
       -        inslist(&file, i, (long)f);
       +        inslist(&file, i, f);
                if(downloaded)
                        outTsS(Hmovname, f->tag, &f->name);
        }
 (DIR) diff --git a/src/cmd/sam/rasp.c b/src/cmd/sam/rasp.c
       t@@ -177,7 +177,7 @@ raspinsert(File *f, uint p1, Rune *buf, uint n, int toterm)
        }
        
        #define        M        0x80000000L
       -#define        P(i)        r->longptr[i]
       +#define        P(i)        r->posnptr[i]
        #define        T(i)        (P(i)&M)        /* in terminal */
        #define        L(i)        (P(i)&~M)        /* length of this piece */
        
 (DIR) diff --git a/src/cmd/sam/sam.c b/src/cmd/sam/sam.c
       t@@ -14,7 +14,7 @@ File        *curfile;
        File        *flist;
        File        *cmd;
        jmp_buf        mainloop;
       -List        tempfile;
       +List        tempfile = { 'p' };
        int        quitok = TRUE;
        int        downloaded;
        int        dflag;
       t@@ -37,10 +37,10 @@ void        usage(void);
        
        extern int notify(void(*)(void*,char*));
        
       -int
       -main(int volatile argc, char **volatile argv)
       +void
       +main(int argc, char **argv)
        {
       -        int volatile i;
       +        int i;
                String *t;
                char *termargs[10], **ap;
                
       t@@ -82,7 +82,6 @@ main(int volatile argc, char **volatile argv)
                Strinit0(&genstr);
                Strinit0(&rhs);
                Strinit0(&curwd);
       -        tempfile.listptr = emalloc(1);        /* so it can be freed later */
                Strinit0(&plan9cmd);
                home = getenv(HOME);
                disk = diskinit();
       t@@ -112,7 +111,6 @@ main(int volatile argc, char **volatile argv)
                cmdloop();
                trytoquit();        /* if we already q'ed, quitok will be TRUE */
                exits(0);
       -        return 0;
        }
        
        void
       t@@ -721,10 +719,11 @@ void
        settempfile(void)
        {
                if(tempfile.nalloc < file.nused){
       -                free(tempfile.listptr);
       -                tempfile.listptr = emalloc(sizeof(*tempfile.filepptr)*file.nused);
       +                if(tempfile.filepptr)
       +                        free(tempfile.filepptr);
       +                tempfile.filepptr = emalloc(sizeof(File*)*file.nused);
                        tempfile.nalloc = file.nused;
                }
       +        memmove(tempfile.filepptr, file.filepptr, sizeof(File*)*file.nused);
                tempfile.nused = file.nused;
       -        memmove(&tempfile.filepptr[0], &file.filepptr[0], file.nused*sizeof(File*));
        }
 (DIR) diff --git a/src/cmd/sam/sam.h b/src/cmd/sam/sam.h
       t@@ -70,26 +70,23 @@ struct String
        
        struct List        /* code depends on a long being able to hold a pointer */
        {
       +        int        type;        /* 'p' for pointer, 'P' for Posn */
                int        nalloc;
                int        nused;
                union{
       -                void        *listp;
       -                Block        *blkp;
       -                long        *longp;
       -                uchar*        *ucharp;
       -                String*        *stringp;
       -                File*        *filep;
       -                long        listv;
       +                void*        listp;
       +                void**        voidp;
       +                Posn*        posnp;
       +                String**stringp;
       +                File**        filep;
                }g;
        };
        
        #define        listptr                g.listp
       -#define        blkptr                g.blkp
       -#define        longptr                g.longp
       -#define        ucharpptr        g.ucharp
       +#define        voidpptr        g.voidp
       +#define        posnptr                g.posnp
        #define        stringpptr        g.stringp
        #define        filepptr        g.filep
       -#define        listval                g.listv
        
        enum
        {
       t@@ -267,8 +264,9 @@ File        *getfile(String*);
        int        getname(File*, String*, int);
        long        getnum(int);
        void        hiccough(char*);
       -void        inslist(List*, int, long);
       +void        inslist(List*, int, ...);
        Address        lineaddr(Posn, Address, int);
       +List        *listalloc(int);
        void        listfree(List*);
        void        load(File*);
        File        *lookfile(String*);
       t@@ -401,12 +399,6 @@ void        outTsS(Hmesg, int, String*);
        void        outTsllS(Hmesg, int, long, long, String*);
        void        outTsll(Hmesg, int, long, long);
        void        outTsl(Hmesg, int, long);
       -void        outTsv(Hmesg, int, long);
       -void        outstart(Hmesg);
       -void        outcopy(int, void*);
       -void        outshort(int);
       -void        outlong(long);
       -void        outvlong(void*);
       -void        outsend(void);
       +void        outTsv(Hmesg, int, vlong);
        void        outflush(void);