From 403dfdc24b0a22f14ded69f6eb4f15dc529f6f10 Mon Sep 17 00:00:00 2001 From: Pavel Roskin Date: Tue, 14 Aug 2001 04:48:26 +0000 Subject: [PATCH] * key.h (define_sequence): Change declaration to return int. * key.c (define_sequence): Return 1 on success, 0 on error. * learn.c (learn_button): Don't accept sequence if define_sequence() has failed. --- src/ChangeLog | 7 +++++++ src/key.c | 23 +++++++++++++++++------ src/key.h | 2 +- src/learn.c | 10 ++++++++-- 4 files changed, 33 insertions(+), 9 deletions(-) diff --git a/src/ChangeLog b/src/ChangeLog index 1a151c8b6..b4f41bd74 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,10 @@ +2001-08-14 Pavel Roskin + + * key.h (define_sequence): Change declaration to return int. + * key.c (define_sequence): Return 1 on success, 0 on error. + * learn.c (learn_button): Don't accept sequence if + define_sequence() has failed. + 2001-08-12 Pavel Roskin * learn.c (learn_save): Fix memory leak. diff --git a/src/key.c b/src/key.c index 817315c12..b2d2517cd 100644 --- a/src/key.c +++ b/src/key.c @@ -370,24 +370,28 @@ static int push_char (int c) return 1; } -void define_sequence (int code, char *seq, int action) +/* + * Return 1 on success, 0 on error. + * An error happens if SEQ is a beginning of an existing longer sequence. + */ +int define_sequence (int code, char *seq, int action) { key_def *base; if (strlen (seq) > sizeof (seq_buffer)-1) - return; + return 0; for (base = keys; (base != 0) && *seq; ){ if (*seq == base->ch){ if (base->child == 0){ if (*(seq+1)){ base->child = create_sequence (seq+1, code, action); - return; + return 1; } else { - /* The sequence clashes */ + /* The sequence matches an existing one. */ base->code = code; base->action = action; - return; + return 1; } } else { base = base->child; @@ -398,11 +402,18 @@ void define_sequence (int code, char *seq, int action) base = base->next; else { base->next = create_sequence (seq, code, action); - return; + return 1; } } } + + if (!*seq) { + /* Attempt to redefine a sequence with a shorter sequence. */ + return 0; + } + keys = create_sequence (seq, code, action); + return 1; } static int *pending_keys; diff --git a/src/key.h b/src/key.h index 558f1c14b..32bd8356c 100644 --- a/src/key.h +++ b/src/key.h @@ -63,7 +63,7 @@ int is_quit_char (int c); #define MCKEY_MOUSE -2 void do_define_key (int code, char *strcap); -void define_sequence (int code, char *seq, int action); +int define_sequence (int code, char *seq, int action); /* internally used in key.c, defined in keyxtra.c */ void load_xtra_key_defines (void); diff --git a/src/learn.c b/src/learn.c index 2246c8bd9..4a0d06179 100644 --- a/src/learn.c +++ b/src/learn.c @@ -107,6 +107,8 @@ _("Please press the %s\n" /* Esc hides the dialog and do not allow definitions of * regular characters */ + int seq_ok; + if (*seq && strcmp (seq, "\\e") && strcmp (seq, "\\e\\e") && strcmp (seq, "^m" ) && (seq [1] || (*seq < ' ' || *seq > '~'))){ @@ -114,9 +116,13 @@ _("Please press the %s\n" learnchanged = 1; learnkeys [action - B_USER].sequence = seq; seq = convert_controls (seq); - define_sequence (key_name_conv_tab [action - B_USER].code, seq, - MCKEY_NOACTION); + seq_ok = define_sequence (key_name_conv_tab [action - B_USER].code, + seq, MCKEY_NOACTION); } else { + seq_ok = 0; + } + + if (!seq_ok) { message (0, _(" Cannot accept this key "), _(" You have entered \"%s\""), seq); }