Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/games/fortune/fortune Change -a to mean all files, as oppose...
details: https://anonhg.NetBSD.org/src/rev/041d3aa5fc90
branches: trunk
changeset: 513857:041d3aa5fc90
user: atatat <atatat%NetBSD.org@localhost>
date: Wed Aug 15 17:25:42 2001 +0000
description:
Change -a to mean all files, as opposed to just a few more files.
Modify the regex handling so that we can match fortunes in rot13'ed
databases (rot13 the pattern and maintain a second compiled pattern)
and rot13 the rot13'ed fortune before output.
Move the rot13 code to a function since it's now used in three places
instead of just one.
Initialize posfile in one place since it appears to get used without
being initialized when using debugging.
Make a *slight* improvement to the random seeding by squaring the pid
and then xor'ing against the current time, since just xor'ing the time
with the pid will not change if they both advance by one from "odd" to
"even".
diffstat:
games/fortune/fortune/fortune.c | 112 +++++++++++++++++++++++++---------------
1 files changed, 70 insertions(+), 42 deletions(-)
diffs (221 lines):
diff -r c1591d86b3ca -r 041d3aa5fc90 games/fortune/fortune/fortune.c
--- a/games/fortune/fortune/fortune.c Wed Aug 15 15:16:53 2001 +0000
+++ b/games/fortune/fortune/fortune.c Wed Aug 15 17:25:42 2001 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: fortune.c,v 1.29 2001/06/04 21:21:42 christos Exp $ */
+/* $NetBSD: fortune.c,v 1.30 2001/08/15 17:25:42 atatat Exp $ */
/*-
* Copyright (c) 1986, 1993
@@ -46,7 +46,7 @@
#if 0
static char sccsid[] = "@(#)fortune.c 8.1 (Berkeley) 5/31/93";
#else
-__RCSID("$NetBSD: fortune.c,v 1.29 2001/06/04 21:21:42 christos Exp $");
+__RCSID("$NetBSD: fortune.c,v 1.30 2001/08/15 17:25:42 atatat Exp $");
#endif
#endif /* not lint */
@@ -133,6 +133,7 @@
const char *, const char *, FILEDESC **, FILEDESC **, FILEDESC *));
void all_forts __P((FILEDESC *, const char *));
char *copy __P((const char *, u_int));
+void rot13 __P((char *line, int len));
void display __P((FILEDESC *));
void do_free __P((void *));
void *do_malloc __P((u_int));
@@ -171,39 +172,39 @@
#ifndef NO_REGEX
# if HAVE_REGCMP
-# define RE_INIT()
-# define RE_COMP(p) (Re_pat = regcmp(p, NULL))
-# define RE_ERROR() "Invalid pattern"
-# define RE_OK() (Re_pat != NULL)
-# define RE_EXEC(p) regex(Re_pat, (p))
-# define RE_FREE()
+# define RE_INIT(re)
+# define RE_COMP(re, p) ((re) = regcmp((p), NULL))
+# define RE_ERROR(re) "Invalid pattern"
+# define RE_OK(re) ((re) != NULL)
+# define RE_EXEC(re, p) regex((re), (p))
+# define RE_FREE(re)
-char *Re_pat;
+char *Re_pat, *Re_pat13, *Re_use;
char *Re_error;
char *regcmp(), *regex();
# elif HAVE_RE_COMP
-# define RE_INIT()
-# define RE_COMP(p) (Re_error = re_comp(p))
-# define RE_ERROR() Re_error
-# define RE_OK() (Re_error == NULL)
-# define RE_EXEC(p) re_exec(p)
-# define RE_FREE()
+# define RE_INIT(re)
+# define RE_COMP(re, p) ((re) = re_comp(p))
+# define RE_ERROR(re) Re_error
+# define RE_OK(re) (Re_error == NULL)
+# define RE_EXEC(re, p) re_exec(p)
+# define RE_FREE(re)
# elif HAVE_REGCOMP
# include <regex.h>
-regex_t *Re_pat = NULL;
+regex_t *Re_pat = NULL, *Re_pat13 = NULL, *Re_use = NULL;
int Re_code;
char Re_error[1024];
-# define RE_INIT() if (Re_pat == NULL && \
- (Re_pat = calloc(sizeof(*Re_pat), 1)) \
+# define RE_INIT(re) if ((re) == NULL && \
+ ((re) = calloc(sizeof(*(re)), 1)) \
== NULL) err(1, NULL)
-# define RE_COMP(p) (Re_code = regcomp(Re_pat, p, REG_EXTENDED))
-# define RE_OK() (Re_code == 0)
-# define RE_EXEC(p) (!regexec(Re_pat, p, 0, NULL, 0))
-# define RE_ERROR() (regerror(Re_code, Re_pat, Re_error, \
+# 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() if (Re_pat != NULL) \
- regfree(Re_pat), Re_pat = NULL
+# define RE_FREE(re) if ((re) != NULL) do { regfree((re)); \
+ (re) = NULL; } while (0)
# else
#error "Need to define HAVE_REGCMP, HAVE_RE_COMP, or HAVE_REGCOMP"
# endif
@@ -230,7 +231,7 @@
#endif
init_prob();
- srandom((int)(time((time_t *) NULL) ^ getpid()));
+ srandom((int)(time((time_t *) NULL) ^ getpid() * getpid()));
do {
get_fort();
} while ((Short_only && fortlen() > SLEN) ||
@@ -265,23 +266,34 @@
}
void
+rot13(line, len)
+ char *line;
+ int len;
+{
+ char *p, ch;
+
+ if (len == 0)
+ len = strlen(line);
+
+ for (p = line; (ch = *p) != 0; ++p)
+ if (isupper(ch))
+ *p = 'A' + (ch - 'A' + 13) % 26;
+ else if (islower(ch))
+ *p = 'a' + (ch - 'a' + 13) % 26;
+}
+
+void
display(fp)
FILEDESC *fp;
{
- char *p, ch;
char line[BUFSIZ];
open_fp(fp);
(void) fseek(fp->inf, (long)Seekpts[0], SEEK_SET);
for (Fort_len = 0; fgets(line, sizeof line, fp->inf) != NULL &&
!STR_ENDSTRING(line, fp->tbl); Fort_len++) {
- if (fp->tbl.str_flags & STR_ROTATED) {
- for (p = line; (ch = *p) != 0; ++p)
- if (isupper(ch))
- *p = 'A' + (ch - 'A' + 13) % 26;
- else if (islower(ch))
- *p = 'a' + (ch - 'a' + 13) % 26;
- }
+ if (fp->tbl.str_flags & STR_ROTATED)
+ rot13(line, 0);
fputs(line, stdout);
}
(void) fflush(stdout);
@@ -396,11 +408,18 @@
if (pat != NULL) {
if (ignore_case)
pat = conv_pat(pat);
- RE_INIT();
- RE_COMP(pat);
- if (!RE_OK()) {
- warnx("%s: `%s'", RE_ERROR(), pat);
- RE_FREE();
+ 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);
+ }
+ 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);
}
}
# endif /* NO_REGEX */
@@ -419,7 +438,7 @@
const char *sp;
if (file_cnt == 0) {
- if (Find_files)
+ if (All_forts)
return add_file(NO_PROB, FORTDIR, NULL, &File_list,
&File_tail, NULL);
else
@@ -664,6 +683,8 @@
int fd;
char *datfile, *posfile;
+ posfile = NULL;
+
if (fp->child != NULL) /* this is a directory, not a file */
return;
if (!is_fortfile(offensive, &datfile, &posfile, FALSE))
@@ -1324,7 +1345,7 @@
FILEDESC *fp;
int in_file;
- if (!RE_OK())
+ if (!RE_OK(Re_pat) || !RE_OK(Re_pat13))
return;
for (fp = list; fp != NULL; fp = fp->next) {
@@ -1341,7 +1362,11 @@
sp += strlen(sp);
else {
*sp = '\0';
- if (RE_EXEC(Fortbuf)) {
+ if (fp->tbl.str_flags & STR_ROTATED)
+ Re_use = Re_pat13;
+ else
+ Re_use = Re_pat;
+ if (RE_EXEC(Re_use, Fortbuf)) {
printf("%c%c", fp->tbl.str_delim,
fp->tbl.str_delim);
if (!in_file) {
@@ -1350,12 +1375,15 @@
in_file = TRUE;
}
putchar('\n');
+ if (fp->tbl.str_flags & STR_ROTATED)
+ rot13(Fortbuf, (sp - Fortbuf));
(void) fwrite(Fortbuf, 1, (sp - Fortbuf), stdout);
}
sp = Fortbuf;
}
}
- RE_FREE();
+ RE_FREE(Re_pat);
+ RE_FREE(Re_pat13);
}
# endif /* NO_REGEX */
Home |
Main Index |
Thread Index |
Old Index