glibc/posix/tst-fnmatch.c

394 lines
7.8 KiB
C
Raw Normal View History

/* Tests for fnmatch function.
Copyright (C) 2000-2018 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */
#include <errno.h>
#include <error.h>
#include <fnmatch.h>
#include <locale.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
2010-11-12 16:51:28 +08:00
#include <mcheck.h>
static char *next_input (char **line, int first, int last);
static int convert_flags (const char *str);
static char *flag_output (int flags);
static char *escape (const char *str, size_t *reslenp, char **resbuf);
Modify several tests to use test-skeleton.c This patch modifies several test cases to use test-skeleton.c. It was generated by a bash script written for this purpose and thus excludes several other tests which I deemed worth a visual inspection before making the change. I intend to follow up with individual patches to the tests skipped by the script. The script itself resides at http://git.io/WODAmg and should reproduce this very patch when run against master. ChangeLog: 2014-10-30 Arjun Shankar <arjun.is@lostca.se> * catgets/test-gencat.c: Use test-skeleton.c. * catgets/tst-catgets.c: Likewise. * csu/tst-empty.c: Likewise. * elf/tst-audit2.c: Likewise. * elf/tst-global1.c: Likewise. * elf/tst-pathopt.c: Likewise. * elf/tst-piemod1.c: Likewise. * elf/tst-tls10.c: Likewise. * elf/tst-tls11.c: Likewise. * elf/tst-tls12.c: Likewise. * gnulib/tst-gcc.c: Likewise. * iconvdata/tst-e2big.c: Likewise. * iconvdata/tst-loading.c: Likewise. * iconv/tst-iconv1.c: Likewise. * iconv/tst-iconv2.c: Likewise. * inet/test-inet6_opt.c: Likewise. * inet/tst-gethnm.c: Likewise. * inet/tst-network.c: Likewise. * inet/tst-ntoa.c: Likewise. * intl/tst-codeset.c: Likewise. * intl/tst-gettext2.c: Likewise. * intl/tst-gettext3.c: Likewise. * intl/tst-ngettext.c: Likewise. * intl/tst-translit.c: Likewise. * io/test-stat.c: Likewise. * libio/test-fmemopen.c: Likewise. * libio/tst-freopen.c: Likewise. * libio/tst-sscanf.c: Likewise. * libio/tst-ungetwc1.c: Likewise. * libio/tst-ungetwc2.c: Likewise. * libio/tst-widetext.c: Likewise. * localedata/tst-ctype.c: Likewise. * localedata/tst-digits.c: Likewise. * localedata/tst-leaks.c: Likewise. * localedata/tst-mbswcs1.c: Likewise. * localedata/tst-mbswcs2.c: Likewise. * localedata/tst-mbswcs3.c: Likewise. * localedata/tst-mbswcs4.c: Likewise. * localedata/tst-mbswcs5.c: Likewise. * localedata/tst-setlocale.c: Likewise. * localedata/tst-trans.c: Likewise. * localedata/tst-wctype.c: Likewise. * localedata/tst-xlocale1.c: Likewise. * login/tst-grantpt.c: Likewise. * malloc/tst-calloc.c: Likewise. * malloc/tst-malloc.c: Likewise. * malloc/tst-mallocstate.c: Likewise. * malloc/tst-mcheck.c: Likewise. * malloc/tst-mtrace.c: Likewise. * malloc/tst-obstack.c: Likewise. * math/atest-exp2.c: Likewise. * math/atest-exp.c: Likewise. * math/atest-sincos.c: Likewise. * math/test-matherr.c: Likewise. * math/test-misc.c: Likewise. * math/test-powl.c: Likewise. * math/tst-definitions.c: Likewise. * misc/tst-dirname.c: Likewise. * misc/tst-efgcvt.c: Likewise. * misc/tst-fdset.c: Likewise. * misc/tst-hsearch.c: Likewise. * misc/tst-mntent2.c: Likewise. * nptl/tst-sem7.c: Likewise. * nptl/tst-sem8.c: Likewise. * nptl/tst-sem9.c: Likewise. * nss/test-netdb.c: Likewise. * posix/tst-fnmatch.c: Likewise. * posix/tst-getlogin.c: Likewise. * posix/tst-gnuglob.c: Likewise. * posix/tst-mmap.c: Likewise. * pwd/tst-getpw.c: Likewise. * resolv/tst-inet_ntop.c: Likewise. * rt/tst-timer.c: Likewise. * stdio-common/test-fseek.c: Likewise. * stdio-common/test-popen.c: Likewise. * stdio-common/test-vfprintf.c: Likewise. * stdio-common/tst-cookie.c: Likewise. * stdio-common/tst-fileno.c: Likewise. * stdio-common/tst-gets.c: Likewise. * stdio-common/tst-obprintf.c: Likewise. * stdio-common/tst-perror.c: Likewise. * stdio-common/tst-sprintf2.c: Likewise. * stdio-common/tst-sprintf3.c: Likewise. * stdio-common/tst-sprintf.c: Likewise. * stdio-common/tst-swprintf.c: Likewise. * stdio-common/tst-tmpnam.c: Likewise. * stdio-common/tst-unbputc.c: Likewise. * stdio-common/tst-wc-printf.c: Likewise. * stdlib/tst-environ.c: Likewise. * stdlib/tst-fmtmsg.c: Likewise. * stdlib/tst-limits.c: Likewise. * stdlib/tst-rand48-2.c: Likewise. * stdlib/tst-rand48.c: Likewise. * stdlib/tst-random2.c: Likewise. * stdlib/tst-random.c: Likewise. * stdlib/tst-strtol.c: Likewise. * stdlib/tst-strtoll.c: Likewise. * stdlib/tst-tls-atexit.c: Likewise. * stdlib/tst-xpg-basename.c: Likewise. * string/test-ffs.c: Likewise. * string/tst-bswap.c: Likewise. * string/tst-inlcall.c: Likewise. * string/tst-strtok.c: Likewise. * string/tst-strxfrm.c: Likewise. * sysdeps/x86_64/tst-audit10.c: Likewise. * sysdeps/x86_64/tst-audit3.c: Likewise. * sysdeps/x86_64/tst-audit4.c: Likewise. * sysdeps/x86_64/tst-audit5.c: Likewise. * time/tst-ftime_l.c: Likewise. * time/tst-getdate.c: Likewise. * time/tst-mktime3.c: Likewise. * time/tst-mktime.c: Likewise. * time/tst-posixtz.c: Likewise. * time/tst-strptime2.c: Likewise. * time/tst-strptime3.c: Likewise. * wcsmbs/tst-btowc.c: Likewise. * wcsmbs/tst-mbrtowc.c: Likewise. * wcsmbs/tst-mbsrtowcs.c: Likewise. * wcsmbs/tst-wchar-h.c: Likewise. * wcsmbs/tst-wcpncpy.c: Likewise. * wcsmbs/tst-wcrtomb.c: Likewise. * wcsmbs/tst-wcsnlen.c: Likewise. * wcsmbs/tst-wcstof.c: Likewise.
2014-11-05 17:54:08 +08:00
static int
do_test (void)
{
char *linebuf = NULL;
size_t linebuflen = 0;
int ntests = 0;
int nfailed = 0;
char *escinput = NULL;
size_t escinputlen = 0;
char *escpattern = NULL;
size_t escpatternlen = 0;
int nr = 0;
2010-11-12 16:51:28 +08:00
mtrace ();
/* Read lines from stdin with the following format:
locale input-string match-string flags result
where `result' is either 0 or 1. If the first character of a
string is '"' we read until the next '"' and handled escaped '"'. */
while (! feof (stdin))
{
ssize_t n = getline (&linebuf, &linebuflen, stdin);
char *cp;
const char *locale;
const char *input;
const char *pattern;
const char *result_str;
int result;
const char *flags;
int flags_val;
int fnmres;
char numbuf[24];
if (n == -1)
break;
if (n == 0)
/* Maybe an empty line. */
continue;
/* Skip over all leading white spaces. */
cp = linebuf;
locale = next_input (&cp, 1, 0);
if (locale == NULL)
continue;
input = next_input (&cp, 0, 0);
if (input == NULL)
continue;
pattern = next_input (&cp, 0, 0);
if (pattern == NULL)
continue;
result_str = next_input (&cp, 0, 0);
if (result_str == NULL)
continue;
if (strcmp (result_str, "0") == 0)
result = 0;
else if (strcasecmp (result_str, "NOMATCH") == 0)
result = FNM_NOMATCH;
else
{
char *endp;
result = strtol (result_str, &endp, 0);
if (*endp != '\0')
continue;
}
flags = next_input (&cp, 0, 1);
if (flags == NULL)
/* We allow the flags missing. */
flags = "";
/* Convert the text describing the flags in a numeric value. */
flags_val = convert_flags (flags);
if (flags_val == -1)
/* Something went wrong. */
continue;
/* Now run the actual test. */
++ntests;
2000-07-05 04:56:12 +08:00
if (setlocale (LC_COLLATE, locale) == NULL
|| setlocale (LC_CTYPE, locale) == NULL)
{
puts ("*** Cannot set locale");
++nfailed;
continue;
}
fnmres = fnmatch (pattern, input, flags_val);
printf ("%3d: fnmatch (\"%s\", \"%s\", %s) = %s%c",
++nr,
escape (pattern, &escpatternlen, &escpattern),
escape (input, &escinputlen, &escinput),
flag_output (flags_val),
(fnmres == 0
? "0" : (fnmres == FNM_NOMATCH
? "FNM_NOMATCH"
: (sprintf (numbuf, "%d", fnmres), numbuf))),
(fnmres != 0) != (result != 0) ? ' ' : '\n');
if ((fnmres != 0) != (result != 0))
{
printf ("(FAIL, expected %s) ***\n",
result == 0
? "0" : (result == FNM_NOMATCH
? "FNM_NOMATCH"
: (sprintf (numbuf, "%d", result), numbuf)));
++nfailed;
}
}
printf ("=====================\n%3d tests, %3d failed\n", ntests, nfailed);
free (escpattern);
free (escinput);
free (linebuf);
return nfailed != 0;
}
static char *
next_input (char **line, int first, int last)
{
char *cp = *line;
char *result;
while (*cp == ' ' || *cp == '\t')
++cp;
/* We allow comment lines starting with '#'. */
if (first && *cp == '#')
return NULL;
if (*cp == '"')
{
char *wp;
result = ++cp;
wp = cp;
while (*cp != '"' && *cp != '\0' && *cp != '\n')
if (*cp == '\\')
{
if (cp[1] == '\n' || cp[1] == '\0')
return NULL;
++cp;
if (*cp == 't')
*wp++ = '\t';
else if (*cp == 'n')
*wp++ = '\n';
else
*wp++ = *cp;
++cp;
}
else
*wp++ = *cp++;
if (*cp != '"')
return NULL;
if (wp != cp)
*wp = '\0';
}
else
{
result = cp;
while (*cp != '\0' && *cp != '\n' && *cp != ' ' && *cp != '\t')
++cp;
if (cp == result && ! last)
/* Premature end of line. */
return NULL;
}
/* Terminate and skip over the next white spaces. */
*cp++ = '\0';
*line = cp;
return result;
}
static int
convert_flags (const char *str)
{
int result = 0;
while (*str != '\0')
{
int len;
if (strncasecmp (str, "PATHNAME", 8) == 0
&& (str[8] == '|' || str[8] == '\0'))
{
result |= FNM_PATHNAME;
len = 8;
}
else if (strncasecmp (str, "NOESCAPE", 8) == 0
&& (str[8] == '|' || str[8] == '\0'))
{
result |= FNM_NOESCAPE;
len = 8;
}
else if (strncasecmp (str, "PERIOD", 6) == 0
&& (str[6] == '|' || str[6] == '\0'))
{
result |= FNM_PERIOD;
len = 6;
}
else if (strncasecmp (str, "LEADING_DIR", 11) == 0
&& (str[11] == '|' || str[11] == '\0'))
{
result |= FNM_LEADING_DIR;
len = 11;
}
else if (strncasecmp (str, "CASEFOLD", 8) == 0
&& (str[8] == '|' || str[8] == '\0'))
{
result |= FNM_CASEFOLD;
len = 8;
}
else if (strncasecmp (str, "EXTMATCH", 8) == 0
&& (str[8] == '|' || str[8] == '\0'))
{
result |= FNM_EXTMATCH;
len = 8;
}
else
return -1;
str += len;
if (*str != '\0')
++str;
}
return result;
}
static char *
flag_output (int flags)
{
static char buf[100];
int first = 1;
char *cp = buf;
if (flags & FNM_PATHNAME)
{
cp = stpcpy (cp, "FNM_PATHNAME");
first = 0;
}
if (flags & FNM_NOESCAPE)
{
if (! first)
*cp++ = '|';
cp = stpcpy (cp, "FNM_NOESCAPE");
first = 0;
}
if (flags & FNM_PERIOD)
{
if (! first)
*cp++ = '|';
cp = stpcpy (cp, "FNM_PERIOD");
first = 0;
}
if (flags & FNM_LEADING_DIR)
{
if (! first)
*cp++ = '|';
cp = stpcpy (cp, "FNM_LEADING_DIR");
first = 0;
}
if (flags & FNM_CASEFOLD)
{
if (! first)
*cp++ = '|';
cp = stpcpy (cp, "FNM_CASEFOLD");
first = 0;
}
if (flags & FNM_EXTMATCH)
{
if (! first)
*cp++ = '|';
cp = stpcpy (cp, "FNM_EXTMATCH");
first = 0;
}
if (cp == buf)
*cp++ = '0';
*cp = '\0';
return buf;
}
static char *
escape (const char *str, size_t *reslenp, char **resbufp)
{
size_t reslen = *reslenp;
char *resbuf = *resbufp;
size_t len = strlen (str);
char *wp;
if (2 * len + 1 > reslen)
{
resbuf = (char *) realloc (resbuf, 2 * len + 1);
if (resbuf == NULL)
error (EXIT_FAILURE, errno, "while allocating buffer for printing");
*reslenp = 2 * len + 1;
*resbufp = resbuf;
}
wp = resbuf;
while (*str != '\0')
if (*str == '\t')
{
*wp++ = '\\';
*wp++ = 't';
++str;
}
else if (*str == '\n')
{
*wp++ = '\\';
*wp++ = 'n';
++str;
}
else if (*str == '"')
{
*wp++ = '\\';
*wp++ = '"';
++str;
}
else if (*str == '\\')
{
*wp++ = '\\';
*wp++ = '\\';
++str;
}
else
*wp++ = *str++;
*wp = '\0';
return resbuf;
}
Modify several tests to use test-skeleton.c This patch modifies several test cases to use test-skeleton.c. It was generated by a bash script written for this purpose and thus excludes several other tests which I deemed worth a visual inspection before making the change. I intend to follow up with individual patches to the tests skipped by the script. The script itself resides at http://git.io/WODAmg and should reproduce this very patch when run against master. ChangeLog: 2014-10-30 Arjun Shankar <arjun.is@lostca.se> * catgets/test-gencat.c: Use test-skeleton.c. * catgets/tst-catgets.c: Likewise. * csu/tst-empty.c: Likewise. * elf/tst-audit2.c: Likewise. * elf/tst-global1.c: Likewise. * elf/tst-pathopt.c: Likewise. * elf/tst-piemod1.c: Likewise. * elf/tst-tls10.c: Likewise. * elf/tst-tls11.c: Likewise. * elf/tst-tls12.c: Likewise. * gnulib/tst-gcc.c: Likewise. * iconvdata/tst-e2big.c: Likewise. * iconvdata/tst-loading.c: Likewise. * iconv/tst-iconv1.c: Likewise. * iconv/tst-iconv2.c: Likewise. * inet/test-inet6_opt.c: Likewise. * inet/tst-gethnm.c: Likewise. * inet/tst-network.c: Likewise. * inet/tst-ntoa.c: Likewise. * intl/tst-codeset.c: Likewise. * intl/tst-gettext2.c: Likewise. * intl/tst-gettext3.c: Likewise. * intl/tst-ngettext.c: Likewise. * intl/tst-translit.c: Likewise. * io/test-stat.c: Likewise. * libio/test-fmemopen.c: Likewise. * libio/tst-freopen.c: Likewise. * libio/tst-sscanf.c: Likewise. * libio/tst-ungetwc1.c: Likewise. * libio/tst-ungetwc2.c: Likewise. * libio/tst-widetext.c: Likewise. * localedata/tst-ctype.c: Likewise. * localedata/tst-digits.c: Likewise. * localedata/tst-leaks.c: Likewise. * localedata/tst-mbswcs1.c: Likewise. * localedata/tst-mbswcs2.c: Likewise. * localedata/tst-mbswcs3.c: Likewise. * localedata/tst-mbswcs4.c: Likewise. * localedata/tst-mbswcs5.c: Likewise. * localedata/tst-setlocale.c: Likewise. * localedata/tst-trans.c: Likewise. * localedata/tst-wctype.c: Likewise. * localedata/tst-xlocale1.c: Likewise. * login/tst-grantpt.c: Likewise. * malloc/tst-calloc.c: Likewise. * malloc/tst-malloc.c: Likewise. * malloc/tst-mallocstate.c: Likewise. * malloc/tst-mcheck.c: Likewise. * malloc/tst-mtrace.c: Likewise. * malloc/tst-obstack.c: Likewise. * math/atest-exp2.c: Likewise. * math/atest-exp.c: Likewise. * math/atest-sincos.c: Likewise. * math/test-matherr.c: Likewise. * math/test-misc.c: Likewise. * math/test-powl.c: Likewise. * math/tst-definitions.c: Likewise. * misc/tst-dirname.c: Likewise. * misc/tst-efgcvt.c: Likewise. * misc/tst-fdset.c: Likewise. * misc/tst-hsearch.c: Likewise. * misc/tst-mntent2.c: Likewise. * nptl/tst-sem7.c: Likewise. * nptl/tst-sem8.c: Likewise. * nptl/tst-sem9.c: Likewise. * nss/test-netdb.c: Likewise. * posix/tst-fnmatch.c: Likewise. * posix/tst-getlogin.c: Likewise. * posix/tst-gnuglob.c: Likewise. * posix/tst-mmap.c: Likewise. * pwd/tst-getpw.c: Likewise. * resolv/tst-inet_ntop.c: Likewise. * rt/tst-timer.c: Likewise. * stdio-common/test-fseek.c: Likewise. * stdio-common/test-popen.c: Likewise. * stdio-common/test-vfprintf.c: Likewise. * stdio-common/tst-cookie.c: Likewise. * stdio-common/tst-fileno.c: Likewise. * stdio-common/tst-gets.c: Likewise. * stdio-common/tst-obprintf.c: Likewise. * stdio-common/tst-perror.c: Likewise. * stdio-common/tst-sprintf2.c: Likewise. * stdio-common/tst-sprintf3.c: Likewise. * stdio-common/tst-sprintf.c: Likewise. * stdio-common/tst-swprintf.c: Likewise. * stdio-common/tst-tmpnam.c: Likewise. * stdio-common/tst-unbputc.c: Likewise. * stdio-common/tst-wc-printf.c: Likewise. * stdlib/tst-environ.c: Likewise. * stdlib/tst-fmtmsg.c: Likewise. * stdlib/tst-limits.c: Likewise. * stdlib/tst-rand48-2.c: Likewise. * stdlib/tst-rand48.c: Likewise. * stdlib/tst-random2.c: Likewise. * stdlib/tst-random.c: Likewise. * stdlib/tst-strtol.c: Likewise. * stdlib/tst-strtoll.c: Likewise. * stdlib/tst-tls-atexit.c: Likewise. * stdlib/tst-xpg-basename.c: Likewise. * string/test-ffs.c: Likewise. * string/tst-bswap.c: Likewise. * string/tst-inlcall.c: Likewise. * string/tst-strtok.c: Likewise. * string/tst-strxfrm.c: Likewise. * sysdeps/x86_64/tst-audit10.c: Likewise. * sysdeps/x86_64/tst-audit3.c: Likewise. * sysdeps/x86_64/tst-audit4.c: Likewise. * sysdeps/x86_64/tst-audit5.c: Likewise. * time/tst-ftime_l.c: Likewise. * time/tst-getdate.c: Likewise. * time/tst-mktime3.c: Likewise. * time/tst-mktime.c: Likewise. * time/tst-posixtz.c: Likewise. * time/tst-strptime2.c: Likewise. * time/tst-strptime3.c: Likewise. * wcsmbs/tst-btowc.c: Likewise. * wcsmbs/tst-mbrtowc.c: Likewise. * wcsmbs/tst-mbsrtowcs.c: Likewise. * wcsmbs/tst-wchar-h.c: Likewise. * wcsmbs/tst-wcpncpy.c: Likewise. * wcsmbs/tst-wcrtomb.c: Likewise. * wcsmbs/tst-wcsnlen.c: Likewise. * wcsmbs/tst-wcstof.c: Likewise.
2014-11-05 17:54:08 +08:00
#define TEST_FUNCTION do_test ()
#include "../test-skeleton.c"