123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120 |
- // SPDX-License-Identifier: GPL-3.0-or-later
- #include "../libnetdata.h"
- #ifndef NETDATA_LINE_SPLITTER_H
- #define NETDATA_LINE_SPLITTER_H
- #define PLUGINSD_MAX_WORDS 30
- struct line_splitter {
- size_t count; // counts number of lines
- char *words[PLUGINSD_MAX_WORDS]; // an array of pointers for the words in this line
- size_t num_words; // the number of pointers used in this line
- };
- bool line_splitter_reconstruct_line(BUFFER *wb, void *ptr);
- static inline void line_splitter_reset(struct line_splitter *line) {
- line->num_words = 0;
- }
- int pluginsd_isspace(char c);
- int config_isspace(char c);
- int group_by_label_isspace(char c);
- extern bool isspace_map_pluginsd[256];
- extern bool isspace_map_config[256];
- extern bool isspace_map_group_by_label[256];
- static inline size_t quoted_strings_splitter(char *str, char **words, size_t max_words, bool *isspace_map) {
- char *s = str, quote = 0;
- size_t i = 0;
- // skip all white space
- while (unlikely(isspace_map[(uint8_t)*s]))
- s++;
- if(unlikely(!*s)) {
- words[i] = NULL;
- return 0;
- }
- // check for quote
- if (unlikely(*s == '\'' || *s == '"')) {
- quote = *s; // remember the quote
- s++; // skip the quote
- }
- // store the first word
- words[i++] = s;
- // while we have something
- while (likely(*s)) {
- // if it is an escape
- if (unlikely(*s == '\\' && s[1])) {
- s += 2;
- continue;
- }
- // if it is a quote
- else if (unlikely(*s == quote)) {
- quote = 0;
- *s = ' ';
- continue;
- }
- // if it is a space
- else if (unlikely(quote == 0 && isspace_map[(uint8_t)*s])) {
- // terminate the word
- *s++ = '\0';
- // skip all white space
- while (likely(isspace_map[(uint8_t)*s]))
- s++;
- // check for a quote
- if (unlikely(*s == '\'' || *s == '"')) {
- quote = *s; // remember the quote
- s++; // skip the quote
- }
- // if we reached the end, stop
- if (unlikely(!*s))
- break;
- // store the next word
- if (likely(i < max_words))
- words[i++] = s;
- else
- break;
- }
- // anything else
- else
- s++;
- }
- if (likely(i < max_words))
- words[i] = NULL;
- return i;
- }
- #define quoted_strings_splitter_query_group_by_label(str, words, max_words) \
- quoted_strings_splitter(str, words, max_words, isspace_map_group_by_label)
- #define quoted_strings_splitter_config(str, words, max_words) \
- quoted_strings_splitter(str, words, max_words, isspace_map_config)
- #define quoted_strings_splitter_pluginsd(str, words, max_words) \
- quoted_strings_splitter(str, words, max_words, isspace_map_pluginsd)
- static inline char *get_word(char **words, size_t num_words, size_t index) {
- if (unlikely(index >= num_words))
- return NULL;
- return words[index];
- }
- #endif //NETDATA_LINE_SPLITTER_H
|