blob: 88721096e79b4c5d03d69b3486e6344d7abb1161 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
|
/*++
/* NAME
/* argv 3
/* SUMMARY
/* string array utilities
/* SYNOPSIS
/* #include <argv.h>
/*
/* ARGV *argv_alloc(len)
/* int len;
/*
/* ARGV *argv_free(argvp)
/* ARGV *argvp;
/*
/* void argv_add(argvp, arg, ..., ARGV_END)
/* ARGV *argvp;
/* char *arg;
/*
/* void argv_terminate(argvp);
/* ARGV *argvp;
/* DESCRIPTION
/* The functions in this module manipulate arrays of string
/* pointers. An ARGV structure contains the following members:
/* .IP len
/* The length of the \fIargv\fR array member.
/* .IP argc
/* The number of \fIargv\fR elements used.
/* .IP argv
/* An array of pointers to null-terminated strings.
/* .PP
/* argv_alloc() returns an empty string array of the requested
/* length. The result is ready for use by argv_add(). The array
/* is null terminated.
/*
/* argv_add() copies zero or more strings and adds them to the
/* specified string array. The array is null terminated.
/* Terminate the argument list with a null pointer. The manifest
/* constant ARGV_END provides a convenient notation for this.
/*
/* argv_free() releases storage for a string array, and conveniently
/* returns a null pointer.
/*
/* argv_terminate() null-terminates its string array argument.
/* SEE ALSO
/* msg(3) diagnostics interface
/* DIAGNOSTICS
/* Fatal errors: memory allocation problem.
/* LICENSE
/* .ad
/* .fi
/* The Secure Mailer license must be distributed with this software.
/* AUTHOR(S)
/* Wietse Venema
/* IBM T.J. Watson Research
/* P.O. Box 704
/* Yorktown Heights, NY 10598, USA
/*--*/
/* System libraries. */
#include <sys_defs.h>
#include <stdlib.h> /* 44BSD stdarg.h uses abort() */
#include <stdarg.h>
#include <string.h>
/* Application-specific. */
#include "mymalloc.h"
#include "argv.h"
/* argv_free - destroy string array */
ARGV *argv_free(ARGV *argvp)
{
char **cpp;
for (cpp = argvp->argv; cpp < argvp->argv + argvp->argc; cpp++)
myfree(*cpp);
myfree((char *) argvp->argv);
myfree((char *) argvp);
return (0);
}
/* argv_alloc - initialize string array */
ARGV *argv_alloc(int len)
{
ARGV *argvp;
/*
* Make sure that always argvp->argc < argvp->len.
*/
argvp = (ARGV *) mymalloc(sizeof(*argvp));
argvp->len = (len < 2 ? 2 : len);
argvp->argv = (char **) mymalloc((argvp->len + 1) * sizeof(char *));
argvp->argc = 0;
argvp->argv[0] = 0;
return (argvp);
}
/* argv_add - add string to vector */
void argv_add(ARGV *argvp,...)
{
char *arg;
va_list ap;
/*
* Make sure that always argvp->argc < argvp->len.
*/
va_start(ap, argvp);
while ((arg = va_arg(ap, char *)) != 0) {
if (argvp->argc + 1 >= argvp->len) {
argvp->len *= 2;
argvp->argv = (char **)
myrealloc((char *) argvp->argv,
(argvp->len + 1) * sizeof(char *));
}
argvp->argv[argvp->argc++] = mystrdup(arg);
}
va_end(ap);
argvp->argv[argvp->argc] = 0;
}
/* argv_terminate - terminate string array */
void argv_terminate(ARGV *argvp)
{
/*
* Trust that argvp->argc < argvp->len.
*/
argvp->argv[argvp->argc] = 0;
}
|