diff options
author | Ulrich Drepper <drepper@redhat.com> | 2003-12-04 08:04:57 +0000 |
---|---|---|
committer | Ulrich Drepper <drepper@redhat.com> | 2003-12-04 08:04:57 +0000 |
commit | 6c805a2b9def1eb11a5db00b8184fb57a1e4d561 (patch) | |
tree | 8aacb5a1af4ed3830c74e98733f5d743ce1647b9 /posix/tst-boost.c | |
parent | ea08adbf176bf8df4e57af126f3cbd623f3fa23f (diff) | |
download | glibc-6c805a2b9def1eb11a5db00b8184fb57a1e4d561.tar glibc-6c805a2b9def1eb11a5db00b8184fb57a1e4d561.tar.gz glibc-6c805a2b9def1eb11a5db00b8184fb57a1e4d561.tar.bz2 glibc-6c805a2b9def1eb11a5db00b8184fb57a1e4d561.zip |
Update.
2003-12-03 Jakub Jelinek <jakub@redhat.com>
* posix/Makefile (distribute): Add BOOST.tests.
(tests): Add tst-boost, depend on tst-boost-mem.
(generated): Add tst-boost-mem and tst-boost.mtrace.
(tst-boost-ARGS, tst-boost-ENV): Set.
($(objpfx)tst-boost-mem): New.
* posix/tst-boost.c: New test.
* posix/BOOST.tests: New file.
* posix/Makefile (distribute): Add PCRE.tests.
(tests): Add tst-pcre, depend on tst-pcre-mem.
(generated): Add tst-pcre-mem and tst-pcre.mtrace.
(tst-pcre-ARGS, tst-pcre-ENV): Set.
($(objpfx)tst-pcre-mem): New.
* posix/tst-pcre.c: New test.
* posix/PCRE.tests: New file.
2003-12-02 Jakub Jelinek <jakub@redhat.com>
* intl/locale.alias: Use nb_NO instead of no_NO for bokm.l.
* sysdeps/powerpc/fpu/libm-test-ulps: Regenerated.
* sysdeps/s390/fpu/libm-test-ulps: Regenerated.
Diffstat (limited to 'posix/tst-boost.c')
-rw-r--r-- | posix/tst-boost.c | 227 |
1 files changed, 227 insertions, 0 deletions
diff --git a/posix/tst-boost.c b/posix/tst-boost.c new file mode 100644 index 0000000000..8446a2e54e --- /dev/null +++ b/posix/tst-boost.c @@ -0,0 +1,227 @@ +/* Regular expression tests. + Copyright (C) 2003 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Jakub Jelinek <jakub@redhat.com>, 2003. + + 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, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +#include <sys/types.h> +#include <mcheck.h> +#include <regex.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +void +frob_escapes (char *src, int pattern) +{ + char *dst; + + for (dst = src; *src != '\0'; dst++, src++) + { + if (*src == '\\') + { + switch (src[1]) + { + case 't': + src++; + *dst = '\t'; + continue; + case 'n': + src++; + *dst = '\n'; + continue; + case 'r': + src++; + *dst = '\r'; + continue; + case '\\': + case '^': + case '{': + case '|': + case '}': + if (!pattern) + { + src++; + *dst = *src; + continue; + } + break; + } + } + if (src != dst) + *dst = *src; + } + *dst = '\0'; +} + +int +main (int argc, char **argv) +{ + int ret = 0, n; + char *line = NULL; + size_t line_len = 0; + ssize_t len; + FILE *f; + char *pattern, *string; + int flags = REG_EXTENDED; + int eflags = 0; + regex_t re; + regmatch_t rm[20]; + + mtrace (); + + if (argc < 2) + { + fprintf (stderr, "Missing test filename\n"); + return 1; + } + + f = fopen (argv[1], "r"); + if (f == NULL) + { + fprintf (stderr, "Couldn't open %s\n", argv[1]); + return 1; + } + + while ((len = getline (&line, &line_len, f)) > 0) + { + char *p, *q; + int i; + + if (line[len - 1] == '\n') + line[--len] = '\0'; + + puts (line); + + if (line[0] == ';') + continue; + + if (line[0] == '\0') + continue; + + if (line[0] == '-') + { + if (strstr (line, "REG_BASIC")) + flags = 0; + else + flags = REG_EXTENDED; + if (strstr (line, "REG_ICASE")) + flags |= REG_ICASE; + if (strstr (line, "REG_NEWLINE")) + flags |= REG_NEWLINE; + eflags = 0; + if (strstr (line, "REG_NOTBOL")) + eflags |= REG_NOTBOL; + if (strstr (line, "REG_NOTEOL")) + eflags |= REG_NOTEOL; + continue; + } + + pattern = line + strspn (line, " \t"); + if (*pattern == '\0') + continue; + p = pattern + strcspn (pattern, " \t"); + if (*p == '\0') + continue; + *p++ = '\0'; + + string = p + strspn (p, " \t"); + if (*string == '\0') + continue; + if (*string == '"') + { + string++; + p = strchr (string, '"'); + if (p == NULL) + continue; + *p++ = '\0'; + } + else + { + p = string + strcspn (string, " \t"); + if (*string == '!') + string = NULL; + else if (*p == '\0') + continue; + else + *p++ = '\0'; + } + + frob_escapes (pattern, 1); + if (string != NULL) + frob_escapes (string, 0); + + n = regcomp (&re, pattern, flags); + if (n != 0) + { + if (string != NULL) + { + char buf[500]; + regerror (n, &re, buf, sizeof (buf)); + printf ("FAIL regcomp unexpectedly failed: %s\n", + buf); + ret = 1; + } + continue; + } + else if (string == NULL) + { + regfree (&re); + puts ("FAIL regcomp unpexpectedly succeeded"); + ret = 1; + continue; + } + + if (regexec (&re, string, 20, rm, eflags)) + { + for (i = 0; i < 20; ++i) + { + rm[i].rm_so = -1; + rm[i].rm_eo = -1; + } + } + + regfree (&re); + + for (i = 0; i < 20 && *p != '\0'; ++i) + { + int rm_so, rm_eo; + + rm_so = strtol (p, &q, 10); + if (p == q) + break; + p = q; + + rm_eo = strtol (p, &q, 10); + if (p == q) + break; + p = q; + + if (rm[i].rm_so != rm_so || rm[i].rm_eo != rm_eo) + { + printf ("FAIL rm[%d] %d..%d != expected %d..%d\n", + i, rm[i].rm_so, rm[i].rm_eo, rm_so, rm_eo); + ret = 1; + break; + } + } + } + + free (line); + fclose (f); + return ret; +} |