diff options
-rw-r--r-- | fortune/fortune/fortune.c | 114 |
1 files changed, 71 insertions, 43 deletions
diff --git a/fortune/fortune/fortune.c b/fortune/fortune/fortune.c index 92e667aa..73cf0078 100644 --- a/fortune/fortune/fortune.c +++ b/fortune/fortune/fortune.c @@ -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 @@ __COPYRIGHT("@(#) Copyright (c) 1986, 1993\n\ #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 @@ int add_file __P((int, 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 @@ int maxlen_in_list __P((FILEDESC *)); #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() - -char *Re_pat; +# 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, *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 @@ main(ac, av) #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 @@ main(ac, av) } 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 @@ getargs(argc, argv) 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 @@ form_file_list(files, file_cnt) 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 @@ all_forts(fp, offensive) 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 @@ matches_in_list(list) 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 @@ matches_in_list(list) 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 @@ matches_in_list(list) 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 */ |