2 * Copyright (c) 2016, Olivier MATZ <zer0@droids-corp.org>
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are met:
7 * * Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * * Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 * * Neither the name of the University of California, Berkeley nor the
13 * names of its contributors may be used to endorse or promote products
14 * derived from this software without specific prior written permission.
16 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND ANY
17 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19 * DISCLAIMED. IN NO EVENT SHALL THE REGENTS AND CONTRIBUTORS BE LIABLE FOR ANY
20 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 * API for generating completions item on a node.
31 * This file provide helpers to list and manipulate the possible
32 * completions for a given input.
34 * XXX completed vs item
37 #ifndef ECOLI_COMPLETED_
38 #define ECOLI_COMPLETED_
40 #include <sys/queue.h>
41 #include <sys/types.h>
46 enum ec_completed_type {
47 EC_COMP_UNKNOWN = 0x1,
49 EC_COMP_PARTIAL = 0x4,
53 struct ec_completed_item;
55 TAILQ_HEAD(ec_completed_item_list, ec_completed_item);
57 struct ec_completed_group {
58 TAILQ_ENTRY(ec_completed_group) next;
59 const struct ec_node *node;
60 struct ec_completed_item_list items;
61 struct ec_parsed *state;
62 struct ec_keyval *attrs;
65 TAILQ_HEAD(ec_completed_group_list, ec_completed_group);
70 struct ec_parsed *cur_state;
71 struct ec_completed_group *cur_group;
72 struct ec_completed_group_list groups;
76 * return a completed object filled with items
77 * return NULL on error (nomem?)
79 struct ec_completed *ec_node_complete(struct ec_node *node,
81 struct ec_completed *ec_node_complete_strvec(struct ec_node *node,
82 const struct ec_strvec *strvec);
84 /* internal: used by nodes */
85 int ec_node_complete_child(struct ec_node *node,
86 struct ec_completed *completed,
87 const struct ec_strvec *strvec);
90 * Create a completion object (list of completion items).
94 struct ec_completed *ec_completed(struct ec_parsed *state);
97 * Free a completion object and all its items.
101 void ec_completed_free(struct ec_completed *completed);
108 void ec_completed_dump(FILE *out,
109 const struct ec_completed *completed);
112 * Merge items contained in 'from' into 'to'
114 * The 'from' completed struct is freed.
116 int ec_completed_merge(struct ec_completed *to,
117 struct ec_completed *from);
119 struct ec_parsed *ec_completed_get_state(struct ec_completed *completed);
121 /* shortcut for ec_completed_item() + ec_completed_item_add() */
122 int ec_completed_add_item(struct ec_completed *completed,
123 const struct ec_node *node,
124 struct ec_completed_item **p_item,
125 enum ec_completed_type type,
126 const char *start, const char *full);
131 int ec_completed_item_set_str(struct ec_completed_item *item,
135 * Get the string value of a completion item.
140 ec_completed_item_get_str(const struct ec_completed_item *item);
143 * Get the display string value of a completion item.
148 ec_completed_item_get_display(const struct ec_completed_item *item);
151 * Get the completion string value of a completion item.
156 ec_completed_item_get_completion(const struct ec_completed_item *item);
159 * Get the group of a completion item.
163 const struct ec_completed_group *
164 ec_completed_item_get_grp(const struct ec_completed_item *item);
167 * Get the type of a completion item.
171 enum ec_completed_type
172 ec_completed_item_get_type(const struct ec_completed_item *item);
175 * Get the node associated to a completion item.
179 const struct ec_node *
180 ec_completed_item_get_node(const struct ec_completed_item *item);
183 * Set the display value of an item.
187 int ec_completed_item_set_display(struct ec_completed_item *item,
188 const char *display);
191 * Set the completion value of an item.
195 int ec_completed_item_set_completion(struct ec_completed_item *item,
196 const char *completion);
204 ec_node_default_complete(const struct ec_node *gen_node,
205 struct ec_completed *completed,
206 const struct ec_strvec *strvec);
213 unsigned int ec_completed_count(
214 const struct ec_completed *completed,
215 enum ec_completed_type flags);
222 struct ec_completed_iter {
223 enum ec_completed_type type;
224 struct ec_completed *completed;
225 struct ec_completed_group *cur_node;
226 struct ec_completed_item *cur_match;
234 struct ec_completed_iter *
235 ec_completed_iter(struct ec_completed *completed,
236 enum ec_completed_type type);
243 struct ec_completed_item *ec_completed_iter_next(
244 struct ec_completed_iter *iter);
251 void ec_completed_iter_free(struct ec_completed_iter *iter);