/* $Header: /nw/tony/src/stevie/src/RCS/param.c,v 1.10 89/08/02 10:59:10 tony Exp $ * * Code to handle user-settable parameters. This is all pretty much table- * driven. To add a new parameter, put it in the params array, and add a * macro for it in param.h. If it's a numeric parameter, add any necessary * bounds checks to doset(). String parameters aren't currently supported. */ #include "stevie.h" extern long CursorSize; struct param params[] = { { "tabstop", "ts", 4, P_NUM }, { "scroll", "scroll", 12, P_NUM }, { "report", "report", 5, P_NUM }, { "lines", "lines", 25, P_NUM }, { "vbell", "vb", TRUE, P_BOOL }, { "showmatch", "sm", FALSE, P_BOOL }, { "wrapscan", "ws", TRUE, P_BOOL }, { "errorbells", "eb", FALSE, P_BOOL }, { "showmode", "mo", FALSE, P_BOOL }, { "backup", "bk", FALSE, P_BOOL }, { "return", "cr", TRUE, P_BOOL }, { "list", "list", FALSE, P_BOOL }, { "ignorecase", "ic", FALSE, P_BOOL }, { "autoindent", "ai", FALSE, P_BOOL }, { "number", "nu", FALSE, P_BOOL }, { "modelines", "ml", FALSE, P_BOOL }, { "tildeop", "to", FALSE, P_BOOL }, { "terse", "terse", FALSE, P_BOOL }, { "cursorsize", "cs", 25, P_NUM }, { "highlightsearch", "hs", TRUE, P_BOOL }, { "columns", "co", 80, P_NUM }, { "hardtabs", "ht", FALSE, P_BOOL }, { "shiftwidth", "sw", 4, P_NUM }, { "", "", 0, 0, } /* end marker */ }; static void showparms(); void wchangescreen(); void doset(arg) char *arg; /* parameter string */ { register int i; register char *s; bool_t did_lines = FALSE; bool_t state = TRUE; /* new state of boolean parms. */ if (arg == NULL) { showparms(FALSE); return; } if (strncmp(arg, "all", 3) == 0) { showparms(TRUE); return; } if (strncmp(arg, "no", 2) == 0) { state = FALSE; arg += 2; } for (i=0; params[i].fullname[0] != NUL ;i++) { s = params[i].fullname; if (strncmp(arg, s, strlen(s)) == 0) /* matched full name */ break; s = params[i].shortname; if (strncmp(arg, s, strlen(s)) == 0) /* matched short name */ break; } if (params[i].fullname[0] != NUL) { /* found a match */ if (params[i].flags & P_NUM) { did_lines = ((i == P_LI) || (i == P_CO)); if (arg[strlen(s)] != '=' || state == FALSE) emsg("Invalid set of numeric parameter"); else { params[i].value = atoi(arg+strlen(s)+1); params[i].flags |= P_CHANGED; } } else /* boolean */ { if (arg[strlen(s)] == '=') emsg("Invalid set of boolean parameter"); else { params[i].value = state; params[i].flags |= P_CHANGED; } } } else emsg("Unrecognized 'set' option"); /* * Update the screen in case we changed something like "tabstop" * or "list" that will change its appearance. */ updatescreen(); CursorSize = P(P_CS); VisibleCursor(); if (did_lines) { Rows = P(P_LI); Columns = P(P_CO); screenalloc(); /* allocate new screen buffers */ screenclear(); (void)wchangescreen(Rows, Columns); updatescreen(); } /* * Check the bounds for numeric parameters here */ if (P(P_TS) <= 0 || P(P_TS) > 32) { emsg("Invalid tab size specified"); P(P_TS) = 8; return; } if (P(P_SS) <= 0 || P(P_SS) > Rows) { emsg("Invalid scroll size specified"); P(P_SS) = 12; return; } #ifndef TILDEOP if (P(P_TO)) { emsg("Tilde-operator not enabled"); P(P_TO) = FALSE; return; } #endif /* * Check for another argument, and call doset() recursively, if * found. If any argument results in an error, no further * parameters are processed. */ while (*arg != ' ' && *arg != '\t') { /* skip to next white space */ if (*arg == NUL) return; /* end of parameter list */ arg++; } while (*arg == ' ' || *arg == '\t') /* skip to next non-white */ arg++; if (*arg) doset(arg); /* recurse on next parameter */ } static void showparms(all) bool_t all; /* show ALL parameters */ { register struct param *p; char buf[64]; gotocmd(TRUE, 0); outstr("Parameters:\r\n"); for (p = ¶ms[0]; p->fullname[0] != NUL ;p++) { if (!all && ((p->flags & P_CHANGED) == 0)) continue; if (p->flags & P_BOOL) sprintf(buf, "\t%s%s\r\n", (p->value ? "" : "no"), p->fullname); else sprintf(buf, "\t%s=%d\r\n", p->fullname, p->value); outstr(buf); } wait_return(); }