summaryrefslogtreecommitdiff
path: root/usr.bin/mg
diff options
context:
space:
mode:
Diffstat (limited to 'usr.bin/mg')
-rw-r--r--usr.bin/mg/extend.c15
-rw-r--r--usr.bin/mg/help.c13
-rw-r--r--usr.bin/mg/kbd.c44
-rw-r--r--usr.bin/mg/kbd.h4
4 files changed, 36 insertions, 40 deletions
diff --git a/usr.bin/mg/extend.c b/usr.bin/mg/extend.c
index 5f5ed3d14e4..17c9bc90d20 100644
--- a/usr.bin/mg/extend.c
+++ b/usr.bin/mg/extend.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: extend.c,v 1.7 2001/05/23 16:13:59 art Exp $ */
+/* $OpenBSD: extend.c,v 1.8 2001/05/23 20:19:44 art Exp $ */
/*
* Extended (M-X) commands, rebinding, and startup file processing.
@@ -339,15 +339,14 @@ dobind(curmap, p, unbind)
#ifndef NO_STARTUP
if (inmacro) {
for (s = 0; s < maclcur->l_used - 1; s++) {
- if (doscan(curmap, c = CHARMASK(maclcur->l_text[s]))
+ if (doscan(curmap, c = CHARMASK(maclcur->l_text[s]), &curmap)
!= NULL) {
if (remap(curmap, c, NULL, (KEYMAP *)NULL)
!= TRUE)
return FALSE;
}
- curmap = ele->k_prefmap;
}
- (VOID)doscan(curmap, c = maclcur->l_text[s]);
+ (VOID)doscan(curmap, c = maclcur->l_text[s], NULL);
maclcur = maclcur->l_fp;
} else {
#endif /* !NO_STARTUP */
@@ -358,11 +357,10 @@ dobind(curmap, p, unbind)
ewprintf("%s", prompt);
pep[-1] = ' ';
pep = keyname(pep, c = getkey(FALSE));
- if (doscan(curmap, c) != NULL)
+ if (doscan(curmap, c, &curmap) != NULL)
break;
*pep++ = '-';
*pep = '\0';
- curmap = ele->k_prefmap;
}
#ifndef NO_STARTUP
}
@@ -409,13 +407,12 @@ bindkey(mapp, fname, keys, kcount)
return FALSE;
}
while (--kcount) {
- if (doscan(curmap, c = *keys++) != NULL) {
+ if (doscan(curmap, c = *keys++, &curmap) != NULL) {
if (remap(curmap, c, NULL, (KEYMAP *)NULL) != TRUE)
return FALSE;
}
- curmap = ele->k_prefmap;
}
- (VOID)doscan(curmap, c = *keys);
+ (VOID)doscan(curmap, c = *keys, NULL);
return remap(curmap, c, funct, pref_map);
}
diff --git a/usr.bin/mg/help.c b/usr.bin/mg/help.c
index 8358a3884eb..3062a2c01ee 100644
--- a/usr.bin/mg/help.c
+++ b/usr.bin/mg/help.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: help.c,v 1.5 2001/05/23 16:14:00 art Exp $ */
+/* $OpenBSD: help.c,v 1.6 2001/05/23 20:19:44 art Exp $ */
/*
* Help functions for Mg 2
@@ -52,21 +52,19 @@ desckey(f, n)
pep[-1] = ' ';
pep = keyname(pep, key.k_chars[key.k_count++] =
c = getkey(FALSE));
- if ((funct = doscan(curmap, c)) != NULL)
+ if ((funct = doscan(curmap, c, &curmap)) != NULL)
break;
*pep++ = '-';
*pep = '\0';
- curmap = ele->k_prefmap;
}
if (funct != rescan)
break;
if (ISUPPER(key.k_chars[key.k_count - 1])) {
funct = doscan(curmap,
- TOLOWER(key.k_chars[key.k_count - 1]));
+ TOLOWER(key.k_chars[key.k_count - 1]), &curmap);
if (funct == NULL) {
*pep++ = '-';
*pep = '\0';
- curmap = ele->k_prefmap;
continue;
}
if (funct != rescan)
@@ -77,14 +75,13 @@ nextmode:
break;
curmap = curbp->b_modes[m]->p_map;
for (i = 0; i < key.k_count; i++) {
- funct = doscan(curmap, key.k_chars[i]);
+ funct = doscan(curmap, key.k_chars[i], &curmap);
if (funct != NULL) {
if (i == key.k_count - 1 && funct != rescan)
goto found;
funct = rescan;
goto nextmode;
}
- curmap = ele->k_prefmap;
}
*pep++ = '-';
*pep = '\0';
@@ -207,7 +204,7 @@ help_help(f, n)
return FALSE;
ewprintf("a b c: ");
do {
- funct = doscan(kp, getkey(FALSE));
+ funct = doscan(kp, getkey(FALSE), NULL);
} while (funct == NULL || funct == help_help);
#ifndef NO_MACRO
if (macrodef && macrocount < MAXMACRO)
diff --git a/usr.bin/mg/kbd.c b/usr.bin/mg/kbd.c
index 84dce3e5f09..c68c7de9f60 100644
--- a/usr.bin/mg/kbd.c
+++ b/usr.bin/mg/kbd.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: kbd.c,v 1.6 2001/05/23 16:14:00 art Exp $ */
+/* $OpenBSD: kbd.c,v 1.7 2001/05/23 20:19:44 art Exp $ */
/*
* Terminal independent keyboard handling.
@@ -131,12 +131,14 @@ getkey(flag)
* keymap element the keyboard was found in as a side effect.
*/
PF
-doscan(map, c)
+doscan(map, c, newmap)
KEYMAP *map;
int c;
+ KEYMAP **newmap;
{
MAP_ELEMENT *elec = &map->map_element[0];
MAP_ELEMENT *last = &map->map_element[map->map_num];
+ PF ret;
while (elec < last && c > elec->k_num)
elec++;
@@ -144,8 +146,13 @@ doscan(map, c)
/* used by prefix and binding code */
ele = elec;
if (elec >= last || c < elec->k_base)
- return map->map_default;
- return elec->k_funcp[c - elec->k_base];
+ ret = map->map_default;
+ else
+ ret = elec->k_funcp[c - elec->k_base];
+ if (ret == NULL && newmap != NULL)
+ *newmap = elec->k_prefmap;
+
+ return ret;
}
int
@@ -160,8 +167,8 @@ doin()
curmap = curbp->b_modes[curbp->b_nmodes]->p_map;
key.k_count = 0;
while ((funct = doscan(curmap, (key.k_chars[key.k_count++] =
- getkey(TRUE)))) == NULL)
- curmap = ele->k_prefmap;
+ getkey(TRUE)), &curmap)) == NULL)
+ /*nothing*/;
#ifndef NO_MACRO
if (macrodef && macrocount < MAXMACRO)
macro[macrocount++].m_funct = funct;
@@ -184,17 +191,16 @@ rescan(f, n)
c = TOLOWER(key.k_chars[key.k_count - 1]);
curmap = curbp->b_modes[mode]->p_map;
for (i = 0; i < key.k_count - 1; i++) {
- if ((fp = doscan(curmap, (key.k_chars[i])))
+ if ((fp = doscan(curmap, (key.k_chars[i]), &curmap))
!= NULL)
break;
- curmap = ele->k_prefmap;
}
if (fp == NULL) {
- if ((fp = doscan(curmap, c)) == NULL)
+ if ((fp = doscan(curmap, c, NULL)) == NULL)
while ((fp = doscan(curmap,
key.k_chars[key.k_count++] =
- getkey(TRUE))) == NULL)
- curmap = ele->k_prefmap;
+ getkey(TRUE), &curmap)) == NULL)
+ /*nothing*/;
if (fp != rescan) {
#ifndef NO_MACRO
if (macrodef && macrocount <= MAXMACRO)
@@ -210,14 +216,13 @@ rescan(f, n)
return ABORT;
curmap = curbp->b_modes[mode]->p_map;
for (i = 0; i < key.k_count; i++) {
- if ((fp = doscan(curmap, (key.k_chars[i]))) != NULL)
+ if ((fp = doscan(curmap, (key.k_chars[i]), &curmap)) != NULL)
break;
- curmap = ele->k_prefmap;
}
if (fp == NULL) {
while ((fp = doscan(curmap, key.k_chars[i++] =
- getkey(TRUE))) == NULL)
- curmap = ele->k_prefmap;
+ getkey(TRUE), &curmap)) == NULL)
+ /*nothing*/;
key.k_count = i;
}
if (fp != rescan && i >= key.k_count - 1) {
@@ -249,8 +254,7 @@ universal_argument(f, n)
if (c >= '0' && c <= '9')
return digit_argument(f, nn);
curmap = curbp->b_modes[curbp->b_nmodes]->p_map;
- while ((funct = doscan(curmap, c)) == NULL) {
- curmap = ele->k_prefmap;
+ while ((funct = doscan(curmap, c, &curmap)) == NULL) {
key.k_chars[key.k_count++] = c = getkey(TRUE);
}
if (funct != universal_argument) {
@@ -288,8 +292,7 @@ digit_argument(f, n)
key.k_chars[0] = c;
key.k_count = 1;
curmap = curbp->b_modes[curbp->b_nmodes]->p_map;
- while ((funct = doscan(curmap, c)) == NULL) {
- curmap = ele->k_prefmap;
+ while ((funct = doscan(curmap, c, &curmap)) == NULL) {
key.k_chars[key.k_count++] = c = getkey(TRUE);
}
#ifndef NO_MACRO
@@ -328,8 +331,7 @@ negative_argument(f, n)
key.k_chars[0] = c;
key.k_count = 1;
curmap = curbp->b_modes[curbp->b_nmodes]->p_map;
- while ((funct = doscan(curmap, c)) == NULL) {
- curmap = ele->k_prefmap;
+ while ((funct = doscan(curmap, c, &curmap)) == NULL) {
key.k_chars[key.k_count++] = c = getkey(TRUE);
}
#ifndef NO_MACRO
diff --git a/usr.bin/mg/kbd.h b/usr.bin/mg/kbd.h
index b92846859e0..34dd413401f 100644
--- a/usr.bin/mg/kbd.h
+++ b/usr.bin/mg/kbd.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: kbd.h,v 1.6 2001/05/23 16:18:56 art Exp $ */
+/* $OpenBSD: kbd.h,v 1.7 2001/05/23 20:19:44 art Exp $ */
/*
* kbd.h: type definitions for symbol.c and kbd.c for mg experimental
@@ -50,7 +50,7 @@ typedef struct {
int dobindkey __P((KEYMAP *, char *, char *));
KEYMAP *name_map __P((char *));
MAPS *name_mode __P((char *));
-PF doscan __P((KEYMAP *, int));
+PF doscan __P((KEYMAP *, int, KEYMAP **));
PF name_function __P((char *));
char *function_name __P((PF));
char *map_name __P((KEYMAP *));