- compare = min (bestmatchsize, len);
- p1 = XSTRING (bestmatch)->data;
- p2 = (unsigned char *) dp->d_name;
- matchsize = scmp(p1, p2, compare);
- if (matchsize < 0)
- matchsize = compare;
- if (completion_ignore_case)
+ bestmatch = name;
+ bestmatchsize = XSTRING (name)->size;
+ }
+ }
+ else
+ {
+ compare = min (bestmatchsize, len);
+ p1 = XSTRING (bestmatch)->data;
+ p2 = (unsigned char *) dp->d_name;
+ matchsize = scmp(p1, p2, compare);
+ if (matchsize < 0)
+ matchsize = compare;
+ if (completion_ignore_case)
+ {
+ /* If this is an exact match except for case,
+ 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. */
+ /* This tests that the current file is an exact match
+ but BESTMATCH is not (it is too long). */
+ if ((matchsize == len
+ && matchsize + !!directoryp
+ < XSTRING (bestmatch)->size)
+ ||
+ /* If there is no exact match ignoring case,
+ prefer a match that does not change the case
+ of the input. */
+ /* If there is more than one exact match aside from
+ case, and one of them is exact including case,
+ prefer that one. */
+ /* This == checks that, of current file and BESTMATCH,
+ either both or neither are exact. */
+ (((matchsize == len)
+ ==
+ (matchsize + !!directoryp
+ == XSTRING (bestmatch)->size))
+ && !bcmp (p2, XSTRING (encoded_file)->data, XSTRING (encoded_file)->size)
+ && bcmp (p1, XSTRING (encoded_file)->data, XSTRING (encoded_file)->size)))