intmyaccess(char *f){ return access(f, AEXIST);} intmycreat(char *n, int p){ return create(n, 1, p);} intmywait(int *s){ int p; Waitmsg *w; if((w = wait()) == nil) return -1; else{ p = w->pid; *s = 0; if(w->msg[0]) *s = 1; free(w); return p; }} intmydup(int f1, int f2){ return dup(f1,f2);} intmypipe(int *fd){ return pipe(fd);} intsystemtype(int sys){ return sys & Plan9;} intpathchar(void){ return '/';} char*mygetwd(char *path, int len){ return getwd(path, len);} intmyexec(char *path, char *argv[]){ return exec(path, argv);} intmyfork(void){ return fork();} /* * real allocs */ extern char end[]; static char* hunk = end;static long nhunk;static uintptr thunk; static voidgethunk(void){ long nh; if(thunk < NHUNK) nh = NHUNK; else if(thunk < 1000*NHUNK) nh = thunk; else nh = 1000*NHUNK; if(nhunk < 0) nhunk = 0; nhunk += nh; thunk += nh; if(brk(hunk+nhunk) < 0) sysfatal("out of memory");} void*alloc(long n){ void *p; while((uintptr)hunk & 7) { hunk++; nhunk--; } while(nhunk < n) gethunk(); p = hunk; nhunk -= n; hunk += n; return p;} void*allocn(void *p, long on, long n){ void *q; q = (uchar*)p + on; if(q != hunk || nhunk < n) { while(nhunk < on+n) gethunk(); memmove(hunk, p, on); p = hunk; hunk += on; nhunk -= on; } hunk += n; nhunk -= n; return p;} /* * fake mallocs */void*malloc(ulong n){ return alloc(n);} void*calloc(ulong m, ulong n){ return alloc(m*n);} void*realloc(void *o, ulong n){ ulong m; void *a; if(n == 0) return nil; if(o == nil) return alloc(n); a = alloc(n); m = (char*)a - (char*)o; if(m < n) n = m; memmove(a, o, n); return a;} voidfree(void*){} /* needed when profiling */void*mallocz(ulong size, int){ return alloc(size);} voidsetmalloctag(void*, uintptr){} voidsetrealloctag(void*, uintptr){}
int
myaccess(char *f)
{
return access(f, AEXIST);
}
int
mycreat(char *n, int p)
{
return create(n, 1, p);
}
int
mywait(int *s)
{
int p;
Waitmsg *w;
if((w = wait()) == nil)
return -1;
else{
p = w->pid;
*s = 0;
if(w->msg[0])
*s = 1;
free(w);
return p;
}
}
int
mydup(int f1, int f2)
{
return dup(f1,f2);
}
int
mypipe(int *fd)
{
return pipe(fd);
}
int
systemtype(int sys)
{
return sys & Plan9;
}
int
pathchar(void)
{
return '/';
}
char*
mygetwd(char *path, int len)
{
return getwd(path, len);
}
int
myexec(char *path, char *argv[])
{
return exec(path, argv);
}
int
myfork(void)
{
return fork();
}
/*
* real allocs
*/
extern char end[];
static char* hunk = end;
static long nhunk;
static uintptr thunk;
static void
gethunk(void)
{
long nh;
if(thunk < NHUNK)
nh = NHUNK;
else if(thunk < 1000*NHUNK)
nh = thunk;
else
nh = 1000*NHUNK;
if(nhunk < 0)
nhunk = 0;
nhunk += nh;
thunk += nh;
if(brk(hunk+nhunk) < 0)
sysfatal("out of memory");
}
void*
alloc(long n)
{
void *p;
while((uintptr)hunk & 7) {
hunk++;
nhunk--;
}
while(nhunk < n)
gethunk();
p = hunk;
nhunk -= n;
hunk += n;
return p;
}
void*
allocn(void *p, long on, long n)
{
void *q;
q = (uchar*)p + on;
if(q != hunk || nhunk < n) {
while(nhunk < on+n)
gethunk();
memmove(hunk, p, on);
p = hunk;
hunk += on;
nhunk -= on;
}
hunk += n;
nhunk -= n;
return p;
}
/*
* fake mallocs
*/
void*
malloc(ulong n)
{
return alloc(n);
}
void*
calloc(ulong m, ulong n)
{
return alloc(m*n);
}
void*
realloc(void *o, ulong n)
{
ulong m;
void *a;
if(n == 0)
return nil;
if(o == nil)
return alloc(n);
a = alloc(n);
m = (char*)a - (char*)o;
if(m < n)
n = m;
memmove(a, o, n);
return a;
}
void
free(void*)
{
}
/* needed when profiling */
void*
mallocz(ulong size, int)
{
return alloc(size);
}
void
setmalloctag(void*, uintptr)
{
}
void
setrealloctag(void*, uintptr)
{
}