Recognize '-' as standard input in pcre2test.

This commit is contained in:
Philip.Hazel 2014-10-31 15:57:47 +00:00
parent 8aa511a98b
commit a15a4de10b
2 changed files with 23 additions and 15 deletions

View File

@ -181,10 +181,12 @@ Output the PCRE2 version number and then exit.
.rs .rs
.sp .sp
If \fBpcre2test\fP is given two filename arguments, it reads from the first and If \fBpcre2test\fP is given two filename arguments, it reads from the first and
writes to the second. If it is given only one filename argument, it reads from writes to the second. If the first name is "-", input is taken from the
standard input. If \fBpcre2test\fP is given only one argument, it reads from
that file and writes to stdout. Otherwise, it reads from stdin and writes to that file and writes to stdout. Otherwise, it reads from stdin and writes to
stdout, and prompts for each line of input, using "re>" to prompt for regular stdout. When the input is a terminal, it prompts for each line of input, using
expression patterns, and "data>" to prompt for subject lines. "re>" to prompt for regular expression patterns, and "data>" to prompt for
subject lines.
.P .P
When \fBpcre2test\fP is built, a configuration option can specify that it When \fBpcre2test\fP is built, a configuration option can specify that it
should be linked with the \fBlibreadline\fP or \fBlibedit\fP library. When this should be linked with the \fBlibreadline\fP or \fBlibedit\fP library. When this

View File

@ -66,15 +66,16 @@ it references only the enabled library functions. */
#include <locale.h> #include <locale.h>
#include <errno.h> #include <errno.h>
#ifdef HAVE_UNISTD_H
#include <unistd.h>
#endif
/* Both libreadline and libedit are optionally supported. The user-supplied /* Both libreadline and libedit are optionally supported. The user-supplied
original patch uses readline/readline.h for libedit, but in at least one system original patch uses readline/readline.h for libedit, but in at least one system
it is installed as editline/readline.h, so the configuration code now looks for it is installed as editline/readline.h, so the configuration code now looks for
that first, falling back to readline/readline.h. */ that first, falling back to readline/readline.h. */
#if defined(SUPPORT_LIBREADLINE) || defined(SUPPORT_LIBEDIT) #if defined(SUPPORT_LIBREADLINE) || defined(SUPPORT_LIBEDIT)
#ifdef HAVE_UNISTD_H
#include <unistd.h>
#endif
#if defined(SUPPORT_LIBREADLINE) #if defined(SUPPORT_LIBREADLINE)
#include <readline/readline.h> #include <readline/readline.h>
#include <readline/history.h> #include <readline/history.h>
@ -87,6 +88,11 @@ that first, falling back to readline/readline.h. */
#endif #endif
#endif #endif
/* Put the test for interactive input into a macro so that it can be changed if
required for different environments. */
#define INTERACTIVE(f) isatty(fileno(f))
/* ---------------------- System-specific definitions ---------------------- */ /* ---------------------- System-specific definitions ---------------------- */
@ -2537,7 +2543,7 @@ for (;;)
newline, so we must put it back again, to be compatible with fgets(). */ newline, so we must put it back again, to be compatible with fgets(). */
#if defined(SUPPORT_LIBREADLINE) || defined(SUPPORT_LIBEDIT) #if defined(SUPPORT_LIBREADLINE) || defined(SUPPORT_LIBEDIT)
if (isatty(fileno(f))) if (INTERACTIVE(f))
{ {
size_t len; size_t len;
char *s = readline(prompt); char *s = readline(prompt);
@ -2553,10 +2559,10 @@ for (;;)
else else
#endif #endif
/* Read the next line by normal means, prompting if the file is stdin. */ /* Read the next line by normal means, prompting if the file is a tty. */
{ {
if (f == stdin) printf("%s", prompt); if (INTERACTIVE(f)) printf("%s", prompt);
if (fgets((char *)here, rlen, f) == NULL) if (fgets((char *)here, rlen, f) == NULL)
return (here == start)? NULL : start; return (here == start)? NULL : start;
} }
@ -3624,7 +3630,7 @@ for(;;)
fprintf(outfile, "** Unexpected EOF\n"); fprintf(outfile, "** Unexpected EOF\n");
return PR_ABEND; return PR_ABEND;
} }
if (infile != stdin) fprintf(outfile, "%s", (char *)p); if (!INTERACTIVE(infile)) fprintf(outfile, "%s", (char *)p);
} }
/* If the first character after the delimiter is backslash, make the pattern /* If the first character after the delimiter is backslash, make the pattern
@ -5637,7 +5643,7 @@ def_datctl.cfail[0] = def_datctl.cfail[1] = CFAIL_UNSET;
/* Scan command line options. */ /* Scan command line options. */
while (argc > 1 && argv[op][0] == '-') while (argc > 1 && argv[op][0] == '-' && argv[op][1] != 0)
{ {
const char *endptr; const char *endptr;
char *arg = argv[op]; char *arg = argv[op];
@ -5883,7 +5889,7 @@ if ((arg_pattern != NULL &&
infile = stdin; infile = stdin;
outfile = stdout; outfile = stdout;
if (argc > 1) if (argc > 1 && strcmp(argv[op], "-") != 0)
{ {
infile = fopen(argv[op], INPUT_MODE); infile = fopen(argv[op], INPUT_MODE);
if (infile == NULL) if (infile == NULL)
@ -5927,7 +5933,7 @@ while (notdone)
if (extend_inputline(infile, buffer, expectdata? "data> " : " re> ") == NULL) if (extend_inputline(infile, buffer, expectdata? "data> " : " re> ") == NULL)
break; break;
if (infile != stdin) fprintf(outfile, "%s", (char *)buffer); if (!INTERACTIVE(infile)) fprintf(outfile, "%s", (char *)buffer);
fflush(outfile); fflush(outfile);
p = buffer; p = buffer;
@ -5987,7 +5993,7 @@ while (notdone)
} }
} }
if (rc == PR_SKIP && infile != stdin) skipping = TRUE; if (rc == PR_SKIP && !INTERACTIVE(infile)) skipping = TRUE;
else if (rc == PR_ABEND) else if (rc == PR_ABEND)
{ {
fprintf(outfile, "** pcre2test run abandoned\n"); fprintf(outfile, "** pcre2test run abandoned\n");
@ -5998,7 +6004,7 @@ while (notdone)
/* Finish off a normal run. */ /* Finish off a normal run. */
if (infile == stdin) fprintf(outfile, "\n"); if (INTERACTIVE(infile)) fprintf(outfile, "\n");
if (showtotaltimes) if (showtotaltimes)
{ {