# HG changeset patch # User Richard M. Stallman # Date 883983486 0 # Node ID 24e567feaf18a6121e054e771d6ec92c5e60c36e # Parent c2510bf630e43b6de4b7b5be3819e491979b0bb4 (test_completion): Pass both kinds of size to oblookup. (Fminibuffer_complete_word): Scan string bytes and chars. Pass new args to insert_from_string. (Ftry_completion): Use size_byte while comparing. (Fall_completions): Use size_byte while comparing. diff -r c2510bf630e4 -r 24e567feaf18 src/minibuf.c --- a/src/minibuf.c Mon Jan 05 06:04:35 1998 +0000 +++ b/src/minibuf.c Mon Jan 05 06:58:06 1998 +0000 @@ -183,9 +183,12 @@ /* Actual minibuffer invocation. */ -static Lisp_Object read_minibuf_unwind (); -Lisp_Object get_minibuffer (); -static Lisp_Object read_minibuf (); +static Lisp_Object read_minibuf_unwind P_ ((Lisp_Object)); +static Lisp_Object read_minibuf P_ ((Lisp_Object, Lisp_Object, + Lisp_Object, Lisp_Object, + int, Lisp_Object, + Lisp_Object, Lisp_Object, + int, int)); /* Read from the minibuffer using keymap MAP, initial contents INITIAL (a string), putting point minus BACKUP_N bytes from the end of INITIAL, @@ -216,6 +219,7 @@ Lisp_Object histvar; Lisp_Object histpos; Lisp_Object defalt; + int allow_props; int inherit_input_method; { Lisp_Object val; @@ -869,7 +873,9 @@ Lisp_Object string, alist, predicate; { Lisp_Object bestmatch, tail, elt, eltstring; + /* Size in bytes of BESTMATCH. */ int bestmatchsize; + /* These are in bytes, too. */ int compare, matchsize; int list = CONSP (alist) || NILP (alist); int index, obsize; @@ -930,9 +936,9 @@ /* Is this element a possible completion? */ if (STRINGP (eltstring) - && XSTRING (string)->size <= XSTRING (eltstring)->size + && XSTRING (string)->size_byte <= XSTRING (eltstring)->size_byte && 0 > scmp (XSTRING (eltstring)->data, XSTRING (string)->data, - XSTRING (string)->size)) + XSTRING (string)->size_byte)) { /* Yes. */ Lisp_Object regexps; @@ -970,10 +976,13 @@ matchcount++; if (NILP (bestmatch)) - bestmatch = eltstring, bestmatchsize = XSTRING (eltstring)->size; + { + bestmatch = eltstring; + bestmatchsize = XSTRING (eltstring)->size_byte; + } else { - compare = min (bestmatchsize, XSTRING (eltstring)->size); + compare = min (bestmatchsize, XSTRING (eltstring)->size_byte); matchsize = scmp (XSTRING (bestmatch)->data, XSTRING (eltstring)->data, compare); @@ -985,8 +994,8 @@ use it as the best match rather than one that is not an exact match. This way, we get the case pattern of the actual match. */ - if ((matchsize == XSTRING (eltstring)->size - && matchsize < XSTRING (bestmatch)->size) + if ((matchsize == XSTRING (eltstring)->size_byte + && matchsize < XSTRING (bestmatch)->size_byte) || /* If there is more than one exact match ignoring case, and one of them is exact including case, @@ -994,13 +1003,15 @@ /* If there is no exact match ignoring case, prefer a match that does not change the case of the input. */ - ((matchsize == XSTRING (eltstring)->size) + ((matchsize == XSTRING (eltstring)->size_byte) == - (matchsize == XSTRING (bestmatch)->size) + (matchsize == XSTRING (bestmatch)->size_byte) && !bcmp (XSTRING (eltstring)->data, - XSTRING (string)->data, XSTRING (string)->size) + XSTRING (string)->data, + XSTRING (string)->size_byte) && bcmp (XSTRING (bestmatch)->data, - XSTRING (string)->data, XSTRING (string)->size))) + XSTRING (string)->data, + XSTRING (string)->size_byte))) bestmatch = eltstring; } bestmatchsize = matchsize; @@ -1013,17 +1024,19 @@ /* If we are ignoring case, and there is no exact match, and no additional text was supplied, don't change the case of what the user typed. */ - if (completion_ignore_case && bestmatchsize == XSTRING (string)->size - && XSTRING (bestmatch)->size > bestmatchsize) + if (completion_ignore_case && bestmatchsize == XSTRING (string)->size_byte + && XSTRING (bestmatch)->size_byte > bestmatchsize) return string; /* Return t if the supplied string is an exact match (counting case); it does not require any change to be made. */ - if (matchcount == 1 && bestmatchsize == XSTRING (string)->size + if (matchcount == 1 && bestmatchsize == XSTRING (string)->size_byte && !bcmp (XSTRING (bestmatch)->data, XSTRING (string)->data, bestmatchsize)) return Qt; + bestmatchsize = string_byte_to_char (bestmatch, bestmatchsize); + XSETFASTINT (zero, 0); /* Else extract the part in which */ XSETFASTINT (end, bestmatchsize); /* all completions agree */ return Fsubstring (bestmatch, zero, end); @@ -1151,14 +1164,15 @@ /* Is this element a possible completion? */ if (STRINGP (eltstring) - && XSTRING (string)->size <= XSTRING (eltstring)->size + && XSTRING (string)->size_byte <= XSTRING (eltstring)->size_byte /* If HIDE_SPACES, reject alternatives that start with space unless the input starts with space. */ - && ((XSTRING (string)->size > 0 && XSTRING (string)->data[0] == ' ') + && ((XSTRING (string)->size_byte > 0 + && XSTRING (string)->data[0] == ' ') || XSTRING (eltstring)->data[0] != ' ' || NILP (hide_spaces)) && 0 > scmp (XSTRING (eltstring)->data, XSTRING (string)->data, - XSTRING (string)->size)) + XSTRING (string)->size_byte)) { /* Yes. */ Lisp_Object regexps; @@ -1303,9 +1317,6 @@ Lisp_Object Fminibuffer_completion_help (); Lisp_Object assoc_for_completion (); -/* A subroutine of Fintern_soft. */ -extern Lisp_Object oblookup (); - /* Test whether TXT is an exact completion. */ Lisp_Object @@ -1321,7 +1332,9 @@ { /* Bypass intern-soft as that loses for nil */ tem = oblookup (Vminibuffer_completion_table, - XSTRING (txt)->data, XSTRING (txt)->size); + XSTRING (txt)->data, + XSTRING (txt)->size, + XSTRING (txt)->size_byte); if (!SYMBOLP (tem)) return Qnil; else if (!NILP (Vminibuffer_completion_predicate)) @@ -1570,7 +1583,7 @@ () { Lisp_Object completion, tem; - register int i; + register int i, i_byte; register unsigned char *completion_string; struct gcpro gcpro1, gcpro2; @@ -1622,30 +1635,32 @@ { tem = substituted; Ferase_buffer (); - insert_from_string (tem, 0, XSTRING (tem)->size, 0); + insert_from_string (tem, 0, 0, XSTRING (tem)->size, + XSTRING (tem)->size_byte, 0); } } buffer_string = XSTRING (tem)->data; completion_string = XSTRING (completion)->data; - buffer_nbytes = XSTRING (tem)->size; /* ie ZV_BYTE - BEGV_BYTE */ - completion_nbytes = XSTRING (completion)->size; - i = buffer_nbytes - completion_nbytes; + buffer_nbytes = XSTRING (tem)->size_byte; /* ie ZV_BYTE - BEGV_BYTE */ + completion_nbytes = XSTRING (completion)->size_byte; + i_byte = buffer_nbytes - completion_nbytes; if (i > 0 || 0 <= scmp (buffer_string, completion_string, buffer_nbytes)) { /* Set buffer to longest match of buffer tail and completion head. */ - if (i <= 0) i = 1; - buffer_string += i; - buffer_nbytes -= i; + if (i_byte <= 0) i_byte = 1; + buffer_string += i_byte; + buffer_nbytes -= i_byte; while (0 <= scmp (buffer_string++, completion_string, buffer_nbytes--)) - i++; - del_range_byte (1, i + 1, 1); + i_byte++; + del_range_byte (1, i_byte + 1, 1); SET_PT_BOTH (ZV, ZV_BYTE); } UNGCPRO; } #endif /* Rewritten code */ - i = ZV_BYTE - BEGV_BYTE; + i_byte = ZV_BYTE - BEGV_BYTE; + i = ZV - BEGV; /* If completion finds next char not unique, consider adding a space or a hyphen. */ @@ -1679,14 +1694,15 @@ int len, c; completion_string = XSTRING (completion)->data; - for (; i < XSTRING (completion)->size; i += len) + for (; i_byte < XSTRING (completion)->size_byte; i_byte += len, i++) { - c = STRING_CHAR_AND_LENGTH (completion_string + i, - XSTRING (completion)->size - i, + c = STRING_CHAR_AND_LENGTH (completion_string + i_byte, + XSTRING (completion)->size - i_byte, len); if (SYNTAX (c) != Sword) { - i += len; + i_byte += len; + i++; break; } } @@ -1694,7 +1710,7 @@ /* If got no characters, print help for user. */ - if (i == ZV_BYTE - BEGV_BYTE) + if (i_byte == ZV_BYTE - BEGV_BYTE) { if (auto_help) Fminibuffer_completion_help (); @@ -1704,7 +1720,7 @@ /* Otherwise insert in minibuffer the chars we got */ Ferase_buffer (); - insert_from_string (completion, 0, i, 1); + insert_from_string (completion, 0, 0, i, i_byte, 1); return Qt; }