BSD 2 development
[unix-history] / src / ex / ex_set.c
CommitLineData
851aa263
BJ
1/* Copyright (c) 1979 Regents of the University of California */
2#include "ex.h"
3#include "ex_temp.h"
4
5/*
6 * Set command.
7 */
8char optname[ONMSZ];
9
10set()
11{
12 register char *cp;
13 register struct option *op;
14 register int c;
15 bool no;
16
17 setnoaddr();
18 if (skipend()) {
19 if (peekchar() != EOF)
20 ignchar();
21 propts();
22 return;
23 }
24 do {
25 cp = optname;
26 do {
27 if (cp < &optname[ONMSZ - 2])
28 *cp++ = getchar();
29 } while (isalpha(peekchar()));
30 *cp = 0;
31 cp = optname;
32 if (eq("all", cp)) {
33 if (inopen)
34 pofix();
35 prall();
36 goto next;
37 }
38 no = 0;
39 if (cp[0] == 'n' && cp[1] == 'o') {
40 cp += 2;
41 no++;
42 }
43 for (op = options; op < &options[NOPTS]; op++)
44 if (eq(op->oname, cp) || op->oabbrev && eq(op->oabbrev, cp))
45 break;
46 if (op->oname == 0)
47 serror("%s: No such option@- 'set all' gives all option values", cp);
48 c = skipwh();
49 if (peekchar() == '?') {
50 ignchar();
51printone:
52 propt(op);
53 noonl();
54 goto next;
55 }
56 if (op->otype == ONOFF) {
57 op->ovalue = 1 - no;
58 goto next;
59 }
60 if (no)
61 serror("Option %s is not a toggle", op->oname);
62 if (c != 0 || setend())
63 goto printone;
64 if (getchar() != '=')
65 serror("Missing =@in assignment to option %s", op->oname);
66 switch (op->otype) {
67
68 case NUMERIC:
69 if (!isdigit(peekchar()))
70 error("Digits required@after = when assigning numeric option");
71 op->ovalue = getnum();
72 if (value(TABSTOP) <= 0)
73 value(TABSTOP) = TABS;
74 break;
75
76 case STRING:
77 case OTERM:
78 cp = optname;
79 while (!setend()) {
80 if (cp >= &optname[ONMSZ])
81 error("String too long@in option assignment");
82 *cp++ = getchar();
83 }
84 *cp = 0;
85 if (op->otype == OTERM) {
86 if (inopen)
87 error("Can't change type of terminal from within open/visual");
88 setterm(optname);
89 } else {
90 CP(op->osvalue, optname);
91 op->odefault = 1;
92 }
93 break;
94 }
95next:
96 flush();
97 } while (!skipend());
98 eol();
99}
100
101setend()
102{
103
104 return (iswhite(peekchar()) || endcmd(peekchar()));
105}
106
107prall()
108{
109 register int incr = (NOPTS + 2) / 3;
110 register int rows = incr;
111 register struct option *op = options;
112
113 for (; rows; rows--, op++) {
114 propt(op);
115 tab(24);
116 propt(&op[incr]);
117 if (&op[2*incr] < &options[NOPTS]) {
118 tab(48);
119 propt(&op[2 * incr]);
120 }
121 putNFL();
122 }
123}
124
125propts()
126{
127 register struct option *op;
128
129 for (op = options; op < &options[NOPTS]; op++) {
130#ifdef V6
131 if (op == &options[TERM])
132#else
133 if (op == &options[TTYTYPE])
134#endif
135 continue;
136 switch (op->otype) {
137
138 case ONOFF:
139 case NUMERIC:
140 if (op->ovalue == op->odefault)
141 continue;
142 break;
143
144 case STRING:
145 if (op->odefault == 0)
146 continue;
147 break;
148 }
149 propt(op);
150 putchar(' ');
151 }
152 noonl();
153 flush();
154}
155
156propt(op)
157 register struct option *op;
158{
159 register char *name;
160
161 name = op->oname;
162
163 switch (op->otype) {
164
165 case ONOFF:
166 printf("%s%s", op->ovalue ? "" : "no", name);
167 break;
168
169 case NUMERIC:
170 printf("%s=%d", name, op->ovalue);
171 break;
172
173 case STRING:
174 case OTERM:
175 printf("%s=%s", name, op->osvalue);
176 break;
177 }
178}