165 lines
3.1 KiB
C
165 lines
3.1 KiB
C
/* Main program for interactive testing. For maximum output, compile
|
||
this and regex.c with -DDEBUG. */
|
||
|
||
#include <stdio.h>
|
||
#include <sys/types.h>
|
||
#include "regex.h"
|
||
|
||
/* Don't bother to guess about <string.h> vs <strings.h>, etc. */
|
||
extern int strlen ();
|
||
|
||
#define BYTEWIDTH 8
|
||
|
||
extern void printchar ();
|
||
extern char upcase[];
|
||
|
||
static void scanstring ();
|
||
static void print_regs ();
|
||
|
||
int
|
||
main (argc, argv)
|
||
int argc;
|
||
char **argv;
|
||
{
|
||
int i;
|
||
struct re_pattern_buffer buf;
|
||
char fastmap[(1 << BYTEWIDTH)];
|
||
|
||
/* Allow a command argument to specify the style of syntax. You can
|
||
use the `syntax' program to decode integer syntax values. */
|
||
if (argc > 1)
|
||
re_set_syntax (atoi (argv[1]));
|
||
|
||
buf.allocated = 0;
|
||
buf.buffer = NULL;
|
||
buf.fastmap = fastmap;
|
||
buf.translate = upcase;
|
||
|
||
for (;;)
|
||
{
|
||
char pat[500], str[500];
|
||
struct re_registers regs;
|
||
|
||
/* Some C compilers don't like `char pat[500] = ""'. */
|
||
pat[0] = 0;
|
||
|
||
printf ("Pattern (%s) = ", pat);
|
||
gets (pat);
|
||
scanstring (pat);
|
||
|
||
if (feof (stdin))
|
||
{
|
||
putchar ('\n');
|
||
exit (0);
|
||
}
|
||
|
||
if (*pat)
|
||
{
|
||
re_compile_pattern (pat, strlen (pat), &buf);
|
||
re_compile_fastmap (&buf);
|
||
#ifdef DEBUG
|
||
print_compiled_pattern (&buf);
|
||
#endif
|
||
}
|
||
|
||
printf ("String = ");
|
||
gets (str); /* Now read the string to match against */
|
||
scanstring (str);
|
||
|
||
i = re_match (&buf, str, strlen (str), 0, ®s);
|
||
printf ("Match value %d.\t", i);
|
||
if (i >= 0)
|
||
print_regs (regs);
|
||
putchar ('\n');
|
||
|
||
i = re_search (&buf, str, strlen (str), 0, strlen (str), ®s);
|
||
printf ("Search value %d.\t", i);
|
||
if (i >= 0)
|
||
print_regs (regs);
|
||
putchar ('\n');
|
||
}
|
||
|
||
/* We never get here, but what the heck. */
|
||
return 0;
|
||
}
|
||
|
||
void
|
||
scanstring (s)
|
||
char *s;
|
||
{
|
||
char *write = s;
|
||
|
||
while (*s != '\0')
|
||
{
|
||
if (*s == '\\')
|
||
{
|
||
s++;
|
||
|
||
switch (*s)
|
||
{
|
||
case '\0':
|
||
break;
|
||
|
||
case '0': case '1': case '2': case '3': case '4':
|
||
case '5': case '6': case '7': case '8': case '9':
|
||
*write = *s++ - '0';
|
||
|
||
if ('0' <= *s && *s <= '9')
|
||
{
|
||
*write = (*write << 3) + (*s++ - '0');
|
||
if ('0' <= *s && *s <= '9')
|
||
*write = (*write << 3) + (*s++ - '0');
|
||
}
|
||
write++;
|
||
break;
|
||
|
||
case 'n':
|
||
*write++ = '\n';
|
||
s++;
|
||
break;
|
||
|
||
case 't':
|
||
*write++ = '\t';
|
||
s++;
|
||
break;
|
||
|
||
default:
|
||
*write++ = *s++;
|
||
break;
|
||
}
|
||
}
|
||
else
|
||
*write++ = *s++;
|
||
}
|
||
|
||
*write++ = '\0';
|
||
}
|
||
|
||
/* Print REGS in human-readable form. */
|
||
|
||
void
|
||
print_regs (regs)
|
||
struct re_registers regs;
|
||
{
|
||
int i, end;
|
||
|
||
printf ("Registers: ");
|
||
|
||
if (regs.num_regs == 0 || regs.start[0] == -1)
|
||
{
|
||
printf ("(none)");
|
||
}
|
||
else
|
||
{
|
||
/* Find the last register pair that matched. */
|
||
for (end = regs.num_regs - 1; end >= 0; end--)
|
||
if (regs.start[end] != -1)
|
||
break;
|
||
|
||
printf ("[%d ", regs.start[0]);
|
||
for (i = 1; i <= end; i++)
|
||
printf ("(%d %d) ", regs.start[i], regs.end[i]);
|
||
printf ("%d]", regs.end[0]);
|
||
}
|
||
}
|