PowerPC Linux support from ericvh.

Mainly adding va_copy/va_end.
Also fix bug in sprint wrapping
around top of memory.
This commit is contained in:
rsc 2004-08-22 15:39:56 +00:00
parent c8c0df440f
commit 984e353160
16 changed files with 54 additions and 17 deletions

View file

@ -32,14 +32,15 @@ fmtprint(Fmt *f, char *fmt, ...)
f->flags = 0;
f->width = 0;
f->prec = 0;
va = f->args;
va_copy(va, f->args);
va_start(f->args, fmt);
n = dofmt(f, fmt);
va_end(f->args);
f->flags = 0;
f->width = 0;
f->prec = 0;
f->args = va;
va_copy(f->args,va);
va_end(va);
if(n >= 0)
return 0;
return n;

View file

@ -32,13 +32,15 @@ fmtvprint(Fmt *f, char *fmt, va_list args)
f->flags = 0;
f->width = 0;
f->prec = 0;
va = f->args;
f->args = args;
va_copy(va,f->args);
va_copy(f->args,args);
n = dofmt(f, fmt);
f->flags = 0;
f->width = 0;
f->prec = 0;
f->args = va;
va_end(f->args);
va_copy(f->args,va);
va_end(va);
if(n >= 0)
return 0;
return n;

View file

@ -7,7 +7,7 @@
#include "nan.h"
#ifdef __APPLE__
#if defined (__APPLE__) || (__powerpc__)
#define _NEEDLL
#endif

View file

@ -31,8 +31,9 @@ runevseprint(Rune *buf, Rune *e, char *fmt, va_list args)
f.flush = nil;
f.farg = nil;
f.nfmt = 0;
f.args = args;
va_copy(f.args,args);
dofmt(&f, fmt);
va_end(f.args);
*(Rune*)f.to = '\0';
return (Rune*)f.to;
}

View file

@ -28,8 +28,9 @@ runevsmprint(char *fmt, va_list args)
if(runefmtstrinit(&f) < 0)
return nil;
f.args = args;
va_copy(f.args,args);
n = dofmt(&f, fmt);
va_end(f.args);
if(n < 0)
return nil;
*(Rune*)f.to = '\0';

View file

@ -31,8 +31,9 @@ runevsnprint(Rune *buf, int len, char *fmt, va_list args)
f.flush = nil;
f.farg = nil;
f.nfmt = 0;
f.args = args;
va_copy(f.args,args);
dofmt(&f, fmt);
va_end(f.args);
*(Rune*)f.to = '\0';
return (Rune*)f.to - buf;
}

View file

@ -18,10 +18,19 @@ int
sprint(char *buf, char *fmt, ...)
{
int n;
uint len;
va_list args;
len = 1<<30; /* big number, but sprint is deprecated anyway */
/*
* on PowerPC, the stack is near the top of memory, so
* we must be sure not to overflow a 32-bit pointer.
*/
if(buf+len < buf)
len = -(uint)buf-1;
va_start(args, fmt);
n = vsnprint(buf, 65536, fmt, args); /* big number, but sprint is deprecated anyway */
n = vsnprint(buf, len, fmt, args);
va_end(args);
return n;
}

View file

@ -23,8 +23,9 @@ vfprint(int fd, char *fmt, va_list args)
int n;
fmtfdinit(&f, fd, buf, sizeof(buf));
f.args = args;
va_copy(f.args,args);
n = dofmt(&f, fmt);
va_end(f.args);
if(n > 0 && __fmtFdFlush(&f) == 0)
return -1;
return n;

View file

@ -29,8 +29,9 @@ vseprint(char *buf, char *e, char *fmt, va_list args)
f.flush = 0;
f.farg = nil;
f.nfmt = 0;
f.args = args;
va_copy(f.args,args);
dofmt(&f, fmt);
va_end(f.args);
*(char*)f.to = '\0';
return (char*)f.to;
}

View file

@ -27,8 +27,9 @@ vsmprint(char *fmt, va_list args)
if(fmtstrinit(&f) < 0)
return nil;
f.args = args;
va_copy(f.args,args);
n = dofmt(&f, fmt);
va_end(f.args);
if(n < 0)
return nil;
return fmtstrflush(&f);

View file

@ -20,6 +20,7 @@ int
vsnprint(char *buf, int len, char *fmt, va_list args)
{
Fmt f;
int x = 0;
if(len <= 0)
return -1;
@ -30,8 +31,9 @@ vsnprint(char *buf, int len, char *fmt, va_list args)
f.flush = 0;
f.farg = nil;
f.nfmt = 0;
f.args = args;
va_copy(f.args,args);
dofmt(&f, fmt);
va_end(f.args);
*(char*)f.to = '\0';
return (char*)f.to - buf;
}