X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=lib%2Fmain-readline.c;h=2c81c53c0f69e76d413910bdc1ede305077844cd;hb=51028779e0a8772091aec5ab96bcf2519cf2f1ad;hp=a8a58409906257c458753f220989254ed7948f9c;hpb=48e94706856e269b21f5748a28f226fa846b0c4b;p=protos%2Flibecoli.git diff --git a/lib/main-readline.c b/lib/main-readline.c index a8a5840..2c81c53 100644 --- a/lib/main-readline.c +++ b/lib/main-readline.c @@ -1,28 +1,5 @@ -/* - * Copyright (c) 2016, Olivier MATZ - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of the University of California, Berkeley nor the - * names of its contributors may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND ANY - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE REGENTS AND CONTRIBUTORS BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright 2016, Olivier MATZ */ #define _GNU_SOURCE /* for asprintf */ @@ -36,8 +13,8 @@ #include #include -#include -#include +#include +#include #include #include #include @@ -55,10 +32,10 @@ static struct ec_node *commands; static char *my_completion_entry(const char *s, int state) { - static struct ec_completed *c; - static struct ec_completed_iter *iter; - const struct ec_completed_item *item; - enum ec_completed_type item_type; + static struct ec_comp *c; + static struct ec_comp_iter *iter; + const struct ec_comp_item *item; + enum ec_comp_type item_type; const char *item_str, *item_display; (void)s; @@ -71,7 +48,7 @@ static char *my_completion_entry(const char *s, int state) if (state == 0) { char *line; - ec_completed_free(c); + ec_comp_free(c); line = strdup(rl_line_buffer); if (line == NULL) return NULL; @@ -82,22 +59,22 @@ static char *my_completion_entry(const char *s, int state) if (c == NULL) return NULL; - ec_completed_iter_free(iter); - iter = ec_completed_iter(c, EC_COMP_FULL | EC_COMP_PARTIAL); + ec_comp_iter_free(iter); + iter = ec_comp_iter(c, EC_COMP_FULL | EC_COMP_PARTIAL); if (iter == NULL) return NULL; } - item = ec_completed_iter_next(iter); + item = ec_comp_iter_next(iter); if (item == NULL) return NULL; - item_str = ec_completed_item_get_str(item); + item_str = ec_comp_item_get_str(item); if (c->count_full == 1) { /* don't add the trailing space for partial completions */ if (state == 0) { - item_type = ec_completed_item_get_type(item); + item_type = ec_comp_item_get_type(item); if (item_type == EC_COMP_FULL) rl_completion_suppress_append = 0; else @@ -107,7 +84,7 @@ static char *my_completion_entry(const char *s, int state) return strdup(item_str); } else if (rl_completion_type == '?') { /* on second try only show the display part */ - item_display = ec_completed_item_get_display(item); + item_display = ec_comp_item_get_display(item); return strdup(item_display); } @@ -126,21 +103,20 @@ static char **my_attempted_completion(const char *text, int start, int end) } /* this function builds the help string */ -static char *get_node_help(const struct ec_completed_item *item) +static char *get_node_help(const struct ec_comp_item *item) { - const struct ec_completed_group *grp; - struct ec_parsed *state; // XXX keep const with macro + const struct ec_comp_group *grp; + const struct ec_parse *state; const struct ec_node *node; char *help = NULL; const char *node_help = NULL; const char *node_desc = NULL; - grp = ec_completed_item_get_grp(item); + grp = ec_comp_item_get_grp(item); state = grp->state; - ec_parsed_dump(stdout, ec_parsed_get_root(state)); for (state = grp->state; state != NULL; - state = ec_parsed_get_parent(state)) { - node = ec_parsed_get_node(state); + state = ec_parse_get_parent(state)) { + node = ec_parse_get_node(state); if (node_help == NULL) node_help = ec_keyval_get(ec_node_attrs(node), "help"); if (node_desc == NULL) @@ -160,15 +136,16 @@ static char *get_node_help(const struct ec_completed_item *item) static int show_help(int ignore, int invoking_key) { - struct ec_completed_iter *iter; - const struct ec_completed_group *grp, *prev_grp = NULL; - const struct ec_completed_item *item; - struct ec_completed *c; - struct ec_parsed *p; + struct ec_comp_iter *iter = NULL; + const struct ec_comp_group *grp, *prev_grp = NULL; + const struct ec_comp_item *item; + struct ec_comp *c = NULL; + struct ec_parse *p = NULL; char *line = NULL; unsigned int count; char **helps = NULL; int match = 0; + int cols; (void)ignore; (void)invoking_key; @@ -179,9 +156,9 @@ static int show_help(int ignore, int invoking_key) /* check if the current line matches */ p = ec_node_parse(commands, line); - if (ec_parsed_matches(p)) + if (ec_parse_matches(p)) match = 1; - ec_parsed_free(p); + ec_parse_free(p); p = NULL; /* complete at current cursor position */ @@ -192,11 +169,9 @@ static int show_help(int ignore, int invoking_key) if (c == NULL) goto fail; - ec_completed_dump(stdout, c); - /* let's display one contextual help per node */ count = 0; - iter = ec_completed_iter(c, + iter = ec_comp_iter(c, EC_COMP_UNKNOWN | EC_COMP_FULL | EC_COMP_PARTIAL); if (iter == NULL) goto fail; @@ -208,11 +183,11 @@ static int show_help(int ignore, int invoking_key) if (match) helps[1] = ""; - while ((item = ec_completed_iter_next(iter)) != NULL) { + while ((item = ec_comp_iter_next(iter)) != NULL) { char **tmp; /* keep one help per group, skip other items */ - grp = ec_completed_item_get_grp(item); + grp = ec_comp_item_get_grp(item); if (grp == prev_grp) continue; @@ -226,18 +201,20 @@ static int show_help(int ignore, int invoking_key) count++; } - ec_completed_iter_free(iter); - ec_completed_free(c); - rl_display_match_list(helps, count + match, 1000); /* XXX 1000 */ + ec_comp_iter_free(iter); + ec_comp_free(c); + /* ensure not more than 1 entry per line */ + rl_get_screen_size(NULL, &cols); + rl_display_match_list(helps, count + match, cols); rl_forced_update_display(); return 0; fail: - ec_completed_iter_free(iter); - ec_parsed_free(p); + ec_comp_iter_free(iter); + ec_parse_free(p); free(line); - ec_completed_free(c); + ec_comp_free(c); if (helps != NULL) { while (count--) free(helps[count + match + 1]); @@ -352,7 +329,7 @@ static int create_commands(void) int main(void) { - struct ec_parsed *p; + struct ec_parse *p; char *line; if (ec_init() < 0) { @@ -372,9 +349,9 @@ int main(void) break; p = ec_node_parse(commands, line); - ec_parsed_dump(stdout, p); + ec_parse_dump(stdout, p); add_history(line); - ec_parsed_free(p); + ec_parse_free(p); }