1*53ee8cc1Swenshuai.xi /* Routines for dealing with '\0' separated arg vectors.
2*53ee8cc1Swenshuai.xi Copyright (C) 1995,96,97,98,99,2000,2004,2007 Free Software Foundation, Inc.
3*53ee8cc1Swenshuai.xi This file is part of the GNU C Library.
4*53ee8cc1Swenshuai.xi
5*53ee8cc1Swenshuai.xi The GNU C Library is free software; you can redistribute it and/or
6*53ee8cc1Swenshuai.xi modify it under the terms of the GNU Lesser General Public
7*53ee8cc1Swenshuai.xi License as published by the Free Software Foundation; either
8*53ee8cc1Swenshuai.xi version 2.1 of the License, or (at your option) any later version.
9*53ee8cc1Swenshuai.xi
10*53ee8cc1Swenshuai.xi The GNU C Library is distributed in the hope that it will be useful,
11*53ee8cc1Swenshuai.xi but WITHOUT ANY WARRANTY; without even the implied warranty of
12*53ee8cc1Swenshuai.xi MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13*53ee8cc1Swenshuai.xi Lesser General Public License for more details.
14*53ee8cc1Swenshuai.xi
15*53ee8cc1Swenshuai.xi You should have received a copy of the GNU Lesser General Public
16*53ee8cc1Swenshuai.xi License along with the GNU C Library; if not, write to the Free
17*53ee8cc1Swenshuai.xi Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
18*53ee8cc1Swenshuai.xi 02111-1307 USA. */
19*53ee8cc1Swenshuai.xi
20*53ee8cc1Swenshuai.xi #ifndef _ARGZ_H
21*53ee8cc1Swenshuai.xi #define _ARGZ_H 1
22*53ee8cc1Swenshuai.xi
23*53ee8cc1Swenshuai.xi #include <features.h>
24*53ee8cc1Swenshuai.xi
25*53ee8cc1Swenshuai.xi #define __need_error_t
26*53ee8cc1Swenshuai.xi #include <errno.h>
27*53ee8cc1Swenshuai.xi #include <string.h> /* Need size_t, and strchr is called below. */
28*53ee8cc1Swenshuai.xi
29*53ee8cc1Swenshuai.xi #ifndef __const
30*53ee8cc1Swenshuai.xi # define __const const
31*53ee8cc1Swenshuai.xi #endif
32*53ee8cc1Swenshuai.xi
33*53ee8cc1Swenshuai.xi #ifndef __error_t_defined
34*53ee8cc1Swenshuai.xi typedef int error_t;
35*53ee8cc1Swenshuai.xi #endif
36*53ee8cc1Swenshuai.xi
37*53ee8cc1Swenshuai.xi
38*53ee8cc1Swenshuai.xi __BEGIN_DECLS
39*53ee8cc1Swenshuai.xi
40*53ee8cc1Swenshuai.xi /* Make a '\0' separated arg vector from a unix argv vector, returning it in
41*53ee8cc1Swenshuai.xi ARGZ, and the total length in LEN. If a memory allocation error occurs,
42*53ee8cc1Swenshuai.xi ENOMEM is returned, otherwise 0. The result can be destroyed using free. */
43*53ee8cc1Swenshuai.xi extern error_t __argz_create (char *__const __argv[], char **__restrict __argz,
44*53ee8cc1Swenshuai.xi size_t *__restrict __len) __THROW;
45*53ee8cc1Swenshuai.xi extern error_t argz_create (char *__const __argv[], char **__restrict __argz,
46*53ee8cc1Swenshuai.xi size_t *__restrict __len) __THROW;
47*53ee8cc1Swenshuai.xi
48*53ee8cc1Swenshuai.xi /* Make a '\0' separated arg vector from a SEP separated list in
49*53ee8cc1Swenshuai.xi STRING, returning it in ARGZ, and the total length in LEN. If a
50*53ee8cc1Swenshuai.xi memory allocation error occurs, ENOMEM is returned, otherwise 0.
51*53ee8cc1Swenshuai.xi The result can be destroyed using free. */
52*53ee8cc1Swenshuai.xi extern error_t __argz_create_sep (__const char *__restrict __string,
53*53ee8cc1Swenshuai.xi int __sep, char **__restrict __argz,
54*53ee8cc1Swenshuai.xi size_t *__restrict __len) __THROW;
55*53ee8cc1Swenshuai.xi extern error_t argz_create_sep (__const char *__restrict __string,
56*53ee8cc1Swenshuai.xi int __sep, char **__restrict __argz,
57*53ee8cc1Swenshuai.xi size_t *__restrict __len) __THROW;
58*53ee8cc1Swenshuai.xi
59*53ee8cc1Swenshuai.xi /* Returns the number of strings in ARGZ. */
60*53ee8cc1Swenshuai.xi extern size_t __argz_count (__const char *__argz, size_t __len)
61*53ee8cc1Swenshuai.xi __THROW __attribute_pure__;
62*53ee8cc1Swenshuai.xi extern size_t argz_count (__const char *__argz, size_t __len)
63*53ee8cc1Swenshuai.xi __THROW __attribute_pure__;
64*53ee8cc1Swenshuai.xi
65*53ee8cc1Swenshuai.xi /* Puts pointers to each string in ARGZ into ARGV, which must be large enough
66*53ee8cc1Swenshuai.xi to hold them all. */
67*53ee8cc1Swenshuai.xi extern void __argz_extract (__const char *__restrict __argz, size_t __len,
68*53ee8cc1Swenshuai.xi char **__restrict __argv) __THROW;
69*53ee8cc1Swenshuai.xi extern void argz_extract (__const char *__restrict __argz, size_t __len,
70*53ee8cc1Swenshuai.xi char **__restrict __argv) __THROW;
71*53ee8cc1Swenshuai.xi
72*53ee8cc1Swenshuai.xi /* Make '\0' separated arg vector ARGZ printable by converting all the '\0's
73*53ee8cc1Swenshuai.xi except the last into the character SEP. */
74*53ee8cc1Swenshuai.xi extern void __argz_stringify (char *__argz, size_t __len, int __sep) __THROW;
75*53ee8cc1Swenshuai.xi extern void argz_stringify (char *__argz, size_t __len, int __sep) __THROW;
76*53ee8cc1Swenshuai.xi
77*53ee8cc1Swenshuai.xi /* Append BUF, of length BUF_LEN to the argz vector in ARGZ & ARGZ_LEN. */
78*53ee8cc1Swenshuai.xi extern error_t __argz_append (char **__restrict __argz,
79*53ee8cc1Swenshuai.xi size_t *__restrict __argz_len,
80*53ee8cc1Swenshuai.xi __const char *__restrict __buf, size_t _buf_len)
81*53ee8cc1Swenshuai.xi __THROW;
82*53ee8cc1Swenshuai.xi extern error_t argz_append (char **__restrict __argz,
83*53ee8cc1Swenshuai.xi size_t *__restrict __argz_len,
84*53ee8cc1Swenshuai.xi __const char *__restrict __buf, size_t __buf_len)
85*53ee8cc1Swenshuai.xi __THROW;
86*53ee8cc1Swenshuai.xi
87*53ee8cc1Swenshuai.xi /* Append STR to the argz vector in ARGZ & ARGZ_LEN. */
88*53ee8cc1Swenshuai.xi extern error_t __argz_add (char **__restrict __argz,
89*53ee8cc1Swenshuai.xi size_t *__restrict __argz_len,
90*53ee8cc1Swenshuai.xi __const char *__restrict __str) __THROW;
91*53ee8cc1Swenshuai.xi extern error_t argz_add (char **__restrict __argz,
92*53ee8cc1Swenshuai.xi size_t *__restrict __argz_len,
93*53ee8cc1Swenshuai.xi __const char *__restrict __str) __THROW;
94*53ee8cc1Swenshuai.xi
95*53ee8cc1Swenshuai.xi /* Append SEP separated list in STRING to the argz vector in ARGZ &
96*53ee8cc1Swenshuai.xi ARGZ_LEN. */
97*53ee8cc1Swenshuai.xi extern error_t __argz_add_sep (char **__restrict __argz,
98*53ee8cc1Swenshuai.xi size_t *__restrict __argz_len,
99*53ee8cc1Swenshuai.xi __const char *__restrict __string, int __delim)
100*53ee8cc1Swenshuai.xi __THROW;
101*53ee8cc1Swenshuai.xi extern error_t argz_add_sep (char **__restrict __argz,
102*53ee8cc1Swenshuai.xi size_t *__restrict __argz_len,
103*53ee8cc1Swenshuai.xi __const char *__restrict __string, int __delim)
104*53ee8cc1Swenshuai.xi __THROW;
105*53ee8cc1Swenshuai.xi
106*53ee8cc1Swenshuai.xi /* Delete ENTRY from ARGZ & ARGZ_LEN, if it appears there. */
107*53ee8cc1Swenshuai.xi extern void __argz_delete (char **__restrict __argz,
108*53ee8cc1Swenshuai.xi size_t *__restrict __argz_len,
109*53ee8cc1Swenshuai.xi char *__restrict __entry) __THROW;
110*53ee8cc1Swenshuai.xi extern void argz_delete (char **__restrict __argz,
111*53ee8cc1Swenshuai.xi size_t *__restrict __argz_len,
112*53ee8cc1Swenshuai.xi char *__restrict __entry) __THROW;
113*53ee8cc1Swenshuai.xi
114*53ee8cc1Swenshuai.xi /* Insert ENTRY into ARGZ & ARGZ_LEN before BEFORE, which should be an
115*53ee8cc1Swenshuai.xi existing entry in ARGZ; if BEFORE is NULL, ENTRY is appended to the end.
116*53ee8cc1Swenshuai.xi Since ARGZ's first entry is the same as ARGZ, argz_insert (ARGZ, ARGZ_LEN,
117*53ee8cc1Swenshuai.xi ARGZ, ENTRY) will insert ENTRY at the beginning of ARGZ. If BEFORE is not
118*53ee8cc1Swenshuai.xi in ARGZ, EINVAL is returned, else if memory can't be allocated for the new
119*53ee8cc1Swenshuai.xi ARGZ, ENOMEM is returned, else 0. */
120*53ee8cc1Swenshuai.xi extern error_t __argz_insert (char **__restrict __argz,
121*53ee8cc1Swenshuai.xi size_t *__restrict __argz_len,
122*53ee8cc1Swenshuai.xi char *__restrict __before,
123*53ee8cc1Swenshuai.xi __const char *__restrict __entry) __THROW;
124*53ee8cc1Swenshuai.xi extern error_t argz_insert (char **__restrict __argz,
125*53ee8cc1Swenshuai.xi size_t *__restrict __argz_len,
126*53ee8cc1Swenshuai.xi char *__restrict __before,
127*53ee8cc1Swenshuai.xi __const char *__restrict __entry) __THROW;
128*53ee8cc1Swenshuai.xi
129*53ee8cc1Swenshuai.xi /* Replace any occurrences of the string STR in ARGZ with WITH, reallocating
130*53ee8cc1Swenshuai.xi ARGZ as necessary. If REPLACE_COUNT is non-zero, *REPLACE_COUNT will be
131*53ee8cc1Swenshuai.xi incremented by number of replacements performed. */
132*53ee8cc1Swenshuai.xi extern error_t __argz_replace (char **__restrict __argz,
133*53ee8cc1Swenshuai.xi size_t *__restrict __argz_len,
134*53ee8cc1Swenshuai.xi __const char *__restrict __str,
135*53ee8cc1Swenshuai.xi __const char *__restrict __with,
136*53ee8cc1Swenshuai.xi unsigned int *__restrict __replace_count);
137*53ee8cc1Swenshuai.xi extern error_t argz_replace (char **__restrict __argz,
138*53ee8cc1Swenshuai.xi size_t *__restrict __argz_len,
139*53ee8cc1Swenshuai.xi __const char *__restrict __str,
140*53ee8cc1Swenshuai.xi __const char *__restrict __with,
141*53ee8cc1Swenshuai.xi unsigned int *__restrict __replace_count);
142*53ee8cc1Swenshuai.xi
143*53ee8cc1Swenshuai.xi /* Returns the next entry in ARGZ & ARGZ_LEN after ENTRY, or NULL if there
144*53ee8cc1Swenshuai.xi are no more. If entry is NULL, then the first entry is returned. This
145*53ee8cc1Swenshuai.xi behavior allows two convenient iteration styles:
146*53ee8cc1Swenshuai.xi
147*53ee8cc1Swenshuai.xi char *entry = 0;
148*53ee8cc1Swenshuai.xi while ((entry = argz_next (argz, argz_len, entry)))
149*53ee8cc1Swenshuai.xi ...;
150*53ee8cc1Swenshuai.xi
151*53ee8cc1Swenshuai.xi or
152*53ee8cc1Swenshuai.xi
153*53ee8cc1Swenshuai.xi char *entry;
154*53ee8cc1Swenshuai.xi for (entry = argz; entry; entry = argz_next (argz, argz_len, entry))
155*53ee8cc1Swenshuai.xi ...;
156*53ee8cc1Swenshuai.xi */
157*53ee8cc1Swenshuai.xi extern char *__argz_next (__const char *__restrict __argz, size_t __argz_len,
158*53ee8cc1Swenshuai.xi __const char *__restrict __entry) __THROW;
159*53ee8cc1Swenshuai.xi extern char *argz_next (__const char *__restrict __argz, size_t __argz_len,
160*53ee8cc1Swenshuai.xi __const char *__restrict __entry) __THROW;
161*53ee8cc1Swenshuai.xi
162*53ee8cc1Swenshuai.xi #ifdef __USE_EXTERN_INLINES
163*53ee8cc1Swenshuai.xi __extern_inline char *
__NTH(__argz_next (__const char * __argz,size_t __argz_len,__const char * __entry))164*53ee8cc1Swenshuai.xi __NTH (__argz_next (__const char *__argz, size_t __argz_len,
165*53ee8cc1Swenshuai.xi __const char *__entry))
166*53ee8cc1Swenshuai.xi {
167*53ee8cc1Swenshuai.xi if (__entry)
168*53ee8cc1Swenshuai.xi {
169*53ee8cc1Swenshuai.xi if (__entry < __argz + __argz_len)
170*53ee8cc1Swenshuai.xi __entry = strchr (__entry, '\0') + 1;
171*53ee8cc1Swenshuai.xi
172*53ee8cc1Swenshuai.xi return __entry >= __argz + __argz_len ? (char *) NULL : (char *) __entry;
173*53ee8cc1Swenshuai.xi }
174*53ee8cc1Swenshuai.xi else
175*53ee8cc1Swenshuai.xi return __argz_len > 0 ? (char *) __argz : 0;
176*53ee8cc1Swenshuai.xi }
177*53ee8cc1Swenshuai.xi __extern_inline char *
__NTH(argz_next (__const char * __argz,size_t __argz_len,__const char * __entry))178*53ee8cc1Swenshuai.xi __NTH (argz_next (__const char *__argz, size_t __argz_len,
179*53ee8cc1Swenshuai.xi __const char *__entry))
180*53ee8cc1Swenshuai.xi {
181*53ee8cc1Swenshuai.xi return __argz_next (__argz, __argz_len, __entry);
182*53ee8cc1Swenshuai.xi }
183*53ee8cc1Swenshuai.xi #endif /* Use extern inlines. */
184*53ee8cc1Swenshuai.xi
185*53ee8cc1Swenshuai.xi __END_DECLS
186*53ee8cc1Swenshuai.xi
187*53ee8cc1Swenshuai.xi #endif /* argz.h */
188