133#define DEFAULT_MAX_PATTERN 256
146 if ((c >=
'A') && (c <=
'Z'))
147 return c + (
'a' -
'A');
173 return (c & 0xC0) == 0x80;
185 const unsigned char c0 = (
unsigned char) s[0];
190 if ((c0 >= 0xC2) && (c0 <= 0xDF))
197 if ((c0 >= 0xE0) && (c0 <= 0xEF))
205 if ((c0 >= 0xF0) && (c0 <= 0xF4))
238 for (
const char *p = pattern; *p; p++)
240 unsigned char c = (
unsigned char) *p;
241 if ((c >=
'A') && (c <=
'Z'))
268 size_t plen = strlen(pattern);
276 if (plen > (
size_t) max_pattern)
293 const unsigned char pbyte = (
unsigned char) pattern[pi];
296 int pc =
lower_if(pattern[pi], fold);
316 const int premaining = (int) plen - pi;
317 if ((pchar_len <= 0) || (pchar_len > premaining))
319 bool matched =
false;
323 const unsigned char cbyte = (
unsigned char)
candidate[ci];
331 if ((pchar_len == cchar_len) && (memcmp(pattern + pi,
candidate + ci, pchar_len) == 0))
333 for (
int k = 0; k < pchar_len; k++)
334 matchpos[pi + k] = ci + k;
339 last = ci + pchar_len - 1;
353 if (pi != (
int) plen)
362 for (
int i = 1; i < pi; i++)
364 int gap = matchpos[i] - matchpos[i - 1] - 1;
373 int span = last - first + 1;
381 for (
int i = 0; i < pi; i++)
383 int pos = matchpos[i];
389 unsigned char prev = (
unsigned char)
candidate[pos - 1];
390 unsigned char curr = (
unsigned char)
candidate[pos];
393 if ((prev ==
'/') || (prev ==
'.') || (prev ==
'-') || (prev ==
'_'))
396 else if (((prev >=
'a') && (prev <=
'z')) && ((curr >=
'A') && (curr <=
'Z')))
bool candidate(struct CompletionData *cd, char *user, const char *src, char *dest, size_t dlen)
Helper function for completion.
Fuzzy matching library - private definitions.
Options for fuzzy matching.
bool smart_case
Auto case-sensitive if pattern has uppercase.
bool case_sensitive
Match case exactly.
int max_pattern
Safety bound (<=0 = default 256, capped at 256)
bool prefer_prefix
Extra weight for prefix matches.
int score
Score (<0 = no match)
int start
First match position.
int end
Last match position.
int fuzzy_subseq_match(const char *pattern, const char *candidate, const struct FuzzyOptions *opts, struct FuzzyResult *out)
Perform subsequence fuzzy matching (UTF-8 aware, ASCII case-folding)
static int utf8_char_len(const char *s)
Get length of a UTF-8 codepoint at a byte offset.
static bool utf8_is_continuation(unsigned char c)
Check for UTF-8 continuation byte.
static unsigned char ascii_tolower(unsigned char c)
Convert ASCII character to lowercase.
static int lower_if(int c, bool fold)
Convert character to lowercase conditionally.
static bool compute_case_mode(const char *pattern, const struct FuzzyOptions *opts)
Determine if case folding should be used.
#define DEFAULT_MAX_PATTERN
Default maximum pattern length.