Annotation of embedaddon/ntp/libntp/ntp_lineedit.c, revision 1.1.1.1

1.1       misho       1: /*
                      2:  * ntp_lineedit.c - generic interface to various line editing libs
                      3:  */
                      4: #ifdef HAVE_CONFIG_H
                      5: # include <config.h>
                      6: #endif
                      7: 
                      8: #include <errno.h>
                      9: #include <string.h>
                     10: #include <stdlib.h>
                     11: #include <stdio.h>
                     12: 
                     13: #if defined(HAVE_READLINE_HISTORY) &&          \
                     14:     (!defined(HAVE_READLINE_HISTORY_H) ||      \
                     15:      !defined(HAVE_READLINE_READLINE_H))
                     16: # undef HAVE_READLINE_HISTORY
                     17: #endif
                     18: #if defined(HAVE_READLINE_HISTORY)
                     19: # include <readline/readline.h>
                     20: # include <readline/history.h>
                     21: # define LE_READLINE
                     22: #elif defined(HAVE_HISTEDIT_H)
                     23: # include <histedit.h>
                     24: # define LE_EDITLINE
                     25: #else
                     26: # define LE_NONE
                     27: #endif
                     28: 
                     29: #include "ntp.h"
                     30: #include "ntp_stdlib.h"
                     31: #include "ntp_lineedit.h"
                     32: 
                     33: #define MAXEDITLINE    512
                     34: 
                     35: /*
                     36:  * external references
                     37:  */
                     38: 
                     39: extern char *  progname;
                     40: 
                     41: /*
                     42:  * globals, private prototypes
                     43:  */
                     44: 
                     45: static int     ntp_readline_initted;
                     46: static char *  lineedit_prompt;
                     47: 
                     48: 
                     49: #ifdef LE_EDITLINE
                     50: # ifndef H_SETSIZE
                     51: #  define H_SETSIZE H_EVENT
                     52: # endif
                     53: static EditLine *      ntp_el;
                     54: static History *       ntp_hist;
                     55: static HistEvent       hev;
                     56: 
                     57: char * ntp_prompt_callback(EditLine *);
                     58: #endif /* LE_EDITLINE */
                     59: 
                     60: 
                     61: /*
                     62:  * ntp_readline_init - setup, set or reset prompt string
                     63:  */
                     64: int
                     65: ntp_readline_init(
                     66:        const char *    prompt
                     67:        )
                     68: {
                     69:        int     success;
                     70: 
                     71:        success = 1;
                     72: 
                     73:        if (prompt) {
                     74:                if (lineedit_prompt) 
                     75:                        free(lineedit_prompt);
                     76:                lineedit_prompt = estrdup(prompt);
                     77:        }
                     78: 
                     79: #ifdef LE_EDITLINE
                     80:        if (NULL == ntp_el) {
                     81: 
                     82: # if 4 == EL_INIT_ARGS
                     83:                ntp_el = el_init(progname, stdin, stdout, stderr);
                     84: # else
                     85:                ntp_el = el_init(progname, stdin, stdout);
                     86: # endif
                     87:                if (ntp_el) {
                     88: 
                     89:                        el_set(ntp_el, EL_PROMPT, ntp_prompt_callback);
                     90:                        el_set(ntp_el, EL_EDITOR, "emacs");
                     91: 
                     92:                        ntp_hist = history_init();
                     93: 
                     94:                        if (NULL == ntp_hist) {
                     95: 
                     96:                                fprintf(stderr, "history_init(): %s\n",
                     97:                                                strerror(errno));
                     98:                                fflush(stderr);
                     99: 
                    100:                                el_end(ntp_el);
                    101:                                ntp_el = NULL;
                    102: 
                    103:                                success = 0;
                    104: 
                    105:                        } else {
                    106:                                memset(&hev, 0, sizeof(hev));
                    107: #ifdef H_SETSIZE
                    108:                                history(ntp_hist, &hev, H_SETSIZE, 128);
                    109: #endif
                    110:                                el_set(ntp_el, EL_HIST, history,
                    111:                                       ntp_hist);
                    112:                                /* use any .editrc */
                    113:                                el_source(ntp_el, NULL);
                    114:                        }
                    115:                } else
                    116:                        success = 0;
                    117:        }
                    118: #endif /* LE_EDITLINE */
                    119: 
                    120:        ntp_readline_initted = success;
                    121: 
                    122:        return success;
                    123: }
                    124: 
                    125: 
                    126: /*
                    127:  * ntp_readline_uninit - release resources
                    128:  */
                    129: void
                    130: ntp_readline_uninit(
                    131:        void
                    132:        )
                    133: {
                    134: #ifdef LE_EDITLINE
                    135:        if (ntp_el) {
                    136:                el_end(ntp_el);
                    137:                ntp_el = NULL;
                    138: 
                    139:                history_end(ntp_hist);
                    140:                ntp_hist = NULL;
                    141:        }
                    142: #endif /* LE_EDITLINE */
                    143: 
                    144:        if (lineedit_prompt) {
                    145:                free(lineedit_prompt);
                    146:                lineedit_prompt = NULL;
                    147:        }
                    148: 
                    149:        ntp_readline_initted = 0;
                    150: }
                    151: 
                    152: 
                    153: /*
                    154:  * ntp_readline - read a line with the line editor available
                    155:  *
                    156:  * The string returned must be released with free()
                    157:  */
                    158: 
                    159: char *
                    160: ntp_readline(
                    161:        int *   pcount
                    162:        )
                    163: {
                    164:        char *          line;
                    165: #ifdef LE_NONE
                    166:        char            line_buf[MAXEDITLINE];
                    167: #endif
                    168: #ifdef LE_EDITLINE
                    169:        const char *    cline;
                    170: #endif
                    171: 
                    172:        if (!ntp_readline_initted)
                    173:                return NULL;
                    174: 
                    175:        *pcount = 0;
                    176: 
                    177: #ifdef LE_READLINE
                    178:        line = readline(lineedit_prompt ? lineedit_prompt : "");
                    179:        if (NULL != line) {
                    180:                if (*line) {
                    181:                        add_history(line);
                    182:                        *pcount = strlen(line);
                    183:                } else {
                    184:                        free(line);
                    185:                        line = NULL;
                    186:                }
                    187:        }
                    188: #endif /* LE_READLINE */
                    189: 
                    190: #ifdef LE_EDITLINE
                    191:        cline = el_gets(ntp_el, pcount);
                    192: 
                    193:        if (NULL != cline && *cline) {
                    194:                history(ntp_hist, &hev, H_ENTER, cline);
                    195:                *pcount = strlen(cline);
                    196:                line = estrdup(cline);
                    197:        } else
                    198:                line = NULL;
                    199: #endif /* LE_EDITLINE */
                    200: 
                    201: #ifdef LE_NONE
                    202:                                        /* stone hammers */
                    203:        if (lineedit_prompt) {
                    204: # ifdef VMS
                    205:                        /*
                    206:                         * work around problem mixing
                    207:                         * stdout & stderr
                    208:                         */
                    209:                        fputs("", stdout);
                    210: # endif        /* VMS */
                    211: 
                    212:                fputs(lineedit_prompt, stderr);
                    213:                fflush(stderr);
                    214:        }
                    215: 
                    216:        line = fgets(line_buf, sizeof(line_buf), stdin);
                    217:        if (NULL != line && *line) {
                    218:                *pcount = strlen(line);
                    219:                line = estrdup(line);
                    220:        } else
                    221:                line = NULL;
                    222: 
                    223: #endif /* LE_NONE */
                    224: 
                    225: 
                    226:        if (!line)                      /* EOF */
                    227:                fputs("\n", stderr);
                    228: 
                    229:        return line;
                    230: }
                    231: 
                    232: 
                    233: #ifdef LE_EDITLINE
                    234: /*
                    235:  * ntp_prompt_callback - return prompt string to el_gets()
                    236:  */
                    237: char *
                    238: ntp_prompt_callback(
                    239:        EditLine *el
                    240:        )
                    241: {
                    242:        UNUSED_ARG(el);
                    243: 
                    244:        return lineedit_prompt;
                    245: }
                    246: #endif /* LE_EDITLINE */
                    247: 

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>