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

Comparing ray/src/cal/rsplit.c (file contents):
Revision 1.12 by greg, Tue Mar 31 16:39:01 2020 UTC vs.
Revision 1.14 by greg, Sun Apr 5 02:25:22 2020 UTC

# Line 96 | Line 96 | main(int argc, char *argv[])
96          int             append = 0;
97          long            outcnt = 0;
98          int             bininp = 0;
99 +        int             nstdoutcomp = 0;
100          int             curterm = '\n';
101          int             curncomp = 1;
102          int             curbytes = 0;
# Line 181 | Line 182 | main(int argc, char *argv[])
182                                  }
183                                  bininp += (curbytes > 0);
184                                  break;
185 <                        case '\0':
186 <                                needres |= (curflags & DORESOLU);
187 <                                termc[nfiles] = curterm;
188 <                                hdrflags[nfiles] = curflags;
185 >                        case '\0':                      /* stdout */
186 >                                if (!nstdoutcomp) {     /* first use? */
187 >                                        needres |= (curflags & DORESOLU);
188 >                                        hdrflags[nfiles] = curflags;
189 >                                }
190                                  output[nfiles] = stdout;
191                                  if (curbytes > 0)
192                                          SET_FILE_BINARY(output[nfiles]);
193 +                                termc[nfiles] = curterm;
194                                  format[nfiles] = curfmt;
195 <                                ncomp[nfiles] = curncomp;
195 >                                nstdoutcomp +=
196 >                                        ncomp[nfiles] = curncomp;
197                                  bytsiz[nfiles++] = curbytes;
198                                  break;
199                          badopt:;
# Line 198 | Line 202 | main(int argc, char *argv[])
202                                  fputs(": bad option\n", stderr);
203                                  return(1);
204                          }
205 +                } else if (argv[i][0] == '.' && !argv[i][1]) {
206 +                        output[nfiles] = NULL;          /* discard data */
207 +                        termc[nfiles] = curterm;
208 +                        format[nfiles] = curfmt;
209 +                        ncomp[nfiles] = curncomp;
210 +                        bytsiz[nfiles++] = curbytes;
211                  } else if (argv[i][0] == '!') {
212                          needres |= (curflags & DORESOLU);
203                        termc[nfiles] = curterm;
213                          hdrflags[nfiles] = curflags;
214 +                        termc[nfiles] = curterm;
215                          if ((output[nfiles] = popen(argv[i]+1, "w")) == NULL) {
216                                  fputs(argv[i], stderr);
217                                  fputs(": cannot start command\n", stderr);
# Line 220 | Line 230 | main(int argc, char *argv[])
230                                  return(1);
231                          }
232                          needres |= (curflags & DORESOLU);
223                        termc[nfiles] = curterm;
233                          hdrflags[nfiles] = curflags;
234 +                        termc[nfiles] = curterm;
235                          if (!append & !force && access(argv[i], F_OK) == 0) {
236                                  fputs(argv[i], stderr);
237                                  fputs(": file exists -- use -f to overwrite\n",
# Line 256 | Line 266 | main(int argc, char *argv[])
266   #ifdef getc_unlocked                            /* avoid lock/unlock overhead */
267          flockfile(stdin);
268          for (i = nfiles; i--; )
269 <                flockfile(output[i]);
269 >                if (output[i] != NULL)
270 >                        ftrylockfile(output[i]);
271   #endif
272                                                  /* load/copy header */
273          if (inpflags & DOHEADER && getheader(stdin, headline, NULL) < 0) {
274                  fputs(argv[0], stderr);
275 <                fputs(": cannot get header from standard input\n",
275 >                fputs(": cannot read header from standard input\n",
276                                  stderr);
277                  return(1);
278          }
279                                                  /* handle resolution string */
280          if (inpflags & DORESOLU && !fgetsresolu(&ourres, stdin)) {
281                  fputs(argv[0], stderr);
282 <                fputs(": cannot get resolution string from standard input\n",
272 <                                stderr);
282 >                fputs(": bad resolution string on standard input\n", stderr);
283                  return(1);
284          }
285          if (needres && (ourres.xr <= 0) | (ourres.yr <= 0)) {
# Line 291 | Line 301 | main(int argc, char *argv[])
301                          if (!(inpflags & DOHEADER))
302                                  newheader("RADIANCE", output[i]);
303                          printargs(argc, argv, output[i]);
304 <                        fprintf(output[i], "NCOMP=%d\n", ncomp[i]);
304 >                        fprintf(output[i], "NCOMP=%d\n", output[i]==stdout ?
305 >                                                nstdoutcomp : ncomp[i]);
306                          if (format[i] != NULL) {
307                                  extern const char  BIGEND[];
308 <                                if ((format[i][0] == 'f') |
298 <                                                (format[i][0] == 'd')) {
308 >                                if (format[i][0] != 'a') {
309                                          fputs(BIGEND, output[i]);
310                                          fputs(nativebigendian() ^ swapped ?
311                                                  "1\n" : "0\n", output[i]);
# Line 313 | Line 323 | main(int argc, char *argv[])
323                                  if (getbinary(buf, bytsiz[i], ncomp[i],
324                                                          stdin) < ncomp[i])
325                                          break;
326 <                                if (putbinary(buf, bytsiz[i], ncomp[i],
326 >                                if (output[i] != NULL &&
327 >                                            putbinary(buf, bytsiz[i], ncomp[i],
328                                                          output[i]) < ncomp[i])
329                                          break;
330                          } else if (ncomp[i] > 1) {      /* N-field output */
# Line 321 | Line 332 | main(int argc, char *argv[])
332                                  while (n--) {
333                                          if (!scanOK(termc[i]))
334                                                  break;
335 <                                        if (fputs(buf, output[i]) == EOF)
335 >                                        if (output[i] != NULL &&
336 >                                                    fputs(buf, output[i]) == EOF)
337                                                  break;
338                                  }
339                                  if (n >= 0)             /* fell short? */
340                                          break;
341 <                                if (termc[i] != '\n')   /* add EOL if none */
341 >                                if ((output[i] != NULL) &  /* add EOL if none */
342 >                                                (termc[i] != '\n'))
343                                          fputc('\n', output[i]);
344                          } else {                        /* 1-field output */
345                                  if (!scanOK(termc[i]))
346                                          break;
347 <                                if (fputs(buf, output[i]) == EOF)
348 <                                        break;
349 <                                if (termc[i] != '\n')   /* add EOL if none */
350 <                                        fputc('\n', output[i]);
347 >                                if (output[i] != NULL) {
348 >                                        if (fputs(buf, output[i]) == EOF)
349 >                                                break;
350 >                                        if (termc[i] != '\n')   /* add EOL? */
351 >                                                fputc('\n', output[i]);
352 >                                }
353                          }
354                                                          /* skip input EOL? */
355                          if (!bininp && termc[nfiles-1] != '\n') {

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines