support resetting regexp
[protos/libecoli.git] / lib / ecoli_completed.c
index 25ae6cb..bdada2a 100644 (file)
@@ -60,6 +60,10 @@ struct ec_completed *ec_completed(struct ec_parsed *state)
        if (completed == NULL)
                goto fail;
 
+       completed->attrs = ec_keyval();
+       if (completed->attrs == NULL)
+               goto fail;
+
        TAILQ_INIT(&completed->groups);
 
        completed->cur_state = state;
@@ -67,6 +71,8 @@ struct ec_completed *ec_completed(struct ec_parsed *state)
        return completed;
 
  fail:
+       if (completed != NULL)
+               ec_keyval_free(completed->attrs);
        ec_free(completed);
 
        return NULL;
@@ -78,35 +84,25 @@ struct ec_parsed *ec_completed_get_state(struct ec_completed *completed)
 }
 
 int
-ec_node_complete_child(struct ec_node *node, struct ec_completed *completed,
-                       const struct ec_strvec *strvec)
+ec_node_complete_child(const struct ec_node *node,
+               struct ec_completed *completed,
+               const struct ec_strvec *strvec)
 {
        struct ec_parsed *child_state, *cur_state;
        struct ec_completed_group *cur_group;
        int ret;
 
-       /* build the node if required */
-       if (node->type->build != NULL) {
-               if ((node->flags & EC_NODE_F_BUILT) == 0) {
-                       ret = node->type->build(node);
-                       if (ret < 0)
-                               return ret;
-               }
-       }
-       node->flags |= EC_NODE_F_BUILT;
-
        if (node->type->complete == NULL)
                return -ENOTSUP;
 
        /* save previous parse state, prepare child state */
        cur_state = completed->cur_state;
-       child_state = ec_parsed();
+       child_state = ec_parsed(node);
        if (child_state == NULL)
                return -ENOMEM;
 
        if (cur_state != NULL)
                ec_parsed_add_child(cur_state, child_state);
-       ec_parsed_set_node(child_state, node);
        completed->cur_state = child_state;
        cur_group = completed->cur_group;
        completed->cur_group = NULL;
@@ -126,17 +122,10 @@ ec_node_complete_child(struct ec_node *node, struct ec_completed *completed,
        if (ret < 0)
                return ret;
 
-#if 0 // XXX dump
-       printf("----------------------------------------------------------\n");
-       ec_node_dump(stdout, node);
-       ec_strvec_dump(stdout, strvec);
-       ec_completed_dump(stdout, completed);
-#endif
-
        return 0;
 }
 
-struct ec_completed *ec_node_complete_strvec(struct ec_node *node,
+struct ec_completed *ec_node_complete_strvec(const struct ec_node *node,
        const struct ec_strvec *strvec)
 {
        struct ec_completed *completed = NULL;
@@ -157,7 +146,7 @@ fail:
        return NULL;
 }
 
-struct ec_completed *ec_node_complete(struct ec_node *node,
+struct ec_completed *ec_node_complete(const struct ec_node *node,
        const char *str)
 {
        struct ec_strvec *strvec = NULL;
@@ -271,7 +260,7 @@ ec_completed_item(const struct ec_node *node, enum ec_completed_type type,
        return item;
 
 fail:
-       ec_keyval_free(item->attrs);
+       ec_keyval_free(attrs);
        ec_free(comp_cp);
        ec_free(start_cp);
        ec_free(full_cp);
@@ -366,10 +355,13 @@ ec_completed_item_add(struct ec_completed *completed,
 
        switch (item->type) {
        case EC_COMP_UNKNOWN:
+               completed->count_unknown++;
                break;
        case EC_COMP_FULL:
+               completed->count_full++;
+               break;
        case EC_COMP_PARTIAL:
-               completed->count_match++; //XXX
+               completed->count_partial++;
                break;
        default:
                return -EINVAL;
@@ -518,6 +510,7 @@ void ec_completed_free(struct ec_completed *completed)
                TAILQ_REMOVE(&completed->groups, grp, next);
                ec_completed_group_free(grp);
        }
+       ec_keyval_free(completed->attrs);
        ec_free(completed);
 }
 
@@ -531,8 +524,9 @@ void ec_completed_dump(FILE *out, const struct ec_completed *completed)
                return;
        }
 
-       fprintf(out, "completion: count=%u match=%u\n",
-               completed->count, completed->count_match);
+       fprintf(out, "completion: count=%u full=%u partial=%u unknown=%u\n",
+               completed->count, completed->count_full,
+               completed->count_partial,  completed->count_unknown);
 
        TAILQ_FOREACH(grp, &completed->groups, next) {
                fprintf(out, "node=%p, node_type=%s\n",
@@ -565,7 +559,9 @@ int ec_completed_merge(struct ec_completed *to,
                TAILQ_INSERT_TAIL(&to->groups, grp, next);
        }
        to->count += from->count;
-       to->count_match += from->count_match;
+       to->count_full += from->count_full;
+       to->count_partial += from->count_partial;
+       to->count_unknown += from->count_unknown;
 
        ec_completed_free(from);
        return 0;
@@ -581,9 +577,11 @@ unsigned int ec_completed_count(
                return count;
 
        if (type & EC_COMP_FULL)
-               count += completed->count_match;
+               count += completed->count_full;
+       if (type & EC_COMP_PARTIAL)
+               count += completed->count_partial;
        if (type & EC_COMP_UNKNOWN)
-               count += (completed->count - completed->count_match); //XXX
+               count += completed->count_unknown;
 
        return count;
 }
@@ -609,10 +607,13 @@ ec_completed_iter(struct ec_completed *completed,
 struct ec_completed_item *ec_completed_iter_next(
        struct ec_completed_iter *iter)
 {
-       struct ec_completed *completed = iter->completed;
+       struct ec_completed *completed;
        struct ec_completed_group *cur_node;
        struct ec_completed_item *cur_match;
 
+       if (iter == NULL)
+               return NULL;
+       completed = iter->completed;
        if (completed == NULL)
                return NULL;