4 X evaluate expression tree in ec_tk_expr
12 X ec_completed_item_update()
13 X ec_completed_item_set_display_value()
17 X properly manage quotes in shlex
18 X remove the _new() functions
19 X iterate children nodes without chaining them
20 - add a node vector type: will be used in several nodes (ex: or, seq, ...)
21 - check allocation model everywhere
23 - use linux style (update .emacs)
25 - check return values (-1 or NULL) + use errno
26 - check missing static / const
28 - check all completion nodes
30 - size_t or unsigned int?
33 X ec_parsed_tk -> ec_parsed
34 X ec_completed_tk -> ec_completed
35 X tk, gen_tk, token, ... -> node
36 X tokens -> input_str / input_strvec ?
37 X save node path in completion to fix help string
39 - try to hide structures
40 - anything better than weakref?
41 - add ec_node_defaults.[ch] providing usual implementations of node methods
43 - ELOOP in case of loop
49 X pass the current parsed state when parsing/completing
51 - new node "condition"
61 X register nodes by name
62 - interface to add attributes: all nodes must be configurable through a
70 - yaml interface to create nodes
76 - example which parses arguments (argc/argv)
77 - example that acts as bash completion (ip link ?)
78 - calculator example (var assignation, expression evaluation)
79 - example with libedit
80 - mini script language
82 - mini shell: cd, ls, cat, stat
83 - mini network console based on ip
90 - generate automatic api doc
92 - coding rules, process
95 - say that it stops at first match (no ambigous support)
96 - say that completion must be exhaustive
102 - split libs, tests and examples
110 - complete automatic tests with "make test"
116 - node which always matches
117 - file + partial completion
119 - fusion node: need to match several children, same for completion
126 - support utf-8 and other encodings
133 - demonstration example that parses yang file and generate cli
137 -----------------------
141 [tab] list possible completions (matches/partial only)
142 [?] list what is expected, example:
144 "command [foo] toto|titi|<int>"
160 - ec_node: a node that can be parsed/completed
161 - ec_parse: a tree describing the result of parse(node, input)
162 - ec_comp: a list describing the result of complete(node, input)
182 parse() returns a tree
185 - each node of the tree refers to a ec_node
186 - each node points to the strvec that matches
187 - parse returns the first matching solution
188 - usually try to match as many str in the vecs (seq node)
196 The parse cb of the node is:
198 parse_cb(node, current_parse_state, strvec, *nmatch)
201 - 0: success, child->strvec is set by node (NULL = no_match)
202 - -1: error (errno is set)
203 maybe complex to use:
204 - the node must set the match (ex: "return ec_parsed_node_match()")
205 - the caller must use accessor to check if it matches or not
207 alternative idea for return values:
208 - >= 0: match, ret == nb_tk
209 - -1: error (errno is set)
210 - -2 or MAX_INT: success, but no match
211 This is strange to have a specific value for no match
212 With MAX_INT, this is the best (less bad) alternative
214 alternative idea for return values:
215 - ec_parse_result_match(n_tokens >= 0)
216 - ec_parse_result_nomatch()
217 - ec_parse_result_error(errno)
219 A node always try to consume the maximum number of tokens.
227 [foo, foo, bar] matches
228 [foo, bar] does *not* match
230 complete() returns a list of possible completions
234 - partial completion: in a path dir/file, completion stops once
236 - displayed value is not the completion token: when completing a
237 file in several subdirectories, the full path is not displayed
238 - any parent node can modify the completions, ex: add missing quotes
239 in ec_node_sh_lex(), filter completions in case of a ec_node_filter()
240 - a command line may want to display the help from the most specific
242 - some specific nodes can complete several tokens
246 type: full, partial, unknown
249 full: the completion item matches token
250 partial: beginning of a completion, does not match the token
251 (good example is a directory in a path)
252 unknown: could complete, but the node does not know how
254 struct completion_item {
259 struct completed_elt {
260 ec_parsed *parse_tree; // current tree state
261 ec_node *last; // last node of the tree
262 list of items; // list of items for this parse tree
271 complete_cb(node, current_complete_state, current_parse_state, strvec)
273 - 0 = success, the current complete state is updated
274 - -1 = error (set errno?)
277 a node can filter the completions
314 - a completion item should contain a strvec for the value
315 (the display string remains a string)
316 - there is maybe no good reason to split in:
317 - ec_completed_item()
318 - ec_completed_item_set()
319 - ec_completed_item_set_display()
320 - ec_completed_item_add()
330 complete(sh_lex, ["'fo"])
331 complete(sh_lex, ["fo"]) -> ["foo", "foo2"]
344 static inline bool is_success(struct res r)
352 static inline struct res res(int a)
367 printf("success: %d\n", r.a);
373 printf("success: %d\n", r.a);
396 prod = term ( "*" term )*
397 sum = prod ( "+" prod )*
408 condition <breakpoint num> seq == <value>