[comp.lang.c++] diff's for porting release 1.1 to Pyramid.

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*);