36 #if !defined(lint) && !defined(SCCSID)
38 static char sccsid[] =
"@(#)el.c 8.2 (Berkeley) 1/3/94";
46 #include <sys/types.h>
47 #include <sys/param.h>
60 el_init(
const char *prog, FILE *fin, FILE *fout, FILE *ferr)
62 EditLine *el = el_malloc(
sizeof(*el));
70 el->el_outfile = fout;
71 el->el_errfile = ferr;
73 el->el_infd = fileno(fin);
74 el->el_outfd = fileno(fout);
75 el->el_errfd = fileno(ferr);
77 el->el_prog = Strdup(ct_decode_string(prog, &el->el_scratch));
78 if (el->el_prog == NULL) {
88 setlocale(LC_CTYPE, NULL);
90 el->el_flags |= CHARSET_IS_MULTIBYTE;
93 if (terminal_init(el) == -1) {
98 (void) keymacro_init(el);
100 if (tty_init(el) == -1)
101 el->el_flags |= NO_TTY;
103 (void) search_init(el);
104 (void) hist_init(el);
105 (void) prompt_init(el);
107 (void) read_init(el);
135 el_free(el->el_prog);
137 el_free(el->el_scratch.cbuff);
138 el_free(el->el_scratch.wbuff);
139 el_free(el->el_lgcyconv.cbuff);
140 el_free(el->el_lgcyconv.wbuff);
162 FUN(el,
set)(
EditLine *el,
int op, ...)
174 el_pfunc_t p = va_arg(ap, el_pfunc_t);
176 rv = prompt_set(el, p, 0, op, 1);
181 el_zfunc_t p = va_arg(ap, el_zfunc_t);
182 void *arg = va_arg(ap,
void *);
183 rv = ch_resizefun(el, p, arg);
188 case EL_RPROMPT_ESC: {
189 el_pfunc_t p = va_arg(ap, el_pfunc_t);
190 int c = va_arg(ap,
int);
192 rv = prompt_set(el, p, c, op, 1);
197 rv = terminal_set(el, va_arg(ap,
char *));
201 rv = map_set_editor(el, va_arg(ap, Char *));
206 el->el_flags |= HANDLE_SIGNALS;
208 el->el_flags &= ~HANDLE_SIGNALS;
217 const Char *argv[20];
220 for (i = 1; i < 20; i++)
221 if ((argv[i] = va_arg(ap, Char *)) == NULL)
226 argv[0] = STR(
"bind");
227 rv = map_bind(el, i, argv);
231 argv[0] = STR(
"telltc");
232 rv = terminal_telltc(el, i, argv);
236 argv[0] = STR(
"settc");
237 rv = terminal_settc(el, i, argv);
241 argv[0] = STR(
"echotc");
242 rv = terminal_echotc(el, i, argv);
246 argv[0] = STR(
"setty");
247 rv = tty_stty(el, i, argv);
252 EL_ABORT((el->el_errfile,
"Bad op %d\n", op));
260 Char *
name = va_arg(ap, Char *);
261 Char *help = va_arg(ap, Char *);
262 el_func_t func = va_arg(ap, el_func_t);
264 rv = map_addfunc(el, name, help, func);
270 hist_fun_t func = va_arg(ap, hist_fun_t);
271 void *ptr = va_arg(ap,
void *);
273 rv = hist_set(el, func, ptr);
274 if (!(el->el_flags & CHARSET_IS_MULTIBYTE))
275 el->el_flags &= ~NARROW_HISTORY;
281 el->el_flags &= ~EDIT_DISABLED;
283 el->el_flags |= EDIT_DISABLED;
289 el_rfunc_t rc = va_arg(ap, el_rfunc_t);
290 rv = el_read_setfn(el, rc);
291 el->el_flags &= ~NARROW_READ;
296 el->el_data = va_arg(ap,
void *);
300 rv = va_arg(ap,
int);
301 if (rv && !(el->el_flags & UNBUFFERED)) {
302 el->el_flags |= UNBUFFERED;
304 }
else if (!rv && (el->el_flags & UNBUFFERED)) {
305 el->el_flags &= ~UNBUFFERED;
312 rv = va_arg(ap,
int);
314 (void) tty_rawmode(el);
316 (
void) tty_cookedmode(el);
325 what = va_arg(ap,
int);
326 fp = va_arg(ap, FILE *);
332 el->el_infd = fileno(fp);
336 el->el_outfd = fileno(fp);
340 el->el_errfd = fileno(fp);
350 re_clear_display(el);
369 FUN(el,
get)(
EditLine *el,
int op, ...)
382 el_pfunc_t *p = va_arg(ap, el_pfunc_t *);
383 rv = prompt_get(el, p, 0, op);
387 case EL_RPROMPT_ESC: {
388 el_pfunc_t *p = va_arg(ap, el_pfunc_t *);
389 Char *c = va_arg(ap, Char *);
391 rv = prompt_get(el, p, c, op);
396 rv = map_get_editor(el, va_arg(ap,
const Char **));
400 *va_arg(ap,
int *) = (el->el_flags & HANDLE_SIGNALS);
405 *va_arg(ap,
int *) = !(el->el_flags & EDIT_DISABLED);
410 terminal_get(el, va_arg(ap,
const char **));
416 static char name[] =
"gettc";
420 for (i = 1; i < (int)(
sizeof(argv) /
sizeof(argv[0])); i++)
421 if ((argv[i] = va_arg(ap,
char *)) == NULL)
427 rv = terminal_gettc(el, i, argv);
432 EL_ABORT((el->el_errfile,
"Bad op %d\n", op));
439 *va_arg(ap, el_rfunc_t *) = el_read_getfn(el);
444 *va_arg(ap,
void **) = el->el_data;
449 *va_arg(ap,
int *) = (!(el->el_flags & UNBUFFERED));
458 what = va_arg(ap,
int);
459 fpp = va_arg(ap, FILE **);
463 *fpp = el->el_infile;
466 *fpp = el->el_outfile;
469 *fpp = el->el_errfile;
494 return (
const TYPE(
LineInfo) *)(
void *)&el->el_line;
502 el_source(
EditLine *el,
const char *fname)
514 #if defined(HAVE_GETUID) && defined(HAVE_GETEUID) && \
515 defined(HAVE_GETGID) && defined(HAVE_GETEGID)
516 #define HAVE_IDENTITY_FUNCS 1
519 #if (defined(HAVE_ISSETUGID) || defined(HAVE_IDENTITY_FUNCS))
520 static const char elpath[] =
"/.editrc";
521 size_t plen =
sizeof(elpath);
523 #ifdef HAVE_ISSETUGID
526 #elif defined(HAVE_IDENTITY_FUNCS)
527 if (getuid() != geteuid() || getgid() != getegid())
530 if ((ptr = getenv(
"HOME")) == NULL)
533 if ((path = el_malloc(plen *
sizeof(*path))) == NULL)
535 (void)snprintf(path, plen,
"%s%s", ptr, elpath);
548 fp = fopen(fname,
"r");
554 while ((ptr = fgetln(fp, &len)) != NULL) {
557 dptr = ct_decode_string(ptr, &el->el_scratch);
560 if (len > 0 && dptr[len - 1] ==
'\n')
564 while (*dptr !=
'\0' && Isspace(*dptr))
568 if ((error = parse_line(el, dptr)) == -1)
587 (void) sigemptyset(&nset);
588 (void) sigaddset(&nset, SIGWINCH);
589 (void) sigprocmask(SIG_BLOCK, &nset, &oset);
592 if (terminal_get_size(el, &lins, &cols))
593 terminal_change_size(el, lins, cols);
595 (void) sigprocmask(SIG_SETMASK, &oset, NULL);
615 el_editmode(
EditLine *el,
int argc,
const Char **argv)
619 if (argv == NULL || argc != 2 || argv[1] == NULL)
623 if (Strcmp(how, STR(
"on")) == 0) {
624 el->el_flags &= ~EDIT_DISABLED;
626 }
else if (Strcmp(how, STR(
"off")) == 0) {
628 el->el_flags |= EDIT_DISABLED;
631 (void) fprintf(el->el_errfile,
"edit: Bad value `" FSTR
"'.\n",