simple_pattern.h 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. // SPDX-License-Identifier: GPL-3.0-or-later
  2. #ifndef NETDATA_SIMPLE_PATTERN_H
  3. #define NETDATA_SIMPLE_PATTERN_H
  4. #include "../libnetdata.h"
  5. typedef enum __attribute__ ((__packed__)) {
  6. SIMPLE_PATTERN_EXACT,
  7. SIMPLE_PATTERN_PREFIX,
  8. SIMPLE_PATTERN_SUFFIX,
  9. SIMPLE_PATTERN_SUBSTRING
  10. } SIMPLE_PREFIX_MODE;
  11. typedef enum __attribute__ ((__packed__)) {
  12. SP_NOT_MATCHED,
  13. SP_MATCHED_NEGATIVE,
  14. SP_MATCHED_POSITIVE,
  15. } SIMPLE_PATTERN_RESULT;
  16. typedef void SIMPLE_PATTERN;
  17. // create a simple_pattern from the string given
  18. // default_mode is used in cases where EXACT matches, without an asterisk,
  19. // should be considered PREFIX matches.
  20. SIMPLE_PATTERN *simple_pattern_create(const char *list, const char *separators, SIMPLE_PREFIX_MODE default_mode, bool case_sensitive);
  21. struct netdata_string;
  22. // test if string str is matched from the pattern and fill 'wildcarded' with the parts matched by '*'
  23. SIMPLE_PATTERN_RESULT simple_pattern_matches_extract(SIMPLE_PATTERN *list, const char *str, char *wildcarded, size_t wildcarded_size);
  24. SIMPLE_PATTERN_RESULT simple_pattern_matches_string_extract(SIMPLE_PATTERN *list, struct netdata_string *str, char *wildcarded, size_t wildcarded_size);
  25. SIMPLE_PATTERN_RESULT simple_pattern_matches_buffer_extract(SIMPLE_PATTERN *list, BUFFER *str, char *wildcarded, size_t wildcarded_size);
  26. SIMPLE_PATTERN_RESULT simple_pattern_matches_length_extract(SIMPLE_PATTERN *list, const char *str, size_t len, char *wildcarded, size_t wildcarded_size);
  27. // test if string str is matched from the pattern
  28. #define simple_pattern_matches(list, str) (simple_pattern_matches_extract(list, str, NULL, 0) == SP_MATCHED_POSITIVE)
  29. #define simple_pattern_matches_string(list, str) (simple_pattern_matches_string_extract(list, str, NULL, 0) == SP_MATCHED_POSITIVE)
  30. #define simple_pattern_matches_buffer(list, str) (simple_pattern_matches_buffer_extract(list, str, NULL, 0) == SP_MATCHED_POSITIVE)
  31. // free a simple_pattern that was created with simple_pattern_create()
  32. // list can be NULL, in which case, this does nothing.
  33. void simple_pattern_free(SIMPLE_PATTERN *list);
  34. void simple_pattern_dump(uint64_t debug_type, SIMPLE_PATTERN *p) ;
  35. int simple_pattern_is_potential_name(SIMPLE_PATTERN *p) ;
  36. char *simple_pattern_iterate(SIMPLE_PATTERN **p);
  37. // Auxiliary function to create a pattern
  38. char *simple_pattern_trim_around_equal(char *src);
  39. #define SIMPLE_PATTERN_DEFAULT_WEB_SEPARATORS ",|\t\r\n\f\v"
  40. #define is_valid_sp(x) ((x) && *(x) && !((x)[0] == '*' && (x)[1] == '\0'))
  41. #define string_to_simple_pattern(str) (is_valid_sp(str) ? simple_pattern_create(str, SIMPLE_PATTERN_DEFAULT_WEB_SEPARATORS, SIMPLE_PATTERN_EXACT, true) : NULL)
  42. #define string_to_simple_pattern_nocase(str) (is_valid_sp(str) ? simple_pattern_create(str, SIMPLE_PATTERN_DEFAULT_WEB_SEPARATORS, SIMPLE_PATTERN_EXACT, false) : NULL)
  43. #endif //NETDATA_SIMPLE_PATTERN_H