64-bit fixes

This commit is contained in:
rsc 2006-04-20 20:49:00 +00:00
parent f8e39513f3
commit 2c0f3733ad
7 changed files with 152 additions and 80 deletions

View file

@ -50,10 +50,12 @@ Rune termline[BLOCKSIZE];
Rune *linep = line; Rune *linep = line;
Rune *terminp = termline; Rune *terminp = termline;
Rune *termoutp = termline; Rune *termoutp = termline;
List cmdlist;
List addrlist; List cmdlist = { 'p' };
List relist; List addrlist = { 'p' };
List stringlist; List relist = { 'p' };
List stringlist = { 'p' };
int eof; int eof;
void void
@ -108,15 +110,26 @@ inputc(void)
int int
inputline(void) inputline(void)
{ {
int i, c; int i, c, start;
linep = line; /*
i = 0; * 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{ do{
if((c = inputc())<=0) if((c = inputc())<=0)
return -1; return -1;
if(i == (sizeof line)/RUNESIZE-1) if(i == nelem(line)-1){
error(Etoolong); if(linep == line)
error(Etoolong);
start = linep - line;
runemove(line, linep, i-start);
i -= start;
linep = line;
}
}while((line[i++]=c) != '\n'); }while((line[i++]=c) != '\n');
line[i] = 0; line[i] = 0;
return 1; return 1;
@ -275,9 +288,9 @@ freecmd(void)
int i; int i;
while(cmdlist.nused > 0) while(cmdlist.nused > 0)
free(cmdlist.ucharpptr[--cmdlist.nused]); free(cmdlist.voidpptr[--cmdlist.nused]);
while(addrlist.nused > 0) while(addrlist.nused > 0)
free(addrlist.ucharpptr[--addrlist.nused]); free(addrlist.voidpptr[--addrlist.nused]);
while(relist.nused > 0){ while(relist.nused > 0){
i = --relist.nused; i = --relist.nused;
Strclose(relist.stringpptr[i]); Strclose(relist.stringpptr[i]);

View file

@ -3,16 +3,20 @@
/* /*
* Check that list has room for one more element. * Check that list has room for one more element.
*/ */
void static void
growlist(List *l) 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->nalloc = INCR;
l->listptr = emalloc(INCR*sizeof(long)); l->listptr = emalloc(INCR*esize);
l->nused = 0; l->nused = 0;
}else if(l->nused == l->nalloc){ }
l->listptr = erealloc(l->listptr, (l->nalloc+INCR)*sizeof(long)); else if(l->nused == l->nalloc){
memset((void*)(l->longptr+l->nalloc), 0, INCR*sizeof(long)); p = erealloc(l->listptr, (l->nalloc+INCR)*esize);
l->listptr = p;
memset(p+l->nalloc*esize, 0, INCR*esize);
l->nalloc += INCR; l->nalloc += INCR;
} }
} }
@ -23,19 +27,51 @@ growlist(List *l)
void void
dellist(List *l, int i) 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--; 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 * Add a new element, whose position is i, to the list
*/ */
void void
inslist(List *l, int i, long val) inslist(List *l, int i, ...)
{ {
growlist(l); Posn *pp;
memmove(&l->longptr[i+1], &l->longptr[i], (l->nused-i)*sizeof(long)); void **vpp;
l->longptr[i] = val; 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++; l->nused++;
} }
@ -45,3 +81,16 @@ listfree(List *l)
free(l->listptr); free(l->listptr);
free(l); free(l);
} }
List*
listalloc(int type)
{
List *l;
l = emalloc(sizeof(List));
l->type = type;
l->nalloc = 0;
l->nused = 0;
return l;
}

View file

@ -13,10 +13,18 @@ int waitack;
int noflush; int noflush;
int tversion; int tversion;
long inlong(void);
long invlong(void);
int inshort(void); int inshort(void);
long inlong(void);
vlong invlong(void);
int inmesg(Tmesg); 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); void setgenstr(File*, Posn, Posn);
#ifdef DEBUG #ifdef DEBUG
@ -90,9 +98,19 @@ journaln(int out, long n)
{ {
char buf[32]; char buf[32];
sprint(buf, "%ld", n); snprint(buf, sizeof buf, "%ld", n);
journal(out, buf); journal(out, buf);
} }
void
journalv(int out, vlong v)
{
char buf[32];
snprint(buf, sizeof buf, "%lld", v);
journal(out, buf);
}
#else #else
#define journal(a, b) #define journal(a, b)
#define journaln(a, b) #define journaln(a, b)
@ -176,6 +194,7 @@ inmesg(Tmesg type)
int i, m; int i, m;
short s; short s;
long l, l1; long l, l1;
vlong v;
File *f; File *f;
Posn p0, p1, p; Posn p0, p1, p;
Range r; Range r;
@ -204,15 +223,15 @@ inmesg(Tmesg type)
break; break;
case Tstartcmdfile: case Tstartcmdfile:
l = invlong(); /* for 64-bit pointers */ v = invlong(); /* for 64-bit pointers */
journaln(0, l); journaln(0, v);
Strdupl(&genstr, samname); Strdupl(&genstr, samname);
cmd = newfile(); cmd = newfile();
cmd->unread = 0; cmd->unread = 0;
outTsv(Hbindname, cmd->tag, l); outTsv(Hbindname, cmd->tag, v);
outTs(Hcurrent, cmd->tag); outTs(Hcurrent, cmd->tag);
logsetname(cmd, &genstr); logsetname(cmd, &genstr);
cmd->rasp = emalloc(sizeof(List)); cmd->rasp = listalloc('P');
cmd->mod = 0; cmd->mod = 0;
if(cmdstr.n){ if(cmdstr.n){
loginsert(cmd, 0L, cmdstr.s, cmdstr.n); loginsert(cmd, 0L, cmdstr.s, cmdstr.n);
@ -263,7 +282,7 @@ inmesg(Tmesg type)
termlocked++; termlocked++;
f = whichfile(inshort()); f = whichfile(inshort());
if(!f->rasp) /* this might be a duplicate message */ if(!f->rasp) /* this might be a duplicate message */
f->rasp = emalloc(sizeof(List)); f->rasp = listalloc('P');
current(f); current(f);
outTsv(Hbindname, f->tag, invlong()); /* for 64-bit pointers */ outTsv(Hbindname, f->tag, invlong()); /* for 64-bit pointers */
outTs(Hcurrent, f->tag); outTs(Hcurrent, f->tag);
@ -353,11 +372,11 @@ inmesg(Tmesg type)
break; break;
case Tstartnewfile: case Tstartnewfile:
l = invlong(); v = invlong();
Strdupl(&genstr, empty); Strdupl(&genstr, empty);
f = newfile(); f = newfile();
f->rasp = emalloc(sizeof(List)); f->rasp = listalloc('P');
outTsv(Hbindname, f->tag, l); outTsv(Hbindname, f->tag, v);
logsetname(f, &genstr); logsetname(f, &genstr);
outTs(Hcurrent, f->tag); outTs(Hcurrent, f->tag);
current(f); current(f);
@ -593,16 +612,16 @@ inlong(void)
return n; return n;
} }
long vlong
invlong(void) invlong(void)
{ {
ulong n; vlong v;
n = (inp[7]<<24) | (inp[6]<<16) | (inp[5]<<8) | inp[4]; v = (inp[7]<<24) | (inp[6]<<16) | (inp[5]<<8) | inp[4];
n = (n<<16) | (inp[3]<<8) | inp[2]; v = (v<<16) | (inp[3]<<8) | inp[2];
n = (n<<16) | (inp[1]<<8) | inp[0]; v = (v<<16) | (inp[1]<<8) | inp[0];
inp += 8; inp += 8;
return n; return v;
} }
void void
@ -732,12 +751,12 @@ outTsl(Hmesg type, int s, Posn l)
} }
void void
outTsv(Hmesg type, int s, Posn l) outTsv(Hmesg type, int s, vlong v)
{ {
outstart(type); outstart(type);
outshort(s); outshort(s);
outvlong((void*)l); outvlong(v);
journaln(1, l); journaln(1, v);
outsend(); outsend();
} }
@ -773,14 +792,14 @@ outlong(long l)
} }
void void
outvlong(void *v) outvlong(vlong v)
{ {
int i; int i;
ulong l;
l = (ulong) v; for(i = 0; i < 8; i++){
for(i = 0; i < 8; i++, l >>= 8) *outp++ = v;
*outp++ = l; v >>= 8;
}
} }
void void

View file

@ -1,6 +1,6 @@
#include "sam.h" #include "sam.h"
List file; List file = { 'p' };
ushort tag; ushort tag;
File * File *
@ -9,7 +9,7 @@ newfile(void)
File *f; File *f;
f = fileopen(); f = fileopen();
inslist(&file, 0, (long)f); inslist(&file, 0, f);
f->tag = tag++; f->tag = tag++;
if(downloaded) if(downloaded)
outTs(Hnewname, f->tag); outTs(Hnewname, f->tag);
@ -88,7 +88,7 @@ sortname(File *f)
break; break;
} }
} }
inslist(&file, i, (long)f); inslist(&file, i, f);
if(downloaded) if(downloaded)
outTsS(Hmovname, f->tag, &f->name); outTsS(Hmovname, f->tag, &f->name);
} }

View file

@ -177,7 +177,7 @@ raspinsert(File *f, uint p1, Rune *buf, uint n, int toterm)
} }
#define M 0x80000000L #define M 0x80000000L
#define P(i) r->longptr[i] #define P(i) r->posnptr[i]
#define T(i) (P(i)&M) /* in terminal */ #define T(i) (P(i)&M) /* in terminal */
#define L(i) (P(i)&~M) /* length of this piece */ #define L(i) (P(i)&~M) /* length of this piece */

View file

@ -14,7 +14,7 @@ File *curfile;
File *flist; File *flist;
File *cmd; File *cmd;
jmp_buf mainloop; jmp_buf mainloop;
List tempfile; List tempfile = { 'p' };
int quitok = TRUE; int quitok = TRUE;
int downloaded; int downloaded;
int dflag; int dflag;
@ -37,10 +37,10 @@ void usage(void);
extern int notify(void(*)(void*,char*)); extern int notify(void(*)(void*,char*));
int void
main(int volatile argc, char **volatile argv) main(int argc, char **argv)
{ {
int volatile i; int i;
String *t; String *t;
char *termargs[10], **ap; char *termargs[10], **ap;
@ -82,7 +82,6 @@ main(int volatile argc, char **volatile argv)
Strinit0(&genstr); Strinit0(&genstr);
Strinit0(&rhs); Strinit0(&rhs);
Strinit0(&curwd); Strinit0(&curwd);
tempfile.listptr = emalloc(1); /* so it can be freed later */
Strinit0(&plan9cmd); Strinit0(&plan9cmd);
home = getenv(HOME); home = getenv(HOME);
disk = diskinit(); disk = diskinit();
@ -112,7 +111,6 @@ main(int volatile argc, char **volatile argv)
cmdloop(); cmdloop();
trytoquit(); /* if we already q'ed, quitok will be TRUE */ trytoquit(); /* if we already q'ed, quitok will be TRUE */
exits(0); exits(0);
return 0;
} }
void void
@ -721,10 +719,11 @@ void
settempfile(void) settempfile(void)
{ {
if(tempfile.nalloc < file.nused){ if(tempfile.nalloc < file.nused){
free(tempfile.listptr); if(tempfile.filepptr)
tempfile.listptr = emalloc(sizeof(*tempfile.filepptr)*file.nused); free(tempfile.filepptr);
tempfile.filepptr = emalloc(sizeof(File*)*file.nused);
tempfile.nalloc = file.nused; tempfile.nalloc = file.nused;
} }
memmove(tempfile.filepptr, file.filepptr, sizeof(File*)*file.nused);
tempfile.nused = file.nused; tempfile.nused = file.nused;
memmove(&tempfile.filepptr[0], &file.filepptr[0], file.nused*sizeof(File*));
} }

View file

@ -70,26 +70,23 @@ struct String
struct List /* code depends on a long being able to hold a pointer */ struct List /* code depends on a long being able to hold a pointer */
{ {
int type; /* 'p' for pointer, 'P' for Posn */
int nalloc; int nalloc;
int nused; int nused;
union{ union{
void *listp; void* listp;
Block *blkp; void** voidp;
long *longp; Posn* posnp;
uchar* *ucharp; String**stringp;
String* *stringp; File** filep;
File* *filep;
long listv;
}g; }g;
}; };
#define listptr g.listp #define listptr g.listp
#define blkptr g.blkp #define voidpptr g.voidp
#define longptr g.longp #define posnptr g.posnp
#define ucharpptr g.ucharp
#define stringpptr g.stringp #define stringpptr g.stringp
#define filepptr g.filep #define filepptr g.filep
#define listval g.listv
enum enum
{ {
@ -267,8 +264,9 @@ File *getfile(String*);
int getname(File*, String*, int); int getname(File*, String*, int);
long getnum(int); long getnum(int);
void hiccough(char*); void hiccough(char*);
void inslist(List*, int, long); void inslist(List*, int, ...);
Address lineaddr(Posn, Address, int); Address lineaddr(Posn, Address, int);
List *listalloc(int);
void listfree(List*); void listfree(List*);
void load(File*); void load(File*);
File *lookfile(String*); File *lookfile(String*);
@ -401,12 +399,6 @@ void outTsS(Hmesg, int, String*);
void outTsllS(Hmesg, int, long, long, String*); void outTsllS(Hmesg, int, long, long, String*);
void outTsll(Hmesg, int, long, long); void outTsll(Hmesg, int, long, long);
void outTsl(Hmesg, int, long); void outTsl(Hmesg, int, long);
void outTsv(Hmesg, int, long); void outTsv(Hmesg, int, vlong);
void outstart(Hmesg);
void outcopy(int, void*);
void outshort(int);
void outlong(long);
void outvlong(void*);
void outsend(void);
void outflush(void); void outflush(void);