If your system uses the SVr4 ABI (designed by Motorola), you will only
If your system uses the SVr4 ABI (designed by Motorola), you will only
be able to compile my library files lib/format.c and lib/getargs.c if your
C-compiler supports the macro va_copy() or __va_copy() from stdarg.h.

Mach/Next STep/Apple Rhapsody on ppc use a 'void *' for the type va_list
so you don't need to make changes on these systems.

Solaris/ppc (made in 1992) is the first UNIX implementation for the PPC.
It includes the va_copy() macro that allows you to assign a C object of the
type va_list in a system independent way.

Linux/ppc uses exactly the same construct as Solaris for the type va_list.
You will only be able to compile lib/format.c and lib/getargs.c if your 
C-compiler includes the macro va_copy() or __va_copy(). If this is not the
case, you will need to upgrade your C-compiler first. GCC 2.8.0 and later
includes this macro.

Here is what Solaris /usr/include/sys/varargs.h looks like:

/*
 * va_copy is a Solaris extension to provide a portable way to perform
 * a variable argument list ``bookmarking'' function.
 */
#if defined(__ppc)
#defineva_copy(to, from)((to)[0] = (from)[0])
#else
#defineva_copy(to, from)((to) = (from))
#endif

To be able to compile my lib/format.c and lib/getargs.c on a OS
implementation that uses an array for va_list, you will need
this va_copy() enhancement too.

The files mentioned above already compile on a PPC Apple Rhapsody system.
But as mentioned before, Rhapsody uses a void * for va_list (maybe because
Apple includes badly designed international printf code from BSD 4.4
that requires va_list to be void * to work).

Notice:lib/format.c allows a %r format that needs additional features
in stdarg.h. You need to know whether va_list is an array.
I hope that GCC will include some definitions in future versions
that allow to propagate va_list type objects from var args
in function calls.

GCC
===

If you are not using GCC 2.8.0, you can add the following definition 
to va-ppc.h :

/usr/lib/gcc-lib/*-linux-gnulibc1/2.*/include/va-ppc.h

#defineva_copy(to, from)((to)[0] = (from)[0])

and to all other va-*.h files:

#defineva_copy(to, from)((to) = (from))

Important: Check before if you don't have a GCC that is already patched.

Joerg