Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(87)

Side by Side Diff: libiberty/argv.c

Issue 124383005: GDB 7.6.50 (Closed) Base URL: http://git.chromium.org/native_client/nacl-gdb.git@upstream
Patch Set: Created 6 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « libiberty/Makefile.in ('k') | libiberty/concat.c » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* Create and destroy argument vectors (argv's) 1 /* Create and destroy argument vectors (argv's)
2 Copyright (C) 1992, 2001, 2010 Free Software Foundation, Inc. 2 Copyright (C) 1992, 2001, 2010, 2012 Free Software Foundation, Inc.
3 Written by Fred Fish @ Cygnus Support 3 Written by Fred Fish @ Cygnus Support
4 4
5 This file is part of the libiberty library. 5 This file is part of the libiberty library.
6 Libiberty is free software; you can redistribute it and/or 6 Libiberty is free software; you can redistribute it and/or
7 modify it under the terms of the GNU Library General Public 7 modify it under the terms of the GNU Library General Public
8 License as published by the Free Software Foundation; either 8 License as published by the Free Software Foundation; either
9 version 2 of the License, or (at your option) any later version. 9 version 2 of the License, or (at your option) any later version.
10 10
11 Libiberty is distributed in the hope that it will be useful, 11 Libiberty is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of 12 but WITHOUT ANY WARRANTY; without even the implied warranty of
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
65 dupargv (char **argv) 65 dupargv (char **argv)
66 { 66 {
67 int argc; 67 int argc;
68 char **copy; 68 char **copy;
69 69
70 if (argv == NULL) 70 if (argv == NULL)
71 return NULL; 71 return NULL;
72 72
73 /* the vector */ 73 /* the vector */
74 for (argc = 0; argv[argc] != NULL; argc++); 74 for (argc = 0; argv[argc] != NULL; argc++);
75 copy = (char **) malloc ((argc + 1) * sizeof (char *)); 75 copy = (char **) xmalloc ((argc + 1) * sizeof (char *));
76 if (copy == NULL) 76
77 return NULL;
78
79 /* the strings */ 77 /* the strings */
80 for (argc = 0; argv[argc] != NULL; argc++) 78 for (argc = 0; argv[argc] != NULL; argc++)
81 { 79 {
82 int len = strlen (argv[argc]); 80 int len = strlen (argv[argc]);
83 copy[argc] = (char *) malloc (len + 1); 81 copy[argc] = (char *) xmalloc (len + 1);
84 if (copy[argc] == NULL)
85 » {
86 » freeargv (copy);
87 » return NULL;
88 » }
89 strcpy (copy[argc], argv[argc]); 82 strcpy (copy[argc], argv[argc]);
90 } 83 }
91 copy[argc] = NULL; 84 copy[argc] = NULL;
92 return copy; 85 return copy;
93 } 86 }
94 87
95 /* 88 /*
96 89
97 @deftypefn Extension void freeargv (char **@var{vector}) 90 @deftypefn Extension void freeargv (char **@var{vector})
98 91
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
142 @deftypefn Extension char** buildargv (char *@var{sp}) 135 @deftypefn Extension char** buildargv (char *@var{sp})
143 136
144 Given a pointer to a string, parse the string extracting fields 137 Given a pointer to a string, parse the string extracting fields
145 separated by whitespace and optionally enclosed within either single 138 separated by whitespace and optionally enclosed within either single
146 or double quotes (which are stripped off), and build a vector of 139 or double quotes (which are stripped off), and build a vector of
147 pointers to copies of the string for each field. The input string 140 pointers to copies of the string for each field. The input string
148 remains unchanged. The last element of the vector is followed by a 141 remains unchanged. The last element of the vector is followed by a
149 @code{NULL} element. 142 @code{NULL} element.
150 143
151 All of the memory for the pointer array and copies of the string 144 All of the memory for the pointer array and copies of the string
152 is obtained from @code{malloc}. All of the memory can be returned to the 145 is obtained from @code{xmalloc}. All of the memory can be returned to the
153 system with the single function call @code{freeargv}, which takes the 146 system with the single function call @code{freeargv}, which takes the
154 returned result of @code{buildargv}, as it's argument. 147 returned result of @code{buildargv}, as it's argument.
155 148
156 Returns a pointer to the argument vector if successful. Returns 149 Returns a pointer to the argument vector if successful. Returns
157 @code{NULL} if @var{sp} is @code{NULL} or if there is insufficient 150 @code{NULL} if @var{sp} is @code{NULL} or if there is insufficient
158 memory to complete building the argument vector. 151 memory to complete building the argument vector.
159 152
160 If the input is a null string (as opposed to a @code{NULL} pointer), 153 If the input is a null string (as opposed to a @code{NULL} pointer),
161 then buildarg returns an argument vector that has one arg, a null 154 then buildarg returns an argument vector that has one arg, a null
162 string. 155 string.
(...skipping 21 matching lines...) Expand all
184 int squote = 0; 177 int squote = 0;
185 int dquote = 0; 178 int dquote = 0;
186 int bsquote = 0; 179 int bsquote = 0;
187 int argc = 0; 180 int argc = 0;
188 int maxargc = 0; 181 int maxargc = 0;
189 char **argv = NULL; 182 char **argv = NULL;
190 char **nargv; 183 char **nargv;
191 184
192 if (input != NULL) 185 if (input != NULL)
193 { 186 {
194 copybuf = (char *) alloca (strlen (input) + 1); 187 copybuf = (char *) xmalloc (strlen (input) + 1);
195 /* Is a do{}while to always execute the loop once. Always return an 188 /* Is a do{}while to always execute the loop once. Always return an
196 argv, even for null strings. See NOTES above, test case below. */ 189 argv, even for null strings. See NOTES above, test case below. */
197 do 190 do
198 { 191 {
199 /* Pick off argv[argc] */ 192 /* Pick off argv[argc] */
200 consume_whitespace (&input); 193 consume_whitespace (&input);
201 194
202 if ((maxargc == 0) || (argc >= (maxargc - 1))) 195 if ((maxargc == 0) || (argc >= (maxargc - 1)))
203 { 196 {
204 /* argv needs initialization, or expansion */ 197 /* argv needs initialization, or expansion */
205 if (argv == NULL) 198 if (argv == NULL)
206 { 199 {
207 maxargc = INITIAL_MAXARGC; 200 maxargc = INITIAL_MAXARGC;
208 » » nargv = (char **) malloc (maxargc * sizeof (char *)); 201 » » nargv = (char **) xmalloc (maxargc * sizeof (char *));
209 } 202 }
210 else 203 else
211 { 204 {
212 maxargc *= 2; 205 maxargc *= 2;
213 » » nargv = (char **) realloc (argv, maxargc * sizeof (char *)); 206 » » nargv = (char **) xrealloc (argv, maxargc * sizeof (char *));
214 » » }
215 » if (nargv == NULL)
216 » » {
217 » » if (argv != NULL)
218 » » {
219 » » freeargv (argv);
220 » » argv = NULL;
221 » » }
222 » » break;
223 } 207 }
224 argv = nargv; 208 argv = nargv;
225 argv[argc] = NULL; 209 argv[argc] = NULL;
226 } 210 }
227 /* Begin scanning arg */ 211 /* Begin scanning arg */
228 arg = copybuf; 212 arg = copybuf;
229 while (*input != EOS) 213 while (*input != EOS)
230 { 214 {
231 if (ISSPACE (*input) && !squote && !dquote && !bsquote) 215 if (ISSPACE (*input) && !squote && !dquote && !bsquote)
232 { 216 {
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
277 } 261 }
278 else 262 else
279 { 263 {
280 *arg++ = *input; 264 *arg++ = *input;
281 } 265 }
282 } 266 }
283 input++; 267 input++;
284 } 268 }
285 } 269 }
286 *arg = EOS; 270 *arg = EOS;
287 » argv[argc] = strdup (copybuf); 271 » argv[argc] = xstrdup (copybuf);
288 » if (argv[argc] == NULL)
289 » {
290 » freeargv (argv);
291 » argv = NULL;
292 » break;
293 » }
294 argc++; 272 argc++;
295 argv[argc] = NULL; 273 argv[argc] = NULL;
296 274
297 consume_whitespace (&input); 275 consume_whitespace (&input);
298 } 276 }
299 while (*input != EOS); 277 while (*input != EOS);
278
279 free (copybuf);
300 } 280 }
301 return (argv); 281 return (argv);
302 } 282 }
303 283
304 /* 284 /*
305 285
306 @deftypefn Extension int writeargv (const char **@var{argv}, FILE *@var{file}) 286 @deftypefn Extension int writeargv (const char **@var{argv}, FILE *@var{file})
307 287
308 Write each member of ARGV, handling all necessary quoting, to the file 288 Write each member of ARGV, handling all necessary quoting, to the file
309 named by FILE, separated by whitespace. Return 0 on success, non-zero 289 named by FILE, separated by whitespace. Return 0 on success, non-zero
(...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after
448 if (only_whitespace (buffer)) 428 if (only_whitespace (buffer))
449 { 429 {
450 file_argv = (char **) xmalloc (sizeof (char *)); 430 file_argv = (char **) xmalloc (sizeof (char *));
451 file_argv[0] = NULL; 431 file_argv[0] = NULL;
452 } 432 }
453 else 433 else
454 /* Parse the string. */ 434 /* Parse the string. */
455 file_argv = buildargv (buffer); 435 file_argv = buildargv (buffer);
456 /* If *ARGVP is not already dynamically allocated, copy it. */ 436 /* If *ARGVP is not already dynamically allocated, copy it. */
457 if (!argv_dynamic) 437 if (!argv_dynamic)
458 » { 438 » *argvp = dupargv (*argvp);
459 » *argvp = dupargv (*argvp);
460 » if (!*argvp)
461 » {
462 » fputs ("\nout of memory\n", stderr);
463 » xexit (1);
464 » }
465 » }
466 /* Count the number of arguments. */ 439 /* Count the number of arguments. */
467 file_argc = 0; 440 file_argc = 0;
468 while (file_argv[file_argc]) 441 while (file_argv[file_argc])
469 ++file_argc; 442 ++file_argc;
470 /* Now, insert FILE_ARGV into ARGV. The "+1" below handles the 443 /* Now, insert FILE_ARGV into ARGV. The "+1" below handles the
471 NULL terminator at the end of ARGV. */ 444 NULL terminator at the end of ARGV. */
472 *argvp = ((char **) 445 *argvp = ((char **)
473 xrealloc (*argvp, 446 xrealloc (*argvp,
474 (*argcp + file_argc + 1) * sizeof (char *))); 447 (*argcp + file_argc + 1) * sizeof (char *)));
475 memmove (*argvp + i + file_argc, *argvp + i + 1, 448 memmove (*argvp + i + file_argc, *argvp + i + 1,
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after
558 } 531 }
559 printf ("\n"); 532 printf ("\n");
560 } 533 }
561 freeargv (argv); 534 freeargv (argv);
562 } 535 }
563 536
564 return 0; 537 return 0;
565 } 538 }
566 539
567 #endif /* MAIN */ 540 #endif /* MAIN */
OLDNEW
« no previous file with comments | « libiberty/Makefile.in ('k') | libiberty/concat.c » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698