2008-02-13 Johannes Schmid <jhs@gnome.org>
[anjuta-git-plugin.git] / tagmanager / args.c
blobfb9a1eed37b5810da82cf37d306fc5622de06e5f
1 /*
2 * $Id$
4 * Copyright (c) 1999-2002, Darren Hiebert
6 * This source code is released for free distribution under the terms of the
7 * GNU General Public License.
9 * This module contains functions for reading command line arguments.
13 * INCLUDE FILES
15 #include "general.h" /* must always come first */
17 #include <stdio.h>
18 #include <string.h>
19 #include <ctype.h>
21 #include "args.h"
22 #include "debug.h"
23 #include "routines.h"
26 * FUNCTION DEFINITIONS
29 static char *nextStringArg (const char** const next)
31 char* result = NULL;
32 const char* start;
34 Assert (*next != NULL);
35 for (start = *next ; isspace ((int) *start) ; ++start)
37 if (*start == '\0')
38 *next = start;
39 else
41 size_t length;
42 const char* end;
44 for (end = start ; *end != '\0' && ! isspace ((int) *end) ; ++end)
46 length = end - start;
47 Assert (length > 0);
48 result = xMalloc (length + 1, char);
49 strncpy (result, start, length);
50 result [length] = '\0';
51 *next = end;
53 return result;
56 static char* nextStringLine (const char** const next)
58 char* result = NULL;
59 size_t length;
60 const char* end;
62 Assert (*next != NULL);
63 for (end = *next ; *end != '\n' && *end != '\0' ; ++end)
65 length = end - *next;
66 if (length > 0)
68 result = xMalloc (length + 1, char);
69 strncpy (result, *next, length);
70 result [length] = '\0';
72 if (*end == '\n')
73 ++end;
74 else if (*end == '\r')
76 ++end;
77 if (*end == '\n')
78 ++end;
80 *next = end;
81 return result;
84 static char* nextString (const Arguments* const current, const char** const next)
86 char* result;
87 if (current->lineMode)
88 result = nextStringLine (next);
89 else
90 result = nextStringArg (next);
91 return result;
94 static char* nextFileArg (FILE* const fp)
96 char* result = NULL;
97 Assert (fp != NULL);
98 if (! feof (fp))
100 vString* vs = vStringNew ();
101 int c;
103 c = fgetc (fp);
104 while (isspace (c));
106 if (c != EOF)
110 vStringPut (vs, c);
111 c = fgetc (fp);
112 } while (c != EOF && ! isspace (c));
113 vStringTerminate (vs);
114 Assert (vStringLength (vs) > 0);
115 result = xMalloc (vStringLength (vs) + 1, char);
116 strcpy (result, vStringValue (vs));
118 vStringDelete (vs);
120 return result;
123 static char* nextFileLine (FILE* const fp)
125 char* result = NULL;
126 if (! feof (fp))
128 vString* vs = vStringNew ();
129 int c;
131 Assert (fp != NULL);
132 c = fgetc (fp);
133 while (c != EOF)
135 if (c != '\n' && c != '\r')
136 vStringPut (vs, c);
137 else if (vStringLength (vs) > 0)
138 break;
139 c = fgetc (fp);
141 if (c != EOF || vStringLength (vs) > 0)
143 if (c == '\r')
145 c = fgetc (fp);
146 if (c != '\n')
147 c = ungetc (c, fp);
149 vStringTerminate (vs);
150 result = xMalloc (vStringLength (vs) + 1, char);
151 strcpy (result, vStringValue (vs));
152 vStringDelete (vs);
155 return result;
158 static char* nextFileString (const Arguments* const current, FILE* const fp)
160 char* result;
161 if (current->lineMode)
162 result = nextFileLine (fp);
163 else
164 result = nextFileArg (fp);
165 return result;
168 extern Arguments* argNewFromString (const char* const string)
170 Arguments* result = xMalloc (1, Arguments);
171 memset (result, 0, sizeof (Arguments));
172 result->type = ARG_STRING;
173 result->u.stringArgs.string = string;
174 result->u.stringArgs.item = string;
175 result->u.stringArgs.next = string;
176 result->item = nextString (result, &result->u.stringArgs.next);
177 return result;
180 extern Arguments* argNewFromArgv (char* const* const argv)
182 Arguments* result = xMalloc (1, Arguments);
183 memset (result, 0, sizeof (Arguments));
184 result->type = ARG_ARGV;
185 result->u.argvArgs.argv = argv;
186 result->u.argvArgs.item = result->u.argvArgs.argv;
187 result->item = *result->u.argvArgs.item;
188 return result;
191 extern Arguments* argNewFromFile (FILE* const fp)
193 Arguments* result = xMalloc (1, Arguments);
194 memset (result, 0, sizeof (Arguments));
195 result->type = ARG_FILE;
196 result->u.fileArgs.fp = fp;
197 result->item = nextFileString (result, result->u.fileArgs.fp);
198 return result;
201 extern Arguments* argNewFromLineFile (FILE* const fp)
203 Arguments* result = xMalloc (1, Arguments);
204 memset (result, 0, sizeof (Arguments));
205 result->type = ARG_FILE;
206 result->lineMode = TRUE;
207 result->u.fileArgs.fp = fp;
208 result->item = nextFileString (result, result->u.fileArgs.fp);
209 return result;
212 extern char *argItem (const Arguments* const current)
214 Assert (current != NULL);
215 Assert (! argOff (current));
216 return current->item;
219 extern boolean argOff (const Arguments* const current)
221 Assert (current != NULL);
222 return (boolean) (current->item == NULL);
225 extern void argSetWordMode (Arguments* const current)
227 Assert (current != NULL);
228 current->lineMode = FALSE;
231 extern void argSetLineMode (Arguments* const current)
233 Assert (current != NULL);
234 current->lineMode = TRUE;
237 extern void argForth (Arguments* const current)
239 Assert (current != NULL);
240 Assert (! argOff (current));
241 switch (current->type)
243 case ARG_STRING:
244 if (current->item != NULL)
245 eFree (current->item);
246 current->u.stringArgs.item = current->u.stringArgs.next;
247 current->item = nextString (current, &current->u.stringArgs.next);
248 break;
249 case ARG_ARGV:
250 ++current->u.argvArgs.item;
251 current->item = *current->u.argvArgs.item;
252 break;
253 case ARG_FILE:
254 if (current->item != NULL)
255 eFree (current->item);
256 current->item = nextFileString (current, current->u.fileArgs.fp);
257 break;
258 default:
259 Assert ("Invalid argument type" == NULL);
260 break;
264 extern void argDelete (Arguments* const current)
266 Assert (current != NULL);
267 if (current->type == ARG_STRING && current->item != NULL)
268 eFree (current->item);
269 memset (current, 0, sizeof (Arguments));
270 eFree (current);
273 /* vi:set tabstop=4 shiftwidth=4: */