[comp.lang.c] Varargs.h for Mac LSC

joseph@cooper.cooper.EDU (Joe Giannuzzi) (02/24/89)

	Varargs is a portable method of passing multiple parameters to
	a function.  It is available on most **IX based systems.  It is
	not part of the #include files for LSC on the Mac, so when I had
	the need to port a **IX based program to my Mac I had to create
	the varargs.h #include file.  The very short listing follows.
	------------------------------------------------------------------
	/*	Varargs.h

	a portable method of passing multiple parameters to a function

	JWG 2/18/89	*/

	#define	va_dcl			va_list va_alist;
	#define	va_arg(A,B)		*(B*)((A+=sizeof(B))-sizeof(B))
	#define	va_start(A)		A=(char *)(&va_alist)
	#define va_end(A)		/* va_end */

	typedef char *va_list;
	------------------------------------------------------------------
	The function being called is responsible for knowing what
	parameter to get from the stack.  This is usually done by
	passing a format string.  Note that char becomes int and
	float becomes double when passed.  Following is an example.
	------------------------------------------------------------------
	/* All "va_" variable and macro names cannot be changed. */

	function(va_list)
	va_dcl
		{
		va_list argp;
		char *fmt;
		char cval,*sval
		long ival;
		double fval;
		
		va_start(argp);
		fmt=va_arg(argp,char *);
		while(*fmt!=NULL)
			switch(*fmt++)
				{
				case READINT:
					ival=(long)va_arg(argp,int);
					break;
				case READLONG:
					ival=(long)va_arg(argp,long);
					break;
				case READCHAR:	/* char passed as int */
					cval=(char)va_arg(argp,int);
					break;
				case READSTR:
					sval=va_arg(argp,char *);
					break;
				case READFLT:	/* float passed as double */
					fval=(float)va_arg(argp,double);
					break;
				case READDBL:
					fval=(double)va_arg(argp,double);
					break;
				default:
					/* ERROR IN FORMAT STRING */
					break;
				}
		va_end(argp);
		}
	------------------------------------------------------------------
	Enjoy.  Joe Gunoz,  joseph @cooper.cooper.edu