From: Richard M. Stallman Date: Tue, 2 Jan 1990 17:15:30 +0000 (+0000) Subject: *** empty log message *** X-Git-Tag: emacs-19.34~15775 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=701570d7d6b2239163cd22150e8709dbf53fcaf1;p=emacs.git *** empty log message *** --- diff --git a/lib-src/yow.c b/lib-src/yow.c index f39822c9687..bfff0e7d3ea 100644 --- a/lib-src/yow.c +++ b/lib-src/yow.c @@ -1,17 +1,22 @@ -#include -#include -#include "../src/paths.h" - -/* zippy.c +/* + * yow.c * * Print a quotation from Zippy the Pinhead. * Qux March 6, 1986 * + * With dynamic memory allocation. */ -#define BUFSIZE 2000 +#include +#include +#include "../src/paths.h" /* For PATH_EXEC. */ + +#define BUFSIZE 80 #define SEP '\0' + +#ifndef YOW_FILE #define YOW_FILE "yow.lines" +#endif main (argc, argv) int argc; @@ -19,7 +24,7 @@ main (argc, argv) { FILE *fp; char file[BUFSIZ]; - void yow(); + void yow(), setup_yow(); if (argc > 2 && !strcmp (argv[1], "-f")) strcpy (file, argv[2]); @@ -38,29 +43,58 @@ main (argc, argv) /* initialize random seed */ srand((int) (getpid() + time((long *) 0))); + setup_yow(fp); yow(fp); fclose(fp); exit(0); } +static long len = -1; +static long header_len; + +#define AVG_LEN 40 /* average length of a quotation */ + +/* Sets len and header_len */ +void +setup_yow(fp) + FILE *fp; +{ + int c; + + /* Get length of file */ + /* Because the header (stuff before the first SEP) can be very long, + * thus biasing our search in favor of the first quotation in the file, + * we explicitly skip that. */ + while ((c = getc(fp)) != SEP) { + if (c == EOF) { + fprintf(stderr, "File contains no separators.\n"); + exit(2); + } + } + header_len = ftell(fp); + if (header_len > AVG_LEN) + header_len -= AVG_LEN; /* allow the first quotation to appear */ + + if (fseek(fp, 0L, 2) == -1) { + perror("fseek 1"); + exit(1); + } + len = ftell(fp) - header_len; +} + + +/* go to a random place in the file and print the quotation there */ void yow (fp) FILE *fp; { - static long len = -1; long offset; int c, i = 0; - char buf[BUFSIZE]; + char *buf; + unsigned int bufsize; + char *malloc(), *realloc(); - /* 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; + offset = rand() % len + header_len; if (fseek(fp, offset, 0) == -1) { perror("fseek 2"); exit(1); @@ -83,13 +117,27 @@ yow (fp) yow(fp); return; } + + bufsize = BUFSIZE; + buf = malloc(bufsize); + if (buf == (char *)0) { + fprintf(stderr, "can't allocate any memory\n"); + exit (3); + } + buf[i++] = c; while ((c = getc(fp)) != SEP && c != EOF) { buf[i++] = c; - - if (i == BUFSIZ-1) + + if (i == bufsize-1) { /* Yow! Is this quotation too long yet? */ - break; + bufsize *= 2; + buf = realloc(buf, bufsize); + if (buf == (char *)0) { + fprintf(stderr, "can't allocate more memory\n"); + exit (3); + } + } } buf[i++] = 0; printf("%s\n", buf);