/* 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.
/* 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 *));
int key;
rl_command_func_t *function;
{
- char keyseq[3];
- int l;
-
if (key < 0)
return (key);
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);
}
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;
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;
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;
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)
{
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.
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. */
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. */
if (_rl_stricmp (string, "set") == 0)
{
char *var, *value, *e;
- int s;
var = string + i;
/* Make VAR point to start of variable name. */
/* 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;
}
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';
/* Get the actual character we want to deal with. */
kname = strrchr (string, '-');
- if (kname == 0)
+ if (!kname)
kname = string;
else
kname++;
{ "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 },
{ "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 },
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 *));
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;
{ "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 }
};
}
/* 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)
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;
return 1;
}
-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;
}
else
{
- for (beg = end = 0; v[end] && whitespace (v[end]) == 0; end++)
+ for (beg = end = 0; whitespace (v[end]) == 0; end++)
;
}
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 ' '. */
}
}
}
-
- xfree (names);
+ free (names);
}
/* Print all of the current functions and their bindings to
{
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 : "",
{
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);
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);
}