Annotation of 43BSD/contrib/X/Xlib/XGetDefault.c, revision 1.1

1.1     ! root        1: #include <X/mit-copyright.h>
        !             2: 
        !             3: /* $Header: XGetDefault.c,v 10.5 86/02/01 15:34:44 tony Rel $ */
        !             4: /* Copyright (c) 1985, Massachusetts Institute of Technology */
        !             5: 
        !             6: /*
        !             7:  * This routine returns options out of the X user preferences file
        !             8:  * found in the user's home directory.  It either returns a pointer to
        !             9:  * the option or returns NULL if option not set.  It is patterned after
        !            10:  * Andrew's file format (why be different for the sake of being different?).
        !            11:  * Andrew's code was NOT examined before writing this routine.
        !            12:  * It parses lines of the format "progname.option:value" and returns a pointer
        !            13:  * to value.
        !            14:  */
        !            15: 
        !            16: #include <stdio.h>
        !            17: #include <strings.h>
        !            18: #include <ctype.h>
        !            19: 
        !            20: #define XOPTIONFILE "/.Xdefaults"      /* name in home directory of options
        !            21:                                           file. */
        !            22: extern char *malloc();
        !            23: 
        !            24: static struct ent {
        !            25:        struct ent *next;               /* next option entry in chain   */
        !            26:        char *oname;                    /* option name                  */
        !            27:        char *value;                    /* value for that option        */
        !            28: } *head;                               /* head of list of options      */
        !            29: 
        !            30: char *XGetDefault(prog, name)
        !            31:        register char *name;            /* name of option program wants */
        !            32:        char *prog;                     /* name of program for option   */
        !            33: {                                      /* to get, for example, "font"  */
        !            34:        static nent = -1;               /* have we been here before?    */
        !            35:        register struct ent *cur;       /* current entry being examined */
        !            36:        char namebuf[64];
        !            37:        register char *pv = namebuf;
        !            38: 
        !            39:        strncpy(namebuf,name,sizeof(namebuf));
        !            40:        while (*pv) {                   /* convert upper to lower       */
        !            41:                if (isupper(*pv))  *pv += 040;
        !            42:                pv += 1;
        !            43:                }
        !            44:        if (nent == -1) nent = ReadFile(prog);/* if not, parse the file.*/
        !            45:        if (nent == 0) return(NULL);
        !            46:        cur = head;
        !            47:        do {
        !            48:                if (strcmp(namebuf,cur->oname) == 0) return(cur->value);
        !            49:                cur = cur->next;
        !            50:        } while (cur != NULL);
        !            51:        return(NULL);                   /* if no match, let him know    */
        !            52: }
        !            53: 
        !            54: static ReadFile(prog)
        !            55:        char *prog;                     /* program name to match            */
        !            56: {
        !            57:        FILE *fptr;                     /* preferences file                 */
        !            58:        char fname[BUFSIZ];             /* longer than any conceivable size */
        !            59:        char line[BUFSIZ];              /* line buffer for each line of file*/
        !            60:        register char *point,*colon;    /* where in the line the keys are   */
        !            61:        register struct ent *buf;       /* new memory for valid option line */
        !            62:        register char *pv;              /* pointer to value for lowering    */
        !            63:        int len, nchars;
        !            64:        int nentries = 0;               /* number of entries found          */
        !            65:        char *getenv();
        !            66:        char *home = getenv("HOME");
        !            67: 
        !            68:        if (rindex(prog,'/') != NULL) prog = rindex(prog, '/') + 1;
        !            69:                                        /* if full path, get last component */
        !            70:        if (home == NULL) return(0);
        !            71: 
        !            72:        strcpy(fname, home);            /* form full path name of file  */
        !            73:        strcat(fname, XOPTIONFILE);
        !            74: 
        !            75:        if ((fptr = fopen(fname, "r")) == NULL) return(0);
        !            76: 
        !            77:        while ( fgets(line, sizeof(line), fptr) != NULL ) {
        !            78:                if (line[0] == '#') continue;           /* comment?     */
        !            79:                point = index(line,'.');
        !            80:                colon = index(line,':');
        !            81:                if ( (point == NULL) || (colon == NULL) || (colon < point) )
        !            82:                        continue;       /* both . and : required on line*/
        !            83:                if ( point != line )    /* check all chars up to '.'    */
        !            84:                        if (strncmp(line, prog, point - line) != 0) continue;
        !            85: 
        !            86:                /* 
        !            87:                 * ok, we've passed all the tests, so it is a valid option for
        !            88:                 * this program, or is global option.
        !            89:                 */
        !            90: 
        !            91:                len = strlen(line);
        !            92:                if(line[len-1] == '\n') line[len-1] = '\0';
        !            93:                                        /* braindamaged fgets call      */
        !            94:                nchars = len - (point - line);
        !            95:                /*
        !            96:                 * allocate space for data structure and text in one call
        !            97:                 */
        !            98:                if ( (buf = (struct ent *)malloc (sizeof(struct ent) + nchars))
        !            99:                         == NULL) {
        !           100:                                fprintf(stderr, "ReadFile: Out of memory\n");
        !           101:                                exit(1);
        !           102:                }
        !           103:                len += 1;
        !           104:                *colon = '\0';          /* seperate string              */
        !           105:                                        /* chain in the new buffer      */
        !           106:                bcopy (point+1, buf+1, nchars);
        !           107:                buf->oname = (char *) (buf + 1);
        !           108:                buf->value = buf->oname + (colon - point);
        !           109:                pv = buf->oname;
        !           110:                while (*pv) {           /* convert upper to lower       */
        !           111:                        if (isupper(*pv))  *pv += 040;
        !           112:                        pv += 1;
        !           113:                        }
        !           114:                while(isspace(*buf->value)) buf->value++; /* skip over spaces*/
        !           115:                buf->next = head;
        !           116:                head = buf;
        !           117:                nentries += 1;
        !           118:        }
        !           119:        fclose(fptr);
        !           120:        return(nentries);
        !           121: }

unix.superglobalmegacorp.com

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