char *sccsid
= "@(#)fortune.c 2.6";
# define MINW 6 /* minimum wait if desired */
# define CPERS 20 /* # of chars for each sec */
# define SLEN 160 /* # of chars in short fortune */
short wflag
= 0, /* wait desired after fortune */
sflag
= 0, /* short fortune desired */
lflag
= 0, /* long fortune desired */
oflag
= 0, /* offensive fortunes only */
aflag
= 0; /* any fortune allowed */
char fortfile
[100] = FORTFILE
, /* fortune database */
"usage: fortune [ - ] [ -wsloa ] [ file ]",
" - - give this summary of usage",
" w - have program wait after printing message in order",
" s - short fortune only",
" l - long fortune only",
" o - offensive fortunes only",
" Mail suggested fortunes to \"fortune\""
long seekpts
[2]; /* seek pointers to fortunes */
int numforts
, /* number of fortunes */
fortune
; /* fortune number */
STRFILE tbl
; /* input table */
if ((inf
= fopen(fortfile
, "r")) == NULL
) {
fread(&tbl
, (sizeof tbl
), 1, inf
);
numforts
= tbl
.str_numstr
- 1; /* always a null string at the end */
if (tbl
.str_longlen
< SLEN
&& lflag
) {
puts("Sorry, no long strings in this file");
if (tbl
.str_shortlen
> SLEN
&& sflag
) {
puts("Sorry, no short strings in this file");
numforts
-= tbl
.str_delims
[0];
numforts
= tbl
.str_delims
[0];
fortune
= roll(1, numforts
) - 1;
fortune
+= tbl
.str_delims
[0];
fseek(inf
, (long)(sizeof seekpts
[0]) * fortune
+ sizeof tbl
, 0);
fread(seekpts
, (sizeof seekpts
[0]), 2, inf
);
} while ((sflag
&& seekpts
[1] - seekpts
[0] > SLEN
)
|| (lflag
&& seekpts
[1] - seekpts
[0] < SLEN
));
fseek(inf
, seekpts
[0], 0);
sleep(max((int) nchar
/CPERS
, MINW
));
* This routine evaluates the arguments on the command line
for (i
= 1; i
< ac
; i
++) {
case '\0': /* give usage */
for (j
= 0; j
< sizeof usage
/ sizeof (char *); j
++)
case 'w': /* give time to read */
case 's': /* short ones only */
case 'l': /* long ones only */
case 'o': /* offensive ones only */
case 'a': /* any fortune */
printf("unknown flag: '%c'\n", av
[1][1]);
printf("use \"%s -\" to get usage\n", av
[0]);
return (int) ((tot
* (long) nsides
) / ((long) MAXRAND
+ 1)) + ndie
;
tot
+= rand() * (num_sides
/ 017777777777) + 1;