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 /src | |
| parent | 64e772c1125acadad8167fd5fd25b380f333ab86 (diff) | |
| download | blogc-2b6553f1ee3a6975b7511d01826f5807c49c132d.tar.gz blogc-2b6553f1ee3a6975b7511d01826f5807c49c132d.tar.bz2 blogc-2b6553f1ee3a6975b7511d01826f5807c49c132d.zip | |
renderer: implemented if statements
Diffstat (limited to 'src')
| -rw-r--r-- | src/renderer.c | 42 | ||||
| -rw-r--r-- | src/template-parser.c | 2 | ||||
| -rw-r--r-- | src/template-parser.h | 2 | 
3 files changed, 36 insertions, 10 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, | 
