1d4c6f1e6SMasatake YAMATO /*
2d4c6f1e6SMasatake YAMATO * Copyright (c) 1999-2002, Darren Hiebert
3d4c6f1e6SMasatake YAMATO *
4d4c6f1e6SMasatake YAMATO * This source code is released for free distribution under the terms of the
50ce38835Sviccuad * GNU General Public License version 2 or (at your option) any later version.
6d4c6f1e6SMasatake YAMATO *
7d4c6f1e6SMasatake YAMATO * This module contains functions for reading command line arguments.
8d4c6f1e6SMasatake YAMATO */
9d4c6f1e6SMasatake YAMATO
10d4c6f1e6SMasatake YAMATO /*
11d4c6f1e6SMasatake YAMATO * INCLUDE FILES
12d4c6f1e6SMasatake YAMATO */
13d4c6f1e6SMasatake YAMATO #include "general.h" /* must always come first */
14d4c6f1e6SMasatake YAMATO
15d4c6f1e6SMasatake YAMATO #include <stdio.h>
16d4c6f1e6SMasatake YAMATO #include <string.h>
17d4c6f1e6SMasatake YAMATO #include <ctype.h>
18d4c6f1e6SMasatake YAMATO
199695d9ccSMasatake YAMATO #include "args_p.h"
20d4c6f1e6SMasatake YAMATO #include "debug.h"
21d4c6f1e6SMasatake YAMATO #include "routines.h"
22e5ca9a3cSMasatake YAMATO #include "vstring.h"
23d4c6f1e6SMasatake YAMATO
24d4c6f1e6SMasatake YAMATO /*
25d4c6f1e6SMasatake YAMATO * FUNCTION DEFINITIONS
26d4c6f1e6SMasatake YAMATO */
27d4c6f1e6SMasatake YAMATO
nextStringArg(const char ** const next)28d4c6f1e6SMasatake YAMATO static char *nextStringArg (const char** const next)
29d4c6f1e6SMasatake YAMATO {
30d4c6f1e6SMasatake YAMATO char* result = NULL;
31d4c6f1e6SMasatake YAMATO const char* start;
32d4c6f1e6SMasatake YAMATO
33d4c6f1e6SMasatake YAMATO Assert (*next != NULL);
34d4c6f1e6SMasatake YAMATO for (start = *next ; isspace ((int) *start) ; ++start)
35d4c6f1e6SMasatake YAMATO ;
36d4c6f1e6SMasatake YAMATO if (*start == '\0')
37d4c6f1e6SMasatake YAMATO *next = start;
38d4c6f1e6SMasatake YAMATO else
39d4c6f1e6SMasatake YAMATO {
40d4c6f1e6SMasatake YAMATO size_t length;
41d4c6f1e6SMasatake YAMATO const char* end;
42d4c6f1e6SMasatake YAMATO
43d4c6f1e6SMasatake YAMATO for (end = start ; *end != '\0' && ! isspace ((int) *end) ; ++end)
44d4c6f1e6SMasatake YAMATO ;
45d4c6f1e6SMasatake YAMATO length = end - start;
46d4c6f1e6SMasatake YAMATO Assert (length > 0);
47d4c6f1e6SMasatake YAMATO result = xMalloc (length + 1, char);
48d4c6f1e6SMasatake YAMATO strncpy (result, start, length);
49d4c6f1e6SMasatake YAMATO result [length] = '\0';
50d4c6f1e6SMasatake YAMATO *next = end;
51d4c6f1e6SMasatake YAMATO }
52d4c6f1e6SMasatake YAMATO return result;
53d4c6f1e6SMasatake YAMATO }
54d4c6f1e6SMasatake YAMATO
nextStringLine(const char ** const next)55d4c6f1e6SMasatake YAMATO static char* nextStringLine (const char** const next)
56d4c6f1e6SMasatake YAMATO {
57d4c6f1e6SMasatake YAMATO char* result = NULL;
58d4c6f1e6SMasatake YAMATO size_t length;
59d4c6f1e6SMasatake YAMATO const char* end;
60d4c6f1e6SMasatake YAMATO
61d4c6f1e6SMasatake YAMATO Assert (*next != NULL);
62d4c6f1e6SMasatake YAMATO for (end = *next ; *end != '\n' && *end != '\0' ; ++end)
63d4c6f1e6SMasatake YAMATO ;
64d4c6f1e6SMasatake YAMATO length = end - *next;
65d4c6f1e6SMasatake YAMATO if (length > 0)
66d4c6f1e6SMasatake YAMATO {
67d4c6f1e6SMasatake YAMATO result = xMalloc (length + 1, char);
68d4c6f1e6SMasatake YAMATO strncpy (result, *next, length);
69d4c6f1e6SMasatake YAMATO result [length] = '\0';
70d4c6f1e6SMasatake YAMATO }
71d4c6f1e6SMasatake YAMATO if (*end == '\n')
72d4c6f1e6SMasatake YAMATO ++end;
73d4c6f1e6SMasatake YAMATO else if (*end == '\r')
74d4c6f1e6SMasatake YAMATO {
75d4c6f1e6SMasatake YAMATO ++end;
76d4c6f1e6SMasatake YAMATO if (*end == '\n')
77d4c6f1e6SMasatake YAMATO ++end;
78d4c6f1e6SMasatake YAMATO }
79d4c6f1e6SMasatake YAMATO *next = end;
80d4c6f1e6SMasatake YAMATO return result;
81d4c6f1e6SMasatake YAMATO }
82d4c6f1e6SMasatake YAMATO
nextString(const Arguments * const current,const char ** const next)83d4c6f1e6SMasatake YAMATO static char* nextString (const Arguments* const current, const char** const next)
84d4c6f1e6SMasatake YAMATO {
85d4c6f1e6SMasatake YAMATO char* result;
86d4c6f1e6SMasatake YAMATO if (current->lineMode)
87d4c6f1e6SMasatake YAMATO result = nextStringLine (next);
88d4c6f1e6SMasatake YAMATO else
89d4c6f1e6SMasatake YAMATO result = nextStringArg (next);
90d4c6f1e6SMasatake YAMATO return result;
91d4c6f1e6SMasatake YAMATO }
92d4c6f1e6SMasatake YAMATO
nextFileArg(FILE * const fp)93d4c6f1e6SMasatake YAMATO static char* nextFileArg (FILE* const fp)
94d4c6f1e6SMasatake YAMATO {
95d4c6f1e6SMasatake YAMATO char* result = NULL;
96d4c6f1e6SMasatake YAMATO Assert (fp != NULL);
97d4c6f1e6SMasatake YAMATO if (! feof (fp))
98d4c6f1e6SMasatake YAMATO {
99d4c6f1e6SMasatake YAMATO vString* vs = vStringNew ();
100d4c6f1e6SMasatake YAMATO int c;
101d4c6f1e6SMasatake YAMATO do
102d4c6f1e6SMasatake YAMATO c = fgetc (fp);
103d4c6f1e6SMasatake YAMATO while (isspace (c));
104d4c6f1e6SMasatake YAMATO
105d4c6f1e6SMasatake YAMATO if (c != EOF)
106d4c6f1e6SMasatake YAMATO {
107d4c6f1e6SMasatake YAMATO do
108d4c6f1e6SMasatake YAMATO {
109d4c6f1e6SMasatake YAMATO vStringPut (vs, c);
110d4c6f1e6SMasatake YAMATO c = fgetc (fp);
111d4c6f1e6SMasatake YAMATO } while (c != EOF && ! isspace (c));
112d4c6f1e6SMasatake YAMATO Assert (vStringLength (vs) > 0);
113d4c6f1e6SMasatake YAMATO result = xMalloc (vStringLength (vs) + 1, char);
114d4c6f1e6SMasatake YAMATO strcpy (result, vStringValue (vs));
115d4c6f1e6SMasatake YAMATO }
116d4c6f1e6SMasatake YAMATO vStringDelete (vs);
117d4c6f1e6SMasatake YAMATO }
118d4c6f1e6SMasatake YAMATO return result;
119d4c6f1e6SMasatake YAMATO }
120d4c6f1e6SMasatake YAMATO
nextFileLine(FILE * const fp)121d4c6f1e6SMasatake YAMATO static char* nextFileLine (FILE* const fp)
122d4c6f1e6SMasatake YAMATO {
123d4c6f1e6SMasatake YAMATO char* result = NULL;
124a9161cdbSJiří Techet Assert (fp != NULL);
125d4c6f1e6SMasatake YAMATO if (! feof (fp))
126d4c6f1e6SMasatake YAMATO {
127d4c6f1e6SMasatake YAMATO vString* vs = vStringNew ();
128d4c6f1e6SMasatake YAMATO int c;
129d4c6f1e6SMasatake YAMATO
130d4c6f1e6SMasatake YAMATO c = fgetc (fp);
131d4c6f1e6SMasatake YAMATO while (c != EOF)
132d4c6f1e6SMasatake YAMATO {
133d4c6f1e6SMasatake YAMATO if (c != '\n' && c != '\r')
134d4c6f1e6SMasatake YAMATO vStringPut (vs, c);
135d4c6f1e6SMasatake YAMATO else if (vStringLength (vs) > 0)
136d4c6f1e6SMasatake YAMATO break;
137d4c6f1e6SMasatake YAMATO c = fgetc (fp);
138d4c6f1e6SMasatake YAMATO }
139d4c6f1e6SMasatake YAMATO if (c != EOF || vStringLength (vs) > 0)
140d4c6f1e6SMasatake YAMATO {
141d4c6f1e6SMasatake YAMATO if (c == '\r')
142d4c6f1e6SMasatake YAMATO {
143d4c6f1e6SMasatake YAMATO c = fgetc (fp);
144d4c6f1e6SMasatake YAMATO if (c != '\n')
145d4c6f1e6SMasatake YAMATO c = ungetc (c, fp);
146d4c6f1e6SMasatake YAMATO }
147d4c6f1e6SMasatake YAMATO vStringStripTrailing (vs);
1482b171100SMasatake YAMATO vStringStripLeading (vs);
149*3f0fa2cfSAvinash Sonawane result = xMalloc (vStringLength (vs) + 1, char);
150d4c6f1e6SMasatake YAMATO strcpy (result, vStringValue (vs));
151d4c6f1e6SMasatake YAMATO }
152d4c6f1e6SMasatake YAMATO vStringDelete (vs);
153d4c6f1e6SMasatake YAMATO }
154d4c6f1e6SMasatake YAMATO return result;
155d4c6f1e6SMasatake YAMATO }
156d4c6f1e6SMasatake YAMATO
isCommentLine(char * line)157ce990805SThomas Braun static bool isCommentLine (char* line)
158d4c6f1e6SMasatake YAMATO {
159d4c6f1e6SMasatake YAMATO while (isspace(*line))
160d4c6f1e6SMasatake YAMATO ++line;
161d4c6f1e6SMasatake YAMATO return (*line == '#');
162d4c6f1e6SMasatake YAMATO }
163d4c6f1e6SMasatake YAMATO
isOptscriptLine(char * line)16484643a07SMasatake YAMATO static bool isOptscriptLine (char *line)
16584643a07SMasatake YAMATO {
16684643a07SMasatake YAMATO size_t len = strlen (line);
16784643a07SMasatake YAMATO if (len < 2)
16884643a07SMasatake YAMATO return false;
16984643a07SMasatake YAMATO if (line [len - 1] == '{' && line [len - 2] == '{')
17084643a07SMasatake YAMATO return true;
17184643a07SMasatake YAMATO return false;
17284643a07SMasatake YAMATO }
17384643a07SMasatake YAMATO
nextOptscriptLines(FILE * const fp,char * line)17484643a07SMasatake YAMATO static char* nextOptscriptLines (FILE* const fp, char *line)
17584643a07SMasatake YAMATO {
17684643a07SMasatake YAMATO vString *vstr = vStringNewInit (line);
17784643a07SMasatake YAMATO vStringPut (vstr, '\n');
17884643a07SMasatake YAMATO eFree (line);
17984643a07SMasatake YAMATO
18084643a07SMasatake YAMATO /* \n}}, \n=>1, }=>2, }=>3 */
18184643a07SMasatake YAMATO int endMarkers = 0;
18284643a07SMasatake YAMATO int c;
18384643a07SMasatake YAMATO while (true)
18484643a07SMasatake YAMATO {
18584643a07SMasatake YAMATO c = fgetc (fp);
18684643a07SMasatake YAMATO if (c == EOF)
18784643a07SMasatake YAMATO break;
18884643a07SMasatake YAMATO
18984643a07SMasatake YAMATO if (c == '\r' || c == '\n')
19084643a07SMasatake YAMATO {
19184643a07SMasatake YAMATO if (c == '\r')
19284643a07SMasatake YAMATO {
19384643a07SMasatake YAMATO c = fgetc (fp);
19484643a07SMasatake YAMATO if (c != '\n')
19584643a07SMasatake YAMATO {
19684643a07SMasatake YAMATO ungetc(c, fp);
19784643a07SMasatake YAMATO c = '\n';
19884643a07SMasatake YAMATO }
19984643a07SMasatake YAMATO }
20084643a07SMasatake YAMATO if (c == '\n')
20184643a07SMasatake YAMATO {
20284643a07SMasatake YAMATO vStringPut (vstr, c);
20384643a07SMasatake YAMATO if (endMarkers != 1)
20484643a07SMasatake YAMATO endMarkers = 1;
20584643a07SMasatake YAMATO }
20684643a07SMasatake YAMATO }
20784643a07SMasatake YAMATO else if (c == '}')
20884643a07SMasatake YAMATO {
20984643a07SMasatake YAMATO vStringPut (vstr, c);
21084643a07SMasatake YAMATO if (endMarkers == 1 || endMarkers == 2)
21184643a07SMasatake YAMATO endMarkers++;
21284643a07SMasatake YAMATO if (endMarkers == 3)
21384643a07SMasatake YAMATO break;
21484643a07SMasatake YAMATO }
21584643a07SMasatake YAMATO else
21684643a07SMasatake YAMATO {
21784643a07SMasatake YAMATO endMarkers = 0;
21884643a07SMasatake YAMATO vStringPut (vstr, c);
21984643a07SMasatake YAMATO }
22084643a07SMasatake YAMATO }
22184643a07SMasatake YAMATO
22284643a07SMasatake YAMATO if (c == EOF)
22384643a07SMasatake YAMATO {
22484643a07SMasatake YAMATO switch (endMarkers)
22584643a07SMasatake YAMATO {
22684643a07SMasatake YAMATO case 0:
22784643a07SMasatake YAMATO vStringPut (vstr, '\n');
22884643a07SMasatake YAMATO /* Fall through */
22984643a07SMasatake YAMATO case 1:
23084643a07SMasatake YAMATO vStringPut (vstr, '}');
23184643a07SMasatake YAMATO /* Fall through */
23284643a07SMasatake YAMATO case 2:
23384643a07SMasatake YAMATO vStringPut (vstr, '}');
23484643a07SMasatake YAMATO default:
23584643a07SMasatake YAMATO break;
23684643a07SMasatake YAMATO }
23784643a07SMasatake YAMATO }
23884643a07SMasatake YAMATO
23984643a07SMasatake YAMATO c = fgetc (fp);
24084643a07SMasatake YAMATO while (c != EOF)
24184643a07SMasatake YAMATO {
24284643a07SMasatake YAMATO if (c == '\n')
24384643a07SMasatake YAMATO break;
24484643a07SMasatake YAMATO if (c == '\r')
24584643a07SMasatake YAMATO {
24684643a07SMasatake YAMATO c = fgetc (fp);
24784643a07SMasatake YAMATO if (c == '\n')
24884643a07SMasatake YAMATO break;
24984643a07SMasatake YAMATO ungetc (c, fp);
25084643a07SMasatake YAMATO }
25184643a07SMasatake YAMATO c = fgetc (fp);
25284643a07SMasatake YAMATO }
25384643a07SMasatake YAMATO return vStringDeleteUnwrap (vstr);
25484643a07SMasatake YAMATO }
25584643a07SMasatake YAMATO
nextFileLineSkippingComments(FILE * const fp)256d4c6f1e6SMasatake YAMATO static char* nextFileLineSkippingComments (FILE* const fp)
257d4c6f1e6SMasatake YAMATO {
258d4c6f1e6SMasatake YAMATO char* result;
259ce990805SThomas Braun bool comment;
26084643a07SMasatake YAMATO bool optscript;
261d4c6f1e6SMasatake YAMATO
262d4c6f1e6SMasatake YAMATO do
263d4c6f1e6SMasatake YAMATO {
264d4c6f1e6SMasatake YAMATO result = nextFileLine (fp);
26584643a07SMasatake YAMATO comment = false;
26684643a07SMasatake YAMATO optscript = false;
26784643a07SMasatake YAMATO if (result)
26884643a07SMasatake YAMATO {
26984643a07SMasatake YAMATO comment = isCommentLine (result);
27084643a07SMasatake YAMATO optscript = isOptscriptLine (result);
27184643a07SMasatake YAMATO }
272d4c6f1e6SMasatake YAMATO if (comment)
273d4c6f1e6SMasatake YAMATO eFree (result);
27484643a07SMasatake YAMATO else if (optscript)
27584643a07SMasatake YAMATO result = nextOptscriptLines (fp, result);
276d4c6f1e6SMasatake YAMATO } while (comment);
27784643a07SMasatake YAMATO
278d4c6f1e6SMasatake YAMATO return result;
279d4c6f1e6SMasatake YAMATO }
280d4c6f1e6SMasatake YAMATO
nextFileString(const Arguments * const current,FILE * const fp)281d4c6f1e6SMasatake YAMATO static char* nextFileString (const Arguments* const current, FILE* const fp)
282d4c6f1e6SMasatake YAMATO {
283d4c6f1e6SMasatake YAMATO char* result;
284d4c6f1e6SMasatake YAMATO if (current->lineMode)
285d4c6f1e6SMasatake YAMATO result = nextFileLineSkippingComments (fp);
286d4c6f1e6SMasatake YAMATO else
287d4c6f1e6SMasatake YAMATO result = nextFileArg (fp);
288d4c6f1e6SMasatake YAMATO return result;
289d4c6f1e6SMasatake YAMATO }
290d4c6f1e6SMasatake YAMATO
argNewFromString(const char * const string)291d4c6f1e6SMasatake YAMATO extern Arguments* argNewFromString (const char* const string)
292d4c6f1e6SMasatake YAMATO {
293d4c6f1e6SMasatake YAMATO Arguments* result = xMalloc (1, Arguments);
294d4c6f1e6SMasatake YAMATO memset (result, 0, sizeof (Arguments));
295d4c6f1e6SMasatake YAMATO result->type = ARG_STRING;
296d4c6f1e6SMasatake YAMATO result->u.stringArgs.next = string;
297d4c6f1e6SMasatake YAMATO result->item = nextString (result, &result->u.stringArgs.next);
298d4c6f1e6SMasatake YAMATO return result;
299d4c6f1e6SMasatake YAMATO }
300d4c6f1e6SMasatake YAMATO
argNewFromArgv(char * const * const argv)301d4c6f1e6SMasatake YAMATO extern Arguments* argNewFromArgv (char* const* const argv)
302d4c6f1e6SMasatake YAMATO {
303d4c6f1e6SMasatake YAMATO Arguments* result = xMalloc (1, Arguments);
304d4c6f1e6SMasatake YAMATO memset (result, 0, sizeof (Arguments));
305d4c6f1e6SMasatake YAMATO result->type = ARG_ARGV;
306d4c6f1e6SMasatake YAMATO result->u.argvArgs.argv = argv;
307d4c6f1e6SMasatake YAMATO result->u.argvArgs.item = result->u.argvArgs.argv;
308d4c6f1e6SMasatake YAMATO result->item = *result->u.argvArgs.item;
309d4c6f1e6SMasatake YAMATO return result;
310d4c6f1e6SMasatake YAMATO }
311d4c6f1e6SMasatake YAMATO
argNewFromFile(FILE * const fp)312d4c6f1e6SMasatake YAMATO extern Arguments* argNewFromFile (FILE* const fp)
313d4c6f1e6SMasatake YAMATO {
314d4c6f1e6SMasatake YAMATO Arguments* result = xMalloc (1, Arguments);
315d4c6f1e6SMasatake YAMATO memset (result, 0, sizeof (Arguments));
316d4c6f1e6SMasatake YAMATO result->type = ARG_FILE;
317d4c6f1e6SMasatake YAMATO result->u.fileArgs.fp = fp;
318d4c6f1e6SMasatake YAMATO result->item = nextFileString (result, result->u.fileArgs.fp);
319d4c6f1e6SMasatake YAMATO return result;
320d4c6f1e6SMasatake YAMATO }
321d4c6f1e6SMasatake YAMATO
argNewFromLineFile(FILE * const fp)322d4c6f1e6SMasatake YAMATO extern Arguments* argNewFromLineFile (FILE* const fp)
323d4c6f1e6SMasatake YAMATO {
324d4c6f1e6SMasatake YAMATO Arguments* result = xMalloc (1, Arguments);
325d4c6f1e6SMasatake YAMATO memset (result, 0, sizeof (Arguments));
326d4c6f1e6SMasatake YAMATO result->type = ARG_FILE;
327ce990805SThomas Braun result->lineMode = true;
328d4c6f1e6SMasatake YAMATO result->u.fileArgs.fp = fp;
329d4c6f1e6SMasatake YAMATO result->item = nextFileString (result, result->u.fileArgs.fp);
330d4c6f1e6SMasatake YAMATO return result;
331d4c6f1e6SMasatake YAMATO }
332d4c6f1e6SMasatake YAMATO
argItem(const Arguments * const current)333d4c6f1e6SMasatake YAMATO extern char *argItem (const Arguments* const current)
334d4c6f1e6SMasatake YAMATO {
335d4c6f1e6SMasatake YAMATO Assert (current != NULL);
336d4c6f1e6SMasatake YAMATO Assert (! argOff (current));
337d4c6f1e6SMasatake YAMATO return current->item;
338d4c6f1e6SMasatake YAMATO }
339d4c6f1e6SMasatake YAMATO
argOff(const Arguments * const current)340ce990805SThomas Braun extern bool argOff (const Arguments* const current)
341d4c6f1e6SMasatake YAMATO {
342d4c6f1e6SMasatake YAMATO Assert (current != NULL);
343ce990805SThomas Braun return (bool) (current->item == NULL);
344d4c6f1e6SMasatake YAMATO }
345d4c6f1e6SMasatake YAMATO
argSetWordMode(Arguments * const current)346d4c6f1e6SMasatake YAMATO extern void argSetWordMode (Arguments* const current)
347d4c6f1e6SMasatake YAMATO {
348d4c6f1e6SMasatake YAMATO Assert (current != NULL);
349ce990805SThomas Braun current->lineMode = false;
350d4c6f1e6SMasatake YAMATO }
351d4c6f1e6SMasatake YAMATO
argSetLineMode(Arguments * const current)352d4c6f1e6SMasatake YAMATO extern void argSetLineMode (Arguments* const current)
353d4c6f1e6SMasatake YAMATO {
354d4c6f1e6SMasatake YAMATO Assert (current != NULL);
355ce990805SThomas Braun current->lineMode = true;
356d4c6f1e6SMasatake YAMATO }
357d4c6f1e6SMasatake YAMATO
argForth(Arguments * const current)358d4c6f1e6SMasatake YAMATO extern void argForth (Arguments* const current)
359d4c6f1e6SMasatake YAMATO {
360d4c6f1e6SMasatake YAMATO Assert (current != NULL);
361d4c6f1e6SMasatake YAMATO Assert (! argOff (current));
362d4c6f1e6SMasatake YAMATO switch (current->type)
363d4c6f1e6SMasatake YAMATO {
364d4c6f1e6SMasatake YAMATO case ARG_STRING:
365d4c6f1e6SMasatake YAMATO if (current->item != NULL)
366d4c6f1e6SMasatake YAMATO eFree (current->item);
367d4c6f1e6SMasatake YAMATO current->item = nextString (current, ¤t->u.stringArgs.next);
368d4c6f1e6SMasatake YAMATO break;
369d4c6f1e6SMasatake YAMATO case ARG_ARGV:
370d4c6f1e6SMasatake YAMATO ++current->u.argvArgs.item;
371d4c6f1e6SMasatake YAMATO current->item = *current->u.argvArgs.item;
372d4c6f1e6SMasatake YAMATO break;
373d4c6f1e6SMasatake YAMATO case ARG_FILE:
374d4c6f1e6SMasatake YAMATO if (current->item != NULL)
375d4c6f1e6SMasatake YAMATO eFree (current->item);
376d4c6f1e6SMasatake YAMATO current->item = nextFileString (current, current->u.fileArgs.fp);
377d4c6f1e6SMasatake YAMATO break;
378d4c6f1e6SMasatake YAMATO default:
379d4c6f1e6SMasatake YAMATO Assert ("Invalid argument type" == NULL);
380d4c6f1e6SMasatake YAMATO break;
381d4c6f1e6SMasatake YAMATO }
382d4c6f1e6SMasatake YAMATO }
383d4c6f1e6SMasatake YAMATO
argDelete(Arguments * const current)384d4c6f1e6SMasatake YAMATO extern void argDelete (Arguments* const current)
385d4c6f1e6SMasatake YAMATO {
386d4c6f1e6SMasatake YAMATO Assert (current != NULL);
38721221c0cSMasatake YAMATO if ((current->type == ARG_STRING
38821221c0cSMasatake YAMATO || current->type == ARG_FILE) && current->item != NULL)
389d4c6f1e6SMasatake YAMATO eFree (current->item);
390d4c6f1e6SMasatake YAMATO memset (current, 0, sizeof (Arguments));
391d4c6f1e6SMasatake YAMATO eFree (current);
392d4c6f1e6SMasatake YAMATO }
393