|
|
1.1 root 1: /*
2: * Display a random line on a file. Suitable for automated
3: * fortune cookies. Multi line fortunes such as poems should
4: * have their lines separated by @'s.
5: */
6: #include <sys/timeb.h>
7: #include <stdio.h>
8: #define RAND_MAX 32767
9:
10: char *fortfile = "/usr/games/lib/fortunes";
11:
12: void
13: main(argc, argv)
14: char *argv[];
15: {
16: FILE *ifp;
17: double randomAdj;
18: int c;
19: struct timeb tb;
20:
21: if(argc > 1)
22: fortfile = argv[1];
23:
24: if(NULL == (ifp = fopen(fortfile, "r"))) {
25: printf("Cannot open %s\n", fortfile);
26: exit(1);
27: }
28:
29: fseek(ifp, 0L, 2);
30: randomAdj = (double)ftell(ifp) / ((double)RAND_MAX);
31:
32: ftime(&tb);
33: srand((unsigned int)(tb.time ^ tb.millitm));
34: /* a user running this several times in quick succession will
35: * be dissapointed if he keeps getting the same result.
36: * Running rand() 100 times distributes the low order bit
37: * changes in the seed to the high half returned by rand().
38: */
39: for(c = 0; c < 100; c++)
40: rand();
41:
42: fseek(ifp, (long)(randomAdj * (double)rand()), 0);
43: while('\n' != (c = fgetc(ifp)) && EOF != c)
44: ;
45:
46: if(c == EOF) {
47: printf("File does not end with nl\n");
48: exit(1);
49: }
50:
51: while('\n' != (c = fgetc(ifp))) {
52: if(EOF == c) {
53: fseek(ifp, 0L, 0);
54: continue;
55: }
56: if('@' == c) /* to display multi line fortunes */
57: c = '\n';
58: putchar(c);
59: }
60: putchar('\n');
61: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.