aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRafael G. Martins <rafael@rafaelmartins.eng.br>2015-05-18 01:35:37 -0300
committerRafael G. Martins <rafael@rafaelmartins.eng.br>2015-05-18 01:35:37 -0300
commit2b6553f1ee3a6975b7511d01826f5807c49c132d (patch)
tree09257aee999552c559e659fd33a7c15120b2cb22
parent64e772c1125acadad8167fd5fd25b380f333ab86 (diff)
downloadblogc-2b6553f1ee3a6975b7511d01826f5807c49c132d.tar.gz
blogc-2b6553f1ee3a6975b7511d01826f5807c49c132d.tar.bz2
blogc-2b6553f1ee3a6975b7511d01826f5807c49c132d.zip
renderer: implemented if statements
-rw-r--r--src/renderer.c42
-rw-r--r--src/template-parser.c2
-rw-r--r--src/template-parser.h2
-rw-r--r--tests/check_renderer.c14
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);