 
 JTC1/SC22/WG14 
N671
JTC1/SC22/WG14 
N671
                    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 <stdargs.h>
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 <stdarg.h> declares a type and defines three macros,
with:
  The header <stdarg.h> 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 <stdarg.h>
    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 <stdarg.h>
    #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 | <clive@demon.net>   | <cdwf@cityscape.co.uk>
Written on my laptop - please reply to the Reply-To address <clive@demon.net>