ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/common/words.c
Revision: 2.10
Committed: Fri Feb 18 00:40:25 2011 UTC (13 years, 2 months ago) by greg
Content type: text/plain
Branch: MAIN
Changes since 2.9: +24 -26 lines
Log Message:
Major code reorg, moving mgflib to common and introducing BSDF material

File Contents

# Content
1 #ifndef lint
2 static const char RCSid[] = "$Id: words.c,v 2.9 2004/09/28 17:54:18 greg Exp $";
3 #endif
4 /*
5 * Routines for recognizing and moving about words in strings.
6 *
7 * External symbols declared in standard.h
8 */
9
10 #include "copyright.h"
11
12 #include <ctype.h>
13 #include <string.h>
14
15 #include "rtio.h"
16
17 char *
18 atos(char *rs, int nb, char *s) /* get word from string, returning rs */
19 {
20 register char *cp = rs;
21
22 while (isspace(*s))
23 s++;
24 while (--nb > 0 && *s && !isspace(*s))
25 *cp++ = *s++;
26 *cp = '\0';
27 return(rs);
28 }
29
30
31 char *
32 nextword(char *cp, int nb, char *s) /* get (quoted) word, returning new s */
33 {
34 int quote = 0;
35
36 if (s == NULL) return(NULL);
37 while (isspace(*s))
38 s++;
39 switch (*s) {
40 case '\0':
41 return(NULL);
42 case '"':
43 case '\'':
44 quote = *s++;
45 }
46 while (--nb > 0 && *s && (quote ? *s!=quote : !isspace(*s)))
47 *cp++ = *s++;
48 *cp = '\0';
49 if (quote && *s==quote)
50 s++;
51 return(s);
52 }
53
54
55 char *
56 sskip(char *s) /* skip word in string, leaving on space */
57 {
58 while (isspace(*s))
59 s++;
60 while (*s && !isspace(*s))
61 s++;
62 return(s);
63 }
64
65
66 char *
67 sskip2(char *s, int n) /* skip word(s) in string, leaving on word */
68 {
69 while (isspace(*s))
70 s++;
71 while (n-- > 0) {
72 while (*s && !isspace(*s))
73 s++;
74 while (isspace(*s))
75 s++;
76 }
77 return(s);
78 }
79
80
81 char *
82 iskip(char *s) /* skip integer in string */
83 {
84 while (isspace(*s))
85 s++;
86 if (*s == '-' || *s == '+')
87 s++;
88 if (!isdigit(*s))
89 return(NULL);
90 do
91 s++;
92 while (isdigit(*s));
93 return(s);
94 }
95
96
97 char *
98 fskip(char *s) /* skip float in string */
99 {
100 register char *cp;
101
102 while (isspace(*s))
103 s++;
104 if (*s == '-' || *s == '+')
105 s++;
106 cp = s;
107 while (isdigit(*cp))
108 cp++;
109 if (*cp == '.') {
110 cp++; s++;
111 while (isdigit(*cp))
112 cp++;
113 }
114 if (cp == s)
115 return(NULL);
116 if (*cp == 'e' || *cp == 'E')
117 return(iskip(cp+1));
118 return(cp);
119 }
120
121
122 int
123 isint(char *s) /* check integer format */
124 {
125 register char *cp;
126
127 cp = iskip(s);
128 return(cp != NULL && *cp == '\0');
129 }
130
131
132 int
133 isintd(char *s, char *ds) /* check integer format with delimiter set */
134 {
135 register char *cp;
136
137 cp = iskip(s);
138 return(cp != NULL && strchr(ds, *cp) != NULL);
139 }
140
141
142 int
143 isflt(char *s) /* check float format */
144 {
145 register char *cp;
146
147 cp = fskip(s);
148 return(cp != NULL && *cp == '\0');
149 }
150
151
152 int
153 isfltd(char *s, char *ds) /* check integer format with delimiter set */
154 {
155 register char *cp;
156
157 cp = fskip(s);
158 return(cp != NULL && strchr(ds, *cp) != NULL);
159 }
160
161
162 int
163 isname(char *s) /* check for legal identifier name */
164 {
165 while (*s == '_') /* skip leading underscores */
166 s++;
167 if (!isascii(*s) || !isalpha(*s)) /* start with a letter */
168 return(0);
169 while (isascii(*++s) && isgraph(*s)) /* all visible characters */
170 ;
171 return(*s == '\0'); /* ending in nul */
172 }