debug malloc to track mem leaks
[protos/libecoli.git] / lib / ecoli_tk.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 #ifndef ECOLI_TK_
29 #define ECOLI_TK_
30
31 #include <sys/queue.h>
32 #include <sys/types.h>
33
34 #define EC_TK_ENDLIST ((void *)1)
35
36 struct ec_tk;
37 struct ec_parsed_tk;
38
39 typedef struct ec_parsed_tk *(*ec_tk_parse_t)(const struct ec_tk *tk,
40         const char *str);
41 typedef struct ec_completed_tk *(*ec_tk_complete_t)(const struct ec_tk *tk,
42         const char *str);
43 typedef void (*ec_tk_free_priv_t)(struct ec_tk *);
44
45 struct ec_tk_ops {
46         ec_tk_parse_t parse;
47         ec_tk_complete_t complete;
48         ec_tk_free_priv_t free_priv;
49 };
50
51 struct ec_tk {
52         const struct ec_tk_ops *ops;
53         char *id;
54 };
55
56 struct ec_tk *ec_tk_new(const char *id, const struct ec_tk_ops *ops,
57         size_t priv_size);
58 void ec_tk_free(struct ec_tk *tk);
59
60
61 TAILQ_HEAD(ec_parsed_tk_list, ec_parsed_tk);
62
63 struct ec_parsed_tk {
64         struct ec_parsed_tk_list children;
65         TAILQ_ENTRY(ec_parsed_tk) next;
66         const struct ec_tk *tk;
67         char *str;
68 };
69
70 struct ec_parsed_tk *ec_parsed_tk_new(const struct ec_tk *tk);
71 struct ec_parsed_tk *ec_tk_parse(const struct ec_tk *token, const char *str);
72 void ec_parsed_tk_add_child(struct ec_parsed_tk *parsed_tk,
73         struct ec_parsed_tk *child);
74 void ec_parsed_tk_dump(const struct ec_parsed_tk *parsed_tk);
75 void ec_parsed_tk_free(struct ec_parsed_tk *parsed_tk);
76
77 struct ec_parsed_tk *ec_parsed_tk_find_first(struct ec_parsed_tk *parsed_tk,
78         const char *id);
79
80 const char *ec_parsed_tk_to_string(const struct ec_parsed_tk *parsed_tk);
81
82 struct ec_completed_tk_elt {
83         TAILQ_ENTRY(ec_completed_tk_elt) next;
84         const struct ec_tk *tk;
85         char *add;
86         char *full;
87 };
88
89 TAILQ_HEAD(ec_completed_tk_elt_list, ec_completed_tk_elt);
90
91
92 struct ec_completed_tk {
93         struct ec_completed_tk_elt_list elts;
94         unsigned count;
95         char *smallest_start;
96 };
97
98 /*
99  * return NULL if it does not match the beginning of the token
100  * return "" if it matches but does not know how to complete
101  * return "xyz" if it knows how to complete
102  */
103 struct ec_completed_tk *ec_tk_complete(const struct ec_tk *token,
104         const char *str);
105 struct ec_completed_tk *ec_completed_tk_new(void);
106 struct ec_completed_tk_elt *ec_completed_tk_elt_new(const struct ec_tk *tk,
107         const char *add, const char *full);
108 void ec_completed_tk_add_elt(
109         struct ec_completed_tk *completed_tk, struct ec_completed_tk_elt *elt);
110 void ec_completed_tk_elt_free(struct ec_completed_tk_elt *elt);
111 struct ec_completed_tk *ec_completed_tk_merge(
112         struct ec_completed_tk *completed_tk1,
113         struct ec_completed_tk *completed_tk2);
114 void ec_completed_tk_free(struct ec_completed_tk *completed_tk);
115 void ec_completed_tk_dump(const struct ec_completed_tk *completed_tk);
116
117 const char *ec_completed_tk_smallest_start(
118         const struct ec_completed_tk *completed_tk);
119
120 unsigned int ec_completed_tk_count(const struct ec_completed_tk *completed_tk);
121
122 #endif