You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
78 lines
2.7 KiB
78 lines
2.7 KiB
5 years ago
|
/**
|
||
|
* 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 <stdbool.h>
|
||
|
|
||
|
/** 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
|