|
|
1.1 ! root 1: /*% cc -go # % ! 2: * too-complex fortune program. ! 3: * Tom Duff at Lucasfilm, Ltd. 81.11.23 ! 4: */ ! 5: #include <stdio.h> ! 6: #include <sys/types.h> ! 7: #include <sys/stat.h> ! 8: char line[512], choice[512]; ! 9: char index[]="/usr/games/lib/fortunes.index"; ! 10: char fortunes[]="/usr/games/lib/fortunes"; ! 11: main(argc, argv) ! 12: char *argv[]; ! 13: { ! 14: int i; ! 15: long offs; ! 16: register FILE *f, *ix; ! 17: int newindex=0, oldindex=0; ! 18: struct stat fbuf, ixbuf; ! 19: if(argc==1){ ! 20: if(stat(fortunes, &fbuf)>=0 ! 21: && (stat(index, &ixbuf)<0 || fbuf.st_mtime>=ixbuf.st_mtime) ! 22: && (ix=fopen(index, "w"))!=NULL) ! 23: newindex++; ! 24: else if((ix=fopen(index, "r"))==NULL){ ! 25: if((ix=fopen(index, "w"))!=NULL) ! 26: newindex++; ! 27: } ! 28: else ! 29: oldindex++; ! 30: } ! 31: if((f=fopen(argc>1?argv[1]:fortunes, "r"))==NULL){ ! 32: printf("Misfortune!\n"); ! 33: exit(1); ! 34: } ! 35: srand((int)(time((long)0)+getpid()*getpid())); ! 36: if(oldindex){ ! 37: fseek(ix, 0L, 2); ! 38: fseek(ix, nrand(ftell(ix)/sizeof(offs))*sizeof(offs), 0); ! 39: fread(&offs, sizeof(offs), 1, ix); ! 40: fseek(f, offs, 0); ! 41: fgets(choice, 512, f); ! 42: } ! 43: else{ ! 44: for(i=1;;i++){ ! 45: if(newindex) ! 46: offs=ftell(f); ! 47: fgets(line, 512, f); ! 48: if(feof(f)) ! 49: break; ! 50: if(newindex) ! 51: fwrite(&offs, sizeof(offs), 1, ix); ! 52: if(nrand(i)==0) ! 53: strcpy(choice, line); ! 54: } ! 55: } ! 56: printf("%s", choice); ! 57: return 0; ! 58: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.