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

# User Rev Content
1 greg 1.1 #ifndef lint
2 greg 2.5 static const char RCSid[] = "$Id$";
3 greg 1.1 #endif
4     /*
5     * Routines for recognizing and moving about words in strings.
6 greg 2.5 *
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 greg 1.1 */
66    
67     #include <ctype.h>
68 greg 2.5 #include <string.h>
69 greg 1.1
70     #ifdef BSD
71     #define strchr index
72     #endif
73    
74    
75     char *
76 gwlarson 2.4 atos(rs, nb, s) /* get word from string, returning rs */
77 greg 1.2 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 gwlarson 2.4 }
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 greg 1.2 }
117    
118    
119     char *
120 greg 2.3 sskip(s) /* skip word in string, leaving on space */
121 greg 1.1 register char *s;
122     {
123     while (isspace(*s))
124     s++;
125     while (*s && !isspace(*s))
126 greg 2.2 s++;
127 greg 2.3 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 greg 2.2 while (isspace(*s))
137 greg 1.1 s++;
138 greg 2.3 while (n-- > 0) {
139     while (*s && !isspace(*s))
140     s++;
141     while (isspace(*s))
142     s++;
143     }
144 greg 1.1 return(s);
145     }
146    
147    
148     char *
149     iskip(s) /* skip integer in string */
150 greg 1.2 register char *s;
151 greg 1.1 {
152 greg 1.2 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 greg 1.1 }
163    
164    
165     char *
166     fskip(s) /* skip float in string */
167 greg 1.2 register char *s;
168 greg 1.1 {
169 greg 1.4 register char *cp;
170 greg 1.1
171 greg 1.4 while (isspace(*s))
172     s++;
173     if (*s == '-' || *s == '+')
174     s++;
175     cp = s;
176 greg 1.1 while (isdigit(*cp))
177     cp++;
178     if (*cp == '.') {
179 greg 1.2 cp++; s++;
180 greg 1.1 while (isdigit(*cp))
181     cp++;
182     }
183 greg 1.2 if (cp == s)
184     return(NULL);
185 greg 1.1 if (*cp == 'e' || *cp == 'E')
186     return(iskip(cp+1));
187     return(cp);
188     }
189    
190    
191 greg 2.5 int
192 greg 1.1 isint(s) /* check integer format */
193     char *s;
194     {
195     register char *cp;
196    
197     cp = iskip(s);
198 greg 1.2 return(cp != NULL && *cp == '\0');
199 greg 1.1 }
200    
201    
202 greg 2.5 int
203 greg 1.1 isintd(s, ds) /* check integer format with delimiter set */
204     char *s, *ds;
205     {
206     register char *cp;
207    
208     cp = iskip(s);
209 greg 1.3 return(cp != NULL && strchr(ds, *cp) != NULL);
210 greg 1.1 }
211    
212    
213 greg 2.5 int
214 greg 1.1 isflt(s) /* check float format */
215     char *s;
216     {
217     register char *cp;
218    
219     cp = fskip(s);
220 greg 1.2 return(cp != NULL && *cp == '\0');
221 greg 1.1 }
222    
223    
224 greg 2.5 int
225 greg 1.1 isfltd(s, ds) /* check integer format with delimiter set */
226     char *s, *ds;
227     {
228     register char *cp;
229    
230     cp = fskip(s);
231 greg 1.3 return(cp != NULL && strchr(ds, *cp) != NULL);
232 greg 1.1 }