1afe61c15SRodney W. Grimes.\" Copyright (c) 1990, 1991, 1993 2afe61c15SRodney W. Grimes.\" The Regents of the University of California. All rights reserved. 3afe61c15SRodney W. Grimes.\" 4afe61c15SRodney W. Grimes.\" This code is derived from software contributed to Berkeley by 5afe61c15SRodney W. Grimes.\" the American National Standards Committee X3, on Information 6afe61c15SRodney W. Grimes.\" Processing Systems. 7afe61c15SRodney W. Grimes.\" 8afe61c15SRodney W. Grimes.\" Redistribution and use in source and binary forms, with or without 9afe61c15SRodney W. Grimes.\" modification, are permitted provided that the following conditions 10afe61c15SRodney W. Grimes.\" are met: 11afe61c15SRodney W. Grimes.\" 1. Redistributions of source code must retain the above copyright 12afe61c15SRodney W. Grimes.\" notice, this list of conditions and the following disclaimer. 13afe61c15SRodney W. Grimes.\" 2. Redistributions in binary form must reproduce the above copyright 14afe61c15SRodney W. Grimes.\" notice, this list of conditions and the following disclaimer in the 15afe61c15SRodney W. Grimes.\" documentation and/or other materials provided with the distribution. 16afe61c15SRodney W. Grimes.\" 3. All advertising materials mentioning features or use of this software 17afe61c15SRodney W. Grimes.\" must display the following acknowledgement: 18afe61c15SRodney W. Grimes.\" This product includes software developed by the University of 19afe61c15SRodney W. Grimes.\" California, Berkeley and its contributors. 20afe61c15SRodney W. Grimes.\" 4. Neither the name of the University nor the names of its contributors 21afe61c15SRodney W. Grimes.\" may be used to endorse or promote products derived from this software 22afe61c15SRodney W. Grimes.\" without specific prior written permission. 23afe61c15SRodney W. Grimes.\" 24afe61c15SRodney W. Grimes.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 25afe61c15SRodney W. Grimes.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 26afe61c15SRodney W. Grimes.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 27afe61c15SRodney W. Grimes.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 28afe61c15SRodney W. Grimes.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 29afe61c15SRodney W. Grimes.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 30afe61c15SRodney W. Grimes.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 31afe61c15SRodney W. Grimes.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 32afe61c15SRodney W. Grimes.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 33afe61c15SRodney W. Grimes.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 34afe61c15SRodney W. Grimes.\" SUCH DAMAGE. 35afe61c15SRodney W. Grimes.\" 36afe61c15SRodney W. Grimes.\" @(#)stdarg.3 8.1 (Berkeley) 6/5/93 37afe61c15SRodney W. Grimes.\" 38afe61c15SRodney W. Grimes.Dd June 5, 1993 39afe61c15SRodney W. Grimes.Dt STDARG 3 40afe61c15SRodney W. Grimes.Os 41afe61c15SRodney W. Grimes.Sh NAME 42afe61c15SRodney W. Grimes.Nm stdarg 43afe61c15SRodney W. Grimes.Nd variable argument lists 44afe61c15SRodney W. Grimes.Sh SYNOPSIS 45afe61c15SRodney W. Grimes.Fd #include <stdarg.h> 46afe61c15SRodney W. Grimes.Ft void 47afe61c15SRodney W. Grimes.Fn va_start "va_list ap" last 48afe61c15SRodney W. Grimes.Ft type 49afe61c15SRodney W. Grimes.Fn va_arg "va_list ap" type 50afe61c15SRodney W. Grimes.Ft void 51afe61c15SRodney W. Grimes.Fn va_end "va_list ap" 52afe61c15SRodney W. Grimes.Sh DESCRIPTION 53afe61c15SRodney W. GrimesA function may be called with a varying number of arguments of varying 54afe61c15SRodney W. Grimestypes. 55afe61c15SRodney W. GrimesThe include file 56afe61c15SRodney W. Grimes.Aq Pa stdarg.h 57afe61c15SRodney W. Grimesdeclares a type 58afe61c15SRodney W. Grimes.Pq Em va_list 59afe61c15SRodney W. Grimesand defines three macros for stepping 60afe61c15SRodney W. Grimesthrough a list of arguments whose number and types are not known to 61afe61c15SRodney W. Grimesthe called function. 62afe61c15SRodney W. Grimes.Pp 63afe61c15SRodney W. GrimesThe called function must declare an object of type 64afe61c15SRodney W. Grimes.Em va_list 65afe61c15SRodney W. Grimeswhich is used by the macros 66afe61c15SRodney W. Grimes.Fn va_start , 67afe61c15SRodney W. Grimes.Fn va_arg , 68afe61c15SRodney W. Grimesand 69afe61c15SRodney W. Grimes.Fn va_end . 70afe61c15SRodney W. Grimes.Pp 71afe61c15SRodney W. GrimesThe 72afe61c15SRodney W. Grimes.Fn va_start 73afe61c15SRodney W. Grimesmacro initializes 74afe61c15SRodney W. Grimes.Fa ap 75afe61c15SRodney W. Grimesfor subsequent use by 76afe61c15SRodney W. Grimes.Fn va_arg 77afe61c15SRodney W. Grimesand 78afe61c15SRodney W. Grimes.Fn va_end , 79afe61c15SRodney W. Grimesand must be called first. 80afe61c15SRodney W. Grimes.Pp 81afe61c15SRodney W. GrimesThe parameter 82afe61c15SRodney W. Grimes.Fa last 83afe61c15SRodney W. Grimesis the name of the last parameter before the variable argument list, 84afe61c15SRodney W. Grimesi.e. the last parameter of which the calling function knows the type. 85afe61c15SRodney W. Grimes.Pp 86afe61c15SRodney W. GrimesBecause the address of this parameter is used in the 87afe61c15SRodney W. Grimes.Fn va_start 88afe61c15SRodney W. Grimesmacro, it should not be declared as a register variable, or as a 89afe61c15SRodney W. Grimesfunction or an array type. 90afe61c15SRodney W. Grimes.Pp 91afe61c15SRodney W. GrimesThe 92afe61c15SRodney W. Grimes.Fn va_start 93afe61c15SRodney W. Grimesmacro returns no value. 94afe61c15SRodney W. Grimes.Pp 95afe61c15SRodney W. GrimesThe 96afe61c15SRodney W. Grimes.Fn va_arg 97afe61c15SRodney W. Grimesmacro expands to an expression that has the type and value of the next 98afe61c15SRodney W. Grimesargument in the call. 99afe61c15SRodney W. GrimesThe parameter 100afe61c15SRodney W. Grimes.Fa ap 101afe61c15SRodney W. Grimesis the 102afe61c15SRodney W. Grimes.Em va_list Fa ap 103afe61c15SRodney W. Grimesinitialized by 104afe61c15SRodney W. Grimes.Fn va_start . 105afe61c15SRodney W. GrimesEach call to 106afe61c15SRodney W. Grimes.Fn va_arg 107afe61c15SRodney W. Grimesmodifies 108afe61c15SRodney W. Grimes.Fa ap 109afe61c15SRodney W. Grimesso that the next call returns the next argument. 110afe61c15SRodney W. GrimesThe parameter 111afe61c15SRodney W. Grimes.Fa type 112afe61c15SRodney W. Grimesis a type name specified so that the type of a pointer to an 113afe61c15SRodney W. Grimesobject that has the specified type can be obtained simply by 114afe61c15SRodney W. Grimesadding a * 115afe61c15SRodney W. Grimesto 116afe61c15SRodney W. Grimes.Fa type . 117afe61c15SRodney W. Grimes.Pp 118afe61c15SRodney W. GrimesIf there is no next argument, or if 119afe61c15SRodney W. Grimes.Fa type 120afe61c15SRodney W. Grimesis not compatible with the type of the actual next argument 121afe61c15SRodney W. Grimes(as promoted according to the default argument promotions), 122afe61c15SRodney W. Grimesrandom errors will occur. 123afe61c15SRodney W. Grimes.Pp 124afe61c15SRodney W. GrimesThe first use of the 125afe61c15SRodney W. Grimes.Fn va_arg 126afe61c15SRodney W. Grimesmacro after that of the 127afe61c15SRodney W. Grimes.Fn va_start 128afe61c15SRodney W. Grimesmacro returns the argument after 129afe61c15SRodney W. Grimes.Fa last . 130afe61c15SRodney W. GrimesSuccessive invocations return the values of the remaining 131afe61c15SRodney W. Grimesarguments. 132afe61c15SRodney W. Grimes.Pp 133afe61c15SRodney W. GrimesThe 134afe61c15SRodney W. Grimes.Fn va_end 135afe61c15SRodney W. Grimesmacro handles a normal return from the function whose variable argument 136afe61c15SRodney W. Grimeslist was initialized by 137afe61c15SRodney W. Grimes.Fn va_start . 138afe61c15SRodney W. Grimes.Pp 139afe61c15SRodney W. GrimesThe 140afe61c15SRodney W. Grimes.Fn va_end 141afe61c15SRodney W. Grimesmacro returns no value. 142afe61c15SRodney W. Grimes.Sh EXAMPLES 143afe61c15SRodney W. GrimesThe function 144afe61c15SRodney W. Grimes.Em foo 145afe61c15SRodney W. Grimestakes a string of format characters and prints out the argument 146afe61c15SRodney W. Grimesassociated with each format character based on the type. 147afe61c15SRodney W. Grimes.Bd -literal -offset indent 148afe61c15SRodney W. Grimesvoid foo(char *fmt, ...) 149afe61c15SRodney W. Grimes{ 150afe61c15SRodney W. Grimes va_list ap; 151afe61c15SRodney W. Grimes int d; 152afe61c15SRodney W. Grimes char c, *p, *s; 153afe61c15SRodney W. Grimes 154afe61c15SRodney W. Grimes va_start(ap, fmt); 155afe61c15SRodney W. Grimes while (*fmt) 156afe61c15SRodney W. Grimes switch(*fmt++) { 157afe61c15SRodney W. Grimes case 's': /* string */ 158afe61c15SRodney W. Grimes s = va_arg(ap, char *); 159afe61c15SRodney W. Grimes printf("string %s\en", s); 160afe61c15SRodney W. Grimes break; 161afe61c15SRodney W. Grimes case 'd': /* int */ 162afe61c15SRodney W. Grimes d = va_arg(ap, int); 163afe61c15SRodney W. Grimes printf("int %d\en", d); 164afe61c15SRodney W. Grimes break; 165afe61c15SRodney W. Grimes case 'c': /* char */ 16604bbb62bSJoshua Peck Macdonald /* Note: char is promoted to int. */ 16704bbb62bSJoshua Peck Macdonald c = va_arg(ap, int); 168afe61c15SRodney W. Grimes printf("char %c\en", c); 169afe61c15SRodney W. Grimes break; 170afe61c15SRodney W. Grimes } 171afe61c15SRodney W. Grimes va_end(ap); 172afe61c15SRodney W. Grimes} 173afe61c15SRodney W. Grimes.Ed 174afe61c15SRodney W. Grimes.Sh STANDARDS 175afe61c15SRodney W. GrimesThe 176afe61c15SRodney W. Grimes.Fn va_start , 177afe61c15SRodney W. Grimes.Fn va_arg , 178afe61c15SRodney W. Grimesand 179afe61c15SRodney W. Grimes.Fn va_end 180afe61c15SRodney W. Grimesmacros conform to 181afe61c15SRodney W. Grimes.St -ansiC . 182afe61c15SRodney W. Grimes.Sh COMPATIBILITY 183afe61c15SRodney W. GrimesThese macros are 184afe61c15SRodney W. Grimes.Em not 185afe61c15SRodney W. Grimescompatible with the historic macros they replace. 186afe61c15SRodney W. GrimesA backward compatible version can be found in the include 187afe61c15SRodney W. Grimesfile 188afe61c15SRodney W. Grimes.Aq Pa varargs.h . 189afe61c15SRodney W. Grimes.Sh BUGS 190afe61c15SRodney W. GrimesUnlike the 191afe61c15SRodney W. Grimes.Em varargs 192afe61c15SRodney W. Grimesmacros, the 193afe61c15SRodney W. Grimes.Nm stdarg 194afe61c15SRodney W. Grimesmacros do not permit programmers to 195afe61c15SRodney W. Grimescode a function with no fixed arguments. 196afe61c15SRodney W. GrimesThis problem generates work mainly when converting 197afe61c15SRodney W. Grimes.Em varargs 198afe61c15SRodney W. Grimescode to 199afe61c15SRodney W. Grimes.Nm stdarg 200afe61c15SRodney W. Grimescode, 201afe61c15SRodney W. Grimesbut it also creates difficulties for variadic functions that 202afe61c15SRodney W. Grimeswish to pass all of their arguments on to a function 203afe61c15SRodney W. Grimesthat takes a 204afe61c15SRodney W. Grimes.Em va_list 205afe61c15SRodney W. Grimesargument, such as 206afe61c15SRodney W. Grimes.Xr vfprintf 3 . 207