ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/common/words.c
(Generate patch)

Comparing ray/src/common/words.c (file contents):
Revision 1.1 by greg, Mon Jul 22 14:34:27 1991 UTC vs.
Revision 2.13 by greg, Fri Jan 1 02:10:32 2021 UTC

# Line 1 | Line 1
1 /* Copyright (c) 1991 Regents of the University of California */
2
1   #ifndef lint
2 < static char SCCSid[] = "$SunId$ LBL";
2 > static const char RCSid[] = "$Id$";
3   #endif
6
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 < #ifdef  BSD
14 < #define  strchr         index
15 < #endif
14 > #include  "rtio.h"
15  
16 < #define  NULL           0
16 > char *
17 > atos(char *rs, int nb, char *s)         /* get word from string, returning rs */
18 > {
19 >        char  *cp = rs;
20  
21 < extern char  *strchr();
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 < sskip(s)                        /* skip word in string */
24 < register char  *s;
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);
# Line 32 | Line 63 | register char  *s;
63  
64  
65   char *
66 < iskip(s)                        /* skip integer in string */
36 < char  *s;
66 > sskip2(char *s, int n)          /* skip word(s) in string, leaving on word */
67   {
68 <        register char  *cp = s;
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 <        while (isspace(*cp))
80 <                cp++;
81 <        if (*cp == '-' || *cp == '+')
82 <                cp++;
83 <        while (isdigit(*cp))
84 <                cp++;
85 <        return(cp);
79 >
80 > char *
81 > iskip(char *s)                  /* skip integer in string */
82 > {
83 >        while (isspace(*s))
84 >                s++;
85 >        s += (*s == '-') | (*s == '+');
86 >        if (!isdigit(*s))
87 >                return(NULL);
88 >        do
89 >                s++;
90 >        while (isdigit(*s));
91 >        return(s);
92   }
93  
94  
95   char *
96 < fskip(s)                        /* skip float in string */
52 < char  *s;
96 > fskip(char *s)                  /* skip float in string */
97   {
98 <        register char  *cp = s;
98 >        char  *cp;
99  
100 <        while (isspace(*cp))
101 <                cp++;
102 <        if (*cp == '-' || *cp == '+')
103 <                cp++;
100 >        while (isspace(*s))
101 >                s++;
102 >        s += (*s == '-') | (*s == '+');
103 >        cp = s;
104          while (isdigit(*cp))
105                  cp++;
106          if (*cp == '.') {
107 <                cp++;
107 >                cp++; s++;
108                  while (isdigit(*cp))
109                          cp++;
110          }
111 <        if (*cp == 'e' || *cp == 'E')
112 <                return(iskip(cp+1));
111 >        if (cp == s)
112 >                return(NULL);
113 >        if ((*cp == 'e') | (*cp == 'E'))
114 >                return(isspace(*++cp) ? NULL : iskip(cp));
115          return(cp);
116   }
117  
118  
119 < isint(s)                        /* check integer format */
120 < char  *s;
119 > int
120 > isint(char *s)                  /* check integer format */
121   {
122 <        register char  *cp;
122 >        char  *cp;
123  
124          cp = iskip(s);
125 <        return(cp > s && *cp == '\0');
125 >        return(cp != NULL && *cp == '\0');
126   }
127  
128  
129 < isintd(s, ds)                   /* check integer format with delimiter set */
130 < char  *s, *ds;
129 > int
130 > isintd(char *s, char *ds)       /* check integer format with delimiter set */
131   {
132 <        register char  *cp;
132 >        char  *cp;
133  
134          cp = iskip(s);
135 <        return(cp > s && strchr(*cp, ds) != NULL);
135 >        return(cp != NULL && strchr(ds, *cp) != NULL);
136   }
137  
138  
139 < isflt(s)                        /* check float format */
140 < char  *s;
139 > int
140 > isflt(char *s)                  /* check float format */
141   {
142 <        register char  *cp;
142 >        char  *cp;
143  
144          cp = fskip(s);
145 <        return(cp > s && *cp == '\0');
145 >        return(cp != NULL && *cp == '\0');
146   }
147  
148  
149 < isfltd(s, ds)                   /* check integer format with delimiter set */
150 < char  *s, *ds;
149 > int
150 > isfltd(char *s, char *ds)       /* check integer format with delimiter set */
151   {
152 <        register char  *cp;
152 >        char  *cp;
153  
154          cp = fskip(s);
155 <        return(cp > s && strchr(*cp, ds) != NULL);
155 >        return(cp != NULL && strchr(ds, *cp) != NULL);
156 > }
157 >
158 >
159 > int
160 > isname(char *s)                 /* check for legal identifier name */
161 > {
162 >        while (*s == '_')                       /* skip leading underscores */
163 >                s++;
164 >        if (!isascii(*s) | !isalpha(*s))        /* start with a letter */
165 >                return(0);
166 >        while (isascii(*++s) && isgraph(*s))    /* all visible characters */
167 >                ;
168 >        return(*s == '\0');                     /* ending in nul */
169   }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines