aboutsummaryrefslogtreecommitdiffstats
path: root/src/content-parser.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/content-parser.c')
-rw-r--r--src/content-parser.c47
1 files changed, 19 insertions, 28 deletions
diff --git a/src/content-parser.c b/src/content-parser.c
index 042f308..f451587 100644
--- a/src/content-parser.c
+++ b/src/content-parser.c
@@ -70,7 +70,6 @@ typedef enum {
CONTENT_DIRECTIVE_COLON,
CONTENT_DIRECTIVE_ARGUMENT_START,
CONTENT_DIRECTIVE_ARGUMENT,
- CONTENT_DIRECTIVE_PARAM_PREFIX_START,
CONTENT_DIRECTIVE_PARAM_PREFIX,
CONTENT_DIRECTIVE_PARAM_KEY_START,
CONTENT_DIRECTIVE_PARAM_KEY,
@@ -417,6 +416,7 @@ blogc_content_parse(const char *src, size_t *end_excerpt)
size_t end = 0;
size_t eend = 0;
size_t real_end = 0;
+ size_t spaces = 0;
bool no_jump = false;
@@ -523,7 +523,7 @@ blogc_content_parse(const char *src, size_t *end_excerpt)
case CONTENT_EXCERPT_OR_DIRECTIVE:
if (c == '.')
break;
- if ((c == ' ' || c == '\t') && current - start == 2) {
+ if (c == ' ' && current - start == 2) {
state = CONTENT_DIRECTIVE_NAME_START;
if (is_last)
goto para;
@@ -1006,18 +1006,16 @@ hr:
break;
case CONTENT_DIRECTIVE_ARGUMENT_START:
- if (c == ' ' || c == '\t') {
+ if (c == ' ') {
if (is_last)
goto param_end;
break;
}
if (c == '\n' || c == '\r' || is_last) {
- state = CONTENT_DIRECTIVE_PARAM_PREFIX_START;
+ state = CONTENT_DIRECTIVE_PARAM_PREFIX;
directive_argument = NULL;
if (is_last)
goto param_end;
- else
- start2 = current + 1;
break;
}
start2 = current;
@@ -1026,32 +1024,29 @@ hr:
case CONTENT_DIRECTIVE_ARGUMENT:
if (c == '\n' || c == '\r' || is_last) {
- state = CONTENT_DIRECTIVE_PARAM_PREFIX_START;
+ spaces = 0;
+ state = CONTENT_DIRECTIVE_PARAM_PREFIX;
end = is_last && c != '\n' && c != '\r' ? src_len :
(real_end != 0 ? real_end : current);
free(directive_argument);
directive_argument = b_strndup(src + start2, end - start2);
if (is_last)
goto param_end;
- else
- start2 = current + 1;
}
break;
- case CONTENT_DIRECTIVE_PARAM_PREFIX_START:
- if (is_last)
- goto para;
- if (c == ' ' || c == '\t')
- break;
- prefix = b_strndup(src + start2, current - start2);
- state = CONTENT_DIRECTIVE_PARAM_PREFIX;
- current--;
- break;
-
case CONTENT_DIRECTIVE_PARAM_PREFIX:
- if (c == ' ' || c == '\t')
+ if (c == ' ') {
+ spaces++;
+ break;
+ }
+ if ((c == '\n' || c == '\r') && spaces == 0) {
+ state = CONTENT_DIRECTIVE_PARAM_END;
+ if (is_last)
+ goto param_end;
break;
- if (c == ':' && b_str_starts_with(src + start2, prefix)) {
+ }
+ if (c == ':' && spaces == 3) {
state = CONTENT_DIRECTIVE_PARAM_KEY_START;
break;
}
@@ -1088,7 +1083,7 @@ hr:
case CONTENT_DIRECTIVE_PARAM_VALUE_START:
if (is_last)
goto para;
- if (c == ' ' || c == '\t')
+ if (c == ' ')
break;
start2 = current;
state = CONTENT_DIRECTIVE_PARAM_VALUE;
@@ -1105,8 +1100,6 @@ hr:
b_strndup(src + start2, end - start2));
free(directive_key);
directive_key = NULL;
- if (!is_last)
- start2 = current + 1;
}
if (!is_last)
break;
@@ -1127,12 +1120,11 @@ param_end:
directive_argument = NULL;
b_trie_free(directive_params);
directive_params = NULL;
- free(prefix);
- prefix = NULL;
break;
}
- if (c == ' ' || c == '\t') {
+ if (c == ' ') {
start2 = current;
+ spaces = 1;
state = CONTENT_DIRECTIVE_PARAM_PREFIX;
break;
}
@@ -1184,7 +1176,6 @@ para:
free(directive_argument);
free(directive_key);
b_trie_free(directive_params);
- free(prefix);
return b_string_free(rv, false);
}