--- ray/src/util/getinfo.c 2003/02/22 02:07:30 2.5 +++ ray/src/util/getinfo.c 2016/08/30 06:10:12 2.14 @@ -1,5 +1,5 @@ #ifndef lint -static const char RCSid[] = "$Id: getinfo.c,v 2.5 2003/02/22 02:07:30 greg Exp $"; +static const char RCSid[] = "$Id: getinfo.c,v 2.14 2016/08/30 06:10:12 greg Exp $"; #endif /* * getinfo.c - program to read info. header from file. @@ -8,18 +8,33 @@ static const char RCSid[] = "$Id: getinfo.c,v 2.5 2003 */ #include +#include -#ifdef MSDOS -#include -extern int _fmode; +#include "platform.h" +#include "resolu.h" + +#ifdef getc_unlocked /* avoid nasty file-locking overhead */ +#undef getchar +#undef putchar +#define getchar getchar_unlocked +#define putchar putchar_unlocked #endif -extern int fputs(); +#if defined(_WIN32) || defined(_WIN64) +#include +#define execvp _execvp +#endif +static gethfunc tabstr; +static void getdim(FILE *fp); +static void copycat(void); -int -tabstr(s) /* put out line followed by tab */ -register char *s; + +static int +tabstr( /* put out line followed by tab */ + char *s, + void *p +) { while (*s) { putchar(*s); @@ -31,9 +46,11 @@ register char *s; } -main(argc, argv) -int argc; -char **argv; +int +main( + int argc, + char **argv +) { int dim = 0; FILE *fp; @@ -42,17 +59,38 @@ char **argv; if (argc > 1 && !strcmp(argv[1], "-d")) { argc--; argv++; dim = 1; -#ifdef MSDOS - setmode(fileno(stdin), _fmode = O_BINARY); -#endif + SET_FILE_BINARY(stdin); + } else if (argc > 2 && !strcmp(argv[1], "-c")) { + SET_FILE_BINARY(stdin); + SET_FILE_BINARY(stdout); + setvbuf(stdin, NULL, _IONBF, 2); + getheader(stdin, (gethfunc *)fputs, stdout); + printargs(argc-2, argv+2, stdout); + fputc('\n', 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); + for (i = 2; i < argc; i++) { + int len = strlen(argv[i]); + if (!len) continue; + fputs(argv[i], stdout); + if (argv[i][len-1] != '\n') + fputc('\n', stdout); + } + fputc('\n', stdout); + copycat(); + return 0; } else if (argc == 2 && !strcmp(argv[1], "-")) { -#ifdef MSDOS - setmode(fileno(stdin), O_BINARY); - setmode(fileno(stdout), O_BINARY); -#endif + SET_FILE_BINARY(stdin); + SET_FILE_BINARY(stdout); getheader(stdin, NULL, NULL); copycat(); - exit(0); + return 0; } for (i = 1; i < argc; i++) { fputs(argv[i], stdout); @@ -63,29 +101,32 @@ char **argv; fputs(": ", stdout); getdim(fp); } else { - tabstr(":\n"); + tabstr(":\n", NULL); getheader(fp, tabstr, NULL); - putchar('\n'); + fputc('\n', stdout); } fclose(fp); } } - if (argc == 1) + if (argc == 1) { if (dim) { getdim(stdin); } else { - getheader(stdin, fputs, stdout); - putchar('\n'); + getheader(stdin, (gethfunc *)fputs, stdout); + fputc('\n', stdout); } - exit(0); + } + return 0; } -getdim(fp) /* get dimensions from file */ -register FILE *fp; +static void +getdim( /* get dimensions from file */ + FILE *fp +) { int j; - register int c; + int c; getheader(fp, NULL, NULL); /* skip header */ @@ -100,13 +141,13 @@ register FILE *fp; getc(fp); j = 0; while ((c = getc(fp)) != EOF) - if (c == 0) + if (c == 0) { if (++j >= 4) break; - else - putchar(' '); - else + putchar(' '); + } else { putchar(c); + } putchar('\n'); break; default: /* ??? */ @@ -116,10 +157,14 @@ register FILE *fp; } -copycat() /* copy input to output */ +static void +copycat(void) /* copy input to output */ { - register int c; + char buf[8192]; + int n; - while ((c = getchar()) != EOF) - putchar(c); + fflush(stdout); + while ((n = fread(buf, 1, sizeof(buf), stdin)) > 0) + if (write(fileno(stdout), buf, n) != n) + break; }