|
|
1.1 ! root 1: /* Copyright (c) 1981 Regents of the University of California */ ! 2: static char *sccsid = "@(#)ex_set.c 7.2 6/27/83"; ! 3: #include "ex.h" ! 4: #include "ex_temp.h" ! 5: #include "ex_tty.h" ! 6: ! 7: /* ! 8: * Set command. ! 9: */ ! 10: char optname[ONMSZ]; ! 11: ! 12: set() ! 13: { ! 14: register char *cp; ! 15: register struct option *op; ! 16: register int c; ! 17: bool no; ! 18: extern short ospeed; ! 19: ! 20: setnoaddr(); ! 21: if (skipend()) { ! 22: if (peekchar() != EOF) ! 23: ignchar(); ! 24: propts(); ! 25: return; ! 26: } ! 27: do { ! 28: cp = optname; ! 29: do { ! 30: if (cp < &optname[ONMSZ - 2]) ! 31: *cp++ = getchar(); ! 32: } while (isalnum(peekchar())); ! 33: *cp = 0; ! 34: cp = optname; ! 35: if (eq("all", cp)) { ! 36: if (inopen) ! 37: pofix(); ! 38: prall(); ! 39: goto next; ! 40: } ! 41: no = 0; ! 42: if (cp[0] == 'n' && cp[1] == 'o') { ! 43: cp += 2; ! 44: no++; ! 45: } ! 46: /* Implement w300, w1200, and w9600 specially */ ! 47: if (eq(cp, "w300")) { ! 48: if (ospeed >= B1200) { ! 49: dontset: ! 50: ignore(getchar()); /* = */ ! 51: ignore(getnum()); /* value */ ! 52: continue; ! 53: } ! 54: cp = "window"; ! 55: } else if (eq(cp, "w1200")) { ! 56: if (ospeed < B1200 || ospeed >= B2400) ! 57: goto dontset; ! 58: cp = "window"; ! 59: } else if (eq(cp, "w9600")) { ! 60: if (ospeed < B2400) ! 61: goto dontset; ! 62: cp = "window"; ! 63: } ! 64: for (op = options; op < &options[NOPTS]; op++) ! 65: if (eq(op->oname, cp) || op->oabbrev && eq(op->oabbrev, cp)) ! 66: break; ! 67: if (op->oname == 0) ! 68: serror("%s: No such option@- 'set all' gives all option values", cp); ! 69: c = skipwh(); ! 70: if (peekchar() == '?') { ! 71: ignchar(); ! 72: printone: ! 73: propt(op); ! 74: noonl(); ! 75: goto next; ! 76: } ! 77: if (op->otype == ONOFF) { ! 78: op->ovalue = 1 - no; ! 79: if (op == &options[PROMPT]) ! 80: oprompt = 1 - no; ! 81: goto next; ! 82: } ! 83: if (no) ! 84: serror("Option %s is not a toggle", op->oname); ! 85: if (c != 0 || setend()) ! 86: goto printone; ! 87: if (getchar() != '=') ! 88: serror("Missing =@in assignment to option %s", op->oname); ! 89: switch (op->otype) { ! 90: ! 91: case NUMERIC: ! 92: if (!isdigit(peekchar())) ! 93: error("Digits required@after ="); ! 94: op->ovalue = getnum(); ! 95: if (value(TABSTOP) <= 0) ! 96: value(TABSTOP) = TABS; ! 97: if (value(HARDTABS) <= 0) ! 98: value(HARDTABS) = TABS; ! 99: if (op == &options[WINDOW]) { ! 100: if (value(WINDOW) >= LINES) ! 101: value(WINDOW) = LINES-1; ! 102: vsetsiz(value(WINDOW)); ! 103: } ! 104: break; ! 105: ! 106: case STRING: ! 107: case OTERM: ! 108: cp = optname; ! 109: while (!setend()) { ! 110: if (cp >= &optname[ONMSZ]) ! 111: error("String too long@in option assignment"); ! 112: /* adb change: allow whitepace in strings */ ! 113: if( (*cp = getchar()) == '\\') ! 114: if( peekchar() != EOF) ! 115: *cp = getchar(); ! 116: cp++; ! 117: } ! 118: *cp = 0; ! 119: if (op->otype == OTERM) { ! 120: /* ! 121: * At first glance it seems like we shouldn't care if the terminal type ! 122: * is changed inside visual mode, as long as we assume the screen is ! 123: * a mess and redraw it. However, it's a much harder problem than that. ! 124: * If you happen to change from 1 crt to another that both have the same ! 125: * size screen, it's OK. But if the screen size if different, the stuff ! 126: * that gets initialized in vop() will be wrong. This could be overcome ! 127: * by redoing the initialization, e.g. making the first 90% of vop into ! 128: * a subroutine. However, the most useful case is where you forgot to do ! 129: * a setenv before you went into the editor and it thinks you're on a dumb ! 130: * terminal. Ex treats this like hardcopy and goes into HARDOPEN mode. ! 131: * This loses because the first part of vop calls oop in this case. ! 132: * The problem is so hard I gave up. I'm not saying it can't be done, ! 133: * but I am saying it probably isn't worth the effort. ! 134: */ ! 135: if (inopen) ! 136: error("Can't change type of terminal from within open/visual"); ! 137: setterm(optname); ! 138: } else { ! 139: CP(op->osvalue, optname); ! 140: op->odefault = 1; ! 141: } ! 142: break; ! 143: } ! 144: next: ! 145: flush(); ! 146: } while (!skipend()); ! 147: eol(); ! 148: } ! 149: ! 150: setend() ! 151: { ! 152: ! 153: return (iswhite(peekchar()) || endcmd(peekchar())); ! 154: } ! 155: ! 156: prall() ! 157: { ! 158: register int incr = (NOPTS + 2) / 3; ! 159: register int rows = incr; ! 160: register struct option *op = options; ! 161: ! 162: for (; rows; rows--, op++) { ! 163: propt(op); ! 164: tab(24); ! 165: propt(&op[incr]); ! 166: if (&op[2*incr] < &options[NOPTS]) { ! 167: tab(56); ! 168: propt(&op[2 * incr]); ! 169: } ! 170: putNFL(); ! 171: } ! 172: } ! 173: ! 174: propts() ! 175: { ! 176: register struct option *op; ! 177: ! 178: for (op = options; op < &options[NOPTS]; op++) { ! 179: #ifdef V6 ! 180: if (op == &options[TERM]) ! 181: #else ! 182: if (op == &options[TTYTYPE]) ! 183: #endif ! 184: continue; ! 185: switch (op->otype) { ! 186: ! 187: case ONOFF: ! 188: case NUMERIC: ! 189: if (op->ovalue == op->odefault) ! 190: continue; ! 191: break; ! 192: ! 193: case STRING: ! 194: if (op->odefault == 0) ! 195: continue; ! 196: break; ! 197: } ! 198: propt(op); ! 199: putchar(' '); ! 200: } ! 201: noonl(); ! 202: flush(); ! 203: } ! 204: ! 205: propt(op) ! 206: register struct option *op; ! 207: { ! 208: register char *name; ! 209: ! 210: name = op->oname; ! 211: ! 212: switch (op->otype) { ! 213: ! 214: case ONOFF: ! 215: printf("%s%s", op->ovalue ? "" : "no", name); ! 216: break; ! 217: ! 218: case NUMERIC: ! 219: printf("%s=%d", name, op->ovalue); ! 220: break; ! 221: ! 222: case STRING: ! 223: case OTERM: ! 224: printf("%s=%s", name, op->osvalue); ! 225: break; ! 226: } ! 227: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.