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, 4 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

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