|
|
1.1 root 1: char *sccsid = "@(#)fortune.c 1.4 (Berkeley) 2/11/83";
2:
3: # include <sys/types.h>
4: # include <stdio.h>
5: # include "strfile.h"
6:
7: # define MINW 6 /* minimum wait if desired */
8: # define CPERS 20 /* # of chars for each sec */
9: # define SLEN 160 /* # of chars in short fortune */
10:
11: # define reg register
12:
13: short wflag = 0, /* wait desired after fortune */
14: sflag = 0, /* short fortune desired */
15: lflag = 0, /* long fortune desired */
16: oflag = 0, /* offensive fortunes only */
17: aflag = 0; /* any fortune allowed */
18:
19: char fortfile[100] = FORTFILE, /* fortune database */
20: *usage[] = {
21: "usage: fortune [ - ] [ -wsloa ] [ file ]",
22: " - - give this summary of usage",
23: " w - have program wait after printing message in order",
24: " to give time to read",
25: " s - short fortune only",
26: " l - long fortune only",
27: " o - offensive fortunes only",
28: " a - any fortune",
29: " Mail suggested fortunes to \"fortune\""
30: };
31:
32: long seekpts[2]; /* seek pointers to fortunes */
33:
34: time_t seed;
35:
36: STRFILE tbl; /* input table */
37:
38: time_t time();
39:
40: main(ac, av)
41: int ac;
42: char *av[]; {
43:
44: reg char c;
45: reg int nchar = 0;
46: reg FILE *inf;
47: reg int numforts, /* number of fortunes */
48: fortune; /* fortune number */
49: reg time_t tm;
50:
51: getargs(ac, av);
52: if ((inf = fopen(fortfile, "r")) == NULL) {
53: perror(fortfile);
54: exit(-1);
55: }
56: fread(&tbl, (sizeof tbl), 1, inf);
57: numforts = tbl.str_numstr - 1; /* always a null string at the end */
58: if (tbl.str_longlen < SLEN && lflag) {
59: puts("Sorry, no long strings in this file");
60: exit(0);
61: }
62: if (tbl.str_shortlen > SLEN && sflag) {
63: puts("Sorry, no short strings in this file");
64: exit(0);
65: }
66: if (oflag)
67: numforts -= tbl.str_delims[0];
68: else if (!aflag)
69: numforts = tbl.str_delims[0];
70: tm = time(NULL);
71: seed = tm + getpid();
72: getfort(numforts, inf);
73: if (sflag)
74: while (seekpts[1] - seekpts[0] >= SLEN)
75: getfort(numforts, inf);
76: else if (lflag)
77: while (seekpts[1] - seekpts[0] < SLEN)
78: getfort(numforts, inf);
79: fseek(inf, seekpts[0], 0);
80: while (c = getc(inf)) {
81: nchar++;
82: putchar(c);
83: }
84: fflush(stdout);
85: if (wflag)
86: sleep(max((int) nchar/CPERS, MINW));
87: }
88:
89: /*
90: * This routine evaluates the arguments on the command line
91: */
92: getargs(ac, av)
93: int ac;
94: reg char *av[]; {
95:
96: reg short bad = 0;
97: reg int i, j;
98:
99: for (i = 1; i < ac; i++) {
100: if (av[i][0] != '-')
101: strcpy(fortfile, av[i]);
102: else
103: switch (av[i][1]) {
104: case '\0': /* give usage */
105: for (j = 0; j < sizeof usage / sizeof (char *); j++)
106: puts(usage[j]);
107: exit(0);
108: case 'w': /* give time to read */
109: wflag++;
110: break;
111: case 's': /* short ones only */
112: sflag++;
113: break;
114: case 'l': /* long ones only */
115: lflag++;
116: break;
117: case 'o': /* offensive ones only */
118: oflag++;
119: break;
120: case 'a': /* any fortune */
121: aflag++;
122: break;
123: default:
124: printf("unknown flag: '%c'\n", av[1][1]);
125: bad++;
126: break;
127: }
128: }
129: if (bad) {
130: printf("use \"%s -\" to get usage\n", av[0]);
131: exit(-1);
132: }
133: }
134:
135: getfort(numforts, inf)
136: reg int numforts;
137: reg FILE *inf; {
138:
139: reg int fortune;
140:
141: fortune = rnd(numforts);
142: if (oflag && !aflag)
143: fortune += tbl.str_delims[0];
144: fseek(inf, (long)(sizeof seekpts[0]) * fortune + sizeof tbl, 0);
145: fread(seekpts, (sizeof seekpts[0]), 2, inf);
146: }
147:
148: max(i, j)
149: reg int i, j; {
150:
151: return (i >= j ? i : j);
152: }
153:
154: rnd(num)
155: int num; {
156:
157: return ((seed = seed*11109+13849) & 0xffff) % num;
158: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.