ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/common/words.c
Revision: 2.5
Committed: Sat Feb 22 02:07:23 2003 UTC (21 years, 2 months ago) by greg
Content type: text/plain
Branch: MAIN
Changes since 2.4: +65 -8 lines
Log Message:
Changes and check-in for 3.5 release
Includes new source files and modifications not recorded for many years
See ray/doc/notes/ReleaseNotes for notes between 3.1 and 3.5 release

File Contents

# Content
1 #ifndef lint
2 static const char RCSid[] = "$Id$";
3 #endif
4 /*
5 * Routines for recognizing and moving about words in strings.
6 *
7 * External symbols declared in standard.h
8 */
9
10 /* ====================================================================
11 * The Radiance Software License, Version 1.0
12 *
13 * Copyright (c) 1990 - 2002 The Regents of the University of California,
14 * through Lawrence Berkeley National Laboratory. All rights reserved.
15 *
16 * Redistribution and use in source and binary forms, with or without
17 * modification, are permitted provided that the following conditions
18 * are met:
19 *
20 * 1. Redistributions of source code must retain the above copyright
21 * notice, this list of conditions and the following disclaimer.
22 *
23 * 2. Redistributions in binary form must reproduce the above copyright
24 * notice, this list of conditions and the following disclaimer in
25 * the documentation and/or other materials provided with the
26 * distribution.
27 *
28 * 3. The end-user documentation included with the redistribution,
29 * if any, must include the following acknowledgment:
30 * "This product includes Radiance software
31 * (http://radsite.lbl.gov/)
32 * developed by the Lawrence Berkeley National Laboratory
33 * (http://www.lbl.gov/)."
34 * Alternately, this acknowledgment may appear in the software itself,
35 * if and wherever such third-party acknowledgments normally appear.
36 *
37 * 4. The names "Radiance," "Lawrence Berkeley National Laboratory"
38 * and "The Regents of the University of California" must
39 * not be used to endorse or promote products derived from this
40 * software without prior written permission. For written
41 * permission, please contact [email protected].
42 *
43 * 5. Products derived from this software may not be called "Radiance",
44 * nor may "Radiance" appear in their name, without prior written
45 * permission of Lawrence Berkeley National Laboratory.
46 *
47 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
48 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
49 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
50 * DISCLAIMED. IN NO EVENT SHALL Lawrence Berkeley National Laboratory OR
51 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
52 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
53 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
54 * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
55 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
56 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
57 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
58 * SUCH DAMAGE.
59 * ====================================================================
60 *
61 * This software consists of voluntary contributions made by many
62 * individuals on behalf of Lawrence Berkeley National Laboratory. For more
63 * information on Lawrence Berkeley National Laboratory, please see
64 * <http://www.lbl.gov/>.
65 */
66
67 #include <ctype.h>
68 #include <string.h>
69
70 #ifdef BSD
71 #define strchr index
72 #endif
73
74
75 char *
76 atos(rs, nb, s) /* get word from string, returning rs */
77 char *rs;
78 register int nb;
79 register char *s;
80 {
81 register char *cp = rs;
82
83 while (isspace(*s))
84 s++;
85 while (--nb > 0 && *s && !isspace(*s))
86 *cp++ = *s++;
87 *cp = '\0';
88 return(rs);
89 }
90
91
92 char *
93 nextword(cp, nb, s) /* get (quoted) word, returning new s */
94 register char *cp;
95 register int nb;
96 register char *s;
97 {
98 int quote = 0;
99
100 if (s == NULL) return(NULL);
101 while (isspace(*s))
102 s++;
103 switch (*s) {
104 case '\0':
105 return(NULL);
106 case '"':
107 case '\'':
108 quote = *s++;
109 }
110 while (--nb > 0 && *s && (quote ? *s!=quote : !isspace(*s)))
111 *cp++ = *s++;
112 *cp = '\0';
113 if (quote && *s==quote)
114 s++;
115 return(s);
116 }
117
118
119 char *
120 sskip(s) /* skip word in string, leaving on space */
121 register char *s;
122 {
123 while (isspace(*s))
124 s++;
125 while (*s && !isspace(*s))
126 s++;
127 return(s);
128 }
129
130
131 char *
132 sskip2(s, n) /* skip word(s) in string, leaving on word */
133 register char *s;
134 register int n;
135 {
136 while (isspace(*s))
137 s++;
138 while (n-- > 0) {
139 while (*s && !isspace(*s))
140 s++;
141 while (isspace(*s))
142 s++;
143 }
144 return(s);
145 }
146
147
148 char *
149 iskip(s) /* skip integer in string */
150 register char *s;
151 {
152 while (isspace(*s))
153 s++;
154 if (*s == '-' || *s == '+')
155 s++;
156 if (!isdigit(*s))
157 return(NULL);
158 do
159 s++;
160 while (isdigit(*s));
161 return(s);
162 }
163
164
165 char *
166 fskip(s) /* skip float in string */
167 register char *s;
168 {
169 register char *cp;
170
171 while (isspace(*s))
172 s++;
173 if (*s == '-' || *s == '+')
174 s++;
175 cp = s;
176 while (isdigit(*cp))
177 cp++;
178 if (*cp == '.') {
179 cp++; s++;
180 while (isdigit(*cp))
181 cp++;
182 }
183 if (cp == s)
184 return(NULL);
185 if (*cp == 'e' || *cp == 'E')
186 return(iskip(cp+1));
187 return(cp);
188 }
189
190
191 int
192 isint(s) /* check integer format */
193 char *s;
194 {
195 register char *cp;
196
197 cp = iskip(s);
198 return(cp != NULL && *cp == '\0');
199 }
200
201
202 int
203 isintd(s, ds) /* check integer format with delimiter set */
204 char *s, *ds;
205 {
206 register char *cp;
207
208 cp = iskip(s);
209 return(cp != NULL && strchr(ds, *cp) != NULL);
210 }
211
212
213 int
214 isflt(s) /* check float format */
215 char *s;
216 {
217 register char *cp;
218
219 cp = fskip(s);
220 return(cp != NULL && *cp == '\0');
221 }
222
223
224 int
225 isfltd(s, ds) /* check integer format with delimiter set */
226 char *s, *ds;
227 {
228 register char *cp;
229
230 cp = fskip(s);
231 return(cp != NULL && strchr(ds, *cp) != NULL);
232 }