Annotation of coherent/d/usr/bin/elvis/opts.c, revision 1.1.1.1

1.1       root        1: /* opts.c */
                      2: 
                      3: /* Author:
                      4:  *     Steve Kirkendall
                      5:  *     16820 SW Tallac Way
                      6:  *     Beaverton, OR 97006
                      7:  *     [email protected], or ...uunet!tektronix!psueea!jove!kirkenda
                      8:  */
                      9: 
                     10: 
                     11: /* This file contains the code that manages the run-time options -- The 
                     12:  * values that can be modified via the "set" command.
                     13:  */
                     14: 
                     15: #include "config.h"
                     16: #include "vi.h"
                     17: #ifndef NULL
                     18: #define NULL (char *)0
                     19: #endif
                     20: extern char    *getenv();
                     21: 
                     22: /* maximum width to permit for strings, including ="" */
                     23: #define MAXWIDTH 20
                     24: 
                     25: /* These are the default values of all options */
                     26: char   o_autoindent[1] =       {FALSE};
                     27: char   o_autoprint[1] =        {TRUE};
                     28: char   o_autowrite[1] =        {FALSE};
                     29: #ifndef NO_ERRLIST
                     30: char   o_cc[30] =              {CC_COMMAND};
                     31: #endif
                     32: #ifndef NO_CHARATTR
                     33: char   o_charattr[1] =         {FALSE};
                     34: #endif
                     35: char   o_columns[3] =          {80, 32, 255};
                     36: #ifndef NO_DIGRAPH
                     37: char   o_digraph[1] =          {FALSE};
                     38: #endif
                     39: char   o_directory[30] =       TMPDIR;
                     40: char   o_edcompatible[1] =     {FALSE};
                     41: char   o_errorbells[1] =       {TRUE};
                     42: char   o_exrefresh[1] =        {TRUE};
                     43: #ifndef NO_DIGRAPH
                     44: char   o_flipcase[80]
                     45: # if CS_IBMPC
                     46:        = {"\207\200\201\232\202\220\204\216\206\217\221\222\224\231\244\245"}
                     47: # endif
                     48: # if CS_LATIN1
                     49:        /* initialized by initopts() */
                     50: # endif
                     51:        ;
                     52: #endif
                     53: #ifndef NO_SENTENCE
                     54: char   o_hideformat[1] =       {FALSE};
                     55: #endif
                     56: char   o_ignorecase[1] =       {FALSE};
                     57: #ifndef NO_EXTENSIONS
                     58: char   o_inputmode[1] =        {FALSE};
                     59: #endif
                     60: char   o_keytime[3] =          {2, 0, 5};
                     61: char   o_keywordprg[80] =      {KEYWORDPRG};
                     62: char   o_lines[3] =            {25, 2, 50};    /* More lines? Enlarge kbuf */
                     63: char   o_list[1] =             {FALSE};
                     64: #ifndef NO_MAGIC
                     65: char   o_magic[1] =            {TRUE};
                     66: #endif
                     67: #ifndef NO_ERRLIST
                     68: char   o_make[30] =            {MAKE_COMMAND};
                     69: #endif
                     70: #ifndef NO_MODELINE
                     71: char   o_modeline[1] =         {FALSE};
                     72: #endif
                     73: #ifndef NO_SENTENCE
                     74: char   o_paragraphs[30] =      "PPppIPLPQP";
                     75: #endif
                     76: #if MSDOS
                     77: char   o_pcbios[1] =           {TRUE};
                     78: #endif
                     79: char   o_readonly[1] =         {FALSE};
                     80: char   o_report[3] =           {5, 1, 127};
                     81: char   o_scroll[3] =           {12, 1, 127};
                     82: #ifndef NO_SENTENCE
                     83: char   o_sections[30] =        "NHSHSSSEse";
                     84: #endif
                     85: char   o_shell[60] =           SHELL;
                     86: char   o_shiftwidth[3] =       {8, 1, 255};
                     87: #ifndef NO_SHOWMATCH
                     88: char   o_showmatch[1] =        {FALSE};
                     89: #endif
                     90: #ifndef        NO_SHOWMODE
                     91: char   o_smd[1] =              {FALSE};
                     92: #endif
                     93: char   o_sidescroll[3] =       {8, 1, 40};
                     94: char   o_sync[1] =             {NEEDSYNC};
                     95: char   o_tabstop[3] =          {8, 1, 40};
                     96: char   o_term[30] =            "?";
                     97: char   o_vbell[1] =            {TRUE};
                     98: char   o_warn[1] =             {TRUE};
                     99: char   o_wrapmargin[3] =       {0, 0, 255};
                    100: char   o_wrapscan[1] =         {TRUE};
                    101: 
                    102: 
                    103: /* The following describes the names & types of all options */
                    104: #define BOOL   0
                    105: #define        NUM     1
                    106: #define        STR     2
                    107: #define SET    0x01    /* this option has had its value altered */
                    108: #define CANSET 0x02    /* this option can be set at any time */
                    109: #define RCSET  0x06    /* this option can be set in a .exrc file only */
                    110: #define MR     0x40    /* does this option affect the way text is displayed? */
                    111: struct
                    112: {
                    113:        char    *name;  /* name of an option */
                    114:        char    *nm;    /* short name of an option */
                    115:        char    type;   /* type of an option */
                    116:        char    flags;  /* boolean: has this option been set? */
                    117:        char    *value; /* value */
                    118: }
                    119:        opts[] =
                    120: {
                    121:        /* name                 type    flags   redraw  value */
                    122:        { "autoindent", "ai",   BOOL,   CANSET  ,       o_autoindent    },
                    123:        { "autoprint",  "ap",   BOOL,   CANSET  ,       o_autoprint     },
                    124:        { "autowrite",  "aw",   BOOL,   CANSET  ,       o_autowrite     },
                    125: #ifndef NO_ERRLIST
                    126:        { "cc",         "cc",   STR,    CANSET  ,       o_cc            },
                    127: #endif
                    128: #ifndef NO_CHARATTR
                    129:        { "charattr",   "ca",   BOOL,   CANSET  | MR,   o_charattr      },
                    130: #endif
                    131:        { "columns",    "co",   NUM,    SET     ,       o_columns       },
                    132: #ifndef NO_DIGRAPH
                    133:        { "digraph",    "dig",  BOOL,   CANSET  ,       o_digraph       },
                    134: #endif
                    135:        { "directory",  "dir",  STR,    RCSET   ,       o_directory     },
                    136:        { "edcompatible","ed",  BOOL,   CANSET  ,       o_edcompatible  },
                    137:        { "errorbells", "eb",   BOOL,   CANSET  ,       o_errorbells    },
                    138:        { "exrefresh",  "er",   BOOL,   CANSET  ,       o_exrefresh     },
                    139: #ifndef NO_DIGRAPH
                    140:        { "flipcase",   "fc",   STR,    CANSET  ,       o_flipcase      },
                    141: #endif
                    142: #ifndef NO_SENTENCE
                    143:        { "hideformat", "hf",   BOOL,   CANSET  | MR,   o_hideformat    },
                    144: #endif
                    145:        { "ignorecase", "ic",   BOOL,   CANSET  ,       o_ignorecase    },
                    146: #ifndef NO_EXTENSIONS
                    147:        { "inputmode",  "im",   BOOL,   CANSET  ,       o_inputmode     },
                    148: #endif
                    149:        { "keytime",    "kt",   NUM,    CANSET  ,       o_keytime       },
                    150:        { "keywordprg", "kp",   STR,    CANSET  ,       o_keywordprg    },
                    151:        { "lines",      "ls",   NUM,    SET     ,       o_lines         },
                    152:        { "list",       "li",   BOOL,   CANSET  | MR,   o_list          },
                    153: #ifndef NO_MAGIC
                    154:        { "magic",      "ma",   BOOL,   CANSET  ,       o_magic         },
                    155: #endif
                    156: #ifndef NO_ERRLIST
                    157:        { "make",       "mk",   STR,    CANSET  ,       o_make          },
                    158: #endif
                    159: #ifndef NO_MODELINE
                    160:        { "modeline",   "ml",   BOOL,   CANSET  ,       o_modeline      },
                    161: #endif
                    162: #ifndef NO_SENTENCE
                    163:        { "paragraphs", "pa",   STR,    CANSET  ,       o_paragraphs    },
                    164: #endif
                    165: #if MSDOS
                    166:        { "pcbios",     "pc",   BOOL,   SET     ,       o_pcbios        },
                    167: #endif
                    168:        { "readonly",   "ro",   BOOL,   CANSET  ,       o_readonly      },
                    169:        { "report",     "re",   NUM,    CANSET  ,       o_report        },
                    170:        { "scroll",     "sc",   NUM,    CANSET  ,       o_scroll        },
                    171: #ifndef NO_SENTENCE
                    172:        { "sections",   "se",   STR,    CANSET  ,       o_sections      },
                    173: #endif
                    174:        { "shell",      "sh",   STR,    CANSET  ,       o_shell         },
                    175: #ifndef NO_SHOWMATCH
                    176:        { "showmatch",  "sm",   BOOL,   CANSET  ,       o_showmatch     },
                    177: #endif
                    178: #ifndef        NO_SHOWMODE
                    179:        { "showmode",   "smd",  BOOL,   CANSET  ,       o_smd           },
                    180: #endif
                    181:        { "shiftwidth", "sw",   NUM,    CANSET  ,       o_shiftwidth    },
                    182:        { "sidescroll", "ss",   NUM,    CANSET  ,       o_sidescroll    },
                    183:        { "sync",       "sy",   BOOL,   CANSET  ,       o_sync          },
                    184:        { "tabstop",    "ts",   NUM,    CANSET  | MR,   o_tabstop       },
                    185:        { "term",       "te",   STR,    SET     ,       o_term          },
                    186:        { "vbell",      "vb",   BOOL,   CANSET  ,       o_vbell         },
                    187:        { "warn",       "wa",   BOOL,   CANSET  ,       o_warn          },
                    188:        { "wrapmargin", "wm",   NUM,    CANSET  ,       o_wrapmargin    },
                    189:        { "wrapscan",   "ws",   BOOL,   CANSET  ,       o_wrapscan      },
                    190:        { NULL, NULL, 0, CANSET, NULL }
                    191: };
                    192: 
                    193: 
                    194: /* This function initializes certain options from environment variables, etc. */
                    195: void initopts()
                    196: {
                    197:        char    *val;
                    198:        int     i;
                    199: 
                    200:        /* set some stuff from environment variables */
                    201: #if MSDOS
                    202:        if (val = getenv("COMSPEC")) /* yes, ASSIGNMENT! */
                    203: #else
                    204:        if (val = getenv("SHELL")) /* yes, ASSIGNMENT! */
                    205: #endif
                    206:        {
                    207:                strcpy(o_shell, val);
                    208:        }
                    209: 
                    210: #if ANY_UNIX
                    211:        if (val = getenv("TERM")) /* yes, ASSIGNMENT! */
                    212:        {
                    213:                strcpy(o_term, val);
                    214:        }
                    215: #endif
                    216: #if TOS
                    217:        val = "vt52";
                    218:        strcpy(o_term, val);
                    219: #endif
                    220: #if MSDOS
                    221:        if ((val = getenv("TERM")) /* yes, ASSIGNMENT! */
                    222:                && strcmp(val, "pcbios"))
                    223:        {
                    224:                strcpy(o_term, val);
                    225:                o_pcbios[0] = 0;
                    226:        }
                    227:        else
                    228:        {
                    229:                strcpy(o_term, "pcbios");
                    230:                o_pcbios[0] = 1;
                    231:        }
                    232: #endif
                    233: #if MSDOS || TOS
                    234:        if ((val = getenv("TMP")) /* yes, ASSIGNMENT! */
                    235:        ||  (val = getenv("TEMP")))
                    236:                strcpy(o_directory, val);
                    237: #endif
                    238: 
                    239:        *o_scroll = LINES / 2 - 1;
                    240: 
                    241:        /* disable the vbell option if we don't know how to do a vbell */
                    242:        if (!has_VB)
                    243:        {
                    244:                for (i = 0; opts[i].value != o_vbell; i++)
                    245:                {
                    246:                }
                    247:                opts[i].flags &= ~CANSET;
                    248:                *o_vbell = FALSE;
                    249:        }
                    250: 
                    251: #ifndef NO_DIGRAPH
                    252: # ifdef CS_LATIN1
                    253:        for (i = 0, val = o_flipcase; i < 32; i++)
                    254:        {
                    255:                /* leave out the multiply/divide symbols */
                    256:                if (i == 23)
                    257:                        continue;
                    258: 
                    259:                /* add upper/lowercase pair */
                    260:                *val++ = i + 0xc0;
                    261:                *val++ = i + 0xe0;
                    262:        }
                    263:        *val = '\0';
                    264: # endif /* CS_LATIN1 */
                    265: #endif /* not NO_DIGRAPH */
                    266: }
                    267: 
                    268: /* This function lists the current values of all options */
                    269: void dumpopts(all)
                    270:        int     all;    /* boolean: dump all options, or just set ones? */
                    271: {
                    272: #ifndef NO_OPTCOLS
                    273:        int     i, j, k;
                    274:        char    nbuf[4];        /* used for converting numbers to ASCII */
                    275:        int     widths[5];      /* width of each column, including gap */
                    276:        int     ncols;          /* number of columns */
                    277:        int     nrows;          /* number of options per column */
                    278:        int     nset;           /* number of options to be output */
                    279:        int     width;          /* width of a particular option */
                    280:        int     todump[50];     /* indicies of options to be dumped */
                    281: 
                    282:        /* step 1: count the number of set options */
                    283:        for (nset = i = 0; opts[i].name; i++)
                    284:        {
                    285:                if (all || (opts[i].flags & SET))
                    286:                {
                    287:                        todump[nset++] = i;
                    288:                }
                    289:        }
                    290: 
                    291:        /* step two: try to use as many columns as possible */
                    292:        for (ncols = (nset > 5 ? 5 : nset); ncols > 1; ncols--)
                    293:        {
                    294:                /* how many would go in this column? */
                    295:                nrows = (nset + ncols - 1) / ncols;
                    296: 
                    297:                /* figure out the width of each column */
                    298:                for (i = 0; i < ncols; i++)
                    299:                {
                    300:                        widths[i] = 0;
                    301:                        for (j = 0, k = nrows * i; j < nrows && k < nset; j++, k++)
                    302:                        {
                    303:                                /* figure out the width of a particular option */
                    304:                                switch (opts[todump[k]].type)
                    305:                                {
                    306:                                  case BOOL:
                    307:                                        if (!*opts[todump[k]].value)
                    308:                                                width = 2;
                    309:                                        else
                    310:                                                width = 0;
                    311:                                        break;
                    312: 
                    313:                                  case STR:
                    314:                                        width = 3 + strlen(opts[todump[k]].value);
                    315:                                        if (width > MAXWIDTH)
                    316:                                                width = MAXWIDTH;
                    317:                                        break;
                    318: 
                    319:                                  case NUM:
                    320:                                        width = 4;
                    321:                                        break;
                    322:                                }
                    323:                                width += strlen(opts[todump[k]].name);
                    324: 
                    325:                                /* if this is the widest so far, widen col */
                    326:                                if (width > widths[i])
                    327:                                {
                    328:                                        widths[i] = width;
                    329:                                }
                    330:                        }
                    331: 
                    332:                }
                    333: 
                    334:                /* if the total width is narrow enough, then use it */
                    335:                for (width = -2, i = 0; i < ncols; i++)
                    336:                {
                    337:                        width += widths[i] + 2;
                    338:                }
                    339:                if (width < COLS - 1)
                    340:                {
                    341:                        break;
                    342:                }
                    343:        }
                    344: 
                    345:        /* step 3: output the columns */
                    346:        nrows = (nset + ncols - 1) / ncols;
                    347:        for (i = 0; i < nrows; i++)
                    348:        {
                    349:                for (j = 0; j < ncols; j++)
                    350:                {
                    351:                        /* if we hit the end of the options, quit */
                    352:                        k = i + j * nrows;
                    353:                        if (k >= nset)
                    354:                        {
                    355:                                break;
                    356:                        }
                    357: 
                    358:                        /* output this option's value */
                    359:                        width = 0;
                    360:                        switch (opts[todump[k]].type)
                    361:                        {
                    362:                          case BOOL:
                    363:                                if (!*opts[todump[k]].value)
                    364:                                {
                    365:                                        qaddch('n');
                    366:                                        qaddch('o');
                    367:                                        width = 2;
                    368:                                }
                    369:                                qaddstr(opts[todump[k]].name);
                    370:                                width += strlen(opts[todump[k]].name);
                    371:                                break;
                    372: 
                    373:                          case NUM:
                    374:                                sprintf(nbuf, "%-3d", UCHAR(*opts[todump[k]].value));
                    375:                                qaddstr(opts[todump[k]].name);
                    376:                                qaddch('=');
                    377:                                qaddstr(nbuf);
                    378:                                width = 4 + strlen(opts[todump[k]].name);
                    379:                                break;
                    380: 
                    381:                          case STR:
                    382:                                qaddstr(opts[todump[k]].name);
                    383:                                qaddch('=');
                    384:                                qaddch('"');
                    385:                                strcpy(tmpblk.c, opts[todump[k]].value);
                    386:                                width = 3 + strlen(tmpblk.c);
                    387:                                if (width > MAXWIDTH)
                    388:                                {
                    389:                                        width = MAXWIDTH;
                    390:                                        strcpy(tmpblk.c + MAXWIDTH - 6, "...");
                    391:                                }
                    392:                                qaddstr(tmpblk.c);
                    393:                                qaddch('"');
                    394:                                width += strlen(opts[todump[k]].name);
                    395:                                break;
                    396:                        }
                    397: 
                    398:                        /* pad the field to the correct size */
                    399:                        if (k + nrows <= nset)
                    400:                        {
                    401:                                while (width < widths[j] + 2)
                    402:                                {
                    403:                                        qaddch(' ');
                    404:                                        width++;
                    405:                                }
                    406:                        }
                    407:                }
                    408:                addch('\n');
                    409:                exrefresh();
                    410:        }
                    411: #else
                    412:        int     i;
                    413:        int     col;
                    414:        char    nbuf[4];
                    415: 
                    416:        for (i = col = 0; opts[i].name; i++)
                    417:        {
                    418:                /* if not set and not all, ignore this option */
                    419:                if (!all && !(opts[i].flags & SET))
                    420:                {
                    421:                        continue;
                    422:                }
                    423: 
                    424:                /* align this option in one of the columns */
                    425:                if (col > 52)
                    426:                {
                    427:                        addch('\n');
                    428:                        col = 0;
                    429:                }
                    430:                else if (col > 26)
                    431:                {
                    432:                        while (col < 52)
                    433:                        {
                    434:                                qaddch(' ');
                    435:                                col++;
                    436:                        }
                    437:                }
                    438:                else if (col > 0)
                    439:                {
                    440:                        while (col < 26)
                    441:                        {
                    442:                                qaddch(' ');
                    443:                                col++;
                    444:                        }
                    445:                }
                    446: 
                    447:                switch (opts[i].type)
                    448:                {
                    449:                  case BOOL:
                    450:                        if (!*opts[i].value)
                    451:                        {
                    452:                                qaddch('n');
                    453:                                qaddch('o');
                    454:                                col += 2;
                    455:                        }
                    456:                        qaddstr(opts[i].name);
                    457:                        col += strlen(opts[i].name);
                    458:                        break;
                    459: 
                    460:                  case NUM:
                    461:                        sprintf(nbuf, "%-3d", UCHAR(*opts[i].value));
                    462:                        qaddstr(opts[i].name);
                    463:                        qaddch('=');
                    464:                        qaddstr(nbuf);
                    465:                        col += 4 + strlen(opts[i].name);
                    466:                        break;
                    467: 
                    468:                  case STR:
                    469:                        qaddstr(opts[i].name);
                    470:                        qaddch('=');
                    471:                        qaddch('"');
                    472:                        qaddstr(opts[i].value);
                    473:                        qaddch('"');
                    474:                        col += 3 + strlen(opts[i].name) + strlen(opts[i].value);
                    475:                        break;
                    476:                }
                    477:                exrefresh();
                    478:        }
                    479:        if (col > 0)
                    480:        {
                    481:                addch('\n');
                    482:                exrefresh();
                    483:        }
                    484: #endif
                    485: }
                    486: 
                    487: #ifndef NO_MKEXRC
                    488: /* This function saves the current configuarion of options to a file */
                    489: void saveopts(fd)
                    490:        int     fd;     /* file descriptor to write to */
                    491: {
                    492:        int     i;
                    493:        char    buf[256], *pos;
                    494: 
                    495:        /* write each set options */
                    496:        for (i = 0; opts[i].name; i++)
                    497:        {
                    498:                /* if unset or unsettable, ignore this option */
                    499:                if (!(opts[i].flags & SET) || !(opts[i].flags & CANSET))
                    500:                {
                    501:                        continue;
                    502:                }
                    503: 
                    504:                strcpy(buf, "set ");
                    505:                pos = &buf[4];
                    506:                switch (opts[i].type)
                    507:                {
                    508:                  case BOOL:
                    509:                        if (!*opts[i].value)
                    510:                        {
                    511:                                *pos++='n';
                    512:                                *pos++='o';
                    513:                        }
                    514:                        strcpy(pos, opts[i].name);
                    515:                        strcat(pos, "\n");
                    516:                        break;
                    517: 
                    518:                  case NUM:
                    519:                        sprintf(pos, "%s=%-3d\n", opts[i].name, *opts[i].value & 0xff);
                    520:                        break;
                    521: 
                    522:                  case STR:
                    523:                        sprintf(pos, "%s=\"%s\"\n", opts[i].name, opts[i].value);
                    524:                        break;
                    525:                }
                    526:                twrite(fd, buf, strlen(buf));
                    527:        }
                    528: }
                    529: #endif
                    530: 
                    531: 
                    532: /* This function changes the values of one or more options. */
                    533: void setopts(assignments)
                    534:        char    *assignments;   /* a string containing option assignments */
                    535: {
                    536:        char    *name;          /* name of variable in assignments */
                    537:        char    *value;         /* value of the variable */
                    538:        char    *scan;          /* used for moving through strings */
                    539:        int     i, j;
                    540: 
                    541:        /* for each assignment... */
                    542:        for (name = assignments; *name; )
                    543:        {
                    544:                /* skip whitespace */
                    545:                if (*name == ' ' || *name == '\t')
                    546:                {
                    547:                        name++;
                    548:                        continue;
                    549:                }
                    550: 
                    551:                /* find the value, if any */
                    552:                for (scan = name; *scan >= 'a' && *scan <= 'z'; scan++)
                    553:                {
                    554:                }
                    555:                if (*scan == '=')
                    556:                {
                    557:                        *scan++ = '\0';
                    558:                        if (*scan == '"')
                    559:                        {
                    560:                                value = ++scan;
                    561:                                while (*scan && *scan != '"')
                    562:                                {
                    563:                                        scan++;
                    564:                                }
                    565:                                if (*scan)
                    566:                                {
                    567:                                        *scan++ = '\0';
                    568:                                }
                    569:                        }
                    570:                        else
                    571:                        {
                    572:                                value = scan;
                    573:                                while (*scan && *scan != ' ' && *scan != '\t')
                    574:                                {
                    575:                                        scan++;
                    576:                                }
                    577:                                if (*scan)
                    578:                                {
                    579:                                        *scan++ = '\0';
                    580:                                }
                    581:                        }
                    582:                }
                    583:                else
                    584:                {
                    585:                        if (*scan)
                    586:                        {
                    587:                                *scan++ = '\0';
                    588:                        }
                    589:                        value = NULL;
                    590:                        if (name[0] == 'n' && name[1] == 'o')
                    591:                        {
                    592:                                name += 2;
                    593:                        }
                    594:                }
                    595: 
                    596:                /* find the variable */
                    597:                for (i = 0;
                    598:                     opts[i].name && strcmp(opts[i].name, name) && strcmp(opts[i].nm, name);
                    599:                     i++)
                    600:                {
                    601:                }
                    602: 
                    603:                /* change the variable */
                    604:                if (!opts[i].name)
                    605:                {
                    606:                        msg("invalid option name \"%s\"", name);
                    607:                }
                    608:                else if ((opts[i].flags & CANSET) != CANSET)
                    609:                {
                    610:                        msg("option \"%s\" can't be altered", name);
                    611:                }
                    612:                else if ((opts[i].flags & RCSET) != CANSET && nlines >= 1L)
                    613:                {
                    614:                        msg("option \"%s\" can only be set in a %s file", name, EXRC);
                    615:                }
                    616:                else if (value)
                    617:                {
                    618:                        switch (opts[i].type)
                    619:                        {
                    620:                          case BOOL:
                    621:                                msg("option \"[no]%s\" is boolean", name);
                    622:                                break;
                    623: 
                    624:                          case NUM:
                    625:                                j = atoi(value);
                    626:                                if (j == 0 && *value != '0')
                    627:                                {
                    628:                                        msg("option \"%s\" must have a numeric value", name);
                    629:                                }
                    630:                                else if (j < opts[i].value[1] || j > (opts[i].value[2] & 0xff))
                    631:                                {
                    632:                                        msg("option \"%s\" must have a value between %d and %d",
                    633:                                                name, opts[i].value[1], opts[i].value[2] & 0xff);
                    634:                                }
                    635:                                else
                    636:                                {
                    637:                                        *opts[i].value = atoi(value);
                    638:                                        opts[i].flags |= SET;
                    639:                                }
                    640:                                break;
                    641: 
                    642:                          case STR:
                    643:                                strcpy(opts[i].value, value);
                    644:                                opts[i].flags |= SET;
                    645:                                break;
                    646:                        }
                    647:                        if (opts[i].flags & MR)
                    648:                        {
                    649:                                mustredraw = TRUE;
                    650:                        }
                    651:                }
                    652:                else /* valid option, no value */
                    653:                {
                    654:                        if (opts[i].type == BOOL)
                    655:                        {
                    656:                                *opts[i].value = (name[-1] != 'o');
                    657:                                opts[i].flags |= SET;
                    658:                                if (opts[i].flags & MR)
                    659:                                {
                    660:                                        mustredraw = TRUE;
                    661:                                }
                    662:                        }
                    663:                        else
                    664:                        {
                    665:                                msg("option \"%s\" must be given a value", name);
                    666:                        }
                    667:                }
                    668: 
                    669:                /* move on to the next option */
                    670:                name = scan;
                    671:        }
                    672: 
                    673:        /* special processing ... */
                    674: 
                    675:        /* if "readonly" then set the READONLY flag for this file */
                    676:        if (*o_readonly)
                    677:        {
                    678:                setflag(file, READONLY);
                    679:        }
                    680: }

unix.superglobalmegacorp.com

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