new node "none" that matches nothing
[protos/libecoli.git] / lib / ecoli_completed.h
1 /*
2  * Copyright (c) 2016, Olivier MATZ <zer0@droids-corp.org>
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions are met:
6  *
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.
15  *
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.
26  */
27
28 /**
29  * API for generating completions item on a node.
30  *
31  * This file provide helpers to list and manipulate the possible
32  * completions for a given input.
33  *
34  * XXX completed vs item
35  */
36
37 #ifndef ECOLI_COMPLETED_
38 #define ECOLI_COMPLETED_
39
40 #include <sys/queue.h>
41 #include <sys/types.h>
42 #include <stdio.h>
43
44 struct ec_node;
45
46 enum ec_completed_type {
47         EC_COMP_UNKNOWN = 0x1,
48         EC_COMP_FULL = 0x2,
49         EC_COMP_PARTIAL = 0x4,
50         EC_COMP_ALL = 0x7,
51 };
52
53 struct ec_completed_item;
54
55 TAILQ_HEAD(ec_completed_item_list, ec_completed_item);
56
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;
63 };
64
65 TAILQ_HEAD(ec_completed_group_list, ec_completed_group);
66
67 struct ec_completed {
68         unsigned count;
69         unsigned count_match;
70         struct ec_parsed *cur_state;
71         struct ec_completed_group *cur_group;
72         struct ec_completed_group_list groups;
73 };
74
75 /*
76  * return a completed object filled with items
77  * return NULL on error (nomem?)
78  */
79 struct ec_completed *ec_node_complete(struct ec_node *node,
80         const char *str);
81 struct ec_completed *ec_node_complete_strvec(struct ec_node *node,
82         const struct ec_strvec *strvec);
83
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);
88
89 /**
90  * Create a completion object (list of completion items).
91  *
92  *
93  */
94 struct ec_completed *ec_completed(struct ec_parsed *state);
95
96 /**
97  * Free a completion object and all its items.
98  *
99  *
100  */
101 void ec_completed_free(struct ec_completed *completed);
102
103 /**
104  *
105  *
106  *
107  */
108 void ec_completed_dump(FILE *out,
109         const struct ec_completed *completed);
110
111 /**
112  * Merge items contained in 'from' into 'to'
113  *
114  * The 'from' completed struct is freed.
115  */
116 int ec_completed_merge(struct ec_completed *to,
117                 struct ec_completed *from);
118
119 struct ec_parsed *ec_completed_get_state(struct ec_completed *completed);
120
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);
127
128 /**
129  *
130  */
131 int ec_completed_item_set_str(struct ec_completed_item *item,
132                         const char *str);
133
134 /**
135  * Get the string value of a completion item.
136  *
137  *
138  */
139 const char *
140 ec_completed_item_get_str(const struct ec_completed_item *item);
141
142 /**
143  * Get the display string value of a completion item.
144  *
145  *
146  */
147 const char *
148 ec_completed_item_get_display(const struct ec_completed_item *item);
149
150 /**
151  * Get the completion string value of a completion item.
152  *
153  *
154  */
155 const char *
156 ec_completed_item_get_completion(const struct ec_completed_item *item);
157
158 /**
159  * Get the group of a completion item.
160  *
161  *
162  */
163 const struct ec_completed_group *
164 ec_completed_item_get_grp(const struct ec_completed_item *item);
165
166 /**
167  * Get the type of a completion item.
168  *
169  *
170  */
171 enum ec_completed_type
172 ec_completed_item_get_type(const struct ec_completed_item *item);
173
174 /**
175  * Get the node associated to a completion item.
176  *
177  *
178  */
179 const struct ec_node *
180 ec_completed_item_get_node(const struct ec_completed_item *item);
181
182 /**
183  * Set the display value of an item.
184  *
185  *
186  */
187 int ec_completed_item_set_display(struct ec_completed_item *item,
188                                 const char *display);
189
190 /**
191  * Set the completion value of an item.
192  *
193  *
194  */
195 int ec_completed_item_set_completion(struct ec_completed_item *item,
196                                 const char *completion);
197
198 /**
199  *
200  *
201  *
202  */
203 int
204 ec_node_default_complete(const struct ec_node *gen_node,
205                         struct ec_completed *completed,
206                         const struct ec_strvec *strvec);
207
208 /**
209  *
210  *
211  *
212  */
213 unsigned int ec_completed_count(
214         const struct ec_completed *completed,
215         enum ec_completed_type flags);
216
217 /**
218  *
219  *
220  *
221  */
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;
227 };
228
229 /**
230  *
231  *
232  *
233  */
234 struct ec_completed_iter *
235 ec_completed_iter(struct ec_completed *completed,
236         enum ec_completed_type type);
237
238 /**
239  *
240  *
241  *
242  */
243 struct ec_completed_item *ec_completed_iter_next(
244         struct ec_completed_iter *iter);
245
246 /**
247  *
248  *
249  *
250  */
251 void ec_completed_iter_free(struct ec_completed_iter *iter);
252
253
254 #endif