Annotation of embedaddon/ntp/libntp/ntp_lineedit.c, revision 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>