if (flags & PREFIX)
fputs("halibut: ", stderr);
if (flags & FILEPOS) {
- fprintf(stderr, "%s:", fpos.filename);
+ fprintf(stderr, "%s:", fpos.filename ? fpos.filename : "<standard input>");
if (fpos.line > 0)
fprintf(stderr, "%d:", fpos.line);
if (fpos.col > 0)
int nfiles; /* how many in the list */
FILE *currfp; /* the currently open one */
int currindex; /* which one is that in the list */
+ int wantclose; /* does the current file want closing */
pushback *pushback; /* pushed-back input characters */
int npushback, pushbacksize;
filepos pos;
int c = getc(in->currfp);
if (c == EOF) {
- fclose(in->currfp);
+ if (in->wantclose)
+ fclose(in->currfp);
in->currfp = NULL;
return EOF;
}
macros = newtree234(macrocmp);
while (in->currindex < in->nfiles) {
- in->currfp = fopen(in->filenames[in->currindex], "r");
- if (in->currfp) {
- setpos(in, in->filenames[in->currindex]);
- in->charset = in->defcharset;
- in->csstate = charset_init_state;
- in->wcpos = in->nwc = 0;
- in->pushback_chars = NULL;
+ setpos(in, in->filenames[in->currindex]);
+ in->charset = in->defcharset;
+ in->csstate = charset_init_state;
+ in->wcpos = in->nwc = 0;
+ in->pushback_chars = NULL;
+
+ if (!in->filenames[in->currindex]) {
+ in->currfp = stdin;
+ in->wantclose = FALSE; /* don't fclose stdin */
+ /*
+ * When reading standard input, we always expect to see
+ * an actual Halibut file and not any of the unusual
+ * input types like fonts.
+ */
reader = NULL;
- len = fread(mag, 1, sizeof(mag), in->currfp);
- for (i = 0; i < lenof(magics); i++) {
- if (len >= magics[i].nmagic &&
- memcmp(mag, magics[i].magic, magics[i].nmagic) == 0) {
- reader = magics[i].reader;
- break;
+ } else {
+ in->currfp = fopen(in->filenames[in->currindex], "r");
+ if (in->currfp) {
+ in->wantclose = TRUE;
+ reader = NULL;
+ len = fread(mag, 1, sizeof(mag), in->currfp);
+ for (i = 0; i < lenof(magics); i++) {
+ if (len >= magics[i].nmagic &&
+ memcmp(mag, magics[i].magic, magics[i].nmagic) == 0) {
+ reader = magics[i].reader;
+ break;
+ }
}
+ rewind(in->currfp);
}
- rewind(in->currfp);
+ }
+ if (in->currfp) {
if (reader == NULL)
read_file(&hptr, in, idx, macros);
else