Annotation of 43BSDReno/games/larn/fortune.c, revision 1.1

1.1     ! root        1: /* fortune.c            Larn is copyrighted 1986 by Noah Morgan. */
        !             2: #include <sys/types.h>
        !             3: #include <sys/stat.h>
        !             4: 
        !             5: #ifndef BSD4.1
        !             6: #include <fcntl.h>
        !             7: #else BSD4.1
        !             8: #define O_RDONLY 0
        !             9: #endif BSD4.1
        !            10: 
        !            11: #include "header.h"
        !            12: /*
        !            13:  *     function to return a random fortune from the fortune file
        !            14:  */
        !            15: static char *base=0;   /* pointer to the fortune text */
        !            16: static char **flines=0;        /* array of pointers to each fortune */
        !            17: static int fd=0;               /* true if we have load the fortune info */
        !            18: static int nlines=0;   /* # lines in fortune database */
        !            19: 
        !            20: char *fortune(file)
        !            21:        char *file;
        !            22:        {
        !            23:        register char *p;
        !            24:        register int lines,tmp;
        !            25:        struct stat stat;
        !            26:        char *malloc();
        !            27:        if (fd==0)
        !            28:                {
        !            29:                if ((fd=open(file,O_RDONLY)) < 0)       /* open the file */
        !            30:                        return(0); /* can't find file */
        !            31: 
        !            32:        /* find out how big fortune file is and get memory for it */
        !            33:                stat.st_size = 16384;
        !            34:                if ((fstat(fd,&stat) < 0) || ((base=malloc(1+stat.st_size)) == 0))
        !            35:                        {
        !            36:                        close(fd); fd= -1; free((char*)base); return(0);        /* can't stat file */
        !            37:                        }
        !            38: 
        !            39:        /* read in the entire fortune file */
        !            40:                if (read(fd,base,stat.st_size) != stat.st_size)
        !            41:                        {
        !            42:                        close(fd); fd= -1; free((char*)base); return(0);        /* can't read file */
        !            43:                        }
        !            44:                close(fd);  base[stat.st_size]=0;       /* final NULL termination */
        !            45: 
        !            46:        /* count up all the lines (and NULL terminate) to know memory needs */
        !            47:                for (p=base,lines=0; p<base+stat.st_size; p++) /* count lines */
        !            48:                        if (*p == '\n') *p=0,lines++;
        !            49:                nlines = lines;
        !            50: 
        !            51:        /* get memory for array of pointers to each fortune */
        !            52:                if ((flines=(char**)malloc(nlines*sizeof(char*))) == 0)
        !            53:                        {
        !            54:                        free((char*)base); fd= -1; return(0); /* malloc() failure */
        !            55:                        }
        !            56: 
        !            57:        /* now assign each pointer to a line */
        !            58:                for (p=base,tmp=0; tmp<nlines; tmp++)
        !            59:                        {
        !            60:                        flines[tmp]=p;  while (*p++); /* advance to next line */
        !            61:                        }
        !            62:                }
        !            63: 
        !            64:        if (fd > 2)     /* if we have a database to look at */
        !            65:                return(flines[rund((nlines<=0)?1:nlines)]);
        !            66:        else 
        !            67:                return(0);
        !            68:        }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.