--- ray/src/util/getinfo.c 2016/08/30 06:10:12 2.14 +++ ray/src/util/getinfo.c 2019/07/16 17:07:35 2.19 @@ -1,5 +1,5 @@ #ifndef lint -static const char RCSid[] = "$Id: getinfo.c,v 2.14 2016/08/30 06:10:12 greg Exp $"; +static const char RCSid[] = "$Id: getinfo.c,v 2.19 2019/07/16 17:07:35 greg Exp $"; #endif /* * getinfo.c - program to read info. header from file. @@ -11,20 +11,18 @@ static const char RCSid[] = "$Id: getinfo.c,v 2.14 201 #include #include "platform.h" +#include "rtprocess.h" #include "resolu.h" #ifdef getc_unlocked /* avoid nasty file-locking overhead */ +#undef getc #undef getchar #undef putchar +#define getc getc_unlocked #define getchar getchar_unlocked #define putchar putchar_unlocked #endif -#if defined(_WIN32) || defined(_WIN64) -#include -#define execvp _execvp -#endif - static gethfunc tabstr; static void getdim(FILE *fp); static void copycat(void); @@ -56,25 +54,39 @@ main( FILE *fp; int i; - if (argc > 1 && !strcmp(argv[1], "-d")) { + if (argc > 1 && (argv[1][0] == '-') | (argv[1][0] == '+') && + argv[1][1] == 'd') { + dim = 1 - 2*(argv[1][0] == '-'); argc--; argv++; - dim = 1; - SET_FILE_BINARY(stdin); - } else if (argc > 2 && !strcmp(argv[1], "-c")) { - SET_FILE_BINARY(stdin); + } +#ifdef getc_unlocked /* avoid lock/unlock overhead */ + flockfile(stdin); +#endif + SET_FILE_BINARY(stdin); + if (argc > 2 && !strcmp(argv[1], "-c")) { SET_FILE_BINARY(stdout); setvbuf(stdin, NULL, _IONBF, 2); - getheader(stdin, (gethfunc *)fputs, stdout); + if (getheader(stdin, (gethfunc *)fputs, stdout) < 0) + return 1; printargs(argc-2, argv+2, stdout); fputc('\n', stdout); + if (dim) { /* copy resolution string? */ + RESOLU rs; + if (!fgetsresolu(&rs, stdin)) { + fputs("No resolution string\n", stderr); + return 1; + } + if (dim > 0) + fputsresolu(&rs, stdout); + } fflush(stdout); execvp(argv[2], argv+2); perror(argv[2]); return 1; } else if (argc > 2 && !strcmp(argv[1], "-a")) { - SET_FILE_BINARY(stdin); SET_FILE_BINARY(stdout); - getheader(stdin, (gethfunc *)fputs, stdout); + if (getheader(stdin, (gethfunc *)fputs, stdout) < 0) + return 1; for (i = 2; i < argc; i++) { int len = strlen(argv[i]); if (!len) continue; @@ -86,9 +98,16 @@ main( copycat(); return 0; } else if (argc == 2 && !strcmp(argv[1], "-")) { - SET_FILE_BINARY(stdin); SET_FILE_BINARY(stdout); - getheader(stdin, NULL, NULL); + if (getheader(stdin, NULL, NULL) < 0) + return 1; + if (dim < 0) { /* skip resolution string? */ + RESOLU rs; + if (!fgetsresolu(&rs, stdin)) { + fputs("No resolution string\n", stderr); + return 1; + } + } copycat(); return 0; } @@ -97,23 +116,37 @@ main( if ((fp = fopen(argv[i], "r")) == NULL) fputs(": cannot open\n", stdout); else { - if (dim) { + if (dim < 0) { /* dimensions only */ + if (getheader(fp, NULL, NULL) < 0) { + fputs("bad header\n", stdout); + continue; + } fputs(": ", stdout); getdim(fp); } else { tabstr(":\n", NULL); - getheader(fp, tabstr, NULL); + if (getheader(fp, tabstr, NULL) < 0) + return 1; fputc('\n', stdout); + if (dim > 0) { + fputc('\t', stdout); + getdim(fp); + } } fclose(fp); } } if (argc == 1) { - if (dim) { + if (dim < 0) { + if (getheader(stdin, NULL, NULL) < 0) + return 1; getdim(stdin); } else { - getheader(stdin, (gethfunc *)fputs, stdout); + if (getheader(stdin, (gethfunc *)fputs, stdout) < 0) + return 1; fputc('\n', stdout); + if (dim > 0) + getdim(stdin); } } return 0; @@ -128,8 +161,6 @@ getdim( /* get dimensions from file */ int j; int c; - getheader(fp, NULL, NULL); /* skip header */ - switch (c = getc(fp)) { case '+': /* picture */ case '-': @@ -165,6 +196,6 @@ copycat(void) /* copy input to output */ fflush(stdout); while ((n = fread(buf, 1, sizeof(buf), stdin)) > 0) - if (write(fileno(stdout), buf, n) != n) + if (writebuf(fileno(stdout), buf, n) != n) break; }