Annotation of OpenXM_contrib2/fep/fep_set.c, Revision 1.2
1.1 noro 1: /* Copyright (c) 1987, 1988 by Software Research Associates, Inc. */
2:
3: #ifndef lint
4: static char rcsid[]=
5: "$Header: fep_set.c,v 4.3 91/05/29 14:31:08 utashiro Exp $ (SRA)";
6: #endif /* lint */
7:
8: #include <stdio.h>
1.2 ! ohara 9: #include <stdlib.h>
1.1 noro 10: #include "fep_defs.h"
11: #include "fep_glob.h"
12:
13: VAR default_set_vars [] = {
14: {"expand-tilde", "",
15: "Expand ~ to home directory name", (VAR*)0},
16: {"ignore-empty-line", "",
17: "Don't put empty line to history", (VAR*)0},
18: {"ignore-same-line", "",
19: "Don't put same line to history", (VAR*)0},
20: {"editmode", "emacs",
21: "Fep command line edit mode", (VAR*)0},
22: {"history-file", ".fephistory",
23: "Name of history file", (VAR*)0},
24: {"shell", "/bin/sh",
25: "Shell name used by invoke-shell", (VAR*)0},
26: {"auto-tty-fix", "",
27: "Fix tty mode automatically", (VAR*)0},
28: {"script-file", "fepscript",
29: "Script file name", (VAR*)0},
30: {"crt", "24",
31: "Terminal lines", (VAR*)0},
32: {"showhist", "24",
33: "History length used by show-history", (VAR*)0},
34: {"delimiters", " \t",
35: "Argument delemiter characters", (VAR*)0},
36: {"buffer", "5120",
37: "Output buffer size", (VAR*)0},
38: {NULL, NULL,
39: NULL, (VAR*)0}
40: };
41:
42: VAR default_unset_vars [] = {
43: /* below from here is unset by default */
44: {"alarm-on-eof", "",
45: "Alarm once to eof character", (VAR*)0},
46: {"ignore-eof", "",
47: "Never treat eof character as eof", (VAR*)0},
48: {"savehist", "",
49: "Length of save history", (VAR*)0},
50: {"verbose", "",
51: NULL, (VAR*)0},
52: {"search-string", "",
53: NULL, (VAR*)0},
54: {"noalias", "",
55: "Not use alias", (VAR*)0},
56: {"tty-fix-bell", "",
57: "Ring bell when tty mode changed", (VAR*)0},
58: {"auto-repaint", "",
59: "Repaint screen when restarting", (VAR*)0},
60: {"clear-repaint", "",
61: "Clear screen before repaint", (VAR*)0},
62: {"ignore-short-line", "3",
63: "Don't put short line to history", (VAR*)0},
64: {NULL, NULL,
65: NULL, (VAR*)0}
66: };
67:
68: #ifdef HASH
69: #define HASHNUM 10
70: VAR *var_htab[HASHNUM];
71: #else /* HASH */
72: VAR var_top = {"top", "top", (char *)0, (VAR *)0};
73: VAR *var_list = &var_top;
74: #endif /* HASH */
75:
76: /*
77: * Functions
78: */
79: int set_var (/* char *name, char *value */);
80: char *look_var (/* char *name */);
81: int lookd_var (/* char *name */);
82: VAR *getvp (/* char *name */);
83:
84: extern char *allocAndCopyThere();
85: extern char *prompt;
86:
87: /*
88: * Set default variables
89: */
90: set_default_vars ()
91: {
92: register VAR *vp;
93:
94: for (vp = default_set_vars; vp->v_name; vp++)
95: set_only_var (vp->v_name, vp->v_value);
96: }
97:
98: /*
99: * Set variable
100: */
101: set_var (name, value)
102: char *name;
103: char *value;
104: {
105: /*
106: * Process special variable
107: */
108: if (eq (name, "history")) {
109: if (!changeHistorySize (atoi (value)))
110: return (0);
111: }
112: else if (eq (name, "prompt")) {
113: free (prompt);
114: prompt = allocAndCopyThere (value);
115: }
116: else if (eq (name, "editmode")) {
117: if (eq (value, "emacs")) {
118: editmode = EMACS;
119: initEmacsBindings (curFuncTab, altFuncTab);
120: }
121: else if (eq (value, "vi")) {
122: editmode = VI;
123: initViBindings (curFuncTab, altFuncTab);
124: }
125: else
126: printf ("%s: Unknown editmode\n", value);
127: }
128: else if (eq (name, "auto-tty-fix"))
129: auto_tty_fix = ON;
130: else if (eq (name, "debug"))
131: debug = ON;
132: else if (eq (name, "tty-fix-bell"))
133: tty_fix_bell = ON;
134: else if (eq (name, "delimiters")) {
135: /* only in this case, variable points allocated area */
136: set_only_var (name, value);
137: delimiters = look_var ("delimiters");
138: }
139: else if (eq (name, "crt"))
140: lines = atoi (value);
141: else if (eq(name, "buffer")) {
142: int s;
143:
144: if ((s = atoi(value)) <= 0)
145: return;
146:
147: if (!set_buffer (output_buffer, s))
148: return;
149: }
150:
151: set_only_var (name, value);
152: }
153:
154: set_only_var (name, value)
155: char *name, *value;
156: {
157: VAR *vp;
158:
159: vp = getvp (name, 1, 0);
160:
161: if (vp->v_value == value)
162: return;
163:
164: if (vp->v_value)
165: free (vp->v_value);
166:
167: vp->v_value = allocAndCopyThere (value);
168: }
169:
170: /*
171: * Unset variable
172: */
173: unset_var (name)
174: char *name;
175: {
176: VAR *vp, *prev;
177:
178: vp = getvp (name, 0, &prev);
179:
180: if (!vp)
181: return;
182:
183: prev->v_next = vp->v_next;
184: free (vp->v_name);
185: free (vp->v_value);
186: free (vp);
187:
188: if (eq (name, "auto-tty-fix"))
189: auto_tty_fix = OFF;
190:
191: if (eq (name, "debug"))
192: debug = OFF;
193:
194: if (eq (name, "tty-fix-bell"))
195: tty_fix_bell = OFF;
196:
197: if (eq (name, "delimiters"))
198: delimiters = DEFAULT_DELIMITERS;
199: return;
200: }
201:
202: /*
203: * Look up variable
204: */
205: char *
206: look_var (name)
207: char *name;
208: {
209:
210: VAR *vp;
211:
212: vp = getvp (name, 0, 0);
213:
214: if (vp && vp->v_value)
215: return (vp->v_value);
216: else
217: return ((char *)0);
218: }
219:
220: /*
221: * Look up variable and get integer result
222: */
223: int
224: lookd_var (name)
225: char *name;
226: {
227: VAR *vp;
228:
229: vp = getvp (name, 0, 0);
230:
231: if (vp && vp->v_value)
232: return (atoi (vp->v_value));
233: else
234: return (0);
235: }
236:
237: /*
238: * Show variable list
239: */
240: show_varlist ()
241: {
242: #ifdef HASH
243: register int i;
244:
245: for (i = 0; i< HASHNUM; i++) {
246: register VAR *vp;
247:
248: vp = var_htab[i];
249: if (vp == (VAR *)0)
250: continue;
251:
252: for (; vp != (VAR *)0; vp = vp->v_next)
253: printf ("%-16s %s\n", vp->v_name, vp->v_value);
254: }
255: #else /* HASH */
256: register VAR *vp;
257:
258: for (vp = var_list->v_next; vp; vp = vp->v_next)
259: printf ("%-16s %s\n", vp->v_name, vp->v_value);
260: #endif /* HASH */
261: }
262:
263: #ifdef HASH
264: /*
265: * Get hash index from variable name
266: */
267: static getindex (s)
268: register char *s;
269: {
270: register int sum = 0;
271:
272: while (*s)
273: sum += *s++;
274:
275: return (sum % HASHNUM);
276: }
277: #endif /* HASH */
278:
279: /*
280: * Get pointer to VAR.
281: * If there is no memoly associated to the variable and alloc argument is 1,
282: * allocate the area and initialize name field.
283: */
284: VAR *
285: getvp (name, alloc, lastvp)
286: char *name;
287: int alloc;
288: VAR **lastvp;
289: {
290: #ifdef HASH
291: register i = getindex (name);
292: #endif /* HASH */
293: VAR *vp, *last = (VAR *)0;
294:
295: #ifdef HASH
296: for (vp = var_htab[i]; vp; last = vp, vp->v_next) {
297: if (strcmp (name, vp->v_value) == 0)
298: return (vp);
299: }
300: #else /* HASH */
301: for (vp = var_list->v_next, last = var_list; vp; last = vp, vp = vp->v_next) {
302: int r;
303:
304: r = strcmp (name, vp->v_name);
305: if (r == 0) {
306: if (lastvp)
307: *lastvp = last;
308: return (vp);
309: }
310: else if (r < 0)
311: break;
312: }
313: #endif /* HASH */
314:
315: if (alloc == 0)
316: return (0);
317:
318: vp = (VAR *) calloc (sizeof (VAR), 1);
319: vp->v_value = (char *)0;
320: vp->v_next = (VAR *) 0;
321: vp->v_name = allocAndCopyThere (name);
322:
323: #ifdef HASH
324: if (last) {
325: vp->v_next = last->v_next;
326: last->v_next = vp;
327: }
328: else {
329: var_htab[i] = vp;
330: }
331: #else /* HASH */
332: vp->v_next = last->v_next;
333: last->v_next = vp;
334: #endif /* HASH */
335: return (vp);
336: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>