Import readline 8.0
[deliverable/binutils-gdb.git] / readline / keymaps.c
CommitLineData
d60d9f65
SS
1/* keymaps.c -- Functions and keymaps for the GNU Readline library. */
2
cb41b9e7 3/* Copyright (C) 1988,1989-2009,2017 Free Software Foundation, Inc.
d60d9f65 4
cc88a640
JK
5 This file is part of the GNU Readline Library (Readline), a library
6 for reading lines of text with interactive input and history editing.
d60d9f65 7
cc88a640
JK
8 Readline is free software: you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation, either version 3 of the License, or
11 (at your option) any later version.
d60d9f65 12
cc88a640
JK
13 Readline is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
d60d9f65
SS
17
18 You should have received a copy of the GNU General Public License
cc88a640
JK
19 along with Readline. If not, see <http://www.gnu.org/licenses/>.
20*/
21
d60d9f65
SS
22#define READLINE_LIBRARY
23
24#if defined (HAVE_CONFIG_H)
25# include <config.h>
26#endif
27
28#if defined (HAVE_STDLIB_H)
29# include <stdlib.h>
30#else
31# include "ansi_stdlib.h"
32#endif /* HAVE_STDLIB_H */
33
1b17e766
EZ
34#include <stdio.h> /* for FILE * definition for readline.h */
35
36#include "readline.h"
d60d9f65 37#include "rlconf.h"
1b17e766 38
d60d9f65
SS
39#include "emacs_keymap.c"
40
41#if defined (VI_MODE)
42#include "vi_keymap.c"
43#endif
44
1b17e766 45#include "xmalloc.h"
d60d9f65
SS
46
47/* **************************************************************** */
48/* */
49/* Functions for manipulating Keymaps. */
50/* */
51/* **************************************************************** */
52
53
54/* Return a new, empty keymap.
55 Free it with free() when you are done. */
56Keymap
cb41b9e7 57rl_make_bare_keymap (void)
d60d9f65
SS
58{
59 register int i;
cc88a640 60 Keymap keymap;
d60d9f65 61
cc88a640 62 keymap = (Keymap)xmalloc (KEYMAP_SIZE * sizeof (KEYMAP_ENTRY));
d60d9f65
SS
63 for (i = 0; i < KEYMAP_SIZE; i++)
64 {
65 keymap[i].type = ISFUNC;
9255ee31 66 keymap[i].function = (rl_command_func_t *)NULL;
d60d9f65
SS
67 }
68
5bdf8622 69#if 0
d60d9f65
SS
70 for (i = 'A'; i < ('Z' + 1); i++)
71 {
72 keymap[i].type = ISFUNC;
73 keymap[i].function = rl_do_lowercase_version;
74 }
5bdf8622 75#endif
d60d9f65
SS
76
77 return (keymap);
78}
79
cb41b9e7
TT
80/* A convenience function that returns 1 if there are no keys bound to
81 functions in KEYMAP */
82int
83rl_empty_keymap (Keymap keymap)
84{
85 int i;
86
87 for (i = 0; i < ANYOTHERKEY; i++)
88 {
89 if (keymap[i].type != ISFUNC || keymap[i].function)
90 return 0;
91 }
92 return 1;
93}
94
cc88a640
JK
95/* Return a new keymap which is a copy of MAP. Just copies pointers, does
96 not copy text of macros or descend into child keymaps. */
d60d9f65 97Keymap
cb41b9e7 98rl_copy_keymap (Keymap map)
d60d9f65
SS
99{
100 register int i;
5bdf8622 101 Keymap temp;
d60d9f65 102
5bdf8622 103 temp = rl_make_bare_keymap ();
d60d9f65
SS
104 for (i = 0; i < KEYMAP_SIZE; i++)
105 {
106 temp[i].type = map[i].type;
107 temp[i].function = map[i].function;
108 }
109 return (temp);
110}
111
112/* Return a new keymap with the printing characters bound to rl_insert,
113 the uppercase Meta characters bound to run their lowercase equivalents,
114 and the Meta digits bound to produce numeric arguments. */
115Keymap
cb41b9e7 116rl_make_keymap (void)
d60d9f65
SS
117{
118 register int i;
119 Keymap newmap;
120
121 newmap = rl_make_bare_keymap ();
122
123 /* All ASCII printing characters are self-inserting. */
124 for (i = ' '; i < 127; i++)
125 newmap[i].function = rl_insert;
126
127 newmap[TAB].function = rl_insert;
128 newmap[RUBOUT].function = rl_rubout; /* RUBOUT == 127 */
129 newmap[CTRL('H')].function = rl_rubout;
130
131#if KEYMAP_SIZE > 128
5bdf8622
DJ
132 /* Printing characters in ISO Latin-1 and some 8-bit character sets. */
133 for (i = 128; i < 256; i++)
d60d9f65
SS
134 newmap[i].function = rl_insert;
135#endif /* KEYMAP_SIZE > 128 */
136
137 return (newmap);
138}
139
140/* Free the storage associated with MAP. */
141void
cb41b9e7 142rl_discard_keymap (Keymap map)
d60d9f65
SS
143{
144 int i;
145
cc88a640 146 if (map == 0)
d60d9f65
SS
147 return;
148
149 for (i = 0; i < KEYMAP_SIZE; i++)
150 {
151 switch (map[i].type)
152 {
153 case ISFUNC:
154 break;
155
156 case ISKMAP:
157 rl_discard_keymap ((Keymap)map[i].function);
cc88a640 158 xfree ((char *)map[i].function);
d60d9f65
SS
159 break;
160
161 case ISMACR:
cc88a640 162 xfree ((char *)map[i].function);
d60d9f65
SS
163 break;
164 }
165 }
166}
cc88a640
JK
167
168/* Convenience function that discards, then frees, MAP. */
169void
cb41b9e7 170rl_free_keymap (Keymap map)
cc88a640
JK
171{
172 rl_discard_keymap (map);
173 xfree ((char *)map);
174}
This page took 1.00039 seconds and 4 git commands to generate.