williamr@2: /* GLIB - Library of useful routines for C programming williamr@2: * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald williamr@2: * Portions copyright (c) 2006 Nokia Corporation. All rights reserved. williamr@2: * williamr@2: * This library is free software; you can redistribute it and/or williamr@2: * modify it under the terms of the GNU Lesser General Public williamr@2: * License as published by the Free Software Foundation; either williamr@2: * version 2 of the License, or (at your option) any later version. williamr@2: * williamr@2: * This library is distributed in the hope that it will be useful, williamr@2: * but WITHOUT ANY WARRANTY; without even the implied warranty of williamr@2: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU williamr@2: * Lesser General Public License for more details. williamr@2: * williamr@2: * You should have received a copy of the GNU Lesser General Public williamr@2: * License along with this library; if not, write to the williamr@2: * Free Software Foundation, Inc., 59 Temple Place - Suite 330, williamr@2: * Boston, MA 02111-1307, USA. williamr@2: */ williamr@2: williamr@2: /* williamr@2: * Modified by the GLib Team and others 1997-2000. See the AUTHORS williamr@2: * file for a list of people on the GLib Team. See the ChangeLog williamr@2: * files for a list of changes. These files are distributed with williamr@2: * GLib at ftp://ftp.gtk.org/pub/gtk/. williamr@2: */ williamr@2: williamr@2: #ifndef __G_SCANNER_H__ williamr@2: #define __G_SCANNER_H__ williamr@2: williamr@2: #include <_ansi.h> williamr@2: #include williamr@2: #include williamr@2: williamr@2: G_BEGIN_DECLS williamr@2: williamr@2: typedef struct _GScanner GScanner; williamr@2: typedef struct _GScannerConfig GScannerConfig; williamr@2: typedef union _GTokenValue GTokenValue; williamr@2: williamr@2: typedef void (*GScannerMsgFunc) (GScanner *scanner, williamr@2: gchar *message, williamr@2: gboolean error); williamr@2: williamr@2: /* GScanner: Flexible lexical scanner for general purpose. williamr@2: */ williamr@2: williamr@2: /* Character sets */ williamr@2: #define G_CSET_A_2_Z "ABCDEFGHIJKLMNOPQRSTUVWXYZ" williamr@2: #define G_CSET_a_2_z "abcdefghijklmnopqrstuvwxyz" williamr@2: #define G_CSET_DIGITS "0123456789" williamr@2: #define G_CSET_LATINC "\300\301\302\303\304\305\306"\ williamr@2: "\307\310\311\312\313\314\315\316\317\320"\ williamr@2: "\321\322\323\324\325\326"\ williamr@2: "\330\331\332\333\334\335\336" williamr@2: #define G_CSET_LATINS "\337\340\341\342\343\344\345\346"\ williamr@2: "\347\350\351\352\353\354\355\356\357\360"\ williamr@2: "\361\362\363\364\365\366"\ williamr@2: "\370\371\372\373\374\375\376\377" williamr@2: williamr@2: /* Error types */ williamr@2: typedef enum williamr@2: { williamr@2: G_ERR_UNKNOWN, williamr@2: G_ERR_UNEXP_EOF, williamr@2: G_ERR_UNEXP_EOF_IN_STRING, williamr@2: G_ERR_UNEXP_EOF_IN_COMMENT, williamr@2: G_ERR_NON_DIGIT_IN_CONST, williamr@2: G_ERR_DIGIT_RADIX, williamr@2: G_ERR_FLOAT_RADIX, williamr@2: G_ERR_FLOAT_MALFORMED williamr@2: } GErrorType; williamr@2: williamr@2: /* Token types */ williamr@2: typedef enum williamr@2: { williamr@2: G_TOKEN_EOF = 0, williamr@2: williamr@2: G_TOKEN_LEFT_PAREN = '(', williamr@2: G_TOKEN_RIGHT_PAREN = ')', williamr@2: G_TOKEN_LEFT_CURLY = '{', williamr@2: G_TOKEN_RIGHT_CURLY = '}', williamr@2: G_TOKEN_LEFT_BRACE = '[', williamr@2: G_TOKEN_RIGHT_BRACE = ']', williamr@2: G_TOKEN_EQUAL_SIGN = '=', williamr@2: G_TOKEN_COMMA = ',', williamr@2: williamr@2: G_TOKEN_NONE = 256, williamr@2: williamr@2: G_TOKEN_ERROR, williamr@2: williamr@2: G_TOKEN_CHAR, williamr@2: G_TOKEN_BINARY, williamr@2: G_TOKEN_OCTAL, williamr@2: G_TOKEN_INT, williamr@2: G_TOKEN_HEX, williamr@2: G_TOKEN_FLOAT, williamr@2: G_TOKEN_STRING, williamr@2: williamr@2: G_TOKEN_SYMBOL, williamr@2: G_TOKEN_IDENTIFIER, williamr@2: G_TOKEN_IDENTIFIER_NULL, williamr@2: williamr@2: G_TOKEN_COMMENT_SINGLE, williamr@2: G_TOKEN_COMMENT_MULTI, williamr@2: G_TOKEN_LAST williamr@2: } GTokenType; williamr@2: williamr@2: union _GTokenValue williamr@2: { williamr@2: gpointer v_symbol; williamr@2: gchar *v_identifier; williamr@2: gulong v_binary; williamr@2: gulong v_octal; williamr@2: gulong v_int; williamr@2: guint64 v_int64; williamr@2: gdouble v_float; williamr@2: gulong v_hex; williamr@2: gchar *v_string; williamr@2: gchar *v_comment; williamr@2: guchar v_char; williamr@2: guint v_error; williamr@2: }; williamr@2: williamr@2: struct _GScannerConfig williamr@2: { williamr@2: /* Character sets williamr@2: */ williamr@2: gchar *cset_skip_characters; /* default: " \t\n" */ williamr@2: gchar *cset_identifier_first; williamr@2: gchar *cset_identifier_nth; williamr@2: gchar *cpair_comment_single; /* default: "#\n" */ williamr@2: williamr@2: /* Should symbol lookup work case sensitive? williamr@2: */ williamr@2: guint case_sensitive : 1; williamr@2: williamr@2: /* Boolean values to be adjusted "on the fly" williamr@2: * to configure scanning behaviour. williamr@2: */ williamr@2: guint skip_comment_multi : 1; /* C like comment */ williamr@2: guint skip_comment_single : 1; /* single line comment */ williamr@2: guint scan_comment_multi : 1; /* scan multi line comments? */ williamr@2: guint scan_identifier : 1; williamr@2: guint scan_identifier_1char : 1; williamr@2: guint scan_identifier_NULL : 1; williamr@2: guint scan_symbols : 1; williamr@2: guint scan_binary : 1; williamr@2: guint scan_octal : 1; williamr@2: guint scan_float : 1; williamr@2: guint scan_hex : 1; /* `0x0ff0' */ williamr@2: guint scan_hex_dollar : 1; /* `$0ff0' */ williamr@2: guint scan_string_sq : 1; /* string: 'anything' */ williamr@2: guint scan_string_dq : 1; /* string: "\\-escapes!\n" */ williamr@2: guint numbers_2_int : 1; /* bin, octal, hex => int */ williamr@2: guint int_2_float : 1; /* int => G_TOKEN_FLOAT? */ williamr@2: guint identifier_2_string : 1; williamr@2: guint char_2_token : 1; /* return G_TOKEN_CHAR? */ williamr@2: guint symbol_2_token : 1; williamr@2: guint scope_0_fallback : 1; /* try scope 0 on lookups? */ williamr@2: guint store_int64 : 1; /* use value.v_int64 rather than v_int */ williamr@2: guint padding_dummy; williamr@2: }; williamr@2: williamr@2: struct _GScanner williamr@2: { williamr@2: /* unused fields */ williamr@2: gpointer user_data; williamr@2: guint max_parse_errors; williamr@2: williamr@2: /* g_scanner_error() increments this field */ williamr@2: guint parse_errors; williamr@2: williamr@2: /* name of input stream, featured by the default message handler */ williamr@2: const gchar *input_name; williamr@2: williamr@2: /* quarked data */ williamr@2: GData *qdata; williamr@2: williamr@2: /* link into the scanner configuration */ williamr@2: GScannerConfig *config; williamr@2: williamr@2: /* fields filled in after g_scanner_get_next_token() */ williamr@2: GTokenType token; williamr@2: GTokenValue value; williamr@2: guint line; williamr@2: guint position; williamr@2: williamr@2: /* fields filled in after g_scanner_peek_next_token() */ williamr@2: GTokenType next_token; williamr@2: GTokenValue next_value; williamr@2: guint next_line; williamr@2: guint next_position; williamr@2: williamr@2: /* to be considered private */ williamr@2: GHashTable *symbol_table; williamr@2: gint input_fd; williamr@2: const gchar *text; williamr@2: const gchar *text_end; williamr@2: gchar *buffer; williamr@2: guint scope_id; williamr@2: williamr@2: /* handler function for _warn and _error */ williamr@2: GScannerMsgFunc msg_handler; williamr@2: }; williamr@2: williamr@2: IMPORT_C GScanner* g_scanner_new (const GScannerConfig *config_templ); williamr@2: IMPORT_C void g_scanner_destroy (GScanner *scanner); williamr@2: IMPORT_C void g_scanner_input_file (GScanner *scanner, williamr@2: gint input_fd); williamr@2: IMPORT_C void g_scanner_sync_file_offset (GScanner *scanner); williamr@2: IMPORT_C void g_scanner_input_text (GScanner *scanner, williamr@2: const gchar *text, williamr@2: guint text_len); williamr@2: IMPORT_C GTokenType g_scanner_get_next_token (GScanner *scanner); williamr@2: IMPORT_C GTokenType g_scanner_peek_next_token (GScanner *scanner); williamr@2: IMPORT_C GTokenType g_scanner_cur_token (GScanner *scanner); williamr@2: IMPORT_C GTokenValue g_scanner_cur_value (GScanner *scanner); williamr@2: IMPORT_C guint g_scanner_cur_line (GScanner *scanner); williamr@2: IMPORT_C guint g_scanner_cur_position (GScanner *scanner); williamr@2: IMPORT_C gboolean g_scanner_eof (GScanner *scanner); williamr@2: IMPORT_C guint g_scanner_set_scope (GScanner *scanner, williamr@2: guint scope_id); williamr@2: IMPORT_C void g_scanner_scope_add_symbol (GScanner *scanner, williamr@2: guint scope_id, williamr@2: const gchar *symbol, williamr@2: gpointer value); williamr@2: IMPORT_C void g_scanner_scope_remove_symbol (GScanner *scanner, williamr@2: guint scope_id, williamr@2: const gchar *symbol); williamr@2: IMPORT_C gpointer g_scanner_scope_lookup_symbol (GScanner *scanner, williamr@2: guint scope_id, williamr@2: const gchar *symbol); williamr@2: IMPORT_C void g_scanner_scope_foreach_symbol (GScanner *scanner, williamr@2: guint scope_id, williamr@2: GHFunc func, williamr@2: gpointer user_data); williamr@2: IMPORT_C gpointer g_scanner_lookup_symbol (GScanner *scanner, williamr@2: const gchar *symbol); williamr@2: IMPORT_C void g_scanner_unexp_token (GScanner *scanner, williamr@2: GTokenType expected_token, williamr@2: const gchar *identifier_spec, williamr@2: const gchar *symbol_spec, williamr@2: const gchar *symbol_name, williamr@2: const gchar *message, williamr@2: gint is_error); williamr@2: IMPORT_C void g_scanner_error (GScanner *scanner, williamr@2: const gchar *format, williamr@2: ...) G_GNUC_PRINTF (2,3); williamr@2: IMPORT_C void g_scanner_warn (GScanner *scanner, williamr@2: const gchar *format, williamr@2: ...) G_GNUC_PRINTF (2,3); williamr@2: williamr@2: #ifndef G_DISABLE_DEPRECATED williamr@2: williamr@2: /* keep downward source compatibility */ williamr@2: #define g_scanner_add_symbol( scanner, symbol, value ) G_STMT_START { \ williamr@2: g_scanner_scope_add_symbol ((scanner), 0, (symbol), (value)); \ williamr@2: } G_STMT_END williamr@2: #define g_scanner_remove_symbol( scanner, symbol ) G_STMT_START { \ williamr@2: g_scanner_scope_remove_symbol ((scanner), 0, (symbol)); \ williamr@2: } G_STMT_END williamr@2: #define g_scanner_foreach_symbol( scanner, func, data ) G_STMT_START { \ williamr@2: g_scanner_scope_foreach_symbol ((scanner), 0, (func), (data)); \ williamr@2: } G_STMT_END williamr@2: williamr@2: /* The following two functions are deprecated and will be removed in williamr@2: * the next major release. They do no good. */ williamr@2: #define g_scanner_freeze_symbol_table(scanner) ((void)0) williamr@2: #define g_scanner_thaw_symbol_table(scanner) ((void)0) williamr@2: williamr@2: #endif /* G_DISABLE_DEPRECATED */ williamr@2: williamr@2: G_END_DECLS williamr@2: williamr@2: #endif /* __G_SCANNER_H__ */ williamr@2: