/* -*-c-*-
*
- * $Id: anag.c,v 1.2 2001/02/07 09:09:11 mdw Exp $
+ * $Id: anag.c,v 1.5 2002/08/11 12:58:09 mdw Exp $
*
* Main driver for anag
*
/*----- Revision history --------------------------------------------------*
*
* $Log: anag.c,v $
+ * Revision 1.5 2002/08/11 12:58:09 mdw
+ * Added support for regular expression matching, if supported by the C
+ * library.
+ *
+ * Revision 1.4 2001/02/19 19:18:50 mdw
+ * Minor big fixes to parser.
+ *
+ * Revision 1.3 2001/02/16 21:45:19 mdw
+ * Be more helpful. Improve full help message. Special-case error for
+ * empty command strings.
+ *
* Revision 1.2 2001/02/07 09:09:11 mdw
* Fix spurious error when `-file' is used.
*
usage(fp);
fputs("\n\
Searches a wordlist, printing all of the words which match an expression.\n\
+\n\
+Options supported are:\n\
+\n\
+-h, --help display this help text\n\
+-v, --version display the program's version number\n\
+-u, --usage display a very brief usage message\n\
+-f, --file FILE read wordlist from FILE, not `" DICTIONARY "'\n\
+\n\
The basic tests in the expression are:\n\
\n\
-anagram WORD matches a full-length anagram\n\
-subgram WORD matches words which only use letters in WORD\n\
-wildcard PATTERN matches with wildcards `*' and `?'\n\
-trackword WORD matches words which can be found in a trackword\n\
+"
+#ifdef HAVE_REGCOMP
+"\
+-regexp REGEXP matches with an (extended) regular expression\n\
+"
+#endif
+"\
\n\
These simple tests can be combined using the operators `-a', `-o' and `-n'\n\
(for `and', `or' and `not'; they may also be written `&', `|' and `!' if\n\
O_HELP, O_VERSION, O_USAGE,
O_FILE,
O_AND, O_OR, O_NOT, O_LPAREN, O_RPAREN,
- O_ANAG, O_SUBG, O_WILD, O_TRACK,
+ O_ANAG, O_SUBG, O_WILD, O_TRACK, O_REGEXP,
O_EOF
};
{ "subgram", 1, 0, O_SUBG },
{ "wildcard", 1, 0, O_WILD },
{ "trackword", 1, 0, O_TRACK },
+#ifdef HAVE_REGCOMP
+ { "regexp", 1, 0, O_REGEXP },
+#endif
/* --- End marker --- */
p_next(p);
p_expr(p, nn);
if (p->t != O_RPAREN)
- die("syntax error near `%s': missing `('", *p->a);
+ die("syntax error near `%s': missing `)'", *p->a);
p_next(p);
} else if (p->t == O_NOT) {
n = xmalloc(sizeof(node_un));
case O_SUBG: *nn = subgram(p->a + 1); break;
case O_WILD: *nn = wildcard(p->a + 1); break;
case O_TRACK: *nn = trackword(p->a + 1); break;
+#ifdef HAVE_REGCOMP
+ case O_REGEXP: *nn = regexp(p->a + 1); break;
+#endif
default: die("syntax error near `%s': unexpected token", *p->a);
}
p_next(p);
p_next(p);
default:
break;
- case O_LPAREN:
case O_RPAREN:
case O_OR:
case O_EOF:
ac = argc;
ai = 1;
p_next(&p);
+ if (p.t == O_EOF) {
+ usage(stderr);
+ pquis(stderr, "(Run `$ --help' for more detail.)\n");
+ exit(EXIT_FAILURE);
+ }
p_expr(&p, &n);
if (p.t != O_EOF) {
die("syntax error near `%s': rubbish at end of line (too many `)'s?)",