diff options
author | Patrick Palka <patrick@parcs.ath.cx> | 2015-07-25 15:41:05 -0400 |
---|---|---|
committer | Patrick Palka <patrick@parcs.ath.cx> | 2015-07-25 15:57:00 -0400 |
commit | 5836a818eccb180d75c92ce4c861abb6fe8dec23 (patch) | |
tree | 624044ca5df5a6c192e47933a735ab4fe9aaea71 /readline/bind.c | |
parent | b8cc7b2e9afab37eb9a7cff0d3ae4ebbcf7d494f (diff) | |
download | gdb-5836a818eccb180d75c92ce4c861abb6fe8dec23.zip gdb-5836a818eccb180d75c92ce4c861abb6fe8dec23.tar.gz gdb-5836a818eccb180d75c92ce4c861abb6fe8dec23.tar.bz2 |
Revert "Sync readline/ to version 7.0 alpha"
This reverts commit b558ff043d41ba8d17a82f5f9ae5f9dade66160e.
This reverts commit 4a11f2065906976675808364ddbd1c0f77eea41f.
The initial import commit failed to retain local changes made to
readline's configure.in (and the commit message erroneously stated that
there were no local changes that needed to be reapplied). Also the
import caused a couple of build errors and a scattering of testsuite
regressions throughout many arches. It's probably better to start over
with this import, hopefully more carefully next time.
Diffstat (limited to 'readline/bind.c')
-rw-r--r-- | readline/bind.c | 342 |
1 files changed, 65 insertions, 277 deletions
diff --git a/readline/bind.c b/readline/bind.c index f88e5aa..a939528 100644 --- a/readline/bind.c +++ b/readline/bind.c @@ -1,6 +1,6 @@ /* bind.c -- key binding and startup file support for the readline library. */ -/* Copyright (C) 1987-2012 Free Software Foundation, Inc. +/* Copyright (C) 1987-2010 Free Software Foundation, Inc. This file is part of the GNU Readline Library (Readline), a library for reading lines of text with interactive input and history editing. @@ -72,15 +72,11 @@ extern char *strchr (), *strrchr (); /* Variables exported by this file. */ Keymap rl_binding_keymap; -static int _rl_skip_to_delim PARAMS((char *, int, int)); - static char *_rl_read_file PARAMS((char *, size_t *)); static void _rl_init_file_error PARAMS((const char *)); static int _rl_read_init_file PARAMS((const char *, int)); static int glean_key_from_name PARAMS((char *)); - static int find_boolean_var PARAMS((const char *)); -static int find_string_var PARAMS((const char *)); static char *_rl_get_string_variable_value PARAMS((const char *)); static int substring_member_of_array PARAMS((const char *, const char * const *)); @@ -117,9 +113,6 @@ rl_bind_key (key, function) int key; rl_command_func_t *function; { - char keyseq[3]; - int l; - if (key < 0) return (key); @@ -138,24 +131,8 @@ rl_bind_key (key, function) return (key); } - /* If it's bound to a function or macro, just overwrite. Otherwise we have - to treat it as a key sequence so rl_generic_bind handles shadow keymaps - for us. If we are binding '\' make sure to escape it so it makes it - through the call to rl_translate_keyseq. */ - if (_rl_keymap[key].type != ISKMAP) - { - _rl_keymap[key].type = ISFUNC; - _rl_keymap[key].function = function; - } - else - { - l = 0; - if (key == '\\') - keyseq[l++] = '\\'; - keyseq[l++] = key; - keyseq[l] = '\0'; - rl_bind_keyseq (keyseq, function); - } + _rl_keymap[key].type = ISFUNC; + _rl_keymap[key].function = function; rl_binding_keymap = _rl_keymap; return (0); } @@ -561,7 +538,7 @@ rl_translate_keyseq (seq, array, len) case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': i++; - for (temp = 2, c -= '0'; ISOCTAL ((unsigned char)seq[i]) && temp--; i++) + for (temp = 2, c -= '0'; ISOCTAL (seq[i]) && temp--; i++) c = (c * 8) + OCTVALUE (seq[i]); i--; /* auto-increment in for loop */ array[l++] = c & largest_char; @@ -590,40 +567,6 @@ rl_translate_keyseq (seq, array, len) return (0); } -static int -_rl_isescape (c) - int c; -{ - switch (c) - { - case '\007': - case '\b': - case '\f': - case '\n': - case '\r': - case TAB: - case 0x0b: return (1); - default: return (0); - } -} - -static int -_rl_escchar (c) - int c; -{ - switch (c) - { - case '\007': return ('a'); - case '\b': return ('b'); - case '\f': return ('f'); - case '\n': return ('n'); - case '\r': return ('r'); - case TAB: return ('t'); - case 0x0b: return ('v'); - default: return (c); - } -} - char * rl_untranslate_keyseq (seq) int seq; @@ -675,10 +618,9 @@ rl_untranslate_keyseq (seq) return kseq; } -char * -_rl_untranslate_macro_value (seq, use_escapes) +static char * +_rl_untranslate_macro_value (seq) char *seq; - int use_escapes; { char *ret, *r, *s; int c; @@ -702,14 +644,9 @@ _rl_untranslate_macro_value (seq, use_escapes) else if (CTRL_CHAR (c)) { *r++ = '\\'; - if (use_escapes && _rl_isescape (c)) - c = _rl_escchar (c); - else - { - *r++ = 'C'; - *r++ = '-'; - c = _rl_to_lower (UNCTRL (c)); - } + *r++ = 'C'; + *r++ = '-'; + c = _rl_to_lower (UNCTRL (c)); } else if (c == RUBOUT) { @@ -1220,38 +1157,6 @@ handle_parser_directive (statement) return (1); } -/* Start at STRING[START] and look for DELIM. Return I where STRING[I] == - DELIM or STRING[I] == 0. DELIM is usually a double quote. */ -static int -_rl_skip_to_delim (string, start, delim) - char *string; - int start, delim; -{ - int i, c, passc; - - for (i = start,passc = 0; c = string[i]; i++) - { - if (passc) - { - passc = 0; - if (c == 0) - break; - continue; - } - - if (c == '\\') - { - passc = 1; - continue; - } - - if (c == delim) - break; - } - - return i; -} - /* Read the binding command from STRING and perform it. A key binding command looks like: Keyname: function-name\0, a variable binding command looks like: set variable value. @@ -1267,7 +1172,7 @@ rl_parse_and_bind (string) while (string && whitespace (*string)) string++; - if (string == 0 || *string == 0 || *string == '#') + if (!string || !*string || *string == '#') return 0; /* If this is a parser directive, act on it. */ @@ -1287,16 +1192,31 @@ rl_parse_and_bind (string) backslash to quote characters in the key expression. */ if (*string == '"') { - i = _rl_skip_to_delim (string, 1, '"'); + int passc = 0; + for (i = 1; c = string[i]; i++) + { + if (passc) + { + passc = 0; + continue; + } + + if (c == '\\') + { + passc++; + continue; + } + + if (c == '"') + break; + } /* If we didn't find a closing quote, abort the line. */ if (string[i] == '\0') { _rl_init_file_error ("no closing `\"' in key binding"); return 1; } - else - i++; /* skip past closing double quote */ } /* Advance to the colon (:) or whitespace which separates the two objects. */ @@ -1316,7 +1236,6 @@ rl_parse_and_bind (string) if (_rl_stricmp (string, "set") == 0) { char *var, *value, *e; - int s; var = string + i; /* Make VAR point to start of variable name. */ @@ -1324,37 +1243,25 @@ rl_parse_and_bind (string) /* Make VALUE point to start of value string. */ value = var; - while (*value && whitespace (*value) == 0) value++; + while (*value && !whitespace (*value)) value++; if (*value) *value++ = '\0'; while (*value && whitespace (*value)) value++; - /* Strip trailing whitespace from values of boolean variables. */ - if (find_boolean_var (var) >= 0) + /* Strip trailing whitespace from values to boolean variables. Temp + fix until I get a real quoted-string parser here. */ + i = find_boolean_var (var); + if (i >= 0) { /* remove trailing whitespace */ -remove_trailing: e = value + strlen (value) - 1; while (e >= value && whitespace (*e)) e--; e++; /* skip back to whitespace or EOS */ - if (*e && e >= value) *e = '\0'; } - else if ((i = find_string_var (var)) >= 0) - { - /* Allow quoted strings in variable values */ - if (*value == '"') - { - i = _rl_skip_to_delim (value, 1, *value); - value[i] = '\0'; - value++; /* skip past the quote */ - } - else - goto remove_trailing; - } - + rl_variable_bind (var, value); return 0; } @@ -1375,13 +1282,32 @@ remove_trailing: the quoted string delimiter, like the shell. */ if (*funname == '\'' || *funname == '"') { - i = _rl_skip_to_delim (string, i+1, *funname); - if (string[i]) + int delimiter, passc; + + delimiter = string[i++]; + for (passc = 0; c = string[i]; i++) + { + if (passc) + { + passc = 0; + continue; + } + + if (c == '\\') + { + passc = 1; + continue; + } + + if (c == delimiter) + break; + } + if (c) i++; } /* Advance to the end of the string. */ - for (; string[i] && whitespace (string[i]) == 0; i++); + for (; string[i] && !whitespace (string[i]); i++); /* No extra whitespace at the end of the string. */ string[i] = '\0'; @@ -1441,7 +1367,7 @@ remove_trailing: /* Get the actual character we want to deal with. */ kname = strrchr (string, '-'); - if (kname == 0) + if (!kname) kname = string; else kname++; @@ -1497,16 +1423,11 @@ static const struct { { "bind-tty-special-chars", &_rl_bind_stty_chars, 0 }, { "blink-matching-paren", &rl_blink_matching_paren, V_SPECIAL }, { "byte-oriented", &rl_byte_oriented, 0 }, -#if defined (COLOR_SUPPORT) - { "colored-completion-prefix",&_rl_colored_completion_prefix, 0 }, - { "colored-stats", &_rl_colored_stats, 0 }, -#endif { "completion-ignore-case", &_rl_completion_case_fold, 0 }, { "completion-map-case", &_rl_completion_case_map, 0 }, { "convert-meta", &_rl_convert_meta_chars_to_ascii, 0 }, { "disable-completion", &rl_inhibit_completion, 0 }, { "echo-control-characters", &_rl_echo_control_chars, 0 }, - { "enable-bracketed-paste", &_rl_enable_bracketed_paste, 0 }, { "enable-keypad", &_rl_enable_keypad, 0 }, { "enable-meta-key", &_rl_enable_meta, 0 }, { "expand-tilde", &rl_complete_with_tilde_expansion, 0 }, @@ -1526,7 +1447,6 @@ static const struct { { "revert-all-at-newline", &_rl_revert_all_at_newline, 0 }, { "show-all-if-ambiguous", &_rl_complete_show_all, 0 }, { "show-all-if-unmodified", &_rl_complete_show_unmodified, 0 }, - { "show-mode-in-prompt", &_rl_show_mode_in_prompt, 0 }, { "skip-completed-text", &_rl_skip_completed_text, 0 }, #if defined (VISIBLE_STATS) { "visible-stats", &rl_visible_stats, 0 }, @@ -1566,8 +1486,6 @@ hack_special_boolean_var (i) else _rl_bell_preference = AUDIBLE_BELL; } - else if (_rl_stricmp (name, "show-mode-in-prompt") == 0) - _rl_reset_prompt (); } typedef int _rl_sv_func_t PARAMS((const char *)); @@ -1590,13 +1508,9 @@ static int sv_dispprefix PARAMS((const char *)); static int sv_compquery PARAMS((const char *)); static int sv_compwidth PARAMS((const char *)); static int sv_editmode PARAMS((const char *)); -static int sv_emacs_modestr PARAMS((const char *)); static int sv_histsize PARAMS((const char *)); static int sv_isrchterm PARAMS((const char *)); static int sv_keymap PARAMS((const char *)); -static int sv_seqtimeout PARAMS((const char *)); -static int sv_viins_modestr PARAMS((const char *)); -static int sv_vicmd_modestr PARAMS((const char *)); static const struct { const char * const name; @@ -1609,13 +1523,9 @@ static const struct { { "completion-prefix-display-length", V_INT, sv_dispprefix }, { "completion-query-items", V_INT, sv_compquery }, { "editing-mode", V_STRING, sv_editmode }, - { "emacs-mode-string", V_STRING, sv_emacs_modestr }, { "history-size", V_INT, sv_histsize }, { "isearch-terminators", V_STRING, sv_isrchterm }, { "keymap", V_STRING, sv_keymap }, - { "keyseq-timeout", V_INT, sv_seqtimeout }, - { "vi-cmd-mode-string", V_STRING, sv_vicmd_modestr }, - { "vi-ins-mode-string", V_STRING, sv_viins_modestr }, { (char *)NULL, 0, (_rl_sv_func_t *)0 } }; @@ -1632,7 +1542,7 @@ find_string_var (name) } /* A boolean value that can appear in a `set variable' command is true if - the value is null or empty, `on' (case-insensitive), or "1". Any other + the value is null or empty, `on' (case-insenstive), or "1". Any other values result in 0 (false). */ static int bool_to_int (value) @@ -1773,17 +1683,13 @@ static int sv_histsize (value) const char *value; { - int nval; + int nval = 500; - nval = 500; if (value && *value) { nval = atoi (value); if (nval < 0) - { - unstifle_history (); - return 0; - } + return 1; } stifle_history (nval); return 0; @@ -1805,23 +1711,6 @@ sv_keymap (value) } static int -sv_seqtimeout (value) - const char *value; -{ - int nval; - - nval = 0; - if (value && *value) - { - nval = atoi (value); - if (nval < 0) - nval = 0; - } - _rl_keyseq_timeout = nval; - return 0; -} - -static int sv_bell_style (value) const char *value; { @@ -1859,7 +1748,7 @@ sv_isrchterm (value) } else { - for (beg = end = 0; v[end] && whitespace (v[end]) == 0; end++) + for (beg = end = 0; whitespace (v[end]) == 0; end++) ; } @@ -1873,96 +1762,7 @@ sv_isrchterm (value) xfree (v); return 0; } - -extern char *_rl_emacs_mode_str; - -static int -sv_emacs_modestr (value) - const char *value; -{ - if (value && *value) - { - FREE (_rl_emacs_mode_str); - _rl_emacs_mode_str = (char *)xmalloc (2 * strlen (value) + 1); - rl_translate_keyseq (value, _rl_emacs_mode_str, &_rl_emacs_modestr_len); - _rl_emacs_mode_str[_rl_emacs_modestr_len] = '\0'; - return 0; - } - else if (value) - { - FREE (_rl_emacs_mode_str); - _rl_emacs_mode_str = (char *)xmalloc (1); - _rl_emacs_mode_str[_rl_emacs_modestr_len = 0] = '\0'; - return 0; - } - else if (value == 0) - { - FREE (_rl_emacs_mode_str); - _rl_emacs_mode_str = 0; /* prompt_modestr does the right thing */ - _rl_emacs_modestr_len = 0; - return 0; - } - return 1; -} - -static int -sv_viins_modestr (value) - const char *value; -{ - if (value && *value) - { - FREE (_rl_vi_ins_mode_str); - _rl_vi_ins_mode_str = (char *)xmalloc (2 * strlen (value) + 1); - rl_translate_keyseq (value, _rl_vi_ins_mode_str, &_rl_vi_ins_modestr_len); - _rl_vi_ins_mode_str[_rl_vi_ins_modestr_len] = '\0'; - return 0; - } - else if (value) - { - FREE (_rl_vi_ins_mode_str); - _rl_vi_ins_mode_str = (char *)xmalloc (1); - _rl_vi_ins_mode_str[_rl_vi_ins_modestr_len = 0] = '\0'; - return 0; - } - else if (value == 0) - { - FREE (_rl_vi_ins_mode_str); - _rl_vi_ins_mode_str = 0; /* prompt_modestr does the right thing */ - _rl_vi_ins_modestr_len = 0; - return 0; - } - return 1; -} - -static int -sv_vicmd_modestr (value) - const char *value; -{ - if (value && *value) - { - FREE (_rl_vi_cmd_mode_str); - _rl_vi_cmd_mode_str = (char *)xmalloc (2 * strlen (value) + 1); - rl_translate_keyseq (value, _rl_vi_cmd_mode_str, &_rl_vi_cmd_modestr_len); - _rl_vi_cmd_mode_str[_rl_vi_cmd_modestr_len] = '\0'; - return 0; - } - else if (value) - { - FREE (_rl_vi_cmd_mode_str); - _rl_vi_cmd_mode_str = (char *)xmalloc (1); - _rl_vi_cmd_mode_str[_rl_vi_cmd_modestr_len = 0] = '\0'; - return 0; - } - else if (value == 0) - { - FREE (_rl_vi_cmd_mode_str); - _rl_vi_cmd_mode_str = 0; /* prompt_modestr does the right thing */ - _rl_vi_cmd_modestr_len = 0; - return 0; - } - return 1; -} - + /* Return the character which matches NAME. For example, `Space' returns ' '. */ @@ -2367,8 +2167,7 @@ rl_function_dumper (print_readably) } } } - - xfree (names); + free (names); } /* Print all of the current functions and their bindings to @@ -2401,7 +2200,7 @@ _rl_macro_dumper_internal (print_readably, map, prefix) { case ISMACR: keyname = _rl_get_keyname (key); - out = _rl_untranslate_macro_value ((char *)map[key].function, 0); + out = _rl_untranslate_macro_value ((char *)map[key].function); if (print_readably) fprintf (rl_outstream, "\"%s%s\": \"%s\"\n", prefix ? prefix : "", @@ -2513,7 +2312,7 @@ _rl_get_string_variable_value (name) { if (_rl_isearch_terminators == 0) return 0; - ret = _rl_untranslate_macro_value (_rl_isearch_terminators, 0); + ret = _rl_untranslate_macro_value (_rl_isearch_terminators); if (ret) { strncpy (numbuf, ret, sizeof (numbuf) - 1); @@ -2531,17 +2330,6 @@ _rl_get_string_variable_value (name) ret = rl_get_keymap_name_from_edit_mode (); return (ret ? ret : "none"); } - else if (_rl_stricmp (name, "keyseq-timeout") == 0) - { - sprintf (numbuf, "%d", _rl_keyseq_timeout); - return (numbuf); - } - else if (_rl_stricmp (name, "emacs-mode-string") == 0) - return (_rl_emacs_mode_str ? _rl_emacs_mode_str : RL_EMACS_MODESTR_DEFAULT); - else if (_rl_stricmp (name, "vi-cmd-mode-string") == 0) - return (_rl_emacs_mode_str ? _rl_emacs_mode_str : RL_VI_CMD_MODESTR_DEFAULT); - else if (_rl_stricmp (name, "vi-ins-mode-string") == 0) - return (_rl_emacs_mode_str ? _rl_emacs_mode_str : RL_VI_INS_MODESTR_DEFAULT); else return (0); } |