Annotation of 43BSDTahoe/man/man3/varargs.3, revision 1.1.1.1

1.1       root        1: .\"    @(#)varargs.3   6.3 (Berkeley) 5/15/86
                      2: .\"
                      3: .TH VARARGS 3  "May 15, 1986"
                      4: .AT 3
                      5: .SH NAME
                      6: varargs \- variable argument list
                      7: .SH SYNOPSIS
                      8: .B "#include <varargs.h>"
                      9: .PP
                     10: .I function\c
                     11: .RB ( va_alist )
                     12: .br
                     13: .B va_dcl
                     14: .br
                     15: .B va_list
                     16: .IR pvar ;
                     17: .br
                     18: .B va_start\c
                     19: .RI ( pvar );
                     20: .br
                     21: f =
                     22: .B va_arg\c
                     23: .RI ( pvar ,
                     24: .IR type );
                     25: .br
                     26: .B va_end\c
                     27: .RI ( pvar );
                     28: .SH DESCRIPTION
                     29: This set of macros provides a means of writing portable procedures that
                     30: accept variable argument lists.
                     31: Routines having variable argument lists (such as
                     32: .IR printf (3))
                     33: that do not use varargs are inherently nonportable, since different
                     34: machines use different argument passing conventions.
                     35: .PP
                     36: .B va_alist
                     37: is used in a function header to declare a variable argument list.
                     38: .PP
                     39: .B va_dcl
                     40: is a declaration for
                     41: .BR va_alist .
                     42: Note that there is no semicolon after
                     43: .B va_dcl.
                     44: .PP
                     45: .B va_list
                     46: is a type which can be used for the variable
                     47: .IR pvar ,
                     48: which is used to traverse the list.
                     49: One such variable must always be declared.
                     50: .PP
                     51: .B va_start\c
                     52: .RI (pvar)
                     53: is called to initialize
                     54: .I pvar
                     55: to the beginning of the list.
                     56: .PP
                     57: .B va_arg\c
                     58: .RI ( pvar ,
                     59: .IR type )
                     60: will return the next argument in the list pointed to by
                     61: .IR pvar .
                     62: .I Type
                     63: is the type to which the expected argument will be converted
                     64: when passed as an argument.
                     65: In standard C, arguments that are
                     66: .B char
                     67: or
                     68: .B short
                     69: should be accessed as
                     70: .BR int ,
                     71: .B "unsigned char
                     72: or
                     73: .B "unsigned short
                     74: are converted to
                     75: .BR "unsigned int" ,
                     76: and
                     77: .B float
                     78: arguments are converted to
                     79: .BR double .
                     80: Different types can be mixed, but it is up
                     81: to the routine to know what type of argument is
                     82: expected, since it cannot be determined at runtime.
                     83: .PP
                     84: .B va_end\c
                     85: .RI ( pvar )
                     86: is used to finish up.
                     87: .PP
                     88: Multiple traversals, each bracketed by
                     89: .B va_start
                     90: \&...
                     91: .B va_end,
                     92: are possible.
                     93: .SH EXAMPLE
                     94: .nf
                     95:        \fB#include\fP <varargs.h>
                     96:        execl(\fBva_alist\fP)
                     97:        \fBva_dcl\fP
                     98:        {
                     99:                \fBva_list\fP ap;
                    100:                \fBchar\fP *file;
                    101:                \fBchar\fP *args[100];
                    102:                \fBint\fP argno = 0;
                    103: 
                    104:                \fBva_start\fP(ap);
                    105:                file = \fBva_arg(ap, \fBchar\fP *);
                    106:                \fBwhile\fP (args[argno++] = \fBva_arg\fP(ap, \fBchar\fP *))
                    107:                        \fB;\fP
                    108:                \fBva_end\fP(ap);
                    109:                \fBreturn\fP execv(file, args);
                    110:        }
                    111: .fi
                    112: .SH BUGS
                    113: It is up to the calling routine to determine how many arguments
                    114: there are, since it is not possible to determine this from the
                    115: stack frame.  For example,
                    116: .I execl
                    117: passes a 0 to signal the end of the list.
                    118: .I Printf
                    119: can tell how many arguments are supposed to be there by the format.
                    120: .PP
                    121: The macros
                    122: .I va_start
                    123: and
                    124: .I va_end
                    125: may be arbitrarily complex;
                    126: for example,
                    127: .I va_start
                    128: might contain an opening brace,
                    129: which is closed by a matching brace in
                    130: .IR va_end .
                    131: Thus, they should only be used where they could
                    132: be placed within a single complex statement.

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.