xref: /freebsd/share/man/man3/stdarg.3 (revision 04bbb62b7a646a52a5fab4a490bc4ec4969c2d48)
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