annotate 3rdparty/packages/uucpbb/src/parse.c @ 1772:5ba8e711a1a3

source added
author boisy
date Fri, 01 Apr 2005 22:04:25 +0000
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1772
5ba8e711a1a3 source added
boisy
parents:
diff changeset
1 /* getargs.c
5ba8e711a1a3 source added
boisy
parents:
diff changeset
2
5ba8e711a1a3 source added
boisy
parents:
diff changeset
3 This replaces the original parse.c. It is little more compact and with
5ba8e711a1a3 source added
boisy
parents:
diff changeset
4 a minor change it will parse quoted or unquoted arguments (double quotes,
5ba8e711a1a3 source added
boisy
parents:
diff changeset
5 ("). If there is nothing between two sets of quotes (""), the field is
5ba8e711a1a3 source added
boisy
parents:
diff changeset
6 replaced with the '\0' character and parsing continues. This routine was
5ba8e711a1a3 source added
boisy
parents:
diff changeset
7 originally posted to comp.lang.c by Steve Summit <scs@eskimo.c>. Thanks
5ba8e711a1a3 source added
boisy
parents:
diff changeset
8 to Steve for his okey dokey to use it in UUCPbb.
5ba8e711a1a3 source added
boisy
parents:
diff changeset
9
5ba8e711a1a3 source added
boisy
parents:
diff changeset
10 Quote and OS-9 mods by Bob Billson <bob@kc2wz.bubble.org> (REB)
5ba8e711a1a3 source added
boisy
parents:
diff changeset
11 */
5ba8e711a1a3 source added
boisy
parents:
diff changeset
12
5ba8e711a1a3 source added
boisy
parents:
diff changeset
13 /*
5ba8e711a1a3 source added
boisy
parents:
diff changeset
14 * takes a string (line) and builds an array of pointers to each word in it.
5ba8e711a1a3 source added
boisy
parents:
diff changeset
15 * words are separated by spaces or any control characters. At most maxargs
5ba8e711a1a3 source added
boisy
parents:
diff changeset
16 * pointers are calculated. \0's are inserted in line, so that each word
5ba8e711a1a3 source added
boisy
parents:
diff changeset
17 * becomes a string in its own right. The number of pointers (argc) is
5ba8e711a1a3 source added
boisy
parents:
diff changeset
18 * returned.
5ba8e711a1a3 source added
boisy
parents:
diff changeset
19 */
5ba8e711a1a3 source added
boisy
parents:
diff changeset
20
5ba8e711a1a3 source added
boisy
parents:
diff changeset
21 #ifndef ORIGINAL
5ba8e711a1a3 source added
boisy
parents:
diff changeset
22 #include "uucp.h"
5ba8e711a1a3 source added
boisy
parents:
diff changeset
23 #else
5ba8e711a1a3 source added
boisy
parents:
diff changeset
24 #include <stdio.h>
5ba8e711a1a3 source added
boisy
parents:
diff changeset
25 #endif
5ba8e711a1a3 source added
boisy
parents:
diff changeset
26
5ba8e711a1a3 source added
boisy
parents:
diff changeset
27 #ifndef ORIGINAL
5ba8e711a1a3 source added
boisy
parents:
diff changeset
28 #define iswhite(c) ((c)==' ' || (c)=='\t' || (c)=='\x0D' || (c)=='\x0A')
5ba8e711a1a3 source added
boisy
parents:
diff changeset
29 #else
5ba8e711a1a3 source added
boisy
parents:
diff changeset
30 #define iswhite(c) ((c)==' ' || (c)=='\t' || (c)=='\n') /* original code */
5ba8e711a1a3 source added
boisy
parents:
diff changeset
31 #endif
5ba8e711a1a3 source added
boisy
parents:
diff changeset
32
5ba8e711a1a3 source added
boisy
parents:
diff changeset
33 int getargs(argv, line, maxargs)
5ba8e711a1a3 source added
boisy
parents:
diff changeset
34 #ifndef ORIGINAL
5ba8e711a1a3 source added
boisy
parents:
diff changeset
35 char *argv[];
5ba8e711a1a3 source added
boisy
parents:
diff changeset
36 register char *line;
5ba8e711a1a3 source added
boisy
parents:
diff changeset
37 #else
5ba8e711a1a3 source added
boisy
parents:
diff changeset
38 register char *argv[];
5ba8e711a1a3 source added
boisy
parents:
diff changeset
39 register char *line;
5ba8e711a1a3 source added
boisy
parents:
diff changeset
40 #endif
5ba8e711a1a3 source added
boisy
parents:
diff changeset
41 int maxargs;
5ba8e711a1a3 source added
boisy
parents:
diff changeset
42 {
5ba8e711a1a3 source added
boisy
parents:
diff changeset
43 register int nargs = 0;
5ba8e711a1a3 source added
boisy
parents:
diff changeset
44 int firstquote = FALSE; /* added REB */
5ba8e711a1a3 source added
boisy
parents:
diff changeset
45
5ba8e711a1a3 source added
boisy
parents:
diff changeset
46 for(;;)
5ba8e711a1a3 source added
boisy
parents:
diff changeset
47 {
5ba8e711a1a3 source added
boisy
parents:
diff changeset
48 while(iswhite(*line))
5ba8e711a1a3 source added
boisy
parents:
diff changeset
49 line++;
5ba8e711a1a3 source added
boisy
parents:
diff changeset
50
5ba8e711a1a3 source added
boisy
parents:
diff changeset
51 if(*line == '\0')
5ba8e711a1a3 source added
boisy
parents:
diff changeset
52 {
5ba8e711a1a3 source added
boisy
parents:
diff changeset
53 if(nargs < maxargs) *argv = NULL;
5ba8e711a1a3 source added
boisy
parents:
diff changeset
54 return(nargs);
5ba8e711a1a3 source added
boisy
parents:
diff changeset
55 }
5ba8e711a1a3 source added
boisy
parents:
diff changeset
56 #ifndef ORIGINAL
5ba8e711a1a3 source added
boisy
parents:
diff changeset
57 if (*line == '"' && !firstquote) /* added REB */
5ba8e711a1a3 source added
boisy
parents:
diff changeset
58 {
5ba8e711a1a3 source added
boisy
parents:
diff changeset
59 firstquote = TRUE;
5ba8e711a1a3 source added
boisy
parents:
diff changeset
60 line++;
5ba8e711a1a3 source added
boisy
parents:
diff changeset
61 }
5ba8e711a1a3 source added
boisy
parents:
diff changeset
62 #endif
5ba8e711a1a3 source added
boisy
parents:
diff changeset
63 *argv++ = line;
5ba8e711a1a3 source added
boisy
parents:
diff changeset
64 nargs++;
5ba8e711a1a3 source added
boisy
parents:
diff changeset
65
5ba8e711a1a3 source added
boisy
parents:
diff changeset
66 #ifndef ORIGINAL
5ba8e711a1a3 source added
boisy
parents:
diff changeset
67 while (((!firstquote && !iswhite(*line)) /* added REB */
5ba8e711a1a3 source added
boisy
parents:
diff changeset
68 || (firstquote && *line != '"')) && *line != '\0')
5ba8e711a1a3 source added
boisy
parents:
diff changeset
69 #else
5ba8e711a1a3 source added
boisy
parents:
diff changeset
70 while(!iswhite(*line) && *line != '\0')
5ba8e711a1a3 source added
boisy
parents:
diff changeset
71 #endif
5ba8e711a1a3 source added
boisy
parents:
diff changeset
72 line++;
5ba8e711a1a3 source added
boisy
parents:
diff changeset
73
5ba8e711a1a3 source added
boisy
parents:
diff changeset
74 if(*line == '\0')
5ba8e711a1a3 source added
boisy
parents:
diff changeset
75 {
5ba8e711a1a3 source added
boisy
parents:
diff changeset
76 if(nargs < maxargs) *argv = NULL;
5ba8e711a1a3 source added
boisy
parents:
diff changeset
77 return(nargs);
5ba8e711a1a3 source added
boisy
parents:
diff changeset
78 }
5ba8e711a1a3 source added
boisy
parents:
diff changeset
79
5ba8e711a1a3 source added
boisy
parents:
diff changeset
80 #ifndef ORIGINAL
5ba8e711a1a3 source added
boisy
parents:
diff changeset
81 if(*line == '"') /* added REB */
5ba8e711a1a3 source added
boisy
parents:
diff changeset
82 firstquote = FALSE;
5ba8e711a1a3 source added
boisy
parents:
diff changeset
83 #endif
5ba8e711a1a3 source added
boisy
parents:
diff changeset
84
5ba8e711a1a3 source added
boisy
parents:
diff changeset
85 *line++ = '\0';
5ba8e711a1a3 source added
boisy
parents:
diff changeset
86 if(nargs == maxargs) return(nargs);
5ba8e711a1a3 source added
boisy
parents:
diff changeset
87 }
5ba8e711a1a3 source added
boisy
parents:
diff changeset
88 }
5ba8e711a1a3 source added
boisy
parents:
diff changeset
89
5ba8e711a1a3 source added
boisy
parents:
diff changeset
90
5ba8e711a1a3 source added
boisy
parents:
diff changeset
91
5ba8e711a1a3 source added
boisy
parents:
diff changeset
92 /************************************************************
5ba8e711a1a3 source added
boisy
parents:
diff changeset
93 ************************************************************
5ba8e711a1a3 source added
boisy
parents:
diff changeset
94 *** The following code is not part of getargs.c. This ***
5ba8e711a1a3 source added
boisy
parents:
diff changeset
95 *** code IS covered by the GNU General Public license. ***
5ba8e711a1a3 source added
boisy
parents:
diff changeset
96 ************************************************************
5ba8e711a1a3 source added
boisy
parents:
diff changeset
97 ************************************************************/
5ba8e711a1a3 source added
boisy
parents:
diff changeset
98
5ba8e711a1a3 source added
boisy
parents:
diff changeset
99 /* parse.c Routines to deal with parsing passed strings.
5ba8e711a1a3 source added
boisy
parents:
diff changeset
100 Copyright (C) 1990, 1993 Rick Adams and Bob Billson
5ba8e711a1a3 source added
boisy
parents:
diff changeset
101
5ba8e711a1a3 source added
boisy
parents:
diff changeset
102 This file is part of the OS-9 UUCP package, UUCPbb.
5ba8e711a1a3 source added
boisy
parents:
diff changeset
103
5ba8e711a1a3 source added
boisy
parents:
diff changeset
104 This program is free software; you can redistribute it and/or modify
5ba8e711a1a3 source added
boisy
parents:
diff changeset
105 it under the terms of the GNU General Public License as published by
5ba8e711a1a3 source added
boisy
parents:
diff changeset
106 the Free Software Foundation; either version 2 of the License, or
5ba8e711a1a3 source added
boisy
parents:
diff changeset
107 (at your option) any later version.
5ba8e711a1a3 source added
boisy
parents:
diff changeset
108
5ba8e711a1a3 source added
boisy
parents:
diff changeset
109 This program is distributed in the hope that it will be useful,
5ba8e711a1a3 source added
boisy
parents:
diff changeset
110 but WITHOUT ANY WARRANTY; without even the implied warranty of
5ba8e711a1a3 source added
boisy
parents:
diff changeset
111 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
5ba8e711a1a3 source added
boisy
parents:
diff changeset
112 GNU General Public License for more details.
5ba8e711a1a3 source added
boisy
parents:
diff changeset
113
5ba8e711a1a3 source added
boisy
parents:
diff changeset
114 You should have received a copy of the GNU General Public License
5ba8e711a1a3 source added
boisy
parents:
diff changeset
115 along with this program; if not, write to the Free Software
5ba8e711a1a3 source added
boisy
parents:
diff changeset
116 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
5ba8e711a1a3 source added
boisy
parents:
diff changeset
117
5ba8e711a1a3 source added
boisy
parents:
diff changeset
118 The author of UUCPbb, Bob Billson, can be contacted at:
5ba8e711a1a3 source added
boisy
parents:
diff changeset
119 bob@kc2wz.bubble.org or uunet!kc2wz!bob or by snail mail:
5ba8e711a1a3 source added
boisy
parents:
diff changeset
120 21 Bates Way, Westfield, NJ 07090
5ba8e711a1a3 source added
boisy
parents:
diff changeset
121 */
5ba8e711a1a3 source added
boisy
parents:
diff changeset
122
5ba8e711a1a3 source added
boisy
parents:
diff changeset
123 /* Returns pointer to first non-whitespace character in string pointed to by
5ba8e711a1a3 source added
boisy
parents:
diff changeset
124 string. Added --REB */
5ba8e711a1a3 source added
boisy
parents:
diff changeset
125
5ba8e711a1a3 source added
boisy
parents:
diff changeset
126 char *skipspace (string)
5ba8e711a1a3 source added
boisy
parents:
diff changeset
127 char *string;
5ba8e711a1a3 source added
boisy
parents:
diff changeset
128 {
5ba8e711a1a3 source added
boisy
parents:
diff changeset
129 register char *p;
5ba8e711a1a3 source added
boisy
parents:
diff changeset
130
5ba8e711a1a3 source added
boisy
parents:
diff changeset
131 p = string;
5ba8e711a1a3 source added
boisy
parents:
diff changeset
132
5ba8e711a1a3 source added
boisy
parents:
diff changeset
133 while (iswhite (*p))
5ba8e711a1a3 source added
boisy
parents:
diff changeset
134 p++;
5ba8e711a1a3 source added
boisy
parents:
diff changeset
135
5ba8e711a1a3 source added
boisy
parents:
diff changeset
136 return (p);
5ba8e711a1a3 source added
boisy
parents:
diff changeset
137 }
5ba8e711a1a3 source added
boisy
parents:
diff changeset
138
5ba8e711a1a3 source added
boisy
parents:
diff changeset
139
5ba8e711a1a3 source added
boisy
parents:
diff changeset
140
5ba8e711a1a3 source added
boisy
parents:
diff changeset
141 /* Parse command line parameters. Broken out of docmd.c. Originally, this
5ba8e711a1a3 source added
boisy
parents:
diff changeset
142 was part of docmd.c. It was split into a separate file because it is
5ba8e711a1a3 source added
boisy
parents:
diff changeset
143 needed in osk.c as well. All the modules which link osk.c do not
5ba8e711a1a3 source added
boisy
parents:
diff changeset
144 necessarily link docmd.c as well.
5ba8e711a1a3 source added
boisy
parents:
diff changeset
145
5ba8e711a1a3 source added
boisy
parents:
diff changeset
146 Modified for OSK -- BGP
5ba8e711a1a3 source added
boisy
parents:
diff changeset
147 */
5ba8e711a1a3 source added
boisy
parents:
diff changeset
148
5ba8e711a1a3 source added
boisy
parents:
diff changeset
149 #ifdef _OSK
5ba8e711a1a3 source added
boisy
parents:
diff changeset
150 /* Parse the command passed us under OSK */
5ba8e711a1a3 source added
boisy
parents:
diff changeset
151
5ba8e711a1a3 source added
boisy
parents:
diff changeset
152 int parse_cmd (argvect, string)
5ba8e711a1a3 source added
boisy
parents:
diff changeset
153 char **argvect;
5ba8e711a1a3 source added
boisy
parents:
diff changeset
154 char *string;
5ba8e711a1a3 source added
boisy
parents:
diff changeset
155 {
5ba8e711a1a3 source added
boisy
parents:
diff changeset
156 char *p, delimit;
5ba8e711a1a3 source added
boisy
parents:
diff changeset
157 int count = -1;
5ba8e711a1a3 source added
boisy
parents:
diff changeset
158
5ba8e711a1a3 source added
boisy
parents:
diff changeset
159 p = string;
5ba8e711a1a3 source added
boisy
parents:
diff changeset
160 do
5ba8e711a1a3 source added
boisy
parents:
diff changeset
161 {
5ba8e711a1a3 source added
boisy
parents:
diff changeset
162 p = skipspace (p); /* skip leading spaces */
5ba8e711a1a3 source added
boisy
parents:
diff changeset
163
5ba8e711a1a3 source added
boisy
parents:
diff changeset
164 if (*p == '\"')
5ba8e711a1a3 source added
boisy
parents:
diff changeset
165 delimit = *(p++); /* quote is delimiter */
5ba8e711a1a3 source added
boisy
parents:
diff changeset
166 else
5ba8e711a1a3 source added
boisy
parents:
diff changeset
167 delimit = ' '; /* space is delimiter */
5ba8e711a1a3 source added
boisy
parents:
diff changeset
168
5ba8e711a1a3 source added
boisy
parents:
diff changeset
169 argvect[++count] = p;
5ba8e711a1a3 source added
boisy
parents:
diff changeset
170
5ba8e711a1a3 source added
boisy
parents:
diff changeset
171 /* include all between */
5ba8e711a1a3 source added
boisy
parents:
diff changeset
172 while (*(++p) != delimit && *p != '\0');
5ba8e711a1a3 source added
boisy
parents:
diff changeset
173 if (*p == '\0')
5ba8e711a1a3 source added
boisy
parents:
diff changeset
174 --p;
5ba8e711a1a3 source added
boisy
parents:
diff changeset
175 else
5ba8e711a1a3 source added
boisy
parents:
diff changeset
176 *p = '\0';
5ba8e711a1a3 source added
boisy
parents:
diff changeset
177 }
5ba8e711a1a3 source added
boisy
parents:
diff changeset
178 while (*(++p) != '\0');
5ba8e711a1a3 source added
boisy
parents:
diff changeset
179
5ba8e711a1a3 source added
boisy
parents:
diff changeset
180 argvect[++count] = NULL; /* NULL terminate last */
5ba8e711a1a3 source added
boisy
parents:
diff changeset
181 }
5ba8e711a1a3 source added
boisy
parents:
diff changeset
182
5ba8e711a1a3 source added
boisy
parents:
diff changeset
183 #else
5ba8e711a1a3 source added
boisy
parents:
diff changeset
184 /* Parse the command passed us under OS-9/6809 */
5ba8e711a1a3 source added
boisy
parents:
diff changeset
185
5ba8e711a1a3 source added
boisy
parents:
diff changeset
186 char *parse_cmd (cmd)
5ba8e711a1a3 source added
boisy
parents:
diff changeset
187 char *cmd;
5ba8e711a1a3 source added
boisy
parents:
diff changeset
188 {
5ba8e711a1a3 source added
boisy
parents:
diff changeset
189 register char *p;
5ba8e711a1a3 source added
boisy
parents:
diff changeset
190
5ba8e711a1a3 source added
boisy
parents:
diff changeset
191 /* Make sure command line end with a \n */
5ba8e711a1a3 source added
boisy
parents:
diff changeset
192 if ((p = strchr (cmd, '\n')) == NULL)
5ba8e711a1a3 source added
boisy
parents:
diff changeset
193 strcat (cmd, "\n");
5ba8e711a1a3 source added
boisy
parents:
diff changeset
194
5ba8e711a1a3 source added
boisy
parents:
diff changeset
195 /* Return a pointer to the command line parameters or the \n if there are
5ba8e711a1a3 source added
boisy
parents:
diff changeset
196 no parameters. */
5ba8e711a1a3 source added
boisy
parents:
diff changeset
197
5ba8e711a1a3 source added
boisy
parents:
diff changeset
198 if ((p = strchr (cmd, ' ')) != NULL)
5ba8e711a1a3 source added
boisy
parents:
diff changeset
199 *p++ = '\0';
5ba8e711a1a3 source added
boisy
parents:
diff changeset
200 else
5ba8e711a1a3 source added
boisy
parents:
diff changeset
201 p = cmd + strlen (cmd) - 1;
5ba8e711a1a3 source added
boisy
parents:
diff changeset
202
5ba8e711a1a3 source added
boisy
parents:
diff changeset
203 return (p);
5ba8e711a1a3 source added
boisy
parents:
diff changeset
204 }
5ba8e711a1a3 source added
boisy
parents:
diff changeset
205 #endif