# HG changeset patch # User Richard M. Stallman # Date 884387678 0 # Node ID b4f792fd5e50f5b7fc28edb542b0e5d9863444f8 # Parent 619c69f1ab8327e7c4ee2383d27cc7c89a17e4bb (echo_now): Use message2_nolog, not message1_nolog. (Fexecute_extended_command): Likewise. (read_char_minibuf_menu_prompt): Use message2_nolog, not message1. (parse_modifiers): Use size_byte. (echo_char): Use size_byte. (parse_modifiers_uncached): Likewise. (record_char): Likewise. (parse_solitary_modifier): Likewise. (read_char): Use Faref on Vkeyboard_translate_table if it is a string. (apply_modifiers_uncached): New arg base_len_byte. Calls changed. (read_char_minibuf_menu_prompt): (read_key_sequence): Access buffer's downcase_table with XCHAR_TABLE. (Fexecute_extended_command): Use Faref to access FUNCTION. Use size_byte of BINDING. (stuff_buffered_input): Use size_byte of STUFFSTRING. diff -r 619c69f1ab83 -r b4f792fd5e50 src/keyboard.c --- a/src/keyboard.c Fri Jan 09 23:13:22 1998 +0000 +++ b/src/keyboard.c Fri Jan 09 23:14:38 1998 +0000 @@ -614,10 +614,11 @@ else if (SYMBOLP (c)) { struct Lisp_String *name = XSYMBOL (c)->name; - if ((ptr - current_kboard->echobuf) + name->size + 4 > ECHOBUFSIZE) + if ((ptr - current_kboard->echobuf) + name->size_byte + 4 + > ECHOBUFSIZE) return; - bcopy (name->data, ptr, name->size); - ptr += name->size; + bcopy (name->data, ptr, name->size_byte); + ptr += name->size_byte; } if (current_kboard->echoptr == current_kboard->echobuf @@ -681,7 +682,9 @@ } echoing = 1; - message1_nolog (current_kboard->echobuf); + message2_nolog (current_kboard->echobuf, strlen (current_kboard->echobuf), + ! NILP (current_buffer->enable_multibyte_characters)); + echoing = 0; if (waiting_for_input && !NILP (Vquit_flag)) @@ -945,6 +948,14 @@ return make_number (0); } +/* Take actions on handling an error. DATA is the data that describes + the error. + + CONTEXT is a C-string containing ASCII characters only which + describes the context in which the error happened. If we need to + generalize CONTEXT to allow multibyte characters, make it a Lisp + string. */ + void cmd_error_internal (data, context) Lisp_Object data; @@ -1158,7 +1169,7 @@ Fsit_for (make_number (2), Qnil, Qnil); /* Clear the echo area. */ - message2 (0, 0); + message2 (0, 0, 0); safe_run_hooks (Qecho_area_clear_hook); unbind_to (count, Qnil); @@ -2177,13 +2188,12 @@ if (XINT (c) == -1) RETURN_UNGCPRO (c); - if (STRINGP (Vkeyboard_translate_table) - && XSTRING (Vkeyboard_translate_table)->size > (unsigned) XFASTINT (c)) - XSETINT (c, XSTRING (Vkeyboard_translate_table)->data[XFASTINT (c)]); - else if ((VECTORP (Vkeyboard_translate_table) - && XVECTOR (Vkeyboard_translate_table)->size > (unsigned) XFASTINT (c)) - || (CHAR_TABLE_P (Vkeyboard_translate_table) - && CHAR_TABLE_ORDINARY_SLOTS > (unsigned) XFASTINT (c))) + if ((STRINGP (Vkeyboard_translate_table) + && XSTRING (Vkeyboard_translate_table)->size > (unsigned) XFASTINT (c)) + || (VECTORP (Vkeyboard_translate_table) + && XVECTOR (Vkeyboard_translate_table)->size > (unsigned) XFASTINT (c)) + || (CHAR_TABLE_P (Vkeyboard_translate_table) + && CHAR_TABLE_ORDINARY_SLOTS > (unsigned) XFASTINT (c))) { Lisp_Object d; d = Faref (Vkeyboard_translate_table, c); @@ -2366,7 +2376,7 @@ { putc ('<', dribble); fwrite (XSYMBOL (dribblee)->name->data, sizeof (char), - XSYMBOL (dribblee)->name->size, + XSYMBOL (dribblee)->name->size_byte, dribble); putc ('>', dribble); } @@ -4328,7 +4338,7 @@ modifiers = 0; name = XSYMBOL (symbol)->name; - for (i = 0; i+2 <= name->size; ) + for (i = 0; i+2 <= name->size_byte; ) { int this_mod_end = 0; int this_mod = 0; @@ -4375,7 +4385,7 @@ /* Check there is a dash after the modifier, so that it really is a modifier. */ - if (this_mod_end >= name->size || name->data[this_mod_end] != '-') + if (this_mod_end >= name->size_byte || name->data[this_mod_end] != '-') break; /* This modifier is real; look for another. */ @@ -4386,7 +4396,7 @@ /* Should we include the `click' modifier? */ if (! (modifiers & (down_modifier | drag_modifier | double_modifier | triple_modifier)) - && i + 7 == name->size + && i + 7 == name->size_byte && strncmp (name->data + i, "mouse-", 6) == 0 && ('0' <= name->data[i + 6] && name->data[i + 6] <= '9')) modifiers |= click_modifier; @@ -4401,16 +4411,16 @@ prepended to the string BASE[0..BASE_LEN-1]. This doesn't use any caches. */ static Lisp_Object -apply_modifiers_uncached (modifiers, base, base_len) +apply_modifiers_uncached (modifiers, base, base_len, base_len_byte) int modifiers; char *base; - int base_len; + int base_len, base_len_byte; { /* Since BASE could contain nulls, we can't use intern here; we have to use Fintern, which expects a genuine Lisp_String, and keeps a reference to it. */ - char *new_mods = - (char *) alloca (sizeof ("A-C-H-M-S-s-down-drag-double-triple-")); + char *new_mods + = (char *) alloca (sizeof ("A-C-H-M-S-s-down-drag-double-triple-")); int mod_len; { @@ -4441,9 +4451,10 @@ { Lisp_Object new_name; - new_name = make_uninit_string (mod_len + base_len); + new_name = make_uninit_multibyte_string (mod_len + base_len, + mod_len + base_len_byte); bcopy (new_mods, XSTRING (new_name)->data, mod_len); - bcopy (base, XSTRING (new_name)->data + mod_len, base_len); + bcopy (base, XSTRING (new_name)->data + mod_len, base_len_byte); return Fintern (new_name, Qnil); } @@ -4502,7 +4513,7 @@ Lisp_Object mask; unmodified = Fintern (make_string (XSYMBOL (symbol)->name->data + end, - XSYMBOL (symbol)->name->size - end), + XSYMBOL (symbol)->name->size_byte - end), Qnil); if (modifiers & ~(((EMACS_INT)1 << VALBITS) - 1)) @@ -4556,7 +4567,8 @@ /* We have to create the symbol ourselves. */ new_symbol = apply_modifiers_uncached (modifiers, XSYMBOL (base)->name->data, - XSYMBOL (base)->name->size); + XSYMBOL (base)->name->size, + XSYMBOL (base)->name->size_byte); /* Add the new symbol to the base's cache. */ entry = Fcons (index, new_symbol); @@ -4804,11 +4816,11 @@ switch (name->data[0]) { #define SINGLE_LETTER_MOD(BIT) \ - if (name->size == 1) \ + if (name->size_byte == 1) \ return BIT; #define MULTI_LETTER_MOD(BIT, NAME, LEN) \ - if (LEN == name->size \ + if (LEN == name->size_byte \ && ! strncmp (name->data, NAME, LEN)) \ return BIT; @@ -5697,7 +5709,7 @@ /* Prompt string always starts with map's prompt, and a space. */ strcpy (menu, XSTRING (name)->data); - nlength = XSTRING (name)->size; + nlength = XSTRING (name)->size_byte; menu[nlength++] = ':'; menu[nlength++] = ' '; menu[nlength] = 0; @@ -5840,7 +5852,8 @@ } /* Prompt with that and read response. */ - message1 (menu); + message2_nolog (menu, strlen (menu), + ! NILP (current_buffer->enable_multibyte_characters)); /* Make believe its not a keyboard macro in case the help char is pressed. Help characters are not recorded because menu prompting @@ -6884,7 +6897,7 @@ && ! key_translation_possible && INTEGERP (key) && ((((XINT (key) & 0x3ffff) - < XSTRING (current_buffer->downcase_table)->size) + < XCHAR_TABLE (current_buffer->downcase_table)->size) && UPPERCASEP (XINT (key) & 0x3ffff)) || (XINT (key) & shift_modifier))) { @@ -7222,7 +7235,6 @@ struct Lisp_String *str; Lisp_Object *keys; int i; - Lisp_Object tem; this_command_key_count = 0; this_single_command_key_start = 0; @@ -7233,13 +7245,9 @@ str = XSTRING (function); for (i = 0; i < str->size; i++) - { - XSETFASTINT (tem, str->data[i]); - add_command_key (tem); - } - - XSETFASTINT (tem, '\015'); - add_command_key (tem); + add_command_key (Faref (function, make_number (i))); + + add_command_key (make_number ('\015')); } UNGCPRO; @@ -7282,12 +7290,14 @@ newmessage = (char *) alloca (XSYMBOL (function)->name->size - + XSTRING (binding)->size + + XSTRING (binding)->size_byte + 100); sprintf (newmessage, "You can run the command `%s' with %s", XSYMBOL (function)->name->data, XSTRING (binding)->data); - message1_nolog (newmessage); + message2_nolog (newmessage, + strlen (newmessage), + STRING_MULTIBYTE (binding)); if (!NILP (Fsit_for ((NUMBERP (Vsuggest_key_bindings) ? Vsuggest_key_bindings : make_number (2)), Qnil, Qnil))) @@ -7592,7 +7602,7 @@ register int count; p = XSTRING (stuffstring)->data; - count = XSTRING (stuffstring)->size; + count = XSTRING (stuffstring)->size_byte; while (count-- > 0) stuff_char (*p++); stuff_char ('\n');