ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/common/wordfile.c
Revision: 2.22
Committed: Fri May 13 09:12:19 2016 UTC (8 years ago) by schorsch
Content type: text/plain
Branch: MAIN
Changes since 2.21: +4 -3 lines
Log Message:
no bug in windows read()

File Contents

# User Rev Content
1 greg 2.1 #ifndef lint
2 schorsch 2.22 static const char RCSid[] = "$Id: wordfile.c,v 2.21 2016/05/12 16:30:39 greg Exp $";
3 greg 2.1 #endif
4     /*
5     * Load whitespace separated words from a file into an array.
6 greg 2.8 *
7 greg 2.19 * External symbols declared in rtio.h
8 greg 2.8 */
9    
10 greg 2.9 #include "copyright.h"
11 greg 2.1
12 greg 2.2 #include <ctype.h>
13 schorsch 2.10 #include <string.h>
14    
15 greg 2.12 #include "platform.h"
16 greg 2.19 #include "rtio.h"
17     #include "rtmisc.h"
18 greg 2.2
19 greg 2.1
20 greg 2.17 #define MAXWLEN 4096 /* words must be shorter than this */
21 greg 2.1
22    
23     int
24 greg 2.16 wordfile( /* get words from fname, put in words */
25     char **words,
26     int nargs,
27     char *fname
28     )
29 greg 2.1 {
30 greg 2.17 int wrdcnt = 0;
31     int n = 0;
32 schorsch 2.22 int dlen = 0;
33 greg 2.1 int fd;
34 greg 2.17 char buf[MAXWLEN];
35 greg 2.3 /* load file into buffer */
36 greg 2.17 if (fname == NULL || !*fname)
37 greg 2.7 return(-1); /* no filename */
38 greg 2.17 if (nargs <= 1)
39     return(-1);
40 greg 2.1 if ((fd = open(fname, 0)) < 0)
41 greg 2.3 return(-1); /* open error */
42 greg 2.17 words[0] = NULL;
43     while (nargs > 1 && (n += read(fd, buf+n, MAXWLEN-n)) > 0) {
44 schorsch 2.22 dlen = n;
45 greg 2.17 int crem = 0;
46 greg 2.20 if (n > MAXWLEN/2) /* check for mid-word end */
47 greg 2.17 while (!isspace(buf[--n])) {
48     if (n <= 0) /* one long word! */
49     goto done;
50     ++crem;
51     }
52     buf[n] = '\0'; /* terminate & parse */
53     n = wordstring(words, nargs, buf);
54     if (n < 0) {
55     wrdcnt = -1; /* memory error */
56     break;
57     }
58 greg 2.18 words += n; nargs -= n;
59 greg 2.17 wrdcnt += n;
60     if ((n = crem) > 0) /* move remainder */
61 schorsch 2.22 memmove(buf, buf+dlen-crem, crem);
62 greg 2.17 }
63     done:
64 greg 2.1 close(fd);
65 greg 2.17 return(wrdcnt);
66 greg 2.3 }
67    
68    
69     int
70 greg 2.16 wordstring( /* allocate and load argument list */
71     char **avl,
72     int nargs,
73     char *str
74     )
75 greg 2.3 {
76 greg 2.16 char *cp, **ap;
77 greg 2.3
78     if (str == NULL)
79     return(-1);
80     cp = bmalloc(strlen(str)+1);
81     if (cp == NULL) /* ENOMEM */
82     return(-1);
83     strcpy(cp, str);
84 greg 2.16 /* parse into words */
85     for (ap = avl; ap-avl < nargs-1; ap++) {
86 greg 2.4 while (isspace(*cp)) /* nullify spaces */
87     *cp++ = '\0';
88     if (!*cp) /* all done? */
89     break;
90 greg 2.16 *ap = cp; /* add argument to list */
91 greg 2.6 while (*++cp && !isspace(*cp))
92     ;
93 greg 2.1 }
94 greg 2.17 *cp = '\0'; /* terminates overflow */
95 greg 2.3 *ap = NULL;
96     return(ap - avl);
97 greg 2.1 }