diff options
author | Rafael G. Martins <rafael@rafaelmartins.eng.br> | 2015-05-18 01:35:37 -0300 |
---|---|---|
committer | Rafael G. Martins <rafael@rafaelmartins.eng.br> | 2015-05-18 01:35:37 -0300 |
commit | 2b6553f1ee3a6975b7511d01826f5807c49c132d (patch) | |
tree | 09257aee999552c559e659fd33a7c15120b2cb22 | |
parent | 64e772c1125acadad8167fd5fd25b380f333ab86 (diff) | |
download | blogc-2b6553f1ee3a6975b7511d01826f5807c49c132d.tar.gz blogc-2b6553f1ee3a6975b7511d01826f5807c49c132d.tar.bz2 blogc-2b6553f1ee3a6975b7511d01826f5807c49c132d.zip |
renderer: implemented if statements
-rw-r--r-- | src/renderer.c | 42 | ||||
-rw-r--r-- | src/template-parser.c | 2 | ||||
-rw-r--r-- | src/template-parser.h | 2 | ||||
-rw-r--r-- | tests/check_renderer.c | 14 |
4 files changed, 48 insertions, 12 deletions
diff --git a/src/renderer.c b/src/renderer.c index 7a2fb77..314fe04 100644 --- a/src/renderer.c +++ b/src/renderer.c @@ -83,13 +83,16 @@ blogc_render(b_slist_t *tmpl, b_slist_t *sources, b_trie_t *config, bool listing const char *config_value = NULL; const char *config_var = NULL; char *config_value2 = NULL; + char *defined = NULL; unsigned int if_count = 0; unsigned int if_skip = 0; bool if_not = false; - bool defined = false; bool inside_block = false; + bool evaluate = false; + + int cmp = 0; b_slist_t *tmp = tmpl; while (tmp != NULL) { @@ -187,8 +190,9 @@ blogc_render(b_slist_t *tmpl, b_slist_t *sources, b_trie_t *config, bool listing case BLOGC_TEMPLATE_IFNDEF_STMT: if_not = true; + case BLOGC_TEMPLATE_IF_STMT: case BLOGC_TEMPLATE_IFDEF_STMT: - defined = false; + defined = NULL; if (stmt->value != NULL) { config_var = NULL; if (0 == strcmp(stmt->value, "DATE_FORMATTED")) @@ -203,16 +207,35 @@ blogc_render(b_slist_t *tmpl, b_slist_t *sources, b_trie_t *config, bool listing inside_block ? tmp_source : NULL), config, inside_block ? tmp_source : NULL); if (config_value2 != NULL) { - defined = true; - free(config_value2); + defined = config_value2; config_value2 = NULL; } } else - defined = blogc_get_variable(stmt->value, config, - inside_block ? tmp_source : NULL) != NULL; + defined = b_strdup(blogc_get_variable(stmt->value, + config, inside_block ? tmp_source : NULL)); + } + evaluate = false; + if (stmt->op != 0) { + if (defined != NULL && stmt->value2 != NULL) { + cmp = strcmp(defined, stmt->value2); + if (cmp != 0 && stmt->op & BLOGC_TEMPLATE_OP_NEQ) + evaluate = true; + else if (cmp == 0 && stmt->op & BLOGC_TEMPLATE_OP_EQ) + evaluate = true; + else if (cmp < 0 && stmt->op & BLOGC_TEMPLATE_OP_LT) + evaluate = true; + else if (cmp > 0 && stmt->op & BLOGC_TEMPLATE_OP_GT) + evaluate = true; + } + } + else { + if (if_not && defined == NULL) + evaluate = true; + if (!if_not && defined != NULL) + evaluate = true; } - if ((!if_not && !defined) || (if_not && defined)) { + if (!evaluate) { if_skip = if_count; // at this point we can just skip anything, counting the @@ -221,7 +244,8 @@ blogc_render(b_slist_t *tmpl, b_slist_t *sources, b_trie_t *config, bool listing while (1) { tmp = tmp->next; stmt = tmp->data; - if ((stmt->type == BLOGC_TEMPLATE_IFDEF_STMT) || + if ((stmt->type == BLOGC_TEMPLATE_IF_STMT) || + (stmt->type == BLOGC_TEMPLATE_IFDEF_STMT) || (stmt->type == BLOGC_TEMPLATE_IFNDEF_STMT)) { if_count++; @@ -237,6 +261,8 @@ blogc_render(b_slist_t *tmpl, b_slist_t *sources, b_trie_t *config, bool listing } } } + free(defined); + defined = NULL; if_not = false; break; diff --git a/src/template-parser.c b/src/template-parser.c index e1b1e56..8844b8f 100644 --- a/src/template-parser.c +++ b/src/template-parser.c @@ -399,7 +399,7 @@ blogc_template_parse(const char *src, size_t src_len, blogc_error_t **err) else if (0 == strncmp("==", src + op_start, 2)) tmp_op = BLOGC_TEMPLATE_OP_EQ; else if (0 == strncmp("!=", src + op_start, 2)) - tmp_op = BLOGC_TEMPLATE_OP_NOT | BLOGC_TEMPLATE_OP_EQ; + tmp_op = BLOGC_TEMPLATE_OP_NEQ; } if (tmp_op == 0) { *err = blogc_error_parser(BLOGC_ERROR_TEMPLATE_PARSER, diff --git a/src/template-parser.h b/src/template-parser.h index 809e3bc..e608099 100644 --- a/src/template-parser.h +++ b/src/template-parser.h @@ -24,7 +24,7 @@ typedef enum { } blogc_template_stmt_type_t; typedef enum { - BLOGC_TEMPLATE_OP_NOT = 1 << 0, + BLOGC_TEMPLATE_OP_NEQ = 1 << 0, BLOGC_TEMPLATE_OP_EQ = 1 << 1, BLOGC_TEMPLATE_OP_LT = 1 << 2, BLOGC_TEMPLATE_OP_GT = 1 << 3, diff --git a/tests/check_renderer.c b/tests/check_renderer.c index e238610..b6201b4 100644 --- a/tests/check_renderer.c +++ b/tests/check_renderer.c @@ -67,7 +67,12 @@ test_render_entry(void **state) "{% ifdef GUDA %}{{ GUDA }}{% endif %}\n" "{% ifdef CHUNDA %}{{ CHUNDA }}{% endif %}\n" "{% endblock %}\n" - "{% block listing %}lol{% endblock %}\n"; + "{% block listing %}lol{% endblock %}\n" + "{% if GUDA == \"zxc\" %}LOL{% endif %}\n" + "{% if GUDA != \"bola\" %}HEHE{% endif %}\n" + "{% if GUDA < \"zxd\" %}LOL2{% endif %}\n" + "{% if GUDA > \"zxd\" %}LOL3{% endif %}\n" + "{% if GUDA <= \"zxc\" %}LOL4{% endif %}\n"; blogc_error_t *err = NULL; b_slist_t *l = blogc_template_parse(str, strlen(str), &err); assert_non_null(l); @@ -84,7 +89,12 @@ test_render_entry(void **state) "zxc\n" "\n" "\n" - "\n"); + "\n" + "LOL\n" + "HEHE\n" + "LOL2\n" + "\n" + "LOL4\n"); blogc_template_free_stmts(l); b_slist_free_full(s, (b_free_func_t) b_trie_free); free(out); |