source: trunk/third/glib2/glib/gscanner.h @ 18159

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