Add -LM to pcre2test.

This commit is contained in:
Philip.Hazel 2017-10-17 16:26:20 +00:00
parent 89a834b75e
commit cc2182261a
4 changed files with 420 additions and 287 deletions

View File

@ -30,6 +30,10 @@ the public names in pcre2_convert.c.
PCRE2GREP_RC to the exit status, because VMS does not distinguish between
exit(0) and exit(1).
10. Added the -LM (list modifiers) option to pcre2test. Also made -C complain
about a bad option only if the following argument item does not start with a
hyphen.
Version 10.30 14-August-2017
----------------------------

View File

@ -1,4 +1,4 @@
.TH PCRE2TEST 1 "12 July 2017" "PCRE 10.30"
.TH PCRE2TEST 1 "17 October 2017" "PCRE 10.31"
.SH NAME
pcre2test - a program for testing Perl-compatible regular expressions.
.SH SYNOPSIS
@ -136,7 +136,8 @@ internal binary form of the pattern is output after compilation.
\fB-C\fP
Output the version number of the PCRE2 library, and all available information
about the optional features that are included, and then exit with zero exit
code. All other options are ignored.
code. All other options are ignored. If both -C and -LM are present, whichever
is first is recognized.
.TP 10
\fB-C\fP \fIoption\fP
Output information about a specific build-time option, then exit. This
@ -201,6 +202,11 @@ Behave as if each pattern line has the \fBjitverify\fP modifier; after
successful compilation, each pattern is passed to the just-in-time compiler, if
available, and the use of JIT is verified.
.TP 10
\fB-LM\fP
List modifiers: write a list of available pattern and subject modifiers to the
standard output, then exit with zero exit code. All other options are ignored.
If both -C and -LM are present, whichever is first is recognized.
.TP 10
\fB-pattern\fB \fImodifier-list\fP
Behave as if each pattern line contains the given modifiers.
.TP 10
@ -984,13 +990,14 @@ are mutually exclusive.
The following modifiers are really subject modifiers, and are described under
"Subject Modifiers" below. However, they may be included in a pattern's
modifier list, in which case they are applied to every subject line that is
processed with that pattern. They may not appear in \fB#pattern\fP commands.
These modifiers do not affect the compilation process.
processed with that pattern. These modifiers do not affect the compilation
process.
.sp
aftertext show text after match
allaftertext show text after captures
allcaptures show all captures
allusedtext show all consulted text
altglobal alternative global matching
/g global global matching
jitstack=<n> set size of JIT stack
mark show mark values
@ -1887,6 +1894,6 @@ Cambridge, England.
.rs
.sp
.nf
Last updated: 12 July 2017
Last updated: 17 October 2017
Copyright (c) 1997-2017 University of Cambridge.
.fi

File diff suppressed because it is too large Load Diff

View File

@ -7707,6 +7707,7 @@ printf(" -help show usage information\n");
printf(" -i set default pattern modifier 'info'\n");
printf(" -jit set default pattern modifier 'jit'\n");
printf(" -jitverify set default pattern modifier 'jitverify'\n");
printf(" -LM list pattern and subject modifiers, then exit\n");
printf(" -q quiet: do not output PCRE2 version number at start\n");
printf(" -pattern <s> set default pattern modifier fields\n");
printf(" -subject <s> set default subject modifier fields\n");
@ -7737,19 +7738,18 @@ static int
c_option(const char *arg)
{
uint32_t optval;
unsigned int i = COPTLISTCOUNT;
int yield = 0;
if (arg != NULL)
if (arg != NULL && arg[0] != CHAR_MINUS)
{
unsigned int i;
for (i = 0; i < COPTLISTCOUNT; i++)
if (strcmp(arg, coptlist[i].name) == 0) break;
if (i >= COPTLISTCOUNT)
{
fprintf(stderr, "** Unknown -C option '%s'\n", arg);
return -1;
return 0;
}
switch (coptlist[i].type)
@ -7859,6 +7859,114 @@ return 0;
/*************************************************
* Display one modifier *
*************************************************/
static void
display_one_modifier(modstruct *m, BOOL for_pattern)
{
uint32_t c = (!for_pattern && (m->which == MOD_PND || m->which == MOD_PNDP))?
'*' : ' ';
printf("%c%s", c, m->name);
}
/*************************************************
* Display pattern or subject modifiers *
*************************************************/
/* In order to print in two columns, first scan without printing to get a list
of the modifiers that are required.
Arguments:
for_pattern TRUE for pattern modifiers, FALSE for subject modifiers
title string to be used in title
Returns: nothing
*/
static void
display_selected_modifiers(BOOL for_pattern, const char *title)
{
uint32_t i, j;
uint32_t n = 0;
uint32_t list[MODLISTCOUNT];
for (i = 0; i < MODLISTCOUNT; i++)
{
BOOL is_pattern = TRUE;
modstruct *m = modlist + i;
switch (m->which)
{
case MOD_CTC: /* Compile context */
case MOD_PAT: /* Pattern */
case MOD_PATP: /* Pattern, OK for Perl-compatible test */
break;
/* The MOD_PND and MOD_PNDP modifiers are precisely those that affect
subjects, but can be given with a pattern. We list them as subject
modifiers, but marked with an asterisk.*/
case MOD_CTM: /* Match context */
case MOD_DAT: /* Subject line */
case MOD_PND: /* As PD, but not default pattern */
case MOD_PNDP: /* As PND, OK for Perl-compatible test */
is_pattern = FALSE;
break;
default: printf("** Unknown type for modifier '%s'\n", m->name);
/* Fall through */
case MOD_PD: /* Pattern or subject */
case MOD_PDP: /* As PD, OK for Perl-compatible test */
is_pattern = for_pattern;
break;
}
if (for_pattern == is_pattern) list[n++] = i;
}
/* Now print from the list in two columns. */
printf("-------------- %s MODIFIERS --------------\n", title);
for (i = 0, j = (n+1)/2; i < (n+1)/2; i++, j++)
{
modstruct *m = modlist + list[i];
display_one_modifier(m, for_pattern);
if (j < n)
{
uint32_t k = 27 - strlen(m->name);
while (k-- > 0) printf(" ");
display_one_modifier(modlist + list[j], for_pattern);
}
printf("\n");
}
}
/*************************************************
* Display the list of modifiers *
*************************************************/
static void
display_modifiers(void)
{
printf(
"An asterisk on a subject modifier means that it may be given on a pattern\n"
"line, in order to apply to all subjects matched by that pattern. Modifiers\n"
"that are listed for both patterns and subjects have different effects in\n"
"each case.\n\n");
display_selected_modifiers(TRUE, "PATTERN");
printf("\n");
display_selected_modifiers(FALSE, "SUBJECT");
}
/*************************************************
* Main Program *
*************************************************/
@ -7964,6 +8072,14 @@ while (argc > 1 && argv[op][0] == '-' && argv[op][1] != 0)
char *arg = argv[op];
unsigned long uli;
/* List modifiers and exit. */
if (strcmp(arg, "-LM") == 0)
{
display_modifiers();
goto EXIT;
}
/* Display and/or set return code for configuration options. */
if (strcmp(arg, "-C") == 0)