Deleted Added
full compact
map.c (244941) map.c (276881)
1/* $NetBSD: map.c,v 1.34 2014/07/06 18:15:34 christos Exp $ */
2
1/*-
2 * Copyright (c) 1992, 1993
3 * The Regents of the University of California. All rights reserved.
4 *
5 * This code is derived from software contributed to Berkeley by
6 * Christos Zoulas of Cornell University.
7 *
8 * Redistribution and use in source and binary forms, with or without

--- 14 unchanged lines hidden (view full) ---

23 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
24 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
25 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
26 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
27 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
28 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
29 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
30 * SUCH DAMAGE.
3/*-
4 * Copyright (c) 1992, 1993
5 * The Regents of the University of California. All rights reserved.
6 *
7 * This code is derived from software contributed to Berkeley by
8 * Christos Zoulas of Cornell University.
9 *
10 * Redistribution and use in source and binary forms, with or without

--- 14 unchanged lines hidden (view full) ---

25 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
26 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
27 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
28 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
29 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
30 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
31 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
32 * SUCH DAMAGE.
31 *
32 * $NetBSD: map.c,v 1.24 2006/04/09 01:36:51 christos Exp $
33 */
34
33 */
34
35#include "config.h"
35#if !defined(lint) && !defined(SCCSID)
36#if !defined(lint) && !defined(SCCSID)
37#if 0
36static char sccsid[] = "@(#)map.c 8.1 (Berkeley) 6/4/93";
38static char sccsid[] = "@(#)map.c 8.1 (Berkeley) 6/4/93";
39#else
40__RCSID("$NetBSD: map.c,v 1.34 2014/07/06 18:15:34 christos Exp $");
41#endif
37#endif /* not lint && not SCCSID */
38#include <sys/cdefs.h>
42#endif /* not lint && not SCCSID */
43#include <sys/cdefs.h>
39__FBSDID("$FreeBSD: head/lib/libedit/map.c 244941 2013-01-01 19:20:51Z pfg $");
44__FBSDID("$FreeBSD: head/lib/libedit/map.c 276881 2015-01-09 07:40:56Z bapt $");
40
41/*
42 * map.c: Editor function definitions
43 */
45
46/*
47 * map.c: Editor function definitions
48 */
44#include "sys.h"
45#include <stdlib.h>
46#include "el.h"
47
49#include <stdlib.h>
50#include "el.h"
51
48#define N_KEYS 256
49
50private void map_print_key(EditLine *, el_action_t *, const char *);
51private void map_print_some_keys(EditLine *, el_action_t *, int, int);
52private void map_print_key(EditLine *, el_action_t *, const Char *);
53private void map_print_some_keys(EditLine *, el_action_t *, Int, Int);
52private void map_print_all_keys(EditLine *);
53private void map_init_nls(EditLine *);
54private void map_init_meta(EditLine *);
55
56/* keymap tables ; should be N_KEYS*sizeof(KEYCMD) bytes long */
57
58
59private const el_action_t el_map_emacs[] = {

--- 838 unchanged lines hidden (view full) ---

898 if (sizeof(el_map_emacs) != N_KEYS * sizeof(el_action_t))
899 EL_ABORT((el->errfile, "Emacs map incorrect\n"));
900 if (sizeof(el_map_vi_command) != N_KEYS * sizeof(el_action_t))
901 EL_ABORT((el->errfile, "Vi command map incorrect\n"));
902 if (sizeof(el_map_vi_insert) != N_KEYS * sizeof(el_action_t))
903 EL_ABORT((el->errfile, "Vi insert map incorrect\n"));
904#endif
905
54private void map_print_all_keys(EditLine *);
55private void map_init_nls(EditLine *);
56private void map_init_meta(EditLine *);
57
58/* keymap tables ; should be N_KEYS*sizeof(KEYCMD) bytes long */
59
60
61private const el_action_t el_map_emacs[] = {

--- 838 unchanged lines hidden (view full) ---

900 if (sizeof(el_map_emacs) != N_KEYS * sizeof(el_action_t))
901 EL_ABORT((el->errfile, "Emacs map incorrect\n"));
902 if (sizeof(el_map_vi_command) != N_KEYS * sizeof(el_action_t))
903 EL_ABORT((el->errfile, "Vi command map incorrect\n"));
904 if (sizeof(el_map_vi_insert) != N_KEYS * sizeof(el_action_t))
905 EL_ABORT((el->errfile, "Vi insert map incorrect\n"));
906#endif
907
906 el->el_map.alt = (el_action_t *)el_malloc(sizeof(el_action_t) * N_KEYS);
908 el->el_map.alt = el_malloc(sizeof(*el->el_map.alt) * N_KEYS);
907 if (el->el_map.alt == NULL)
909 if (el->el_map.alt == NULL)
908 return (-1);
909 el->el_map.key = (el_action_t *)el_malloc(sizeof(el_action_t) * N_KEYS);
910 return -1;
911 el->el_map.key = el_malloc(sizeof(*el->el_map.key) * N_KEYS);
910 if (el->el_map.key == NULL)
912 if (el->el_map.key == NULL)
911 return (-1);
913 return -1;
912 el->el_map.emacs = el_map_emacs;
913 el->el_map.vic = el_map_vi_command;
914 el->el_map.vii = el_map_vi_insert;
914 el->el_map.emacs = el_map_emacs;
915 el->el_map.vic = el_map_vi_command;
916 el->el_map.vii = el_map_vi_insert;
915 el->el_map.help = (el_bindings_t *) el_malloc(sizeof(el_bindings_t) *
916 EL_NUM_FCNS);
917 el->el_map.help = el_malloc(sizeof(*el->el_map.help) * EL_NUM_FCNS);
917 if (el->el_map.help == NULL)
918 if (el->el_map.help == NULL)
918 return (-1);
919 return -1;
919 (void) memcpy(el->el_map.help, help__get(),
920 (void) memcpy(el->el_map.help, help__get(),
920 sizeof(el_bindings_t) * EL_NUM_FCNS);
921 el->el_map.func = (el_func_t *)el_malloc(sizeof(el_func_t) *
922 EL_NUM_FCNS);
921 sizeof(*el->el_map.help) * EL_NUM_FCNS);
922 el->el_map.func = el_malloc(sizeof(*el->el_map.func) * EL_NUM_FCNS);
923 if (el->el_map.func == NULL)
923 if (el->el_map.func == NULL)
924 return (-1);
925 memcpy(el->el_map.func, func__get(), sizeof(el_func_t) * EL_NUM_FCNS);
924 return -1;
925 memcpy(el->el_map.func, func__get(), sizeof(*el->el_map.func)
926 * EL_NUM_FCNS);
926 el->el_map.nfunc = EL_NUM_FCNS;
927
928#ifdef VIDEFAULT
929 map_init_vi(el);
930#else
931 map_init_emacs(el);
932#endif /* VIDEFAULT */
927 el->el_map.nfunc = EL_NUM_FCNS;
928
929#ifdef VIDEFAULT
930 map_init_vi(el);
931#else
932 map_init_emacs(el);
933#endif /* VIDEFAULT */
933 return (0);
934 return 0;
934}
935
936
937/* map_end():
938 * Free the space taken by the editor maps
939 */
940protected void
941map_end(EditLine *el)
942{
943
935}
936
937
938/* map_end():
939 * Free the space taken by the editor maps
940 */
941protected void
942map_end(EditLine *el)
943{
944
944 el_free((ptr_t) el->el_map.alt);
945 el_free(el->el_map.alt);
945 el->el_map.alt = NULL;
946 el->el_map.alt = NULL;
946 el_free((ptr_t) el->el_map.key);
947 el_free(el->el_map.key);
947 el->el_map.key = NULL;
948 el->el_map.emacs = NULL;
949 el->el_map.vic = NULL;
950 el->el_map.vii = NULL;
948 el->el_map.key = NULL;
949 el->el_map.emacs = NULL;
950 el->el_map.vic = NULL;
951 el->el_map.vii = NULL;
951 el_free((ptr_t) el->el_map.help);
952 el_free(el->el_map.help);
952 el->el_map.help = NULL;
953 el->el_map.help = NULL;
953 el_free((ptr_t) el->el_map.func);
954 el_free(el->el_map.func);
954 el->el_map.func = NULL;
955}
956
957
958/* map_init_nls():
959 * Find all the printable keys and bind them to self insert
960 */
961private void
962map_init_nls(EditLine *el)
963{
964 int i;
965
966 el_action_t *map = el->el_map.key;
967
968 for (i = 0200; i <= 0377; i++)
955 el->el_map.func = NULL;
956}
957
958
959/* map_init_nls():
960 * Find all the printable keys and bind them to self insert
961 */
962private void
963map_init_nls(EditLine *el)
964{
965 int i;
966
967 el_action_t *map = el->el_map.key;
968
969 for (i = 0200; i <= 0377; i++)
969 if (isprint(i))
970 if (Isprint(i))
970 map[i] = ED_INSERT;
971}
972
973
974/* map_init_meta():
975 * Bind all the meta keys to the appropriate ESC-<key> sequence
976 */
977private void
978map_init_meta(EditLine *el)
979{
971 map[i] = ED_INSERT;
972}
973
974
975/* map_init_meta():
976 * Bind all the meta keys to the appropriate ESC-<key> sequence
977 */
978private void
979map_init_meta(EditLine *el)
980{
980 char buf[3];
981 Char buf[3];
981 int i;
982 el_action_t *map = el->el_map.key;
983 el_action_t *alt = el->el_map.alt;
984
985 for (i = 0; i <= 0377 && map[i] != EM_META_NEXT; i++)
986 continue;
987
988 if (i > 0377) {
989 for (i = 0; i <= 0377 && alt[i] != EM_META_NEXT; i++)
990 continue;
991 if (i > 0377) {
992 i = 033;
993 if (el->el_map.type == MAP_VI)
994 map = alt;
995 } else
996 map = alt;
997 }
982 int i;
983 el_action_t *map = el->el_map.key;
984 el_action_t *alt = el->el_map.alt;
985
986 for (i = 0; i <= 0377 && map[i] != EM_META_NEXT; i++)
987 continue;
988
989 if (i > 0377) {
990 for (i = 0; i <= 0377 && alt[i] != EM_META_NEXT; i++)
991 continue;
992 if (i > 0377) {
993 i = 033;
994 if (el->el_map.type == MAP_VI)
995 map = alt;
996 } else
997 map = alt;
998 }
998 buf[0] = (char) i;
999 buf[0] = (Char) i;
999 buf[2] = 0;
1000 for (i = 0200; i <= 0377; i++)
1001 switch (map[i]) {
1002 case ED_INSERT:
1003 case ED_UNASSIGNED:
1004 case ED_SEQUENCE_LEAD_IN:
1005 break;
1006 default:
1007 buf[1] = i & 0177;
1000 buf[2] = 0;
1001 for (i = 0200; i <= 0377; i++)
1002 switch (map[i]) {
1003 case ED_INSERT:
1004 case ED_UNASSIGNED:
1005 case ED_SEQUENCE_LEAD_IN:
1006 break;
1007 default:
1008 buf[1] = i & 0177;
1008 key_add(el, buf, key_map_cmd(el, (int) map[i]), XK_CMD);
1009 keymacro_add(el, buf, keymacro_map_cmd(el, (int) map[i]), XK_CMD);
1009 break;
1010 }
1011 map[(int) buf[0]] = ED_SEQUENCE_LEAD_IN;
1012}
1013
1014
1015/* map_init_vi():
1016 * Initialize the vi bindings

--- 5 unchanged lines hidden (view full) ---

1022 el_action_t *key = el->el_map.key;
1023 el_action_t *alt = el->el_map.alt;
1024 const el_action_t *vii = el->el_map.vii;
1025 const el_action_t *vic = el->el_map.vic;
1026
1027 el->el_map.type = MAP_VI;
1028 el->el_map.current = el->el_map.key;
1029
1010 break;
1011 }
1012 map[(int) buf[0]] = ED_SEQUENCE_LEAD_IN;
1013}
1014
1015
1016/* map_init_vi():
1017 * Initialize the vi bindings

--- 5 unchanged lines hidden (view full) ---

1023 el_action_t *key = el->el_map.key;
1024 el_action_t *alt = el->el_map.alt;
1025 const el_action_t *vii = el->el_map.vii;
1026 const el_action_t *vic = el->el_map.vic;
1027
1028 el->el_map.type = MAP_VI;
1029 el->el_map.current = el->el_map.key;
1030
1030 key_reset(el);
1031 keymacro_reset(el);
1031
1032 for (i = 0; i < N_KEYS; i++) {
1033 key[i] = vii[i];
1034 alt[i] = vic[i];
1035 }
1036
1037 map_init_meta(el);
1038 map_init_nls(el);
1039
1040 tty_bind_char(el, 1);
1032
1033 for (i = 0; i < N_KEYS; i++) {
1034 key[i] = vii[i];
1035 alt[i] = vic[i];
1036 }
1037
1038 map_init_meta(el);
1039 map_init_nls(el);
1040
1041 tty_bind_char(el, 1);
1041 term_bind_arrow(el);
1042 terminal_bind_arrow(el);
1042}
1043
1044
1045/* map_init_emacs():
1046 * Initialize the emacs bindings
1047 */
1048protected void
1049map_init_emacs(EditLine *el)
1050{
1051 int i;
1043}
1044
1045
1046/* map_init_emacs():
1047 * Initialize the emacs bindings
1048 */
1049protected void
1050map_init_emacs(EditLine *el)
1051{
1052 int i;
1052 char buf[3];
1053 Char buf[3];
1053 el_action_t *key = el->el_map.key;
1054 el_action_t *alt = el->el_map.alt;
1055 const el_action_t *emacs = el->el_map.emacs;
1056
1057 el->el_map.type = MAP_EMACS;
1058 el->el_map.current = el->el_map.key;
1054 el_action_t *key = el->el_map.key;
1055 el_action_t *alt = el->el_map.alt;
1056 const el_action_t *emacs = el->el_map.emacs;
1057
1058 el->el_map.type = MAP_EMACS;
1059 el->el_map.current = el->el_map.key;
1059 key_reset(el);
1060 keymacro_reset(el);
1060
1061 for (i = 0; i < N_KEYS; i++) {
1062 key[i] = emacs[i];
1063 alt[i] = ED_UNASSIGNED;
1064 }
1065
1066 map_init_meta(el);
1067 map_init_nls(el);
1068
1069 buf[0] = CONTROL('X');
1070 buf[1] = CONTROL('X');
1071 buf[2] = 0;
1061
1062 for (i = 0; i < N_KEYS; i++) {
1063 key[i] = emacs[i];
1064 alt[i] = ED_UNASSIGNED;
1065 }
1066
1067 map_init_meta(el);
1068 map_init_nls(el);
1069
1070 buf[0] = CONTROL('X');
1071 buf[1] = CONTROL('X');
1072 buf[2] = 0;
1072 key_add(el, buf, key_map_cmd(el, EM_EXCHANGE_MARK), XK_CMD);
1073 keymacro_add(el, buf, keymacro_map_cmd(el, EM_EXCHANGE_MARK), XK_CMD);
1073
1074 tty_bind_char(el, 1);
1074
1075 tty_bind_char(el, 1);
1075 term_bind_arrow(el);
1076 terminal_bind_arrow(el);
1076}
1077
1078
1079/* map_set_editor():
1080 * Set the editor
1081 */
1082protected int
1077}
1078
1079
1080/* map_set_editor():
1081 * Set the editor
1082 */
1083protected int
1083map_set_editor(EditLine *el, char *editor)
1084map_set_editor(EditLine *el, Char *editor)
1084{
1085
1085{
1086
1086 if (strcmp(editor, "emacs") == 0) {
1087 if (Strcmp(editor, STR("emacs")) == 0) {
1087 map_init_emacs(el);
1088 map_init_emacs(el);
1088 return (0);
1089 return 0;
1089 }
1090 }
1090 if (strcmp(editor, "vi") == 0) {
1091 if (Strcmp(editor, STR("vi")) == 0) {
1091 map_init_vi(el);
1092 map_init_vi(el);
1092 return (0);
1093 return 0;
1093 }
1094 }
1094 return (-1);
1095 return -1;
1095}
1096
1097
1098/* map_get_editor():
1099 * Retrieve the editor
1100 */
1101protected int
1096}
1097
1098
1099/* map_get_editor():
1100 * Retrieve the editor
1101 */
1102protected int
1102map_get_editor(EditLine *el, const char **editor)
1103map_get_editor(EditLine *el, const Char **editor)
1103{
1104
1105 if (editor == NULL)
1104{
1105
1106 if (editor == NULL)
1106 return (-1);
1107 return -1;
1107 switch (el->el_map.type) {
1108 case MAP_EMACS:
1108 switch (el->el_map.type) {
1109 case MAP_EMACS:
1109 *editor = "emacs";
1110 return (0);
1110 *editor = STR("emacs");
1111 return 0;
1111 case MAP_VI:
1112 case MAP_VI:
1112 *editor = "vi";
1113 return (0);
1113 *editor = STR("vi");
1114 return 0;
1114 }
1115 }
1115 return (-1);
1116 return -1;
1116}
1117
1118
1119/* map_print_key():
1120 * Print the function description for 1 key
1121 */
1122private void
1117}
1118
1119
1120/* map_print_key():
1121 * Print the function description for 1 key
1122 */
1123private void
1123map_print_key(EditLine *el, el_action_t *map, const char *in)
1124map_print_key(EditLine *el, el_action_t *map, const Char *in)
1124{
1125 char outbuf[EL_BUFSIZ];
1126 el_bindings_t *bp, *ep;
1127
1128 if (in[0] == '\0' || in[1] == '\0') {
1125{
1126 char outbuf[EL_BUFSIZ];
1127 el_bindings_t *bp, *ep;
1128
1129 if (in[0] == '\0' || in[1] == '\0') {
1129 (void) key__decode_str(in, outbuf, sizeof(outbuf), "");
1130 (void) keymacro__decode_str(in, outbuf, sizeof(outbuf), "");
1130 ep = &el->el_map.help[el->el_map.nfunc];
1131 for (bp = el->el_map.help; bp < ep; bp++)
1132 if (bp->func == map[(unsigned char) *in]) {
1133 (void) fprintf(el->el_outfile,
1131 ep = &el->el_map.help[el->el_map.nfunc];
1132 for (bp = el->el_map.help; bp < ep; bp++)
1133 if (bp->func == map[(unsigned char) *in]) {
1134 (void) fprintf(el->el_outfile,
1134 "%s\t->\t%s\n", outbuf, bp->name);
1135 "%s\t->\t" FSTR "\n", outbuf, bp->name);
1135 return;
1136 }
1137 } else
1136 return;
1137 }
1138 } else
1138 key_print(el, in);
1139 keymacro_print(el, in);
1139}
1140
1141
1142/* map_print_some_keys():
1143 * Print keys from first to last
1144 */
1145private void
1140}
1141
1142
1143/* map_print_some_keys():
1144 * Print keys from first to last
1145 */
1146private void
1146map_print_some_keys(EditLine *el, el_action_t *map, int first, int last)
1147map_print_some_keys(EditLine *el, el_action_t *map, Int first, Int last)
1147{
1148 el_bindings_t *bp, *ep;
1148{
1149 el_bindings_t *bp, *ep;
1149 char firstbuf[2], lastbuf[2];
1150 Char firstbuf[2], lastbuf[2];
1150 char unparsbuf[EL_BUFSIZ], extrabuf[EL_BUFSIZ];
1151
1152 firstbuf[0] = first;
1153 firstbuf[1] = 0;
1154 lastbuf[0] = last;
1155 lastbuf[1] = 0;
1156 if (map[first] == ED_UNASSIGNED) {
1157 if (first == last) {
1151 char unparsbuf[EL_BUFSIZ], extrabuf[EL_BUFSIZ];
1152
1153 firstbuf[0] = first;
1154 firstbuf[1] = 0;
1155 lastbuf[0] = last;
1156 lastbuf[1] = 0;
1157 if (map[first] == ED_UNASSIGNED) {
1158 if (first == last) {
1158 (void) key__decode_str(firstbuf, unparsbuf,
1159 (void) keymacro__decode_str(firstbuf, unparsbuf,
1159 sizeof(unparsbuf), STRQQ);
1160 (void) fprintf(el->el_outfile,
1161 "%-15s-> is undefined\n", unparsbuf);
1162 }
1163 return;
1164 }
1165 ep = &el->el_map.help[el->el_map.nfunc];
1166 for (bp = el->el_map.help; bp < ep; bp++) {
1167 if (bp->func == map[first]) {
1168 if (first == last) {
1160 sizeof(unparsbuf), STRQQ);
1161 (void) fprintf(el->el_outfile,
1162 "%-15s-> is undefined\n", unparsbuf);
1163 }
1164 return;
1165 }
1166 ep = &el->el_map.help[el->el_map.nfunc];
1167 for (bp = el->el_map.help; bp < ep; bp++) {
1168 if (bp->func == map[first]) {
1169 if (first == last) {
1169 (void) key__decode_str(firstbuf, unparsbuf,
1170 (void) keymacro__decode_str(firstbuf, unparsbuf,
1170 sizeof(unparsbuf), STRQQ);
1171 sizeof(unparsbuf), STRQQ);
1171 (void) fprintf(el->el_outfile, "%-15s-> %s\n",
1172 (void) fprintf(el->el_outfile, "%-15s-> " FSTR "\n",
1172 unparsbuf, bp->name);
1173 } else {
1173 unparsbuf, bp->name);
1174 } else {
1174 (void) key__decode_str(firstbuf, unparsbuf,
1175 (void) keymacro__decode_str(firstbuf, unparsbuf,
1175 sizeof(unparsbuf), STRQQ);
1176 sizeof(unparsbuf), STRQQ);
1176 (void) key__decode_str(lastbuf, extrabuf,
1177 (void) keymacro__decode_str(lastbuf, extrabuf,
1177 sizeof(extrabuf), STRQQ);
1178 (void) fprintf(el->el_outfile,
1178 sizeof(extrabuf), STRQQ);
1179 (void) fprintf(el->el_outfile,
1179 "%-4s to %-7s-> %s\n",
1180 "%-4s to %-7s-> " FSTR "\n",
1180 unparsbuf, extrabuf, bp->name);
1181 }
1182 return;
1183 }
1184 }
1185#ifdef MAP_DEBUG
1186 if (map == el->el_map.key) {
1181 unparsbuf, extrabuf, bp->name);
1182 }
1183 return;
1184 }
1185 }
1186#ifdef MAP_DEBUG
1187 if (map == el->el_map.key) {
1187 (void) key__decode_str(firstbuf, unparsbuf,
1188 (void) keymacro__decode_str(firstbuf, unparsbuf,
1188 sizeof(unparsbuf), STRQQ);
1189 (void) fprintf(el->el_outfile,
1190 "BUG!!! %s isn't bound to anything.\n", unparsbuf);
1191 (void) fprintf(el->el_outfile, "el->el_map.key[%d] == %d\n",
1192 first, el->el_map.key[first]);
1193 } else {
1189 sizeof(unparsbuf), STRQQ);
1190 (void) fprintf(el->el_outfile,
1191 "BUG!!! %s isn't bound to anything.\n", unparsbuf);
1192 (void) fprintf(el->el_outfile, "el->el_map.key[%d] == %d\n",
1193 first, el->el_map.key[first]);
1194 } else {
1194 (void) key__decode_str(firstbuf, unparsbuf,
1195 (void) keymacro__decode_str(firstbuf, unparsbuf,
1195 sizeof(unparsbuf), STRQQ);
1196 (void) fprintf(el->el_outfile,
1197 "BUG!!! %s isn't bound to anything.\n", unparsbuf);
1198 (void) fprintf(el->el_outfile, "el->el_map.alt[%d] == %d\n",
1199 first, el->el_map.alt[first]);
1200 }
1201#endif
1202 EL_ABORT((el->el_errfile, "Error printing keys\n"));

--- 24 unchanged lines hidden (view full) ---

1227 if (el->el_map.alt[prev] == el->el_map.alt[i])
1228 continue;
1229 map_print_some_keys(el, el->el_map.alt, prev, i - 1);
1230 prev = i;
1231 }
1232 map_print_some_keys(el, el->el_map.alt, prev, i - 1);
1233
1234 (void) fprintf(el->el_outfile, "Multi-character bindings\n");
1196 sizeof(unparsbuf), STRQQ);
1197 (void) fprintf(el->el_outfile,
1198 "BUG!!! %s isn't bound to anything.\n", unparsbuf);
1199 (void) fprintf(el->el_outfile, "el->el_map.alt[%d] == %d\n",
1200 first, el->el_map.alt[first]);
1201 }
1202#endif
1203 EL_ABORT((el->el_errfile, "Error printing keys\n"));

--- 24 unchanged lines hidden (view full) ---

1228 if (el->el_map.alt[prev] == el->el_map.alt[i])
1229 continue;
1230 map_print_some_keys(el, el->el_map.alt, prev, i - 1);
1231 prev = i;
1232 }
1233 map_print_some_keys(el, el->el_map.alt, prev, i - 1);
1234
1235 (void) fprintf(el->el_outfile, "Multi-character bindings\n");
1235 key_print(el, "");
1236 keymacro_print(el, STR(""));
1236 (void) fprintf(el->el_outfile, "Arrow key bindings\n");
1237 (void) fprintf(el->el_outfile, "Arrow key bindings\n");
1237 term_print_arrow(el, "");
1238 terminal_print_arrow(el, STR(""));
1238}
1239
1240
1241/* map_bind():
1242 * Add/remove/change bindings
1243 */
1244protected int
1239}
1240
1241
1242/* map_bind():
1243 * Add/remove/change bindings
1244 */
1245protected int
1245map_bind(EditLine *el, int argc, const char **argv)
1246map_bind(EditLine *el, int argc, const Char **argv)
1246{
1247 el_action_t *map;
1248 int ntype, rem;
1247{
1248 el_action_t *map;
1249 int ntype, rem;
1249 const char *p;
1250 char inbuf[EL_BUFSIZ];
1251 char outbuf[EL_BUFSIZ];
1252 const char *in = NULL;
1253 char *out;
1250 const Char *p;
1251 Char inbuf[EL_BUFSIZ];
1252 Char outbuf[EL_BUFSIZ];
1253 const Char *in = NULL;
1254 Char *out;
1254 el_bindings_t *bp, *ep;
1255 int cmd;
1256 int key;
1257
1258 if (argv == NULL)
1255 el_bindings_t *bp, *ep;
1256 int cmd;
1257 int key;
1258
1259 if (argv == NULL)
1259 return (-1);
1260 return -1;
1260
1261 map = el->el_map.key;
1262 ntype = XK_CMD;
1263 key = rem = 0;
1264 for (argc = 1; (p = argv[argc]) != NULL; argc++)
1265 if (p[0] == '-')
1266 switch (p[1]) {
1267 case 'a':

--- 13 unchanged lines hidden (view full) ---

1281 break;
1282
1283 case 'r':
1284 rem = 1;
1285 break;
1286
1287 case 'v':
1288 map_init_vi(el);
1261
1262 map = el->el_map.key;
1263 ntype = XK_CMD;
1264 key = rem = 0;
1265 for (argc = 1; (p = argv[argc]) != NULL; argc++)
1266 if (p[0] == '-')
1267 switch (p[1]) {
1268 case 'a':

--- 13 unchanged lines hidden (view full) ---

1282 break;
1283
1284 case 'r':
1285 rem = 1;
1286 break;
1287
1288 case 'v':
1289 map_init_vi(el);
1289 return (0);
1290 return 0;
1290
1291 case 'e':
1292 map_init_emacs(el);
1291
1292 case 'e':
1293 map_init_emacs(el);
1293 return (0);
1294 return 0;
1294
1295 case 'l':
1296 ep = &el->el_map.help[el->el_map.nfunc];
1297 for (bp = el->el_map.help; bp < ep; bp++)
1298 (void) fprintf(el->el_outfile,
1295
1296 case 'l':
1297 ep = &el->el_map.help[el->el_map.nfunc];
1298 for (bp = el->el_map.help; bp < ep; bp++)
1299 (void) fprintf(el->el_outfile,
1299 "%s\n\t%s\n",
1300 "" FSTR "\n\t" FSTR "\n",
1300 bp->name, bp->description);
1301 bp->name, bp->description);
1301 return (0);
1302 return 0;
1302 default:
1303 (void) fprintf(el->el_errfile,
1303 default:
1304 (void) fprintf(el->el_errfile,
1304 "%s: Invalid switch `%c'.\n",
1305 "" FSTR ": Invalid switch `%c'.\n",
1305 argv[0], p[1]);
1306 }
1307 else
1308 break;
1309
1310 if (argv[argc] == NULL) {
1311 map_print_all_keys(el);
1306 argv[0], p[1]);
1307 }
1308 else
1309 break;
1310
1311 if (argv[argc] == NULL) {
1312 map_print_all_keys(el);
1312 return (0);
1313 return 0;
1313 }
1314 if (key)
1315 in = argv[argc++];
1316 else if ((in = parse__string(inbuf, argv[argc++])) == NULL) {
1317 (void) fprintf(el->el_errfile,
1314 }
1315 if (key)
1316 in = argv[argc++];
1317 else if ((in = parse__string(inbuf, argv[argc++])) == NULL) {
1318 (void) fprintf(el->el_errfile,
1318 "%s: Invalid \\ or ^ in instring.\n",
1319 "" FSTR ": Invalid \\ or ^ in instring.\n",
1319 argv[0]);
1320 argv[0]);
1320 return (-1);
1321 return -1;
1321 }
1322 if (rem) {
1323 if (key) {
1322 }
1323 if (rem) {
1324 if (key) {
1324 (void) term_clear_arrow(el, in);
1325 return (-1);
1325 (void) terminal_clear_arrow(el, in);
1326 return -1;
1326 }
1327 if (in[1])
1327 }
1328 if (in[1])
1328 (void) key_delete(el, in);
1329 (void) keymacro_delete(el, in);
1329 else if (map[(unsigned char) *in] == ED_SEQUENCE_LEAD_IN)
1330 else if (map[(unsigned char) *in] == ED_SEQUENCE_LEAD_IN)
1330 (void) key_delete(el, in);
1331 (void) keymacro_delete(el, in);
1331 else
1332 map[(unsigned char) *in] = ED_UNASSIGNED;
1332 else
1333 map[(unsigned char) *in] = ED_UNASSIGNED;
1333 return (0);
1334 return 0;
1334 }
1335 if (argv[argc] == NULL) {
1336 if (key)
1335 }
1336 if (argv[argc] == NULL) {
1337 if (key)
1337 term_print_arrow(el, in);
1338 terminal_print_arrow(el, in);
1338 else
1339 map_print_key(el, map, in);
1339 else
1340 map_print_key(el, map, in);
1340 return (0);
1341 return 0;
1341 }
1342#ifdef notyet
1343 if (argv[argc + 1] != NULL) {
1342 }
1343#ifdef notyet
1344 if (argv[argc + 1] != NULL) {
1344 bindkey_usage();
1345 return (-1);
1345 bindkeymacro_usage();
1346 return -1;
1346 }
1347#endif
1348
1349 switch (ntype) {
1350 case XK_STR:
1351 case XK_EXE:
1352 if ((out = parse__string(outbuf, argv[argc])) == NULL) {
1353 (void) fprintf(el->el_errfile,
1347 }
1348#endif
1349
1350 switch (ntype) {
1351 case XK_STR:
1352 case XK_EXE:
1353 if ((out = parse__string(outbuf, argv[argc])) == NULL) {
1354 (void) fprintf(el->el_errfile,
1354 "%s: Invalid \\ or ^ in outstring.\n", argv[0]);
1355 return (-1);
1355 "" FSTR ": Invalid \\ or ^ in outstring.\n", argv[0]);
1356 return -1;
1356 }
1357 if (key)
1357 }
1358 if (key)
1358 term_set_arrow(el, in, key_map_str(el, out), ntype);
1359 terminal_set_arrow(el, in, keymacro_map_str(el, out), ntype);
1359 else
1360 else
1360 key_add(el, in, key_map_str(el, out), ntype);
1361 keymacro_add(el, in, keymacro_map_str(el, out), ntype);
1361 map[(unsigned char) *in] = ED_SEQUENCE_LEAD_IN;
1362 break;
1363
1364 case XK_CMD:
1365 if ((cmd = parse_cmd(el, argv[argc])) == -1) {
1366 (void) fprintf(el->el_errfile,
1362 map[(unsigned char) *in] = ED_SEQUENCE_LEAD_IN;
1363 break;
1364
1365 case XK_CMD:
1366 if ((cmd = parse_cmd(el, argv[argc])) == -1) {
1367 (void) fprintf(el->el_errfile,
1367 "%s: Invalid command `%s'.\n", argv[0], argv[argc]);
1368 return (-1);
1368 "" FSTR ": Invalid command `" FSTR "'.\n",
1369 argv[0], argv[argc]);
1370 return -1;
1369 }
1370 if (key)
1371 }
1372 if (key)
1371 term_set_arrow(el, in, key_map_cmd(el, cmd), ntype);
1373 terminal_set_arrow(el, in, keymacro_map_cmd(el, cmd), ntype);
1372 else {
1373 if (in[1]) {
1374 else {
1375 if (in[1]) {
1374 key_add(el, in, key_map_cmd(el, cmd), ntype);
1376 keymacro_add(el, in, keymacro_map_cmd(el, cmd), ntype);
1375 map[(unsigned char) *in] = ED_SEQUENCE_LEAD_IN;
1376 } else {
1377 map[(unsigned char) *in] = ED_SEQUENCE_LEAD_IN;
1378 } else {
1377 key_clear(el, map, in);
1378 map[(unsigned char) *in] = cmd;
1379 keymacro_clear(el, map, in);
1380 map[(unsigned char) *in] = (el_action_t)cmd;
1379 }
1380 }
1381 break;
1382
1381 }
1382 }
1383 break;
1384
1385 /* coverity[dead_error_begin] */
1383 default:
1384 EL_ABORT((el->el_errfile, "Bad XK_ type %d\n", ntype));
1385 break;
1386 }
1386 default:
1387 EL_ABORT((el->el_errfile, "Bad XK_ type %d\n", ntype));
1388 break;
1389 }
1387 return (0);
1390 return 0;
1388}
1389
1390
1391/* map_addfunc():
1392 * add a user defined function
1393 */
1394protected int
1391}
1392
1393
1394/* map_addfunc():
1395 * add a user defined function
1396 */
1397protected int
1395map_addfunc(EditLine *el, const char *name, const char *help, el_func_t func)
1398map_addfunc(EditLine *el, const Char *name, const Char *help, el_func_t func)
1396{
1397 void *p;
1399{
1400 void *p;
1398 int nf = el->el_map.nfunc + 1;
1401 size_t nf = el->el_map.nfunc + 1;
1399
1400 if (name == NULL || help == NULL || func == NULL)
1402
1403 if (name == NULL || help == NULL || func == NULL)
1401 return (-1);
1404 return -1;
1402
1405
1403 if ((p = el_realloc(el->el_map.func, nf * sizeof(el_func_t))) == NULL)
1404 return (-1);
1405 el->el_map.func = (el_func_t *) p;
1406 if ((p = el_realloc(el->el_map.help, nf * sizeof(el_bindings_t)))
1406 if ((p = el_realloc(el->el_map.func, nf *
1407 sizeof(*el->el_map.func))) == NULL)
1408 return -1;
1409 el->el_map.func = p;
1410 if ((p = el_realloc(el->el_map.help, nf * sizeof(*el->el_map.help)))
1407 == NULL)
1411 == NULL)
1408 return (-1);
1409 el->el_map.help = (el_bindings_t *) p;
1412 return -1;
1413 el->el_map.help = p;
1410
1414
1411 nf = el->el_map.nfunc;
1415 nf = (size_t)el->el_map.nfunc;
1412 el->el_map.func[nf] = func;
1413
1414 el->el_map.help[nf].name = name;
1416 el->el_map.func[nf] = func;
1417
1418 el->el_map.help[nf].name = name;
1415 el->el_map.help[nf].func = nf;
1419 el->el_map.help[nf].func = (int)nf;
1416 el->el_map.help[nf].description = help;
1417 el->el_map.nfunc++;
1418
1420 el->el_map.help[nf].description = help;
1421 el->el_map.nfunc++;
1422
1419 return (0);
1423 return 0;
1420}
1424}