| /*********************************************************** |
| |
| Copyright 1995 by Tom Lord |
| |
| All Rights Reserved |
| |
| Permission to use, copy, modify, and distribute this software and its |
| documentation for any purpose and without fee is hereby granted, |
| provided that the above copyright notice appear in all copies and that |
| both that copyright notice and this permission notice appear in |
| supporting documentation, and that the name of the copyright holder not be |
| used in advertising or publicity pertaining to distribution of the |
| software without specific, written prior permission. |
| |
| Tom Lord DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, |
| INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO |
| EVENT SHALL TOM LORD BE LIABLE FOR ANY SPECIAL, INDIRECT OR |
| CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF |
| USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR |
| OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR |
| PERFORMANCE OF THIS SOFTWARE. |
| |
| ******************************************************************/ |
| |
| |
| |
| #ifdef HAVE_CONFIG_H |
| #include "config.h" |
| #endif |
| |
| #include <sys/types.h> |
| #include <regex.h> |
| #include <stdio.h> |
| #include <stdlib.h> |
| #include <string.h> |
| |
| |
| |
| struct a_test |
| { |
| int expected; |
| const char * pattern; |
| const unsigned char * data; |
| }; |
| |
| static const struct a_test the_tests[] = |
| { |
| #include "testcases.h" |
| {-1, 0, 0} |
| }; |
| |
| |
| |
| |
| static int |
| run_a_test (int id, const struct a_test * t) |
| { |
| static const char * last_pattern = 0; |
| static regex_t r; |
| int err; |
| char errmsg[100]; |
| int x; |
| regmatch_t regs[10]; |
| |
| if (!last_pattern || strcmp (last_pattern, t->pattern)) |
| { |
| if (last_pattern) |
| regfree (&r); |
| last_pattern = t->pattern; |
| err = regcomp (&r, t->pattern, REG_EXTENDED); |
| if (err) |
| { |
| if (t->expected == 2) |
| { |
| puts (" OK."); |
| return 0; |
| } |
| if (last_pattern) |
| regfree (&r); |
| last_pattern = NULL; |
| regerror (err, &r, errmsg, 100); |
| printf (" FAIL: %s.\n", errmsg); |
| return 1; |
| } |
| else if (t->expected == 2) |
| { |
| printf ("test %d\n", id); |
| printf ("pattern \"%s\" successfull compilation not expected\n", |
| t->pattern); |
| return 1; |
| } |
| } |
| |
| for (x = 0; x < 10; ++x) |
| regs[x].rm_so = regs[x].rm_eo = -1; |
| |
| err = regexec (&r, t->data, 10, regs, 0); |
| |
| if (err != t->expected) |
| { |
| printf ("test %d\n", id); |
| printf ("pattern \"%s\" data \"%s\" wanted %d got %d\n", |
| t->pattern, t->data, t->expected, err); |
| for (x = 0; x < 10; ++x) |
| if (regs[x].rm_so != -1) |
| printf ("reg %d == (%d, %d) %.*s\n", |
| x, |
| regs[x].rm_so, |
| regs[x].rm_eo, |
| regs[x].rm_eo - regs[x].rm_so, |
| t->data + regs[x].rm_so); |
| return 1; |
| } |
| puts (" OK."); |
| return 0; |
| } |
| |
| |
| |
| int |
| main (int argc, char * argv[]) |
| { |
| int x; |
| int lo; |
| int hi; |
| int res = 0; |
| |
| lo = 0; |
| hi = (sizeof (the_tests) / sizeof (the_tests[0])) - 1; |
| |
| if (argc > 1) |
| { |
| lo = atoi (argv[1]); |
| hi = lo + 1; |
| |
| if (argc > 2) |
| hi = atoi (argv[2]); |
| } |
| |
| for (x = lo; x < hi; ++x) |
| { |
| printf ("#%d:", x); |
| res |= run_a_test (x, &the_tests[x]); |
| } |
| return res != 0; |
| } |