version 1.1.1.1, 2014/07/30 08:16:45
|
version 1.1.1.2, 2021/03/17 01:01:01
|
Line 1
|
Line 1
|
/* bind.c -- key binding and startup file support for the readline library. */ |
/* bind.c -- key binding and startup file support for the readline library. */ |
|
|
/* Copyright (C) 1987-2012 Free Software Foundation, Inc. | /* Copyright (C) 1987-2020 Free Software Foundation, Inc. |
|
|
This file is part of the GNU Readline Library (Readline), a library |
This file is part of the GNU Readline Library (Readline), a library |
for reading lines of text with interactive input and history editing. |
for reading lines of text with interactive input and history editing. |
Line 74 Keymap rl_binding_keymap;
|
Line 74 Keymap rl_binding_keymap;
|
|
|
static int _rl_skip_to_delim PARAMS((char *, int, int)); |
static int _rl_skip_to_delim PARAMS((char *, int, int)); |
|
|
|
#if defined (USE_VARARGS) && defined (PREFER_STDARG) |
|
static void _rl_init_file_error (const char *, ...) __attribute__((__format__ (printf, 1, 2))); |
|
#else |
|
static void _rl_init_file_error (); |
|
#endif |
|
|
|
static rl_command_func_t *_rl_function_of_keyseq_internal PARAMS((const char *, size_t, Keymap, int *)); |
|
|
static char *_rl_read_file PARAMS((char *, size_t *)); |
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 _rl_read_init_file PARAMS((const char *, int)); |
static int glean_key_from_name PARAMS((char *)); |
static int glean_key_from_name PARAMS((char *)); |
|
|
static int find_boolean_var PARAMS((const char *)); |
static int find_boolean_var PARAMS((const char *)); |
static int find_string_var PARAMS((const char *)); |
static int find_string_var PARAMS((const char *)); |
|
|
|
static const char *boolean_varname PARAMS((int)); |
|
static const char *string_varname PARAMS((int)); |
|
|
static char *_rl_get_string_variable_value 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 *)); |
static int substring_member_of_array PARAMS((const char *, const char * const *)); |
|
|
|
static int _rl_get_keymap_by_name PARAMS((const char *)); |
|
static int _rl_get_keymap_by_map PARAMS((Keymap)); |
|
|
static int currently_reading_init_file; |
static int currently_reading_init_file; |
|
|
/* used only in this file */ |
/* used only in this file */ |
static int _rl_prefer_visible_bell = 1; |
static int _rl_prefer_visible_bell = 1; |
|
|
|
#define OP_EQ 1 |
|
#define OP_NE 2 |
|
#define OP_GT 3 |
|
#define OP_GE 4 |
|
#define OP_LT 5 |
|
#define OP_LE 6 |
|
|
|
#define OPSTART(c) ((c) == '=' || (c) == '!' || (c) == '<' || (c) == '>') |
|
#define CMPSTART(c) ((c) == '=' || (c) == '!') |
|
|
/* **************************************************************** */ |
/* **************************************************************** */ |
/* */ |
/* */ |
/* Binding keys */ |
/* Binding keys */ |
Line 100 static int _rl_prefer_visible_bell = 1;
|
Line 123 static int _rl_prefer_visible_bell = 1;
|
Add NAME to the list of named functions. Make FUNCTION be the function |
Add NAME to the list of named functions. Make FUNCTION be the function |
that gets called. If KEY is not -1, then bind it. */ |
that gets called. If KEY is not -1, then bind it. */ |
int |
int |
rl_add_defun (name, function, key) | rl_add_defun (const char *name, rl_command_func_t *function, int key) |
const char *name; | |
rl_command_func_t *function; | |
int key; | |
{ |
{ |
if (key != -1) |
if (key != -1) |
rl_bind_key (key, function); |
rl_bind_key (key, function); |
Line 113 rl_add_defun (name, function, key)
|
Line 133 rl_add_defun (name, function, key)
|
|
|
/* Bind KEY to FUNCTION. Returns non-zero if KEY is out of range. */ |
/* Bind KEY to FUNCTION. Returns non-zero if KEY is out of range. */ |
int |
int |
rl_bind_key (key, function) | rl_bind_key (int key, rl_command_func_t *function) |
int key; | |
rl_command_func_t *function; | |
{ |
{ |
if (key < 0) | char keyseq[4]; |
| int l; |
| |
| if (key < 0 || key > largest_char) |
return (key); |
return (key); |
|
|
|
/* Want to make this a multi-character key sequence with an ESC prefix */ |
if (META_CHAR (key) && _rl_convert_meta_chars_to_ascii) |
if (META_CHAR (key) && _rl_convert_meta_chars_to_ascii) |
{ |
{ |
if (_rl_keymap[ESC].type == ISKMAP) |
if (_rl_keymap[ESC].type == ISKMAP) |
Line 132 rl_bind_key (key, function)
|
Line 154 rl_bind_key (key, function)
|
escmap[key].function = function; |
escmap[key].function = function; |
return (0); |
return (0); |
} |
} |
return (key); | |
| /* Otherwise, let's just let rl_generic_bind handle the key sequence. |
| We start it off with ESC here and let the code below add the rest |
| of the sequence. */ |
| keyseq[0] = ESC; |
| l = 1; |
| key = UNMETA(key); |
| goto bind_keyseq; |
} |
} |
|
|
_rl_keymap[key].type = ISFUNC; | /* If it's bound to a function or macro, just overwrite. Otherwise we have |
_rl_keymap[key].function = function; | to treat it as a key sequence so rl_generic_bind handles shadow keymaps |
| for us. If we are binding '\' or \C-@ (NUL) make sure to escape it so |
| it makes it through the call to rl_translate_keyseq. */ |
| if (_rl_keymap[key].type != ISKMAP) |
| { |
| if (_rl_keymap[key].type == ISMACR) |
| xfree ((char *)_rl_keymap[key].function); |
| _rl_keymap[key].type = ISFUNC; |
| _rl_keymap[key].function = function; |
| } |
| else |
| { |
| l = 0; |
| bind_keyseq: |
| if (key == '\\') |
| { |
| keyseq[l++] = '\\'; |
| keyseq[l++] = '\\'; |
| } |
| else if (key == '\0') |
| { |
| keyseq[l++] = '\\'; |
| keyseq[l++] = '0'; |
| } |
| else |
| keyseq[l++] = key; |
| keyseq[l] = '\0'; |
| rl_bind_keyseq (keyseq, function); |
| } |
rl_binding_keymap = _rl_keymap; |
rl_binding_keymap = _rl_keymap; |
return (0); |
return (0); |
} |
} |
Line 144 rl_bind_key (key, function)
|
Line 201 rl_bind_key (key, function)
|
/* Bind KEY to FUNCTION in MAP. Returns non-zero in case of invalid |
/* Bind KEY to FUNCTION in MAP. Returns non-zero in case of invalid |
KEY. */ |
KEY. */ |
int |
int |
rl_bind_key_in_map (key, function, map) | rl_bind_key_in_map (int key, rl_command_func_t *function, Keymap map) |
int key; | |
rl_command_func_t *function; | |
Keymap map; | |
{ |
{ |
int result; |
int result; |
Keymap oldmap; |
Keymap oldmap; |
Line 160 rl_bind_key_in_map (key, function, map)
|
Line 214 rl_bind_key_in_map (key, function, map)
|
} |
} |
|
|
/* Bind key sequence KEYSEQ to DEFAULT_FUNC if KEYSEQ is unbound. Right |
/* Bind key sequence KEYSEQ to DEFAULT_FUNC if KEYSEQ is unbound. Right |
now, this is always used to attempt to bind the arrow keys, hence the | now, this is always used to attempt to bind the arrow keys. */ |
check for rl_vi_movement_mode. */ | |
int |
int |
rl_bind_key_if_unbound_in_map (key, default_func, kmap) | rl_bind_key_if_unbound_in_map (int key, rl_command_func_t *default_func, Keymap kmap) |
int key; | |
rl_command_func_t *default_func; | |
Keymap kmap; | |
{ |
{ |
char keyseq[2]; | char *keyseq; |
|
|
keyseq[0] = (unsigned char)key; | keyseq = rl_untranslate_keyseq ((unsigned char)key); |
keyseq[1] = '\0'; | |
return (rl_bind_keyseq_if_unbound_in_map (keyseq, default_func, kmap)); |
return (rl_bind_keyseq_if_unbound_in_map (keyseq, default_func, kmap)); |
} |
} |
|
|
int |
int |
rl_bind_key_if_unbound (key, default_func) | rl_bind_key_if_unbound (int key, rl_command_func_t *default_func) |
int key; | |
rl_command_func_t *default_func; | |
{ |
{ |
char keyseq[2]; | char *keyseq; |
|
|
keyseq[0] = (unsigned char)key; | keyseq = rl_untranslate_keyseq ((unsigned char)key); |
keyseq[1] = '\0'; | |
return (rl_bind_keyseq_if_unbound_in_map (keyseq, default_func, _rl_keymap)); |
return (rl_bind_keyseq_if_unbound_in_map (keyseq, default_func, _rl_keymap)); |
} |
} |
|
|
/* Make KEY do nothing in the currently selected keymap. |
/* Make KEY do nothing in the currently selected keymap. |
Returns non-zero in case of error. */ | Returns non-zero in case of error. This is not the same as self-insert; |
| this makes it a dead key. */ |
int |
int |
rl_unbind_key (key) | rl_unbind_key (int key) |
int key; | |
{ |
{ |
return (rl_bind_key (key, (rl_command_func_t *)NULL)); |
return (rl_bind_key (key, (rl_command_func_t *)NULL)); |
} |
} |
|
|
/* Make KEY do nothing in MAP. | /* Make KEY do nothing in MAP. Returns non-zero in case of error. */ |
Returns non-zero in case of error. */ | |
int |
int |
rl_unbind_key_in_map (key, map) | rl_unbind_key_in_map (int key, Keymap map) |
int key; | |
Keymap map; | |
{ |
{ |
return (rl_bind_key_in_map (key, (rl_command_func_t *)NULL, map)); |
return (rl_bind_key_in_map (key, (rl_command_func_t *)NULL, map)); |
} |
} |
|
|
/* Unbind all keys bound to FUNCTION in MAP. */ |
/* Unbind all keys bound to FUNCTION in MAP. */ |
int |
int |
rl_unbind_function_in_map (func, map) | rl_unbind_function_in_map (rl_command_func_t *func, Keymap map) |
rl_command_func_t *func; | |
Keymap map; | |
{ |
{ |
register int i, rval; |
register int i, rval; |
|
|
Line 221 rl_unbind_function_in_map (func, map)
|
Line 262 rl_unbind_function_in_map (func, map)
|
map[i].function = (rl_command_func_t *)NULL; |
map[i].function = (rl_command_func_t *)NULL; |
rval = 1; |
rval = 1; |
} |
} |
|
else if (map[i].type == ISKMAP) /* TAG:readline-8.1 */ |
|
{ |
|
int r; |
|
r = rl_unbind_function_in_map (func, FUNCTION_TO_KEYMAP (map, i)); |
|
if (r == 1) |
|
rval = 1; |
|
} |
} |
} |
return rval; |
return rval; |
} |
} |
|
|
|
/* Unbind all keys bound to COMMAND, which is a bindable command name, in MAP */ |
int |
int |
rl_unbind_command_in_map (command, map) | rl_unbind_command_in_map (const char *command, Keymap map) |
const char *command; | |
Keymap map; | |
{ |
{ |
rl_command_func_t *func; |
rl_command_func_t *func; |
|
|
Line 242 rl_unbind_command_in_map (command, map)
|
Line 289 rl_unbind_command_in_map (command, map)
|
FUNCTION, starting in the current keymap. This makes new |
FUNCTION, starting in the current keymap. This makes new |
keymaps as necessary. */ |
keymaps as necessary. */ |
int |
int |
rl_bind_keyseq (keyseq, function) | rl_bind_keyseq (const char *keyseq, rl_command_func_t *function) |
const char *keyseq; | |
rl_command_func_t *function; | |
{ |
{ |
return (rl_generic_bind (ISFUNC, keyseq, (char *)function, _rl_keymap)); |
return (rl_generic_bind (ISFUNC, keyseq, (char *)function, _rl_keymap)); |
} |
} |
Line 253 rl_bind_keyseq (keyseq, function)
|
Line 298 rl_bind_keyseq (keyseq, function)
|
FUNCTION. This makes new keymaps as necessary. The initial |
FUNCTION. This makes new keymaps as necessary. The initial |
place to do bindings is in MAP. */ |
place to do bindings is in MAP. */ |
int |
int |
rl_bind_keyseq_in_map (keyseq, function, map) | rl_bind_keyseq_in_map (const char *keyseq, rl_command_func_t *function, Keymap map) |
const char *keyseq; | |
rl_command_func_t *function; | |
Keymap map; | |
{ |
{ |
return (rl_generic_bind (ISFUNC, keyseq, (char *)function, map)); |
return (rl_generic_bind (ISFUNC, keyseq, (char *)function, map)); |
} |
} |
|
|
/* Backwards compatibility; equivalent to rl_bind_keyseq_in_map() */ |
/* Backwards compatibility; equivalent to rl_bind_keyseq_in_map() */ |
int |
int |
rl_set_key (keyseq, function, map) | rl_set_key (const char *keyseq, rl_command_func_t *function, Keymap map) |
const char *keyseq; | |
rl_command_func_t *function; | |
Keymap map; | |
{ |
{ |
return (rl_generic_bind (ISFUNC, keyseq, (char *)function, map)); |
return (rl_generic_bind (ISFUNC, keyseq, (char *)function, map)); |
} |
} |
Line 275 rl_set_key (keyseq, function, map)
|
Line 314 rl_set_key (keyseq, function, map)
|
now, this is always used to attempt to bind the arrow keys, hence the |
now, this is always used to attempt to bind the arrow keys, hence the |
check for rl_vi_movement_mode. */ |
check for rl_vi_movement_mode. */ |
int |
int |
rl_bind_keyseq_if_unbound_in_map (keyseq, default_func, kmap) | rl_bind_keyseq_if_unbound_in_map (const char *keyseq, rl_command_func_t *default_func, Keymap kmap) |
const char *keyseq; | |
rl_command_func_t *default_func; | |
Keymap kmap; | |
{ |
{ |
rl_command_func_t *func; |
rl_command_func_t *func; |
|
char *keys; |
|
int keys_len; |
|
|
if (keyseq) |
if (keyseq) |
{ |
{ |
func = rl_function_of_keyseq (keyseq, kmap, (int *)NULL); | /* Handle key sequences that require translations and `raw' ones that |
| don't. This might be a problem with backslashes. */ |
| keys = (char *)xmalloc (1 + (2 * strlen (keyseq))); |
| if (rl_translate_keyseq (keyseq, keys, &keys_len)) |
| { |
| xfree (keys); |
| return -1; |
| } |
| func = rl_function_of_keyseq_len (keys, keys_len, kmap, (int *)NULL); |
| xfree (keys); |
#if defined (VI_MODE) |
#if defined (VI_MODE) |
if (!func || func == rl_do_lowercase_version || func == rl_vi_movement_mode) |
if (!func || func == rl_do_lowercase_version || func == rl_vi_movement_mode) |
#else |
#else |
Line 298 rl_bind_keyseq_if_unbound_in_map (keyseq, default_func
|
Line 345 rl_bind_keyseq_if_unbound_in_map (keyseq, default_func
|
} |
} |
|
|
int |
int |
rl_bind_keyseq_if_unbound (keyseq, default_func) | rl_bind_keyseq_if_unbound (const char *keyseq, rl_command_func_t *default_func) |
const char *keyseq; | |
rl_command_func_t *default_func; | |
{ |
{ |
return (rl_bind_keyseq_if_unbound_in_map (keyseq, default_func, _rl_keymap)); |
return (rl_bind_keyseq_if_unbound_in_map (keyseq, default_func, _rl_keymap)); |
} |
} |
Line 309 rl_bind_keyseq_if_unbound (keyseq, default_func)
|
Line 354 rl_bind_keyseq_if_unbound (keyseq, default_func)
|
the string of characters MACRO. This makes new keymaps as |
the string of characters MACRO. This makes new keymaps as |
necessary. The initial place to do bindings is in MAP. */ |
necessary. The initial place to do bindings is in MAP. */ |
int |
int |
rl_macro_bind (keyseq, macro, map) | rl_macro_bind (const char *keyseq, const char *macro, Keymap map) |
const char *keyseq, *macro; | |
Keymap map; | |
{ |
{ |
char *macro_keys; |
char *macro_keys; |
int macro_keys_len; |
int macro_keys_len; |
Line 333 rl_macro_bind (keyseq, macro, map)
|
Line 376 rl_macro_bind (keyseq, macro, map)
|
a macro (ISMACR), or a keymap (ISKMAP). This makes new keymaps |
a macro (ISMACR), or a keymap (ISKMAP). This makes new keymaps |
as necessary. The initial place to do bindings is in MAP. */ |
as necessary. The initial place to do bindings is in MAP. */ |
int |
int |
rl_generic_bind (type, keyseq, data, map) | rl_generic_bind (int type, const char *keyseq, char *data, Keymap map) |
int type; | |
const char *keyseq; | |
char *data; | |
Keymap map; | |
{ |
{ |
char *keys; |
char *keys; |
int keys_len; | int keys_len, prevkey, ic; |
register int i; |
register int i; |
KEYMAP_ENTRY k; |
KEYMAP_ENTRY k; |
|
Keymap prevmap; |
|
|
k.function = 0; |
k.function = 0; |
|
|
Line 365 rl_generic_bind (type, keyseq, data, map)
|
Line 405 rl_generic_bind (type, keyseq, data, map)
|
return -1; |
return -1; |
} |
} |
|
|
|
prevmap = map; |
|
prevkey = keys[0]; |
|
|
/* Bind keys, making new keymaps as necessary. */ |
/* Bind keys, making new keymaps as necessary. */ |
for (i = 0; i < keys_len; i++) |
for (i = 0; i < keys_len; i++) |
{ |
{ |
unsigned char uc = keys[i]; |
unsigned char uc = keys[i]; |
int ic; |
|
|
|
|
if (i > 0) |
|
prevkey = ic; |
|
|
ic = uc; |
ic = uc; |
if (ic < 0 || ic >= KEYMAP_SIZE) |
if (ic < 0 || ic >= KEYMAP_SIZE) |
{ |
{ |
Line 378 rl_generic_bind (type, keyseq, data, map)
|
Line 423 rl_generic_bind (type, keyseq, data, map)
|
return -1; |
return -1; |
} |
} |
|
|
|
/* We now rely on rl_translate_keyseq to do this conversion, so this |
|
check is superfluous. */ |
|
#if 0 |
if (META_CHAR (ic) && _rl_convert_meta_chars_to_ascii) |
if (META_CHAR (ic) && _rl_convert_meta_chars_to_ascii) |
{ |
{ |
ic = UNMETA (ic); |
ic = UNMETA (ic); |
if (map[ESC].type == ISKMAP) |
if (map[ESC].type == ISKMAP) |
map = FUNCTION_TO_KEYMAP (map, ESC); | { |
| prevmap = map; |
| map = FUNCTION_TO_KEYMAP (map, ESC); |
| } |
} |
} |
|
#endif |
|
|
if ((i + 1) < keys_len) |
if ((i + 1) < keys_len) |
{ |
{ |
Line 401 rl_generic_bind (type, keyseq, data, map)
|
Line 453 rl_generic_bind (type, keyseq, data, map)
|
map[ic].type = ISKMAP; |
map[ic].type = ISKMAP; |
map[ic].function = KEYMAP_TO_FUNCTION (rl_make_bare_keymap()); |
map[ic].function = KEYMAP_TO_FUNCTION (rl_make_bare_keymap()); |
} |
} |
|
prevmap = map; |
map = FUNCTION_TO_KEYMAP (map, ic); |
map = FUNCTION_TO_KEYMAP (map, ic); |
/* The dispatch code will return this function if no matching |
/* The dispatch code will return this function if no matching |
key sequence is found in the keymap. This (with a little |
key sequence is found in the keymap. This (with a little |
Line 416 rl_generic_bind (type, keyseq, data, map)
|
Line 469 rl_generic_bind (type, keyseq, data, map)
|
} |
} |
else |
else |
{ |
{ |
if (map[ic].type == ISMACR) | if (map[ic].type == ISKMAP) |
xfree ((char *)map[ic].function); | |
else if (map[ic].type == ISKMAP) | |
{ |
{ |
|
prevmap = map; |
map = FUNCTION_TO_KEYMAP (map, ic); |
map = FUNCTION_TO_KEYMAP (map, ic); |
ic = ANYOTHERKEY; |
ic = ANYOTHERKEY; |
/* If we're trying to override a keymap with a null function |
/* If we're trying to override a keymap with a null function |
Line 430 rl_generic_bind (type, keyseq, data, map)
|
Line 482 rl_generic_bind (type, keyseq, data, map)
|
if (type == ISFUNC && data == 0) |
if (type == ISFUNC && data == 0) |
data = (char *)_rl_null_function; |
data = (char *)_rl_null_function; |
} |
} |
|
if (map[ic].type == ISMACR) |
|
xfree ((char *)map[ic].function); |
|
|
map[ic].function = KEYMAP_TO_FUNCTION (data); |
map[ic].function = KEYMAP_TO_FUNCTION (data); |
map[ic].type = type; |
map[ic].type = type; |
} |
} |
|
|
rl_binding_keymap = map; |
rl_binding_keymap = map; |
|
|
} |
} |
|
|
|
/* If we unbound a key (type == ISFUNC, data == 0), and the prev keymap |
|
points to the keymap where we unbound the key (sanity check), and the |
|
current binding keymap is empty (rl_empty_keymap() returns non-zero), |
|
and the binding keymap has ANYOTHERKEY set with type == ISFUNC |
|
(overridden function), delete the now-empty keymap, take the previously- |
|
overridden function and remove the override. */ |
|
/* Right now, this only works one level back. */ |
|
if (type == ISFUNC && data == 0 && |
|
prevmap[prevkey].type == ISKMAP && |
|
(FUNCTION_TO_KEYMAP(prevmap, prevkey) == rl_binding_keymap) && |
|
rl_binding_keymap[ANYOTHERKEY].type == ISFUNC && |
|
rl_empty_keymap (rl_binding_keymap)) |
|
{ |
|
prevmap[prevkey].type = rl_binding_keymap[ANYOTHERKEY].type; |
|
prevmap[prevkey].function = rl_binding_keymap[ANYOTHERKEY].function; |
|
rl_discard_keymap (rl_binding_keymap); |
|
rl_binding_keymap = prevmap; |
|
} |
|
|
xfree (keys); |
xfree (keys); |
return 0; |
return 0; |
} |
} |
Line 445 rl_generic_bind (type, keyseq, data, map)
|
Line 520 rl_generic_bind (type, keyseq, data, map)
|
an array of characters. LEN gets the final length of ARRAY. Return |
an array of characters. LEN gets the final length of ARRAY. Return |
non-zero if there was an error parsing SEQ. */ |
non-zero if there was an error parsing SEQ. */ |
int |
int |
rl_translate_keyseq (seq, array, len) | rl_translate_keyseq (const char *seq, char *array, int *len) |
const char *seq; | |
char *array; | |
int *len; | |
{ |
{ |
register int i, c, l, temp; | register int i, l, temp; |
| int has_control, has_meta; |
| unsigned char c; |
|
|
for (i = l = 0; c = seq[i]; i++) | has_control = 0; |
| has_meta = 0; |
| |
| /* When there are incomplete prefixes \C- or \M- (has_control || has_meta) |
| without base character at the end of SEQ, they are processed as the |
| prefixes for '\0'. |
| */ |
| for (i = l = 0; (c = seq[i]) || has_control || has_meta; i++) |
{ |
{ |
if (c == '\\') | /* Only backslashes followed by a non-null character are handled |
| specially. Trailing backslash (backslash followed by '\0') is |
| processed as a normal character. |
| */ |
| if (c == '\\' && seq[i + 1] != '\0') |
{ |
{ |
c = seq[++i]; |
c = seq[++i]; |
|
|
if (c == 0) |
|
break; |
|
|
|
/* Handle \C- and \M- prefixes. */ |
/* Handle \C- and \M- prefixes. */ |
if ((c == 'C' || c == 'M') && seq[i + 1] == '-') | if (c == 'C' && seq[i + 1] == '-') |
{ |
{ |
/* Handle special case of backwards define. */ | i++; |
if (strncmp (&seq[i], "C-\\M-", 5) == 0) | has_control = 1; |
{ | |
array[l++] = ESC; /* ESC is meta-prefix */ | |
i += 5; | |
array[l++] = CTRL (_rl_to_upper (seq[i])); | |
if (seq[i] == '\0') | |
i--; | |
} | |
else if (c == 'M') | |
{ | |
i++; /* seq[i] == '-' */ | |
/* XXX - obey convert-meta setting */ | |
if (_rl_convert_meta_chars_to_ascii && _rl_keymap[ESC].type == ISKMAP) | |
array[l++] = ESC; /* ESC is meta-prefix */ | |
else if (seq[i+1] == '\\' && seq[i+2] == 'C' && seq[i+3] == '-') | |
{ | |
i += 4; | |
temp = (seq[i] == '?') ? RUBOUT : CTRL (_rl_to_upper (seq[i])); | |
array[l++] = META (temp); | |
} | |
else | |
{ | |
/* This doesn't yet handle things like \M-\a, which may | |
or may not have any reasonable meaning. You're | |
probably better off using straight octal or hex. */ | |
i++; | |
array[l++] = META (seq[i]); | |
} | |
} | |
else if (c == 'C') | |
{ | |
i += 2; | |
/* Special hack for C-?... */ | |
array[l++] = (seq[i] == '?') ? RUBOUT : CTRL (_rl_to_upper (seq[i])); | |
} | |
continue; |
continue; |
|
} |
|
else if (c == 'M' && seq[i + 1] == '-') |
|
{ |
|
i++; |
|
has_meta = 1; |
|
continue; |
} |
} |
|
|
/* Translate other backslash-escaped characters. These are the |
/* Translate other backslash-escaped characters. These are the |
Line 510 rl_translate_keyseq (seq, array, len)
|
Line 564 rl_translate_keyseq (seq, array, len)
|
switch (c) |
switch (c) |
{ |
{ |
case 'a': |
case 'a': |
array[l++] = '\007'; | c = '\007'; |
break; |
break; |
case 'b': |
case 'b': |
array[l++] = '\b'; | c = '\b'; |
break; |
break; |
case 'd': |
case 'd': |
array[l++] = RUBOUT; /* readline-specific */ | c = RUBOUT; /* readline-specific */ |
break; |
break; |
case 'e': |
case 'e': |
array[l++] = ESC; | c = ESC; |
break; |
break; |
case 'f': |
case 'f': |
array[l++] = '\f'; | c = '\f'; |
break; |
break; |
case 'n': |
case 'n': |
array[l++] = NEWLINE; | c = NEWLINE; |
break; |
break; |
case 'r': |
case 'r': |
array[l++] = RETURN; | c = RETURN; |
break; |
break; |
case 't': |
case 't': |
array[l++] = TAB; | c = TAB; |
break; |
break; |
case 'v': |
case 'v': |
array[l++] = 0x0B; | c = 0x0B; |
break; |
break; |
case '\\': |
case '\\': |
array[l++] = '\\'; | c = '\\'; |
break; |
break; |
case '0': case '1': case '2': case '3': |
case '0': case '1': case '2': case '3': |
case '4': case '5': case '6': case '7': |
case '4': case '5': case '6': case '7': |
i++; |
i++; |
for (temp = 2, c -= '0'; ISOCTAL (seq[i]) && temp--; i++) | for (temp = 2, c -= '0'; ISOCTAL ((unsigned char)seq[i]) && temp--; i++) |
c = (c * 8) + OCTVALUE (seq[i]); |
c = (c * 8) + OCTVALUE (seq[i]); |
i--; /* auto-increment in for loop */ |
i--; /* auto-increment in for loop */ |
array[l++] = c & largest_char; | c &= largest_char; |
break; |
break; |
case 'x': |
case 'x': |
i++; |
i++; |
Line 554 rl_translate_keyseq (seq, array, len)
|
Line 608 rl_translate_keyseq (seq, array, len)
|
if (temp == 2) |
if (temp == 2) |
c = 'x'; |
c = 'x'; |
i--; /* auto-increment in for loop */ |
i--; /* auto-increment in for loop */ |
array[l++] = c & largest_char; | c &= largest_char; |
break; |
break; |
default: /* backslashes before non-special chars just add the char */ |
default: /* backslashes before non-special chars just add the char */ |
array[l++] = c; | c &= largest_char; |
break; /* the backslash is stripped */ |
break; /* the backslash is stripped */ |
} |
} |
continue; |
|
} |
} |
|
|
array[l++] = c; | /* Process \C- and \M- flags */ |
| if (has_control) |
| { |
| /* Special treatment for C-? */ |
| c = (c == '?') ? RUBOUT : CTRL (_rl_to_upper (c)); |
| has_control = 0; |
| } |
| if (has_meta) |
| { |
| c = META (c); |
| has_meta = 0; |
| } |
| |
| /* If convert-meta is turned on, convert a meta char to a key sequence */ |
| if (META_CHAR (c) && _rl_convert_meta_chars_to_ascii) |
| { |
| array[l++] = ESC; /* ESC is meta-prefix */ |
| array[l++] = UNMETA (c); |
| } |
| else |
| array[l++] = (c); |
| |
| /* Null characters may be processed for incomplete prefixes at the end of |
| sequence */ |
| if (seq[i] == '\0') |
| break; |
} |
} |
|
|
*len = l; |
*len = l; |
Line 572 rl_translate_keyseq (seq, array, len)
|
Line 650 rl_translate_keyseq (seq, array, len)
|
} |
} |
|
|
static int |
static int |
_rl_isescape (c) | _rl_isescape (int c) |
int c; | |
{ |
{ |
switch (c) |
switch (c) |
{ |
{ |
Line 589 _rl_isescape (c)
|
Line 666 _rl_isescape (c)
|
} |
} |
|
|
static int |
static int |
_rl_escchar (c) | _rl_escchar (int c) |
int c; | |
{ |
{ |
switch (c) |
switch (c) |
{ |
{ |
Line 606 _rl_escchar (c)
|
Line 682 _rl_escchar (c)
|
} |
} |
|
|
char * |
char * |
rl_untranslate_keyseq (seq) | rl_untranslate_keyseq (int seq) |
int seq; | |
{ |
{ |
static char kseq[16]; |
static char kseq[16]; |
int i, c; |
int i, c; |
Line 657 rl_untranslate_keyseq (seq)
|
Line 732 rl_untranslate_keyseq (seq)
|
} |
} |
|
|
char * |
char * |
_rl_untranslate_macro_value (seq, use_escapes) | _rl_untranslate_macro_value (char *seq, int use_escapes) |
char *seq; | |
int use_escapes; | |
{ |
{ |
char *ret, *r, *s; |
char *ret, *r, *s; |
int c; |
int c; |
Line 716 _rl_untranslate_macro_value (seq, use_escapes)
|
Line 789 _rl_untranslate_macro_value (seq, use_escapes)
|
|
|
/* Return a pointer to the function that STRING represents. |
/* Return a pointer to the function that STRING represents. |
If STRING doesn't have a matching function, then a NULL pointer |
If STRING doesn't have a matching function, then a NULL pointer |
is returned. */ | is returned. The string match is case-insensitive. */ |
rl_command_func_t * |
rl_command_func_t * |
rl_named_function (string) | rl_named_function (const char *string) |
const char *string; | |
{ |
{ |
register int i; |
register int i; |
|
|
Line 736 rl_named_function (string)
|
Line 808 rl_named_function (string)
|
used. TYPE, if non-NULL, is a pointer to an int which will receive the |
used. TYPE, if non-NULL, is a pointer to an int which will receive the |
type of the object pointed to. One of ISFUNC (function), ISKMAP (keymap), |
type of the object pointed to. One of ISFUNC (function), ISKMAP (keymap), |
or ISMACR (macro). */ |
or ISMACR (macro). */ |
rl_command_func_t * | static rl_command_func_t * |
rl_function_of_keyseq (keyseq, map, type) | _rl_function_of_keyseq_internal (const char *keyseq, size_t len, Keymap map, int *type) |
const char *keyseq; | |
Keymap map; | |
int *type; | |
{ |
{ |
register int i; |
register int i; |
|
|
if (map == 0) |
if (map == 0) |
map = _rl_keymap; |
map = _rl_keymap; |
|
|
for (i = 0; keyseq && keyseq[i]; i++) | for (i = 0; keyseq && i < len; i++) |
{ |
{ |
unsigned char ic = keyseq[i]; |
unsigned char ic = keyseq[i]; |
|
|
Line 773 rl_function_of_keyseq (keyseq, map, type)
|
Line 842 rl_function_of_keyseq (keyseq, map, type)
|
{ |
{ |
/* If this is the last key in the key sequence, return the |
/* If this is the last key in the key sequence, return the |
map. */ |
map. */ |
if (keyseq[i + 1] == '\0') | if (i + 1 == len) |
{ |
{ |
if (type) |
if (type) |
*type = ISKMAP; |
*type = ISKMAP; |
Line 786 rl_function_of_keyseq (keyseq, map, type)
|
Line 855 rl_function_of_keyseq (keyseq, map, type)
|
/* If we're not at the end of the key sequence, and the current key |
/* If we're not at the end of the key sequence, and the current key |
is bound to something other than a keymap, then the entire key |
is bound to something other than a keymap, then the entire key |
sequence is not bound. */ |
sequence is not bound. */ |
else if (map[ic].type != ISKMAP && keyseq[i+1]) | else if (map[ic].type != ISKMAP && i+1 < len) |
return ((rl_command_func_t *)NULL); |
return ((rl_command_func_t *)NULL); |
else /* map[ic].type != ISKMAP && keyseq[i+1] == 0 */ | else /* map[ic].type != ISKMAP && i+1 == len */ |
{ |
{ |
if (type) |
if (type) |
*type = map[ic].type; |
*type = map[ic].type; |
Line 799 rl_function_of_keyseq (keyseq, map, type)
|
Line 868 rl_function_of_keyseq (keyseq, map, type)
|
return ((rl_command_func_t *) NULL); |
return ((rl_command_func_t *) NULL); |
} |
} |
|
|
|
rl_command_func_t * |
|
rl_function_of_keyseq (const char *keyseq, Keymap map, int *type) |
|
{ |
|
return _rl_function_of_keyseq_internal (keyseq, strlen (keyseq), map, type); |
|
} |
|
|
|
rl_command_func_t * |
|
rl_function_of_keyseq_len (const char *keyseq, size_t len, Keymap map, int *type) |
|
{ |
|
return _rl_function_of_keyseq_internal (keyseq, len, map, type); |
|
} |
|
|
/* The last key bindings file read. */ |
/* The last key bindings file read. */ |
static char *last_readline_init_file = (char *)NULL; |
static char *last_readline_init_file = (char *)NULL; |
|
|
Line 811 static int current_readline_init_lineno;
|
Line 892 static int current_readline_init_lineno;
|
The size of the buffer is returned in *SIZEP. Returns NULL if any |
The size of the buffer is returned in *SIZEP. Returns NULL if any |
errors were encountered. */ |
errors were encountered. */ |
static char * |
static char * |
_rl_read_file (filename, sizep) | _rl_read_file (char *filename, size_t *sizep) |
char *filename; | |
size_t *sizep; | |
{ |
{ |
struct stat finfo; |
struct stat finfo; |
size_t file_size; |
size_t file_size; |
char *buffer; |
char *buffer; |
int i, file; |
int i, file; |
|
|
if ((stat (filename, &finfo) < 0) || (file = open (filename, O_RDONLY, 0666)) < 0) | file = -1; |
return ((char *)NULL); | if (((file = open (filename, O_RDONLY, 0666)) < 0) || (fstat (file, &finfo) < 0)) |
| { |
| if (file >= 0) |
| close (file); |
| return ((char *)NULL); |
| } |
|
|
file_size = (size_t)finfo.st_size; |
file_size = (size_t)finfo.st_size; |
|
|
Line 858 _rl_read_file (filename, sizep)
|
Line 942 _rl_read_file (filename, sizep)
|
|
|
/* Re-read the current keybindings file. */ |
/* Re-read the current keybindings file. */ |
int |
int |
rl_re_read_init_file (count, ignore) | rl_re_read_init_file (int count, int ignore) |
int count, ignore; | |
{ |
{ |
int r; |
int r; |
r = rl_read_init_file ((const char *)NULL); |
r = rl_read_init_file ((const char *)NULL); |
Line 876 rl_re_read_init_file (count, ignore)
|
Line 959 rl_re_read_init_file (count, ignore)
|
If the file existed and could be opened and read, 0 is returned, |
If the file existed and could be opened and read, 0 is returned, |
otherwise errno is returned. */ |
otherwise errno is returned. */ |
int |
int |
rl_read_init_file (filename) | rl_read_init_file (const char *filename) |
const char *filename; | |
{ |
{ |
/* Default the filename. */ |
/* Default the filename. */ |
if (filename == 0) |
if (filename == 0) |
Line 902 rl_read_init_file (filename)
|
Line 984 rl_read_init_file (filename)
|
} |
} |
|
|
static int |
static int |
_rl_read_init_file (filename, include_level) | _rl_read_init_file (const char *filename, int include_level) |
const char *filename; | |
int include_level; | |
{ |
{ |
register int i; |
register int i; |
char *buffer, *openname, *line, *end; |
char *buffer, *openname, *line, *end; |
Line 970 _rl_read_init_file (filename, include_level)
|
Line 1050 _rl_read_init_file (filename, include_level)
|
} |
} |
|
|
static void |
static void |
_rl_init_file_error (msg) | #if defined (PREFER_STDARG) |
const char *msg; | _rl_init_file_error (const char *format, ...) |
| #else |
| _rl_init_file_error (va_alist) |
| va_dcl |
| #endif |
{ |
{ |
|
va_list args; |
|
#if defined (PREFER_VARARGS) |
|
char *format; |
|
#endif |
|
|
|
#if defined (PREFER_STDARG) |
|
va_start (args, format); |
|
#else |
|
va_start (args); |
|
format = va_arg (args, char *); |
|
#endif |
|
|
|
fprintf (stderr, "readline: "); |
if (currently_reading_init_file) |
if (currently_reading_init_file) |
_rl_errmsg ("%s: line %d: %s\n", current_readline_init_file, | fprintf (stderr, "%s: line %d: ", current_readline_init_file, |
current_readline_init_lineno, msg); | current_readline_init_lineno); |
else | |
_rl_errmsg ("%s", msg); | vfprintf (stderr, format, args); |
| fprintf (stderr, "\n"); |
| fflush (stderr); |
| |
| va_end (args); |
} |
} |
|
|
/* **************************************************************** */ |
/* **************************************************************** */ |
/* */ |
/* */ |
|
/* Parser Helper Functions */ |
|
/* */ |
|
/* **************************************************************** */ |
|
|
|
static int |
|
parse_comparison_op (s, indp) |
|
const char *s; |
|
int *indp; |
|
{ |
|
int i, peekc, op; |
|
|
|
if (OPSTART (s[*indp]) == 0) |
|
return -1; |
|
i = *indp; |
|
peekc = s[i] ? s[i+1] : 0; |
|
op = -1; |
|
|
|
if (s[i] == '=') |
|
{ |
|
op = OP_EQ; |
|
if (peekc == '=') |
|
i++; |
|
i++; |
|
} |
|
else if (s[i] == '!' && peekc == '=') |
|
{ |
|
op = OP_NE; |
|
i += 2; |
|
} |
|
else if (s[i] == '<' && peekc == '=') |
|
{ |
|
op = OP_LE; |
|
i += 2; |
|
} |
|
else if (s[i] == '>' && peekc == '=') |
|
{ |
|
op = OP_GE; |
|
i += 2; |
|
} |
|
else if (s[i] == '<') |
|
{ |
|
op = OP_LT; |
|
i += 1; |
|
} |
|
else if (s[i] == '>') |
|
{ |
|
op = OP_GT; |
|
i += 1; |
|
} |
|
|
|
*indp = i; |
|
return op; |
|
} |
|
|
|
/* **************************************************************** */ |
|
/* */ |
/* Parser Directives */ |
/* Parser Directives */ |
/* */ |
/* */ |
/* **************************************************************** */ |
/* **************************************************************** */ |
Line 1010 static int if_stack_size;
|
Line 1167 static int if_stack_size;
|
/* Push _rl_parsing_conditionalized_out, and set parser state based |
/* Push _rl_parsing_conditionalized_out, and set parser state based |
on ARGS. */ |
on ARGS. */ |
static int |
static int |
parser_if (args) | parser_if (char *args) |
char *args; | |
{ |
{ |
register int i; | int i, llen, boolvar, strvar; |
|
|
|
boolvar = strvar = -1; |
|
|
/* Push parser state. */ |
/* Push parser state. */ |
if (if_stack_depth + 1 >= if_stack_size) |
if (if_stack_depth + 1 >= if_stack_size) |
{ |
{ |
Line 1030 parser_if (args)
|
Line 1188 parser_if (args)
|
if (_rl_parsing_conditionalized_out) |
if (_rl_parsing_conditionalized_out) |
return 0; |
return 0; |
|
|
|
llen = strlen (args); |
|
|
/* Isolate first argument. */ |
/* Isolate first argument. */ |
for (i = 0; args[i] && !whitespace (args[i]); i++); |
for (i = 0; args[i] && !whitespace (args[i]); i++); |
|
|
Line 1072 parser_if (args)
|
Line 1232 parser_if (args)
|
_rl_parsing_conditionalized_out = mode != rl_editing_mode; |
_rl_parsing_conditionalized_out = mode != rl_editing_mode; |
} |
} |
#endif /* VI_MODE */ |
#endif /* VI_MODE */ |
|
else if (_rl_strnicmp (args, "version", 7) == 0) |
|
{ |
|
int rlversion, versionarg, op, previ, major, minor; |
|
|
|
_rl_parsing_conditionalized_out = 1; |
|
rlversion = RL_VERSION_MAJOR*10 + RL_VERSION_MINOR; |
|
/* if "version" is separated from the operator by whitespace, or the |
|
operand is separated from the operator by whitespace, restore it. |
|
We're more liberal with allowed whitespace for this variable. */ |
|
if (i > 0 && i <= llen && args[i-1] == '\0') |
|
args[i-1] = ' '; |
|
args[llen] = '\0'; /* just in case */ |
|
for (i = 7; whitespace (args[i]); i++) |
|
; |
|
if (OPSTART(args[i]) == 0) |
|
{ |
|
_rl_init_file_error ("comparison operator expected, found `%s'", args[i] ? args + i : "end-of-line"); |
|
return 0; |
|
} |
|
previ = i; |
|
op = parse_comparison_op (args, &i); |
|
if (op <= 0) |
|
{ |
|
_rl_init_file_error ("comparison operator expected, found `%s'", args+previ); |
|
return 0; |
|
} |
|
for ( ; args[i] && whitespace (args[i]); i++) |
|
; |
|
if (args[i] == 0 || _rl_digit_p (args[i]) == 0) |
|
{ |
|
_rl_init_file_error ("numeric argument expected, found `%s'", args+i); |
|
return 0; |
|
} |
|
major = minor = 0; |
|
previ = i; |
|
for ( ; args[i] && _rl_digit_p (args[i]); i++) |
|
major = major*10 + _rl_digit_value (args[i]); |
|
if (args[i] == '.') |
|
{ |
|
if (args[i + 1] && _rl_digit_p (args [i + 1]) == 0) |
|
{ |
|
_rl_init_file_error ("numeric argument expected, found `%s'", args+previ); |
|
return 0; |
|
} |
|
for (++i; args[i] && _rl_digit_p (args[i]); i++) |
|
minor = minor*10 + _rl_digit_value (args[i]); |
|
} |
|
/* optional - check for trailing garbage on the line, allow whitespace |
|
and a trailing comment */ |
|
previ = i; |
|
for ( ; args[i] && whitespace (args[i]); i++) |
|
; |
|
if (args[i] && args[i] != '#') |
|
{ |
|
_rl_init_file_error ("trailing garbage on line: `%s'", args+previ); |
|
return 0; |
|
} |
|
versionarg = major*10 + minor; |
|
|
|
switch (op) |
|
{ |
|
case OP_EQ: |
|
_rl_parsing_conditionalized_out = rlversion == versionarg; |
|
break; |
|
case OP_NE: |
|
_rl_parsing_conditionalized_out = rlversion != versionarg; |
|
break; |
|
case OP_GT: |
|
_rl_parsing_conditionalized_out = rlversion > versionarg; |
|
break; |
|
case OP_GE: |
|
_rl_parsing_conditionalized_out = rlversion >= versionarg; |
|
break; |
|
case OP_LT: |
|
_rl_parsing_conditionalized_out = rlversion < versionarg; |
|
break; |
|
case OP_LE: |
|
_rl_parsing_conditionalized_out = rlversion <= versionarg; |
|
break; |
|
} |
|
} |
/* Check to see if the first word in ARGS is the same as the |
/* Check to see if the first word in ARGS is the same as the |
value stored in rl_readline_name. */ |
value stored in rl_readline_name. */ |
else if (_rl_stricmp (args, rl_readline_name) == 0) |
else if (_rl_stricmp (args, rl_readline_name) == 0) |
_rl_parsing_conditionalized_out = 0; |
_rl_parsing_conditionalized_out = 0; |
|
else if ((boolvar = find_boolean_var (args)) >= 0 || (strvar = find_string_var (args)) >= 0) |
|
{ |
|
int op, previ; |
|
size_t vlen; |
|
const char *vname; |
|
char *valuearg, *vval, prevc; |
|
|
|
_rl_parsing_conditionalized_out = 1; |
|
vname = (boolvar >= 0) ? boolean_varname (boolvar) : string_varname (strvar); |
|
vlen = strlen (vname); |
|
if (i > 0 && i <= llen && args[i-1] == '\0') |
|
args[i-1] = ' '; |
|
args[llen] = '\0'; /* just in case */ |
|
for (i = vlen; whitespace (args[i]); i++) |
|
; |
|
if (CMPSTART(args[i]) == 0) |
|
{ |
|
_rl_init_file_error ("equality comparison operator expected, found `%s'", args[i] ? args + i : "end-of-line"); |
|
return 0; |
|
} |
|
previ = i; |
|
op = parse_comparison_op (args, &i); |
|
if (op != OP_EQ && op != OP_NE) |
|
{ |
|
_rl_init_file_error ("equality comparison operator expected, found `%s'", args+previ); |
|
return 0; |
|
} |
|
for ( ; args[i] && whitespace (args[i]); i++) |
|
; |
|
if (args[i] == 0) |
|
{ |
|
_rl_init_file_error ("argument expected, found `%s'", args+i); |
|
return 0; |
|
} |
|
previ = i; |
|
valuearg = args + i; |
|
for ( ; args[i] && whitespace (args[i]) == 0; i++) |
|
; |
|
prevc = args[i]; |
|
args[i] = '\0'; /* null-terminate valuearg */ |
|
vval = rl_variable_value (vname); |
|
if (op == OP_EQ) |
|
_rl_parsing_conditionalized_out = _rl_stricmp (vval, valuearg) != 0; |
|
else if (op == OP_NE) |
|
_rl_parsing_conditionalized_out = _rl_stricmp (vval, valuearg) == 0; |
|
args[i] = prevc; |
|
} |
else |
else |
_rl_parsing_conditionalized_out = 1; |
_rl_parsing_conditionalized_out = 1; |
return 0; |
return 0; |
Line 1083 parser_if (args)
|
Line 1371 parser_if (args)
|
|
|
/* Invert the current parser state if there is anything on the stack. */ |
/* Invert the current parser state if there is anything on the stack. */ |
static int |
static int |
parser_else (args) | parser_else (char *args) |
char *args; | |
{ |
{ |
register int i; |
register int i; |
|
|
Line 1114 parser_else (args)
|
Line 1401 parser_else (args)
|
/* Terminate a conditional, popping the value of |
/* Terminate a conditional, popping the value of |
_rl_parsing_conditionalized_out from the stack. */ |
_rl_parsing_conditionalized_out from the stack. */ |
static int |
static int |
parser_endif (args) | parser_endif (char *args) |
char *args; | |
{ |
{ |
if (if_stack_depth) |
if (if_stack_depth) |
_rl_parsing_conditionalized_out = if_stack[--if_stack_depth]; |
_rl_parsing_conditionalized_out = if_stack[--if_stack_depth]; |
Line 1125 parser_endif (args)
|
Line 1411 parser_endif (args)
|
} |
} |
|
|
static int |
static int |
parser_include (args) | parser_include (char *args) |
char *args; | |
{ |
{ |
const char *old_init_file; |
const char *old_init_file; |
char *e; |
char *e; |
Line 1166 static const struct {
|
Line 1451 static const struct {
|
/* Handle a parser directive. STATEMENT is the line of the directive |
/* Handle a parser directive. STATEMENT is the line of the directive |
without any leading `$'. */ |
without any leading `$'. */ |
static int |
static int |
handle_parser_directive (statement) | handle_parser_directive (char *statement) |
char *statement; | |
{ |
{ |
register int i; |
register int i; |
char *directive, *args; |
char *directive, *args; |
Line 1197 handle_parser_directive (statement)
|
Line 1481 handle_parser_directive (statement)
|
} |
} |
|
|
/* display an error message about the unknown parser directive */ |
/* display an error message about the unknown parser directive */ |
_rl_init_file_error ("unknown parser directive"); | _rl_init_file_error ("%s: unknown parser directive", directive); |
return (1); |
return (1); |
} |
} |
|
|
/* Start at STRING[START] and look for DELIM. Return I where STRING[I] == |
/* Start at STRING[START] and look for DELIM. Return I where STRING[I] == |
DELIM or STRING[I] == 0. DELIM is usually a double quote. */ |
DELIM or STRING[I] == 0. DELIM is usually a double quote. */ |
static int |
static int |
_rl_skip_to_delim (string, start, delim) | _rl_skip_to_delim (char *string, int start, int delim) |
char *string; | |
int start, delim; | |
{ |
{ |
int i, c, passc; |
int i, c, passc; |
|
|
Line 1238 _rl_skip_to_delim (string, start, delim)
|
Line 1520 _rl_skip_to_delim (string, start, delim)
|
a variable binding command looks like: set variable value. |
a variable binding command looks like: set variable value. |
A new-style keybinding looks like "\C-x\C-x": exchange-point-and-mark. */ |
A new-style keybinding looks like "\C-x\C-x": exchange-point-and-mark. */ |
int |
int |
rl_parse_and_bind (string) | rl_parse_and_bind (char *string) |
char *string; | |
{ |
{ |
char *funname, *kname; |
char *funname, *kname; |
register int c, i; |
register int c, i; |
int key, equivalency; | int key, equivalency, foundmod, foundsep; |
|
|
while (string && whitespace (*string)) |
while (string && whitespace (*string)) |
string++; |
string++; |
Line 1273 rl_parse_and_bind (string)
|
Line 1554 rl_parse_and_bind (string)
|
/* If we didn't find a closing quote, abort the line. */ |
/* If we didn't find a closing quote, abort the line. */ |
if (string[i] == '\0') |
if (string[i] == '\0') |
{ |
{ |
_rl_init_file_error ("no closing `\"' in key binding"); | _rl_init_file_error ("%s: no closing `\"' in key binding", string); |
return 1; |
return 1; |
} |
} |
else |
else |
Line 1283 rl_parse_and_bind (string)
|
Line 1564 rl_parse_and_bind (string)
|
/* Advance to the colon (:) or whitespace which separates the two objects. */ |
/* Advance to the colon (:) or whitespace which separates the two objects. */ |
for (; (c = string[i]) && c != ':' && c != ' ' && c != '\t'; i++ ); |
for (; (c = string[i]) && c != ':' && c != ' ' && c != '\t'; i++ ); |
|
|
|
if (i == 0) |
|
{ |
|
_rl_init_file_error ("`%s': invalid key binding: missing key sequence", string); |
|
return 1; |
|
} |
|
|
equivalency = (c == ':' && string[i + 1] == '='); |
equivalency = (c == ':' && string[i + 1] == '='); |
|
|
|
foundsep = c != 0; |
|
|
/* Mark the end of the command (or keyname). */ |
/* Mark the end of the command (or keyname). */ |
if (string[i]) |
if (string[i]) |
string[i++] = '\0'; |
string[i++] = '\0'; |
Line 1313 rl_parse_and_bind (string)
|
Line 1602 rl_parse_and_bind (string)
|
/* Strip trailing whitespace from values of boolean variables. */ |
/* Strip trailing whitespace from values of boolean variables. */ |
if (find_boolean_var (var) >= 0) |
if (find_boolean_var (var) >= 0) |
{ |
{ |
/* remove trailing whitespace */ | /* just read a whitespace-delimited word or empty string */ |
remove_trailing: | for (e = value; *e && whitespace (*e) == 0; e++) |
e = value + strlen (value) - 1; | ; |
while (e >= value && whitespace (*e)) | if (e > value) |
e--; | *e = '\0'; /* cut off everything trailing */ |
e++; /* skip back to whitespace or EOS */ | |
| |
if (*e && e >= value) | |
*e = '\0'; | |
} |
} |
else if ((i = find_string_var (var)) >= 0) |
else if ((i = find_string_var (var)) >= 0) |
{ |
{ |
Line 1333 remove_trailing:
|
Line 1618 remove_trailing:
|
value++; /* skip past the quote */ |
value++; /* skip past the quote */ |
} |
} |
else |
else |
goto remove_trailing; | { |
| /* remove trailing whitespace */ |
| 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 |
| { |
| /* avoid calling rl_variable_bind just to find this out */ |
| _rl_init_file_error ("%s: unknown variable name", var); |
| return 1; |
| } |
| |
rl_variable_bind (var, value); |
rl_variable_bind (var, value); |
return 0; |
return 0; |
} |
} |
Line 1359 remove_trailing:
|
Line 1659 remove_trailing:
|
i = _rl_skip_to_delim (string, i+1, *funname); |
i = _rl_skip_to_delim (string, i+1, *funname); |
if (string[i]) |
if (string[i]) |
i++; |
i++; |
|
else |
|
{ |
|
_rl_init_file_error ("`%s': missing closing quote for macro", funname); |
|
return 1; |
|
} |
} |
} |
|
|
/* Advance to the end of the string. */ |
/* Advance to the end of the string. */ |
Line 1374 remove_trailing:
|
Line 1679 remove_trailing:
|
return 0; |
return 0; |
} |
} |
|
|
|
if (foundsep == 0) |
|
{ |
|
_rl_init_file_error ("%s: no key sequence terminator", string); |
|
return 1; |
|
} |
|
|
/* If this is a new-style key-binding, then do the binding with |
/* If this is a new-style key-binding, then do the binding with |
rl_bind_keyseq (). Otherwise, let the older code deal with it. */ |
rl_bind_keyseq (). Otherwise, let the older code deal with it. */ |
if (*string == '"') |
if (*string == '"') |
Line 1430 remove_trailing:
|
Line 1741 remove_trailing:
|
key = glean_key_from_name (kname); |
key = glean_key_from_name (kname); |
|
|
/* Add in control and meta bits. */ |
/* Add in control and meta bits. */ |
|
foundmod = 0; |
if (substring_member_of_array (string, _rl_possible_control_prefixes)) |
if (substring_member_of_array (string, _rl_possible_control_prefixes)) |
key = CTRL (_rl_to_upper (key)); | { |
| key = CTRL (_rl_to_upper (key)); |
| foundmod = 1; |
| } |
|
|
if (substring_member_of_array (string, _rl_possible_meta_prefixes)) |
if (substring_member_of_array (string, _rl_possible_meta_prefixes)) |
key = META (key); | { |
| key = META (key); |
| foundmod = 1; |
| } |
|
|
|
if (foundmod == 0 && kname != string) |
|
{ |
|
_rl_init_file_error ("%s: unknown key modifier", string); |
|
return 1; |
|
} |
|
|
/* Temporary. Handle old-style keyname with macro-binding. */ |
/* Temporary. Handle old-style keyname with macro-binding. */ |
if (*funname == '\'' || *funname == '"') |
if (*funname == '\'' || *funname == '"') |
{ |
{ |
Line 1461 remove_trailing:
|
Line 1785 remove_trailing:
|
#endif /* PREFIX_META_HACK */ |
#endif /* PREFIX_META_HACK */ |
else |
else |
rl_bind_key (key, rl_named_function (funname)); |
rl_bind_key (key, rl_named_function (funname)); |
|
|
return 0; |
return 0; |
} |
} |
|
|
Line 1479 static const struct {
|
Line 1804 static const struct {
|
{ "blink-matching-paren", &rl_blink_matching_paren, V_SPECIAL }, |
{ "blink-matching-paren", &rl_blink_matching_paren, V_SPECIAL }, |
{ "byte-oriented", &rl_byte_oriented, 0 }, |
{ "byte-oriented", &rl_byte_oriented, 0 }, |
#if defined (COLOR_SUPPORT) |
#if defined (COLOR_SUPPORT) |
|
{ "colored-completion-prefix",&_rl_colored_completion_prefix, 0 }, |
{ "colored-stats", &_rl_colored_stats, 0 }, |
{ "colored-stats", &_rl_colored_stats, 0 }, |
#endif |
#endif |
{ "completion-ignore-case", &_rl_completion_case_fold, 0 }, |
{ "completion-ignore-case", &_rl_completion_case_fold, 0 }, |
Line 1486 static const struct {
|
Line 1812 static const struct {
|
{ "convert-meta", &_rl_convert_meta_chars_to_ascii, 0 }, |
{ "convert-meta", &_rl_convert_meta_chars_to_ascii, 0 }, |
{ "disable-completion", &rl_inhibit_completion, 0 }, |
{ "disable-completion", &rl_inhibit_completion, 0 }, |
{ "echo-control-characters", &_rl_echo_control_chars, 0 }, |
{ "echo-control-characters", &_rl_echo_control_chars, 0 }, |
|
{ "enable-bracketed-paste", &_rl_enable_bracketed_paste, V_SPECIAL }, |
{ "enable-keypad", &_rl_enable_keypad, 0 }, |
{ "enable-keypad", &_rl_enable_keypad, 0 }, |
{ "enable-meta-key", &_rl_enable_meta, 0 }, |
{ "enable-meta-key", &_rl_enable_meta, 0 }, |
{ "expand-tilde", &rl_complete_with_tilde_expansion, 0 }, |
{ "expand-tilde", &rl_complete_with_tilde_expansion, 0 }, |
Line 1514 static const struct {
|
Line 1841 static const struct {
|
}; |
}; |
|
|
static int |
static int |
find_boolean_var (name) | find_boolean_var (const char *name) |
const char *name; | |
{ |
{ |
register int i; |
register int i; |
|
|
Line 1525 find_boolean_var (name)
|
Line 1851 find_boolean_var (name)
|
return -1; |
return -1; |
} |
} |
|
|
|
static const char * |
|
boolean_varname (int i) |
|
{ |
|
return ((i >= 0) ? boolean_varlist[i].name : (char *)NULL); |
|
} |
|
|
/* Hooks for handling special boolean variables, where a |
/* Hooks for handling special boolean variables, where a |
function needs to be called or another variable needs |
function needs to be called or another variable needs |
to be changed when they're changed. */ |
to be changed when they're changed. */ |
static void |
static void |
hack_special_boolean_var (i) | hack_special_boolean_var (int i) |
int i; | |
{ |
{ |
const char *name; |
const char *name; |
|
|
Line 1547 hack_special_boolean_var (i)
|
Line 1878 hack_special_boolean_var (i)
|
} |
} |
else if (_rl_stricmp (name, "show-mode-in-prompt") == 0) |
else if (_rl_stricmp (name, "show-mode-in-prompt") == 0) |
_rl_reset_prompt (); |
_rl_reset_prompt (); |
|
else if (_rl_stricmp (name, "enable-bracketed-paste") == 0) |
|
_rl_enable_active_region = _rl_enable_bracketed_paste; |
} |
} |
|
|
typedef int _rl_sv_func_t PARAMS((const char *)); |
typedef int _rl_sv_func_t PARAMS((const char *)); |
Line 1569 static int sv_dispprefix PARAMS((const char *));
|
Line 1902 static int sv_dispprefix PARAMS((const char *));
|
static int sv_compquery PARAMS((const char *)); |
static int sv_compquery PARAMS((const char *)); |
static int sv_compwidth PARAMS((const char *)); |
static int sv_compwidth PARAMS((const char *)); |
static int sv_editmode 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_histsize PARAMS((const char *)); |
static int sv_isrchterm PARAMS((const char *)); |
static int sv_isrchterm PARAMS((const char *)); |
static int sv_keymap PARAMS((const char *)); |
static int sv_keymap PARAMS((const char *)); |
static int sv_seqtimeout 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 { |
static const struct { |
const char * const name; |
const char * const name; |
Line 1585 static const struct {
|
Line 1921 static const struct {
|
{ "completion-prefix-display-length", V_INT, sv_dispprefix }, |
{ "completion-prefix-display-length", V_INT, sv_dispprefix }, |
{ "completion-query-items", V_INT, sv_compquery }, |
{ "completion-query-items", V_INT, sv_compquery }, |
{ "editing-mode", V_STRING, sv_editmode }, |
{ "editing-mode", V_STRING, sv_editmode }, |
|
{ "emacs-mode-string", V_STRING, sv_emacs_modestr }, |
{ "history-size", V_INT, sv_histsize }, |
{ "history-size", V_INT, sv_histsize }, |
{ "isearch-terminators", V_STRING, sv_isrchterm }, |
{ "isearch-terminators", V_STRING, sv_isrchterm }, |
{ "keymap", V_STRING, sv_keymap }, |
{ "keymap", V_STRING, sv_keymap }, |
{ "keyseq-timeout", V_INT, sv_seqtimeout }, |
{ "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 } |
{ (char *)NULL, 0, (_rl_sv_func_t *)0 } |
}; |
}; |
|
|
static int |
static int |
find_string_var (name) | find_string_var (const char *name) |
const char *name; | |
{ |
{ |
register int i; |
register int i; |
|
|
Line 1604 find_string_var (name)
|
Line 1942 find_string_var (name)
|
return -1; |
return -1; |
} |
} |
|
|
|
static const char * |
|
string_varname (int i) |
|
{ |
|
return ((i >= 0) ? string_varlist[i].name : (char *)NULL); |
|
} |
|
|
/* A boolean value that can appear in a `set variable' command is true if |
/* A boolean value that can appear in a `set variable' command is true if |
the value is null or empty, `on' (case-insenstive), or "1". Any other | the value is null or empty, `on' (case-insensitive), or "1". All other |
values result in 0 (false). */ |
values result in 0 (false). */ |
static int |
static int |
bool_to_int (value) | bool_to_int (const char *value) |
const char *value; | |
{ |
{ |
return (value == 0 || *value == '\0' || |
return (value == 0 || *value == '\0' || |
(_rl_stricmp (value, "on") == 0) || |
(_rl_stricmp (value, "on") == 0) || |
Line 1617 bool_to_int (value)
|
Line 1960 bool_to_int (value)
|
} |
} |
|
|
char * |
char * |
rl_variable_value (name) | rl_variable_value (const char *name) |
const char *name; | |
{ |
{ |
register int i; |
register int i; |
|
|
Line 1632 rl_variable_value (name)
|
Line 1974 rl_variable_value (name)
|
return (_rl_get_string_variable_value (string_varlist[i].name)); |
return (_rl_get_string_variable_value (string_varlist[i].name)); |
|
|
/* Unknown variable names return NULL. */ |
/* Unknown variable names return NULL. */ |
return 0; | return (char *)NULL; |
} |
} |
|
|
int |
int |
rl_variable_bind (name, value) | rl_variable_bind (const char *name, const char *value) |
const char *name, *value; | |
{ |
{ |
register int i; |
register int i; |
int v; |
int v; |
Line 1654 rl_variable_bind (name, value)
|
Line 1995 rl_variable_bind (name, value)
|
|
|
i = find_string_var (name); |
i = find_string_var (name); |
|
|
/* For the time being, unknown variable names or string names without a | /* For the time being, string names without a handler function are simply |
handler function are simply ignored. */ | ignored. */ |
if (i < 0 || string_varlist[i].set_func == 0) |
if (i < 0 || string_varlist[i].set_func == 0) |
return 0; | { |
| if (i < 0) |
| _rl_init_file_error ("%s: unknown variable name", name); |
| return 0; |
| } |
|
|
v = (*string_varlist[i].set_func) (value); |
v = (*string_varlist[i].set_func) (value); |
|
if (v != 0) |
|
_rl_init_file_error ("%s: could not set value to `%s'", name, value); |
return v; |
return v; |
} |
} |
|
|
static int |
static int |
sv_editmode (value) | sv_editmode (const char *value) |
const char *value; | |
{ |
{ |
if (_rl_strnicmp (value, "vi", 2) == 0) |
if (_rl_strnicmp (value, "vi", 2) == 0) |
{ |
{ |
Line 1685 sv_editmode (value)
|
Line 2031 sv_editmode (value)
|
} |
} |
|
|
static int |
static int |
sv_combegin (value) | sv_combegin (const char *value) |
const char *value; | |
{ |
{ |
if (value && *value) |
if (value && *value) |
{ |
{ |
Line 1698 sv_combegin (value)
|
Line 2043 sv_combegin (value)
|
} |
} |
|
|
static int |
static int |
sv_dispprefix (value) | sv_dispprefix (const char *value) |
const char *value; | |
{ |
{ |
int nval = 0; |
int nval = 0; |
|
|
Line 1714 sv_dispprefix (value)
|
Line 2058 sv_dispprefix (value)
|
} |
} |
|
|
static int |
static int |
sv_compquery (value) | sv_compquery (const char *value) |
const char *value; | |
{ |
{ |
int nval = 100; |
int nval = 100; |
|
|
Line 1730 sv_compquery (value)
|
Line 2073 sv_compquery (value)
|
} |
} |
|
|
static int |
static int |
sv_compwidth (value) | sv_compwidth (const char *value) |
const char *value; | |
{ |
{ |
int nval = -1; |
int nval = -1; |
|
|
Line 1743 sv_compwidth (value)
|
Line 2085 sv_compwidth (value)
|
} |
} |
|
|
static int |
static int |
sv_histsize (value) | sv_histsize (const char *value) |
const char *value; | |
{ |
{ |
int nval; |
int nval; |
|
|
Line 1763 sv_histsize (value)
|
Line 2104 sv_histsize (value)
|
} |
} |
|
|
static int |
static int |
sv_keymap (value) | sv_keymap (const char *value) |
const char *value; | |
{ |
{ |
Keymap kmap; |
Keymap kmap; |
|
|
Line 1778 sv_keymap (value)
|
Line 2118 sv_keymap (value)
|
} |
} |
|
|
static int |
static int |
sv_seqtimeout (value) | sv_seqtimeout (const char *value) |
const char *value; | |
{ |
{ |
int nval; |
int nval; |
|
|
Line 1795 sv_seqtimeout (value)
|
Line 2134 sv_seqtimeout (value)
|
} |
} |
|
|
static int |
static int |
sv_bell_style (value) | sv_bell_style (const char *value) |
const char *value; | |
{ |
{ |
if (value == 0 || *value == '\0') |
if (value == 0 || *value == '\0') |
_rl_bell_preference = AUDIBLE_BELL; |
_rl_bell_preference = AUDIBLE_BELL; |
Line 1812 sv_bell_style (value)
|
Line 2150 sv_bell_style (value)
|
} |
} |
|
|
static int |
static int |
sv_isrchterm (value) | sv_isrchterm (const char *value) |
const char *value; | |
{ |
{ |
int beg, end, delim; |
int beg, end, delim; |
char *v; |
char *v; |
Line 1832 sv_isrchterm (value)
|
Line 2169 sv_isrchterm (value)
|
} |
} |
else |
else |
{ |
{ |
for (beg = end = 0; whitespace (v[end]) == 0; end++) | for (beg = end = 0; v[end] && whitespace (v[end]) == 0; end++) |
; |
; |
} |
} |
|
|
Line 1846 sv_isrchterm (value)
|
Line 2183 sv_isrchterm (value)
|
xfree (v); |
xfree (v); |
return 0; |
return 0; |
} |
} |
| |
| extern char *_rl_emacs_mode_str; |
| |
| static int |
| sv_emacs_modestr (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 (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 (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. |
/* Return the character which matches NAME. |
For example, `Space' returns ' '. */ |
For example, `Space' returns ' '. */ |
|
|
Line 1871 static const assoc_list name_key_alist[] = {
|
Line 2294 static const assoc_list name_key_alist[] = {
|
}; |
}; |
|
|
static int |
static int |
glean_key_from_name (name) | glean_key_from_name (char *name) |
char *name; | |
{ |
{ |
register int i; |
register int i; |
|
|
Line 1884 glean_key_from_name (name)
|
Line 2306 glean_key_from_name (name)
|
} |
} |
|
|
/* Auxiliary functions to manage keymaps. */ |
/* Auxiliary functions to manage keymaps. */ |
static const struct { | struct name_and_keymap { |
const char * const name; | char *name; |
Keymap map; |
Keymap map; |
} keymap_names[] = { | }; |
| |
| static struct name_and_keymap builtin_keymap_names[] = { |
{ "emacs", emacs_standard_keymap }, |
{ "emacs", emacs_standard_keymap }, |
{ "emacs-standard", emacs_standard_keymap }, |
{ "emacs-standard", emacs_standard_keymap }, |
{ "emacs-meta", emacs_meta_keymap }, |
{ "emacs-meta", emacs_meta_keymap }, |
Line 1901 static const struct {
|
Line 2325 static const struct {
|
{ (char *)0x0, (Keymap)0x0 } |
{ (char *)0x0, (Keymap)0x0 } |
}; |
}; |
|
|
Keymap | /* -1 for NULL entry */ |
rl_get_keymap_by_name (name) | #define NUM_BUILTIN_KEYMAPS (sizeof (builtin_keymap_names) / sizeof (builtin_keymap_names[0]) - 1) |
const char *name; | |
| static struct name_and_keymap *keymap_names = builtin_keymap_names; |
| |
| static int |
| _rl_get_keymap_by_name (const char *name) |
{ |
{ |
register int i; |
register int i; |
|
|
for (i = 0; keymap_names[i].name; i++) |
for (i = 0; keymap_names[i].name; i++) |
if (_rl_stricmp (name, keymap_names[i].name) == 0) |
if (_rl_stricmp (name, keymap_names[i].name) == 0) |
return (keymap_names[i].map); | return (i); |
return ((Keymap) NULL); | return -1; |
} |
} |
|
|
char * | Keymap |
rl_get_keymap_name (map) | rl_get_keymap_by_name (const char *name) |
Keymap map; | |
{ |
{ |
|
int i; |
|
|
|
i = _rl_get_keymap_by_name (name); |
|
return ((i >= 0) ? keymap_names[i].map : (Keymap) NULL); |
|
} |
|
|
|
static int |
|
_rl_get_keymap_by_map (Keymap map) |
|
{ |
register int i; |
register int i; |
|
|
for (i = 0; keymap_names[i].name; i++) |
for (i = 0; keymap_names[i].name; i++) |
if (map == keymap_names[i].map) |
if (map == keymap_names[i].map) |
return ((char *)keymap_names[i].name); | return (i); |
return ((char *)NULL); | return -1; |
} |
} |
| |
| char * |
| rl_get_keymap_name (Keymap map) |
| { |
| int i; |
| |
| i = _rl_get_keymap_by_map (map); |
| return ((i >= 0) ? keymap_names[i].name : (char *)NULL); |
| } |
| |
| int |
| rl_set_keymap_name (const char *name, Keymap map) |
| { |
| int i, ni, mi; |
| |
| /* First check whether or not we're trying to rename a builtin keymap */ |
| mi = _rl_get_keymap_by_map (map); |
| if (mi >= 0 && mi < NUM_BUILTIN_KEYMAPS) |
| return -1; |
| |
| /* Then reject attempts to set one of the builtin names to a new map */ |
| ni = _rl_get_keymap_by_name (name); |
| if (ni >= 0 && ni < NUM_BUILTIN_KEYMAPS) |
| return -1; |
| |
| /* Renaming a keymap we already added */ |
| if (mi >= 0) /* XXX - could be >= NUM_BUILTIN_KEYMAPS */ |
| { |
| xfree (keymap_names[mi].name); |
| keymap_names[mi].name = savestring (name); |
| return mi; |
| } |
| |
| /* Associating new keymap with existing name */ |
| if (ni >= 0) |
| { |
| keymap_names[ni].map = map; |
| return ni; |
| } |
| |
| for (i = 0; keymap_names[i].name; i++) |
| ; |
| |
| if (keymap_names == builtin_keymap_names) |
| { |
| keymap_names = xmalloc ((i + 2) * sizeof (struct name_and_keymap)); |
| memcpy (keymap_names, builtin_keymap_names, i * sizeof (struct name_and_keymap)); |
| } |
| else |
| keymap_names = xrealloc (keymap_names, (i + 2) * sizeof (struct name_and_keymap)); |
| |
| keymap_names[i].name = savestring (name); |
| keymap_names[i].map = map; |
| |
| keymap_names[i+1].name = NULL; |
| keymap_names[i+1].map = NULL; |
| |
| return i; |
| } |
| |
void |
void |
rl_set_keymap (map) | rl_set_keymap (Keymap map) |
Keymap map; | |
{ |
{ |
if (map) |
if (map) |
_rl_keymap = map; |
_rl_keymap = map; |
} |
} |
|
|
Keymap |
Keymap |
rl_get_keymap () | rl_get_keymap (void) |
{ |
{ |
return (_rl_keymap); |
return (_rl_keymap); |
} |
} |
|
|
void |
void |
rl_set_keymap_from_edit_mode () | rl_set_keymap_from_edit_mode (void) |
{ |
{ |
if (rl_editing_mode == emacs_mode) |
if (rl_editing_mode == emacs_mode) |
_rl_keymap = emacs_standard_keymap; |
_rl_keymap = emacs_standard_keymap; |
Line 1950 rl_set_keymap_from_edit_mode ()
|
Line 2445 rl_set_keymap_from_edit_mode ()
|
} |
} |
|
|
char * |
char * |
rl_get_keymap_name_from_edit_mode () | rl_get_keymap_name_from_edit_mode (void) |
{ |
{ |
if (rl_editing_mode == emacs_mode) |
if (rl_editing_mode == emacs_mode) |
return "emacs"; |
return "emacs"; |
Line 1975 rl_get_keymap_name_from_edit_mode ()
|
Line 2470 rl_get_keymap_name_from_edit_mode ()
|
|
|
/* Print the names of functions known to Readline. */ |
/* Print the names of functions known to Readline. */ |
void |
void |
rl_list_funmap_names () | rl_list_funmap_names (void) |
{ |
{ |
register int i; |
register int i; |
const char **funmap_names; |
const char **funmap_names; |
Line 1992 rl_list_funmap_names ()
|
Line 2487 rl_list_funmap_names ()
|
} |
} |
|
|
static char * |
static char * |
_rl_get_keyname (key) | _rl_get_keyname (int key) |
int key; | |
{ |
{ |
char *keyname; |
char *keyname; |
int i, c; |
int i, c; |
Line 2068 _rl_get_keyname (key)
|
Line 2562 _rl_get_keyname (key)
|
/* Return a NULL terminated array of strings which represent the key |
/* Return a NULL terminated array of strings which represent the key |
sequences that are used to invoke FUNCTION in MAP. */ |
sequences that are used to invoke FUNCTION in MAP. */ |
char ** |
char ** |
rl_invoking_keyseqs_in_map (function, map) | rl_invoking_keyseqs_in_map (rl_command_func_t *function, Keymap map) |
rl_command_func_t *function; | |
Keymap map; | |
{ |
{ |
register int key; |
register int key; |
char **result; |
char **result; |
Line 2137 rl_invoking_keyseqs_in_map (function, map)
|
Line 2629 rl_invoking_keyseqs_in_map (function, map)
|
else |
else |
sprintf (keyname, "\\e"); |
sprintf (keyname, "\\e"); |
} |
} |
else if (CTRL_CHAR (key)) |
|
sprintf (keyname, "\\C-%c", _rl_to_lower (UNCTRL (key))); |
|
else if (key == RUBOUT) |
|
sprintf (keyname, "\\C-?"); |
|
else if (key == '\\' || key == '"') |
|
{ |
|
keyname[0] = '\\'; |
|
keyname[1] = (char) key; |
|
keyname[2] = '\0'; |
|
} |
|
else |
else |
{ |
{ |
keyname[0] = (char) key; | int c = key, l = 0; |
keyname[1] = '\0'; | if (CTRL_CHAR (c) || c == RUBOUT) |
| { |
| keyname[l++] = '\\'; |
| keyname[l++] = 'C'; |
| keyname[l++] = '-'; |
| c = (c == RUBOUT) ? '?' : _rl_to_lower (UNCTRL (c)); |
| } |
| |
| if (c == '\\' || c == '"') |
| keyname[l++] = '\\'; |
| |
| keyname[l++] = (char) c; |
| keyname[l++] = '\0'; |
} |
} |
|
|
strcat (keyname, seqs[i]); |
strcat (keyname, seqs[i]); |
Line 2177 rl_invoking_keyseqs_in_map (function, map)
|
Line 2671 rl_invoking_keyseqs_in_map (function, map)
|
/* Return a NULL terminated array of strings which represent the key |
/* Return a NULL terminated array of strings which represent the key |
sequences that can be used to invoke FUNCTION using the current keymap. */ |
sequences that can be used to invoke FUNCTION using the current keymap. */ |
char ** |
char ** |
rl_invoking_keyseqs (function) | rl_invoking_keyseqs (rl_command_func_t *function) |
rl_command_func_t *function; | |
{ |
{ |
return (rl_invoking_keyseqs_in_map (function, _rl_keymap)); |
return (rl_invoking_keyseqs_in_map (function, _rl_keymap)); |
} |
} |
Line 2187 rl_invoking_keyseqs (function)
|
Line 2680 rl_invoking_keyseqs (function)
|
PRINT_READABLY is non-zero, then print the output in such a way |
PRINT_READABLY is non-zero, then print the output in such a way |
that it can be read back in. */ |
that it can be read back in. */ |
void |
void |
rl_function_dumper (print_readably) | rl_function_dumper (int print_readably) |
int print_readably; | |
{ |
{ |
register int i; |
register int i; |
const char **names; |
const char **names; |
Line 2259 rl_function_dumper (print_readably)
|
Line 2751 rl_function_dumper (print_readably)
|
rl_outstream. If an explicit argument is given, then print |
rl_outstream. If an explicit argument is given, then print |
the output in such a way that it can be read back in. */ |
the output in such a way that it can be read back in. */ |
int |
int |
rl_dump_functions (count, key) | rl_dump_functions (int count, int key) |
int count, key; | |
{ |
{ |
if (rl_dispatching) |
if (rl_dispatching) |
fprintf (rl_outstream, "\r\n"); |
fprintf (rl_outstream, "\r\n"); |
Line 2270 rl_dump_functions (count, key)
|
Line 2761 rl_dump_functions (count, key)
|
} |
} |
|
|
static void |
static void |
_rl_macro_dumper_internal (print_readably, map, prefix) | _rl_macro_dumper_internal (int print_readably, Keymap map, char *prefix) |
int print_readably; | |
Keymap map; | |
char *prefix; | |
{ |
{ |
register int key; |
register int key; |
char *keyname, *out; |
char *keyname, *out; |
Line 2332 _rl_macro_dumper_internal (print_readably, map, prefix
|
Line 2820 _rl_macro_dumper_internal (print_readably, map, prefix
|
} |
} |
|
|
void |
void |
rl_macro_dumper (print_readably) | rl_macro_dumper (int print_readably) |
int print_readably; | |
{ |
{ |
_rl_macro_dumper_internal (print_readably, _rl_keymap, (char *)NULL); |
_rl_macro_dumper_internal (print_readably, _rl_keymap, (char *)NULL); |
} |
} |
|
|
int |
int |
rl_dump_macros (count, key) | rl_dump_macros (int count, int key) |
int count, key; | |
{ |
{ |
if (rl_dispatching) |
if (rl_dispatching) |
fprintf (rl_outstream, "\r\n"); |
fprintf (rl_outstream, "\r\n"); |
Line 2350 rl_dump_macros (count, key)
|
Line 2836 rl_dump_macros (count, key)
|
} |
} |
|
|
static char * |
static char * |
_rl_get_string_variable_value (name) | _rl_get_string_variable_value (const char *name) |
const char *name; | |
{ |
{ |
static char numbuf[32]; |
static char numbuf[32]; |
char *ret; |
char *ret; |
Line 2420 _rl_get_string_variable_value (name)
|
Line 2905 _rl_get_string_variable_value (name)
|
sprintf (numbuf, "%d", _rl_keyseq_timeout); |
sprintf (numbuf, "%d", _rl_keyseq_timeout); |
return (numbuf); |
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_vi_cmd_mode_str ? _rl_vi_cmd_mode_str : RL_VI_CMD_MODESTR_DEFAULT); |
|
else if (_rl_stricmp (name, "vi-ins-mode-string") == 0) |
|
return (_rl_vi_ins_mode_str ? _rl_vi_ins_mode_str : RL_VI_INS_MODESTR_DEFAULT); |
else |
else |
return (0); |
return (0); |
} |
} |
|
|
void |
void |
rl_variable_dumper (print_readably) | rl_variable_dumper (int print_readably) |
int print_readably; | |
{ |
{ |
int i; |
int i; |
char *v; |
char *v; |
Line 2457 rl_variable_dumper (print_readably)
|
Line 2947 rl_variable_dumper (print_readably)
|
rl_outstream. If an explicit argument is given, then print |
rl_outstream. If an explicit argument is given, then print |
the output in such a way that it can be read back in. */ |
the output in such a way that it can be read back in. */ |
int |
int |
rl_dump_variables (count, key) | rl_dump_variables (int count, int key) |
int count, key; | |
{ |
{ |
if (rl_dispatching) |
if (rl_dispatching) |
fprintf (rl_outstream, "\r\n"); |
fprintf (rl_outstream, "\r\n"); |
Line 2469 rl_dump_variables (count, key)
|
Line 2958 rl_dump_variables (count, key)
|
|
|
/* Return non-zero if any members of ARRAY are a substring in STRING. */ |
/* Return non-zero if any members of ARRAY are a substring in STRING. */ |
static int |
static int |
substring_member_of_array (string, array) | substring_member_of_array (const char *string, const char * const *array) |
const char *string; | |
const char * const *array; | |
{ |
{ |
while (*array) |
while (*array) |
{ |
{ |