mirror of
https://gitlab.gnome.org/GNOME/glib.git
synced 2025-05-04 21:16:52 +02:00
version bump to 1.1.4, binary age 0, interface age 0.
Fri Sep 25 00:04:37 1998 Tim Janik <timj@gtk.org> * configure.in: version bump to 1.1.4, binary age 0, interface age 0. * glib.h (struct _GScanner): dumped peeked_char and text_len in favour of *text_end and *buffer for buffered read()s. * gscanner.c: changed peeking and retrival of next character so we have buffered reads. fixed minor bug with number parsing error reporting. made some static!!! variables local ones (why did we use static temporary variables in the lowlevel tokenization code anyways?).
This commit is contained in:
parent
d120d02a8c
commit
77e4f76f16
12
ChangeLog
12
ChangeLog
@ -1,3 +1,15 @@
|
|||||||
|
Fri Sep 25 00:04:37 1998 Tim Janik <timj@gtk.org>
|
||||||
|
|
||||||
|
* configure.in: version bump to 1.1.4, binary age 0, interface age 0.
|
||||||
|
|
||||||
|
* glib.h (struct _GScanner): dumped peeked_char and text_len in favour
|
||||||
|
of *text_end and *buffer for buffered read()s.
|
||||||
|
|
||||||
|
* gscanner.c: changed peeking and retrival of next character so we
|
||||||
|
have buffered reads. fixed minor bug with number parsing error
|
||||||
|
reporting. made some static!!! variables local ones (why did we use
|
||||||
|
static temporary variables in the lowlevel tokenization code anyways?).
|
||||||
|
|
||||||
Mon Sep 21 23:23:10 CDT 1998 Shawn T. Amundson <amundson@gtk.org>
|
Mon Sep 21 23:23:10 CDT 1998 Shawn T. Amundson <amundson@gtk.org>
|
||||||
|
|
||||||
* Released GLib 1.1.3
|
* Released GLib 1.1.3
|
||||||
|
@ -1,3 +1,15 @@
|
|||||||
|
Fri Sep 25 00:04:37 1998 Tim Janik <timj@gtk.org>
|
||||||
|
|
||||||
|
* configure.in: version bump to 1.1.4, binary age 0, interface age 0.
|
||||||
|
|
||||||
|
* glib.h (struct _GScanner): dumped peeked_char and text_len in favour
|
||||||
|
of *text_end and *buffer for buffered read()s.
|
||||||
|
|
||||||
|
* gscanner.c: changed peeking and retrival of next character so we
|
||||||
|
have buffered reads. fixed minor bug with number parsing error
|
||||||
|
reporting. made some static!!! variables local ones (why did we use
|
||||||
|
static temporary variables in the lowlevel tokenization code anyways?).
|
||||||
|
|
||||||
Mon Sep 21 23:23:10 CDT 1998 Shawn T. Amundson <amundson@gtk.org>
|
Mon Sep 21 23:23:10 CDT 1998 Shawn T. Amundson <amundson@gtk.org>
|
||||||
|
|
||||||
* Released GLib 1.1.3
|
* Released GLib 1.1.3
|
||||||
|
@ -1,3 +1,15 @@
|
|||||||
|
Fri Sep 25 00:04:37 1998 Tim Janik <timj@gtk.org>
|
||||||
|
|
||||||
|
* configure.in: version bump to 1.1.4, binary age 0, interface age 0.
|
||||||
|
|
||||||
|
* glib.h (struct _GScanner): dumped peeked_char and text_len in favour
|
||||||
|
of *text_end and *buffer for buffered read()s.
|
||||||
|
|
||||||
|
* gscanner.c: changed peeking and retrival of next character so we
|
||||||
|
have buffered reads. fixed minor bug with number parsing error
|
||||||
|
reporting. made some static!!! variables local ones (why did we use
|
||||||
|
static temporary variables in the lowlevel tokenization code anyways?).
|
||||||
|
|
||||||
Mon Sep 21 23:23:10 CDT 1998 Shawn T. Amundson <amundson@gtk.org>
|
Mon Sep 21 23:23:10 CDT 1998 Shawn T. Amundson <amundson@gtk.org>
|
||||||
|
|
||||||
* Released GLib 1.1.3
|
* Released GLib 1.1.3
|
||||||
|
@ -1,3 +1,15 @@
|
|||||||
|
Fri Sep 25 00:04:37 1998 Tim Janik <timj@gtk.org>
|
||||||
|
|
||||||
|
* configure.in: version bump to 1.1.4, binary age 0, interface age 0.
|
||||||
|
|
||||||
|
* glib.h (struct _GScanner): dumped peeked_char and text_len in favour
|
||||||
|
of *text_end and *buffer for buffered read()s.
|
||||||
|
|
||||||
|
* gscanner.c: changed peeking and retrival of next character so we
|
||||||
|
have buffered reads. fixed minor bug with number parsing error
|
||||||
|
reporting. made some static!!! variables local ones (why did we use
|
||||||
|
static temporary variables in the lowlevel tokenization code anyways?).
|
||||||
|
|
||||||
Mon Sep 21 23:23:10 CDT 1998 Shawn T. Amundson <amundson@gtk.org>
|
Mon Sep 21 23:23:10 CDT 1998 Shawn T. Amundson <amundson@gtk.org>
|
||||||
|
|
||||||
* Released GLib 1.1.3
|
* Released GLib 1.1.3
|
||||||
|
@ -1,3 +1,15 @@
|
|||||||
|
Fri Sep 25 00:04:37 1998 Tim Janik <timj@gtk.org>
|
||||||
|
|
||||||
|
* configure.in: version bump to 1.1.4, binary age 0, interface age 0.
|
||||||
|
|
||||||
|
* glib.h (struct _GScanner): dumped peeked_char and text_len in favour
|
||||||
|
of *text_end and *buffer for buffered read()s.
|
||||||
|
|
||||||
|
* gscanner.c: changed peeking and retrival of next character so we
|
||||||
|
have buffered reads. fixed minor bug with number parsing error
|
||||||
|
reporting. made some static!!! variables local ones (why did we use
|
||||||
|
static temporary variables in the lowlevel tokenization code anyways?).
|
||||||
|
|
||||||
Mon Sep 21 23:23:10 CDT 1998 Shawn T. Amundson <amundson@gtk.org>
|
Mon Sep 21 23:23:10 CDT 1998 Shawn T. Amundson <amundson@gtk.org>
|
||||||
|
|
||||||
* Released GLib 1.1.3
|
* Released GLib 1.1.3
|
||||||
|
@ -1,3 +1,15 @@
|
|||||||
|
Fri Sep 25 00:04:37 1998 Tim Janik <timj@gtk.org>
|
||||||
|
|
||||||
|
* configure.in: version bump to 1.1.4, binary age 0, interface age 0.
|
||||||
|
|
||||||
|
* glib.h (struct _GScanner): dumped peeked_char and text_len in favour
|
||||||
|
of *text_end and *buffer for buffered read()s.
|
||||||
|
|
||||||
|
* gscanner.c: changed peeking and retrival of next character so we
|
||||||
|
have buffered reads. fixed minor bug with number parsing error
|
||||||
|
reporting. made some static!!! variables local ones (why did we use
|
||||||
|
static temporary variables in the lowlevel tokenization code anyways?).
|
||||||
|
|
||||||
Mon Sep 21 23:23:10 CDT 1998 Shawn T. Amundson <amundson@gtk.org>
|
Mon Sep 21 23:23:10 CDT 1998 Shawn T. Amundson <amundson@gtk.org>
|
||||||
|
|
||||||
* Released GLib 1.1.3
|
* Released GLib 1.1.3
|
||||||
|
@ -1,3 +1,15 @@
|
|||||||
|
Fri Sep 25 00:04:37 1998 Tim Janik <timj@gtk.org>
|
||||||
|
|
||||||
|
* configure.in: version bump to 1.1.4, binary age 0, interface age 0.
|
||||||
|
|
||||||
|
* glib.h (struct _GScanner): dumped peeked_char and text_len in favour
|
||||||
|
of *text_end and *buffer for buffered read()s.
|
||||||
|
|
||||||
|
* gscanner.c: changed peeking and retrival of next character so we
|
||||||
|
have buffered reads. fixed minor bug with number parsing error
|
||||||
|
reporting. made some static!!! variables local ones (why did we use
|
||||||
|
static temporary variables in the lowlevel tokenization code anyways?).
|
||||||
|
|
||||||
Mon Sep 21 23:23:10 CDT 1998 Shawn T. Amundson <amundson@gtk.org>
|
Mon Sep 21 23:23:10 CDT 1998 Shawn T. Amundson <amundson@gtk.org>
|
||||||
|
|
||||||
* Released GLib 1.1.3
|
* Released GLib 1.1.3
|
||||||
|
@ -1,3 +1,15 @@
|
|||||||
|
Fri Sep 25 00:04:37 1998 Tim Janik <timj@gtk.org>
|
||||||
|
|
||||||
|
* configure.in: version bump to 1.1.4, binary age 0, interface age 0.
|
||||||
|
|
||||||
|
* glib.h (struct _GScanner): dumped peeked_char and text_len in favour
|
||||||
|
of *text_end and *buffer for buffered read()s.
|
||||||
|
|
||||||
|
* gscanner.c: changed peeking and retrival of next character so we
|
||||||
|
have buffered reads. fixed minor bug with number parsing error
|
||||||
|
reporting. made some static!!! variables local ones (why did we use
|
||||||
|
static temporary variables in the lowlevel tokenization code anyways?).
|
||||||
|
|
||||||
Mon Sep 21 23:23:10 CDT 1998 Shawn T. Amundson <amundson@gtk.org>
|
Mon Sep 21 23:23:10 CDT 1998 Shawn T. Amundson <amundson@gtk.org>
|
||||||
|
|
||||||
* Released GLib 1.1.3
|
* Released GLib 1.1.3
|
||||||
|
@ -18,7 +18,7 @@ cflags_set=${CFLAGS+set}
|
|||||||
#
|
#
|
||||||
GLIB_MAJOR_VERSION=1
|
GLIB_MAJOR_VERSION=1
|
||||||
GLIB_MINOR_VERSION=1
|
GLIB_MINOR_VERSION=1
|
||||||
GLIB_MICRO_VERSION=3
|
GLIB_MICRO_VERSION=4
|
||||||
GLIB_INTERFACE_AGE=0
|
GLIB_INTERFACE_AGE=0
|
||||||
GLIB_BINARY_AGE=0
|
GLIB_BINARY_AGE=0
|
||||||
GLIB_VERSION=$GLIB_MAJOR_VERSION.$GLIB_MINOR_VERSION.$GLIB_MICRO_VERSION
|
GLIB_VERSION=$GLIB_MAJOR_VERSION.$GLIB_MINOR_VERSION.$GLIB_MICRO_VERSION
|
||||||
|
6
glib.h
6
glib.h
@ -1654,10 +1654,10 @@ struct _GScanner
|
|||||||
|
|
||||||
/* to be considered private */
|
/* to be considered private */
|
||||||
GHashTable *symbol_table;
|
GHashTable *symbol_table;
|
||||||
const gchar *text;
|
|
||||||
guint text_len;
|
|
||||||
gint input_fd;
|
gint input_fd;
|
||||||
gint peeked_char;
|
const gchar *text;
|
||||||
|
const gchar *text_end;
|
||||||
|
gchar *buffer;
|
||||||
guint scope_id;
|
guint scope_id;
|
||||||
|
|
||||||
/* handler function for _warn and _error */
|
/* handler function for _warn and _error */
|
||||||
|
@ -1654,10 +1654,10 @@ struct _GScanner
|
|||||||
|
|
||||||
/* to be considered private */
|
/* to be considered private */
|
||||||
GHashTable *symbol_table;
|
GHashTable *symbol_table;
|
||||||
const gchar *text;
|
|
||||||
guint text_len;
|
|
||||||
gint input_fd;
|
gint input_fd;
|
||||||
gint peeked_char;
|
const gchar *text;
|
||||||
|
const gchar *text_end;
|
||||||
|
gchar *buffer;
|
||||||
guint scope_id;
|
guint scope_id;
|
||||||
|
|
||||||
/* handler function for _warn and _error */
|
/* handler function for _warn and _error */
|
||||||
|
273
glib/gscanner.c
273
glib/gscanner.c
@ -42,6 +42,7 @@
|
|||||||
((guchar)(c)) \
|
((guchar)(c)) \
|
||||||
) \
|
) \
|
||||||
)
|
)
|
||||||
|
#define READ_BUFFER_SIZE (4000)
|
||||||
|
|
||||||
|
|
||||||
/* --- typedefs --- */
|
/* --- typedefs --- */
|
||||||
@ -103,9 +104,6 @@ static GScannerConfig g_scanner_config_template =
|
|||||||
|
|
||||||
/* --- prototypes --- */
|
/* --- prototypes --- */
|
||||||
static inline
|
static inline
|
||||||
gint g_scanner_char_2_num (guchar c,
|
|
||||||
guchar base);
|
|
||||||
static inline
|
|
||||||
GScannerKey* g_scanner_lookup_internal (GScanner *scanner,
|
GScannerKey* g_scanner_lookup_internal (GScanner *scanner,
|
||||||
guint scope_id,
|
guint scope_id,
|
||||||
const gchar *symbol);
|
const gchar *symbol);
|
||||||
@ -122,8 +120,6 @@ static void g_scanner_get_token_i (GScanner *scanner,
|
|||||||
GTokenValue *value_p,
|
GTokenValue *value_p,
|
||||||
guint *line_p,
|
guint *line_p,
|
||||||
guint *position_p);
|
guint *position_p);
|
||||||
static void g_scanner_free_value (GTokenType *token_p,
|
|
||||||
GTokenValue *value_p);
|
|
||||||
|
|
||||||
static guchar g_scanner_peek_next_char (GScanner *scanner);
|
static guchar g_scanner_peek_next_char (GScanner *scanner);
|
||||||
static guchar g_scanner_get_char (GScanner *scanner,
|
static guchar g_scanner_get_char (GScanner *scanner,
|
||||||
@ -135,7 +131,7 @@ static void g_scanner_msg_handler (GScanner *scanner,
|
|||||||
|
|
||||||
|
|
||||||
/* --- functions --- */
|
/* --- functions --- */
|
||||||
static gint
|
static inline gint
|
||||||
g_scanner_char_2_num (guchar c,
|
g_scanner_char_2_num (guchar c,
|
||||||
guchar base)
|
guchar base)
|
||||||
{
|
{
|
||||||
@ -209,10 +205,10 @@ g_scanner_new (GScannerConfig *config_templ)
|
|||||||
scanner->next_position = 0;
|
scanner->next_position = 0;
|
||||||
|
|
||||||
scanner->symbol_table = g_hash_table_new (g_scanner_key_hash, g_scanner_key_equal);
|
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->input_fd = -1;
|
||||||
scanner->peeked_char = -1;
|
scanner->text = NULL;
|
||||||
|
scanner->text_end = NULL;
|
||||||
|
scanner->buffer = NULL;
|
||||||
scanner->scope_id = 0;
|
scanner->scope_id = 0;
|
||||||
|
|
||||||
scanner->msg_handler = g_scanner_msg_handler;
|
scanner->msg_handler = g_scanner_msg_handler;
|
||||||
@ -220,6 +216,27 @@ g_scanner_new (GScannerConfig *config_templ)
|
|||||||
return scanner;
|
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
|
static void
|
||||||
g_scanner_destroy_symbol_table_entry (gpointer _key,
|
g_scanner_destroy_symbol_table_entry (gpointer _key,
|
||||||
gpointer _value,
|
gpointer _value,
|
||||||
@ -242,6 +259,7 @@ g_scanner_destroy (GScanner *scanner)
|
|||||||
g_scanner_free_value (&scanner->token, &scanner->value);
|
g_scanner_free_value (&scanner->token, &scanner->value);
|
||||||
g_scanner_free_value (&scanner->next_token, &scanner->next_value);
|
g_scanner_free_value (&scanner->next_token, &scanner->next_value);
|
||||||
g_free (scanner->config);
|
g_free (scanner->config);
|
||||||
|
g_free (scanner->buffer);
|
||||||
g_free (scanner);
|
g_free (scanner);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -306,43 +324,6 @@ 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
|
static gint
|
||||||
g_scanner_key_equal (gconstpointer v1,
|
g_scanner_key_equal (gconstpointer v1,
|
||||||
gconstpointer v2)
|
gconstpointer v2)
|
||||||
@ -662,41 +643,90 @@ g_scanner_eof (GScanner *scanner)
|
|||||||
return scanner->token == G_TOKEN_EOF;
|
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);
|
||||||
|
|
||||||
|
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;
|
||||||
|
|
||||||
|
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
|
static guchar
|
||||||
g_scanner_peek_next_char (GScanner *scanner)
|
g_scanner_peek_next_char (GScanner *scanner)
|
||||||
{
|
{
|
||||||
guchar fchar;
|
if (scanner->text < scanner->text_end)
|
||||||
|
|
||||||
if (scanner->text_len)
|
|
||||||
{
|
{
|
||||||
fchar = scanner->text[0];
|
return *scanner->text;
|
||||||
}
|
}
|
||||||
else if (scanner->input_fd >= 0)
|
else if (scanner->input_fd >= 0)
|
||||||
{
|
|
||||||
if (scanner->peeked_char < 0)
|
|
||||||
{
|
{
|
||||||
register gint count;
|
register gint count;
|
||||||
|
register gchar *buffer;
|
||||||
|
|
||||||
|
buffer = scanner->buffer;
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
count = read (scanner->input_fd, &fchar, 1);
|
count = read (scanner->input_fd, buffer, READ_BUFFER_SIZE);
|
||||||
}
|
}
|
||||||
while (count == -1 &&
|
while (count == -1 && (errno == EINTR || errno == EAGAIN));
|
||||||
(errno == EINTR ||
|
|
||||||
errno == EAGAIN));
|
|
||||||
|
|
||||||
if (count != 1)
|
if (!count)
|
||||||
fchar = 0;
|
{
|
||||||
|
scanner->input_fd = -1;
|
||||||
|
|
||||||
scanner->peeked_char = fchar;
|
return 0;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
fchar = scanner->peeked_char;
|
{
|
||||||
|
scanner->text = buffer;
|
||||||
|
scanner->text_end = buffer + count;
|
||||||
|
|
||||||
|
return *buffer;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
fchar = 0;
|
return 0;
|
||||||
|
|
||||||
return fchar;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static guchar
|
static guchar
|
||||||
@ -704,37 +734,32 @@ g_scanner_get_char (GScanner *scanner,
|
|||||||
guint *line_p,
|
guint *line_p,
|
||||||
guint *position_p)
|
guint *position_p)
|
||||||
{
|
{
|
||||||
guchar fchar;
|
register guchar fchar;
|
||||||
|
|
||||||
if (scanner->text_len)
|
if (scanner->text < scanner->text_end)
|
||||||
{
|
|
||||||
fchar = *(scanner->text++);
|
fchar = *(scanner->text++);
|
||||||
scanner->text_len--;
|
|
||||||
}
|
|
||||||
else if (scanner->input_fd >= 0)
|
else if (scanner->input_fd >= 0)
|
||||||
{
|
|
||||||
if (scanner->peeked_char < 0)
|
|
||||||
{
|
{
|
||||||
register gint count;
|
register gint count;
|
||||||
|
register gchar *buffer;
|
||||||
|
|
||||||
|
buffer = scanner->buffer;
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
count = read (scanner->input_fd, &fchar, 1);
|
count = read (scanner->input_fd, buffer, READ_BUFFER_SIZE);
|
||||||
}
|
}
|
||||||
while (count == -1 &&
|
while (count == -1 && (errno == EINTR || errno == EAGAIN));
|
||||||
(errno == EINTR ||
|
|
||||||
errno == EAGAIN));
|
if (!count)
|
||||||
if (count != 1 || fchar == 0)
|
|
||||||
{
|
{
|
||||||
|
scanner->input_fd = -1;
|
||||||
fchar = 0;
|
fchar = 0;
|
||||||
scanner->peeked_char = 0;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
fchar = scanner->peeked_char;
|
scanner->text = buffer + 1;
|
||||||
if (fchar)
|
scanner->text_end = buffer + count;
|
||||||
scanner->peeked_char = -1;
|
fchar = *buffer;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -1049,27 +1074,6 @@ g_scanner_stat_mode (const gchar *filename)
|
|||||||
return st_mode;
|
return st_mode;
|
||||||
}
|
}
|
||||||
|
|
||||||
static 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
|
static void
|
||||||
g_scanner_get_token_i (GScanner *scanner,
|
g_scanner_get_token_i (GScanner *scanner,
|
||||||
GTokenType *token_p,
|
GTokenType *token_p,
|
||||||
@ -1132,22 +1136,20 @@ g_scanner_get_token_ll (GScanner *scanner,
|
|||||||
guint *position_p)
|
guint *position_p)
|
||||||
{
|
{
|
||||||
register GScannerConfig *config;
|
register GScannerConfig *config;
|
||||||
|
register GTokenType token;
|
||||||
register gboolean in_comment_multi;
|
register gboolean in_comment_multi;
|
||||||
register gboolean in_comment_single;
|
register gboolean in_comment_single;
|
||||||
register gboolean in_string_sq;
|
register gboolean in_string_sq;
|
||||||
register gboolean in_string_dq;
|
register gboolean in_string_dq;
|
||||||
static guchar ch;
|
|
||||||
register GTokenType token;
|
|
||||||
register GString *gstring;
|
register GString *gstring;
|
||||||
GTokenValue value;
|
GTokenValue value;
|
||||||
|
guchar ch;
|
||||||
|
|
||||||
config = scanner->config;
|
config = scanner->config;
|
||||||
(*value_p).v_int = 0;
|
(*value_p).v_int = 0;
|
||||||
|
|
||||||
if (scanner->token == G_TOKEN_EOF ||
|
if ((scanner->text >= scanner->text_end && scanner->input_fd < 0) ||
|
||||||
(!scanner->text_len &&
|
scanner->token == G_TOKEN_EOF)
|
||||||
(scanner->input_fd < 0 ||
|
|
||||||
scanner->peeked_char == 0)))
|
|
||||||
{
|
{
|
||||||
*token_p = G_TOKEN_EOF;
|
*token_p = G_TOKEN_EOF;
|
||||||
return;
|
return;
|
||||||
@ -1159,7 +1161,7 @@ g_scanner_get_token_ll (GScanner *scanner,
|
|||||||
in_string_dq = FALSE;
|
in_string_dq = FALSE;
|
||||||
gstring = NULL;
|
gstring = NULL;
|
||||||
|
|
||||||
do
|
do /* while (ch != 0) */
|
||||||
{
|
{
|
||||||
register gboolean dotted_float = FALSE;
|
register gboolean dotted_float = FALSE;
|
||||||
|
|
||||||
@ -1178,13 +1180,10 @@ g_scanner_get_token_ll (GScanner *scanner,
|
|||||||
|
|
||||||
switch (ch)
|
switch (ch)
|
||||||
{
|
{
|
||||||
register gboolean in_number;
|
|
||||||
static gchar *endptr;
|
|
||||||
|
|
||||||
case 0:
|
case 0:
|
||||||
token = G_TOKEN_EOF;
|
token = G_TOKEN_EOF;
|
||||||
(*position_p)++;
|
(*position_p)++;
|
||||||
ch = 0;
|
/* ch = 0; */
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case '/':
|
case '/':
|
||||||
@ -1388,39 +1387,37 @@ g_scanner_get_token_ll (GScanner *scanner,
|
|||||||
case '8':
|
case '8':
|
||||||
case '9':
|
case '9':
|
||||||
number_parsing:
|
number_parsing:
|
||||||
|
{
|
||||||
|
register gboolean in_number = TRUE;
|
||||||
|
gchar *endptr;
|
||||||
|
|
||||||
if (token == G_TOKEN_NONE)
|
if (token == G_TOKEN_NONE)
|
||||||
token = G_TOKEN_INT;
|
token = G_TOKEN_INT;
|
||||||
|
|
||||||
gstring = g_string_new (dotted_float ? "0." : "");
|
gstring = g_string_new (dotted_float ? "0." : "");
|
||||||
gstring = g_string_append_c (gstring, ch);
|
gstring = g_string_append_c (gstring, ch);
|
||||||
in_number = TRUE;
|
|
||||||
while (in_number)
|
do /* while (in_number) */
|
||||||
{
|
{
|
||||||
register gboolean is_E;
|
register gboolean is_E;
|
||||||
|
|
||||||
is_E = (ch == 'e' || ch == 'E') && token == G_TOKEN_FLOAT;
|
is_E = token == G_TOKEN_FLOAT && (ch == 'e' || ch == 'E');
|
||||||
|
|
||||||
ch = g_scanner_peek_next_char (scanner);
|
ch = g_scanner_peek_next_char (scanner);
|
||||||
|
|
||||||
if (g_scanner_char_2_num (ch, 36) >= 0 ||
|
if (g_scanner_char_2_num (ch, 36) >= 0 ||
|
||||||
(config->scan_float && ch == '.') ||
|
(config->scan_float && ch == '.') ||
|
||||||
(is_E && ch == '+') ||
|
(is_E && (ch == '+' || ch == '-')))
|
||||||
(is_E && ch == '-') )
|
{
|
||||||
ch = g_scanner_get_char (scanner, line_p, position_p);
|
ch = g_scanner_get_char (scanner, line_p, position_p);
|
||||||
else
|
|
||||||
in_number = FALSE;
|
|
||||||
|
|
||||||
if (in_number)
|
|
||||||
switch (ch)
|
switch (ch)
|
||||||
{
|
{
|
||||||
case '.':
|
case '.':
|
||||||
if (token != G_TOKEN_INT &&
|
if (token != G_TOKEN_INT && token != G_TOKEN_OCTAL)
|
||||||
token != G_TOKEN_OCTAL)
|
|
||||||
{
|
{
|
||||||
|
value.v_error = token == G_TOKEN_FLOAT ? G_ERR_FLOAT_MALFORMED : G_ERR_FLOAT_RADIX;
|
||||||
token = G_TOKEN_ERROR;
|
token = G_TOKEN_ERROR;
|
||||||
if (token == G_TOKEN_FLOAT)
|
|
||||||
value.v_error = G_ERR_FLOAT_MALFORMED;
|
|
||||||
else
|
|
||||||
value.v_error = G_ERR_FLOAT_RADIX;
|
|
||||||
in_number = FALSE;
|
in_number = FALSE;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -1487,6 +1484,11 @@ g_scanner_get_token_ll (GScanner *scanner,
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
in_number = FALSE;
|
||||||
|
}
|
||||||
|
while (in_number);
|
||||||
|
|
||||||
endptr = NULL;
|
endptr = NULL;
|
||||||
switch (token)
|
switch (token)
|
||||||
{
|
{
|
||||||
@ -1524,10 +1526,12 @@ g_scanner_get_token_ll (GScanner *scanner,
|
|||||||
g_string_free (gstring, TRUE);
|
g_string_free (gstring, TRUE);
|
||||||
gstring = NULL;
|
gstring = NULL;
|
||||||
ch = 0;
|
ch = 0;
|
||||||
|
} /* number_parsing:... */
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
default_case:
|
default_case:
|
||||||
|
{
|
||||||
if (config->cpair_comment_single &&
|
if (config->cpair_comment_single &&
|
||||||
ch == config->cpair_comment_single[0])
|
ch == config->cpair_comment_single[0])
|
||||||
{
|
{
|
||||||
@ -1589,16 +1593,15 @@ g_scanner_get_token_ll (GScanner *scanner,
|
|||||||
}
|
}
|
||||||
ch = 0;
|
ch = 0;
|
||||||
}
|
}
|
||||||
|
} /* default_case:... */
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
g_assert (ch == 0 && token != G_TOKEN_NONE);
|
g_assert (ch == 0 && token != G_TOKEN_NONE); /* paranoid */
|
||||||
}
|
}
|
||||||
while (ch != 0);
|
while (ch != 0);
|
||||||
|
|
||||||
if (in_comment_multi ||
|
if (in_comment_multi || in_comment_single ||
|
||||||
in_comment_single ||
|
in_string_sq || in_string_dq)
|
||||||
in_string_sq ||
|
|
||||||
in_string_dq)
|
|
||||||
{
|
{
|
||||||
token = G_TOKEN_ERROR;
|
token = G_TOKEN_ERROR;
|
||||||
if (gstring)
|
if (gstring)
|
||||||
@ -1609,7 +1612,7 @@ g_scanner_get_token_ll (GScanner *scanner,
|
|||||||
(*position_p)++;
|
(*position_p)++;
|
||||||
if (in_comment_multi || in_comment_single)
|
if (in_comment_multi || in_comment_single)
|
||||||
value.v_error = G_ERR_UNEXP_EOF_IN_COMMENT;
|
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;
|
value.v_error = G_ERR_UNEXP_EOF_IN_STRING;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1620,8 +1623,9 @@ g_scanner_get_token_ll (GScanner *scanner,
|
|||||||
gstring = NULL;
|
gstring = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (token == G_TOKEN_IDENTIFIER &&
|
if (token == G_TOKEN_IDENTIFIER)
|
||||||
config->scan_symbols)
|
{
|
||||||
|
if (config->scan_symbols)
|
||||||
{
|
{
|
||||||
register GScannerKey *key;
|
register GScannerKey *key;
|
||||||
register guint scope_id;
|
register guint scope_id;
|
||||||
@ -1667,6 +1671,7 @@ g_scanner_get_token_ll (GScanner *scanner,
|
|||||||
token = G_TOKEN_IDENTIFIER_NULL;
|
token = G_TOKEN_IDENTIFIER_NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
*token_p = token;
|
*token_p = token;
|
||||||
*value_p = value;
|
*value_p = value;
|
||||||
|
273
gscanner.c
273
gscanner.c
@ -42,6 +42,7 @@
|
|||||||
((guchar)(c)) \
|
((guchar)(c)) \
|
||||||
) \
|
) \
|
||||||
)
|
)
|
||||||
|
#define READ_BUFFER_SIZE (4000)
|
||||||
|
|
||||||
|
|
||||||
/* --- typedefs --- */
|
/* --- typedefs --- */
|
||||||
@ -103,9 +104,6 @@ static GScannerConfig g_scanner_config_template =
|
|||||||
|
|
||||||
/* --- prototypes --- */
|
/* --- prototypes --- */
|
||||||
static inline
|
static inline
|
||||||
gint g_scanner_char_2_num (guchar c,
|
|
||||||
guchar base);
|
|
||||||
static inline
|
|
||||||
GScannerKey* g_scanner_lookup_internal (GScanner *scanner,
|
GScannerKey* g_scanner_lookup_internal (GScanner *scanner,
|
||||||
guint scope_id,
|
guint scope_id,
|
||||||
const gchar *symbol);
|
const gchar *symbol);
|
||||||
@ -122,8 +120,6 @@ static void g_scanner_get_token_i (GScanner *scanner,
|
|||||||
GTokenValue *value_p,
|
GTokenValue *value_p,
|
||||||
guint *line_p,
|
guint *line_p,
|
||||||
guint *position_p);
|
guint *position_p);
|
||||||
static void g_scanner_free_value (GTokenType *token_p,
|
|
||||||
GTokenValue *value_p);
|
|
||||||
|
|
||||||
static guchar g_scanner_peek_next_char (GScanner *scanner);
|
static guchar g_scanner_peek_next_char (GScanner *scanner);
|
||||||
static guchar g_scanner_get_char (GScanner *scanner,
|
static guchar g_scanner_get_char (GScanner *scanner,
|
||||||
@ -135,7 +131,7 @@ static void g_scanner_msg_handler (GScanner *scanner,
|
|||||||
|
|
||||||
|
|
||||||
/* --- functions --- */
|
/* --- functions --- */
|
||||||
static gint
|
static inline gint
|
||||||
g_scanner_char_2_num (guchar c,
|
g_scanner_char_2_num (guchar c,
|
||||||
guchar base)
|
guchar base)
|
||||||
{
|
{
|
||||||
@ -209,10 +205,10 @@ g_scanner_new (GScannerConfig *config_templ)
|
|||||||
scanner->next_position = 0;
|
scanner->next_position = 0;
|
||||||
|
|
||||||
scanner->symbol_table = g_hash_table_new (g_scanner_key_hash, g_scanner_key_equal);
|
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->input_fd = -1;
|
||||||
scanner->peeked_char = -1;
|
scanner->text = NULL;
|
||||||
|
scanner->text_end = NULL;
|
||||||
|
scanner->buffer = NULL;
|
||||||
scanner->scope_id = 0;
|
scanner->scope_id = 0;
|
||||||
|
|
||||||
scanner->msg_handler = g_scanner_msg_handler;
|
scanner->msg_handler = g_scanner_msg_handler;
|
||||||
@ -220,6 +216,27 @@ g_scanner_new (GScannerConfig *config_templ)
|
|||||||
return scanner;
|
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
|
static void
|
||||||
g_scanner_destroy_symbol_table_entry (gpointer _key,
|
g_scanner_destroy_symbol_table_entry (gpointer _key,
|
||||||
gpointer _value,
|
gpointer _value,
|
||||||
@ -242,6 +259,7 @@ g_scanner_destroy (GScanner *scanner)
|
|||||||
g_scanner_free_value (&scanner->token, &scanner->value);
|
g_scanner_free_value (&scanner->token, &scanner->value);
|
||||||
g_scanner_free_value (&scanner->next_token, &scanner->next_value);
|
g_scanner_free_value (&scanner->next_token, &scanner->next_value);
|
||||||
g_free (scanner->config);
|
g_free (scanner->config);
|
||||||
|
g_free (scanner->buffer);
|
||||||
g_free (scanner);
|
g_free (scanner);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -306,43 +324,6 @@ 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
|
static gint
|
||||||
g_scanner_key_equal (gconstpointer v1,
|
g_scanner_key_equal (gconstpointer v1,
|
||||||
gconstpointer v2)
|
gconstpointer v2)
|
||||||
@ -662,41 +643,90 @@ g_scanner_eof (GScanner *scanner)
|
|||||||
return scanner->token == G_TOKEN_EOF;
|
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);
|
||||||
|
|
||||||
|
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;
|
||||||
|
|
||||||
|
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
|
static guchar
|
||||||
g_scanner_peek_next_char (GScanner *scanner)
|
g_scanner_peek_next_char (GScanner *scanner)
|
||||||
{
|
{
|
||||||
guchar fchar;
|
if (scanner->text < scanner->text_end)
|
||||||
|
|
||||||
if (scanner->text_len)
|
|
||||||
{
|
{
|
||||||
fchar = scanner->text[0];
|
return *scanner->text;
|
||||||
}
|
}
|
||||||
else if (scanner->input_fd >= 0)
|
else if (scanner->input_fd >= 0)
|
||||||
{
|
|
||||||
if (scanner->peeked_char < 0)
|
|
||||||
{
|
{
|
||||||
register gint count;
|
register gint count;
|
||||||
|
register gchar *buffer;
|
||||||
|
|
||||||
|
buffer = scanner->buffer;
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
count = read (scanner->input_fd, &fchar, 1);
|
count = read (scanner->input_fd, buffer, READ_BUFFER_SIZE);
|
||||||
}
|
}
|
||||||
while (count == -1 &&
|
while (count == -1 && (errno == EINTR || errno == EAGAIN));
|
||||||
(errno == EINTR ||
|
|
||||||
errno == EAGAIN));
|
|
||||||
|
|
||||||
if (count != 1)
|
if (!count)
|
||||||
fchar = 0;
|
{
|
||||||
|
scanner->input_fd = -1;
|
||||||
|
|
||||||
scanner->peeked_char = fchar;
|
return 0;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
fchar = scanner->peeked_char;
|
{
|
||||||
|
scanner->text = buffer;
|
||||||
|
scanner->text_end = buffer + count;
|
||||||
|
|
||||||
|
return *buffer;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
fchar = 0;
|
return 0;
|
||||||
|
|
||||||
return fchar;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static guchar
|
static guchar
|
||||||
@ -704,37 +734,32 @@ g_scanner_get_char (GScanner *scanner,
|
|||||||
guint *line_p,
|
guint *line_p,
|
||||||
guint *position_p)
|
guint *position_p)
|
||||||
{
|
{
|
||||||
guchar fchar;
|
register guchar fchar;
|
||||||
|
|
||||||
if (scanner->text_len)
|
if (scanner->text < scanner->text_end)
|
||||||
{
|
|
||||||
fchar = *(scanner->text++);
|
fchar = *(scanner->text++);
|
||||||
scanner->text_len--;
|
|
||||||
}
|
|
||||||
else if (scanner->input_fd >= 0)
|
else if (scanner->input_fd >= 0)
|
||||||
{
|
|
||||||
if (scanner->peeked_char < 0)
|
|
||||||
{
|
{
|
||||||
register gint count;
|
register gint count;
|
||||||
|
register gchar *buffer;
|
||||||
|
|
||||||
|
buffer = scanner->buffer;
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
count = read (scanner->input_fd, &fchar, 1);
|
count = read (scanner->input_fd, buffer, READ_BUFFER_SIZE);
|
||||||
}
|
}
|
||||||
while (count == -1 &&
|
while (count == -1 && (errno == EINTR || errno == EAGAIN));
|
||||||
(errno == EINTR ||
|
|
||||||
errno == EAGAIN));
|
if (!count)
|
||||||
if (count != 1 || fchar == 0)
|
|
||||||
{
|
{
|
||||||
|
scanner->input_fd = -1;
|
||||||
fchar = 0;
|
fchar = 0;
|
||||||
scanner->peeked_char = 0;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
fchar = scanner->peeked_char;
|
scanner->text = buffer + 1;
|
||||||
if (fchar)
|
scanner->text_end = buffer + count;
|
||||||
scanner->peeked_char = -1;
|
fchar = *buffer;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -1049,27 +1074,6 @@ g_scanner_stat_mode (const gchar *filename)
|
|||||||
return st_mode;
|
return st_mode;
|
||||||
}
|
}
|
||||||
|
|
||||||
static 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
|
static void
|
||||||
g_scanner_get_token_i (GScanner *scanner,
|
g_scanner_get_token_i (GScanner *scanner,
|
||||||
GTokenType *token_p,
|
GTokenType *token_p,
|
||||||
@ -1132,22 +1136,20 @@ g_scanner_get_token_ll (GScanner *scanner,
|
|||||||
guint *position_p)
|
guint *position_p)
|
||||||
{
|
{
|
||||||
register GScannerConfig *config;
|
register GScannerConfig *config;
|
||||||
|
register GTokenType token;
|
||||||
register gboolean in_comment_multi;
|
register gboolean in_comment_multi;
|
||||||
register gboolean in_comment_single;
|
register gboolean in_comment_single;
|
||||||
register gboolean in_string_sq;
|
register gboolean in_string_sq;
|
||||||
register gboolean in_string_dq;
|
register gboolean in_string_dq;
|
||||||
static guchar ch;
|
|
||||||
register GTokenType token;
|
|
||||||
register GString *gstring;
|
register GString *gstring;
|
||||||
GTokenValue value;
|
GTokenValue value;
|
||||||
|
guchar ch;
|
||||||
|
|
||||||
config = scanner->config;
|
config = scanner->config;
|
||||||
(*value_p).v_int = 0;
|
(*value_p).v_int = 0;
|
||||||
|
|
||||||
if (scanner->token == G_TOKEN_EOF ||
|
if ((scanner->text >= scanner->text_end && scanner->input_fd < 0) ||
|
||||||
(!scanner->text_len &&
|
scanner->token == G_TOKEN_EOF)
|
||||||
(scanner->input_fd < 0 ||
|
|
||||||
scanner->peeked_char == 0)))
|
|
||||||
{
|
{
|
||||||
*token_p = G_TOKEN_EOF;
|
*token_p = G_TOKEN_EOF;
|
||||||
return;
|
return;
|
||||||
@ -1159,7 +1161,7 @@ g_scanner_get_token_ll (GScanner *scanner,
|
|||||||
in_string_dq = FALSE;
|
in_string_dq = FALSE;
|
||||||
gstring = NULL;
|
gstring = NULL;
|
||||||
|
|
||||||
do
|
do /* while (ch != 0) */
|
||||||
{
|
{
|
||||||
register gboolean dotted_float = FALSE;
|
register gboolean dotted_float = FALSE;
|
||||||
|
|
||||||
@ -1178,13 +1180,10 @@ g_scanner_get_token_ll (GScanner *scanner,
|
|||||||
|
|
||||||
switch (ch)
|
switch (ch)
|
||||||
{
|
{
|
||||||
register gboolean in_number;
|
|
||||||
static gchar *endptr;
|
|
||||||
|
|
||||||
case 0:
|
case 0:
|
||||||
token = G_TOKEN_EOF;
|
token = G_TOKEN_EOF;
|
||||||
(*position_p)++;
|
(*position_p)++;
|
||||||
ch = 0;
|
/* ch = 0; */
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case '/':
|
case '/':
|
||||||
@ -1388,39 +1387,37 @@ g_scanner_get_token_ll (GScanner *scanner,
|
|||||||
case '8':
|
case '8':
|
||||||
case '9':
|
case '9':
|
||||||
number_parsing:
|
number_parsing:
|
||||||
|
{
|
||||||
|
register gboolean in_number = TRUE;
|
||||||
|
gchar *endptr;
|
||||||
|
|
||||||
if (token == G_TOKEN_NONE)
|
if (token == G_TOKEN_NONE)
|
||||||
token = G_TOKEN_INT;
|
token = G_TOKEN_INT;
|
||||||
|
|
||||||
gstring = g_string_new (dotted_float ? "0." : "");
|
gstring = g_string_new (dotted_float ? "0." : "");
|
||||||
gstring = g_string_append_c (gstring, ch);
|
gstring = g_string_append_c (gstring, ch);
|
||||||
in_number = TRUE;
|
|
||||||
while (in_number)
|
do /* while (in_number) */
|
||||||
{
|
{
|
||||||
register gboolean is_E;
|
register gboolean is_E;
|
||||||
|
|
||||||
is_E = (ch == 'e' || ch == 'E') && token == G_TOKEN_FLOAT;
|
is_E = token == G_TOKEN_FLOAT && (ch == 'e' || ch == 'E');
|
||||||
|
|
||||||
ch = g_scanner_peek_next_char (scanner);
|
ch = g_scanner_peek_next_char (scanner);
|
||||||
|
|
||||||
if (g_scanner_char_2_num (ch, 36) >= 0 ||
|
if (g_scanner_char_2_num (ch, 36) >= 0 ||
|
||||||
(config->scan_float && ch == '.') ||
|
(config->scan_float && ch == '.') ||
|
||||||
(is_E && ch == '+') ||
|
(is_E && (ch == '+' || ch == '-')))
|
||||||
(is_E && ch == '-') )
|
{
|
||||||
ch = g_scanner_get_char (scanner, line_p, position_p);
|
ch = g_scanner_get_char (scanner, line_p, position_p);
|
||||||
else
|
|
||||||
in_number = FALSE;
|
|
||||||
|
|
||||||
if (in_number)
|
|
||||||
switch (ch)
|
switch (ch)
|
||||||
{
|
{
|
||||||
case '.':
|
case '.':
|
||||||
if (token != G_TOKEN_INT &&
|
if (token != G_TOKEN_INT && token != G_TOKEN_OCTAL)
|
||||||
token != G_TOKEN_OCTAL)
|
|
||||||
{
|
{
|
||||||
|
value.v_error = token == G_TOKEN_FLOAT ? G_ERR_FLOAT_MALFORMED : G_ERR_FLOAT_RADIX;
|
||||||
token = G_TOKEN_ERROR;
|
token = G_TOKEN_ERROR;
|
||||||
if (token == G_TOKEN_FLOAT)
|
|
||||||
value.v_error = G_ERR_FLOAT_MALFORMED;
|
|
||||||
else
|
|
||||||
value.v_error = G_ERR_FLOAT_RADIX;
|
|
||||||
in_number = FALSE;
|
in_number = FALSE;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -1487,6 +1484,11 @@ g_scanner_get_token_ll (GScanner *scanner,
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
in_number = FALSE;
|
||||||
|
}
|
||||||
|
while (in_number);
|
||||||
|
|
||||||
endptr = NULL;
|
endptr = NULL;
|
||||||
switch (token)
|
switch (token)
|
||||||
{
|
{
|
||||||
@ -1524,10 +1526,12 @@ g_scanner_get_token_ll (GScanner *scanner,
|
|||||||
g_string_free (gstring, TRUE);
|
g_string_free (gstring, TRUE);
|
||||||
gstring = NULL;
|
gstring = NULL;
|
||||||
ch = 0;
|
ch = 0;
|
||||||
|
} /* number_parsing:... */
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
default_case:
|
default_case:
|
||||||
|
{
|
||||||
if (config->cpair_comment_single &&
|
if (config->cpair_comment_single &&
|
||||||
ch == config->cpair_comment_single[0])
|
ch == config->cpair_comment_single[0])
|
||||||
{
|
{
|
||||||
@ -1589,16 +1593,15 @@ g_scanner_get_token_ll (GScanner *scanner,
|
|||||||
}
|
}
|
||||||
ch = 0;
|
ch = 0;
|
||||||
}
|
}
|
||||||
|
} /* default_case:... */
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
g_assert (ch == 0 && token != G_TOKEN_NONE);
|
g_assert (ch == 0 && token != G_TOKEN_NONE); /* paranoid */
|
||||||
}
|
}
|
||||||
while (ch != 0);
|
while (ch != 0);
|
||||||
|
|
||||||
if (in_comment_multi ||
|
if (in_comment_multi || in_comment_single ||
|
||||||
in_comment_single ||
|
in_string_sq || in_string_dq)
|
||||||
in_string_sq ||
|
|
||||||
in_string_dq)
|
|
||||||
{
|
{
|
||||||
token = G_TOKEN_ERROR;
|
token = G_TOKEN_ERROR;
|
||||||
if (gstring)
|
if (gstring)
|
||||||
@ -1609,7 +1612,7 @@ g_scanner_get_token_ll (GScanner *scanner,
|
|||||||
(*position_p)++;
|
(*position_p)++;
|
||||||
if (in_comment_multi || in_comment_single)
|
if (in_comment_multi || in_comment_single)
|
||||||
value.v_error = G_ERR_UNEXP_EOF_IN_COMMENT;
|
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;
|
value.v_error = G_ERR_UNEXP_EOF_IN_STRING;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1620,8 +1623,9 @@ g_scanner_get_token_ll (GScanner *scanner,
|
|||||||
gstring = NULL;
|
gstring = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (token == G_TOKEN_IDENTIFIER &&
|
if (token == G_TOKEN_IDENTIFIER)
|
||||||
config->scan_symbols)
|
{
|
||||||
|
if (config->scan_symbols)
|
||||||
{
|
{
|
||||||
register GScannerKey *key;
|
register GScannerKey *key;
|
||||||
register guint scope_id;
|
register guint scope_id;
|
||||||
@ -1667,6 +1671,7 @@ g_scanner_get_token_ll (GScanner *scanner,
|
|||||||
token = G_TOKEN_IDENTIFIER_NULL;
|
token = G_TOKEN_IDENTIFIER_NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
*token_p = token;
|
*token_p = token;
|
||||||
*value_p = value;
|
*value_p = value;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user