X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=gscanner.c;h=cbc2e1e41167925a7836105640743e63e4a30ddf;hb=84114c5321e4d7e4701f77f7f0e2b9b739d4035c;hp=cb4bf5927afd01a929fee05ceb4958419091df32;hpb=b813e192c6aac15a7884b398617c208fe6d548de;p=platform%2Fupstream%2Fglib.git diff --git a/gscanner.c b/gscanner.c index cb4bf59..cbc2e1e 100644 --- a/gscanner.c +++ b/gscanner.c @@ -19,19 +19,38 @@ * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ + +/* + * Modified by the GLib Team and others 1997-1999. 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/. + */ + +/* + * MT safe + */ + #define __gscanner_c__ +#ifdef HAVE_CONFIG_H +#include +#endif + #include #include #include #include +#include "glib.h" +#ifdef HAVE_UNISTD_H #include +#endif #include #include /* needed for sys/stat.h */ #include -#include "glib.h" - - +#ifdef G_OS_WIN32 +#include /* For _read() */ +#endif /* --- defines --- */ #define to_lower(c) ( \ @@ -42,6 +61,7 @@ ((guchar)(c)) \ ) \ ) +#define READ_BUFFER_SIZE (4000) /* --- typedefs --- */ @@ -57,10 +77,10 @@ struct _GScannerKey /* --- variables --- */ -static GScannerConfig g_scanner_config_template = +static GScannerConfig g_scanner_config_template = { ( - " \t\n" + " \t\r\n" ) /* cset_skip_characters */, ( G_CSET_a_2_z @@ -69,8 +89,9 @@ static GScannerConfig g_scanner_config_template = ) /* cset_identifier_first */, ( G_CSET_a_2_z - "_0123456789" + "_" G_CSET_A_2_Z + G_CSET_DIGITS G_CSET_LATINS G_CSET_LATINC ) /* cset_identifier_nth */, @@ -102,10 +123,6 @@ static GScannerConfig g_scanner_config_template = /* --- prototypes --- */ -extern char* g_vsprintf (gchar *fmt, va_list *args, va_list *args2); -static inline -gint g_scanner_char_2_num (guchar c, - guchar base); static inline GScannerKey* g_scanner_lookup_internal (GScanner *scanner, guint scope_id, @@ -115,16 +132,14 @@ static gint g_scanner_key_equal (gconstpointer v1, static guint g_scanner_key_hash (gconstpointer v); static void g_scanner_get_token_ll (GScanner *scanner, GTokenType *token_p, - GValue *value_p, + GTokenValue *value_p, guint *line_p, guint *position_p); static void g_scanner_get_token_i (GScanner *scanner, GTokenType *token_p, - GValue *value_p, + GTokenValue *value_p, guint *line_p, guint *position_p); -static void g_scanner_free_value (GTokenType *token_p, - GValue *value_p); static guchar g_scanner_peek_next_char (GScanner *scanner); static guchar g_scanner_get_char (GScanner *scanner, @@ -136,7 +151,7 @@ static void g_scanner_msg_handler (GScanner *scanner, /* --- functions --- */ -static gint +static inline gint g_scanner_char_2_num (guchar c, guchar base) { @@ -158,7 +173,7 @@ g_scanner_char_2_num (guchar c, GScanner* g_scanner_new (GScannerConfig *config_templ) { - register GScanner *scanner; + GScanner *scanner; if (!config_templ) config_templ = &g_scanner_config_template; @@ -175,6 +190,8 @@ g_scanner_new (GScannerConfig *config_templ) scanner->config->case_sensitive = config_templ->case_sensitive; scanner->config->cset_skip_characters = config_templ->cset_skip_characters; + if (!scanner->config->cset_skip_characters) + scanner->config->cset_skip_characters = ""; scanner->config->cset_identifier_first= config_templ->cset_identifier_first; scanner->config->cset_identifier_nth = config_templ->cset_identifier_nth; scanner->config->cpair_comment_single = config_templ->cpair_comment_single; @@ -208,26 +225,47 @@ g_scanner_new (GScannerConfig *config_templ) scanner->next_value.v_int = 0; scanner->next_line = 1; scanner->next_position = 0; - + scanner->symbol_table = g_hash_table_new (g_scanner_key_hash, g_scanner_key_equal); - scanner->text = NULL; - scanner->text_len = 0; scanner->input_fd = -1; - scanner->peeked_char = -1; + scanner->text = NULL; + scanner->text_end = NULL; + scanner->buffer = NULL; scanner->scope_id = 0; - + scanner->msg_handler = g_scanner_msg_handler; return scanner; } +static inline void +g_scanner_free_value (GTokenType *token_p, + GTokenValue *value_p) +{ + switch (*token_p) + { + case G_TOKEN_STRING: + case G_TOKEN_IDENTIFIER: + case G_TOKEN_IDENTIFIER_NULL: + case G_TOKEN_COMMENT_SINGLE: + case G_TOKEN_COMMENT_MULTI: + g_free (value_p->v_string); + break; + + default: + break; + } + + *token_p = G_TOKEN_NONE; +} + static void g_scanner_destroy_symbol_table_entry (gpointer _key, gpointer _value, gpointer _data) { GScannerKey *key = _key; - + g_free (key->symbol); g_free (key); } @@ -243,6 +281,7 @@ g_scanner_destroy (GScanner *scanner) g_scanner_free_value (&scanner->token, &scanner->value); g_scanner_free_value (&scanner->next_token, &scanner->next_value); g_free (scanner->config); + g_free (scanner->buffer); g_free (scanner); } @@ -252,7 +291,7 @@ g_scanner_msg_handler (GScanner *scanner, gint is_error) { g_return_if_fail (scanner != NULL); - + fprintf (stdout, "%s:%d: ", scanner->input_name, scanner->line); if (is_error) fprintf (stdout, "error: "); @@ -266,24 +305,20 @@ g_scanner_error (GScanner *scanner, { g_return_if_fail (scanner != NULL); g_return_if_fail (format != NULL); - + scanner->parse_errors++; - + if (scanner->msg_handler) { - va_list args, args2; + va_list args; gchar *string; va_start (args, format); - va_start (args2, format); - string = g_vsprintf ((gchar*) format, &args, &args2); + string = g_strdup_vprintf (format, args); va_end (args); - va_end (args2); - - string = g_strdup (string); - + scanner->msg_handler (scanner, string, TRUE); - + g_free (string); } } @@ -298,16 +333,12 @@ g_scanner_warn (GScanner *scanner, if (scanner->msg_handler) { - va_list args, args2; + va_list args; gchar *string; va_start (args, format); - va_start (args2, format); - string = g_vsprintf ((gchar*) format, &args, &args2); + string = g_strdup_vprintf (format, args); va_end (args); - va_end (args2); - - string = g_strdup (string); scanner->msg_handler (scanner, string, FALSE); @@ -315,65 +346,28 @@ g_scanner_warn (GScanner *scanner, } } -void -g_scanner_input_file (GScanner *scanner, - gint input_fd) -{ - g_return_if_fail (input_fd >= 0); - - scanner->token = G_TOKEN_NONE; - scanner->value.v_int = 0; - scanner->line = 1; - scanner->position = 0; - scanner->next_token = G_TOKEN_NONE; - - scanner->text = NULL; - scanner->text_len = 0; - scanner->input_fd = input_fd; - scanner->peeked_char = -1; -} - -void -g_scanner_input_text (GScanner *scanner, - const gchar *text, - guint text_len) -{ - g_return_if_fail (text != NULL); - - scanner->token = G_TOKEN_NONE; - scanner->value.v_int = 0; - scanner->line = 1; - scanner->position = 0; - scanner->next_token = G_TOKEN_NONE; - - scanner->text = text; - scanner->text_len = text_len; - scanner->input_fd = -1; - scanner->peeked_char = -1; -} - static gint g_scanner_key_equal (gconstpointer v1, gconstpointer v2) { - register const GScannerKey *key1 = v1; - register const GScannerKey *key2 = v2; - + const GScannerKey *key1 = v1; + const GScannerKey *key2 = v2; + return (key1->scope_id == key2->scope_id) && (strcmp (key1->symbol, key2->symbol) == 0); } static guint g_scanner_key_hash (gconstpointer v) { - register const GScannerKey *key = v; - register gchar *c; - register guint h; - + const GScannerKey *key = v; + gchar *c; + guint h; + h = key->scope_id; for (c = key->symbol; *c; c++) { - register guint g; - + guint g; + h = (h << 4) + *c; g = h & 0xf0000000; if (g) @@ -382,7 +376,7 @@ g_scanner_key_hash (gconstpointer v) h = h ^ g; } } - + return h; } @@ -391,15 +385,15 @@ g_scanner_lookup_internal (GScanner *scanner, guint scope_id, const gchar *symbol) { - register GScannerKey *key_p; + GScannerKey *key_p; GScannerKey key; - + key.scope_id = scope_id; if (!scanner->config->case_sensitive) { - register gchar *d; - register const gchar *c; + gchar *d; + const gchar *c; key.symbol = g_new (gchar, strlen (symbol) + 1); for (d = key.symbol, c = symbol; *c; c++, d++) @@ -423,7 +417,7 @@ g_scanner_scope_add_symbol (GScanner *scanner, const gchar *symbol, gpointer value) { - register GScannerKey *key; + GScannerKey *key; g_return_if_fail (scanner != NULL); g_return_if_fail (symbol != NULL); @@ -438,8 +432,8 @@ g_scanner_scope_add_symbol (GScanner *scanner, key->value = value; if (!scanner->config->case_sensitive) { - register gchar *c; - + gchar *c; + c = key->symbol; while (*c != 0) { @@ -458,11 +452,11 @@ g_scanner_scope_remove_symbol (GScanner *scanner, guint scope_id, const gchar *symbol) { - register GScannerKey *key; + GScannerKey *key; g_return_if_fail (scanner != NULL); g_return_if_fail (symbol != NULL); - + key = g_scanner_lookup_internal (scanner, scope_id, symbol); if (key) @@ -477,14 +471,14 @@ gpointer g_scanner_lookup_symbol (GScanner *scanner, const gchar *symbol) { - register GScannerKey *key; - register guint scope_id; + GScannerKey *key; + guint scope_id; g_return_val_if_fail (scanner != NULL, NULL); if (!symbol) return NULL; - + scope_id = scanner->scope_id; key = g_scanner_lookup_internal (scanner, scope_id, symbol); if (!key && scope_id && scanner->config->scope_0_fallback) @@ -501,7 +495,7 @@ g_scanner_scope_lookup_symbol (GScanner *scanner, guint scope_id, const gchar *symbol) { - register GScannerKey *key; + GScannerKey *key; g_return_val_if_fail (scanner != NULL, NULL); @@ -520,13 +514,13 @@ guint g_scanner_set_scope (GScanner *scanner, guint scope_id) { - register guint old_scope_id; - + guint old_scope_id; + g_return_val_if_fail (scanner != NULL, 0); - + old_scope_id = scanner->scope_id; scanner->scope_id = scope_id; - + return old_scope_id; } @@ -535,53 +529,57 @@ g_scanner_foreach_internal (gpointer _key, gpointer _value, gpointer _user_data) { - register GScannerKey *key; - register gpointer *d; - register GHFunc func; - register gpointer func_data; - register guint *scope_id; - + GScannerKey *key; + gpointer *d; + GHFunc func; + gpointer user_data; + guint *scope_id; + d = _user_data; func = (GHFunc) d[0]; - func_data = d[1]; + user_data = d[1]; scope_id = d[2]; key = _value; - + if (key->scope_id == *scope_id) - func (key->symbol, key->value, func_data); + func (key->symbol, key->value, user_data); } void g_scanner_scope_foreach_symbol (GScanner *scanner, guint scope_id, GHFunc func, - gpointer func_data) + gpointer user_data) { gpointer d[3]; - + g_return_if_fail (scanner != NULL); - + d[0] = (gpointer) func; - d[1] = func_data; + d[1] = user_data; d[2] = &scope_id; - + g_hash_table_foreach (scanner->symbol_table, g_scanner_foreach_internal, d); } void g_scanner_freeze_symbol_table (GScanner *scanner) { - g_return_if_fail (scanner != NULL); +#ifdef G_ENABLE_DEBUG + static gboolean first_call = TRUE; - g_hash_table_freeze (scanner->symbol_table); + if (first_call) + { + g_warning("g_scanner_freeze_symbol_table and " + "g_scanner_thaw_symbol_table are deprecated."); + first_call = FALSE; + } +#endif /* G_ENABLE_DEBUG */ } void g_scanner_thaw_symbol_table (GScanner *scanner) { - g_return_if_fail (scanner != NULL); - - g_hash_table_thaw (scanner->symbol_table); } GTokenType @@ -636,15 +634,20 @@ g_scanner_cur_token (GScanner *scanner) return scanner->token; } -GValue +GTokenValue g_scanner_cur_value (GScanner *scanner) { - register GValue v; + GTokenValue v; v.v_int = 0; - g_return_val_if_fail (scanner != NULL, v); - return scanner->value; + g_return_val_if_fail (scanner != NULL, v); + + /* MSC isn't capable of handling return scanner->value; ? */ + + v = scanner->value; + + return v; } guint @@ -671,41 +674,123 @@ g_scanner_eof (GScanner *scanner) return scanner->token == G_TOKEN_EOF; } +void +g_scanner_input_file (GScanner *scanner, + gint input_fd) +{ + g_return_if_fail (scanner != NULL); + g_return_if_fail (input_fd >= 0); + + if (scanner->input_fd >= 0) + g_scanner_sync_file_offset (scanner); + + scanner->token = G_TOKEN_NONE; + scanner->value.v_int = 0; + scanner->line = 1; + scanner->position = 0; + scanner->next_token = G_TOKEN_NONE; + + scanner->input_fd = input_fd; + scanner->text = NULL; + scanner->text_end = NULL; + + if (!scanner->buffer) + scanner->buffer = g_new (gchar, READ_BUFFER_SIZE + 1); +} + +void +g_scanner_input_text (GScanner *scanner, + const gchar *text, + guint text_len) +{ + g_return_if_fail (scanner != NULL); + if (text_len) + g_return_if_fail (text != NULL); + else + text = NULL; + + if (scanner->input_fd >= 0) + g_scanner_sync_file_offset (scanner); + + scanner->token = G_TOKEN_NONE; + scanner->value.v_int = 0; + scanner->line = 1; + scanner->position = 0; + scanner->next_token = G_TOKEN_NONE; + + scanner->input_fd = -1; + scanner->text = text; + scanner->text_end = text + text_len; + + if (scanner->buffer) + { + g_free (scanner->buffer); + scanner->buffer = NULL; + } +} + static guchar g_scanner_peek_next_char (GScanner *scanner) { - guchar fchar; - - if (scanner->text_len) + if (scanner->text < scanner->text_end) { - fchar = scanner->text[0]; + return *scanner->text; } else if (scanner->input_fd >= 0) { - if (scanner->peeked_char < 0) + gint count; + gchar *buffer; + + buffer = scanner->buffer; + do { - register gint count; - - do - { - count = read (scanner->input_fd, &fchar, 1); - } - while (count == -1 && - (errno == EINTR || - errno == EAGAIN)); - - if (count != 1) - fchar = 0; - - scanner->peeked_char = fchar; + count = read (scanner->input_fd, buffer, READ_BUFFER_SIZE); + } + while (count == -1 && (errno == EINTR || errno == EAGAIN)); + + if (count < 1) + { + scanner->input_fd = -1; + + return 0; } else - fchar = scanner->peeked_char; + { + scanner->text = buffer; + scanner->text_end = buffer + count; + + return *buffer; + } } else - fchar = 0; - - return fchar; + return 0; +} + +void +g_scanner_sync_file_offset (GScanner *scanner) +{ + g_return_if_fail (scanner != NULL); + + /* for file input, rewind the filedescriptor to the current + * buffer position and blow the file read ahead buffer. usefull for + * third party uses of our filedescriptor, which hooks onto the current + * scanning position. + */ + + if (scanner->input_fd >= 0 && scanner->text_end > scanner->text) + { + gint buffered; + + buffered = scanner->text_end - scanner->text; + if (lseek (scanner->input_fd, - buffered, SEEK_CUR) >= 0) + { + /* we succeeded, blow our buffer's contents now */ + scanner->text = NULL; + scanner->text_end = NULL; + } + else + errno = 0; + } } static guchar @@ -714,36 +799,37 @@ g_scanner_get_char (GScanner *scanner, guint *position_p) { guchar fchar; - - if (scanner->text_len) - { - fchar = *(scanner->text++); - scanner->text_len--; - } + + if (scanner->text < scanner->text_end) + fchar = *(scanner->text++); else if (scanner->input_fd >= 0) { - if (scanner->peeked_char < 0) + gint count; + gchar *buffer; + + buffer = scanner->buffer; + do { - register gint count; - - do - { - count = read (scanner->input_fd, &fchar, 1); - } - while (count == -1 && - (errno == EINTR || - errno == EAGAIN)); - if (count != 1 || fchar == 0) - { - fchar = 0; - scanner->peeked_char = 0; - } + count = read (scanner->input_fd, buffer, READ_BUFFER_SIZE); + } + while (count == -1 && (errno == EINTR || errno == EAGAIN)); + + if (count < 1) + { + scanner->input_fd = -1; + fchar = 0; } else { - fchar = scanner->peeked_char; - if (fchar) - scanner->peeked_char = -1; + scanner->text = buffer + 1; + scanner->text_end = buffer + count; + fchar = *buffer; + if (!fchar) + { + g_scanner_sync_file_offset (scanner); + scanner->text_end = scanner->text; + scanner->input_fd = -1; + } } } else @@ -771,12 +857,12 @@ g_scanner_unexp_token (GScanner *scanner, const gchar *message, gint is_error) { - register gchar *token_string; - register guint token_string_len; - register gchar *expected_string; - register guint expected_string_len; - register gchar *message_prefix; - register gboolean print_unexp; + gchar *token_string; + guint token_string_len; + gchar *expected_string; + guint expected_string_len; + gchar *message_prefix; + gboolean print_unexp; void (*msg_handler) (GScanner*, const gchar*, ...); g_return_if_fail (scanner != NULL); @@ -799,7 +885,7 @@ g_scanner_unexp_token (GScanner *scanner, switch (scanner->token) { - case G_TOKEN_EOF: + case G_TOKEN_EOF: g_snprintf (token_string, token_string_len, "end of file"); break; @@ -820,7 +906,7 @@ g_scanner_unexp_token (GScanner *scanner, break; } /* fall through */ - case G_TOKEN_SYMBOL: + case G_TOKEN_SYMBOL: if (expected_token == G_TOKEN_SYMBOL || (scanner->config->symbol_2_token && expected_token > G_TOKEN_LAST)) @@ -840,73 +926,75 @@ g_scanner_unexp_token (GScanner *scanner, symbol_spec); break; - case G_TOKEN_ERROR: + case G_TOKEN_ERROR: print_unexp = FALSE; expected_token = G_TOKEN_NONE; switch (scanner->value.v_error) { - case G_ERR_UNEXP_EOF: + case G_ERR_UNEXP_EOF: g_snprintf (token_string, token_string_len, "scanner: unexpected end of file"); break; - case G_ERR_UNEXP_EOF_IN_STRING: + case G_ERR_UNEXP_EOF_IN_STRING: g_snprintf (token_string, token_string_len, "scanner: unterminated string constant"); break; - case G_ERR_UNEXP_EOF_IN_COMMENT: + case G_ERR_UNEXP_EOF_IN_COMMENT: g_snprintf (token_string, token_string_len, "scanner: unterminated comment"); break; - case G_ERR_NON_DIGIT_IN_CONST: + case G_ERR_NON_DIGIT_IN_CONST: g_snprintf (token_string, token_string_len, "scanner: non digit in constant"); break; - case G_ERR_FLOAT_RADIX: + case G_ERR_FLOAT_RADIX: g_snprintf (token_string, token_string_len, "scanner: invalid radix for floating constant"); break; - case G_ERR_FLOAT_MALFORMED: + case G_ERR_FLOAT_MALFORMED: g_snprintf (token_string, token_string_len, "scanner: malformed floating constant"); break; - case G_ERR_DIGIT_RADIX: + case G_ERR_DIGIT_RADIX: g_snprintf (token_string, token_string_len, "scanner: digit is beyond radix"); break; - case G_ERR_UNKNOWN: + case G_ERR_UNKNOWN: default: g_snprintf (token_string, token_string_len, "scanner: unknown error"); break; } break; - case G_TOKEN_CHAR: + case G_TOKEN_CHAR: g_snprintf (token_string, token_string_len, "character `%c'", scanner->value.v_char); break; - case G_TOKEN_IDENTIFIER: - if (expected_token == G_TOKEN_IDENTIFIER) + case G_TOKEN_IDENTIFIER: + case G_TOKEN_IDENTIFIER_NULL: + if (expected_token == G_TOKEN_IDENTIFIER || + expected_token == G_TOKEN_IDENTIFIER_NULL) print_unexp = FALSE; g_snprintf (token_string, token_string_len, "%s%s `%s'", print_unexp ? "" : "invalid ", identifier_spec, - scanner->value.v_string); + scanner->token == G_TOKEN_IDENTIFIER ? scanner->value.v_string : "null"); break; - case G_TOKEN_BINARY: - case G_TOKEN_OCTAL: - case G_TOKEN_INT: - case G_TOKEN_HEX: + case G_TOKEN_BINARY: + case G_TOKEN_OCTAL: + case G_TOKEN_INT: + case G_TOKEN_HEX: g_snprintf (token_string, token_string_len, "number `%ld'", scanner->value.v_int); break; - case G_TOKEN_FLOAT: + case G_TOKEN_FLOAT: g_snprintf (token_string, token_string_len, "number `%.3f'", scanner->value.v_float); break; - case G_TOKEN_STRING: + case G_TOKEN_STRING: if (expected_token == G_TOKEN_STRING) print_unexp = FALSE; g_snprintf (token_string, @@ -919,12 +1007,12 @@ g_scanner_unexp_token (GScanner *scanner, token_string[token_string_len - 1] = 0; break; - case G_TOKEN_COMMENT_SINGLE: - case G_TOKEN_COMMENT_MULTI: + case G_TOKEN_COMMENT_SINGLE: + case G_TOKEN_COMMENT_MULTI: g_snprintf (token_string, token_string_len, "comment"); break; - case G_TOKEN_NONE: + case G_TOKEN_NONE: /* somehow the user's parsing code is screwed, there isn't much * we can do about it. * Note, a common case to trigger this is @@ -957,7 +1045,7 @@ g_scanner_unexp_token (GScanner *scanner, break; } /* fall through */ - case G_TOKEN_SYMBOL: + case G_TOKEN_SYMBOL: need_valid = (scanner->token == G_TOKEN_SYMBOL || (scanner->config->symbol_2_token && scanner->token > G_TOKEN_LAST)); @@ -969,30 +1057,36 @@ g_scanner_unexp_token (GScanner *scanner, /* FIXME: should we attempt to lookup the symbol_name for symbol_2_token? */ break; - case G_TOKEN_INT: + case G_TOKEN_INT: g_snprintf (expected_string, expected_string_len, "number (integer)"); break; - case G_TOKEN_FLOAT: + case G_TOKEN_FLOAT: g_snprintf (expected_string, expected_string_len, "number (float)"); break; - case G_TOKEN_STRING: + case G_TOKEN_STRING: g_snprintf (expected_string, expected_string_len, "%sstring constant", scanner->token == G_TOKEN_STRING ? "valid " : ""); break; - case G_TOKEN_IDENTIFIER: + case G_TOKEN_IDENTIFIER: + case G_TOKEN_IDENTIFIER_NULL: g_snprintf (expected_string, expected_string_len, "%s%s", - scanner->token == G_TOKEN_IDENTIFIER ? "valid " : "", + (scanner->token == G_TOKEN_IDENTIFIER_NULL || + scanner->token == G_TOKEN_IDENTIFIER ? "valid " : ""), identifier_spec); break; - case G_TOKEN_NONE: + case G_TOKEN_EOF: + g_snprintf (expected_string, expected_string_len, "end of file"); + break; + + case G_TOKEN_NONE: break; } @@ -1046,43 +1140,24 @@ g_scanner_stat_mode (const gchar *filename) { struct stat *stat_buf; gint st_mode; - + stat_buf = g_new0 (struct stat, 1); - +#ifdef HAVE_LSTAT lstat (filename, stat_buf); - +#else + stat (filename, stat_buf); +#endif st_mode = stat_buf->st_mode; - + g_free (stat_buf); - - return st_mode; -} - -static void -g_scanner_free_value (GTokenType *token_p, - GValue *value_p) -{ - switch (*token_p) - { - case G_TOKEN_STRING: - case G_TOKEN_IDENTIFIER: - case G_TOKEN_IDENTIFIER_NULL: - case G_TOKEN_COMMENT_SINGLE: - case G_TOKEN_COMMENT_MULTI: - g_free (value_p->v_string); - break; - - default: - break; - } - *token_p = G_TOKEN_NONE; + return st_mode; } static void g_scanner_get_token_i (GScanner *scanner, GTokenType *token_p, - GValue *value_p, + GTokenValue *value_p, guint *line_p, guint *position_p) { @@ -1136,27 +1211,25 @@ g_scanner_get_token_i (GScanner *scanner, static void g_scanner_get_token_ll (GScanner *scanner, GTokenType *token_p, - GValue *value_p, + GTokenValue *value_p, guint *line_p, guint *position_p) { - register GScannerConfig *config; - register gboolean in_comment_multi; - register gboolean in_comment_single; - register gboolean in_string_sq; - register gboolean in_string_dq; - static guchar ch; - register GTokenType token; - register GValue value; - register GString *gstring; + GScannerConfig *config; + GTokenType token; + gboolean in_comment_multi; + gboolean in_comment_single; + gboolean in_string_sq; + gboolean in_string_dq; + GString *gstring; + GTokenValue value; + guchar ch; config = scanner->config; (*value_p).v_int = 0; - if (scanner->token == G_TOKEN_EOF || - (!scanner->text_len && - (scanner->input_fd < 0 || - scanner->peeked_char == 0))) + if ((scanner->text >= scanner->text_end && scanner->input_fd < 0) || + scanner->token == G_TOKEN_EOF) { *token_p = G_TOKEN_EOF; return; @@ -1168,9 +1241,9 @@ g_scanner_get_token_ll (GScanner *scanner, in_string_dq = FALSE; gstring = NULL; - do + do /* while (ch != 0) */ { - register gboolean dotted_float = FALSE; + gboolean dotted_float = FALSE; ch = g_scanner_get_char (scanner, line_p, position_p); @@ -1187,16 +1260,13 @@ g_scanner_get_token_ll (GScanner *scanner, switch (ch) { - register gboolean in_number; - static gchar *endptr; - - case 0: + case 0: token = G_TOKEN_EOF; (*position_p)++; - ch = 0; + /* ch = 0; */ break; - case '/': + case '/': if (!config->scan_comment_multi || g_scanner_peek_next_char (scanner) != '*') goto default_case; @@ -1218,7 +1288,7 @@ g_scanner_get_token_ll (GScanner *scanner, ch = 0; break; - case '\'': + case '\'': if (!config->scan_string_sq) goto default_case; token = G_TOKEN_STRING; @@ -1237,7 +1307,7 @@ g_scanner_get_token_ll (GScanner *scanner, ch = 0; break; - case '"': + case '"': if (!config->scan_string_dq) goto default_case; token = G_TOKEN_STRING; @@ -1257,50 +1327,50 @@ g_scanner_get_token_ll (GScanner *scanner, ch = g_scanner_get_char (scanner, line_p, position_p); switch (ch) { - register guint i; - register guint fchar; + guint i; + guint fchar; - case 0: + case 0: break; - case '\\': + case '\\': gstring = g_string_append_c (gstring, '\\'); break; - case 'n': + case 'n': gstring = g_string_append_c (gstring, '\n'); break; - case 't': + case 't': gstring = g_string_append_c (gstring, '\t'); break; - case 'r': + case 'r': gstring = g_string_append_c (gstring, '\r'); break; - case 'b': + case 'b': gstring = g_string_append_c (gstring, '\b'); break; - case 'f': + case 'f': gstring = g_string_append_c (gstring, '\f'); break; - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': i = ch - '0'; fchar = g_scanner_peek_next_char (scanner); if (fchar >= '0' && fchar <= '7') { ch = g_scanner_get_char (scanner, line_p, position_p); - i= i * 8 + ch - '0'; + i = i * 8 + ch - '0'; fchar = g_scanner_peek_next_char (scanner); if (fchar >= '0' && fchar <= '7') { @@ -1323,7 +1393,7 @@ g_scanner_get_token_ll (GScanner *scanner, ch = 0; break; - case '.': + case '.': if (!config->scan_float) goto default_case; token = G_TOKEN_FLOAT; @@ -1331,14 +1401,14 @@ g_scanner_get_token_ll (GScanner *scanner, ch = g_scanner_get_char (scanner, line_p, position_p); goto number_parsing; - case '$': + case '$': if (!config->scan_hex_dollar) goto default_case; token = G_TOKEN_HEX; ch = g_scanner_get_char (scanner, line_p, position_p); goto number_parsing; - case '0': + case '0': if (config->scan_octal) token = G_TOKEN_OCTAL; else @@ -1387,227 +1457,230 @@ g_scanner_get_token_ll (GScanner *scanner, else ch = '0'; /* fall through */ - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': number_parsing: - if (token == G_TOKEN_NONE) - token = G_TOKEN_INT; - - gstring = g_string_new (dotted_float ? "0." : ""); - gstring = g_string_append_c (gstring, ch); - in_number = TRUE; - while (in_number) - { - register gboolean is_E; - - is_E = (ch == 'e' || ch == 'E') && token == G_TOKEN_FLOAT; - ch = g_scanner_peek_next_char (scanner); - - if (g_scanner_char_2_num (ch, 36) >= 0 || - (config->scan_float && ch == '.') || - (is_E && ch == '+') || - (is_E && ch == '-') ) - ch = g_scanner_get_char (scanner, line_p, position_p); - else - in_number = FALSE; - - if (in_number) - switch (ch) + { + gboolean in_number = TRUE; + gchar *endptr; + + if (token == G_TOKEN_NONE) + token = G_TOKEN_INT; + + gstring = g_string_new (dotted_float ? "0." : ""); + gstring = g_string_append_c (gstring, ch); + + do /* while (in_number) */ + { + gboolean is_E; + + is_E = token == G_TOKEN_FLOAT && (ch == 'e' || ch == 'E'); + + ch = g_scanner_peek_next_char (scanner); + + if (g_scanner_char_2_num (ch, 36) >= 0 || + (config->scan_float && ch == '.') || + (is_E && (ch == '+' || ch == '-'))) { - case '.': - if (token != G_TOKEN_INT && - token != G_TOKEN_OCTAL) + ch = g_scanner_get_char (scanner, line_p, position_p); + + switch (ch) { - token = G_TOKEN_ERROR; - if (token == G_TOKEN_FLOAT) - value.v_error = G_ERR_FLOAT_MALFORMED; + case '.': + if (token != G_TOKEN_INT && token != G_TOKEN_OCTAL) + { + value.v_error = token == G_TOKEN_FLOAT ? G_ERR_FLOAT_MALFORMED : G_ERR_FLOAT_RADIX; + token = G_TOKEN_ERROR; + in_number = FALSE; + } else - value.v_error = G_ERR_FLOAT_RADIX; - in_number = FALSE; - } - else - { - token = G_TOKEN_FLOAT; + { + token = G_TOKEN_FLOAT; + gstring = g_string_append_c (gstring, ch); + } + break; + + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': gstring = g_string_append_c (gstring, ch); + break; + + case '-': + case '+': + if (token != G_TOKEN_FLOAT) + { + token = G_TOKEN_ERROR; + value.v_error = G_ERR_NON_DIGIT_IN_CONST; + in_number = FALSE; + } + else + gstring = g_string_append_c (gstring, ch); + break; + + case 'e': + case 'E': + if ((token != G_TOKEN_HEX && !config->scan_float) || + (token != G_TOKEN_HEX && + token != G_TOKEN_OCTAL && + token != G_TOKEN_FLOAT && + token != G_TOKEN_INT)) + { + token = G_TOKEN_ERROR; + value.v_error = G_ERR_NON_DIGIT_IN_CONST; + in_number = FALSE; + } + else + { + if (token != G_TOKEN_HEX) + token = G_TOKEN_FLOAT; + gstring = g_string_append_c (gstring, ch); + } + break; + + default: + if (token != G_TOKEN_HEX) + { + token = G_TOKEN_ERROR; + value.v_error = G_ERR_NON_DIGIT_IN_CONST; + in_number = FALSE; + } + else + gstring = g_string_append_c (gstring, ch); + break; } - break; - - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': - gstring = g_string_append_c (gstring, ch); - break; - - case '-': - case '+': - if (token != G_TOKEN_FLOAT) + } + else + in_number = FALSE; + } + while (in_number); + + endptr = NULL; + switch (token) + { + case G_TOKEN_BINARY: + value.v_binary = strtol (gstring->str, &endptr, 2); + break; + + case G_TOKEN_OCTAL: + value.v_octal = strtol (gstring->str, &endptr, 8); + break; + + case G_TOKEN_INT: + value.v_int = strtol (gstring->str, &endptr, 10); + break; + + case G_TOKEN_FLOAT: + value.v_float = g_strtod (gstring->str, &endptr); + break; + + case G_TOKEN_HEX: + value.v_hex = strtol (gstring->str, &endptr, 16); + break; + + default: + break; + } + if (endptr && *endptr) + { + token = G_TOKEN_ERROR; + if (*endptr == 'e' || *endptr == 'E') + value.v_error = G_ERR_NON_DIGIT_IN_CONST; + else + value.v_error = G_ERR_DIGIT_RADIX; + } + g_string_free (gstring, TRUE); + gstring = NULL; + ch = 0; + } /* number_parsing:... */ + break; + + default: + default_case: + { + if (config->cpair_comment_single && + ch == config->cpair_comment_single[0]) + { + token = G_TOKEN_COMMENT_SINGLE; + in_comment_single = TRUE; + gstring = g_string_new (""); + ch = g_scanner_get_char (scanner, line_p, position_p); + while (ch != 0) + { + if (ch == config->cpair_comment_single[1]) { - token = G_TOKEN_ERROR; - value.v_error = G_ERR_NON_DIGIT_IN_CONST; - in_number = FALSE; + in_comment_single = FALSE; + ch = 0; + break; } - else - gstring = g_string_append_c (gstring, ch); - break; - case 'e': - case 'E': - if ((token != G_TOKEN_HEX && !config->scan_float) || - (token != G_TOKEN_HEX && - token != G_TOKEN_OCTAL && - token != G_TOKEN_FLOAT && - token != G_TOKEN_INT)) - { - token = G_TOKEN_ERROR; - value.v_error = G_ERR_NON_DIGIT_IN_CONST; - in_number = FALSE; - } - else + gstring = g_string_append_c (gstring, ch); + ch = g_scanner_get_char (scanner, line_p, position_p); + } + } + else if (config->scan_identifier && ch && + strchr (config->cset_identifier_first, ch)) + { + identifier_precedence: + + if (config->cset_identifier_nth && ch && + strchr (config->cset_identifier_nth, + g_scanner_peek_next_char (scanner))) + { + token = G_TOKEN_IDENTIFIER; + gstring = g_string_new (""); + gstring = g_string_append_c (gstring, ch); + do { - if (token != G_TOKEN_HEX) - token = G_TOKEN_FLOAT; + ch = g_scanner_get_char (scanner, line_p, position_p); gstring = g_string_append_c (gstring, ch); + ch = g_scanner_peek_next_char (scanner); } - break; - - default: - if (token != G_TOKEN_HEX) - { - token = G_TOKEN_ERROR; - value.v_error = G_ERR_NON_DIGIT_IN_CONST; - in_number = FALSE; - } - else - gstring = g_string_append_c (gstring, ch); - break; + while (ch && strchr (config->cset_identifier_nth, ch)); + ch = 0; } - } - endptr = NULL; - switch (token) - { - case G_TOKEN_BINARY: - value.v_binary = strtol (gstring->str, &endptr, 2); - break; - - case G_TOKEN_OCTAL: - value.v_octal = strtol (gstring->str, &endptr, 8); - break; - - case G_TOKEN_INT: - value.v_int = strtol (gstring->str, &endptr, 10); - break; - - case G_TOKEN_FLOAT: - value.v_float = g_strtod (gstring->str, &endptr); - break; - - case G_TOKEN_HEX: - value.v_hex = strtol (gstring->str, &endptr, 16); - break; - - default: - break; - } - if (endptr && *endptr) - { - token = G_TOKEN_ERROR; - if (*endptr == 'e' || *endptr == 'E') - value.v_error = G_ERR_NON_DIGIT_IN_CONST; - else - value.v_error = G_ERR_DIGIT_RADIX; - } - g_string_free (gstring, TRUE); - gstring = NULL; - ch = 0; - break; - - default: - default_case: - if (config->cpair_comment_single && - ch == config->cpair_comment_single[0]) - { - token = G_TOKEN_COMMENT_SINGLE; - in_comment_single = TRUE; - gstring = g_string_new (""); - while ((ch = g_scanner_get_char (scanner, - line_p, - position_p)) != 0) - { - if (ch == config->cpair_comment_single[1]) - { - in_comment_single = FALSE; - ch = 0; - break; - } - - gstring = g_string_append_c (gstring, ch); - ch = 0; - } - } - else if (config->scan_identifier && ch && - strchr (config->cset_identifier_first, ch)) - { - identifier_precedence: - - if (config->cset_identifier_nth && ch && - strchr (config->cset_identifier_nth, - g_scanner_peek_next_char (scanner))) - { - token = G_TOKEN_IDENTIFIER; - gstring = g_string_new (""); - gstring = g_string_append_c (gstring, ch); - do - { - ch = g_scanner_get_char (scanner, line_p, position_p); - gstring = g_string_append_c (gstring, ch); - ch = g_scanner_peek_next_char (scanner); - } - while (ch && strchr (config->cset_identifier_nth, ch)); - ch = 0; - } - else if (config->scan_identifier_1char) - { - token = G_TOKEN_IDENTIFIER; - value.v_identifier = g_new0 (gchar, 2); - value.v_identifier[0] = ch; - ch = 0; - } - } - if (ch) - { - if (config->char_2_token) - token = ch; - else - { - token = G_TOKEN_CHAR; - value.v_char = ch; - } - ch = 0; - } + else if (config->scan_identifier_1char) + { + token = G_TOKEN_IDENTIFIER; + value.v_identifier = g_new0 (gchar, 2); + value.v_identifier[0] = ch; + ch = 0; + } + } + if (ch) + { + if (config->char_2_token) + token = ch; + else + { + token = G_TOKEN_CHAR; + value.v_char = ch; + } + ch = 0; + } + } /* default_case:... */ break; } - g_assert (ch == 0 && token != G_TOKEN_NONE); + g_assert (ch == 0 && token != G_TOKEN_NONE); /* paranoid */ } while (ch != 0); - if (in_comment_multi || - in_comment_single || - in_string_sq || - in_string_dq) + if (in_comment_multi || in_comment_single || + in_string_sq || in_string_dq) { token = G_TOKEN_ERROR; if (gstring) @@ -1618,7 +1691,7 @@ g_scanner_get_token_ll (GScanner *scanner, (*position_p)++; if (in_comment_multi || in_comment_single) value.v_error = G_ERR_UNEXP_EOF_IN_COMMENT; - else if (in_string_sq || in_string_dq) + else /* (in_string_sq || in_string_dq) */ value.v_error = G_ERR_UNEXP_EOF_IN_STRING; } @@ -1629,51 +1702,53 @@ g_scanner_get_token_ll (GScanner *scanner, gstring = NULL; } - if (token == G_TOKEN_IDENTIFIER && - config->scan_symbols) + if (token == G_TOKEN_IDENTIFIER) { - register GScannerKey *key; - register guint scope_id; - - scope_id = scanner->scope_id; - key = g_scanner_lookup_internal (scanner, scope_id, value.v_identifier); - if (!key && scope_id && scanner->config->scope_0_fallback) - key = g_scanner_lookup_internal (scanner, 0, value.v_identifier); - - if (key) + if (config->scan_symbols) { - g_free (value.v_identifier); - token = G_TOKEN_SYMBOL; - value.v_symbol = key->value; + GScannerKey *key; + guint scope_id; + + scope_id = scanner->scope_id; + key = g_scanner_lookup_internal (scanner, scope_id, value.v_identifier); + if (!key && scope_id && scanner->config->scope_0_fallback) + key = g_scanner_lookup_internal (scanner, 0, value.v_identifier); + + if (key) + { + g_free (value.v_identifier); + token = G_TOKEN_SYMBOL; + value.v_symbol = key->value; + } } - } - - if (token == G_TOKEN_IDENTIFIER && - config->scan_identifier_NULL && - strlen (value.v_identifier) == 4) - { - gchar *null_upper = "NULL"; - gchar *null_lower = "null"; - if (scanner->config->case_sensitive) + if (token == G_TOKEN_IDENTIFIER && + config->scan_identifier_NULL && + strlen (value.v_identifier) == 4) { - if (value.v_identifier[0] == null_upper[0] && - value.v_identifier[1] == null_upper[1] && - value.v_identifier[2] == null_upper[2] && - value.v_identifier[3] == null_upper[3]) - token = G_TOKEN_IDENTIFIER_NULL; - } - else - { - if ((value.v_identifier[0] == null_upper[0] || - value.v_identifier[0] == null_lower[0]) && - (value.v_identifier[1] == null_upper[1] || - value.v_identifier[1] == null_lower[1]) && - (value.v_identifier[2] == null_upper[2] || - value.v_identifier[2] == null_lower[2]) && - (value.v_identifier[3] == null_upper[3] || - value.v_identifier[3] == null_lower[3])) - token = G_TOKEN_IDENTIFIER_NULL; + gchar *null_upper = "NULL"; + gchar *null_lower = "null"; + + if (scanner->config->case_sensitive) + { + if (value.v_identifier[0] == null_upper[0] && + value.v_identifier[1] == null_upper[1] && + value.v_identifier[2] == null_upper[2] && + value.v_identifier[3] == null_upper[3]) + token = G_TOKEN_IDENTIFIER_NULL; + } + else + { + if ((value.v_identifier[0] == null_upper[0] || + value.v_identifier[0] == null_lower[0]) && + (value.v_identifier[1] == null_upper[1] || + value.v_identifier[1] == null_lower[1]) && + (value.v_identifier[2] == null_upper[2] || + value.v_identifier[2] == null_lower[2]) && + (value.v_identifier[3] == null_upper[3] || + value.v_identifier[3] == null_lower[3])) + token = G_TOKEN_IDENTIFIER_NULL; + } } }