diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/blogc/debug.c | 46 | ||||
| -rw-r--r-- | src/blogc/debug.h | 2 | ||||
| -rw-r--r-- | src/blogc/main.c | 2 | ||||
| -rw-r--r-- | src/blogc/renderer.c | 112 | ||||
| -rw-r--r-- | src/blogc/template-parser.c | 120 | ||||
| -rw-r--r-- | src/blogc/template-parser.h | 43 | 
6 files changed, 164 insertions, 161 deletions
diff --git a/src/blogc/debug.c b/src/blogc/debug.c index 7219c0c..afb2fe3 100644 --- a/src/blogc/debug.c +++ b/src/blogc/debug.c @@ -14,7 +14,7 @@  static const char* -get_operator(blogc_template_stmt_operator_t op) +get_operator(blogc_template_operator_t op)  {      if (op & BLOGC_TEMPLATE_OP_NEQ)          return "!="; @@ -34,45 +34,45 @@ get_operator(blogc_template_stmt_operator_t op)  void -blogc_debug_template(bc_slist_t *stmts) +blogc_debug_template(bc_slist_t *ast)  { -    for (bc_slist_t *tmp = stmts; tmp != NULL; tmp = tmp->next) { -        blogc_template_stmt_t *data = tmp->data; +    for (bc_slist_t *tmp = ast; tmp != NULL; tmp = tmp->next) { +        blogc_template_node_t *data = tmp->data;          fprintf(stderr, "DEBUG: <TEMPLATE ");          switch (data->type) { -            case BLOGC_TEMPLATE_IFDEF_STMT: -                fprintf(stderr, "IFDEF: %s", data->value); +            case BLOGC_TEMPLATE_NODE_IFDEF: +                fprintf(stderr, "IFDEF: %s", data->data[0]);                  break; -            case BLOGC_TEMPLATE_IFNDEF_STMT: -                fprintf(stderr, "IFNDEF: %s", data->value); +            case BLOGC_TEMPLATE_NODE_IFNDEF: +                fprintf(stderr, "IFNDEF: %s", data->data[0]);                  break; -            case BLOGC_TEMPLATE_IF_STMT: -                fprintf(stderr, "IF: %s %s %s", data->value, -                    get_operator(data->op), data->value2); +            case BLOGC_TEMPLATE_NODE_IF: +                fprintf(stderr, "IF: %s %s %s", data->data[0], +                    get_operator(data->op), data->data[1]);                  break; -            case BLOGC_TEMPLATE_ELSE_STMT: +            case BLOGC_TEMPLATE_NODE_ELSE:                  fprintf(stderr, "ELSE");                  break; -            case BLOGC_TEMPLATE_ENDIF_STMT: +            case BLOGC_TEMPLATE_NODE_ENDIF:                  fprintf(stderr, "ENDIF");                  break; -            case BLOGC_TEMPLATE_FOREACH_STMT: -                fprintf(stderr, "FOREACH: %s", data->value); +            case BLOGC_TEMPLATE_NODE_FOREACH: +                fprintf(stderr, "FOREACH: %s", data->data[0]);                  break; -            case BLOGC_TEMPLATE_ENDFOREACH_STMT: +            case BLOGC_TEMPLATE_NODE_ENDFOREACH:                  fprintf(stderr, "ENDFOREACH");                  break; -            case BLOGC_TEMPLATE_BLOCK_STMT: -                fprintf(stderr, "BLOCK: %s", data->value); +            case BLOGC_TEMPLATE_NODE_BLOCK: +                fprintf(stderr, "BLOCK: %s", data->data[0]);                  break; -            case BLOGC_TEMPLATE_ENDBLOCK_STMT: +            case BLOGC_TEMPLATE_NODE_ENDBLOCK:                  fprintf(stderr, "ENDBLOCK");                  break; -            case BLOGC_TEMPLATE_VARIABLE_STMT: -                fprintf(stderr, "VARIABLE: %s", data->value); +            case BLOGC_TEMPLATE_NODE_VARIABLE: +                fprintf(stderr, "VARIABLE: %s", data->data[0]);                  break; -            case BLOGC_TEMPLATE_CONTENT_STMT: -                fprintf(stderr, "CONTENT: `%s`", data->value); +            case BLOGC_TEMPLATE_NODE_CONTENT: +                fprintf(stderr, "CONTENT: `%s`", data->data[0]);                  break;          }          fprintf(stderr, ">\n"); diff --git a/src/blogc/debug.h b/src/blogc/debug.h index e47d840..c7c1fbe 100644 --- a/src/blogc/debug.h +++ b/src/blogc/debug.h @@ -11,6 +11,6 @@  #include "../common/utils.h" -void blogc_debug_template(bc_slist_t *stmts); +void blogc_debug_template(bc_slist_t *ast);  #endif /* ___DEBUG_H */ diff --git a/src/blogc/main.c b/src/blogc/main.c index df9a401..d72091e 100644 --- a/src/blogc/main.c +++ b/src/blogc/main.c @@ -346,7 +346,7 @@ main(int argc, char **argv)  cleanup4:      free(out);  cleanup3: -    blogc_template_free_stmts(l); +    blogc_template_free_ast(l);  cleanup2:      bc_slist_free_full(s, (bc_free_func_t) bc_trie_free);      bc_error_free(err); diff --git a/src/blogc/renderer.c b/src/blogc/renderer.c index cee9ef9..a49e87d 100644 --- a/src/blogc/renderer.c +++ b/src/blogc/renderer.c @@ -191,53 +191,53 @@ blogc_render(bc_slist_t *tmpl, bc_slist_t *sources, bc_trie_t *config, bool list      bc_slist_t *tmp = tmpl;      while (tmp != NULL) { -        blogc_template_stmt_t *stmt = tmp->data; +        blogc_template_node_t *node = tmp->data; -        switch (stmt->type) { +        switch (node->type) { -            case BLOGC_TEMPLATE_CONTENT_STMT: -                if (stmt->value != NULL) -                    bc_string_append(str, stmt->value); +            case BLOGC_TEMPLATE_NODE_CONTENT: +                if (node->data[0] != NULL) +                    bc_string_append(str, node->data[0]);                  break; -            case BLOGC_TEMPLATE_BLOCK_STMT: +            case BLOGC_TEMPLATE_NODE_BLOCK:                  inside_block = true;                  if_count = 0; -                if (0 == strcmp("entry", stmt->value)) { +                if (0 == strcmp("entry", node->data[0])) {                      if (listing) {                          // we can just skip anything and walk until the next                          // 'endblock' -                        while (stmt->type != BLOGC_TEMPLATE_ENDBLOCK_STMT) { +                        while (node->type != BLOGC_TEMPLATE_NODE_ENDBLOCK) {                              tmp = tmp->next; -                            stmt = tmp->data; +                            node = tmp->data;                          }                          break;                      }                      current_source = sources;                      tmp_source = current_source->data;                  } -                else if ((0 == strcmp("listing", stmt->value)) || -                         (0 == strcmp("listing_once", stmt->value))) { +                else if ((0 == strcmp("listing", node->data[0])) || +                         (0 == strcmp("listing_once", node->data[0]))) {                      if (!listing) {                          // we can just skip anything and walk until the next                          // 'endblock' -                        while (stmt->type != BLOGC_TEMPLATE_ENDBLOCK_STMT) { +                        while (node->type != BLOGC_TEMPLATE_NODE_ENDBLOCK) {                              tmp = tmp->next; -                            stmt = tmp->data; +                            node = tmp->data;                          }                          break;                      }                  } -                if (0 == strcmp("listing", stmt->value)) { +                if (0 == strcmp("listing", node->data[0])) {                      if (sources == NULL) {                          // we can just skip anything and walk until the next                          // 'endblock' -                        while (stmt->type != BLOGC_TEMPLATE_ENDBLOCK_STMT) { +                        while (node->type != BLOGC_TEMPLATE_NODE_ENDBLOCK) {                              tmp = tmp->next; -                            stmt = tmp->data; +                            node = tmp->data;                          }                          break;                      } @@ -249,9 +249,9 @@ blogc_render(bc_slist_t *tmpl, bc_slist_t *sources, bc_trie_t *config, bool list                  }                  break; -            case BLOGC_TEMPLATE_VARIABLE_STMT: -                if (stmt->value != NULL) { -                    config_value = blogc_format_variable(stmt->value, +            case BLOGC_TEMPLATE_NODE_VARIABLE: +                if (node->data[0] != NULL) { +                    config_value = blogc_format_variable(node->data[0],                          config, inside_block ? tmp_source : NULL, foreach_var);                      if (config_value != NULL) {                          bc_string_append(str, config_value); @@ -262,7 +262,7 @@ blogc_render(bc_slist_t *tmpl, bc_slist_t *sources, bc_trie_t *config, bool list                  }                  break; -            case BLOGC_TEMPLATE_ENDBLOCK_STMT: +            case BLOGC_TEMPLATE_NODE_ENDBLOCK:                  inside_block = false;                  if (listing_start != NULL && current_source != NULL) {                      current_source = current_source->next; @@ -275,32 +275,32 @@ blogc_render(bc_slist_t *tmpl, bc_slist_t *sources, bc_trie_t *config, bool list                  }                  break; -            case BLOGC_TEMPLATE_IFNDEF_STMT: +            case BLOGC_TEMPLATE_NODE_IFNDEF:                  if_not = true; -            case BLOGC_TEMPLATE_IF_STMT: -            case BLOGC_TEMPLATE_IFDEF_STMT: +            case BLOGC_TEMPLATE_NODE_IF: +            case BLOGC_TEMPLATE_NODE_IFDEF:                  if_count = 0;                  defined = NULL; -                if (stmt->value != NULL) -                    defined = blogc_format_variable(stmt->value, config, +                if (node->data[0] != NULL) +                    defined = blogc_format_variable(node->data[0], config,                          inside_block ? tmp_source : NULL, foreach_var);                  evaluate = false; -                if (stmt->op != 0) { +                if (node->op != 0) {                      // Strings that start with a '"' are actually strings, the                      // others are meant to be looked up as a second variable                      // check.                      char *defined2 = NULL; -                    if (stmt->value2 != NULL) { -                        if ((strlen(stmt->value2) >= 2) && -                            (stmt->value2[0] == '"') && -                            (stmt->value2[strlen(stmt->value2) - 1] == '"')) +                    if (node->data[1] != NULL) { +                        if ((strlen(node->data[1]) >= 2) && +                            (node->data[1][0] == '"') && +                            (node->data[1][strlen(node->data[1]) - 1] == '"'))                          { -                            defined2 = bc_strndup(stmt->value2 + 1, -                                strlen(stmt->value2) - 2); +                            defined2 = bc_strndup(node->data[1] + 1, +                                strlen(node->data[1]) - 2);                          }                          else { -                            defined2 = blogc_format_variable(stmt->value2, +                            defined2 = blogc_format_variable(node->data[1],                                  config, inside_block ? tmp_source : NULL,                                  foreach_var);                          } @@ -308,13 +308,13 @@ blogc_render(bc_slist_t *tmpl, bc_slist_t *sources, bc_trie_t *config, bool list                      if (defined != NULL && defined2 != NULL) {                          cmp = strcmp(defined, defined2); -                        if (cmp != 0 && stmt->op & BLOGC_TEMPLATE_OP_NEQ) +                        if (cmp != 0 && node->op & BLOGC_TEMPLATE_OP_NEQ)                              evaluate = true; -                        else if (cmp == 0 && stmt->op & BLOGC_TEMPLATE_OP_EQ) +                        else if (cmp == 0 && node->op & BLOGC_TEMPLATE_OP_EQ)                              evaluate = true; -                        else if (cmp < 0 && stmt->op & BLOGC_TEMPLATE_OP_LT) +                        else if (cmp < 0 && node->op & BLOGC_TEMPLATE_OP_LT)                              evaluate = true; -                        else if (cmp > 0 && stmt->op & BLOGC_TEMPLATE_OP_GT) +                        else if (cmp > 0 && node->op & BLOGC_TEMPLATE_OP_GT)                              evaluate = true;                      } @@ -333,15 +333,15 @@ blogc_render(bc_slist_t *tmpl, bc_slist_t *sources, bc_trie_t *config, bool list                      // skip as well.                      while (1) {                          tmp = tmp->next; -                        stmt = tmp->data; -                        if ((stmt->type == BLOGC_TEMPLATE_IF_STMT) || -                            (stmt->type == BLOGC_TEMPLATE_IFDEF_STMT) || -                            (stmt->type == BLOGC_TEMPLATE_IFNDEF_STMT)) +                        node = tmp->data; +                        if ((node->type == BLOGC_TEMPLATE_NODE_IF) || +                            (node->type == BLOGC_TEMPLATE_NODE_IFDEF) || +                            (node->type == BLOGC_TEMPLATE_NODE_IFNDEF))                          {                              if_count++;                              continue;                          } -                        if ((stmt->type == BLOGC_TEMPLATE_ELSE_STMT) && +                        if ((node->type == BLOGC_TEMPLATE_NODE_ELSE) &&                              (if_count == 0))                          {                              // this is somewhat complex. only an else statement @@ -352,7 +352,7 @@ blogc_render(bc_slist_t *tmpl, bc_slist_t *sources, bc_trie_t *config, bool list                              valid_else = true;                              break;                          } -                        if (stmt->type == BLOGC_TEMPLATE_ENDIF_STMT) { +                        if (node->type == BLOGC_TEMPLATE_NODE_ENDIF) {                              if (if_count > 0) {                                  if_count--;                                  continue; @@ -369,7 +369,7 @@ blogc_render(bc_slist_t *tmpl, bc_slist_t *sources, bc_trie_t *config, bool list                  if_not = false;                  break; -            case BLOGC_TEMPLATE_ELSE_STMT: +            case BLOGC_TEMPLATE_NODE_ELSE:                  if_count = 0;                  if (!valid_else) { @@ -378,17 +378,17 @@ blogc_render(bc_slist_t *tmpl, bc_slist_t *sources, bc_trie_t *config, bool list                      // skip as well.                      while (1) {                          tmp = tmp->next; -                        stmt = tmp->data; -                        if ((stmt->type == BLOGC_TEMPLATE_IF_STMT) || -                            (stmt->type == BLOGC_TEMPLATE_IFDEF_STMT) || -                            (stmt->type == BLOGC_TEMPLATE_IFNDEF_STMT)) +                        node = tmp->data; +                        if ((node->type == BLOGC_TEMPLATE_NODE_IF) || +                            (node->type == BLOGC_TEMPLATE_NODE_IFDEF) || +                            (node->type == BLOGC_TEMPLATE_NODE_IFNDEF))                          {                              if_count++;                              continue;                          }                          // no need to handle else statements here, because every                          // if should have an endif. -                        if (stmt->type == BLOGC_TEMPLATE_ENDIF_STMT) { +                        if (node->type == BLOGC_TEMPLATE_NODE_ENDIF) {                              if (if_count > 0) {                                  if_count--;                                  continue; @@ -400,7 +400,7 @@ blogc_render(bc_slist_t *tmpl, bc_slist_t *sources, bc_trie_t *config, bool list                  valid_else = false;                  break; -            case BLOGC_TEMPLATE_ENDIF_STMT: +            case BLOGC_TEMPLATE_NODE_ENDIF:                  // any endif statement should invalidate valid_else, to avoid                  // propagation to outter conditionals.                  valid_else = false; @@ -408,10 +408,10 @@ blogc_render(bc_slist_t *tmpl, bc_slist_t *sources, bc_trie_t *config, bool list                      if_count--;                  break; -            case BLOGC_TEMPLATE_FOREACH_STMT: +            case BLOGC_TEMPLATE_NODE_FOREACH:                  if (foreach_var_start == NULL) { -                    if (stmt->value != NULL) -                        foreach_var_start = blogc_split_list_variable(stmt->value, +                    if (node->data[0] != NULL) +                        foreach_var_start = blogc_split_list_variable(node->data[0],                              config, inside_block ? tmp_source : NULL);                      if (foreach_var_start != NULL) { @@ -422,9 +422,9 @@ blogc_render(bc_slist_t *tmpl, bc_slist_t *sources, bc_trie_t *config, bool list                          // we can just skip anything and walk until the next                          // 'endforeach' -                        while (stmt->type != BLOGC_TEMPLATE_ENDFOREACH_STMT) { +                        while (node->type != BLOGC_TEMPLATE_NODE_ENDFOREACH) {                              tmp = tmp->next; -                            stmt = tmp->data; +                            node = tmp->data;                          }                          break;                      } @@ -436,7 +436,7 @@ blogc_render(bc_slist_t *tmpl, bc_slist_t *sources, bc_trie_t *config, bool list                  }                  break; -            case BLOGC_TEMPLATE_ENDFOREACH_STMT: +            case BLOGC_TEMPLATE_NODE_ENDFOREACH:                  if (foreach_start != NULL && foreach_var != NULL) {                      foreach_var = foreach_var->next;                      if (foreach_var != NULL) { diff --git a/src/blogc/template-parser.c b/src/blogc/template-parser.c index 6308095..4d2cb3c 100644 --- a/src/blogc/template-parser.c +++ b/src/blogc/template-parser.c @@ -55,7 +55,7 @@ blogc_template_parse(const char *src, size_t src_len, bc_error_t **err)      size_t start2 = 0;      size_t end2 = 0; -    blogc_template_stmt_operator_t tmp_op = 0; +    blogc_template_operator_t tmp_op = 0;      unsigned int if_count = 0;      unsigned int block_if_count = 0; @@ -63,8 +63,8 @@ blogc_template_parse(const char *src, size_t src_len, bc_error_t **err)      bool foreach_open = false;      bool block_foreach_open = false; -    bc_slist_t *stmts = NULL; -    blogc_template_stmt_t *stmt = NULL; +    bc_slist_t *ast = NULL; +    blogc_template_node_t *node = NULL;      /*       * this is a reference to the content of previous node in the singly-linked @@ -75,14 +75,14 @@ blogc_template_parse(const char *src, size_t src_len, bc_error_t **err)       * - template parser never walk backwards, then the list itself does not       *   need to know its previous node.       */ -    blogc_template_stmt_t *previous = NULL; +    blogc_template_node_t *previous = NULL;      bool lstrip_next = false;      char *tmp = NULL;      char *block_type = NULL;      blogc_template_parser_state_t state = TEMPLATE_START; -    blogc_template_stmt_type_t type = BLOGC_TEMPLATE_CONTENT_STMT; +    blogc_template_node_type_t type = BLOGC_TEMPLATE_NODE_CONTENT;      bool block_open = false; @@ -94,23 +94,23 @@ blogc_template_parse(const char *src, size_t src_len, bc_error_t **err)              case TEMPLATE_START:                  if (last) { -                    stmt = bc_malloc(sizeof(blogc_template_stmt_t)); -                    stmt->type = type; +                    node = bc_malloc(sizeof(blogc_template_node_t)); +                    node->type = type;                      if (lstrip_next) {                          tmp = bc_strndup(src + start, src_len - start); -                        stmt->value = bc_strdup(bc_str_lstrip(tmp)); +                        node->data[0] = bc_strdup(bc_str_lstrip(tmp));                          free(tmp);                          tmp = NULL;                          lstrip_next = false;                      }                      else { -                        stmt->value = bc_strndup(src + start, src_len - start); +                        node->data[0] = bc_strndup(src + start, src_len - start);                      } -                    stmt->op = 0; -                    stmt->value2 = NULL; -                    stmts = bc_slist_append(stmts, stmt); -                    previous = stmt; -                    stmt = NULL; +                    node->op = 0; +                    node->data[1] = NULL; +                    ast = bc_slist_append(ast, node); +                    previous = node; +                    node = NULL;                  }                  if (c == '{') {                      end = current; @@ -125,23 +125,23 @@ blogc_template_parse(const char *src, size_t src_len, bc_error_t **err)                      else                          state = TEMPLATE_VARIABLE_START;                      if (end > start) { -                        stmt = bc_malloc(sizeof(blogc_template_stmt_t)); -                        stmt->type = type; +                        node = bc_malloc(sizeof(blogc_template_node_t)); +                        node->type = type;                          if (lstrip_next) {                              tmp = bc_strndup(src + start, end - start); -                            stmt->value = bc_strdup(bc_str_lstrip(tmp)); +                            node->data[0] = bc_strdup(bc_str_lstrip(tmp));                              free(tmp);                              tmp = NULL;                              lstrip_next = false;                          }                          else { -                            stmt->value = bc_strndup(src + start, end - start); +                            node->data[0] = bc_strndup(src + start, end - start);                          } -                        stmt->op = 0; -                        stmt->value2 = NULL; -                        stmts = bc_slist_append(stmts, stmt); -                        previous = stmt; -                        stmt = NULL; +                        node->op = 0; +                        node->data[1] = NULL; +                        ast = bc_slist_append(ast, node); +                        previous = node; +                        node = NULL;                      }                      break;                  } @@ -151,9 +151,9 @@ blogc_template_parse(const char *src, size_t src_len, bc_error_t **err)              case TEMPLATE_BLOCK_START_WHITESPACE_CLEANER:                  if (c == '-') {                      if ((previous != NULL) && -                        (previous->type == BLOGC_TEMPLATE_CONTENT_STMT)) +                        (previous->type == BLOGC_TEMPLATE_NODE_CONTENT))                      { -                        previous->value = bc_str_rstrip(previous->value);  // does not need copy +                        previous->data[0] = bc_str_rstrip(previous->data[0]);  // does not need copy                      }                      state = TEMPLATE_BLOCK_START;                      break; @@ -189,7 +189,7 @@ blogc_template_parse(const char *src, size_t src_len, bc_error_t **err)                      {                          if (!block_open) {                              state = TEMPLATE_BLOCK_BLOCK_TYPE_START; -                            type = BLOGC_TEMPLATE_BLOCK_STMT; +                            type = BLOGC_TEMPLATE_NODE_BLOCK;                              start = current;                              block_if_count = if_count;                              block_foreach_open = foreach_open; @@ -217,7 +217,7 @@ blogc_template_parse(const char *src, size_t src_len, bc_error_t **err)                                  break;                              }                              state = TEMPLATE_BLOCK_END_WHITESPACE_CLEANER; -                            type = BLOGC_TEMPLATE_ENDBLOCK_STMT; +                            type = BLOGC_TEMPLATE_NODE_ENDBLOCK;                              block_open = false;                              break;                          } @@ -230,7 +230,7 @@ blogc_template_parse(const char *src, size_t src_len, bc_error_t **err)                          (0 == strncmp("ifdef", src + start, 5)))                      {                          state = TEMPLATE_BLOCK_IF_START; -                        type = BLOGC_TEMPLATE_IFDEF_STMT; +                        type = BLOGC_TEMPLATE_NODE_IFDEF;                          start = current;                          if_count++;                          else_open = false; @@ -240,7 +240,7 @@ blogc_template_parse(const char *src, size_t src_len, bc_error_t **err)                          (0 == strncmp("ifndef", src + start, 6)))                      {                          state = TEMPLATE_BLOCK_IF_START; -                        type = BLOGC_TEMPLATE_IFNDEF_STMT; +                        type = BLOGC_TEMPLATE_NODE_IFNDEF;                          start = current;                          if_count++;                          else_open = false; @@ -250,7 +250,7 @@ blogc_template_parse(const char *src, size_t src_len, bc_error_t **err)                          (0 == strncmp("if", src + start, 2)))                      {                          state = TEMPLATE_BLOCK_IF_START; -                        type = BLOGC_TEMPLATE_IF_STMT; +                        type = BLOGC_TEMPLATE_NODE_IF;                          start = current;                          if_count++;                          else_open = false; @@ -264,7 +264,7 @@ blogc_template_parse(const char *src, size_t src_len, bc_error_t **err)                          {                              if (!else_open) {                                  state = TEMPLATE_BLOCK_END_WHITESPACE_CLEANER; -                                type = BLOGC_TEMPLATE_ELSE_STMT; +                                type = BLOGC_TEMPLATE_NODE_ELSE;                                  else_open = true;                                  break;                              } @@ -287,7 +287,7 @@ blogc_template_parse(const char *src, size_t src_len, bc_error_t **err)                              (!block_open && if_count > 0))                          {                              state = TEMPLATE_BLOCK_END_WHITESPACE_CLEANER; -                            type = BLOGC_TEMPLATE_ENDIF_STMT; +                            type = BLOGC_TEMPLATE_NODE_ENDIF;                              if_count--;                              else_open = false;                              break; @@ -303,7 +303,7 @@ blogc_template_parse(const char *src, size_t src_len, bc_error_t **err)                      {                          if (!foreach_open) {                              state = TEMPLATE_BLOCK_FOREACH_START; -                            type = BLOGC_TEMPLATE_FOREACH_STMT; +                            type = BLOGC_TEMPLATE_NODE_FOREACH;                              start = current;                              foreach_open = true;                              break; @@ -320,7 +320,7 @@ blogc_template_parse(const char *src, size_t src_len, bc_error_t **err)                              (!block_open && foreach_open))                          {                              state = TEMPLATE_BLOCK_END_WHITESPACE_CLEANER; -                            type = BLOGC_TEMPLATE_ENDFOREACH_STMT; +                            type = BLOGC_TEMPLATE_NODE_ENDFOREACH;                              foreach_open = false;                              break;                          } @@ -404,7 +404,7 @@ blogc_template_parse(const char *src, size_t src_len, bc_error_t **err)                      break;                  if (c == ' ') {                      end = current; -                    if (type == BLOGC_TEMPLATE_IF_STMT) +                    if (type == BLOGC_TEMPLATE_NODE_IF)                          state = TEMPLATE_BLOCK_IF_OPERATOR_START;                      else                          state = TEMPLATE_BLOCK_END_WHITESPACE_CLEANER; @@ -528,7 +528,7 @@ blogc_template_parse(const char *src, size_t src_len, bc_error_t **err)                      break;                  if (c >= 'A' && c <= 'Z') {                      state = TEMPLATE_VARIABLE; -                    type = BLOGC_TEMPLATE_VARIABLE_STMT; +                    type = BLOGC_TEMPLATE_NODE_VARIABLE;                      start = current;                      break;                  } @@ -600,25 +600,25 @@ blogc_template_parse(const char *src, size_t src_len, bc_error_t **err)                          op_start = 0;                          op_end = 0;                      } -                    stmt = bc_malloc(sizeof(blogc_template_stmt_t)); -                    stmt->type = type; -                    stmt->value = NULL; -                    stmt->op = tmp_op; -                    stmt->value2 = NULL; +                    node = bc_malloc(sizeof(blogc_template_node_t)); +                    node->type = type; +                    node->op = tmp_op; +                    node->data[0] = NULL; +                    node->data[1] = NULL;                      if (end > start) -                        stmt->value = bc_strndup(src + start, end - start); +                        node->data[0] = bc_strndup(src + start, end - start);                      if (end2 > start2) { -                        stmt->value2 = bc_strndup(src + start2, end2 - start2); +                        node->data[1] = bc_strndup(src + start2, end2 - start2);                          start2 = 0;                          end2 = 0;                      } -                    if (type == BLOGC_TEMPLATE_BLOCK_STMT) -                        block_type = stmt->value; -                    stmts = bc_slist_append(stmts, stmt); -                    previous = stmt; -                    stmt = NULL; +                    if (type == BLOGC_TEMPLATE_NODE_BLOCK) +                        block_type = node->data[0]; +                    ast = bc_slist_append(ast, node); +                    previous = node; +                    node = NULL;                      state = TEMPLATE_START; -                    type = BLOGC_TEMPLATE_CONTENT_STMT; +                    type = BLOGC_TEMPLATE_NODE_CONTENT;                      start = current + 1;                      break;                  } @@ -652,28 +652,28 @@ blogc_template_parse(const char *src, size_t src_len, bc_error_t **err)      }      if (*err != NULL) { -        if (stmt != NULL) { -            free(stmt->value); -            free(stmt); +        if (node != NULL) { +            free(node->data[0]); +            free(node);          } -        blogc_template_free_stmts(stmts); +        blogc_template_free_ast(ast);          return NULL;      } -    return stmts; +    return ast;  }  void -blogc_template_free_stmts(bc_slist_t *stmts) +blogc_template_free_ast(bc_slist_t *ast)  { -    for (bc_slist_t *tmp = stmts; tmp != NULL; tmp = tmp->next) { -        blogc_template_stmt_t *data = tmp->data; +    for (bc_slist_t *tmp = ast; tmp != NULL; tmp = tmp->next) { +        blogc_template_node_t *data = tmp->data;          if (data == NULL)              continue; -        free(data->value); -        free(data->value2); +        free(data->data[0]); +        free(data->data[1]);          free(data);      } -    bc_slist_free(stmts); +    bc_slist_free(ast);  } diff --git a/src/blogc/template-parser.h b/src/blogc/template-parser.h index 63aa404..948ec9b 100644 --- a/src/blogc/template-parser.h +++ b/src/blogc/template-parser.h @@ -14,40 +14,43 @@  #include "../common/utils.h"  /* - * note: whitespace cleaners are NOT added to ast. we fix strings right during + * note: whitespace cleaners are NOT added to AST. we fix strings right during   * template parsing. renderer does not need to care about it, for the sake of   * simplicity. + * + * another note: technically this is not an AST, because there are no childs.   */  typedef enum { -    BLOGC_TEMPLATE_IFDEF_STMT = 1, -    BLOGC_TEMPLATE_IFNDEF_STMT, -    BLOGC_TEMPLATE_IF_STMT, -    BLOGC_TEMPLATE_ELSE_STMT, -    BLOGC_TEMPLATE_ENDIF_STMT, -    BLOGC_TEMPLATE_FOREACH_STMT, -    BLOGC_TEMPLATE_ENDFOREACH_STMT, -    BLOGC_TEMPLATE_BLOCK_STMT, -    BLOGC_TEMPLATE_ENDBLOCK_STMT, -    BLOGC_TEMPLATE_VARIABLE_STMT, -    BLOGC_TEMPLATE_CONTENT_STMT, -} blogc_template_stmt_type_t; +    BLOGC_TEMPLATE_NODE_IFDEF = 1, +    BLOGC_TEMPLATE_NODE_IFNDEF, +    BLOGC_TEMPLATE_NODE_IF, +    BLOGC_TEMPLATE_NODE_ELSE, +    BLOGC_TEMPLATE_NODE_ENDIF, +    BLOGC_TEMPLATE_NODE_FOREACH, +    BLOGC_TEMPLATE_NODE_ENDFOREACH, +    BLOGC_TEMPLATE_NODE_BLOCK, +    BLOGC_TEMPLATE_NODE_ENDBLOCK, +    BLOGC_TEMPLATE_NODE_VARIABLE, +    BLOGC_TEMPLATE_NODE_CONTENT, +} blogc_template_node_type_t;  typedef enum {      BLOGC_TEMPLATE_OP_NEQ = 1 << 0,      BLOGC_TEMPLATE_OP_EQ  = 1 << 1,      BLOGC_TEMPLATE_OP_LT  = 1 << 2,      BLOGC_TEMPLATE_OP_GT  = 1 << 3, -} blogc_template_stmt_operator_t; +} blogc_template_operator_t;  typedef struct { -    blogc_template_stmt_type_t type; -    char *value; -    char *value2; -    blogc_template_stmt_operator_t op; -} blogc_template_stmt_t; +    blogc_template_node_type_t type; +    blogc_template_operator_t op; + +    // 2 slots to store node data. +    char *data[2]; +} blogc_template_node_t;  bc_slist_t* blogc_template_parse(const char *src, size_t src_len,      bc_error_t **err); -void blogc_template_free_stmts(bc_slist_t *stmts); +void blogc_template_free_ast(bc_slist_t *ast);  #endif /* _TEMPLATE_PARSER_H */  | 
