Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/games/fortune/fortune Tidy up regexp handling further.
details: https://anonhg.NetBSD.org/src/rev/c31ea2805646
branches: trunk
changeset: 747007:c31ea2805646
user: dholland <dholland%NetBSD.org@localhost>
date: Thu Aug 27 03:04:58 2009 +0000
description:
Tidy up regexp handling further.
diffstat:
games/fortune/fortune/fortune.c | 99 +++++++++++++++++++++++++---------------
1 files changed, 62 insertions(+), 37 deletions(-)
diffs (169 lines):
diff -r 654c6a11fad2 -r c31ea2805646 games/fortune/fortune/fortune.c
--- a/games/fortune/fortune/fortune.c Thu Aug 27 02:21:36 2009 +0000
+++ b/games/fortune/fortune/fortune.c Thu Aug 27 03:04:58 2009 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: fortune.c,v 1.60 2009/08/27 02:21:36 dholland Exp $ */
+/* $NetBSD: fortune.c,v 1.61 2009/08/27 03:04:58 dholland Exp $ */
/*-
* Copyright (c) 1986, 1993
@@ -42,7 +42,7 @@
#if 0
static char sccsid[] = "@(#)fortune.c 8.1 (Berkeley) 5/31/93";
#else
-__RCSID("$NetBSD: fortune.c,v 1.60 2009/08/27 02:21:36 dholland Exp $");
+__RCSID("$NetBSD: fortune.c,v 1.61 2009/08/27 03:04:58 dholland Exp $");
#endif
#endif /* not lint */
@@ -114,12 +114,15 @@
static bool Equal_probs = FALSE; /* scatter un-allocted prob equally */
#ifndef NO_REGEX
+struct re {
+ bool valid;
+ regex_t regex;
+};
+
static bool Match = FALSE; /* dump fortunes matching a pattern */
-static regex_t *Re_pat = NULL;
-static regex_t *Re_pat13 = NULL;
-static regex_t *Re_use = NULL;
-static int Re_code;
-static char Re_error[1024];
+struct re Re_pat;
+struct re Re_pat13;
+static struct re *Re_use = NULL;
#endif
#ifdef DEBUG
@@ -173,22 +176,12 @@
int main(int, char *[]);
#ifndef NO_REGEX
-
+static void re_setup(struct re *rx, const char *pattern);
+static void re_cleanup(struct re *rx);
static char *conv_pat(char *);
static int find_matches(void);
static void matches_in_list(FILEDESC *);
static size_t maxlen_in_list(FILEDESC *);
-
-#define RE_INIT(re) if ((re) == NULL && \
- ((re) = calloc(sizeof(*(re)), 1)) \
- == NULL) err(1, NULL)
-#define RE_COMP(re, p) (Re_code = regcomp((re), (p), REG_EXTENDED))
-#define RE_OK(re) (Re_code == 0)
-#define RE_EXEC(re, p) (!regexec((re), (p), 0, NULL, 0))
-#define RE_ERROR(re) (regerror(Re_code, (re), Re_error, \
- sizeof(Re_error)), Re_error)
-#define RE_FREE(re) if ((re) != NULL) do { regfree((re)); \
- (re) = NULL; } while (0)
#endif
#ifndef NAMLEN
@@ -388,19 +381,9 @@
if (pat != NULL) {
if (ignore_case)
pat = conv_pat(pat);
- RE_INIT(Re_pat);
- RE_COMP(Re_pat, pat);
- if (!RE_OK(Re_pat)) {
- warnx("%s: `%s'", RE_ERROR(Re_pat), pat);
- RE_FREE(Re_pat);
- }
+ re_setup(&Re_pat, pat);
rot13(pat, 0);
- RE_INIT(Re_pat13);
- RE_COMP(Re_pat13, pat);
- if (!RE_OK(Re_pat13)) {
- warnx("%s: `%s'", RE_ERROR(Re_pat13), pat);
- RE_FREE(Re_pat13);
- }
+ re_setup(&Re_pat13, pat);
}
#endif /* NO_REGEX */
}
@@ -1215,6 +1198,48 @@
}
#ifndef NO_REGEX
+
+/*
+ * re_setup:
+ * Initialize regular expression pattern.
+ */
+static void
+re_setup(struct re *rx, const char *pattern)
+{
+ int code;
+ char errbuf[1024];
+
+ assert(!rx->valid);
+ code = regcomp(&rx->regex, pattern, REG_EXTENDED);
+
+ if (code != 0) {
+ regerror(code, &rx->regex, errbuf, sizeof(errbuf));
+ warnx("%s: `%s'", errbuf, pattern);
+ regfree(&rx->regex);
+ rx->valid = FALSE;
+ }
+ rx->valid = TRUE;
+}
+
+/*
+ * re_cleanup:
+ * Undo re_setup.
+ */
+static void
+re_cleanup(struct re *rx)
+{
+ if (rx->valid) {
+ regfree(&rx->regex);
+ rx->valid = FALSE;
+ }
+}
+
+static bool
+re_match(struct re *rx, const char *string)
+{
+ return regexec(&rx->regex, string, 0, NULL, 0) == 0;
+}
+
/*
* conv_pat:
* Convert the pattern to an ignore-case equivalent.
@@ -1309,7 +1334,7 @@
FILEDESC *fp;
int in_file;
- if (!RE_OK(Re_pat) || !RE_OK(Re_pat13))
+ if (!Re_pat.valid || !Re_pat13.valid)
return;
for (fp = list; fp != NULL; fp = fp->next) {
@@ -1327,10 +1352,10 @@
else {
*sp = '\0';
if (fp->tbl.str_flags & STR_ROTATED)
- Re_use = Re_pat13;
+ Re_use = &Re_pat13;
else
- Re_use = Re_pat;
- if (RE_EXEC(Re_use, Fortbuf)) {
+ Re_use = &Re_pat;
+ if (re_match(Re_use, Fortbuf)) {
printf("%c%c", fp->tbl.str_delim,
fp->tbl.str_delim);
if (!in_file) {
@@ -1346,8 +1371,8 @@
sp = Fortbuf;
}
}
- RE_FREE(Re_pat);
- RE_FREE(Re_pat13);
+ re_cleanup(&Re_pat);
+ re_cleanup(&Re_pat13);
}
#endif /* NO_REGEX */
Home |
Main Index |
Thread Index |
Old Index