ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/common/words.c
Revision: 2.13
Committed: Fri Jan 1 02:10:32 2021 UTC (3 years, 3 months ago) by greg
Content type: text/plain
Branch: MAIN
CVS Tags: rad5R4, HEAD
Changes since 2.12: +4 -6 lines
Log Message:
perf: insignificant branch reduction

File Contents

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