xref: /utopia/UTPA2-700.0.x/projects/tools/lint/mips-linux-gnu_include/argz.h (revision 53ee8cc121a030b8d368113ac3e966b4705770ef)
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