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

# User Rev Content
1 greg 1.1 #ifndef lint
2 greg 2.10 static const char RCSid[] = "$Id: words.c,v 2.9 2004/09/28 17:54:18 greg Exp $";
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 greg 2.6 #include "copyright.h"
11 greg 1.1
12     #include <ctype.h>
13 greg 2.5 #include <string.h>
14 greg 1.1
15 schorsch 2.8 #include "rtio.h"
16 greg 1.1
17     char *
18 greg 2.10 atos(char *rs, int nb, char *s) /* get word from string, returning rs */
19 greg 1.2 {
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 gwlarson 2.4 }
29    
30    
31     char *
32 greg 2.10 nextword(char *cp, int nb, char *s) /* get (quoted) word, returning new s */
33 gwlarson 2.4 {
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 greg 1.2 }
53    
54    
55     char *
56 greg 2.10 sskip(char *s) /* skip word in string, leaving on space */
57 greg 1.1 {
58     while (isspace(*s))
59     s++;
60     while (*s && !isspace(*s))
61 greg 2.2 s++;
62 greg 2.3 return(s);
63     }
64    
65    
66     char *
67 greg 2.10 sskip2(char *s, int n) /* skip word(s) in string, leaving on word */
68 greg 2.3 {
69 greg 2.2 while (isspace(*s))
70 greg 1.1 s++;
71 greg 2.3 while (n-- > 0) {
72     while (*s && !isspace(*s))
73     s++;
74     while (isspace(*s))
75     s++;
76     }
77 greg 1.1 return(s);
78     }
79    
80    
81     char *
82 greg 2.10 iskip(char *s) /* skip integer in string */
83 greg 1.1 {
84 greg 1.2 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 greg 1.1 }
95    
96    
97     char *
98 greg 2.10 fskip(char *s) /* skip float in string */
99 greg 1.1 {
100 greg 1.4 register char *cp;
101 greg 1.1
102 greg 1.4 while (isspace(*s))
103     s++;
104     if (*s == '-' || *s == '+')
105     s++;
106     cp = s;
107 greg 1.1 while (isdigit(*cp))
108     cp++;
109     if (*cp == '.') {
110 greg 1.2 cp++; s++;
111 greg 1.1 while (isdigit(*cp))
112     cp++;
113     }
114 greg 1.2 if (cp == s)
115     return(NULL);
116 greg 1.1 if (*cp == 'e' || *cp == 'E')
117     return(iskip(cp+1));
118     return(cp);
119     }
120    
121    
122 greg 2.5 int
123 greg 2.10 isint(char *s) /* check integer format */
124 greg 1.1 {
125     register char *cp;
126    
127     cp = iskip(s);
128 greg 1.2 return(cp != NULL && *cp == '\0');
129 greg 1.1 }
130    
131    
132 greg 2.5 int
133 greg 2.10 isintd(char *s, char *ds) /* check integer format with delimiter set */
134 greg 1.1 {
135     register char *cp;
136    
137     cp = iskip(s);
138 greg 1.3 return(cp != NULL && strchr(ds, *cp) != NULL);
139 greg 1.1 }
140    
141    
142 greg 2.5 int
143 greg 2.10 isflt(char *s) /* check float format */
144 greg 1.1 {
145     register char *cp;
146    
147     cp = fskip(s);
148 greg 1.2 return(cp != NULL && *cp == '\0');
149 greg 1.1 }
150    
151    
152 greg 2.5 int
153 greg 2.10 isfltd(char *s, char *ds) /* check integer format with delimiter set */
154 greg 1.1 {
155     register char *cp;
156    
157     cp = fskip(s);
158 greg 1.3 return(cp != NULL && strchr(ds, *cp) != NULL);
159 greg 1.1 }
160 greg 2.10
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     }