Start development on BSD 2
[unix-history] / .ref-BSD-1 / ex-1.1 / ex_set.c
CommitLineData
d43bb1bf
BJ
1#include "ex.h"
2/*
3 * Ex - a text editor
4 * Bill Joy UCB September 1977
5 */
6
7char shellname[30] "/bin/sh";
8char direct[30] "/tmp";
9char ttytype[30] "unknown";
10
11char NONAME[] "@";
12
13#define ONOFF 0
14#define NUMERIC 1
15#define STRING 2
16#define TERM 3
17
18char NOTify[] "notify";
19
20struct varbl varbls[] {
21 "autoindent", "ai", ONOFF, 0, 0,
22 "autoprint", "ap", ONOFF, 1, 1,
23 "beautify", NONAME, ONOFF, 0, 0,
24 "directory", "dir", STRING, 0, direct,
25 "editany", "ea", ONOFF, 0, 0,
26 "edited", NONAME, ONOFF, 1, 0,
27 "errorbells", "eb", ONOFF, 1, 1,
28 "fork", NONAME, ONOFF, 1, 1,
29 "home", NONAME, STRING, 0, home,
30 "hush", NONAME, ONOFF, 0, 0,
31 "ignorecase", "ic", ONOFF, 0, 0,
32 "indicateul", "iu", ONOFF, 0, 0,
33 "list", NONAME, ONOFF, 0, 0,
34 "magic", NONAME, ONOFF, 1, 1,
35 "mode", NONAME, NUMERIC, 0644, 0644,
36 NOTify, NONAME, NUMERIC, 5, 5,
37 "number", NONAME, ONOFF, 0, 0,
38 "open", NONAME, ONOFF, 1, 1,
39 "optimize", NONAME, ONOFF, 1, 1,
40 "printall", "pa", ONOFF, 0, 0,
41 "prompt", NONAME, ONOFF, 1, 1,
42 "scroll", NONAME, NUMERIC, 12, 12,
43 "shell", "sh", STRING, 0, shellname,
44 "shiftwidth", "sw", NUMERIC, 8, 8,
45 "sticky", NONAME, ONOFF, 0, 0,
46 "ttytype", "tty", TERM, 0, ttytype,
47 "terse", NONAME, ONOFF, 0, 0,
48 "visualmessage","vm", ONOFF, 0, 0,
49 "window", NONAME, NUMERIC, 23, 23,
50 "wrap", NONAME, ONOFF, 1, 1,
51 0
52};
53
54#define ONMSZ 30
55
56set(c)
57 register c;
58{
59 register char *op;
60 register struct varbl *vp;
61 char no, optname[ONMSZ];
62 int column, base;
63 extern char uxb[];
64
65 setnoaddr();
66 if (endcmd(peekchar())) {
67 getchar();
68 propts(0);
69 return;
70 }
71 if (c == 0)
72 error("Blank required@before options in set");
73 do {
74 switch (c = getchar()) {
75 case '!':
76 op = uxb;
77 if (!*op)
78 error("No previous command");
79 goto pfile;
80 case '`':
81 op = altfile;
82 if (!*op)
83 error("No alternate filename");
84 goto pfile;
85 case '%':
86 op = savedfile;
87 if (!*op)
88 error("No current filename");
89pfile:
90 if (!setend())
91 error("Can't assign@to %c with set", c);
92 lprintf("%c=%s\n", c, op);
93 goto next;
94 }
95 if (!letter(c))
96 error("Unexpected %c|Expected option name, found %c", c);
97 op = optname;
98 do {
99 if (op >= &optname[ONMSZ])
100 error("No such option|Ridiculously long option name");
101 *op++ = letter(c);
102 c = getchar();
103 } while (letter(c));
104 ungetchar(c);
105 *op = 0;
106 no = 0;
107 op = optname;
108 if (eq("all", op)) {
109 propts(1);
110 goto next;
111 }
112 if (!eq(op, NOTify) && op[0] == 'n' && op[1] == 'o') {
113 op =+ 2;
114 no++;
115 }
116 for (vp = varbls; vp->vname[0]; vp++)
117 if (eq(vp->vname[0], op) || eq(vp->vname[1], op))
118 break;
119 if (vp->vname[0] == 0)
120 error("%s: No such option@- 'set all' gives all option values", op);
121 c = skipwh();
122 if (peekchar() == '?') {
123 getchar();
124printone:
125 propt(vp);
126 goto next;
127 }
128 if (no && vp->vtype != ONOFF)
129 error("Option %s is not a toggle", vp->vname[0]);
130 switch (vp->vtype) {
131 case ONOFF:
132 vp->vvalue = 1 - no;
133 break;
134 case NUMERIC:
135 if (c != 0 || setend())
136 goto printone;
137 if (getchar() != '=')
138 error("= expected@before number for numeric option %s", vp->vname[0]);
139 if (!digit(peekchar()))
140 error("Digits required@after = when assigning numeric option");
141 c = 0;
142 base = 10;
143 if (peekchar() == '0' || vp == &varbls[MODE])
144 base = 8;
145 do
146 c = c * base + getchar() - '0';
147 while (digit(peekchar()));
148 vp->vvalue = c;
149 break;
150 case STRING:
151 case TERM:
152 if (c != 0 || setend())
153 goto printone;
154 if (getchar() != '=')
155 error("Missing =@in assignment to option %s", vp->vname[0]);
156 op = optname;
157 while (!setend()) {
158 if (op >= &optname[ONMSZ])
159 error("String too long@in option assignment");
160 *op++ = getchar();
161 }
162 *op = 0;
163 if (vp->vtype == TERM)
164 setterm(optname);
165 else {
166 strcpy(vp->vvalue, optname);
167 vp->vdefault = 1;
168 }
169 break;
170 }
171next:
172 flush();
173 skipwh();
174 } while (!endcmd(peekchar()));
175 eol();
176}
177
178setend()
179{
180
181 return (white(peekchar()) || endcmd(peekchar()));
182}
183
184propts(all)
185 char all;
186{
187 register struct varbl *vp;
188
189 for (vp = varbls; vp->vname[0] != NIL; vp++) {
190 if (!all) switch (vp->vtype) {
191 case ONOFF:
192 case NUMERIC:
193 if (vp->vvalue == vp->vdefault)
194 continue;
195 break;
196 case STRING:
197 if (vp->vdefault == 0)
198 continue;
199 break;
200/*
201 case TERM:
202 break;
203*/
204 }
205 propt(vp);
206 }
207}
208
209propt(vp)
210 register struct varbl *vp;
211{
212
213 switch (vp->vtype) {
214 case ONOFF:
215 printf("%s%s\n", vp->vvalue ? "" : "no", vp->vname[0]);
216 break;
217 case NUMERIC:
218 if (vp == &varbls[MODE]) {
219 printf("mode=");
220 pro(value(MODE));
221 putnl();
222 } else
223 printf("%s=%d\n", vp->vname[0], vp->vvalue);
224 break;
225 case STRING:
226 case TERM:
227 printf("%s=%s\n", vp->vname[0], vp->vvalue);
228 break;
229 }
230 flush();
231}
232
233pro(i)
234 register int i;
235{
236
237 if (i != 0)
238 pro((i >> 3) & 017777);
239 putchar((i & 7) | '0');
240}
241
242REset()
243{
244 register struct varbl *vp;
245
246 for (vp = varbls; vp->vname[0]; vp++)
247 if (vp->vtype == NUMERIC || vp->vtype == ONOFF)
248 vp->vvalue = vp->vdefault;
249}