Loading...
man/stdarg.3 Libc-498 Libc-763.12
--- Libc/Libc-498/man/stdarg.3
+++ Libc/Libc-763.12/man/stdarg.3
@@ -1,5 +1,3 @@
-.\"	$NetBSD: stdarg.3,v 1.3 1994/11/30 15:24:37 jtc Exp $
-.\"
 .\" Copyright (c) 1990, 1991, 1993
 .\"	The Regents of the University of California.  All rights reserved.
 .\"
@@ -36,26 +34,29 @@
 .\" SUCH DAMAGE.
 .\"
 .\"	@(#)stdarg.3	8.1 (Berkeley) 6/5/93
-.\"
-.Dd June 5, 1993
+.\" $FreeBSD: src/share/man/man3/stdarg.3,v 1.15 2005/01/21 08:36:36 ru Exp $
+.\"
+.Dd October 25, 2002
 .Dt STDARG 3
 .Os
 .Sh NAME
 .Nm stdarg
 .Nd variable argument lists
 .Sh SYNOPSIS
-.Fd #include <stdarg.h>
+.In stdarg.h
 .Ft void
 .Fn va_start "va_list ap" last
 .Ft type
 .Fn va_arg "va_list ap" type
+.Ft void
+.Fn va_copy "va_list dest" "va_list src"
 .Ft void
 .Fn va_end "va_list ap"
 .Sh DESCRIPTION
 A function may be called with a varying number of arguments of varying
 types.
 The include file
-.Aq Pa stdarg.h
+.In stdarg.h
 declares a type
 .Pq Em va_list
 and defines three macros for stepping
@@ -67,32 +68,37 @@
 which is used by the macros
 .Fn va_start ,
 .Fn va_arg ,
+.Fn va_copy ,
 and
 .Fn va_end .
 .Pp
 The
 .Fn va_start
-macro initializes
+macro must be called first, and it initializes
+.Fa ap ,
+which can be passed to
+.Fn va_arg
+for each argument to be processed.
+Calling
+.Fn va_end
+signals that there are no further arguments, and causes
 .Fa ap
-for subsequent use by
-.Fn va_arg
-and
+to be invalidated.
+Note that each call to
+.Fn va_start
+must be matched by a call to
 .Fn va_end ,
-and must be called first.
+from within the same function.
 .Pp
 The parameter
 .Fa last
 is the name of the last parameter before the variable argument list,
-i.e. the last parameter of which the calling function knows the type.
+i.e., the last parameter of which the calling function knows the type.
 .Pp
 Because the address of this parameter is used in the
 .Fn va_start
 macro, it should not be declared as a register variable, or as a
 function or an array type.
-.Pp
-The
-.Fn va_start
-macro returns no value.
 .Pp
 The
 .Fn va_arg
@@ -100,11 +106,11 @@
 argument in the call.
 The parameter
 .Fa ap
-is the 
+is the
 .Em va_list Fa ap
 initialized by
 .Fn va_start .
-Each call to 
+Each call to
 .Fn va_arg
 modifies
 .Fa ap
@@ -112,7 +118,7 @@
 The parameter
 .Fa type
 is a type name specified so that the type of a pointer to an
-object that has the specified type can be obtained simply by 
+object that has the specified type can be obtained simply by
 adding a *
 to
 .Fa type .
@@ -125,22 +131,47 @@
 .Pp
 The first use of the
 .Fn va_arg
-macro after that of the 
-.Fn va_start
-macro returns the argument after 
+macro after that of the
+.Fn va_start
+macro returns the argument after
 .Fa last .
 Successive invocations return the values of the remaining
 arguments.
 .Pp
 The
+.Fn va_copy
+macro copies the state of the variable argument list, 
+.Fa src ,
+previously initialized by
+.Fn va_start ,
+to the variable argument list,
+.Fa dest ,
+which must not have been previously initialized by
+.Fn va_start ,
+without an intervening call to
+.Fn va_end .
+The state preserved in
+.Fa dest
+is equivalent to calling
+.Fn va_start
+and
+.Fn va_arg
+on
+.Fa dest
+in the same way as was used on
+.Fa src .
+The copied variable argument list can subsequently be passed to
+.Fn va_arg ,
+and must finally be passed to
 .Fn va_end
-macro handles a normal return from the function whose variable argument
-list was initialized by 
-.Fn va_start .
-.Pp
-The
-.Fn va_end
-macro returns no value.
+when through with it.
+.Pp
+After a variable argument list is invalidated by
+.Fn va_end ,
+it can be reinitialized with
+.Fn va_start
+or made a copy of another variable argument list with
+.Fn va_copy .
 .Sh EXAMPLES
 The function
 .Em foo
@@ -149,11 +180,12 @@
 .Bd -literal -offset indent
 void foo(char *fmt, ...)
 {
-	va_list ap;
+	va_list ap, ap2;
 	int d;
-	char c, *p, *s;
+	char c, *s;
 
 	va_start(ap, fmt);
+	va_copy(ap2, ap);
 	while (*fmt)
 		switch(*fmt++) {
 		case 's':			/* string */
@@ -165,39 +197,45 @@
 			printf("int %d\en", d);
 			break;
 		case 'c':			/* char */
-			c = va_arg(ap, char);
+			/* Note: char is promoted to int. */
+			c = va_arg(ap, int);
 			printf("char %c\en", c);
 			break;
 		}
 	va_end(ap);
+	...
+	/* use ap2 to iterate over the arguments again */
+	...
+	va_end(ap2);
 }
 .Ed
-.Sh STANDARDS
-The
-.Fn va_start ,
-.Fn va_arg ,
-and
-.Fn va_end
-macros conform to
-.St -ansiC .
 .Sh COMPATIBILITY
 These macros are
 .Em not
 compatible with the historic macros they replace.
 A backward compatible version can be found in the include
-file 
-.Aq Pa varargs.h .
+file
+.In varargs.h .
+.Sh STANDARDS
+The
+.Fn va_start ,
+.Fn va_arg ,
+.Fn va_copy ,
+and
+.Fn va_end
+macros conform to
+.St -isoC-99 .
 .Sh BUGS
 Unlike the
 .Em varargs
 macros, the
-.Nm stdarg
+.Nm
 macros do not permit programmers to
 code a function with no fixed arguments.
 This problem generates work mainly when converting
 .Em varargs
 code to
-.Nm stdarg
+.Nm
 code,
 but it also creates difficulties for variadic functions that
 wish to pass all of their arguments on to a function