Home | History | Annotate | Line # | Download | only in libedit
el.c revision 1.16.4.2
      1  1.16.4.2     chuck /*	$NetBSD: el.c,v 1.16.4.2 2000/08/02 13:45:40 chuck Exp $	*/
      2       1.2     lukem 
      3       1.1       cgd /*-
      4       1.1       cgd  * Copyright (c) 1992, 1993
      5       1.1       cgd  *	The Regents of the University of California.  All rights reserved.
      6       1.1       cgd  *
      7       1.1       cgd  * This code is derived from software contributed to Berkeley by
      8       1.1       cgd  * Christos Zoulas of Cornell University.
      9       1.1       cgd  *
     10       1.1       cgd  * Redistribution and use in source and binary forms, with or without
     11       1.1       cgd  * modification, are permitted provided that the following conditions
     12       1.1       cgd  * are met:
     13       1.1       cgd  * 1. Redistributions of source code must retain the above copyright
     14       1.1       cgd  *    notice, this list of conditions and the following disclaimer.
     15       1.1       cgd  * 2. Redistributions in binary form must reproduce the above copyright
     16       1.1       cgd  *    notice, this list of conditions and the following disclaimer in the
     17       1.1       cgd  *    documentation and/or other materials provided with the distribution.
     18       1.1       cgd  * 3. All advertising materials mentioning features or use of this software
     19       1.1       cgd  *    must display the following acknowledgement:
     20       1.1       cgd  *	This product includes software developed by the University of
     21       1.1       cgd  *	California, Berkeley and its contributors.
     22       1.1       cgd  * 4. Neither the name of the University nor the names of its contributors
     23       1.1       cgd  *    may be used to endorse or promote products derived from this software
     24       1.1       cgd  *    without specific prior written permission.
     25       1.1       cgd  *
     26       1.1       cgd  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
     27       1.1       cgd  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     28       1.1       cgd  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     29       1.1       cgd  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
     30       1.1       cgd  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     31       1.1       cgd  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     32       1.1       cgd  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     33       1.1       cgd  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
     34       1.1       cgd  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
     35       1.1       cgd  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
     36       1.1       cgd  * SUCH DAMAGE.
     37       1.1       cgd  */
     38       1.1       cgd 
     39       1.7  christos #include <sys/cdefs.h>
     40       1.1       cgd #if !defined(lint) && !defined(SCCSID)
     41       1.2     lukem #if 0
     42       1.1       cgd static char sccsid[] = "@(#)el.c	8.2 (Berkeley) 1/3/94";
     43       1.2     lukem #else
     44  1.16.4.2     chuck __RCSID("$NetBSD: el.c,v 1.16.4.2 2000/08/02 13:45:40 chuck Exp $");
     45       1.2     lukem #endif
     46       1.1       cgd #endif /* not lint && not SCCSID */
     47       1.1       cgd 
     48       1.1       cgd /*
     49       1.1       cgd  * el.c: EditLine interface functions
     50       1.1       cgd  */
     51       1.1       cgd #include "sys.h"
     52       1.1       cgd 
     53       1.1       cgd #include <sys/types.h>
     54       1.1       cgd #include <sys/param.h>
     55       1.1       cgd #include <string.h>
     56       1.1       cgd #include <stdlib.h>
     57       1.5  christos #ifdef __STDC__
     58       1.1       cgd # include <stdarg.h>
     59       1.1       cgd #else
     60       1.1       cgd # include <varargs.h>
     61       1.1       cgd #endif
     62       1.1       cgd #include "el.h"
     63       1.1       cgd 
     64       1.1       cgd /* el_init():
     65       1.1       cgd  *	Initialize editline and set default parameters.
     66       1.1       cgd  */
     67       1.1       cgd public EditLine *
     68       1.9  christos el_init(prog, fin, fout, ferr)
     69       1.1       cgd     const char *prog;
     70       1.9  christos     FILE *fin, *fout, *ferr;
     71       1.1       cgd {
     72  1.16.4.2     chuck     extern char *rl_readline_name;
     73  1.16.4.2     chuck 
     74       1.1       cgd     EditLine *el = (EditLine *) el_malloc(sizeof(EditLine));
     75       1.1       cgd #ifdef DEBUG
     76       1.1       cgd     char *tty;
     77       1.1       cgd #endif
     78       1.1       cgd 
     79       1.1       cgd     if (el == NULL)
     80       1.1       cgd 	return NULL;
     81       1.1       cgd 
     82       1.1       cgd     memset(el, 0, sizeof(EditLine));
     83       1.1       cgd 
     84       1.1       cgd     el->el_infd  = fileno(fin);
     85       1.1       cgd     el->el_outfile = fout;
     86       1.9  christos     el->el_errfile = ferr;
     87       1.1       cgd     el->el_prog = strdup(prog);
     88       1.1       cgd 
     89       1.1       cgd     /*
     90       1.1       cgd      * Initialize all the modules. Order is important!!!
     91       1.1       cgd      */
     92       1.8  christos     el->el_flags = 0;
     93  1.16.4.2     chuck 
     94  1.16.4.2     chuck     /* readline compat hack to make xxgdb work */
     95  1.16.4.2     chuck     if (prog == rl_readline_name) {
     96  1.16.4.2     chuck         struct termios t;
     97  1.16.4.2     chuck 
     98  1.16.4.2     chuck         if (tcgetattr(el->el_infd, &t) == 0) {
     99  1.16.4.2     chuck 	    if ((t.c_lflag & ECHO) == 0)
    100  1.16.4.2     chuck         	el->el_flags |= EDIT_DISABLED;
    101  1.16.4.2     chuck 	}
    102  1.16.4.2     chuck     }
    103  1.16.4.2     chuck 
    104       1.1       cgd     (void) term_init(el);
    105      1.11  christos     (void) key_init(el);
    106      1.11  christos     (void) map_init(el);
    107       1.8  christos     if (tty_init(el) == -1)
    108       1.8  christos 	el->el_flags |= NO_TTY;
    109       1.1       cgd     (void) ch_init(el);
    110       1.1       cgd     (void) search_init(el);
    111       1.1       cgd     (void) hist_init(el);
    112       1.1       cgd     (void) prompt_init(el);
    113       1.1       cgd     (void) sig_init(el);
    114       1.1       cgd 
    115       1.1       cgd     return el;
    116       1.1       cgd } /* end el_init */
    117       1.1       cgd 
    118       1.1       cgd 
    119       1.1       cgd /* el_end():
    120       1.1       cgd  *	Clean up.
    121       1.1       cgd  */
    122       1.1       cgd public void
    123       1.1       cgd el_end(el)
    124       1.1       cgd     EditLine *el;
    125       1.1       cgd {
    126       1.1       cgd     if (el == NULL)
    127       1.1       cgd 	return;
    128       1.1       cgd 
    129       1.1       cgd     el_reset(el);
    130       1.1       cgd 
    131       1.1       cgd     term_end(el);
    132       1.1       cgd     key_end(el);
    133       1.1       cgd     map_end(el);
    134      1.11  christos     tty_end(el);
    135       1.1       cgd     ch_end(el);
    136       1.1       cgd     search_end(el);
    137       1.1       cgd     hist_end(el);
    138       1.1       cgd     prompt_end(el);
    139       1.1       cgd     sig_end(el);
    140       1.1       cgd 
    141       1.1       cgd     el_free((ptr_t) el->el_prog);
    142       1.1       cgd     el_free((ptr_t) el);
    143      1.13    simonb } /* end el_end */
    144       1.1       cgd 
    145       1.1       cgd 
    146       1.1       cgd /* el_reset():
    147       1.1       cgd  *	Reset the tty and the parser
    148       1.1       cgd  */
    149       1.1       cgd public void
    150       1.1       cgd el_reset(el)
    151       1.1       cgd     EditLine *el;
    152       1.1       cgd {
    153       1.1       cgd     tty_cookedmode(el);
    154       1.1       cgd     ch_reset(el);	/* XXX: Do we want that? */
    155       1.1       cgd }
    156       1.1       cgd 
    157       1.1       cgd 
    158       1.1       cgd /* el_set():
    159       1.1       cgd  *	set the editline parameters
    160       1.1       cgd  */
    161       1.1       cgd public int
    162       1.5  christos #ifdef __STDC__
    163       1.1       cgd el_set(EditLine *el, int op, ...)
    164       1.1       cgd #else
    165       1.1       cgd el_set(va_alist)
    166       1.1       cgd     va_dcl
    167       1.1       cgd #endif
    168       1.1       cgd {
    169       1.1       cgd     va_list va;
    170       1.1       cgd     int rv;
    171       1.5  christos #ifdef __STDC__
    172       1.1       cgd     va_start(va, op);
    173       1.1       cgd #else
    174       1.1       cgd     EditLine *el;
    175       1.1       cgd     int op;
    176       1.1       cgd 
    177       1.1       cgd     va_start(va);
    178       1.1       cgd     el = va_arg(va, EditLine *);
    179       1.1       cgd     op = va_arg(va, int);
    180       1.1       cgd #endif
    181      1.13    simonb 
    182      1.10     lukem     if (el == NULL)
    183      1.10     lukem 	return -1;
    184       1.1       cgd     switch (op) {
    185       1.1       cgd     case EL_PROMPT:
    186      1.15     lukem     case EL_RPROMPT:
    187      1.15     lukem 	rv = prompt_set(el, va_arg(va, el_pfunc_t), op);
    188       1.1       cgd 	break;
    189       1.1       cgd 
    190       1.1       cgd     case EL_TERMINAL:
    191       1.1       cgd 	rv = term_set(el, va_arg(va, char *));
    192       1.1       cgd 	break;
    193       1.1       cgd 
    194       1.1       cgd     case EL_EDITOR:
    195       1.1       cgd 	rv = map_set_editor(el, va_arg(va, char *));
    196       1.1       cgd 	break;
    197       1.1       cgd 
    198       1.1       cgd     case EL_SIGNAL:
    199       1.1       cgd 	if (va_arg(va, int))
    200       1.1       cgd 	    el->el_flags |= HANDLE_SIGNALS;
    201       1.1       cgd 	else
    202       1.1       cgd 	    el->el_flags &= ~HANDLE_SIGNALS;
    203       1.1       cgd 	rv = 0;
    204       1.1       cgd 	break;
    205       1.1       cgd 
    206       1.1       cgd     case EL_BIND:
    207       1.1       cgd     case EL_TELLTC:
    208       1.1       cgd     case EL_SETTC:
    209       1.1       cgd     case EL_ECHOTC:
    210       1.1       cgd     case EL_SETTY:
    211       1.1       cgd 	{
    212       1.1       cgd 	    char *argv[20];
    213       1.1       cgd 	    int i;
    214       1.1       cgd 	    for (i = 1; i < 20; i++)
    215       1.1       cgd 		if ((argv[i] = va_arg(va, char *)) == NULL)
    216       1.1       cgd 		     break;
    217       1.1       cgd 
    218       1.1       cgd 	    switch (op) {
    219       1.1       cgd 	    case EL_BIND:
    220       1.1       cgd 		argv[0] = "bind";
    221       1.1       cgd 		rv = map_bind(el, i, argv);
    222       1.1       cgd 		break;
    223       1.1       cgd 
    224       1.1       cgd 	    case EL_TELLTC:
    225       1.1       cgd 		argv[0] = "telltc";
    226       1.1       cgd 		rv = term_telltc(el, i, argv);
    227       1.1       cgd 		break;
    228       1.1       cgd 
    229       1.1       cgd 	    case EL_SETTC:
    230       1.1       cgd 		argv[0] = "settc";
    231       1.1       cgd 		rv = term_settc(el, i, argv);
    232       1.1       cgd 		break;
    233       1.1       cgd 
    234       1.1       cgd 	    case EL_ECHOTC:
    235       1.1       cgd 		argv[0] = "echotc";
    236       1.1       cgd 		rv = term_echotc(el, i, argv);
    237       1.1       cgd 		break;
    238       1.1       cgd 
    239       1.1       cgd 	    case EL_SETTY:
    240       1.1       cgd 		argv[0] = "setty";
    241       1.1       cgd 		rv = tty_stty(el, i, argv);
    242       1.1       cgd 		break;
    243       1.1       cgd 
    244       1.1       cgd 	    default:
    245       1.1       cgd 		rv = -1;
    246       1.1       cgd 		abort();
    247       1.1       cgd 		break;
    248       1.1       cgd 	    }
    249       1.1       cgd 	}
    250       1.1       cgd 	break;
    251      1.13    simonb 
    252       1.1       cgd     case EL_ADDFN:
    253       1.1       cgd 	{
    254       1.1       cgd 	    char 	*name = va_arg(va, char *);
    255       1.1       cgd 	    char 	*help = va_arg(va, char *);
    256       1.1       cgd 	    el_func_t    func = va_arg(va, el_func_t);
    257       1.1       cgd 	    rv = map_addfunc(el, name, help, func);
    258       1.1       cgd 	}
    259       1.1       cgd 	break;
    260       1.1       cgd 
    261       1.1       cgd     case EL_HIST:
    262       1.1       cgd 	{
    263       1.1       cgd 	    hist_fun_t func = va_arg(va, hist_fun_t);
    264       1.1       cgd 	    ptr_t      ptr = va_arg(va, char *);
    265       1.1       cgd 	    rv = hist_set(el, func, ptr);
    266       1.1       cgd 	}
    267       1.1       cgd 	break;
    268       1.1       cgd 
    269      1.10     lukem     case EL_EDITMODE:
    270      1.10     lukem 	if (va_arg(va, int))
    271      1.10     lukem 	    el->el_flags &= ~EDIT_DISABLED;
    272      1.10     lukem 	else
    273      1.10     lukem 	    el->el_flags |= EDIT_DISABLED;
    274      1.10     lukem 	rv = 0;
    275      1.10     lukem 	break;
    276      1.10     lukem 
    277       1.1       cgd     default:
    278       1.1       cgd 	rv = -1;
    279       1.1       cgd     }
    280       1.1       cgd 
    281       1.1       cgd     va_end(va);
    282       1.1       cgd     return rv;
    283       1.1       cgd } /* end el_set */
    284       1.1       cgd 
    285       1.1       cgd 
    286      1.10     lukem /* el_get():
    287      1.10     lukem  *	retrieve the editline parameters
    288      1.10     lukem  */
    289      1.10     lukem public int
    290      1.10     lukem el_get(el, op, ret)
    291      1.10     lukem     EditLine *el;
    292      1.10     lukem     int op;
    293      1.10     lukem     void *ret;
    294      1.10     lukem {
    295      1.10     lukem     int rv;
    296      1.10     lukem 
    297      1.10     lukem     if (el == NULL || ret == NULL)
    298      1.10     lukem 	return -1;
    299      1.10     lukem     switch (op) {
    300      1.10     lukem     case EL_PROMPT:
    301      1.15     lukem     case EL_RPROMPT:
    302      1.15     lukem 	rv = prompt_get(el, (el_pfunc_t *)&ret, op);
    303      1.10     lukem 	break;
    304      1.10     lukem 
    305      1.10     lukem     case EL_EDITOR:
    306      1.10     lukem 	rv = map_get_editor(el, (const char **)&ret);
    307      1.10     lukem 	break;
    308      1.10     lukem 
    309      1.10     lukem     case EL_SIGNAL:
    310      1.10     lukem 	*((int *)ret) = (el->el_flags & HANDLE_SIGNALS);
    311      1.10     lukem 	rv = 0;
    312      1.10     lukem 	break;
    313      1.10     lukem 
    314      1.10     lukem     case EL_EDITMODE:
    315      1.10     lukem 	*((int *)ret) = (!(el->el_flags & EDIT_DISABLED));
    316      1.10     lukem 	rv = 0;
    317      1.10     lukem 	break;
    318      1.10     lukem 
    319      1.10     lukem #if 0 /*XXX*/
    320      1.10     lukem     case EL_TERMINAL:
    321      1.10     lukem 	rv = term_get(el, (const char *)&ret);
    322      1.10     lukem 	break;
    323      1.10     lukem 
    324      1.10     lukem     case EL_BIND:
    325      1.10     lukem     case EL_TELLTC:
    326      1.10     lukem     case EL_SETTC:
    327      1.10     lukem     case EL_ECHOTC:
    328      1.10     lukem     case EL_SETTY:
    329      1.10     lukem 	{
    330      1.10     lukem 	    char *argv[20];
    331      1.10     lukem 	    int i;
    332      1.10     lukem 	    for (i = 1; i < 20; i++)
    333      1.10     lukem 		if ((argv[i] = va_arg(va, char *)) == NULL)
    334      1.10     lukem 		     break;
    335      1.10     lukem 
    336      1.10     lukem 	    switch (op) {
    337      1.10     lukem 	    case EL_BIND:
    338      1.10     lukem 		argv[0] = "bind";
    339      1.10     lukem 		rv = map_bind(el, i, argv);
    340      1.10     lukem 		break;
    341      1.10     lukem 
    342      1.10     lukem 	    case EL_TELLTC:
    343      1.10     lukem 		argv[0] = "telltc";
    344      1.10     lukem 		rv = term_telltc(el, i, argv);
    345      1.10     lukem 		break;
    346      1.10     lukem 
    347      1.10     lukem 	    case EL_SETTC:
    348      1.10     lukem 		argv[0] = "settc";
    349      1.10     lukem 		rv = term_settc(el, i, argv);
    350      1.10     lukem 		break;
    351      1.10     lukem 
    352      1.10     lukem 	    case EL_ECHOTC:
    353      1.10     lukem 		argv[0] = "echotc";
    354      1.10     lukem 		rv = term_echotc(el, i, argv);
    355      1.10     lukem 		break;
    356      1.10     lukem 
    357      1.10     lukem 	    case EL_SETTY:
    358      1.10     lukem 		argv[0] = "setty";
    359      1.10     lukem 		rv = tty_stty(el, i, argv);
    360      1.10     lukem 		break;
    361      1.10     lukem 
    362      1.10     lukem 	    default:
    363      1.10     lukem 		rv = -1;
    364      1.10     lukem 		abort();
    365      1.10     lukem 		break;
    366      1.10     lukem 	    }
    367      1.10     lukem 	}
    368      1.10     lukem 	break;
    369      1.13    simonb 
    370      1.10     lukem     case EL_ADDFN:
    371      1.10     lukem 	{
    372      1.10     lukem 	    char 	*name = va_arg(va, char *);
    373      1.10     lukem 	    char 	*help = va_arg(va, char *);
    374      1.10     lukem 	    el_func_t    func = va_arg(va, el_func_t);
    375      1.10     lukem 	    rv = map_addfunc(el, name, help, func);
    376      1.10     lukem 	}
    377      1.10     lukem 	break;
    378      1.10     lukem 
    379      1.10     lukem     case EL_HIST:
    380      1.10     lukem 	{
    381      1.10     lukem 	    hist_fun_t func = va_arg(va, hist_fun_t);
    382      1.10     lukem 	    ptr_t      ptr = va_arg(va, char *);
    383      1.10     lukem 	    rv = hist_set(el, func, ptr);
    384      1.10     lukem 	}
    385      1.10     lukem 	break;
    386      1.10     lukem #endif /*XXX*/
    387      1.10     lukem 
    388      1.10     lukem     default:
    389      1.10     lukem 	rv = -1;
    390      1.10     lukem     }
    391      1.10     lukem 
    392      1.10     lukem     return rv;
    393      1.10     lukem } /* end el_get */
    394      1.10     lukem 
    395      1.10     lukem 
    396       1.1       cgd /* el_line():
    397       1.1       cgd  *	Return editing info
    398       1.1       cgd  */
    399       1.1       cgd public const LineInfo *
    400       1.1       cgd el_line(el)
    401       1.1       cgd     EditLine *el;
    402       1.1       cgd {
    403      1.12  christos     return (const LineInfo *)(void *)&el->el_line;
    404       1.1       cgd }
    405       1.1       cgd 
    406       1.1       cgd static const char elpath[] = "/.editrc";
    407       1.1       cgd 
    408       1.1       cgd /* el_source():
    409       1.1       cgd  *	Source a file
    410       1.1       cgd  */
    411       1.1       cgd public int
    412       1.1       cgd el_source(el, fname)
    413       1.1       cgd     EditLine *el;
    414       1.1       cgd     const char *fname;
    415       1.1       cgd {
    416       1.1       cgd     FILE *fp;
    417       1.1       cgd     size_t len;
    418       1.1       cgd     char *ptr, path[MAXPATHLEN];
    419       1.1       cgd 
    420      1.14     lukem     fp = NULL;
    421       1.1       cgd     if (fname == NULL) {
    422  1.16.4.1  sommerfe 	if (issetugid())
    423  1.16.4.1  sommerfe 	    return -1;
    424  1.16.4.1  sommerfe 	if ((ptr = getenv("HOME")) == NULL)
    425  1.16.4.1  sommerfe 	    return -1;
    426  1.16.4.1  sommerfe 	if (strlcpy(path, ptr,    sizeof(path)) >= sizeof(path))
    427  1.16.4.1  sommerfe 	    return -1;
    428  1.16.4.1  sommerfe 	if (strlcat(path, elpath, sizeof(path)) >= sizeof(path))
    429  1.16.4.1  sommerfe 	    return -1;
    430  1.16.4.1  sommerfe 	fname = path;
    431       1.1       cgd     }
    432      1.14     lukem     if (fp == NULL)
    433      1.14     lukem 	fp = fopen(fname, "r");
    434      1.14     lukem     if (fp == NULL)
    435       1.1       cgd 	return -1;
    436       1.1       cgd 
    437       1.3     lukem     while ((ptr = fgetln(fp, &len)) != NULL) {
    438      1.16  christos 	if (len > 0 && ptr[len - 1] == '\n')
    439       1.6  christos 	    --len;
    440       1.6  christos 	ptr[len] = '\0';
    441       1.1       cgd 	if (parse_line(el, ptr) == -1) {
    442       1.1       cgd 	    (void) fclose(fp);
    443       1.1       cgd 	    return -1;
    444       1.1       cgd 	}
    445       1.3     lukem     }
    446       1.1       cgd 
    447       1.1       cgd     (void) fclose(fp);
    448       1.1       cgd     return 0;
    449       1.1       cgd }
    450       1.1       cgd 
    451       1.1       cgd 
    452       1.1       cgd /* el_resize():
    453       1.1       cgd  *	Called from program when terminal is resized
    454       1.1       cgd  */
    455       1.1       cgd public void
    456       1.1       cgd el_resize(el)
    457       1.1       cgd     EditLine *el;
    458       1.1       cgd {
    459       1.1       cgd     int lins, cols;
    460       1.1       cgd     sigset_t oset, nset;
    461       1.1       cgd     (void) sigemptyset(&nset);
    462       1.1       cgd     (void) sigaddset(&nset, SIGWINCH);
    463       1.1       cgd     (void) sigprocmask(SIG_BLOCK, &nset, &oset);
    464       1.1       cgd 
    465       1.1       cgd     /* get the correct window size */
    466       1.1       cgd     if (term_get_size(el, &lins, &cols))
    467       1.1       cgd 	term_change_size(el, lins, cols);
    468       1.1       cgd 
    469       1.1       cgd     (void) sigprocmask(SIG_SETMASK, &oset, NULL);
    470       1.9  christos }
    471      1.14     lukem 
    472       1.9  christos 
    473       1.9  christos /* el_beep():
    474       1.9  christos  *	Called from the program to beep
    475       1.9  christos  */
    476       1.9  christos public void
    477       1.9  christos el_beep(el)
    478       1.9  christos     EditLine *el;
    479       1.9  christos {
    480       1.9  christos     term_beep(el);
    481       1.1       cgd }
    482      1.10     lukem 
    483      1.10     lukem 
    484      1.10     lukem /* el_editmode()
    485      1.10     lukem  *	Set the state of EDIT_DISABLED from the `edit' command.
    486      1.10     lukem  */
    487      1.10     lukem protected int
    488      1.10     lukem /*ARGSUSED*/
    489      1.10     lukem el_editmode(el, argc, argv)
    490      1.10     lukem     EditLine *el;
    491      1.10     lukem     int argc;
    492      1.10     lukem     char **argv;
    493      1.10     lukem {
    494      1.10     lukem     const char *how;
    495      1.10     lukem 
    496      1.10     lukem     if (argv == NULL || argc != 2 || argv[1] == NULL)
    497      1.10     lukem 	return -1;
    498      1.10     lukem 
    499      1.10     lukem     how = argv[1];
    500      1.10     lukem     if (strcmp(how, "on") == 0)
    501      1.10     lukem 	    el->el_flags &= ~EDIT_DISABLED;
    502      1.10     lukem     else if (strcmp(how, "off") == 0)
    503      1.10     lukem 	    el->el_flags |= EDIT_DISABLED;
    504      1.10     lukem     else {
    505      1.10     lukem 	(void) fprintf(el->el_errfile, "edit: Bad value `%s'.\n", how);
    506      1.10     lukem 	return -1;
    507      1.10     lukem     }
    508      1.10     lukem     return 0;
    509      1.10     lukem } /* end el_editmode */
    510