[comp.unix.wizards] Calling Varargs Twice on a Sun 3

simpson@trwarcadia.uucp (03/22/89)

Can anyone tell me the magic incantation to call varargs twice on a Sun 3/60?
I don't know the format of the stack and I don't have a Motorola manual.
Please don't flame me for non-portability.  What I want to do is this
(which only gives me the first argument):

#include <stdio.h>
#include <varargs.h>

b(va_alist)
va_dcl
{
    char *s1, *s2;
    va_list ap;
    
    va_start(ap);
    s1 = va_arg(ap, char *);
    s2 = va_arg(ap, char *);
    printf("b(): s1=%s, s2=%s\n", s1, s2);
    va_end(ap);
}

/* a() calls b() */
a(va_alist)
va_dcl
{
    char *s1, *s2;
    va_list ap;

    va_start(ap);
    s1 = va_arg(ap, char *);
    s2 = va_arg(ap, char *);
    printf("a(): s1=%s, s2=%s\n", s1, s2);
    b(va_alist);
    va_end(ap);
}

main()
{
    static char *s1 = "Hello";
    static char *s2 = "There";

    a(s1, s2);
    exit(0);
}
	Scott Simpson
	TRW Space and Defense Sector
	oberon!trwarcadia!simpson  		(UUCP)
	trwarcadia!simpson@oberon.usc.edu	(Internet)

chris@mimsy.UUCP (Chris Torek) (03/22/89)

In article <1698@spp2.UUCP> simpson@trwarcadia.uucp writes:
>Can anyone tell me the magic incantation to call varargs twice on a Sun 3/60?

There is no such incantation; what you are trying to do is, in general,
impossible.

>b(va_alist)
>va_dcl
>{
	...
>}
>
>/* a() calls b() */
>a(va_alist)
>va_dcl
>{
	...
>    b(va_alist);

What you need to do instead (which is not only possible, but even
portable) is this:

	b(va_alist)
		va_dcl
	{
		va_list ap;

		va_start(ap);
		vb(ap);
		va_end(ap);
	}

	vb(ap)
		va_list ap;
	{
		...
	}

	a(va_alist)
		va_dcl
	{
		va_lits ap;

		va_start(ap);
		vb(ap);
		...

This is why v*printf() exist.
-- 
In-Real-Life: Chris Torek, Univ of MD Comp Sci Dept (+1 301 454 7163)
Domain:	chris@mimsy.umd.edu	Path:	uunet!mimsy!chris