1: /* Copyright (c) 1981 Regents of the University of California */
   2: static char *sccsid = "@(#)ex_set.c	7.1	7/8/81";
   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 (op == &options[WINDOW]) {
  98:                 if (value(WINDOW) >= LINES)
  99:                     value(WINDOW) = LINES-1;
 100:                 vsetsiz(value(WINDOW));
 101:             }
 102:             break;
 103: 
 104:         case STRING:
 105:         case OTERM:
 106:             cp = optname;
 107:             while (!setend()) {
 108:                 if (cp >= &optname[ONMSZ])
 109:                     error("String too long@in option assignment");
 110:                 /* adb change:  allow whitepace in strings */
 111:                 if( (*cp = getchar()) == '\\')
 112:                     if( peekchar() != EOF)
 113:                         *cp = getchar();
 114:                 cp++;
 115:             }
 116:             *cp = 0;
 117:             if (op->otype == OTERM) {
 118: /*
 119:  * At first glance it seems like we shouldn't care if the terminal type
 120:  * is changed inside visual mode, as long as we assume the screen is
 121:  * a mess and redraw it. However, it's a much harder problem than that.
 122:  * If you happen to change from 1 crt to another that both have the same
 123:  * size screen, it's OK. But if the screen size if different, the stuff
 124:  * that gets initialized in vop() will be wrong. This could be overcome
 125:  * by redoing the initialization, e.g. making the first 90% of vop into
 126:  * a subroutine. However, the most useful case is where you forgot to do
 127:  * a setenv before you went into the editor and it thinks you're on a dumb
 128:  * terminal. Ex treats this like hardcopy and goes into HARDOPEN mode.
 129:  * This loses because the first part of vop calls oop in this case.
 130:  * The problem is so hard I gave up. I'm not saying it can't be done,
 131:  * but I am saying it probably isn't worth the effort.
 132:  */
 133:                 if (inopen)
 134: error("Can't change type of terminal from within open/visual");
 135:                 setterm(optname);
 136:             } else {
 137:                 CP(op->osvalue, optname);
 138:                 op->odefault = 1;
 139:             }
 140:             break;
 141:         }
 142: next:
 143:         flush();
 144:     } while (!skipend());
 145:     eol();
 146: }
 147: 
 148: setend()
 149: {
 150: 
 151:     return (iswhite(peekchar()) || endcmd(peekchar()));
 152: }
 153: 
 154: prall()
 155: {
 156:     register int incr = (NOPTS + 2) / 3;
 157:     register int rows = incr;
 158:     register struct option *op = options;
 159: 
 160:     for (; rows; rows--, op++) {
 161:         propt(op);
 162:         tab(24);
 163:         propt(&op[incr]);
 164:         if (&op[2*incr] < &options[NOPTS]) {
 165:             tab(56);
 166:             propt(&op[2 * incr]);
 167:         }
 168:         putNFL();
 169:     }
 170: }
 171: 
 172: propts()
 173: {
 174:     register struct option *op;
 175: 
 176:     for (op = options; op < &options[NOPTS]; op++) {
 177: #ifdef V6
 178:         if (op == &options[TERM])
 179: #else
 180:         if (op == &options[TTYTYPE])
 181: #endif
 182:             continue;
 183:         switch (op->otype) {
 184: 
 185:         case ONOFF:
 186:         case NUMERIC:
 187:             if (op->ovalue == op->odefault)
 188:                 continue;
 189:             break;
 190: 
 191:         case STRING:
 192:             if (op->odefault == 0)
 193:                 continue;
 194:             break;
 195:         }
 196:         propt(op);
 197:         putchar(' ');
 198:     }
 199:     noonl();
 200:     flush();
 201: }
 202: 
 203: propt(op)
 204:     register struct option *op;
 205: {
 206:     register char *name;
 207: 
 208:     name = op->oname;
 209: 
 210:     switch (op->otype) {
 211: 
 212:     case ONOFF:
 213:         printf("%s%s", op->ovalue ? "" : "no", name);
 214:         break;
 215: 
 216:     case NUMERIC:
 217:         printf("%s=%d", name, op->ovalue);
 218:         break;
 219: 
 220:     case STRING:
 221:     case OTERM:
 222:         printf("%s=%s", name, op->osvalue);
 223:         break;
 224:     }
 225: }

Defined functions

prall defined in line 154; used 1 times
  • in line 38
propt defined in line 203; used 5 times
propts defined in line 172; used 1 times
  • in line 24
set defined in line 12; used 1 times
setend defined in line 148; used 2 times

Defined variables

optname defined in line 10; used 7 times
sccsid defined in line 2; never used
Last modified: 1981-07-09
Generated: 2016-12-26
Generated by src2html V0.67
page hit count: 1178
Valid CSS Valid XHTML 1.0 Strict