summaryrefslogtreecommitdiff
path: root/lib-src/yow.c
diff options
context:
space:
mode:
authorRichard M. Stallman <rms@gnu.org>1990-01-02 17:15:30 +0000
committerRichard M. Stallman <rms@gnu.org>1990-01-02 17:15:30 +0000
commit701570d7d6b2239163cd22150e8709dbf53fcaf1 (patch)
treedb34dc0428d10224ed0f4487ddad610bdcbd7ee1 /lib-src/yow.c
parentd80259179fbe6a034149764069e521615a86ee10 (diff)
downloademacs-701570d7d6b2239163cd22150e8709dbf53fcaf1.tar.gz
*** empty log message ***
Diffstat (limited to 'lib-src/yow.c')
-rw-r--r--lib-src/yow.c90
1 files changed, 69 insertions, 21 deletions
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 <stdio.h>
-#include <ctype.h>
-#include "../src/paths.h"
-
-/* zippy.c
+/*
+ * yow.c
*
* Print a quotation from Zippy the Pinhead.
* Qux <Kaufman-David@Yale> March 6, 1986
*
+ * With dynamic memory allocation.
*/
-#define BUFSIZE 2000
+#include <stdio.h>
+#include <ctype.h>
+#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);