diff options
-rw-r--r-- | src/HtmlSearch.c | 134 |
1 files changed, 67 insertions, 67 deletions
diff --git a/src/HtmlSearch.c b/src/HtmlSearch.c index adf64bd..eb41fd1 100644 --- a/src/HtmlSearch.c +++ b/src/HtmlSearch.c @@ -70,11 +70,66 @@ static char string_view_char_or(const QuickMediaStringView *str, size_t index, c return fallback; } +static int is_whitespace(int c) { + switch(c) { + case ' ': + case '\n': + case '\r': + case '\t': + case '\v': + return 1; + default: + return 0; + } +} + +static int is_newline(int c) { + return c == '\n' || c == '\r'; +} + +static void lstrip(const char *str, size_t size, const char **output_str, size_t *output_size, int(*strip_filter_func)(int)) { + if(size == 0) { + *output_str = str; + *output_size = size; + return; + } + + size_t i = 0; + while(i < size && strip_filter_func(str[i])) { + ++i; + } + + *output_str = str + i; + *output_size = size - i; +} + +static void rstrip(const char *str, size_t size, size_t *output_size, int(*strip_filter_func)(int)) { + if(size == 0) { + *output_size = size; + return; + } + + ssize_t i = size - 1; + while(i >= 0 && strip_filter_func(str[i])) { + --i; + } + + *output_size = i + 1; +} + +static void strip(const char *str, size_t size, const char **output_str, size_t *output_size, int(*strip_filter_func)(int)) { + lstrip(str, size, output_str, output_size, strip_filter_func); + rstrip(*output_str, *output_size, output_size, strip_filter_func); +} + /* Returns 0 on match */ -static int str_glob_match(const QuickMediaStringView str, const QuickMediaStringView glob, int is_glob) { +static int str_glob_match(QuickMediaStringView str, QuickMediaStringView glob, int is_glob) { size_t str_index = 0; size_t glob_index = 0; + strip(str.data, str.size, &str.data, &str.size, is_whitespace); + strip(glob.data, glob.size, &glob.data, &glob.size, is_whitespace); + if(!is_glob) { if(glob.size == str.size && memcmp(str.data, glob.data, str.size) == 0) return 0; @@ -142,10 +197,13 @@ static char to_upper(char c) { return c; } -static int string_views_equal_case_insensitive(const QuickMediaStringView str1, const QuickMediaStringView str2) { +static int string_views_equal_case_insensitive_strip(QuickMediaStringView str1, QuickMediaStringView str2) { if(str2.size != str1.size) return 1; + strip(str1.data, str1.size, &str1.data, &str1.size, is_whitespace); + strip(str2.data, str2.size, &str2.data, &str2.size, is_whitespace); + for(size_t i = 0; i < str1.size; ++i) { char c1 = str1.data[i]; char c2 = str2.data[i]; @@ -158,7 +216,7 @@ static int string_views_equal_case_insensitive(const QuickMediaStringView str1, static QuickMediaHtmlAttribute* get_attribute_by_name(QuickMediaHtmlNode *node, QuickMediaStringView name) { for(QuickMediaHtmlAttribute *attr = node->first_attribute; attr; attr = attr->next) { - if(string_views_equal_case_insensitive(attr->key, name) == 0) + if(string_views_equal_case_insensitive_strip(attr->key, name) == 0) return attr; } return NULL; @@ -177,7 +235,7 @@ static int find_child_nodes(QuickMediaHtmlChildNode *node, const QuickMediaNodeS continue; /* Match without node name or node name matches */ - if(search_data->name.size == 0 || string_views_equal_case_insensitive(child->node.name, search_data->name) == 0) { + if(search_data->name.size == 0 || string_views_equal_case_insensitive_strip(child->node.name, search_data->name) == 0) { #define on_match() do { \ if(search_data->child) { \ if(find_child_nodes(child->node.first_child, search_data->child, result_callback, userdata) != 0) \ @@ -331,58 +389,6 @@ void html_node_child_deinit(QuickMediaHtmlChildNode *self) { html_node_deinit(&self->node); } -static int is_whitespace(int c) { - switch(c) { - case ' ': - case '\n': - case '\r': - case '\t': - case '\v': - return 1; - default: - return 0; - } -} - -static int is_newline(int c) { - return c == '\n' || c == '\r'; -} - -static void lstrip(const char *str, size_t size, const char **output_str, size_t *output_size, int(*strip_filter_func)(int)) { - if(size == 0) { - *output_str = str; - *output_size = size; - return; - } - - size_t i = 0; - while(i < size && strip_filter_func(str[i])) { - ++i; - } - - *output_str = str + i; - *output_size = size - i; -} - -static void rstrip(const char *str, size_t size, size_t *output_size, int(*strip_filter_func)(int)) { - if(size == 0) { - *output_size = size; - return; - } - - ssize_t i = size - 1; - while(i >= 0 && strip_filter_func(str[i])) { - --i; - } - - *output_size = i + 1; -} - -static void strip(const char *str, size_t size, const char **output_str, size_t *output_size, int(*strip_filter_func)(int)) { - lstrip(str, size, output_str, output_size, strip_filter_func); - rstrip(*output_str, *output_size, output_size, strip_filter_func); -} - static int html_parse_callback(HtmlParser *html_parser, HtmlParseType parse_type, void *userdata) { QuickMediaHtmlNode **html_node_p = userdata; QuickMediaHtmlNode *html_node = *html_node_p; @@ -404,11 +410,7 @@ static int html_parse_callback(HtmlParser *html_parser, HtmlParseType parse_type break; } case HTML_PARSE_ATTRIBUTE: { - HtmlStringView attr_key = html_parser->attribute_key; - HtmlStringView attr_value = html_parser->attribute_value; - strip(attr_key.data, attr_key.size, &attr_key.data, &attr_key.size, is_whitespace); - strip(attr_value.data, attr_value.size, &attr_value.data, &attr_value.size, is_whitespace); - if(html_node_add_attribute(html_node, attr_key, attr_value) != 0) + if(html_node_add_attribute(html_node, html_parser->attribute_key, html_parser->attribute_value) != 0) return 1; break; } @@ -439,9 +441,7 @@ QuickMediaStringView quickmedia_html_node_get_attribute_value(QuickMediaHtmlNode QuickMediaHtmlAttribute *attr = get_attribute_by_name(self, attr_name); if(attr) { - QuickMediaStringView attr_value = attr->value; - strip(attr_value.data, attr_value.size, &attr_value.data, &attr_value.size, is_whitespace); - return attr_value; + return attr->value; } else { QuickMediaStringView attr_value; attr_value.data = NULL; @@ -467,14 +467,14 @@ QuickMediaHtmlNode* quickmedia_html_node_find_child(QuickMediaHtmlNode *self, co if(!child->node.is_tag) continue; - if(!string_views_equal_case_insensitive(child->node.name, tag)) + if(string_views_equal_case_insensitive_strip(child->node.name, tag) != 0) continue; - QuickMediaHtmlAttribute *attr = get_attribute_by_name(child, attr_name); + QuickMediaHtmlAttribute *attr = get_attribute_by_name(&child->node, attr_name); if(!attr) continue; - if(string_views_equal_case_insensitive(attr->value, attr_value)) + if(string_views_equal_case_insensitive_strip(attr->value, attr_value) == 0) return &child->node; } |