ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/common/words.c
Revision: 2.12
Committed: Sat Dec 28 18:05:14 2019 UTC (4 years, 4 months ago) by greg
Content type: text/plain
Branch: MAIN
CVS Tags: rad5R3
Changes since 2.11: +1 -2 lines
Log Message:
Removed redundant include files

File Contents

# Content
1 #ifndef lint
2 static const char RCSid[] = "$Id: words.c,v 2.11 2011/04/28 17:46:25 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 if ((*s == '-') | (*s == '+'))
86 s++;
87 if (!isdigit(*s))
88 return(NULL);
89 do
90 s++;
91 while (isdigit(*s));
92 return(s);
93 }
94
95
96 char *
97 fskip(char *s) /* skip float in string */
98 {
99 char *cp;
100
101 while (isspace(*s))
102 s++;
103 if ((*s == '-') | (*s == '+'))
104 s++;
105 cp = s;
106 while (isdigit(*cp))
107 cp++;
108 if (*cp == '.') {
109 cp++; s++;
110 while (isdigit(*cp))
111 cp++;
112 }
113 if (cp == s)
114 return(NULL);
115 if ((*cp == 'e') | (*cp == 'E'))
116 return(isspace(*++cp) ? NULL : iskip(cp));
117 return(cp);
118 }
119
120
121 int
122 isint(char *s) /* check integer format */
123 {
124 char *cp;
125
126 cp = iskip(s);
127 return(cp != NULL && *cp == '\0');
128 }
129
130
131 int
132 isintd(char *s, char *ds) /* check integer format with delimiter set */
133 {
134 char *cp;
135
136 cp = iskip(s);
137 return(cp != NULL && strchr(ds, *cp) != NULL);
138 }
139
140
141 int
142 isflt(char *s) /* check float format */
143 {
144 char *cp;
145
146 cp = fskip(s);
147 return(cp != NULL && *cp == '\0');
148 }
149
150
151 int
152 isfltd(char *s, char *ds) /* check integer format with delimiter set */
153 {
154 char *cp;
155
156 cp = fskip(s);
157 return(cp != NULL && strchr(ds, *cp) != NULL);
158 }
159
160
161 int
162 isname(char *s) /* check for legal identifier name */
163 {
164 while (*s == '_') /* skip leading underscores */
165 s++;
166 if (!isascii(*s) || !isalpha(*s)) /* start with a letter */
167 return(0);
168 while (isascii(*++s) && isgraph(*s)) /* all visible characters */
169 ;
170 return(*s == '\0'); /* ending in nul */
171 }