1
/* $NetBSD: el.c,v 1.47 2009/01/18 12:17:24 lukem Exp $ */
1
/* $NetBSD: el.c,v 1.68 2011/07/29 15:16:33 christos Exp $ */
4
4
* Copyright (c) 1992, 1993
57
60
el_init(const char *prog, FILE *fin, FILE *fout, FILE *ferr)
60
EditLine *el = (EditLine *) el_malloc(sizeof(EditLine));
62
EditLine *el = el_malloc(sizeof(*el));
65
67
memset(el, 0, sizeof(EditLine));
69
71
el->el_errfile = ferr;
71
73
el->el_infd = fileno(fin);
74
el->el_outfd = fileno(fout);
75
el->el_errfd = fileno(ferr);
73
if ((el->el_prog = el_strdup(prog)) == NULL) {
77
el->el_prog = Strdup(ct_decode_string(prog, &el->el_scratch));
78
if (el->el_prog == NULL) {
79
84
* Initialize all the modules. Order is important!!!
88
setlocale(LC_CTYPE, NULL);
90
el->el_flags |= CHARSET_IS_MULTIBYTE;
83
if (term_init(el) == -1) {
93
if (terminal_init(el) == -1) {
84
94
el_free(el->el_prog);
98
(void) keymacro_init(el);
89
99
(void) map_init(el);
90
100
if (tty_init(el) == -1)
91
101
el->el_flags |= NO_TTY;
125
el_free((ptr_t) el->el_prog);
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);
143
159
* set the editline parameters
146
el_set(EditLine *el, int op, ...)
162
FUN(el,set)(EditLine *el, int op, ...)
153
169
va_start(ap, op);
158
rv = prompt_set(el, va_arg(ap, el_pfunc_t), 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);
161
196
case EL_TERMINAL:
162
rv = term_set(el, va_arg(ap, char *));
197
rv = terminal_set(el, va_arg(ap, char *));
166
rv = map_set_editor(el, va_arg(ap, char *));
201
rv = map_set_editor(el, va_arg(ap, Char *));
183
const char *argv[20];
217
const Char *argv[20];
186
220
for (i = 1; i < 20; i++)
187
if ((argv[i] = va_arg(ap, char *)) == NULL)
221
if ((argv[i] = va_arg(ap, Char *)) == NULL)
226
argv[0] = STR("bind");
193
227
rv = map_bind(el, i, argv);
198
rv = term_telltc(el, i, argv);
231
argv[0] = STR("telltc");
232
rv = terminal_telltc(el, i, argv);
203
rv = term_settc(el, i, argv);
236
argv[0] = STR("settc");
237
rv = terminal_settc(el, i, argv);
208
rv = term_echotc(el, i, argv);
241
argv[0] = STR("echotc");
242
rv = terminal_echotc(el, i, argv);
246
argv[0] = STR("setty");
213
247
rv = tty_stty(el, i, argv);
226
char *name = va_arg(ap, char *);
227
char *help = va_arg(ap, char *);
260
Char *name = va_arg(ap, Char *);
261
Char *help = va_arg(ap, Char *);
228
262
el_func_t func = va_arg(ap, el_func_t);
230
264
rv = map_addfunc(el, name, help, func);
236
270
hist_fun_t func = va_arg(ap, hist_fun_t);
237
ptr_t ptr = va_arg(ap, char *);
271
void *ptr = va_arg(ap, void *);
239
273
rv = hist_set(el, func, ptr);
274
if (!(el->el_flags & CHARSET_IS_MULTIBYTE))
275
el->el_flags &= ~NARROW_HISTORY;
327
366
* retrieve the editline parameters
330
el_get(EditLine *el, int op, ...)
369
FUN(el,get)(EditLine *el, int op, ...)
343
rv = prompt_get(el, va_arg(ap, el_pfunc_t *), 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);
347
rv = map_get_editor(el, va_arg(ap, const char **));
396
rv = map_get_editor(el, va_arg(ap, const Char **));
392
char *name = va_arg(ap, char *);
393
char *help = va_arg(ap, char *);
394
el_func_t func = va_arg(ap, el_func_t);
396
rv = map_addfunc(el, name, help, func);
402
hist_fun_t func = va_arg(ap, hist_fun_t);
403
ptr_t ptr = va_arg(ap, char *);
404
rv = hist_set(el, func, ptr);
410
439
*va_arg(ap, el_rfunc_t *) = el_read_getfn(el);
459
488
* Return editing info
461
public const LineInfo *
462
el_line(EditLine *el)
490
public const TYPE(LineInfo) *
491
FUN(el,line)(EditLine *el)
465
return (const LineInfo *) (void *) &el->el_line;
494
return (const TYPE(LineInfo) *)(void *)&el->el_line;
480
512
if (fname == NULL) {
481
#ifdef HAVE_ISSETUGID
513
/* XXXMYSQL: Bug#49967 */
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))
482
520
static const char elpath[] = "/.editrc";
521
size_t plen = sizeof(elpath);
483
522
/* XXXMYSQL: Portability fix (for which platforms?) */
485
char path[MAXPATHLEN];
523
#ifdef HAVE_ISSETUGID
526
#elif defined(HAVE_IDENTITY_FUNCS)
527
if (getuid() != geteuid() || getgid() != getegid())
492
530
if ((ptr = getenv("HOME")) == NULL)
494
if (strlcpy(path, ptr, sizeof(path)) >= sizeof(path))
496
if (strlcat(path, elpath, sizeof(path)) >= sizeof(path))
533
if ((path = el_malloc(plen * sizeof(*path))) == NULL)
535
(void)snprintf(path, plen, "%s%s", ptr, elpath);
501
* If issetugid() is missing, always return an error, in order
502
* to keep from inadvertently opening up the user to a security
539
* If issetugid() or the above mentioned get[e][u|g]id()
540
* functions are missing, always return an error, in order
541
* to keep from inadvertently opening up the user to a
509
548
fp = fopen(fname, "r");
513
554
while ((ptr = fgetln(fp, &len)) != NULL) {
514
if (len > 0 && ptr[len - 1] == '\n')
556
continue; /* Empty line. */
557
dptr = ct_decode_string(ptr, &el->el_scratch);
560
if (len > 0 && dptr[len - 1] == '\n')
517
if (parse_line(el, ptr) == -1) {
563
/* loop until first non-space char or EOL */
564
while (*dptr != '\0' && Isspace(*dptr))
567
continue; /* ignore, this is a comment line */
568
if ((error = parse_line(el, dptr)) == -1)
523
573
(void) fclose(fp);
539
589
(void) sigprocmask(SIG_BLOCK, &nset, &oset);
541
591
/* get the correct window size */
542
if (term_get_size(el, &lins, &cols))
543
term_change_size(el, lins, cols);
592
if (terminal_get_size(el, &lins, &cols))
593
terminal_change_size(el, lins, cols);
545
595
(void) sigprocmask(SIG_SETMASK, &oset, NULL);
565
el_editmode(EditLine *el, int argc, const char **argv)
615
el_editmode(EditLine *el, int argc, const Char **argv)
569
619
if (argv == NULL || argc != 2 || argv[1] == NULL)
573
if (strcmp(how, "on") == 0) {
623
if (Strcmp(how, STR("on")) == 0) {
574
624
el->el_flags &= ~EDIT_DISABLED;
576
} else if (strcmp(how, "off") == 0) {
626
} else if (Strcmp(how, STR("off")) == 0) {
577
627
tty_cookedmode(el);
578
628
el->el_flags |= EDIT_DISABLED;
581
(void) fprintf(el->el_errfile, "edit: Bad value `%s'.\n", how);
631
(void) fprintf(el->el_errfile, "edit: Bad value `" FSTR "'.\n",