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

Comparing ray/src/cal/lam.c (file contents):
Revision 1.15 by greg, Thu Mar 24 18:48:28 2016 UTC vs.
Revision 1.26 by greg, Fri Jun 7 18:19:22 2024 UTC

# Line 7 | Line 7 | static const char      RCSid[] = "$Id$";
7   *      7/14/88         Greg Ward
8   */
9  
10 #include <stdlib.h>
11 #include <string.h>
12 #include <stdio.h>
10   #include <ctype.h>
11  
12 + #include "rtio.h"
13   #include "platform.h"
14 < #include "rtprocess.h"
14 > #include "paths.h"
15  
16 < #define MAXFILE         512             /* maximum number of files */
16 > #define MAXLINE         262144          /* maximum input line */
17  
18 < #define MAXLINE         65536           /* maximum input line */
18 > struct instream {               /* structure to hold input stream info */
19 >        FILE            *input;         /* input stream */
20 >        int             bytsiz;         /* bytes/component if binary */
21 >        char            *tabc;          /* data separation string */
22 > }       *rifile = NULL;
23  
24 < long    incnt = 0;                      /* limit number of records? */
24 > int     nfiles = 0;
25  
24 FILE    *input[MAXFILE];
25 int     bytsiz[MAXFILE];
26 char    *tabc[MAXFILE];
27 int     nfiles;
28
26   char    buf[MAXLINE];
27  
28   int
29 < main(argc, argv)
33 < int     argc;
34 < char    *argv[];
29 > main(int argc, char *argv[])
30   {
31 +        long    incnt = 0;
32          int     unbuff = 0;
33          int     binout = 0;
34 <        int     i;
35 <        char    *curtab;
40 <        int     curbytes;
34 >        char    *curtab = "\t";
35 >        int     curbytes = 0;
36          int     puteol;
37 +        int     i;
38  
39 <        curtab = "\t";
40 <        curbytes = 0;
41 <        nfiles = 0;
39 >        rifile = (struct instream *)calloc(argc-1, sizeof(struct instream));
40 >        if (!rifile) {
41 >                fputs(argv[0], stderr);
42 >                fputs(": not enough memory\n", stderr);
43 >                return(1);
44 >        }
45          for (i = 1; i < argc; i++) {
46                  if (argv[i][0] == '-') {
47                          switch (argv[i][1]) {
48                          case 't':
49                                  curtab = argv[i]+2;
50 +                                if (!*curtab) curtab = "\n";
51                                  break;
52                          case 'u':
53                                  unbuff = !unbuff;
# Line 58 | Line 58 | char   *argv[];
58                                          incnt = atol(argv[++i]);
59                                          break;
60                                  case 'f':
61 +                                case 'F':
62                                          curbytes = sizeof(float);
63                                          break;
64                                  case 'd':
65 +                                case 'D':
66                                          curbytes = sizeof(double);
67                                          break;
68                                  case 'i':
69 +                                case 'I':
70                                          curbytes = sizeof(int);
71                                          break;
72                                  case 'w':
73 +                                case 'W':
74                                          curbytes = 2;
75                                          break;
76                                  case 'b':
# Line 80 | Line 84 | char   *argv[];
84                                  }
85                                  if (isdigit(argv[i][3]))
86                                          curbytes *= atoi(argv[i]+3);
87 <                                if (abs(curbytes) > MAXLINE) {
87 >                                curbytes += (curbytes == -1);
88 >                                if (curbytes > MAXLINE) {
89                                          fputs(argv[0], stderr);
90                                          fputs(": input size too big\n", stderr);
91 <                                        exit(1);
91 >                                        return(1);
92                                  }
93 <                                if (curbytes) {
93 >                                if (curbytes > 0) {
94                                          curtab = "";
95                                          ++binout;
96                                  }
97                                  break;
98                          case '\0':
99 <                                tabc[nfiles] = curtab;
100 <                                input[nfiles] = stdin;
99 >                                rifile[nfiles].tabc = curtab;
100 >                                rifile[nfiles].input = stdin;
101                                  if (curbytes > 0)
102 <                                        SET_FILE_BINARY(input[nfiles]);
103 <                                else
99 <                                        curbytes = -curbytes;
100 <                                bytsiz[nfiles++] = curbytes;
102 >                                        SET_FILE_BINARY(rifile[nfiles].input);
103 >                                rifile[nfiles++].bytsiz = curbytes;
104                                  break;
105                          badopt:;
106                          default:
107                                  fputs(argv[0], stderr);
108                                  fputs(": bad option\n", stderr);
109 <                                exit(1);
109 >                                return(1);
110                          }
111                  } else if (argv[i][0] == '!') {
112 <                        tabc[nfiles] = curtab;
113 <                        if ((input[nfiles] = popen(argv[i]+1, "r")) == NULL) {
112 >                        rifile[nfiles].tabc = curtab;
113 >                        if ((rifile[nfiles].input = popen(argv[i]+1, "r")) == NULL) {
114                                  fputs(argv[i], stderr);
115                                  fputs(": cannot start command\n", stderr);
116 <                                exit(1);
116 >                                return(1);
117                          }
118                          if (curbytes > 0)
119 <                                SET_FILE_BINARY(input[nfiles]);
120 <                        else
118 <                                curbytes = -curbytes;
119 <                        bytsiz[nfiles++] = curbytes;
119 >                                SET_FILE_BINARY(rifile[nfiles].input);
120 >                        rifile[nfiles++].bytsiz = curbytes;
121                  } else {
122 <                        tabc[nfiles] = curtab;
123 <                        if ((input[nfiles] = fopen(argv[i], "r")) == NULL) {
122 >                        rifile[nfiles].tabc = curtab;
123 >                        if ((rifile[nfiles].input = fopen(argv[i], "r")) == NULL) {
124                                  fputs(argv[i], stderr);
125                                  fputs(": cannot open file\n", stderr);
126 <                                exit(1);
126 >                                return(1);
127                          }
128                          if (curbytes > 0)
129 <                                SET_FILE_BINARY(input[nfiles]);
130 <                        else
130 <                                curbytes = -curbytes;
131 <                        bytsiz[nfiles++] = curbytes;
129 >                                SET_FILE_BINARY(rifile[nfiles].input);
130 >                        rifile[nfiles++].bytsiz = curbytes;
131                  }
133                if (nfiles >= MAXFILE) {
134                        fputs(argv[0], stderr);
135                        fputs(": too many input streams\n", stderr);
136                        exit(1);
137                }
132          }
133 +        if (!nfiles) {
134 +                fputs(argv[0], stderr);
135 +                fputs(": no input streams\n", stderr);
136 +                return(1);
137 +        }                                       /* reduce array to size we need */
138 +        rifile = (struct instream *)realloc(rifile, nfiles*sizeof(struct instream));
139 +        if (!rifile) {
140 +                fputs(argv[0], stderr);
141 +                fputs(": realloc() failed!\n", stderr);
142 +                return(1);
143 +        }
144          if (binout)                             /* binary output? */
145                  SET_FILE_BINARY(stdout);
146   #ifdef getc_unlocked                            /* avoid lock/unlock overhead */
147          for (i = nfiles; i--; )
148 <                flockfile(input[i]);
148 >                flockfile(rifile[i].input);
149          flockfile(stdout);
150   #endif
151          puteol = 0;                             /* any ASCII output at all? */
152          for (i = nfiles; i--; )
153 <                if (!bytsiz[i] || isprint(tabc[i][0]) || tabc[i][0] == '\t') {
154 <                        puteol++;
150 <                        break;
151 <                }
152 <        while (--incnt) {                       /* main loop */
153 >                puteol += (rifile[i].bytsiz <= 0);
154 >        do {                                    /* main loop */
155                  for (i = 0; i < nfiles; i++) {
156 <                        if (bytsiz[i]) {                /* binary file */
157 <                                if (fread(buf, bytsiz[i], 1, input[i]) < 1)
156 >                        if (rifile[i].bytsiz > 0) {             /* binary input */
157 >                                if (getbinary(buf, rifile[i].bytsiz, 1, rifile[i].input) < 1)
158                                          break;
159 <                                if (i)
158 <                                        fputs(tabc[i], stdout);
159 <                                fwrite(buf, bytsiz[i], 1, stdout);
160 <                        } else {
161 <                                if (fgets(buf, MAXLINE, input[i]) == NULL)
159 >                                if (putbinary(buf, rifile[i].bytsiz, 1, stdout) != 1)
160                                          break;
161 +                        } else if (rifile[i].bytsiz < 0) {      /* multi-line input */
162 +                                int     n = -rifile[i].bytsiz;
163 +                                while (n--) {
164 +                                        if (fgets(buf, MAXLINE, rifile[i].input) == NULL)
165 +                                                break;
166 +                                        if ((i > 0) | (n < -rifile[i].bytsiz-1))
167 +                                                fputs(rifile[i].tabc, stdout);
168 +                                        buf[strlen(buf)-1] = '\0';
169 +                                        if (fputs(buf, stdout) == EOF)
170 +                                                break;
171 +                                }
172 +                                if (n >= 0)             /* fell short? */
173 +                                        break;
174 +                        } else {                        /* single-line input */
175 +                                if (fgets(buf, MAXLINE, rifile[i].input) == NULL)
176 +                                        break;
177                                  if (i)
178 <                                        fputs(tabc[i], stdout);
178 >                                        fputs(rifile[i].tabc, stdout);
179                                  buf[strlen(buf)-1] = '\0';
180 <                                fputs(buf, stdout);
180 >                                if (fputs(buf, stdout) == EOF)
181 >                                        break;
182                          }
183                  }
184                  if (i < nfiles)
# Line 172 | Line 187 | char   *argv[];
187                          putchar('\n');
188                  if (unbuff)
189                          fflush(stdout);
190 +        } while (--incnt);
191 +                                                        /* check ending */
192 +        if (fflush(stdout) == EOF) {
193 +                fputs(argv[0], stderr);
194 +                fputs(": write error on standard output\n", stderr);
195 +                return(1);
196 +        }
197 +        if (incnt > 0) {
198 +                fputs(argv[0], stderr);
199 +                fputs(": warning: premature EOD\n", stderr);
200          }
201          return(0);
202   }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines