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 (13 years 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

# User Rev Content
1 greg 1.1 #ifndef lint
2 greg 2.11 static const char RCSid[] = "$Id: words.c,v 2.10 2011/02/18 00:40:25 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 greg 2.11 char *cp = rs;
21 greg 1.2
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 greg 2.11 if ((*s == '-') | (*s == '+'))
87 greg 1.2 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 2.11 char *cp;
101 greg 1.1
102 greg 1.4 while (isspace(*s))
103     s++;
104 greg 2.11 if ((*s == '-') | (*s == '+'))
105 greg 1.4 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 2.11 if ((*cp == 'e') | (*cp == 'E'))
117     return(isspace(*++cp) ? NULL : iskip(cp));
118 greg 1.1 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 greg 2.11 char *cp;
126 greg 1.1
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 greg 2.11 char *cp;
136 greg 1.1
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 greg 2.11 char *cp;
146 greg 1.1
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 greg 2.11 char *cp;
156 greg 1.1
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     }