diff options
Diffstat (limited to 'ex_set.c')
-rw-r--r-- | ex_set.c | 313 |
1 files changed, 313 insertions, 0 deletions
diff --git a/ex_set.c b/ex_set.c new file mode 100644 index 0000000..ca7fe45 --- /dev/null +++ b/ex_set.c @@ -0,0 +1,313 @@ +/* + * This code contains changes by + * Gunnar Ritter, Freiburg i. Br., Germany, 2002. All rights reserved. + * + * Conditions 1, 2, and 4 and the no-warranty notice below apply + * to these changes. + * + * + * Copyright (c) 1980, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * + * Copyright(C) Caldera International Inc. 2001-2002. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * Redistributions of source code and documentation must retain the + * above copyright notice, this list of conditions and the following + * disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed or owned by Caldera + * International, Inc. + * Neither the name of Caldera International, Inc. nor the names of + * other contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * USE OF THE SOFTWARE PROVIDED FOR UNDER THIS LICENSE BY CALDERA + * INTERNATIONAL, INC. AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL CALDERA INTERNATIONAL, INC. BE + * LIABLE FOR ANY DIRECT, INDIRECT INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE + * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, + * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef lint +#ifdef DOSCCS +static char sccsid[] = "@(#)ex_set.c 1.11 (gritter) 11/24/04"; +#endif +#endif + +/* from ex_set.c 7.4 (Berkeley) 6/7/85 */ + +#include "ex.h" +#include "ex_temp.h" +#include "ex_tty.h" + +/* + * Set command. + */ +char optname[ONMSZ]; + +void +set(void) +{ + register char *cp; + register struct option *op; + register int c; + bool no; + + setnoaddr(); + if (skipend()) { + if (peekchar() != EOF) + ignchar(); + propts(); + return; + } + do { + cp = optname; + do { + if (cp < &optname[ONMSZ - 2]) + *cp++ = getchar(); + } while (isalnum(peekchar())); + *cp = 0; + cp = optname; + if (eq("all", cp)) { + if (inopen) + pofix(); + prall(); + goto setnext; + } + no = 0; + if (cp[0] == 'n' && cp[1] == 'o') { + cp += 2; + no++; + } + /* Implement w300, w1200, and w9600 specially */ + if (eq(cp, "w300")) { + if (ospeed >= B1200) { +dontset: + ignore(getchar()); /* = */ + ignore(getnum()); /* value */ + continue; + } + cp = "window"; + } else if (eq(cp, "w1200")) { + if (ospeed < B1200 || ospeed >= B2400) + goto dontset; + cp = "window"; + } else if (eq(cp, "w9600")) { + if (ospeed < B2400) + goto dontset; + cp = "window"; + } + for (op = options; op < &options[NOPTS]; op++) + if (eq(op->oname, cp) || op->oabbrev && eq(op->oabbrev, cp)) + break; + if (op->oname == 0) + serror(catgets(catd, 1, 159, + "%s: No such option@- 'set all' gives all option values"), cp); + c = skipwh(); + if (peekchar() == '?') { + ignchar(); +printone: + propt(op); + noonl(); + goto setnext; + } + if (op->otype == ONOFF) { + op->ovalue = 1 - no; + if (op == &options[PROMPT]) + oprompt = 1 - no; + goto setnext; + } + if (no) + serror(catgets(catd, 1, 160, + "Option %s is not a toggle"), op->oname); + if (c != 0 || setend()) + goto printone; + if (getchar() != '=') + serror(catgets(catd, 1, 161, + "Missing =@in assignment to option %s"), op->oname); + switch (op->otype) { + + case NUMERIC: + if (!isdigit(peekchar())) + error(catgets(catd, 1, 162, + "Digits required@after =")); + op->ovalue = getnum(); + if (value(TABSTOP) <= 0) + value(TABSTOP) = TABS; + if (value(HARDTABS) <= 0) + value(HARDTABS) = TABS; + if (op == &options[WINDOW]) { + if (value(WINDOW) >= TLINES) + value(WINDOW) = TLINES-1; + vsetsiz(value(WINDOW)); + } + break; + + case STRING: + case OTERM: + cp = optname; + while (!setend()) { + if (cp >= &optname[ONMSZ]) + error(catgets(catd, 1, 163, + "String too long@in option assignment")); + /* adb change: allow whitepace in strings */ + if( (*cp = getchar()) == '\\') + if( peekchar() != EOF) + *cp = getchar(); + cp++; + } + *cp = 0; + if (op->otype == OTERM) { +/* + * At first glance it seems like we shouldn't care if the terminal type + * is changed inside visual mode, as long as we assume the screen is + * a mess and redraw it. However, it's a much harder problem than that. + * If you happen to change from 1 crt to another that both have the same + * size screen, it's OK. But if the screen size if different, the stuff + * that gets initialized in vop() will be wrong. This could be overcome + * by redoing the initialization, e.g. making the first 90% of vop into + * a subroutine. However, the most useful case is where you forgot to do + * a setenv before you went into the editor and it thinks you're on a dumb + * terminal. Ex treats this like hardcopy and goes into HARDOPEN mode. + * This loses because the first part of vop calls oop in this case. + * The problem is so hard I gave up. I'm not saying it can't be done, + * but I am saying it probably isn't worth the effort. + */ + if (inopen) + error(catgets(catd, 1, 164, + "Can't change type of terminal from within open/visual")); + setterm(optname); + } else { + CP(op->osvalue, optname); + op->odefault = 1; + } + break; + } +setnext: + flush(); + } while (!skipend()); + eol(); +} + +int +setend(void) +{ + + return (is_white(peekchar()) || endcmd(peekchar())); +} + +void +prall(void) +{ + register int incr = (NOPTS + 2) / 3; + register int rows = incr; + register struct option *op = options; + + for (; rows; rows--, op++) { + propt(op); + tab(24); + propt(&op[incr]); + if (&op[2*incr] < &options[NOPTS]) { + tab(56); + propt(&op[2 * incr]); + } + putNFL(); + } +} + +void +propts(void) +{ + register struct option *op; + + for (op = options; op < &options[NOPTS]; op++) { + if (op == &options[TTYTYPE]) + continue; + switch (op->otype) { + + case ONOFF: + case NUMERIC: + if (op->ovalue == op->odefault) + continue; + break; + + case STRING: + if (op->odefault == 0) + continue; + break; + } + propt(op); + putchar(' '); + } + noonl(); + flush(); +} + +void +propt(register struct option *op) +{ + register char *name; + + name = op->oname; + + switch (op->otype) { + + case ONOFF: + printf(catgets(catd, 1, 165, "%s%s"), + op->ovalue ? catgets(catd, 1, 166, "") + : catgets(catd, 1, 167, "no"), name); + break; + + case NUMERIC: + printf(catgets(catd, 1, 168, "%s=%d"), name, op->ovalue); + break; + + case STRING: + case OTERM: + printf(catgets(catd, 1, 169, "%s=%s"), name, op->osvalue); + break; + } +} |