/** * Prefix Match * * Match input value to a list of options, allowing non-ambiguous abbreviation and partial matching. * This library was designed for command recognition in interactive consoles and command interfaces. * * Created on 2020/06/09 by Ondřej Hruška */ #ifndef _PREFIX_MATCH_H #define _PREFIX_MATCH_H #include /** Use case-sensitive matching */ #define PREFIXMATCH_CASE_SENSITIVE 1 /** Forbid abbreviations */ #define PREFIXMATCH_NOABBREV 2 /** Allow matching fewer words, if unambiguous */ #define PREFIXMATCH_MULTI_PARTIAL 4 /** * Recognize (optionally abbreviated) input * * @param[in] value - tested value * @param[in] options - options to match against * @param[in] flags - matching options (bitmask) - accepts PREFIXMATCH_CASE_SENSITIVE and PREFIXMATCH_NOABBREV * @return index of the matched option, -1 on mismatch or ambiguous match */ int prefix_match(const char *value, const char **options, int flags); /** * Recognize input consisting of one or more (optionally abbreviated) words * * @param[in] value - tested value * @param[in] options - options to match against, multi-word options separated by the listed delimiters * @param[in] delims - string with a list of possible delimiters (like for strtok) * @param[in] flags - matching options (bitmask) - accepts all options * @return index of the matched option, -1 on mismatch or ambiguous match */ int prefix_multipart_match(const char *value, const char **options, const char* delims, int flags); // useful internal functions exported for possible re-use /** * Test if two word sentences match, with individual words optionally allowed to be abbreviated. * * @internal * @param[in] a - tested (optionally abbreviated) sentence * @param[in] b - full sentence * @param[in] delims - list of possible delimiters, same may be used for both sentences * @param[in] flags - matching options (bitmask) - accepts all options * @return 1-match; 0-no match; 2-partial (some words) match, if the PREFIXMATCH_MULTI_PARTIAL flag is set */ int pm_multipart_test(const char *a, const char* b, const char *delims, int flags); /** * Count words in a "sentence", delimited by any of the given set of delimiters. * * @internal * @param[in] sentence - one or multi-word string * @param[in] delims - delimiters accepted * @return number of words */ size_t pm_count_words(const char *sentence, const char *delims); /** * Measure word length * * @internal * @param[in] word - start of a word that ends with either one of the delimiters, or a null byte. * @param[in] delims - delimiters accepted * @return word length */ size_t pm_word_len(const char *word, const char *delims); #endif //_PREFIX_MATCH_H