Xref: utzoo comp.sys.mac:27314 comp.sys.mac.programmer:4738 comp.lang.c:16495 Path: utzoo!utgpu!jarvis.csri.toronto.edu!mailrus!tut.cis.ohio-state.edu!rutgers!cmcl2!phri!cooper!joseph From: joseph@cooper.cooper.EDU (Joe Giannuzzi) Newsgroups: comp.sys.mac,comp.sys.mac.programmer,comp.lang.c Subject: Varargs.h for Mac LSC Keywords: varargs Message-ID: <1472@cooper.cooper.EDU> Date: 23 Feb 89 21:50:12 GMT Organization: The Cooper Union (NY, NY) Lines: 67 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