Annotation of coherent/g/usr/bin/vi/opts.c, revision 1.1

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

unix.superglobalmegacorp.com

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