ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/common/wordfile.c
Revision: 2.17
Committed: Tue Mar 22 15:14:39 2016 UTC (8 years, 1 month ago) by greg
Content type: text/plain
Branch: MAIN
Changes since 2.16: +32 -16 lines
Log Message:
Removed limitation on word file size

File Contents

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