Museum

Home

Lab Overview

Retrotechnology Articles

Online Manuals

⇒ varargs(5) — NEWS-os 5.0.1

Media Vault

Software Library

Restoration Projects

Artifacts Sought

Related Articles

exec(2)

printf(3S)

vprintf(3S)

stdarg(5)



varargs(5)             MISC. FILE FORMATS              varargs(5)



NAME
     varargs - handle variable argument list

SYNOPSIS
     #include <varargs.h>  vaalist  vadcl  valist  pvar;  void
     vastart(valist  pvar);  type  vaarg(valist  pvar, type);
     void vaend(valist pvar);

DESCRIPTION
     This set of macros allows portable  procedures  that  accept
     variable  argument  lists to be written.  Routines that have
     variable argument lists [such as printf(3S)] but do not  use
     varargs  are  inherently non-portable, as different machines
     use different argument-passing conventions.

     vaalist is used as the parameter list in a function header.

     vadcl is a declaration for vaalist.  No  semicolon  should
     follow vadcl.

     valist is a type defined for the variable used to  traverse
     the list.

     vastart is called to initialize pvar to  the  beginning  of
     the list.

     vaarg will return the next argument in the list pointed  to
     by  pvar.   type is the type the argument is expected to be.
     Different types can be mixed, but it is up to the routine to
     know  what  type  of  argument  is expected, as it cannot be
     determined at runtime.

     vaend is used to clean up.

     Multiple traversals, each bracketed by vastart and  vaend,
     are possible.

EXAMPLE
     This example is a  possible  implementation  of  execl  [see
     exec(2)].
          #include <unistd.h>
          #include <varargs.h>
          #define MAXARGS     100

          /*   execl is called by
                    execl(file, arg1, arg2, ..., (char *)0);
          */
          execl(vaalist)
          vadcl
          {
               valist ap;
               char *file;



                                                                1





varargs(5)             MISC. FILE FORMATS              varargs(5)



               char *args[MAXARGS];          /* assumed big enough*/
               int argno = 0;

               vastart(ap);
               file = vaarg(ap, char *);
               while ((args[argno++] = vaarg(ap, char *)) != 0)
                    ;
               vaend(ap);
               return execv(file, args);
          }

SEE ALSO
     exec(2), printf(3S), vprintf(3S), stdarg(5).

NOTES
     It is up to the calling routine to specify  in  some  manner
     how  many arguments there are, since it is not always possi-
     ble to determine the number  of  arguments  from  the  stack
     frame.   For example, execl is passed a zero pointer to sig-
     nal the end of the list.  printf can tell how many arguments
     are there by the format.

     It is non-portable to specify a  second  argument  of  char,
     short,  or  float  to  vaarg,  since  arguments seen by the
     called function are not char, short, or float.   C  converts
     char and short arguments to int and converts float arguments
     to double before passing them to a function.

     stdarg is the preferred interface.


























                                                                2



Typewritten Software • bear@typewritten.org • Edmonds, WA 98026