d10c5cd8cc3f779be7279feeb40fb7cfc34feb6b
[metze/wireshark/wip.git] / extcap_parser.h
1 /* extcap_parser.h
2  *
3  * Wireshark - Network traffic analyzer
4  * By Gerald Combs <gerald@wireshark.org>
5  * Copyright 1998 Gerald Combs
6  *
7  * This program is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU General Public License
9  * as published by the Free Software Foundation; either version 2
10  * of the License, or (at your option) any later version.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program; if not, write to the Free Software
19  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
20  */
21
22 #ifndef __EXTCAP_PARSER_H__
23 #define __EXTCAP_PARSER_H__
24
25 #include <stdio.h>
26 #include <glib.h>
27 #include <string.h>
28
29 typedef enum {
30     EXTCAP_SENTENCE_UNKNOWN,
31     EXTCAP_SENTENCE_ARG,
32     EXTCAP_SENTENCE_VALUE,
33     EXTCAP_SENTENCE_EXTCAP,
34     EXTCAP_SENTENCE_INTERFACE,
35     EXTCAP_SENTENCE_DLT
36 } extcap_sentence_type;
37
38 typedef enum {
39     /* Simple types */
40     EXTCAP_ARG_UNKNOWN,
41     EXTCAP_ARG_INTEGER,
42     EXTCAP_ARG_UNSIGNED,
43     EXTCAP_ARG_LONG,
44     EXTCAP_ARG_DOUBLE,
45     EXTCAP_ARG_BOOLEAN,
46     EXTCAP_ARG_BOOLFLAG,
47     EXTCAP_ARG_STRING,
48     /* Complex GUI types which are populated with value sentences */
49     EXTCAP_ARG_SELECTOR,
50     EXTCAP_ARG_RADIO,
51     EXTCAP_ARG_MULTICHECK,
52     EXTCAP_ARG_FILESELECT
53 } extcap_arg_type;
54
55 typedef enum {
56     /* value types */
57     EXTCAP_PARAM_UNKNOWN,
58     EXTCAP_PARAM_ARGNUM,
59     EXTCAP_PARAM_CALL,
60     EXTCAP_PARAM_DISPLAY,
61     EXTCAP_PARAM_TYPE,
62     EXTCAP_PARAM_ARG,
63     EXTCAP_PARAM_DEFAULT,
64     EXTCAP_PARAM_VALUE,
65     EXTCAP_PARAM_RANGE,
66     EXTCAP_PARAM_TOOLTIP,
67     EXTCAP_PARAM_NAME,
68     EXTCAP_PARAM_ENABLED,
69     EXTCAP_PARAM_FILE_MUSTEXIST,
70     EXTCAP_PARAM_FILE_EXTENSION,
71     EXTCAP_PARAM_PARENT,
72     EXTCAP_PARAM_REQUIRED,
73     EXTCAP_PARAM_VALIDATION,
74     EXTCAP_PARAM_VERSION
75 } extcap_param_type;
76
77 /* Values for a given sentence; values are all stored as a call
78  * and a value string, or a valid range, so we only need to store
79  * those and repeat them */
80 typedef struct _extcap_value {
81     int arg_num;
82
83     gchar *call;
84     gchar *display;
85     gboolean enabled;
86     gboolean is_default;
87     gchar *parent;
88 } extcap_value;
89
90 /* Complex-ish struct for storing complex values */
91 typedef struct _extcap_complex {
92     extcap_arg_type complex_type;
93     union {
94         int int_value;
95         unsigned int uint_value;
96         long long_value;
97         double double_value;
98         gboolean bool_value;
99         gchar *string_value;
100     } complex_value;
101     gboolean value_filled;
102 } extcap_complex;
103
104 /* An argument sentence and accompanying options */
105 typedef struct _extcap_arg {
106     int arg_num;
107
108     gchar *call;
109     gchar *display;
110     gchar *tooltip;
111
112     gchar * fileextension;
113     gboolean fileexists;
114
115     gboolean is_required;
116
117     gchar * regexp;
118
119     extcap_arg_type arg_type;
120
121     extcap_complex *range_start;
122     extcap_complex *range_end;
123     extcap_complex *default_complex;
124
125     GList * values;
126 } extcap_arg;
127
128 typedef struct _extcap_if {
129     gchar * extcap_path;
130     GList * interfaces;
131 } extcap_if;
132
133 typedef struct _extcap_interface {
134     gchar *call;
135     gchar *display;
136     gchar *version;
137
138     extcap_sentence_type if_type;
139     struct _extcap_interface *next_interface;
140 } extcap_interface;
141
142 typedef struct _extcap_dlt {
143     gint number;
144     gchar *name;
145     gchar *display;
146
147     struct _extcap_dlt *next_dlt;
148 } extcap_dlt;
149
150 /* Parser internals */
151 typedef struct _extcap_token_param {
152     gchar *arg;
153     gchar *value;
154
155     extcap_param_type param_type;
156
157     struct _extcap_token_param *next_token;
158 } extcap_token_param;
159
160 typedef struct _extcap_token_sentence {
161     gchar *sentence;
162
163     extcap_token_param *param_list;
164
165     struct _extcap_token_sentence *next_sentence;
166 } extcap_token_sentence;
167
168 #ifdef __cplusplus
169 extern "C" {
170 #endif
171
172 extcap_interface *extcap_new_interface(void);
173 void extcap_free_interface(extcap_interface *interface);
174
175 extcap_dlt *extcap_new_dlt(void);
176 void extcap_free_dlt(extcap_dlt *dlt);
177
178 /* Parse a string into a complex type */
179 extcap_complex *extcap_parse_complex(extcap_arg_type complex_type,
180         const gchar *data);
181
182 /* Free a complex */
183 void extcap_free_complex(extcap_complex *comp);
184
185 /* Print a complex value out for debug */
186 void extcap_printf_complex(extcap_complex *comp);
187
188 /*
189  * Return a string representation of a complex type
190  * Caller is responsible for calling g_free on the returned string
191  */
192 gchar *extcap_get_complex_as_string(extcap_complex *comp);
193
194 int extcap_complex_get_int(extcap_complex *comp);
195 unsigned int extcap_complex_get_uint(extcap_complex *comp);
196 long extcap_complex_get_long(extcap_complex *comp);
197 double extcap_complex_get_double(extcap_complex *comp);
198 gboolean extcap_complex_get_bool(extcap_complex *comp);
199 gchar *extcap_complex_get_string(extcap_complex *comp);
200
201 /* compares the default value of an element with a given parameter */
202 gboolean extcap_compare_is_default(extcap_arg *element, extcap_complex *test);
203
204 void extcap_free_tokenized_param(extcap_token_param *v);
205 void extcap_free_tokenized_sentence(extcap_token_sentence *s);
206 void extcap_free_tokenized_sentence_list(extcap_token_sentence *f);
207
208 /* Turn a sentence into logical tokens, don't validate beyond basic syntax */
209 extcap_token_sentence *extcap_tokenize_sentence(const gchar *s);
210
211 /* Tokenize a set of sentences (such as the output of a g_spawn_sync) */
212 extcap_token_sentence *extcap_tokenize_sentences(const gchar *s);
213
214 /* Find an argument in the extcap_arg list which matches the given arg=X number */
215 extcap_arg *extcap_find_numbered_arg(extcap_arg *first, int number);
216
217 /* Find the first occurrence in a parameter list of a parameter of the given type */
218 extcap_token_param *extcap_find_param_by_type(extcap_token_param *first,
219         extcap_param_type t);
220
221 void extcap_free_value(extcap_value *v);
222
223 extcap_arg *extcap_new_arg(void);
224
225 /* Free a single argument */
226 void extcap_free_arg(extcap_arg *a);
227
228 /* Free an entire arg list */
229 void extcap_free_arg_list(GList *a);
230
231 /*
232  * Parse a tokenized sentence and validate.  If a new sentence is created, the result
233  * is returned in 'ra'.  On error, < 0 is returned.  Not all sentences will create a
234  * new returned sentence (VALUE sentences, for example)
235  */
236 extcap_arg * extcap_parse_arg_sentence(GList * args, extcap_token_sentence *s);
237
238 /* Parse all sentences for args and values */
239 GList * extcap_parse_args(extcap_token_sentence *first_s);
240
241 /*
242  * Parse a tokenized set of sentences and validate, looking for interface definitions.
243  */
244 int extcap_parse_interface_sentence(extcap_token_sentence *s,
245         extcap_interface **ri);
246
247 /* Parse all sentences for interfaces */
248 int extcap_parse_interfaces(extcap_token_sentence *first_s,
249         extcap_interface **first_int);
250
251 /* Parse a tokenized set of sentences and validate, looking for DLT definitions */
252 int extcap_parse_dlt_sentence(extcap_token_sentence *s, extcap_dlt **ri);
253
254 /* Parse all sentences for DLTs */
255 int extcap_parse_dlts(extcap_token_sentence *first_s, extcap_dlt **first_dlt);
256
257 #ifdef __cplusplus
258 }
259 #endif
260
261 #endif
262
263 /*
264  * Editor modelines  -  http://www.wireshark.org/tools/modelines.html
265  *
266  * Local variables:
267  * c-basic-offset: 4
268  * tab-width: 8
269  * indent-tabs-mode: nil
270  * End:
271  *
272  * vi: set shiftwidth=4 tabstop=8 expandtab:
273  * :indentSize=4:tabSize=8:noTabs=true:
274  */