X-Git-Url: http://git.droids-corp.org/?p=protos%2Flibecoli.git;a=blobdiff_plain;f=src%2Fecoli_editline.c;h=e3e53cfd10dc837b8934e3d28ab94b444f388164;hp=4cc7ec47358f5478e650147c1223275b7861a2ce;hb=HEAD;hpb=18d03456d96f7a086a2ccc82ce97fcf056848d90 diff --git a/src/ecoli_editline.c b/src/ecoli_editline.c index 4cc7ec4..e3e53cf 100644 --- a/src/ecoli_editline.c +++ b/src/ecoli_editline.c @@ -12,7 +12,7 @@ #include #include #include -#include +#include #include #include #include @@ -311,16 +311,11 @@ void ec_editline_free_completions(char **matches, size_t len) ssize_t ec_editline_get_completions(const struct ec_comp *cmpl, char ***matches_out) { - const struct ec_comp_item *item; - struct ec_comp_iter *iter = NULL; + struct ec_comp_item *item; char **matches = NULL; size_t count = 0; - iter = ec_comp_iter(cmpl, EC_COMP_FULL | EC_COMP_PARTIAL); - if (iter == NULL) - goto fail; - - while ((item = ec_comp_iter_next(iter)) != NULL) { + EC_COMP_FOREACH(item, cmpl, EC_COMP_FULL | EC_COMP_PARTIAL) { char **tmp; tmp = realloc(matches, (count + 1) * sizeof(char *)); @@ -339,24 +334,18 @@ ec_editline_get_completions(const struct ec_comp *cmpl, char ***matches_out) fail: ec_editline_free_completions(matches, count); *matches_out = NULL; - ec_comp_iter_free(iter); return -1; } char * ec_editline_append_chars(const struct ec_comp *cmpl) { - const struct ec_comp_item *item; - struct ec_comp_iter *iter = NULL; + struct ec_comp_item *item; const char *append; char *ret = NULL; size_t n; - iter = ec_comp_iter(cmpl, EC_COMP_FULL | EC_COMP_PARTIAL); - if (iter == NULL) - goto fail; - - while ((item = ec_comp_iter_next(iter)) != NULL) { + EC_COMP_FOREACH(item, cmpl, EC_COMP_FULL | EC_COMP_PARTIAL) { append = ec_comp_item_get_completion(item); if (ret == NULL) { ret = ec_strdup(append); @@ -367,12 +356,10 @@ ec_editline_append_chars(const struct ec_comp *cmpl) ret[n] = '\0'; } } - ec_comp_iter_free(iter); return ret; fail: - ec_comp_iter_free(iter); ec_free(ret); return NULL; @@ -383,34 +370,34 @@ static int get_node_help(const struct ec_comp_item *item, struct ec_editline_help *help) { const struct ec_comp_group *grp; - const struct ec_parse *state; + const struct ec_pnode *pstate; const struct ec_node *node; const char *node_help = NULL; - const char *node_desc = NULL; + char *node_desc = NULL; help->desc = NULL; help->help = NULL; grp = ec_comp_item_get_grp(item); - for (state = grp->state; state != NULL; - state = ec_parse_get_parent(state)) { - node = ec_parse_get_node(state); + for (pstate = ec_comp_group_get_pstate(grp); pstate != NULL; + pstate = ec_pnode_get_parent(pstate)) { + node = ec_pnode_get_node(pstate); if (node_help == NULL) - node_help = ec_keyval_get(ec_node_attrs(node), "help"); - if (node_desc == NULL) + node_help = ec_dict_get(ec_node_attrs(node), "help"); + if (node_desc == NULL) { node_desc = ec_node_desc(node); + if (node_desc == NULL) + goto fail; + } } - if (node_help == NULL) - node_help = ""; if (node_desc == NULL) goto fail; + if (node_help == NULL) + node_help = ""; - help->desc = ec_strdup(node_desc); - if (help->desc == NULL) - goto fail; - + help->desc = node_desc; help->help = ec_strdup(node_help); if (help->help == NULL) goto fail; @@ -418,6 +405,7 @@ static int get_node_help(const struct ec_comp_item *item, return 0; fail: + ec_free(node_desc); ec_free(help->desc); ec_free(help->help); return -1; @@ -427,34 +415,27 @@ ssize_t ec_editline_get_helps(const struct ec_editline *editline, const char *line, const char *full_line, struct ec_editline_help **helps_out) { - struct ec_comp_iter *iter = NULL; const struct ec_comp_group *grp, *prev_grp = NULL; - const struct ec_comp_item *item; + struct ec_comp_item *item; struct ec_comp *cmpl = NULL; - struct ec_parse *parse = NULL; + struct ec_pnode *parse = NULL; unsigned int count = 0; struct ec_editline_help *helps = NULL; *helps_out = NULL; /* check if the current line matches */ - parse = ec_node_parse(editline->node, full_line); - if (ec_parse_matches(parse)) + parse = ec_parse(editline->node, full_line); + if (ec_pnode_matches(parse)) count = 1; - ec_parse_free(parse); + ec_pnode_free(parse); parse = NULL; /* complete at current cursor position */ - cmpl = ec_node_complete(editline->node, line); + cmpl = ec_complete(editline->node, line); if (cmpl == NULL) //XXX log error goto fail; - /* let's display one contextual help per node */ - iter = ec_comp_iter(cmpl, - EC_COMP_UNKNOWN | EC_COMP_FULL | EC_COMP_PARTIAL); - if (iter == NULL) - goto fail; - helps = ec_calloc(1, sizeof(*helps)); if (helps == NULL) goto fail; @@ -467,7 +448,9 @@ ec_editline_get_helps(const struct ec_editline *editline, const char *line, goto fail; } - while ((item = ec_comp_iter_next(iter)) != NULL) { + /* let's display one contextual help per node */ + EC_COMP_FOREACH(item, cmpl, + EC_COMP_UNKNOWN | EC_COMP_FULL | EC_COMP_PARTIAL) { struct ec_editline_help *tmp = NULL; /* keep one help per group, skip other items */ @@ -486,15 +469,13 @@ ec_editline_get_helps(const struct ec_editline *editline, const char *line, count++; } - ec_comp_iter_free(iter); ec_comp_free(cmpl); *helps_out = helps; return count; fail: - ec_comp_iter_free(iter); - ec_parse_free(parse); + ec_pnode_free(parse); ec_comp_free(cmpl); if (helps != NULL) { while (count--) { @@ -551,7 +532,7 @@ ec_editline_complete(EditLine *el, int c) goto fail; } - cmpl = ec_node_complete(editline->node, line); + cmpl = ec_complete(editline->node, line); if (cmpl == NULL) goto fail; @@ -653,11 +634,11 @@ fail: return NULL; } -struct ec_parse * +struct ec_pnode * ec_editline_parse(struct ec_editline *editline, const struct ec_node *node) { char *line = NULL; - struct ec_parse *parse = NULL; + struct ec_pnode *parse = NULL; /* XXX add sh_lex automatically? This node is required, parse and * complete are based on it. */ @@ -668,7 +649,7 @@ ec_editline_parse(struct ec_editline *editline, const struct ec_node *node) if (line == NULL) goto fail; - parse = ec_node_parse(node, line); + parse = ec_parse(node, line); if (parse == NULL) goto fail; @@ -677,7 +658,7 @@ ec_editline_parse(struct ec_editline *editline, const struct ec_node *node) fail: ec_free(line); - ec_parse_free(parse); + ec_pnode_free(parse); return NULL; }