|
Packit |
6c4009 |
/* Regular expression tests.
|
|
Packit |
6c4009 |
Copyright (C) 2003-2018 Free Software Foundation, Inc.
|
|
Packit |
6c4009 |
This file is part of the GNU C Library.
|
|
Packit |
6c4009 |
Contributed by Jakub Jelinek <jakub@redhat.com>, 2003.
|
|
Packit |
6c4009 |
|
|
Packit |
6c4009 |
The GNU C Library is free software; you can redistribute it and/or
|
|
Packit |
6c4009 |
modify it under the terms of the GNU Lesser General Public
|
|
Packit |
6c4009 |
License as published by the Free Software Foundation; either
|
|
Packit |
6c4009 |
version 2.1 of the License, or (at your option) any later version.
|
|
Packit |
6c4009 |
|
|
Packit |
6c4009 |
The GNU C Library is distributed in the hope that it will be useful,
|
|
Packit |
6c4009 |
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
Packit |
6c4009 |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
Packit |
6c4009 |
Lesser General Public License for more details.
|
|
Packit |
6c4009 |
|
|
Packit |
6c4009 |
You should have received a copy of the GNU Lesser General Public
|
|
Packit |
6c4009 |
License along with the GNU C Library; if not, see
|
|
Packit |
6c4009 |
<http://www.gnu.org/licenses/>. */
|
|
Packit |
6c4009 |
|
|
Packit |
6c4009 |
#include <sys/types.h>
|
|
Packit |
6c4009 |
#include <mcheck.h>
|
|
Packit |
6c4009 |
#include <regex.h>
|
|
Packit |
6c4009 |
#include <stdio.h>
|
|
Packit |
6c4009 |
#include <stdlib.h>
|
|
Packit |
6c4009 |
#include <string.h>
|
|
Packit |
6c4009 |
|
|
Packit |
6c4009 |
void
|
|
Packit |
6c4009 |
frob_escapes (char *src, int pattern)
|
|
Packit |
6c4009 |
{
|
|
Packit |
6c4009 |
char *dst;
|
|
Packit |
6c4009 |
|
|
Packit |
6c4009 |
for (dst = src; *src != '\0'; dst++, src++)
|
|
Packit |
6c4009 |
{
|
|
Packit |
6c4009 |
if (*src == '\\')
|
|
Packit |
6c4009 |
{
|
|
Packit |
6c4009 |
switch (src[1])
|
|
Packit |
6c4009 |
{
|
|
Packit |
6c4009 |
case 't':
|
|
Packit |
6c4009 |
src++;
|
|
Packit |
6c4009 |
*dst = '\t';
|
|
Packit |
6c4009 |
continue;
|
|
Packit |
6c4009 |
case 'n':
|
|
Packit |
6c4009 |
src++;
|
|
Packit |
6c4009 |
*dst = '\n';
|
|
Packit |
6c4009 |
continue;
|
|
Packit |
6c4009 |
case 'r':
|
|
Packit |
6c4009 |
src++;
|
|
Packit |
6c4009 |
*dst = '\r';
|
|
Packit |
6c4009 |
continue;
|
|
Packit |
6c4009 |
case '\\':
|
|
Packit |
6c4009 |
case '^':
|
|
Packit |
6c4009 |
case '{':
|
|
Packit |
6c4009 |
case '|':
|
|
Packit |
6c4009 |
case '}':
|
|
Packit |
6c4009 |
if (!pattern)
|
|
Packit |
6c4009 |
{
|
|
Packit |
6c4009 |
src++;
|
|
Packit |
6c4009 |
*dst = *src;
|
|
Packit |
6c4009 |
continue;
|
|
Packit |
6c4009 |
}
|
|
Packit |
6c4009 |
break;
|
|
Packit |
6c4009 |
}
|
|
Packit |
6c4009 |
}
|
|
Packit |
6c4009 |
if (src != dst)
|
|
Packit |
6c4009 |
*dst = *src;
|
|
Packit |
6c4009 |
}
|
|
Packit |
6c4009 |
*dst = '\0';
|
|
Packit |
6c4009 |
}
|
|
Packit |
6c4009 |
|
|
Packit |
6c4009 |
int
|
|
Packit |
6c4009 |
main (int argc, char **argv)
|
|
Packit |
6c4009 |
{
|
|
Packit |
6c4009 |
int ret = 0, n;
|
|
Packit |
6c4009 |
char *line = NULL;
|
|
Packit |
6c4009 |
size_t line_len = 0;
|
|
Packit |
6c4009 |
ssize_t len;
|
|
Packit |
6c4009 |
FILE *f;
|
|
Packit |
6c4009 |
char *pattern, *string;
|
|
Packit |
6c4009 |
int flags = REG_EXTENDED;
|
|
Packit |
6c4009 |
int eflags = 0;
|
|
Packit |
6c4009 |
regex_t re;
|
|
Packit |
6c4009 |
regmatch_t rm[20];
|
|
Packit |
6c4009 |
|
|
Packit |
6c4009 |
mtrace ();
|
|
Packit |
6c4009 |
|
|
Packit |
6c4009 |
if (argc < 2)
|
|
Packit |
6c4009 |
{
|
|
Packit |
6c4009 |
fprintf (stderr, "Missing test filename\n");
|
|
Packit |
6c4009 |
return 1;
|
|
Packit |
6c4009 |
}
|
|
Packit |
6c4009 |
|
|
Packit |
6c4009 |
f = fopen (argv[1], "r");
|
|
Packit |
6c4009 |
if (f == NULL)
|
|
Packit |
6c4009 |
{
|
|
Packit |
6c4009 |
fprintf (stderr, "Couldn't open %s\n", argv[1]);
|
|
Packit |
6c4009 |
return 1;
|
|
Packit |
6c4009 |
}
|
|
Packit |
6c4009 |
|
|
Packit |
6c4009 |
while ((len = getline (&line, &line_len, f)) > 0)
|
|
Packit |
6c4009 |
{
|
|
Packit |
6c4009 |
char *p, *q;
|
|
Packit |
6c4009 |
int i;
|
|
Packit |
6c4009 |
|
|
Packit |
6c4009 |
if (line[len - 1] == '\n')
|
|
Packit |
6c4009 |
line[--len] = '\0';
|
|
Packit |
6c4009 |
|
|
Packit |
6c4009 |
puts (line);
|
|
Packit |
6c4009 |
|
|
Packit |
6c4009 |
if (line[0] == ';')
|
|
Packit |
6c4009 |
continue;
|
|
Packit |
6c4009 |
|
|
Packit |
6c4009 |
if (line[0] == '\0')
|
|
Packit |
6c4009 |
continue;
|
|
Packit |
6c4009 |
|
|
Packit |
6c4009 |
if (line[0] == '-')
|
|
Packit |
6c4009 |
{
|
|
Packit |
6c4009 |
if (strstr (line, "REG_BASIC"))
|
|
Packit |
6c4009 |
flags = 0;
|
|
Packit |
6c4009 |
else
|
|
Packit |
6c4009 |
flags = REG_EXTENDED;
|
|
Packit |
6c4009 |
if (strstr (line, "REG_ICASE"))
|
|
Packit |
6c4009 |
flags |= REG_ICASE;
|
|
Packit |
6c4009 |
if (strstr (line, "REG_NEWLINE"))
|
|
Packit |
6c4009 |
flags |= REG_NEWLINE;
|
|
Packit |
6c4009 |
eflags = 0;
|
|
Packit |
6c4009 |
if (strstr (line, "REG_NOTBOL"))
|
|
Packit |
6c4009 |
eflags |= REG_NOTBOL;
|
|
Packit |
6c4009 |
if (strstr (line, "REG_NOTEOL"))
|
|
Packit |
6c4009 |
eflags |= REG_NOTEOL;
|
|
Packit |
6c4009 |
continue;
|
|
Packit |
6c4009 |
}
|
|
Packit |
6c4009 |
|
|
Packit |
6c4009 |
pattern = line + strspn (line, " \t");
|
|
Packit |
6c4009 |
if (*pattern == '\0')
|
|
Packit |
6c4009 |
continue;
|
|
Packit |
6c4009 |
p = pattern + strcspn (pattern, " \t");
|
|
Packit |
6c4009 |
if (*p == '\0')
|
|
Packit |
6c4009 |
continue;
|
|
Packit |
6c4009 |
*p++ = '\0';
|
|
Packit |
6c4009 |
|
|
Packit |
6c4009 |
string = p + strspn (p, " \t");
|
|
Packit |
6c4009 |
if (*string == '\0')
|
|
Packit |
6c4009 |
continue;
|
|
Packit |
6c4009 |
if (*string == '"')
|
|
Packit |
6c4009 |
{
|
|
Packit |
6c4009 |
string++;
|
|
Packit |
6c4009 |
p = strchr (string, '"');
|
|
Packit |
6c4009 |
if (p == NULL)
|
|
Packit |
6c4009 |
continue;
|
|
Packit |
6c4009 |
*p++ = '\0';
|
|
Packit |
6c4009 |
}
|
|
Packit |
6c4009 |
else
|
|
Packit |
6c4009 |
{
|
|
Packit |
6c4009 |
p = string + strcspn (string, " \t");
|
|
Packit |
6c4009 |
if (*string == '!')
|
|
Packit |
6c4009 |
string = NULL;
|
|
Packit |
6c4009 |
else if (*p == '\0')
|
|
Packit |
6c4009 |
continue;
|
|
Packit |
6c4009 |
else
|
|
Packit |
6c4009 |
*p++ = '\0';
|
|
Packit |
6c4009 |
}
|
|
Packit |
6c4009 |
|
|
Packit |
6c4009 |
frob_escapes (pattern, 1);
|
|
Packit |
6c4009 |
if (string != NULL)
|
|
Packit |
6c4009 |
frob_escapes (string, 0);
|
|
Packit |
6c4009 |
|
|
Packit |
6c4009 |
n = regcomp (&re, pattern, flags);
|
|
Packit |
6c4009 |
if (n != 0)
|
|
Packit |
6c4009 |
{
|
|
Packit |
6c4009 |
if (string != NULL)
|
|
Packit |
6c4009 |
{
|
|
Packit |
6c4009 |
char buf[500];
|
|
Packit |
6c4009 |
regerror (n, &re, buf, sizeof (buf));
|
|
Packit |
6c4009 |
printf ("FAIL regcomp unexpectedly failed: %s\n",
|
|
Packit |
6c4009 |
buf);
|
|
Packit |
6c4009 |
ret = 1;
|
|
Packit |
6c4009 |
}
|
|
Packit |
6c4009 |
continue;
|
|
Packit |
6c4009 |
}
|
|
Packit |
6c4009 |
else if (string == NULL)
|
|
Packit |
6c4009 |
{
|
|
Packit |
6c4009 |
regfree (&re);
|
|
Packit |
6c4009 |
puts ("FAIL regcomp unpexpectedly succeeded");
|
|
Packit |
6c4009 |
ret = 1;
|
|
Packit |
6c4009 |
continue;
|
|
Packit |
6c4009 |
}
|
|
Packit |
6c4009 |
|
|
Packit |
6c4009 |
if (regexec (&re, string, 20, rm, eflags))
|
|
Packit |
6c4009 |
{
|
|
Packit |
6c4009 |
for (i = 0; i < 20; ++i)
|
|
Packit |
6c4009 |
{
|
|
Packit |
6c4009 |
rm[i].rm_so = -1;
|
|
Packit |
6c4009 |
rm[i].rm_eo = -1;
|
|
Packit |
6c4009 |
}
|
|
Packit |
6c4009 |
}
|
|
Packit |
6c4009 |
|
|
Packit |
6c4009 |
regfree (&re);
|
|
Packit |
6c4009 |
|
|
Packit |
6c4009 |
for (i = 0; i < 20 && *p != '\0'; ++i)
|
|
Packit |
6c4009 |
{
|
|
Packit |
6c4009 |
int rm_so, rm_eo;
|
|
Packit |
6c4009 |
|
|
Packit |
6c4009 |
rm_so = strtol (p, &q, 10);
|
|
Packit |
6c4009 |
if (p == q)
|
|
Packit |
6c4009 |
break;
|
|
Packit |
6c4009 |
p = q;
|
|
Packit |
6c4009 |
|
|
Packit |
6c4009 |
rm_eo = strtol (p, &q, 10);
|
|
Packit |
6c4009 |
if (p == q)
|
|
Packit |
6c4009 |
break;
|
|
Packit |
6c4009 |
p = q;
|
|
Packit |
6c4009 |
|
|
Packit |
6c4009 |
if (rm[i].rm_so != rm_so || rm[i].rm_eo != rm_eo)
|
|
Packit |
6c4009 |
{
|
|
Packit |
6c4009 |
printf ("FAIL rm[%d] %d..%d != expected %d..%d\n",
|
|
Packit |
6c4009 |
i, rm[i].rm_so, rm[i].rm_eo, rm_so, rm_eo);
|
|
Packit |
6c4009 |
ret = 1;
|
|
Packit |
6c4009 |
break;
|
|
Packit |
6c4009 |
}
|
|
Packit |
6c4009 |
}
|
|
Packit |
6c4009 |
}
|
|
Packit |
6c4009 |
|
|
Packit |
6c4009 |
free (line);
|
|
Packit |
6c4009 |
fclose (f);
|
|
Packit |
6c4009 |
return ret;
|
|
Packit |
6c4009 |
}
|