| 
									
										
										
										
											1996-08-26 18:22:31 +00:00
										 |  |  | /* keymaps.c -- Functions and keymaps for the GNU Readline library. */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-01-12 13:36:28 +00:00
										 |  |  | /* Copyright (C) 1988,1989-2009 Free Software Foundation, Inc.
 | 
					
						
							| 
									
										
										
										
											1996-08-26 18:22:31 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-01-12 13:36:28 +00:00
										 |  |  |    This file is part of the GNU Readline Library (Readline), a library | 
					
						
							|  |  |  |    for reading lines of text with interactive input and history editing.       | 
					
						
							| 
									
										
										
										
											1996-08-26 18:22:31 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-01-12 13:36:28 +00:00
										 |  |  |    Readline is free software: you can redistribute it and/or modify | 
					
						
							|  |  |  |    it under the terms of the GNU General Public License as published by | 
					
						
							|  |  |  |    the Free Software Foundation, either version 3 of the License, or | 
					
						
							|  |  |  |    (at your option) any later version. | 
					
						
							| 
									
										
										
										
											1996-08-26 18:22:31 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-01-12 13:36:28 +00:00
										 |  |  |    Readline is distributed in the hope that it will be useful, | 
					
						
							|  |  |  |    but WITHOUT ANY WARRANTY; without even the implied warranty of | 
					
						
							|  |  |  |    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 
					
						
							|  |  |  |    GNU General Public License for more details. | 
					
						
							| 
									
										
										
										
											1996-08-26 18:22:31 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |    You should have received a copy of the GNU General Public License | 
					
						
							| 
									
										
										
										
											2009-01-12 13:36:28 +00:00
										 |  |  |    along with Readline.  If not, see <http://www.gnu.org/licenses/>.
 | 
					
						
							|  |  |  | */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1996-08-26 18:22:31 +00:00
										 |  |  | #define READLINE_LIBRARY
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #if defined (HAVE_CONFIG_H)
 | 
					
						
							| 
									
										
										
										
											1996-12-23 17:02:34 +00:00
										 |  |  | #  include <config.h>
 | 
					
						
							| 
									
										
										
										
											1996-08-26 18:22:31 +00:00
										 |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #if defined (HAVE_STDLIB_H)
 | 
					
						
							|  |  |  | #  include <stdlib.h>
 | 
					
						
							|  |  |  | #else
 | 
					
						
							|  |  |  | #  include "ansi_stdlib.h"
 | 
					
						
							|  |  |  | #endif /* HAVE_STDLIB_H */
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-03-17 21:46:59 +00:00
										 |  |  | #include <stdio.h>	/* for FILE * definition for readline.h */
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "readline.h"
 | 
					
						
							| 
									
										
										
										
											1996-08-26 18:22:31 +00:00
										 |  |  | #include "rlconf.h"
 | 
					
						
							| 
									
										
										
										
											2000-03-17 21:46:59 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1996-08-26 18:22:31 +00:00
										 |  |  | #include "emacs_keymap.c"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #if defined (VI_MODE)
 | 
					
						
							|  |  |  | #include "vi_keymap.c"
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-03-17 21:46:59 +00:00
										 |  |  | #include "xmalloc.h"
 | 
					
						
							| 
									
										
										
										
											1996-08-26 18:22:31 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | /* **************************************************************** */ | 
					
						
							|  |  |  | /*								    */ | 
					
						
							|  |  |  | /*		      Functions for manipulating Keymaps.	    */ | 
					
						
							|  |  |  | /*								    */ | 
					
						
							|  |  |  | /* **************************************************************** */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* Return a new, empty keymap.
 | 
					
						
							|  |  |  |    Free it with free() when you are done. */ | 
					
						
							|  |  |  | Keymap | 
					
						
							|  |  |  | rl_make_bare_keymap () | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   register int i; | 
					
						
							| 
									
										
										
										
											2011-11-21 20:51:19 -05:00
										 |  |  |   Keymap keymap; | 
					
						
							| 
									
										
										
										
											1996-08-26 18:22:31 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-11-21 20:51:19 -05:00
										 |  |  |   keymap = (Keymap)xmalloc (KEYMAP_SIZE * sizeof (KEYMAP_ENTRY)); | 
					
						
							| 
									
										
										
										
											1996-08-26 18:22:31 +00:00
										 |  |  |   for (i = 0; i < KEYMAP_SIZE; i++) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |       keymap[i].type = ISFUNC; | 
					
						
							| 
									
										
										
										
											2001-04-06 19:14:31 +00:00
										 |  |  |       keymap[i].function = (rl_command_func_t *)NULL; | 
					
						
							| 
									
										
										
										
											1996-08-26 18:22:31 +00:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-07-27 13:29:18 +00:00
										 |  |  | #if 0
 | 
					
						
							| 
									
										
										
										
											1996-08-26 18:22:31 +00:00
										 |  |  |   for (i = 'A'; i < ('Z' + 1); i++) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |       keymap[i].type = ISFUNC; | 
					
						
							|  |  |  |       keymap[i].function = rl_do_lowercase_version; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2004-07-27 13:29:18 +00:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											1996-08-26 18:22:31 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |   return (keymap); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-11-21 20:51:19 -05:00
										 |  |  | /* Return a new keymap which is a copy of MAP.  Just copies pointers, does
 | 
					
						
							|  |  |  |    not copy text of macros or descend into child keymaps. */ | 
					
						
							| 
									
										
										
										
											1996-08-26 18:22:31 +00:00
										 |  |  | Keymap | 
					
						
							|  |  |  | rl_copy_keymap (map) | 
					
						
							|  |  |  |      Keymap map; | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   register int i; | 
					
						
							| 
									
										
										
										
											2004-07-27 13:29:18 +00:00
										 |  |  |   Keymap temp; | 
					
						
							| 
									
										
										
										
											1996-08-26 18:22:31 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-07-27 13:29:18 +00:00
										 |  |  |   temp = rl_make_bare_keymap (); | 
					
						
							| 
									
										
										
										
											1996-08-26 18:22:31 +00:00
										 |  |  |   for (i = 0; i < KEYMAP_SIZE; i++) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |       temp[i].type = map[i].type; | 
					
						
							|  |  |  |       temp[i].function = map[i].function; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   return (temp); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* Return a new keymap with the printing characters bound to rl_insert,
 | 
					
						
							|  |  |  |    the uppercase Meta characters bound to run their lowercase equivalents, | 
					
						
							|  |  |  |    and the Meta digits bound to produce numeric arguments. */ | 
					
						
							|  |  |  | Keymap | 
					
						
							|  |  |  | rl_make_keymap () | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   register int i; | 
					
						
							|  |  |  |   Keymap newmap; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   newmap = rl_make_bare_keymap (); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   /* All ASCII printing characters are self-inserting. */ | 
					
						
							|  |  |  |   for (i = ' '; i < 127; i++) | 
					
						
							|  |  |  |     newmap[i].function = rl_insert; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   newmap[TAB].function = rl_insert; | 
					
						
							| 
									
										
										
										
											1996-12-23 17:02:34 +00:00
										 |  |  |   newmap[RUBOUT].function = rl_rubout;	/* RUBOUT == 127 */ | 
					
						
							| 
									
										
										
										
											1996-08-26 18:22:31 +00:00
										 |  |  |   newmap[CTRL('H')].function = rl_rubout; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #if KEYMAP_SIZE > 128
 | 
					
						
							| 
									
										
										
										
											2004-07-27 13:29:18 +00:00
										 |  |  |   /* Printing characters in ISO Latin-1 and some 8-bit character sets. */ | 
					
						
							|  |  |  |   for (i = 128; i < 256; i++) | 
					
						
							| 
									
										
										
										
											1996-08-26 18:22:31 +00:00
										 |  |  |     newmap[i].function = rl_insert; | 
					
						
							|  |  |  | #endif /* KEYMAP_SIZE > 128 */
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   return (newmap); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* Free the storage associated with MAP. */ | 
					
						
							|  |  |  | void | 
					
						
							|  |  |  | rl_discard_keymap (map) | 
					
						
							| 
									
										
										
										
											1999-02-19 17:11:39 +00:00
										 |  |  |      Keymap map; | 
					
						
							| 
									
										
										
										
											1996-08-26 18:22:31 +00:00
										 |  |  | { | 
					
						
							|  |  |  |   int i; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-11-21 20:51:19 -05:00
										 |  |  |   if (map == 0) | 
					
						
							| 
									
										
										
										
											1996-08-26 18:22:31 +00:00
										 |  |  |     return; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   for (i = 0; i < KEYMAP_SIZE; i++) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |       switch (map[i].type) | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 	case ISFUNC: | 
					
						
							|  |  |  | 	  break; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	case ISKMAP: | 
					
						
							|  |  |  | 	  rl_discard_keymap ((Keymap)map[i].function); | 
					
						
							| 
									
										
										
										
											2011-11-22 19:11:26 -05:00
										 |  |  | 	  xfree ((char *)map[i].function); | 
					
						
							| 
									
										
										
										
											1996-08-26 18:22:31 +00:00
										 |  |  | 	  break; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	case ISMACR: | 
					
						
							| 
									
										
										
										
											2011-11-22 19:11:26 -05:00
										 |  |  | 	  xfree ((char *)map[i].function); | 
					
						
							| 
									
										
										
										
											1996-08-26 18:22:31 +00:00
										 |  |  | 	  break; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2011-11-21 20:51:19 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | /* Convenience function that discards, then frees, MAP. */ | 
					
						
							|  |  |  | void | 
					
						
							|  |  |  | rl_free_keymap (map) | 
					
						
							|  |  |  |      Keymap map; | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   rl_discard_keymap (map); | 
					
						
							| 
									
										
										
										
											2011-11-22 19:11:26 -05:00
										 |  |  |   xfree ((char *)map); | 
					
						
							| 
									
										
										
										
											2011-11-21 20:51:19 -05:00
										 |  |  | } |