Document Number: WG14 N671/X3J11 97-034 C9X Revision Proposal ===================== Title: va_copy proposal Author: Clive D.W. Feather Author Affiliation: Demon Internet Ltd Postal Address: 322 Regents Park Road, London N3 2QQ, UK E-mail Address: clive@demon.net Telephone Number: +44 181 371 1138 Fax Number: +44 181 371 1037 Date: 1997-02-28 Proposal Category: __ Editorial change/non-normative contribution __ Correction XX New feature __ Addition to obsolescent feature list __ Addition to Future Directions __ Other (please specify) ______________________________ Area of Standard Affected: __ Environment __ Language __ Preprocessor XX Library XX Macro/typedef/tag name XX Function __ Header __ Other (please specify) ______________________________ Prior Art: n/a Target Audience: all users of Related Documents (if any): none Proposal Attached: Yes Abstract: This proposal provides an additional facility to make variable arguments easier to use: a va_list copier. Notes: This proposal was prepared with the assistance of Mark Brader, Jutta Degener, Ron Guilmette, and a person whose employment conditions require anonymity. Summary ------- This proposal provides an additional facility to make variable arguments easier to use: a va_list copier. Conformance ----------- This proposal includes a new identifier. The present proposal uses names in the reserved namespace in order to avoid affecting strictly conforming programs. If a more attractive name not in the reserved namespace is used instead, some strictly conforming programs will be affected. No other aspect of the proposal affects any strictly conforming program. Discussion ---------- Sometimes processing variable arguments would be easier if the state of processing could be copied, and then reverted to at a later point. However, there is currently no way to do this. This proposal adds such a copying mechanism. Detailed proposal ----------------- [Changes are relative to draft 9-pre-3.] In subclause 7.11, replace: The header declares a type and defines three macros, with: The header declares a type and defines four macros, replace: va_list which is a type suitable for holding information needed by the macros va_start, va_arg, and va_end. with: va_list which is a type suitable for holding information needed by the macros va_start, va_arg, va_end, and __va_copy. Replace subclause 7.11.1 paragraph 1 by: The va_start, va_arg, and __va_copy macros described in this subclause shall be implemented as macros, not functions. It is unspecified whether va_end is a macro or an identifier declared with external linkage. If a macro definition is suppressed in order to access an actual function, or a program defines an external identifier with the name va_end, the behavior is undefined. Each invocation of the va_start or __va_copy macros shall be matched by a corresponding invocation of the va_end macro in the function accepting a varying number of arguments. Add a new subclause 7.11.1.4: 7.11.1.4 The __va_copy macro Synopsis #include void __va_copy (va_list dest, va_list src); Description The __va_copy function or macro makes the va_list dest be a copy of the va_list src, as if the va_start macro had been applied to it followed by the same sequence of uses of the va_arg macro as had previously been used to reach the present state of src. Returns The __va_copy function or macro returns no value. Add a second example: Example The function f3 is similar, but saves the status of the variable argument list after the indicated number of arguments; after f2 has been called once with the whole list, the trailing part of the list is gathered again and passed to function f4. #include #define MAXARGS 31 void f3(int n_ptrs, int f4_after, ...) { va_list ap, ap_save; char *array[MAXARGS]; int ptr_no = 0; if (n_ptrs > MAXARGS) n_ptrs = MAXARGS; va_start(ap, n_ptrs); while (ptr_no < n_ptrs) { array[ptr_no++] = va_arg(ap, char *); if (ptr_no == f4_after) __va_copy(ap_save, ap); } va_end(ap); f2(n_ptrs, array); /* Now process the saved copy */ n_ptrs -= f4_after; ptr_no = 0; while (ptr_no < n_ptrs) array[ptr_no++] = va_arg(ap_save, char *); va_end(ap_save); f4(n_ptrs, array); } -- Clive D.W. Feather | Associate Director | Director Tel: +44 181 371 1138 | Demon Internet Ltd. | CityScape Internet Services Ltd. Fax: +44 181 371 1150 | | Written on my laptop - please reply to the Reply-To address