aliases and editing (and -v, sort of)
[unix-history] / usr / src / bin / sh / histedit.c
CommitLineData
dc06984c
MT
1/*
2 * Editline and history functions (and glue).
3 */
4#include <stdio.h>
5#include "parser.h"
6#include "options.h"
7#include "error.h"
8
9#include "histedit.h"
10
11History *hist; /* history cookie */
12EditLine *el; /* editline cookie */
13static FILE *el_in, *el_out;
14
15extern int is_interactive;
16
17/*
18 * Set history and editing status. Called whenever the status may
19 * have changed (figures out what to do).
20 */
21histedit() {
22
23 if (is_interactive) {
24 if (!hist) {
25 /*
26 * turn history on
27 */
28 INTOFF;
29 hist = history_init();
30 INTON;
31
32 if (hist != NULL)
33 sethistsize();
34 else
35 out2str("sh: can't initialize history\n");
36 }
37 if (Eflag && !el && isatty(0)) { /* && isatty(2) ??? */
38 /*
39 * turn editing on
40 */
41 INTOFF;
42 if (el_in == NULL)
43 el_in = fdopen(0, "r");
44 if (el_out == NULL)
45 el_out = fdopen(2, "w");
46 if (el_in == NULL || el_out == NULL)
47 goto bad;
48 el = el_init(arg0, el_in, el_out);
49 if (el != NULL) {
50 if (hist)
51 el_set(el, EL_HIST, history_set, hist);
52 el_set(el, EL_PROMPT, getprompt);
53 } else {
54bad:
55 out2str("sh: can't initialize editing\n");
56 }
57 INTON;
58 if (el) /* XXX - -o vi etc... */
59 el_set(el, EL_EDITOR, "vi");
60 } else if (!Eflag && el) {
61 INTOFF;
62 el_end(el);
63 el = NULL;
64 INTON;
65 }
66 } else {
67 INTOFF;
68 if (el) { /* no editing if not interactive */
69 el_end(el);
70 el = NULL;
71 }
72 if (hist) {
73 history_end(hist);
74 hist = NULL;
75 }
76 INTON;
77 }
78}
79
80sethistsize() {
81 char *cp;
82 int histsize;
83
84 if (hist != NULL) {
85 cp = lookupvar("HISTSIZE");
86 if (cp == NULL || *cp == '\0' ||
87 (histsize = atoi(cp)) < 0)
88 histsize = 100;
89 history_set(hist, H_EVENT, histsize);
90 }
91}