64-bit fixes
This commit is contained in:
parent
f8e39513f3
commit
2c0f3733ad
7 changed files with 152 additions and 80 deletions
|
|
@ -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]);
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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 */
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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*));
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue