ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/common/wordfile.c
Revision: 2.23
Committed: Fri May 13 16:24:26 2016 UTC (7 years, 11 months ago) by greg
Content type: text/plain
Branch: MAIN
CVS Tags: rad5R2, rad5R1
Changes since 2.22: +2 -3 lines
Log Message:
Slight rework due to declaration ordering

File Contents

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