[BACK]Return to options.c CVS log [TXT][DIR] Up to [contributed] / early-roguelike / srogue

Annotation of early-roguelike/srogue/options.c, Revision 1.1

1.1     ! rubenllo    1: /*
        !             2:  * This file has all the code for the option command.
        !             3:  *
        !             4:  * @(#)options.c       9.0     (rdk)    7/17/84
        !             5:  *
        !             6:  * Super-Rogue
        !             7:  * Copyright (C) 1984 Robert D. Kindelberger
        !             8:  * All rights reserved.
        !             9:  *
        !            10:  * Based on "Rogue: Exploring the Dungeons of Doom"
        !            11:  * Copyright (C) 1980, 1981 Michael Toy, Ken Arnold and Glenn Wichman
        !            12:  * All rights reserved.
        !            13:  *
        !            14:  * See the file LICENSE.TXT for full copyright and licensing information.
        !            15:  */
        !            16:
        !            17: #include <ctype.h>
        !            18: #include <string.h>
        !            19: #include "rogue.h"
        !            20: #include "rogue.ext"
        !            21:
        !            22: /*
        !            23:  * description of an option and what to do with it
        !            24:  */
        !            25: struct optstruct {
        !            26:        char    *o_name;        /* option name */
        !            27:        char    *o_prompt;      /* prompt for interactive entry */
        !            28:        char    *o_opt;         /* pointer to thing to set */
        !            29: };
        !            30:
        !            31: typedef struct optstruct       OPTION;
        !            32:
        !            33: int allowchange(OPTION *opt);
        !            34:
        !            35: OPTION optlist[] = {
        !            36:        { "name",       "Name: ",               whoami },
        !            37:        { "fruit",      "Fruit: ",              fruit },
        !            38:        { "file",       "Save file: ",  file_name }
        !            39: };
        !            40: #define        NUM_OPTS        (sizeof optlist / sizeof (OPTION))
        !            41: OPTION safeoptlist[] = {
        !            42:        { "fruit",      "Fruit: ",              fruit },
        !            43: };
        !            44: #define        NUM_SOPTS       (sizeof safeoptlist / sizeof (OPTION))
        !            45:
        !            46: /*
        !            47:  * print and then set options from the terminal
        !            48:  */
        !            49: void
        !            50: option(void)
        !            51: {
        !            52:        reg OPTION      *op;
        !            53:        reg int wh;
        !            54:        OPTION *olist;
        !            55:        int olen;
        !            56:
        !            57:        if (use_savedir) {
        !            58:                olist = safeoptlist;
        !            59:                olen = NUM_SOPTS;
        !            60:        }
        !            61:        else {
        !            62:                olist = optlist;
        !            63:                olen = NUM_OPTS;
        !            64:        }
        !            65:
        !            66:        wclear(hw);
        !            67:        touchwin(hw);
        !            68:        /*
        !            69:         * Display current values of options
        !            70:         */
        !            71:        for (op = olist; op < &olist[olen]; op++) {
        !            72:                wh = op - olist;
        !            73:                mvwaddstr(hw, wh, 0, op->o_prompt);
        !            74:                mvwaddstr(hw, wh, 16, op->o_opt);
        !            75:        }
        !            76:        /*
        !            77:         * Set values
        !            78:         */
        !            79:        wmove(hw, 0, 0);
        !            80:        for (op = olist; op < &olist[olen]; op++) {
        !            81:                wmove(hw, op - olist, 16);
        !            82:                if ((wh = get_str(op->o_opt, hw))) {
        !            83:                        if (wh == QUIT)
        !            84:                                break;
        !            85:                        else if (op > olist) {
        !            86:                                wmove(hw, op - olist, 0);
        !            87:                                op -= 2;
        !            88:                        }
        !            89:                        else {
        !            90:                                putchar(7);
        !            91:                                wmove(hw, 0, 0);
        !            92:                                op -= 1;
        !            93:                        }
        !            94:                }
        !            95:        }
        !            96:        /*
        !            97:         * Switch back to original screen
        !            98:         */
        !            99:        dbotline(hw,spacemsg);
        !           100:        restscr(cw);
        !           101:        after = FALSE;
        !           102: }
        !           103:
        !           104:
        !           105: /*
        !           106:  * get_str:
        !           107:  *     Set a string option
        !           108:  */
        !           109: #define CTRLB  2
        !           110: int
        !           111: get_str(char *opt, WINDOW *awin)
        !           112: {
        !           113:        reg char *sp;
        !           114:        reg int c, oy, ox;
        !           115:        char buf[LINLEN];
        !           116:
        !           117:        draw(awin);
        !           118:        getyx(awin, oy, ox);
        !           119:        /*
        !           120:         * loop reading in the string, and put it in a temporary buffer
        !           121:         */
        !           122:        for (sp = buf; (c=readchar()) != '\n' && c != '\r' && c != ESCAPE;
        !           123:          wclrtoeol(awin), draw(awin)) {
        !           124:                if (sp - buf >= 50) {
        !           125:                        *sp = '\0';                     /* line was too long */
        !           126:                        strucpy(opt,buf,strlen(buf));
        !           127:                        mvwaddstr(awin, 0, 0, "Name was truncated --More--");
        !           128:                        wclrtoeol(awin);
        !           129:                        draw(awin);
        !           130:                        wait_for(awin, ' ');
        !           131:                        mvwprintw(awin, 0, 0, "Called: %s",opt);
        !           132:                        draw(awin);
        !           133:                        return NORM;
        !           134:                }
        !           135:                if (c == -1)
        !           136:                        continue;
        !           137:                else if(c == md_erasechar())    {       /* process erase char */
        !           138:                        if (sp > buf) {
        !           139:                                reg int i;
        !           140:
        !           141:                                sp--;
        !           142:                                for (i = strlen(unctrl(*sp)); i; i--)
        !           143:                                        waddch(awin, '\b');
        !           144:                        }
        !           145:                        continue;
        !           146:                }
        !           147:                else if (c == md_killchar()) {   /* process kill character */
        !           148:                        sp = buf;
        !           149:                        wmove(awin, oy, ox);
        !           150:                        continue;
        !           151:                }
        !           152:                else if (sp == buf) {
        !           153:                        if (c == CTRLB)                 /* CTRL - B */
        !           154:                                break;
        !           155:                        if (c == '~') {
        !           156:                                strcpy(buf, home);
        !           157:                                waddstr(awin, home);
        !           158:                                sp += strlen(home);
        !           159:                                continue;
        !           160:                        }
        !           161:                }
        !           162:                *sp++ = c;
        !           163:                waddstr(awin, unctrl(c));
        !           164:        }
        !           165:        *sp = '\0';
        !           166:        if (sp > buf)   /* only change option if something was typed */
        !           167:                strucpy(opt, buf, strlen(buf));
        !           168:        wmove(awin, oy, ox);
        !           169:        waddstr(awin, opt);
        !           170:        waddstr(awin, "\n\r");
        !           171:        draw(awin);
        !           172:        if (awin == cw)
        !           173:                mpos += sp - buf;
        !           174:        if (c == CTRLB)
        !           175:                return MINUS;
        !           176:        if (c == ESCAPE)
        !           177:                return QUIT;
        !           178:        return NORM;
        !           179: }
        !           180:
        !           181: /*
        !           182:  * parse_opts:
        !           183:  *     Parse options from string, usually taken from the environment.
        !           184:  *     the string is a series of comma seperated values, with strings
        !           185:  *     being "name=....", with the string being defined up to a comma
        !           186:  *     or the end of the entire option string.
        !           187:  */
        !           188:
        !           189: void
        !           190: parse_opts(char *str)
        !           191: {
        !           192:        reg char *sp;
        !           193:        reg OPTION *op;
        !           194:        reg int len;
        !           195:
        !           196:        while (*str) {
        !           197:                for (sp = str; isalpha(*sp); sp++)      /* get option name */
        !           198:                        continue;
        !           199:                len = sp - str;
        !           200:                for (op = optlist; op < &optlist[NUM_OPTS]; op++) {
        !           201:                        /* For security, some options can't be changed. */
        !           202:                        if (!allowchange(op))
        !           203:                                continue;
        !           204:                        if (EQSTR(str, op->o_name, len)) {
        !           205:                                reg char *start;
        !           206:
        !           207:                                for (str = sp + 1; *str == '='; str++)
        !           208:                                        continue;
        !           209:                                if (*str == '~') {
        !           210:                                        strcpy(op->o_opt, home);
        !           211:                                        start = op->o_opt + strlen(home);
        !           212:                                        while (*++str == '/')
        !           213:                                                continue;
        !           214:                                }
        !           215:                                else
        !           216:                                        start = (char *) op->o_opt;
        !           217:                                for (sp = str + 1; *sp && *sp != ','; sp++)
        !           218:                                        continue;
        !           219:                                strucpy(start, str, sp - str);
        !           220:                        }
        !           221:                }
        !           222:                /*
        !           223:                 * skip to start of next option name
        !           224:                 */
        !           225:                while (*sp && !isalpha(*sp))
        !           226:                        sp++;
        !           227:                str = sp;
        !           228:        }
        !           229: }
        !           230:
        !           231: /*
        !           232:  * copy string using unctrl for things
        !           233:  */
        !           234: void
        !           235: strucpy(char *s1, char *s2, int len)
        !           236: {
        !           237:        const char *sp;
        !           238:
        !           239:        while (len-- > 0) {
        !           240:                strcpy(s1, (sp = unctrl(*s2)));
        !           241:                s1 += strlen(sp);
        !           242:                s2++;
        !           243:        }
        !           244:        *s1 = '\0';
        !           245: }
        !           246:
        !           247: int allowchange(OPTION *opt)
        !           248: {
        !           249:        if (!use_savedir)
        !           250:                return 1;
        !           251:        if (!strcmp(opt->o_name, "name"))
        !           252:                return 0;
        !           253:        if (!strcmp(opt->o_name, "file"))
        !           254:                return 0;
        !           255:        return 1;
        !           256: }

CVSweb