williamr@2
|
1 |
/* GLIB - Library of useful routines for C programming
|
williamr@2
|
2 |
* Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
|
williamr@2
|
3 |
* Portions copyright (c) 2006 Nokia Corporation. All rights reserved.
|
williamr@2
|
4 |
*
|
williamr@2
|
5 |
* This library is free software; you can redistribute it and/or
|
williamr@2
|
6 |
* modify it under the terms of the GNU Lesser General Public
|
williamr@2
|
7 |
* License as published by the Free Software Foundation; either
|
williamr@2
|
8 |
* version 2 of the License, or (at your option) any later version.
|
williamr@2
|
9 |
*
|
williamr@2
|
10 |
* This library is distributed in the hope that it will be useful,
|
williamr@2
|
11 |
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
williamr@2
|
12 |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
williamr@2
|
13 |
* Lesser General Public License for more details.
|
williamr@2
|
14 |
*
|
williamr@2
|
15 |
* You should have received a copy of the GNU Lesser General Public
|
williamr@2
|
16 |
* License along with this library; if not, write to the
|
williamr@2
|
17 |
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
williamr@2
|
18 |
* Boston, MA 02111-1307, USA.
|
williamr@2
|
19 |
*/
|
williamr@2
|
20 |
|
williamr@2
|
21 |
/*
|
williamr@2
|
22 |
* Modified by the GLib Team and others 1997-2000. See the AUTHORS
|
williamr@2
|
23 |
* file for a list of people on the GLib Team. See the ChangeLog
|
williamr@2
|
24 |
* files for a list of changes. These files are distributed with
|
williamr@2
|
25 |
* GLib at ftp://ftp.gtk.org/pub/gtk/.
|
williamr@2
|
26 |
*/
|
williamr@2
|
27 |
|
williamr@2
|
28 |
#ifndef __G_SCANNER_H__
|
williamr@2
|
29 |
#define __G_SCANNER_H__
|
williamr@2
|
30 |
|
williamr@2
|
31 |
#include <_ansi.h>
|
williamr@2
|
32 |
#include <glib/gdataset.h>
|
williamr@2
|
33 |
#include <glib/ghash.h>
|
williamr@2
|
34 |
|
williamr@2
|
35 |
G_BEGIN_DECLS
|
williamr@2
|
36 |
|
williamr@2
|
37 |
typedef struct _GScanner GScanner;
|
williamr@2
|
38 |
typedef struct _GScannerConfig GScannerConfig;
|
williamr@2
|
39 |
typedef union _GTokenValue GTokenValue;
|
williamr@2
|
40 |
|
williamr@2
|
41 |
typedef void (*GScannerMsgFunc) (GScanner *scanner,
|
williamr@2
|
42 |
gchar *message,
|
williamr@2
|
43 |
gboolean error);
|
williamr@2
|
44 |
|
williamr@2
|
45 |
/* GScanner: Flexible lexical scanner for general purpose.
|
williamr@2
|
46 |
*/
|
williamr@2
|
47 |
|
williamr@2
|
48 |
/* Character sets */
|
williamr@2
|
49 |
#define G_CSET_A_2_Z "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
|
williamr@2
|
50 |
#define G_CSET_a_2_z "abcdefghijklmnopqrstuvwxyz"
|
williamr@2
|
51 |
#define G_CSET_DIGITS "0123456789"
|
williamr@2
|
52 |
#define G_CSET_LATINC "\300\301\302\303\304\305\306"\
|
williamr@2
|
53 |
"\307\310\311\312\313\314\315\316\317\320"\
|
williamr@2
|
54 |
"\321\322\323\324\325\326"\
|
williamr@2
|
55 |
"\330\331\332\333\334\335\336"
|
williamr@2
|
56 |
#define G_CSET_LATINS "\337\340\341\342\343\344\345\346"\
|
williamr@2
|
57 |
"\347\350\351\352\353\354\355\356\357\360"\
|
williamr@2
|
58 |
"\361\362\363\364\365\366"\
|
williamr@2
|
59 |
"\370\371\372\373\374\375\376\377"
|
williamr@2
|
60 |
|
williamr@2
|
61 |
/* Error types */
|
williamr@2
|
62 |
typedef enum
|
williamr@2
|
63 |
{
|
williamr@2
|
64 |
G_ERR_UNKNOWN,
|
williamr@2
|
65 |
G_ERR_UNEXP_EOF,
|
williamr@2
|
66 |
G_ERR_UNEXP_EOF_IN_STRING,
|
williamr@2
|
67 |
G_ERR_UNEXP_EOF_IN_COMMENT,
|
williamr@2
|
68 |
G_ERR_NON_DIGIT_IN_CONST,
|
williamr@2
|
69 |
G_ERR_DIGIT_RADIX,
|
williamr@2
|
70 |
G_ERR_FLOAT_RADIX,
|
williamr@2
|
71 |
G_ERR_FLOAT_MALFORMED
|
williamr@2
|
72 |
} GErrorType;
|
williamr@2
|
73 |
|
williamr@2
|
74 |
/* Token types */
|
williamr@2
|
75 |
typedef enum
|
williamr@2
|
76 |
{
|
williamr@2
|
77 |
G_TOKEN_EOF = 0,
|
williamr@2
|
78 |
|
williamr@2
|
79 |
G_TOKEN_LEFT_PAREN = '(',
|
williamr@2
|
80 |
G_TOKEN_RIGHT_PAREN = ')',
|
williamr@2
|
81 |
G_TOKEN_LEFT_CURLY = '{',
|
williamr@2
|
82 |
G_TOKEN_RIGHT_CURLY = '}',
|
williamr@2
|
83 |
G_TOKEN_LEFT_BRACE = '[',
|
williamr@2
|
84 |
G_TOKEN_RIGHT_BRACE = ']',
|
williamr@2
|
85 |
G_TOKEN_EQUAL_SIGN = '=',
|
williamr@2
|
86 |
G_TOKEN_COMMA = ',',
|
williamr@2
|
87 |
|
williamr@2
|
88 |
G_TOKEN_NONE = 256,
|
williamr@2
|
89 |
|
williamr@2
|
90 |
G_TOKEN_ERROR,
|
williamr@2
|
91 |
|
williamr@2
|
92 |
G_TOKEN_CHAR,
|
williamr@2
|
93 |
G_TOKEN_BINARY,
|
williamr@2
|
94 |
G_TOKEN_OCTAL,
|
williamr@2
|
95 |
G_TOKEN_INT,
|
williamr@2
|
96 |
G_TOKEN_HEX,
|
williamr@2
|
97 |
G_TOKEN_FLOAT,
|
williamr@2
|
98 |
G_TOKEN_STRING,
|
williamr@2
|
99 |
|
williamr@2
|
100 |
G_TOKEN_SYMBOL,
|
williamr@2
|
101 |
G_TOKEN_IDENTIFIER,
|
williamr@2
|
102 |
G_TOKEN_IDENTIFIER_NULL,
|
williamr@2
|
103 |
|
williamr@2
|
104 |
G_TOKEN_COMMENT_SINGLE,
|
williamr@2
|
105 |
G_TOKEN_COMMENT_MULTI,
|
williamr@2
|
106 |
G_TOKEN_LAST
|
williamr@2
|
107 |
} GTokenType;
|
williamr@2
|
108 |
|
williamr@2
|
109 |
union _GTokenValue
|
williamr@2
|
110 |
{
|
williamr@2
|
111 |
gpointer v_symbol;
|
williamr@2
|
112 |
gchar *v_identifier;
|
williamr@2
|
113 |
gulong v_binary;
|
williamr@2
|
114 |
gulong v_octal;
|
williamr@2
|
115 |
gulong v_int;
|
williamr@2
|
116 |
guint64 v_int64;
|
williamr@2
|
117 |
gdouble v_float;
|
williamr@2
|
118 |
gulong v_hex;
|
williamr@2
|
119 |
gchar *v_string;
|
williamr@2
|
120 |
gchar *v_comment;
|
williamr@2
|
121 |
guchar v_char;
|
williamr@2
|
122 |
guint v_error;
|
williamr@2
|
123 |
};
|
williamr@2
|
124 |
|
williamr@2
|
125 |
struct _GScannerConfig
|
williamr@2
|
126 |
{
|
williamr@2
|
127 |
/* Character sets
|
williamr@2
|
128 |
*/
|
williamr@2
|
129 |
gchar *cset_skip_characters; /* default: " \t\n" */
|
williamr@2
|
130 |
gchar *cset_identifier_first;
|
williamr@2
|
131 |
gchar *cset_identifier_nth;
|
williamr@2
|
132 |
gchar *cpair_comment_single; /* default: "#\n" */
|
williamr@2
|
133 |
|
williamr@2
|
134 |
/* Should symbol lookup work case sensitive?
|
williamr@2
|
135 |
*/
|
williamr@2
|
136 |
guint case_sensitive : 1;
|
williamr@2
|
137 |
|
williamr@2
|
138 |
/* Boolean values to be adjusted "on the fly"
|
williamr@2
|
139 |
* to configure scanning behaviour.
|
williamr@2
|
140 |
*/
|
williamr@2
|
141 |
guint skip_comment_multi : 1; /* C like comment */
|
williamr@2
|
142 |
guint skip_comment_single : 1; /* single line comment */
|
williamr@2
|
143 |
guint scan_comment_multi : 1; /* scan multi line comments? */
|
williamr@2
|
144 |
guint scan_identifier : 1;
|
williamr@2
|
145 |
guint scan_identifier_1char : 1;
|
williamr@2
|
146 |
guint scan_identifier_NULL : 1;
|
williamr@2
|
147 |
guint scan_symbols : 1;
|
williamr@2
|
148 |
guint scan_binary : 1;
|
williamr@2
|
149 |
guint scan_octal : 1;
|
williamr@2
|
150 |
guint scan_float : 1;
|
williamr@2
|
151 |
guint scan_hex : 1; /* `0x0ff0' */
|
williamr@2
|
152 |
guint scan_hex_dollar : 1; /* `$0ff0' */
|
williamr@2
|
153 |
guint scan_string_sq : 1; /* string: 'anything' */
|
williamr@2
|
154 |
guint scan_string_dq : 1; /* string: "\\-escapes!\n" */
|
williamr@2
|
155 |
guint numbers_2_int : 1; /* bin, octal, hex => int */
|
williamr@2
|
156 |
guint int_2_float : 1; /* int => G_TOKEN_FLOAT? */
|
williamr@2
|
157 |
guint identifier_2_string : 1;
|
williamr@2
|
158 |
guint char_2_token : 1; /* return G_TOKEN_CHAR? */
|
williamr@2
|
159 |
guint symbol_2_token : 1;
|
williamr@2
|
160 |
guint scope_0_fallback : 1; /* try scope 0 on lookups? */
|
williamr@2
|
161 |
guint store_int64 : 1; /* use value.v_int64 rather than v_int */
|
williamr@2
|
162 |
guint padding_dummy;
|
williamr@2
|
163 |
};
|
williamr@2
|
164 |
|
williamr@2
|
165 |
struct _GScanner
|
williamr@2
|
166 |
{
|
williamr@2
|
167 |
/* unused fields */
|
williamr@2
|
168 |
gpointer user_data;
|
williamr@2
|
169 |
guint max_parse_errors;
|
williamr@2
|
170 |
|
williamr@2
|
171 |
/* g_scanner_error() increments this field */
|
williamr@2
|
172 |
guint parse_errors;
|
williamr@2
|
173 |
|
williamr@2
|
174 |
/* name of input stream, featured by the default message handler */
|
williamr@2
|
175 |
const gchar *input_name;
|
williamr@2
|
176 |
|
williamr@2
|
177 |
/* quarked data */
|
williamr@2
|
178 |
GData *qdata;
|
williamr@2
|
179 |
|
williamr@2
|
180 |
/* link into the scanner configuration */
|
williamr@2
|
181 |
GScannerConfig *config;
|
williamr@2
|
182 |
|
williamr@2
|
183 |
/* fields filled in after g_scanner_get_next_token() */
|
williamr@2
|
184 |
GTokenType token;
|
williamr@2
|
185 |
GTokenValue value;
|
williamr@2
|
186 |
guint line;
|
williamr@2
|
187 |
guint position;
|
williamr@2
|
188 |
|
williamr@2
|
189 |
/* fields filled in after g_scanner_peek_next_token() */
|
williamr@2
|
190 |
GTokenType next_token;
|
williamr@2
|
191 |
GTokenValue next_value;
|
williamr@2
|
192 |
guint next_line;
|
williamr@2
|
193 |
guint next_position;
|
williamr@2
|
194 |
|
williamr@2
|
195 |
/* to be considered private */
|
williamr@2
|
196 |
GHashTable *symbol_table;
|
williamr@2
|
197 |
gint input_fd;
|
williamr@2
|
198 |
const gchar *text;
|
williamr@2
|
199 |
const gchar *text_end;
|
williamr@2
|
200 |
gchar *buffer;
|
williamr@2
|
201 |
guint scope_id;
|
williamr@2
|
202 |
|
williamr@2
|
203 |
/* handler function for _warn and _error */
|
williamr@2
|
204 |
GScannerMsgFunc msg_handler;
|
williamr@2
|
205 |
};
|
williamr@2
|
206 |
|
williamr@2
|
207 |
IMPORT_C GScanner* g_scanner_new (const GScannerConfig *config_templ);
|
williamr@2
|
208 |
IMPORT_C void g_scanner_destroy (GScanner *scanner);
|
williamr@2
|
209 |
IMPORT_C void g_scanner_input_file (GScanner *scanner,
|
williamr@2
|
210 |
gint input_fd);
|
williamr@2
|
211 |
IMPORT_C void g_scanner_sync_file_offset (GScanner *scanner);
|
williamr@2
|
212 |
IMPORT_C void g_scanner_input_text (GScanner *scanner,
|
williamr@2
|
213 |
const gchar *text,
|
williamr@2
|
214 |
guint text_len);
|
williamr@2
|
215 |
IMPORT_C GTokenType g_scanner_get_next_token (GScanner *scanner);
|
williamr@2
|
216 |
IMPORT_C GTokenType g_scanner_peek_next_token (GScanner *scanner);
|
williamr@2
|
217 |
IMPORT_C GTokenType g_scanner_cur_token (GScanner *scanner);
|
williamr@2
|
218 |
IMPORT_C GTokenValue g_scanner_cur_value (GScanner *scanner);
|
williamr@2
|
219 |
IMPORT_C guint g_scanner_cur_line (GScanner *scanner);
|
williamr@2
|
220 |
IMPORT_C guint g_scanner_cur_position (GScanner *scanner);
|
williamr@2
|
221 |
IMPORT_C gboolean g_scanner_eof (GScanner *scanner);
|
williamr@2
|
222 |
IMPORT_C guint g_scanner_set_scope (GScanner *scanner,
|
williamr@2
|
223 |
guint scope_id);
|
williamr@2
|
224 |
IMPORT_C void g_scanner_scope_add_symbol (GScanner *scanner,
|
williamr@2
|
225 |
guint scope_id,
|
williamr@2
|
226 |
const gchar *symbol,
|
williamr@2
|
227 |
gpointer value);
|
williamr@2
|
228 |
IMPORT_C void g_scanner_scope_remove_symbol (GScanner *scanner,
|
williamr@2
|
229 |
guint scope_id,
|
williamr@2
|
230 |
const gchar *symbol);
|
williamr@2
|
231 |
IMPORT_C gpointer g_scanner_scope_lookup_symbol (GScanner *scanner,
|
williamr@2
|
232 |
guint scope_id,
|
williamr@2
|
233 |
const gchar *symbol);
|
williamr@2
|
234 |
IMPORT_C void g_scanner_scope_foreach_symbol (GScanner *scanner,
|
williamr@2
|
235 |
guint scope_id,
|
williamr@2
|
236 |
GHFunc func,
|
williamr@2
|
237 |
gpointer user_data);
|
williamr@2
|
238 |
IMPORT_C gpointer g_scanner_lookup_symbol (GScanner *scanner,
|
williamr@2
|
239 |
const gchar *symbol);
|
williamr@2
|
240 |
IMPORT_C void g_scanner_unexp_token (GScanner *scanner,
|
williamr@2
|
241 |
GTokenType expected_token,
|
williamr@2
|
242 |
const gchar *identifier_spec,
|
williamr@2
|
243 |
const gchar *symbol_spec,
|
williamr@2
|
244 |
const gchar *symbol_name,
|
williamr@2
|
245 |
const gchar *message,
|
williamr@2
|
246 |
gint is_error);
|
williamr@2
|
247 |
IMPORT_C void g_scanner_error (GScanner *scanner,
|
williamr@2
|
248 |
const gchar *format,
|
williamr@2
|
249 |
...) G_GNUC_PRINTF (2,3);
|
williamr@2
|
250 |
IMPORT_C void g_scanner_warn (GScanner *scanner,
|
williamr@2
|
251 |
const gchar *format,
|
williamr@2
|
252 |
...) G_GNUC_PRINTF (2,3);
|
williamr@2
|
253 |
|
williamr@2
|
254 |
#ifndef G_DISABLE_DEPRECATED
|
williamr@2
|
255 |
|
williamr@2
|
256 |
/* keep downward source compatibility */
|
williamr@2
|
257 |
#define g_scanner_add_symbol( scanner, symbol, value ) G_STMT_START { \
|
williamr@2
|
258 |
g_scanner_scope_add_symbol ((scanner), 0, (symbol), (value)); \
|
williamr@2
|
259 |
} G_STMT_END
|
williamr@2
|
260 |
#define g_scanner_remove_symbol( scanner, symbol ) G_STMT_START { \
|
williamr@2
|
261 |
g_scanner_scope_remove_symbol ((scanner), 0, (symbol)); \
|
williamr@2
|
262 |
} G_STMT_END
|
williamr@2
|
263 |
#define g_scanner_foreach_symbol( scanner, func, data ) G_STMT_START { \
|
williamr@2
|
264 |
g_scanner_scope_foreach_symbol ((scanner), 0, (func), (data)); \
|
williamr@2
|
265 |
} G_STMT_END
|
williamr@2
|
266 |
|
williamr@2
|
267 |
/* The following two functions are deprecated and will be removed in
|
williamr@2
|
268 |
* the next major release. They do no good. */
|
williamr@2
|
269 |
#define g_scanner_freeze_symbol_table(scanner) ((void)0)
|
williamr@2
|
270 |
#define g_scanner_thaw_symbol_table(scanner) ((void)0)
|
williamr@2
|
271 |
|
williamr@2
|
272 |
#endif /* G_DISABLE_DEPRECATED */
|
williamr@2
|
273 |
|
williamr@2
|
274 |
G_END_DECLS
|
williamr@2
|
275 |
|
williamr@2
|
276 |
#endif /* __G_SCANNER_H__ */
|
williamr@2
|
277 |
|