mikem@otc.OZ (Michael Mowbray) (11/26/86)
A couple of people mailed to me saying they'd be interested in seeing our diff's for porting C++ release 1.1 to Pyramid architecture. The diff's appear below. Credit for this port must go to our local Unix guru Andrew Gollan (login id "adjg" if you have questions). Making error.c use proper varargs constructs wasn't exactly trivial, I understand. An important key lies in the line "typedef unsigned TOK;" below. (Hopefully Bjarne's new improved error.c will make this sort of thing unnecessary in the next release.) ::::::: incl/stdarg.h ::::::: 20a21,37 > #if pyr > typedef int va_buf[3]; > typedef va_buf *va_list; > > extern void _vastart(va_list, char*); > extern char *_vaarg(va_list, int); > > #define va_start(ap, parmN) {\ > va_buf _va;\ > _vastart(ap = (va_list)_va, (char *)&parmN + sizeof parmN) > > #define va_end(ap) } > > #define va_arg(ap, mode) *((mode *)_vaarg(ap, sizeof (mode))) > > #else /* The rest */ > 32a50,51 > #endif pyr > 34,37c53,60 < vfprintf(FILE*, char*, va_list), < vsprintf(char*, char*, va_list), < setvbuf(FILE*, char*, int, int); < #endif --- > vsprintf(char*, char*, va_list) > #ifdef FILE > ,vfprintf(FILE*, char*, va_list) > ,setvbuf(FILE*, char*, int, int) > #endif FILE > ; > > #endif va_start ::::::: incl/math.h ::::::: 36a37 > 45a47,50 > #if pyramid90x || pyr > #define MAXFLOAT ((float)3.402823466385288598e+38) > #endif > ::::::: incl/signal.h ::::::: 6c6 < typedef int (*PF) (); --- > typedef int (*PF)(); 8,10c8,10 < extern int (*sigset (int, PF))(); < extern int (*ssignal(int, PF))(); < extern int (*signal (int, PF))(); --- > extern PF sigset(int, PF); > extern PF ssignal(int , PF); > extern PF signal(int, PF); 12,13c12,13 < extern int gsignal (int); < extern int kill (int, int); --- > extern int gsignal(int); > extern int kill(int, int); ::::::: lib/stream/out.c ::::::: 10a11 > #include <stdarg.h> 69c70 < register* ap = (int*)((char*)&format+sizeof(char*)); // not completely general --- > va_list ap; 71d71 < if (max < buf+fld_size) buf = formbuf; 73,80c73,83 < register ll = sprintf(buf,format,ap[0],ap[1],ap[2],ap[3],ap[4],ap[5],ap[6],ap[7],ap[8],ap[9]); // too few words copied < if (0<ll && ll<cb_size) // length < ; < else if (buf<(char*)ll && (char*)ll<buf+cb_size)// pointer to trailing 0 < ll = (char*)ll - buf; < else < ll = strlen(buf); < if (fld_size < ll) exit(10); --- > if (max < buf+fld_size) > buf = formbuf; > > va_start(ap, format); > (void)vsprintf(buf, (char *)format, ap); > va_end(ap); > > register ll = strlen(buf); > > if (fld_size < ll) > exit(10); ::::::: src/cfront.h ::::::: 24a25 > #include <stdarg.h> 80a82 > extern int error(int, loc*, char*, va_list); ::::::: src/typedef.h ::::::: 2c2 < typedef unsigned char TOK; --- > typedef unsigned TOK; ::::::: src/error.c ::::::: 105,106c105,111 < register Pname a = Pname(((char*)&s)+sizeof(char*)); < return error(0,&dummy_loc,s,a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7]); --- > register int err; > va_list ap; > > va_start(ap, s); > err = error(0, &dummy_loc, s, ap); > va_end(ap); > return err; 111,112c116,122 < register Pname a = Pname(((char*)&s)+sizeof(char*)); < return error(t,&dummy_loc,s,a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7]); --- > register int err; > va_list ap; > > va_start(ap, s); > err = error(t, &dummy_loc, s, ap); > va_end(ap); > return err; 117,118c127,133 < register Pname a = Pname(((char*)&s)+sizeof(char*)); < return error(0,l,s,a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7]); --- > register int err; > va_list ap; > > va_start(ap, s); > err = error(0, l, s, ap); > va_end(ap); > return err; 121c136,147 < int error(int t, loc* lc, char* s ...) --- > int error(int t, loc* l, char* s ...) > { > register int err; > va_list ap; > > va_start(ap, s); > err = error(t, l, s, ap); > va_end(ap); > return err; > } > > int error(int t, loc* lc, char* s, va_list ap) 134,139d159 < if ((char*)&t+sizeof(int) != (char*)&lc) { < // can't handle this argument passing mechanism < fprintf(stderr,"\n%s: can't handle varargs (%d %d %d)\n", prog_name, &t, &lc, &s); < ext(12); < } < 182d201 < char* a = ((char*)&s)+sizeof(char*); 191,192c210 < { TOK x = *(int*)a; < a += sizeof(int); --- > { TOK x = va_arg(ap, TOK); 200,201c218 < { Ptype tt = *(Ptype*)a; < a += sizeof(Ptype); --- > { Ptype tt = va_arg(ap, Ptype); 215,216c232 < { Pname nn = *(Pname*)a; < a += sizeof(Pname); --- > { Pname nn = va_arg(ap, Pname); 229,230c245 < { char* p = *(char**)a; < a += sizeof(char*); --- > { char* p = va_arg(ap, char*); 236,237c251 < { char x = *(int*)a; < a += sizeof(int); --- > { char x = va_arg(ap, int); 242,243c256 < { int i = *(int*)a; < a += sizeof(int); --- > { int i = va_arg(ap, int); 248,249c261 < { char* st = *(char**)a; < a += sizeof(char*); --- > { char* st = va_arg(ap, char*);