xref: /Universal-ctags/main/args.c (revision 3f0fa2cf1fd77f227cc9f09d0fe512db7502f808)
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, &current->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