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