Mercurial > emacs
changeset 12:4f420246a4f7
Initial revision
author | Richard M. Stallman <rms@gnu.org> |
---|---|
date | Wed, 13 Apr 1988 06:13:41 +0000 |
parents | 5d42bce31792 |
children | a436ea70a0cf |
files | lib-src/yow.c |
diffstat | 1 files changed, 97 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lib-src/yow.c Wed Apr 13 06:13:41 1988 +0000 @@ -0,0 +1,97 @@ +#include <stdio.h> +#include <ctype.h> +#include "../src/paths.h" + +/* zippy.c + * + * Print a quotation from Zippy the Pinhead. + * Qux <Kaufman-David@Yale> March 6, 1986 + * + */ + +#define BUFSIZE 2000 +#define SEP '\0' +#define YOW_FILE "yow.lines" + +main (argc, argv) + int argc; + char *argv[]; +{ + FILE *fp; + char file[BUFSIZ]; + void yow(); + + if (argc > 2 && !strcmp (argv[1], "-f")) + strcpy (file, argv[2]); + else +#ifdef vms + sprintf (file, "%s%s", PATH_EXEC, YOW_FILE); +#else + sprintf (file, "%s/%s", PATH_EXEC, YOW_FILE); +#endif + + if ((fp = fopen(file, "r")) == NULL) { + perror(file); + exit(1); + } + + /* initialize random seed */ + srand((int) (getpid() + time((long *) 0))); + + yow(fp); + fclose(fp); + exit(0); +} + +void +yow (fp) + FILE *fp; +{ + static long len = -1; + long offset; + int c, i = 0; + char buf[BUFSIZE]; + + /* Get length of file, go to a random place in it */ + if (len == -1) { + if (fseek(fp, 0, 2) == -1) { + perror("fseek 1"); + exit(1); + } + len = ftell(fp); + } + offset = rand() % len; + if (fseek(fp, offset, 0) == -1) { + perror("fseek 2"); + exit(1); + } + + /* Read until SEP, read next line, print it. + (Note that we will never print anything before the first seperator.) + If we hit EOF looking for the first SEP, just recurse. */ + while ((c = getc(fp)) != SEP) + if (c == EOF) { + yow(fp); + return; + } + + /* Skip leading whitespace, then read in a quotation. + If we hit EOF before we find a non-whitespace char, recurse. */ + while (isspace(c = getc(fp))) + ; + if (c == EOF) { + yow(fp); + return; + } + buf[i++] = c; + while ((c = getc(fp)) != SEP && c != EOF) { + buf[i++] = c; + + if (i == BUFSIZ-1) + /* Yow! Is this quotation too long yet? */ + break; + } + buf[i++] = 0; + printf("%s\n", buf); +} +