option, shlex
[protos/libecoli.git] / lib / main-readline.c
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 #include <stdlib.h>
29 #include <stdio.h>
30 #include <assert.h>
31
32 #include <readline/readline.h>
33 #include <readline/history.h>
34
35 #include <ecoli_tk_str.h>
36 #include <ecoli_tk_seq.h>
37 #include <ecoli_tk_space.h>
38 #include <ecoli_tk_or.h>
39
40 static struct ec_tk *commands;
41
42 /* Set to a character describing the type of completion being attempted by
43    rl_complete_internal; available for use by application completion
44    functions. */
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;
48
49 int my_complete(int x, int y)
50 {
51         (void)x;
52         (void)y;
53
54         return 0;
55 }
56
57 char *my_completion_entry(const char *s, int state)
58 {
59         static struct ec_completed_tk *c;
60         static const struct ec_completed_tk_elt *elt;
61
62         (void)s;
63
64         if (state == 0) {
65                 char *start;
66
67                 if (c != NULL)
68                         ec_completed_tk_free(c);
69
70                 start = strdup(rl_line_buffer);
71                 if (start == NULL)
72                         return NULL;
73                 start[rl_point] = '\0';
74
75                 c = ec_tk_complete(commands, start);
76                 ec_completed_tk_iter_start(c);
77         }
78
79         elt = ec_completed_tk_iter_next(c);
80         if (elt == NULL)
81                 return NULL;
82
83         return strdup(elt->full);
84 }
85
86 char **my_attempted_completion(const char *text, int start, int end)
87 {
88         (void)start;
89         (void)end;
90         // XXX when it returns NULL, it completes with a file
91         return rl_completion_matches(text, my_completion_entry);
92 }
93
94 int main(void)
95 {
96         struct ec_parsed_tk *p;
97 //      const char *name;
98         char *line;
99
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"),
106                         EC_TK_ENDLIST),
107                 EC_TK_ENDLIST);
108         if (commands == NULL) {
109                 printf("cannot create token\n");
110                 return 1;
111         }
112
113         //rl_bind_key('\t', my_complete);
114
115         //rl_completion_entry_function = my_completion_entry;
116         rl_attempted_completion_function = my_attempted_completion;
117
118         while (1) {
119                 line = readline("> ");
120                 if (line == NULL)
121                         break;
122
123                 // XXX need a "parse_all"
124                 p = ec_tk_parse(commands, line);
125                 ec_parsed_tk_dump(stdout, p);
126                 add_history(line);
127                 ec_parsed_tk_free(p);
128         }
129
130
131         ec_tk_free(commands);
132         return 0;
133 }