|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T c
Length: 2654 (0xa5e) Types: TextFile Names: »cookie.c«
└─⟦b20c6495f⟧ Bits:30007238 EUUGD18: Wien-båndet, efterår 1987 └─⟦this⟧ »EUUGD18/General/Cookie/cookie.c«
/* cookie - print out an entry from the sayings file */ /* %M% %I% %H% */ #include <stdio.h> #include "cookie.h" #define ENTSIZE 7L #define METACHAR '%' #define YES 1 #define NO 0 char *sccs_id = "@(#) fortune cookie program %I% %H% by K. Lehenbauer"; extern long lseek(), time(); extern int rand(); char *cookiename = COOKIEFILE; char *hashname = HASHFILE; /* really_random - insure a good random return for a range, unlike an arbitrary * random() % n, thanks to Ken Arnold, Unix Review, October 1987 * ...likely needs a little hacking to run under Berkely */ #define RANDOM_RANGE ((1 << 15) - 1) int really_random(my_range) int my_range; { int max_multiple, rnum; max_multiple = RANDOM_RANGE / my_range; max_multiple *= my_range; while ((rnum = rand()) >= max_multiple) continue; return(rnum % my_range); } main(argc,argv) int argc; char *argv[]; { int nentries, oneiwant, c, sawmeta = 0; FILE *hashf, *cookief; long cookiepos; /* if we got exactly three arguments, use the cookie and hash * files specified */ if (argc == 3) { cookiename = argv[1]; hashname = argv[2]; } /* otherwise if argc isn't one (no arguments, specifying the * default cookie file), barf */ else if (argc != 1) { fputs("usage: cookie cookiefile hashfile\n",stderr); exit(1); } /* open the cookie file for read */ if ((cookief = fopen(cookiename,"r")) == NULL) { perror(cookiename); exit(2); } /* open the hash file for read */ if ((hashf = fopen(hashname,"r")) == NULL) { perror(hashname); exit(2); } /* compute number of cookie addresses in the hash file by * dividing the file length by the size of a cookie address */ if (fseek(hashf,0L,2) != 0) { fputs("cookie: fseek failed\n",stderr); exit(3); } nentries = ftell(hashf) / 7L; /* seed the random number generator with time in seconds plus * the program's process ID - it yields a pretty good seed * again, thanks to Ken Arnold */ srand(getpid() + time(NULL)); /* generate a not really random number */ oneiwant = really_random(nentries); /* locate the one I want in the hash file and read the * address found there */ fseek(hashf,(long)oneiwant * ENTSIZE, 0); fscanf(hashf,"%lx",&cookiepos); /* seek cookie file to cookie starting at address read from hash */ fseek(cookief,cookiepos,0); /* get characters from the cookie file and write them out * until finding the end-of-fortune sequence, '%%' */ while ((c = fgetc(cookief)) != EOF && sawmeta < 2) { if (c != METACHAR) { if (sawmeta) putchar(METACHAR); putchar(c); sawmeta = 0; } else sawmeta++; } exit(0); } /* end of cookie.c */