ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/common/words.c
Revision: 2.11
Committed: Thu Apr 28 17:46:25 2011 UTC (12 years, 11 months ago) by greg
Content type: text/plain
Branch: MAIN
CVS Tags: rad5R2, rad4R2P2, rad5R0, rad5R1, rad4R2, rad4R1, rad4R2P1
Changes since 2.10: +11 -11 lines
Log Message:
Minor fixes

File Contents

# Content
1 #ifndef lint
2 static const char RCSid[] = "$Id: words.c,v 2.10 2011/02/18 00:40: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 #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 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 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(isspace(*++cp) ? NULL : iskip(cp));
118 return(cp);
119 }
120
121
122 int
123 isint(char *s) /* check integer format */
124 {
125 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 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 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 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 }