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