|
|
1.1 root 1: #include <stdio.h>
2: #include <ctype.h>
3: #include "../src/paths.h"
4:
5: /* zippy.c
6: *
7: * Print a quotation from Zippy the Pinhead.
8: * Qux <Kaufman-David@Yale> March 6, 1986
9: *
10: */
11:
12: #define BUFSIZE 2000
13: #define SEP '\0'
14: #define YOW_FILE "yow.lines"
15:
16: main (argc, argv)
17: int argc;
18: char *argv[];
19: {
20: FILE *fp;
21: char file[BUFSIZ];
22: void yow();
23:
24: if (argc > 2 && !strcmp (argv[1], "-f"))
25: strcpy (file, argv[2]);
26: else
27: #ifdef vms
28: sprintf (file, "%s%s", PATH_EXEC, YOW_FILE);
29: #else
30: sprintf (file, "%s/%s", PATH_EXEC, YOW_FILE);
31: #endif
32:
33: if ((fp = fopen(file, "r")) == NULL) {
34: perror(file);
35: exit(1);
36: }
37:
38: /* initialize random seed */
39: srand((int) (getpid() + time((long *) 0)));
40:
41: yow(fp);
42: fclose(fp);
43: exit(0);
44: }
45:
46: void
47: yow (fp)
48: FILE *fp;
49: {
50: static long len = -1;
51: long offset;
52: int c, i = 0;
53: char buf[BUFSIZE];
54:
55: /* Get length of file, go to a random place in it */
56: if (len == -1) {
57: if (fseek(fp, 0, 2) == -1) {
58: perror("fseek 1");
59: exit(1);
60: }
61: len = ftell(fp);
62: }
63: offset = rand() % len;
64: if (fseek(fp, offset, 0) == -1) {
65: perror("fseek 2");
66: exit(1);
67: }
68:
69: /* Read until SEP, read next line, print it.
70: (Note that we will never print anything before the first seperator.)
71: If we hit EOF looking for the first SEP, just recurse. */
72: while ((c = getc(fp)) != SEP)
73: if (c == EOF) {
74: yow(fp);
75: return;
76: }
77:
78: /* Skip leading whitespace, then read in a quotation.
79: If we hit EOF before we find a non-whitespace char, recurse. */
80: while (isspace(c = getc(fp)))
81: ;
82: if (c == EOF) {
83: yow(fp);
84: return;
85: }
86: buf[i++] = c;
87: while ((c = getc(fp)) != SEP && c != EOF) {
88: buf[i++] = c;
89:
90: if (i == BUFSIZ-1)
91: /* Yow! Is this quotation too long yet? */
92: break;
93: }
94: buf[i++] = 0;
95: printf("%s\n", buf);
96: }
97:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.