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.
32 #include <readline/readline.h>
33 #include <readline/history.h>
35 #include <ecoli_tk_str.h>
36 #include <ecoli_tk_seq.h>
37 #include <ecoli_tk_space.h>
38 #include <ecoli_tk_or.h>
40 static struct ec_tk *commands;
42 /* Set to a character describing the type of completion being attempted by
43 rl_complete_internal; available for use by application completion
45 extern int rl_completion_type;
46 /* Set to the last key used to invoke one of the completion functions */
47 extern int rl_completion_invoking_key;
49 int my_complete(int x, int y)
57 char *my_completion_entry(const char *s, int state)
59 static struct ec_completed_tk *c;
60 static const struct ec_completed_tk_elt *elt;
68 ec_completed_tk_free(c);
70 start = strdup(rl_line_buffer);
73 start[rl_point] = '\0';
75 c = ec_tk_complete(commands, start);
76 ec_completed_tk_iter_start(c);
79 elt = ec_completed_tk_iter_next(c);
83 return strdup(elt->full);
86 char **my_attempted_completion(const char *text, int start, int end)
90 // XXX when it returns NULL, it completes with a file
91 return rl_completion_matches(text, my_completion_entry);
96 struct ec_parsed_tk *p;
100 commands = ec_tk_seq_new_list(NULL,
101 ec_tk_str_new(NULL, "hello"),
102 ec_tk_space_new(NULL),
103 ec_tk_or_new_list("name",
104 ec_tk_str_new(NULL, "john"),
105 ec_tk_str_new(NULL, "mike"),
108 if (commands == NULL) {
109 printf("cannot create token\n");
113 //rl_bind_key('\t', my_complete);
115 //rl_completion_entry_function = my_completion_entry;
116 rl_attempted_completion_function = my_attempted_completion;
119 line = readline("> ");
123 // XXX need a "parse_all"
124 p = ec_tk_parse(commands, line);
125 ec_parsed_tk_dump(stdout, p);
127 ec_parsed_tk_free(p);
131 ec_tk_free(commands);