Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files. =================================================================== RCS file: /ftp/cvs/cvsroot/src/lib/libedit/readline.c,v rcsdiff: /ftp/cvs/cvsroot/src/lib/libedit/readline.c,v: warning: Unknown phrases like `commitid ...;' are present. retrieving revision 1.91 retrieving revision 1.106 diff -u -p -r1.91 -r1.106 --- src/lib/libedit/readline.c 2010/08/28 15:44:59 1.91 +++ src/lib/libedit/readline.c 2012/10/12 23:35:02 1.106 @@ -1,4 +1,4 @@ -/* $NetBSD: readline.c,v 1.91 2010/08/28 15:44:59 christos Exp $ */ +/* $NetBSD: readline.c,v 1.106 2012/10/12 23:35:02 christos Exp $ */ /*- * Copyright (c) 1997 The NetBSD Foundation, Inc. @@ -31,7 +31,7 @@ #include "config.h" #if !defined(lint) && !defined(SCCSID) -__RCSID("$NetBSD: readline.c,v 1.91 2010/08/28 15:44:59 christos Exp $"); +__RCSID("$NetBSD: readline.c,v 1.106 2012/10/12 23:35:02 christos Exp $"); #endif /* not lint && not SCCSID */ #include @@ -47,11 +47,8 @@ __RCSID("$NetBSD: readline.c,v 1.91 2010 #include #include #include -#ifdef HAVE_VIS_H #include -#else -#include "np/vis.h" -#endif + #include "readline/readline.h" #include "el.h" #include "fcns.h" /* for EL_NUM_FCNS */ @@ -103,6 +100,7 @@ char *rl_basic_word_break_characters = b char *rl_completer_word_break_characters = NULL; char *rl_completer_quote_characters = NULL; Function *rl_completion_entry_function = NULL; +char *(*rl_completion_word_break_hook)(void) = NULL; CPPFunction *rl_attempted_completion_function = NULL; Function *rl_pre_input_hook = NULL; Function *rl_startup1_hook = NULL; @@ -121,10 +119,6 @@ VFunction *rl_prep_term_function = (VFun VFunction *rl_deprep_term_function = (VFunction *)rl_deprep_terminal; KEYMAP_ENTRY_ARRAY emacs_meta_keymap; -#ifdef WIDECHAR -static ct_buffer_t conv; -#endif - /* * The current prompt string. */ @@ -157,7 +151,7 @@ int rl_completion_append_character = ' ' /* stuff below is used internally by libedit for readline emulation */ -static TYPE(History) *h = NULL; +static History *h = NULL; static EditLine *e = NULL; static Function *map[256]; static jmp_buf topbuf; @@ -181,7 +175,7 @@ static char * _get_prompt(EditLine *el __attribute__((__unused__))) { rl_already_prompted = 1; - return (rl_prompt); + return rl_prompt; } @@ -191,16 +185,16 @@ _get_prompt(EditLine *el __attribute__(( static HIST_ENTRY * _move_history(int op) { - TYPE(HistEvent) ev; + HistEvent ev; static HIST_ENTRY rl_he; - if (FUNW(history)(h, &ev, op) != 0) - return (HIST_ENTRY *) NULL; + if (history(h, &ev, op) != 0) + return NULL; - rl_he.line = ct_encode_string(ev.str, &conv); + rl_he.line = ev.str; rl_he.data = NULL; - return (&rl_he); + return &rl_he; } @@ -209,14 +203,14 @@ _move_history(int op) */ static int /*ARGSUSED*/ -_getc_function(EditLine *el, char *c) +_getc_function(EditLine *el __attribute__((__unused__)), char *c) { int i; i = (*rl_getc_function)(NULL); if (i == -1) return 0; - *c = i; + *c = (char)i; return 1; } @@ -228,11 +222,9 @@ _resize_fun(EditLine *el, void *a) li = el_line(el); /* a cheesy way to get rid of const cast. */ - *ap = memchr(li->buffer, *li->buffer, 1); + *ap = memchr(li->buffer, *li->buffer, (size_t)1); } -static const char _dothistory[] = "/.history"; - static const char * _default_history_file(void) { @@ -243,8 +235,7 @@ _default_history_file(void) return path; if ((p = getpwuid(getuid())) == NULL) return NULL; - strlcpy(path, p->pw_dir, PATH_MAX); - strlcat(path, _dothistory, PATH_MAX); + (void)snprintf(path, sizeof(path), "%s/.history", p->pw_dir); return path; } @@ -265,7 +256,7 @@ rl_set_prompt(const char *prompt) if (rl_prompt != NULL && strcmp(rl_prompt, prompt) == 0) return 0; if (rl_prompt) - free(rl_prompt); + el_free(rl_prompt); rl_prompt = strdup(prompt); if (rl_prompt == NULL) return -1; @@ -282,14 +273,14 @@ rl_set_prompt(const char *prompt) int rl_initialize(void) { - TYPE(HistEvent) ev; + HistEvent ev; int editmode = 1; struct termios t; if (e != NULL) el_end(e); if (h != NULL) - FUN(history,end)(h); + history_end(h); if (!rl_instream) rl_instream = stdin; @@ -305,13 +296,13 @@ rl_initialize(void) e = el_init(rl_readline_name, rl_instream, rl_outstream, stderr); if (!editmode) - FUN(el,set)(e, EL_EDITMODE, 0); + el_set(e, EL_EDITMODE, 0); - h = FUN(history,init)(); + h = history_init(); if (!e || !h) - return (-1); + return -1; - FUNW(history)(h, &ev, H_SETSIZE, INT_MAX); /* unlimited */ + history(h, &ev, H_SETSIZE, INT_MAX); /* unlimited */ history_length = 0; max_input_history = INT_MAX; el_set(e, EL_HIST, history, h); @@ -325,7 +316,7 @@ rl_initialize(void) /* for proper prompt printing in readline() */ if (rl_set_prompt("") == -1) { - FUN(history,end)(h); + history_end(h); el_end(e); return -1; } @@ -370,7 +361,7 @@ rl_initialize(void) if (rl_startup_hook) (*rl_startup_hook)(NULL, 0); - return (0); + return 0; } @@ -381,7 +372,7 @@ rl_initialize(void) char * readline(const char *p) { - TYPE(HistEvent) ev; + HistEvent ev; const char * volatile prompt = p; int count; const char *ret; @@ -429,7 +420,7 @@ readline(const char *p) } else buf = NULL; - FUNW(history)(h, &ev, H_GETSIZE); + history(h, &ev, H_GETSIZE); history_length = ev.num; return buf; @@ -479,7 +470,7 @@ _rl_compat_sub(const char *str, const ch } else s++; } - r = result = malloc(len + 1); + r = result = el_malloc((len + 1) * sizeof(*r)); if (result == NULL) return NULL; s = str; @@ -490,13 +481,13 @@ _rl_compat_sub(const char *str, const ch s += what_len; if (!globally) { (void)strcpy(r, s); - return(result); + return result; } } else *r++ = *s++; } *r = '\0'; - return(result); + return result; } static char *last_search_pat; /* last !?pat[?] search pattern */ @@ -509,18 +500,18 @@ get_history_event(const char *cmd, int * size_t len; char *pat; const char *rptr; - TYPE(HistEvent) ev; + HistEvent ev; idx = *cindex; if (cmd[idx++] != history_expansion_char) - return(NULL); + return NULL; /* find out which event to take */ if (cmd[idx] == history_expansion_char || cmd[idx] == '\0') { - if (FUNW(history)(h, &ev, H_FIRST) != 0) - return(NULL); + if (history(h, &ev, H_FIRST) != 0) + return NULL; *cindex = cmd[idx]? (idx + 1):idx; - return ct_encode_string(ev.str, &conv); + return ev.str; } sign = 0; if (cmd[idx] == '-') { @@ -540,10 +531,10 @@ get_history_event(const char *cmd, int * num = history_length - num + 1; if (!(rl_he = history_get(num))) - return(NULL); + return NULL; *cindex = idx; - return(rl_he->line); + return rl_he->line; } sub = 0; if (cmd[idx] == '?') { @@ -561,31 +552,31 @@ get_history_event(const char *cmd, int * break; idx++; } - len = idx - begin; + len = (size_t)idx - (size_t)begin; if (sub && cmd[idx] == '?') idx++; if (sub && len == 0 && last_search_pat && *last_search_pat) pat = last_search_pat; else if (len == 0) - return(NULL); + return NULL; else { - if ((pat = malloc(len + 1)) == NULL) + if ((pat = el_malloc((len + 1) * sizeof(*pat))) == NULL) return NULL; (void)strncpy(pat, cmd + begin, len); pat[len] = '\0'; } - if (FUNW(history)(h, &ev, H_CURR) != 0) { + if (history(h, &ev, H_CURR) != 0) { if (pat != last_search_pat) - free(pat); - return (NULL); + el_free(pat); + return NULL; } num = ev.num; if (sub) { if (pat != last_search_pat) { if (last_search_pat) - free(last_search_pat); + el_free(last_search_pat); last_search_pat = pat; } ret = history_search(pat, -1); @@ -594,29 +585,29 @@ get_history_event(const char *cmd, int * if (ret == -1) { /* restore to end of list on failed search */ - FUNW(history)(h, &ev, H_FIRST); + history(h, &ev, H_FIRST); (void)fprintf(rl_outstream, "%s: Event not found\n", pat); if (pat != last_search_pat) - free(pat); - return(NULL); + el_free(pat); + return NULL; } if (sub && len) { if (last_search_match && last_search_match != pat) - free(last_search_match); + el_free(last_search_match); last_search_match = pat; } if (pat != last_search_pat) - free(pat); + el_free(pat); - if (FUNW(history)(h, &ev, H_CURR) != 0) - return(NULL); + if (history(h, &ev, H_CURR) != 0) + return NULL; *cindex = idx; - rptr = ct_encode_string(ev.str, &conv); + rptr = ev.str; /* roll back to original position */ - (void)FUNW(history)(h, &ev, H_SET, num); + (void)history(h, &ev, H_SET, num); return rptr; } @@ -663,7 +654,8 @@ _history_expand_command(const char *comm } else { if (command[offs + 1] == '#') { /* use command so far */ - if ((aptr = malloc(offs + 1)) == NULL) + if ((aptr = el_malloc((offs + 1) * sizeof(*aptr))) + == NULL) return -1; (void)strncpy(aptr, command, offs); aptr[offs] = '\0'; @@ -674,19 +666,19 @@ _history_expand_command(const char *comm qchar = (offs > 0 && command[offs - 1] == '"')? '"':0; ptr = get_history_event(command + offs, &idx, qchar); } - has_mods = command[offs + idx] == ':'; + has_mods = command[offs + (size_t)idx] == ':'; } if (ptr == NULL && aptr == NULL) - return(-1); + return -1; if (!has_mods) { *result = strdup(aptr ? aptr : ptr); if (aptr) - free(aptr); + el_free(aptr); if (*result == NULL) return -1; - return(1); + return 1; } cmd = command + offs + idx + 1; @@ -731,18 +723,18 @@ _history_expand_command(const char *comm (void)fprintf(rl_outstream, "%s: Bad word specifier", command + offs + idx); if (aptr) - free(aptr); - return(-1); + el_free(aptr); + return -1; } } else tmp = strdup(aptr? aptr:ptr); if (aptr) - free(aptr); + el_free(aptr); if (*cmd == '\0' || ((size_t)(cmd - (command + offs)) >= cmdlen)) { *result = tmp; - return(1); + return 1; } for (; *cmd; cmd++) { @@ -754,7 +746,7 @@ _history_expand_command(const char *comm } else if (*cmd == 't') { /* remove leading path */ if ((aptr = strrchr(tmp, '/')) != NULL) { aptr = strdup(aptr + 1); - free(tmp); + el_free(tmp); tmp = aptr; } } else if (*cmd == 'r') { /* remove trailing suffix */ @@ -763,7 +755,7 @@ _history_expand_command(const char *comm } else if (*cmd == 'e') { /* remove all but suffix */ if ((aptr = strrchr(tmp, '.')) != NULL) { aptr = strdup(aptr); - free(tmp); + el_free(tmp); tmp = aptr; } } else if (*cmd == 'p') /* print only */ @@ -780,10 +772,10 @@ _history_expand_command(const char *comm else if (*cmd == 's') { delim = *(++cmd), cmd++; size = 16; - what = realloc(from, size); + what = el_realloc(from, size * sizeof(*what)); if (what == NULL) { - free(from); - free(tmp); + el_free(from); + el_free(tmp); return 0; } len = 0; @@ -792,11 +784,12 @@ _history_expand_command(const char *comm cmd++; if (len >= size) { char *nwhat; - nwhat = realloc(what, - (size <<= 1)); + nwhat = el_realloc(what, + (size <<= 1) * + sizeof(*nwhat)); if (nwhat == NULL) { - free(what); - free(tmp); + el_free(what); + el_free(tmp); return 0; } what = nwhat; @@ -806,17 +799,17 @@ _history_expand_command(const char *comm what[len] = '\0'; from = what; if (*what == '\0') { - free(what); + el_free(what); if (search) { from = strdup(search); if (from == NULL) { - free(tmp); + el_free(tmp); return 0; } } else { from = NULL; - free(tmp); - return (-1); + el_free(tmp); + return -1; } } cmd++; /* shift after delim */ @@ -824,10 +817,10 @@ _history_expand_command(const char *comm continue; size = 16; - with = realloc(to, size); + with = el_realloc(to, size * sizeof(*with)); if (with == NULL) { - free(to); - free(tmp); + el_free(to); + el_free(tmp); return -1; } len = 0; @@ -836,10 +829,11 @@ _history_expand_command(const char *comm if (len + from_len + 1 >= size) { char *nwith; size += from_len + 1; - nwith = realloc(with, size); + nwith = el_realloc(with, + size * sizeof(*nwith)); if (nwith == NULL) { - free(with); - free(tmp); + el_free(with); + el_free(tmp); return -1; } with = nwith; @@ -862,14 +856,14 @@ _history_expand_command(const char *comm aptr = _rl_compat_sub(tmp, from, to, g_on); if (aptr) { - free(tmp); + el_free(tmp); tmp = aptr; } g_on = 0; } } *result = tmp; - return (p_on? 2:1); + return p_on? 2:1; } @@ -888,13 +882,13 @@ history_expand(char *str, char **output) if (history_expansion_char == 0) { *output = strdup(str); - return(0); + return 0; } *output = NULL; if (str[0] == history_subst_char) { /* ^foo^foo2^ is equivalent to !!:s^foo^foo2^ */ - *output = malloc(strlen(str) + 4 + 1); + *output = el_malloc((strlen(str) + 4 + 1) * sizeof(**output)); if (*output == NULL) return 0; (*output)[0] = (*output)[1] = history_expansion_char; @@ -911,11 +905,12 @@ history_expand(char *str, char **output) #define ADD_STRING(what, len, fr) \ { \ if (idx + len + 1 > size) { \ - char *nresult = realloc(result, (size += len + 1));\ + char *nresult = el_realloc(result, \ + (size += len + 1) * sizeof(*nresult)); \ if (nresult == NULL) { \ - free(*output); \ + el_free(*output); \ if (/*CONSTCOND*/fr) \ - free(tmp); \ + el_free(tmp); \ return 0; \ } \ result = nresult; \ @@ -982,7 +977,7 @@ loop: ADD_STRING(tmp, len, 1); } if (tmp) { - free(tmp); + el_free(tmp); tmp = NULL; } i = j; @@ -999,10 +994,10 @@ loop: ret = -1; #endif } - free(*output); + el_free(*output); *output = result; - return (ret); + return ret; } /* @@ -1037,14 +1032,14 @@ history_arg_extract(int start, int end, (size_t)end > max || start > end) goto out; - for (i = start, len = 0; i <= (size_t)end; i++) + for (i = (size_t)start, len = 0; i <= (size_t)end; i++) len += strlen(arr[i]) + 1; len++; - result = malloc(len); + result = el_malloc(len * sizeof(*result)); if (result == NULL) goto out; - for (i = start, len = 0; i <= (size_t)end; i++) { + for (i = (size_t)start, len = 0; i <= (size_t)end; i++) { (void)strcpy(result + len, arr[i]); len += strlen(arr[i]); if (i < (size_t)end) @@ -1054,8 +1049,8 @@ history_arg_extract(int start, int end, out: for (i = 0; arr[i]; i++) - free(arr[i]); - free(arr); + el_free(arr[i]); + el_free(arr); return result; } @@ -1094,19 +1089,19 @@ history_tokenize(const char *str) if (idx + 2 >= size) { char **nresult; size <<= 1; - nresult = realloc(result, size * sizeof(char *)); + nresult = el_realloc(result, (size_t)size * sizeof(*nresult)); if (nresult == NULL) { - free(result); + el_free(result); return NULL; } result = nresult; } - len = i - start; - temp = malloc(len + 1); + len = (size_t)i - (size_t)start; + temp = el_malloc((size_t)(len + 1) * sizeof(*temp)); if (temp == NULL) { for (i = 0; i < idx; i++) - free(result[i]); - free(result); + el_free(result[i]); + el_free(result); return NULL; } (void)strncpy(temp, &str[start], len); @@ -1116,7 +1111,7 @@ history_tokenize(const char *str) if (str[i]) i++; } - return (result); + return result; } @@ -1126,12 +1121,12 @@ history_tokenize(const char *str) void stifle_history(int max) { - TYPE(HistEvent) ev; + HistEvent ev; if (h == NULL || e == NULL) rl_initialize(); - if (FUNW(history)(h, &ev, H_SETSIZE, max) == 0) + if (history(h, &ev, H_SETSIZE, max) == 0) max_input_history = max; } @@ -1142,13 +1137,13 @@ stifle_history(int max) int unstifle_history(void) { - TYPE(HistEvent) ev; + HistEvent ev; int omax; - FUNW(history)(h, &ev, H_SETSIZE, INT_MAX); + history(h, &ev, H_SETSIZE, INT_MAX); omax = max_input_history; max_input_history = INT_MAX; - return (omax); /* some value _must_ be returned */ + return omax; /* some value _must_ be returned */ } @@ -1157,7 +1152,7 @@ history_is_stifled(void) { /* cannot return true answer */ - return (max_input_history != INT_MAX); + return max_input_history != INT_MAX; } static const char _history_tmp_template[] = "/tmp/.historyXXXXXX"; @@ -1192,7 +1187,7 @@ history_truncate_file (const char *filen } for(;;) { - if (fread(buf, sizeof(buf), 1, fp) != 1) { + if (fread(buf, sizeof(buf), (size_t)1, fp) != 1) { if (ferror(fp)) { ret = errno; break; @@ -1202,7 +1197,7 @@ history_truncate_file (const char *filen ret = errno; break; } - left = fread(buf, 1, sizeof(buf), fp); + left = (ssize_t)fread(buf, (size_t)1, sizeof(buf), fp); if (ferror(fp)) { ret = errno; break; @@ -1210,14 +1205,15 @@ history_truncate_file (const char *filen if (left == 0) { count--; left = sizeof(buf); - } else if (fwrite(buf, (size_t)left, 1, tp) != 1) { + } else if (fwrite(buf, (size_t)left, (size_t)1, tp) + != 1) { ret = errno; break; } fflush(tp); break; } - if (fwrite(buf, sizeof(buf), 1, tp) != 1) { + if (fwrite(buf, sizeof(buf), (size_t)1, tp) != 1) { ret = errno; break; } @@ -1247,7 +1243,7 @@ history_truncate_file (const char *filen ret = errno; break; } - if (fread(buf, sizeof(buf), 1, tp) != 1) { + if (fread(buf, sizeof(buf), (size_t)1, tp) != 1) { if (ferror(tp)) { ret = errno; break; @@ -1261,7 +1257,7 @@ history_truncate_file (const char *filen if (ret || nlines > 0) goto out3; - if (fseeko(fp, 0, SEEK_SET) == (off_t)-1) { + if (fseeko(fp, (off_t)0, SEEK_SET) == (off_t)-1) { ret = errno; goto out3; } @@ -1273,12 +1269,12 @@ history_truncate_file (const char *filen } for(;;) { - if ((left = fread(buf, 1, sizeof(buf), tp)) == 0) { + if ((left = (ssize_t)fread(buf, (size_t)1, sizeof(buf), tp)) == 0) { if (ferror(fp)) ret = errno; break; } - if (fwrite(buf, (size_t)left, 1, fp) != 1) { + if (fwrite(buf, (size_t)left, (size_t)1, fp) != 1) { ret = errno; break; } @@ -1303,14 +1299,14 @@ out1: int read_history(const char *filename) { - TYPE(HistEvent) ev; + HistEvent ev; if (h == NULL || e == NULL) rl_initialize(); if (filename == NULL && (filename = _default_history_file()) == NULL) return errno; - return (FUNW(history)(h, &ev, H_LOAD, filename) == -1 ? - (errno ? errno : EINVAL) : 0); + return history(h, &ev, H_LOAD, filename) == -1 ? + (errno ? errno : EINVAL) : 0; } @@ -1320,14 +1316,14 @@ read_history(const char *filename) int write_history(const char *filename) { - TYPE(HistEvent) ev; + HistEvent ev; if (h == NULL || e == NULL) rl_initialize(); if (filename == NULL && (filename = _default_history_file()) == NULL) return errno; - return (FUNW(history)(h, &ev, H_SAVE, filename) == -1 ? - (errno ? errno : EINVAL) : 0); + return history(h, &ev, H_SAVE, filename) == -1 ? + (errno ? errno : EINVAL) : 0; } @@ -1340,31 +1336,31 @@ HIST_ENTRY * history_get(int num) { static HIST_ENTRY she; - TYPE(HistEvent) ev; + HistEvent ev; int curr_num; if (h == NULL || e == NULL) rl_initialize(); /* save current position */ - if (FUNW(history)(h, &ev, H_CURR) != 0) - return (NULL); + if (history(h, &ev, H_CURR) != 0) + return NULL; curr_num = ev.num; /* start from the oldest */ - if (FUNW(history)(h, &ev, H_LAST) != 0) - return (NULL); /* error */ + if (history(h, &ev, H_LAST) != 0) + return NULL; /* error */ /* look forwards for event matching specified offset */ - if (FUNW(history)(h, &ev, H_NEXT_EVDATA, num, &she.data)) - return (NULL); + if (history(h, &ev, H_NEXT_EVDATA, num, &she.data)) + return NULL; - she.line = ct_encode_string(ev.str, &conv); + she.line = ev.str; /* restore pointer to where it was */ - (void)FUNW(history)(h, &ev, H_SET, curr_num); + (void)history(h, &ev, H_SET, curr_num); - return (&she); + return &she; } @@ -1374,19 +1370,19 @@ history_get(int num) int add_history(const char *line) { - TYPE(HistEvent) ev; - const Char *wline; + HistEvent ev; + + if (line == NULL) + return 0; if (h == NULL || e == NULL) rl_initialize(); - wline = ct_decode_string(line, &conv); - - (void)FUNW(history)(h, &ev, H_ENTER, wline); - if (FUNW(history)(h, &ev, H_GETSIZE) == 0) + (void)history(h, &ev, H_ENTER, line); + if (history(h, &ev, H_GETSIZE) == 0) history_length = ev.num; - return (!(history_length > 0)); /* return 0 if all is okay */ + return !(history_length > 0); /* return 0 if all is okay */ } @@ -1397,21 +1393,21 @@ HIST_ENTRY * remove_history(int num) { HIST_ENTRY *he; - TYPE(HistEvent) ev; + HistEvent ev; if (h == NULL || e == NULL) rl_initialize(); - if ((he = malloc(sizeof(*he))) == NULL) + if ((he = el_malloc(sizeof(*he))) == NULL) return NULL; - if (FUNW(history)(h, &ev, H_DELDATA, num, &he->data) != 0) { - free(he); + if (history(h, &ev, H_DELDATA, num, &he->data) != 0) { + el_free(he); return NULL; } - he->line = ct_encode_string(ev.str, &conv); - if (FUNW(history)(h, &ev, H_GETSIZE) == 0) + he->line = ev.str; + if (history(h, &ev, H_GETSIZE) == 0) history_length = ev.num; return he; @@ -1425,42 +1421,42 @@ HIST_ENTRY * replace_history_entry(int num, const char *line, histdata_t data) { HIST_ENTRY *he; - TYPE(HistEvent) ev; + HistEvent ev; int curr_num; if (h == NULL || e == NULL) rl_initialize(); /* save current position */ - if (FUNW(history)(h, &ev, H_CURR) != 0) + if (history(h, &ev, H_CURR) != 0) return NULL; curr_num = ev.num; /* start from the oldest */ - if (FUNW(history)(h, &ev, H_LAST) != 0) + if (history(h, &ev, H_LAST) != 0) return NULL; /* error */ - if ((he = malloc(sizeof(*he))) == NULL) + if ((he = el_malloc(sizeof(*he))) == NULL) return NULL; /* look forwards for event matching specified offset */ - if (FUNW(history)(h, &ev, H_NEXT_EVDATA, num, &he->data)) + if (history(h, &ev, H_NEXT_EVDATA, num, &he->data)) goto out; - he->line = strdup(ct_encode_string(ev.str, &e->el_scratch)); + he->line = strdup(ev.str); if (he->line == NULL) goto out; - if (FUNW(history)(h, &ev, H_REPLACE, line, data)) + if (history(h, &ev, H_REPLACE, line, data)) goto out; /* restore pointer to where it was */ - if (FUNW(history)(h, &ev, H_SET, curr_num)) + if (history(h, &ev, H_SET, curr_num)) goto out; return he; out: - free(he); + el_free(he); return NULL; } @@ -1470,9 +1466,9 @@ out: void clear_history(void) { - TYPE(HistEvent) ev; + HistEvent ev; - (void)FUNW(history)(h, &ev, H_CLEAR); + (void)history(h, &ev, H_CLEAR); history_length = 0; } @@ -1483,19 +1479,19 @@ clear_history(void) int where_history(void) { - TYPE(HistEvent) ev; + HistEvent ev; int curr_num, off; - if (FUNW(history)(h, &ev, H_CURR) != 0) - return (0); + if (history(h, &ev, H_CURR) != 0) + return 0; curr_num = ev.num; - (void)FUNW(history)(h, &ev, H_FIRST); + (void)history(h, &ev, H_FIRST); off = 1; - while (ev.num != curr_num && FUNW(history)(h, &ev, H_NEXT) == 0) + while (ev.num != curr_num && history(h, &ev, H_NEXT) == 0) off++; - return (off); + return off; } @@ -1506,7 +1502,7 @@ HIST_ENTRY * current_history(void) { - return (_move_history(H_CURR)); + return _move_history(H_CURR); } @@ -1516,24 +1512,24 @@ current_history(void) int history_total_bytes(void) { - TYPE(HistEvent) ev; + HistEvent ev; int curr_num; size_t size; - if (FUNW(history)(h, &ev, H_CURR) != 0) - return (-1); + if (history(h, &ev, H_CURR) != 0) + return -1; curr_num = ev.num; - (void)FUNW(history)(h, &ev, H_FIRST); + (void)history(h, &ev, H_FIRST); size = 0; do - size += Strlen(ev.str) * sizeof(*ev.str); - while (FUNW(history)(h, &ev, H_NEXT) == 0); + size += strlen(ev.str) * sizeof(*ev.str); + while (history(h, &ev, H_NEXT) == 0); /* get to the same position as before */ - FUNW(history)(h, &ev, H_PREV_EVENT, curr_num); + history(h, &ev, H_PREV_EVENT, curr_num); - return (int)(size); + return (int)size; } @@ -1543,24 +1539,24 @@ history_total_bytes(void) int history_set_pos(int pos) { - TYPE(HistEvent) ev; + HistEvent ev; int curr_num; if (pos >= history_length || pos < 0) - return (-1); + return -1; - (void)FUNW(history)(h, &ev, H_CURR); + (void)history(h, &ev, H_CURR); curr_num = ev.num; /* * use H_DELDATA to set to nth history (without delete) by passing * (void **)-1 */ - if (FUNW(history)(h, &ev, H_DELDATA, pos, (void **)-1)) { - (void)FUNW(history)(h, &ev, H_SET, curr_num); - return(-1); + if (history(h, &ev, H_DELDATA, pos, (void **)-1)) { + (void)history(h, &ev, H_SET, curr_num); + return -1; } - return (0); + return 0; } @@ -1571,7 +1567,7 @@ HIST_ENTRY * previous_history(void) { - return (_move_history(H_PREV)); + return _move_history(H_PREV); } @@ -1582,7 +1578,7 @@ HIST_ENTRY * next_history(void) { - return (_move_history(H_NEXT)); + return _move_history(H_NEXT); } @@ -1592,24 +1588,22 @@ next_history(void) int history_search(const char *str, int direction) { - TYPE(HistEvent) ev; - const Char *strp; - const Char *wstr; + HistEvent ev; + const char *strp; int curr_num; - if (FUNW(history)(h, &ev, H_CURR) != 0) - return (-1); + if (history(h, &ev, H_CURR) != 0) + return -1; curr_num = ev.num; - wstr = ct_decode_string(str, &conv); for (;;) { - if ((strp = Strstr(ev.str, wstr)) != NULL) - return (int) (strp - ev.str); - if (FUNW(history)(h, &ev, direction < 0 ? H_NEXT:H_PREV) != 0) + if ((strp = strstr(ev.str, str)) != NULL) + return (int)(strp - ev.str); + if (history(h, &ev, direction < 0 ? H_NEXT:H_PREV) != 0) break; } - (void)FUNW(history)(h, &ev, H_SET, curr_num); - return (-1); + (void)history(h, &ev, H_SET, curr_num); + return -1; } @@ -1619,9 +1613,9 @@ history_search(const char *str, int dire int history_search_prefix(const char *str, int direction) { - TYPE(HistEvent) ev; + HistEvent ev; - return (FUNW(history)(h, &ev, direction < 0 ? + return (history(h, &ev, direction < 0 ? H_PREV_STR : H_NEXT_STR, str)); } @@ -1635,33 +1629,31 @@ int history_search_pos(const char *str, int direction __attribute__((__unused__)), int pos) { - TYPE(HistEvent) ev; + HistEvent ev; int curr_num, off; - const Char *wstr; off = (pos > 0) ? pos : -pos; pos = (pos > 0) ? 1 : -1; - if (FUNW(history)(h, &ev, H_CURR) != 0) - return (-1); + if (history(h, &ev, H_CURR) != 0) + return -1; curr_num = ev.num; - if (history_set_pos(off) != 0 || FUNW(history)(h, &ev, H_CURR) != 0) - return (-1); + if (history_set_pos(off) != 0 || history(h, &ev, H_CURR) != 0) + return -1; - wstr = ct_decode_string(str, &conv); for (;;) { - if (Strstr(ev.str, wstr)) - return (off); - if (FUNW(history)(h, &ev, (pos < 0) ? H_PREV : H_NEXT) != 0) + if (strstr(ev.str, str)) + return off; + if (history(h, &ev, (pos < 0) ? H_PREV : H_NEXT) != 0) break; } /* set "current" pointer back to previous state */ - (void)FUNW(history)(h, &ev, + (void)history(h, &ev, pos < 0 ? H_NEXT_EVENT : H_PREV_EVENT, curr_num); - return (-1); + return -1; } @@ -1684,17 +1676,20 @@ filename_completion_function(const char * a completion generator for usernames; returns _first_ username * which starts with supplied text * text contains a partial username preceded by random character - * (usually '~'); state is ignored + * (usually '~'); state resets search from start (??? should we do that anyway) * it's callers responsibility to free returned value */ char * username_completion_function(const char *text, int state) { - struct passwd *pwd, pwres; +#if defined(HAVE_GETPW_R_POSIX) || defined(HAVE_GETPW_R_DRAFT) + struct passwd pwres; char pwbuf[1024]; +#endif + struct passwd *pass = NULL; if (text[0] == '\0') - return (NULL); + return NULL; if (*text == '~') text++; @@ -1702,15 +1697,21 @@ username_completion_function(const char if (state == 0) setpwent(); - while (getpwent_r(&pwres, pwbuf, sizeof(pwbuf), &pwd) == 0 - && pwd != NULL && text[0] == pwd->pw_name[0] - && strcmp(text, pwd->pw_name) == 0); + while ( +#if defined(HAVE_GETPW_R_POSIX) || defined(HAVE_GETPW_R_DRAFT) + getpwent_r(&pwres, pwbuf, sizeof(pwbuf), &pass) == 0 && pass != NULL +#else + (pass = getpwent()) != NULL +#endif + && text[0] == pass->pw_name[0] + && strcmp(text, pass->pw_name) == 0) + continue; - if (pwd == NULL) { + if (pass == NULL) { endpwent(); return NULL; } - return strdup(pwd->pw_name); + return strdup(pass->pw_name); } @@ -1743,7 +1744,7 @@ _rl_completion_append_character_function __attribute__((__unused__))) { static char buf[2]; - buf[0] = rl_completion_append_character; + buf[0] = (char)rl_completion_append_character; buf[1] = '\0'; return buf; } @@ -1759,6 +1760,7 @@ rl_complete(int ignore __attribute__((__ #ifdef WIDECHAR static ct_buffer_t wbreak_conv, sprefix_conv; #endif + char *breakchars; if (h == NULL || e == NULL) rl_initialize(); @@ -1768,19 +1770,26 @@ rl_complete(int ignore __attribute__((__ arr[0] = (char)invoking_key; arr[1] = '\0'; el_insertstr(e, arr); - return (CC_REFRESH); + return CC_REFRESH; } + if (rl_completion_word_break_hook != NULL) + breakchars = (*rl_completion_word_break_hook)(); + else + breakchars = rl_basic_word_break_characters; + /* Just look at how many global variables modify this operation! */ return fn_complete(e, (CPFunction *)rl_completion_entry_function, rl_attempted_completion_function, ct_decode_string(rl_basic_word_break_characters, &wbreak_conv), - ct_decode_string(rl_special_prefixes, &sprefix_conv), + ct_decode_string(breakchars, &sprefix_conv), _rl_completion_append_character_function, (size_t)rl_completion_query_items, &rl_completion_type, &rl_attempted_completion_over, &rl_point, &rl_end); + + } @@ -1811,7 +1820,7 @@ rl_bind_key(int c, rl_command_func_t *fu e->el_map.key[c] = ED_INSERT; retval = 0; } - return (retval); + return retval; } @@ -1827,7 +1836,7 @@ rl_read_key(void) if (e == NULL || h == NULL) rl_initialize(); - return (el_getc(e, fooarr)); + return el_getc(e, fooarr); } @@ -1857,32 +1866,33 @@ rl_insert(int count, int c) rl_initialize(); /* XXX - int -> char conversion can lose on multichars */ - arr[0] = c; + arr[0] = (char)c; arr[1] = '\0'; for (; count > 0; count--) el_push(e, arr); - return (0); + return 0; } int rl_insert_text(const char *text) { if (!text || *text == 0) - return (0); + return 0; if (h == NULL || e == NULL) rl_initialize(); if (el_insertstr(e, text) < 0) - return (0); + return 0; return (int)strlen(text); } /*ARGSUSED*/ int -rl_newline(int count, int c) +rl_newline(int count __attribute__((__unused__)), + int c __attribute__((__unused__))) { /* * Readline-4.0 appears to ignore the args. @@ -1892,7 +1902,7 @@ rl_newline(int count, int c) /*ARGSUSED*/ static unsigned char -rl_bind_wrapper(EditLine *el, unsigned char c) +rl_bind_wrapper(EditLine *el __attribute__((__unused__)), unsigned char c) { if (map[c] == NULL) return CC_ERROR; @@ -1917,12 +1927,12 @@ rl_add_defun(const char *name, Function map[(unsigned char)c] = fun; el_set(e, EL_ADDFN, name, name, rl_bind_wrapper); vis(dest, c, VIS_WHITE|VIS_NOSLASH, 0); - el_set(e, EL_BIND, dest, name); + el_set(e, EL_BIND, dest, name, NULL); return 0; } void -rl_callback_read_char() +rl_callback_read_char(void) { int count = 0, done = 0; const char *buf = el_gets(e, &count); @@ -1969,7 +1979,7 @@ void rl_redisplay(void) { char a[2]; - a[0] = e->el_tty.t_c[TS_IO][C_REPRINT]; + a[0] = (char)e->el_tty.t_c[TS_IO][C_REPRINT]; a[1] = '\0'; el_push(e, a); } @@ -1978,7 +1988,7 @@ int rl_get_previous_history(int count, int key) { char a[2]; - a[0] = key; + a[0] = (char)key; a[1] = '\0'; while (count--) el_push(e, a); @@ -1987,7 +1997,7 @@ rl_get_previous_history(int count, int k void /*ARGSUSED*/ -rl_prep_terminal(int meta_flag) +rl_prep_terminal(int meta_flag __attribute__((__unused__))) { el_set(e, EL_PREP_TERM, 1); } @@ -2001,7 +2011,7 @@ rl_deprep_terminal(void) int rl_read_init_file(const char *s) { - return(el_source(e, s)); + return el_source(e, s); } int @@ -2015,7 +2025,7 @@ rl_parse_and_bind(const char *line) tok_str(tok, line, &argc, &argv); argc = el_parse(e, argc, argv); tok_end(tok); - return (argc ? 1 : 0); + return argc ? 1 : 0; } int @@ -2025,7 +2035,7 @@ rl_variable_bind(const char *var, const * The proper return value is undocument, but this is what the * readline source seems to do. */ - return ((el_set(e, EL_BIND, "", var, value) == -1) ? 1 : 0); + return el_set(e, EL_BIND, "", var, value, NULL) == -1 ? 1 : 0; } void @@ -2033,7 +2043,7 @@ rl_stuff_char(int c) { char buf[2]; - buf[0] = c; + buf[0] = (char)c; buf[1] = '\0'; el_insertstr(e, buf); } @@ -2051,23 +2061,23 @@ _rl_event_read_char(EditLine *el, char * #if defined(FIONREAD) if (ioctl(el->el_infd, FIONREAD, &n) < 0) - return(-1); + return -1; if (n) - num_read = read(el->el_infd, cp, 1); + num_read = read(el->el_infd, cp, (size_t)1); else num_read = 0; #elif defined(F_SETFL) && defined(O_NDELAY) if ((n = fcntl(el->el_infd, F_GETFL, 0)) < 0) - return(-1); + return -1; if (fcntl(el->el_infd, F_SETFL, n|O_NDELAY) < 0) - return(-1); + return -1; num_read = read(el->el_infd, cp, 1); if (fcntl(el->el_infd, F_SETFL, n)) - return(-1); + return -1; #else /* not non-blocking, but what you gonna do? */ num_read = read(el->el_infd, cp, 1); - return(-1); + return -1; #endif if (num_read < 0 && errno == EAGAIN) @@ -2094,9 +2104,9 @@ void rl_get_screen_size(int *rows, int *cols) { if (rows) - el_get(e, EL_GETTC, "li", rows); + el_get(e, EL_GETTC, "li", rows, NULL); if (cols) - el_get(e, EL_GETTC, "co", cols); + el_get(e, EL_GETTC, "co", cols, NULL); } void @@ -2104,9 +2114,9 @@ rl_set_screen_size(int rows, int cols) { char buf[64]; (void)snprintf(buf, sizeof(buf), "%d", rows); - el_set(e, EL_SETTC, "li", buf); + el_set(e, EL_SETTC, "li", buf, NULL); (void)snprintf(buf, sizeof(buf), "%d", cols); - el_set(e, EL_SETTC, "co", buf); + el_set(e, EL_SETTC, "co", buf, NULL); } char ** @@ -2117,7 +2127,7 @@ rl_completion_matches(const char *str, r len = 1; max = 10; - if ((list = malloc(max * sizeof(*list))) == NULL) + if ((list = el_malloc(max * sizeof(*list))) == NULL) return NULL; while ((match = (*fun)(str, (int)(len - 1))) != NULL) { @@ -2125,7 +2135,7 @@ rl_completion_matches(const char *str, r if (len == max) { char **nl; max += 10; - if ((nl = realloc(list, max * sizeof(*nl))) == NULL) + if ((nl = el_realloc(list, max * sizeof(*nl))) == NULL) goto out; list = nl; } @@ -2152,7 +2162,7 @@ rl_completion_matches(const char *str, r if ((list[0] = strdup(str)) == NULL) goto out; } else { - if ((list[0] = malloc(min + 1)) == NULL) + if ((list[0] = el_malloc((min + 1) * sizeof(*list[0]))) == NULL) goto out; (void)memcpy(list[0], list[1], min); list[0][min] = '\0'; @@ -2160,7 +2170,7 @@ rl_completion_matches(const char *str, r return list; out: - free(list); + el_free(list); return NULL; } @@ -2195,15 +2205,16 @@ history_get_history_state(void) { HISTORY_STATE *hs; - if ((hs = malloc(sizeof(HISTORY_STATE))) == NULL) - return (NULL); + if ((hs = el_malloc(sizeof(*hs))) == NULL) + return NULL; hs->length = history_length; - return (hs); + return hs; } int /*ARGSUSED*/ -rl_kill_text(int from, int to) +rl_kill_text(int from __attribute__((__unused__)), + int to __attribute__((__unused__))) { return 0; } @@ -2222,20 +2233,25 @@ rl_get_keymap(void) void /*ARGSUSED*/ -rl_set_keymap(Keymap k) +rl_set_keymap(Keymap k __attribute__((__unused__))) { } int /*ARGSUSED*/ -rl_generic_bind(int type, const char * keyseq, const char * data, Keymap k) +rl_generic_bind(int type __attribute__((__unused__)), + const char * keyseq __attribute__((__unused__)), + const char * data __attribute__((__unused__)), + Keymap k __attribute__((__unused__))) { return 0; } int /*ARGSUSED*/ -rl_bind_key_in_map(int key, rl_command_func_t *fun, Keymap k) +rl_bind_key_in_map(int key __attribute__((__unused__)), + rl_command_func_t *fun __attribute__((__unused__)), + Keymap k __attribute__((__unused__))) { return 0; } @@ -2251,3 +2267,8 @@ rl_on_new_line(void) { return 0; } + +void +rl_free_line_state(void) +{ +}