ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/common/wordfile.c
Revision: 2.24
Committed: Sat Dec 28 18:05:14 2019 UTC (4 years, 4 months ago) by greg
Content type: text/plain
Branch: MAIN
CVS Tags: rad5R4, rad5R3, HEAD
Changes since 2.23: +1 -2 lines
Log Message:
Removed redundant include files

File Contents

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