summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog8
-rw-r--r--ChangeLog.pre-2-08
-rw-r--r--ChangeLog.pre-2-108
-rw-r--r--ChangeLog.pre-2-28
-rw-r--r--ChangeLog.pre-2-48
-rw-r--r--ChangeLog.pre-2-68
-rw-r--r--ChangeLog.pre-2-88
-rw-r--r--gtk/gtkrc.c1164
-rw-r--r--gtk/gtkrc.h17
9 files changed, 576 insertions, 661 deletions
diff --git a/ChangeLog b/ChangeLog
index df2c30f4c..3b1466863 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+Tue Dec 23 03:03:17 1997 Tim Janik <timj@psynet.net>
+
+ * gtk/gtkrc.h (gtk_rc_parse_string): new function.
+ * gtk/gtkrc.c: many functions adapted to use GScanner for scanning.
+ (gtk_rc_parse): use gtk_rc_parse_any for parsing.
+ (gtk_rc_parse_string): new function to support parsing from
+ strings, just calls gtk_rc_parse_any.
+ (gtk_rc_parse_any): new function using GScanner as lexer.
Thu Dec 18 23:46:11 CST 1997 Shawn T. Amundson <amundson@gimp.org>
diff --git a/ChangeLog.pre-2-0 b/ChangeLog.pre-2-0
index df2c30f4c..3b1466863 100644
--- a/ChangeLog.pre-2-0
+++ b/ChangeLog.pre-2-0
@@ -1,3 +1,11 @@
+Tue Dec 23 03:03:17 1997 Tim Janik <timj@psynet.net>
+
+ * gtk/gtkrc.h (gtk_rc_parse_string): new function.
+ * gtk/gtkrc.c: many functions adapted to use GScanner for scanning.
+ (gtk_rc_parse): use gtk_rc_parse_any for parsing.
+ (gtk_rc_parse_string): new function to support parsing from
+ strings, just calls gtk_rc_parse_any.
+ (gtk_rc_parse_any): new function using GScanner as lexer.
Thu Dec 18 23:46:11 CST 1997 Shawn T. Amundson <amundson@gimp.org>
diff --git a/ChangeLog.pre-2-10 b/ChangeLog.pre-2-10
index df2c30f4c..3b1466863 100644
--- a/ChangeLog.pre-2-10
+++ b/ChangeLog.pre-2-10
@@ -1,3 +1,11 @@
+Tue Dec 23 03:03:17 1997 Tim Janik <timj@psynet.net>
+
+ * gtk/gtkrc.h (gtk_rc_parse_string): new function.
+ * gtk/gtkrc.c: many functions adapted to use GScanner for scanning.
+ (gtk_rc_parse): use gtk_rc_parse_any for parsing.
+ (gtk_rc_parse_string): new function to support parsing from
+ strings, just calls gtk_rc_parse_any.
+ (gtk_rc_parse_any): new function using GScanner as lexer.
Thu Dec 18 23:46:11 CST 1997 Shawn T. Amundson <amundson@gimp.org>
diff --git a/ChangeLog.pre-2-2 b/ChangeLog.pre-2-2
index df2c30f4c..3b1466863 100644
--- a/ChangeLog.pre-2-2
+++ b/ChangeLog.pre-2-2
@@ -1,3 +1,11 @@
+Tue Dec 23 03:03:17 1997 Tim Janik <timj@psynet.net>
+
+ * gtk/gtkrc.h (gtk_rc_parse_string): new function.
+ * gtk/gtkrc.c: many functions adapted to use GScanner for scanning.
+ (gtk_rc_parse): use gtk_rc_parse_any for parsing.
+ (gtk_rc_parse_string): new function to support parsing from
+ strings, just calls gtk_rc_parse_any.
+ (gtk_rc_parse_any): new function using GScanner as lexer.
Thu Dec 18 23:46:11 CST 1997 Shawn T. Amundson <amundson@gimp.org>
diff --git a/ChangeLog.pre-2-4 b/ChangeLog.pre-2-4
index df2c30f4c..3b1466863 100644
--- a/ChangeLog.pre-2-4
+++ b/ChangeLog.pre-2-4
@@ -1,3 +1,11 @@
+Tue Dec 23 03:03:17 1997 Tim Janik <timj@psynet.net>
+
+ * gtk/gtkrc.h (gtk_rc_parse_string): new function.
+ * gtk/gtkrc.c: many functions adapted to use GScanner for scanning.
+ (gtk_rc_parse): use gtk_rc_parse_any for parsing.
+ (gtk_rc_parse_string): new function to support parsing from
+ strings, just calls gtk_rc_parse_any.
+ (gtk_rc_parse_any): new function using GScanner as lexer.
Thu Dec 18 23:46:11 CST 1997 Shawn T. Amundson <amundson@gimp.org>
diff --git a/ChangeLog.pre-2-6 b/ChangeLog.pre-2-6
index df2c30f4c..3b1466863 100644
--- a/ChangeLog.pre-2-6
+++ b/ChangeLog.pre-2-6
@@ -1,3 +1,11 @@
+Tue Dec 23 03:03:17 1997 Tim Janik <timj@psynet.net>
+
+ * gtk/gtkrc.h (gtk_rc_parse_string): new function.
+ * gtk/gtkrc.c: many functions adapted to use GScanner for scanning.
+ (gtk_rc_parse): use gtk_rc_parse_any for parsing.
+ (gtk_rc_parse_string): new function to support parsing from
+ strings, just calls gtk_rc_parse_any.
+ (gtk_rc_parse_any): new function using GScanner as lexer.
Thu Dec 18 23:46:11 CST 1997 Shawn T. Amundson <amundson@gimp.org>
diff --git a/ChangeLog.pre-2-8 b/ChangeLog.pre-2-8
index df2c30f4c..3b1466863 100644
--- a/ChangeLog.pre-2-8
+++ b/ChangeLog.pre-2-8
@@ -1,3 +1,11 @@
+Tue Dec 23 03:03:17 1997 Tim Janik <timj@psynet.net>
+
+ * gtk/gtkrc.h (gtk_rc_parse_string): new function.
+ * gtk/gtkrc.c: many functions adapted to use GScanner for scanning.
+ (gtk_rc_parse): use gtk_rc_parse_any for parsing.
+ (gtk_rc_parse_string): new function to support parsing from
+ strings, just calls gtk_rc_parse_any.
+ (gtk_rc_parse_any): new function using GScanner as lexer.
Thu Dec 18 23:46:11 CST 1997 Shawn T. Amundson <amundson@gimp.org>
diff --git a/gtk/gtkrc.c b/gtk/gtkrc.c
index 7ada4f336..9f4fc4ef1 100644
--- a/gtk/gtkrc.c
+++ b/gtk/gtkrc.c
@@ -8,7 +8,7 @@
*
* 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
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
@@ -16,24 +16,15 @@
* Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#include <ctype.h>
-#include <stdio.h>
-#include <stdlib.h>
+#include <unistd.h>
+#include <fcntl.h>
#include <string.h>
+#include <stdio.h>
#include "gtkrc.h"
enum {
- TOKEN_EOF,
- TOKEN_LEFT_CURLY,
- TOKEN_RIGHT_CURLY,
- TOKEN_LEFT_BRACE,
- TOKEN_RIGHT_BRACE,
- TOKEN_EQUAL_SIGN,
- TOKEN_COMMA,
- TOKEN_INTEGER,
- TOKEN_FLOAT,
- TOKEN_STRING,
- TOKEN_SYMBOL,
+ TOKEN_INVALID = G_TOKEN_LAST,
TOKEN_ACTIVE,
TOKEN_BASE,
TOKEN_BG,
@@ -87,39 +78,89 @@ struct _GtkRcSet
};
-static guint gtk_rc_style_hash (const char *name);
-static gint gtk_rc_style_compare (const char *a,
- const char *b);
-static GtkRcStyle* gtk_rc_style_find (const char *name);
-static GtkRcStyle* gtk_rc_styles_match (GSList *sets,
+static guint gtk_rc_style_hash (const char *name);
+static gint gtk_rc_style_compare (const char *a,
+ const char *b);
+static GtkRcStyle* gtk_rc_style_find (const char *name);
+static GtkRcStyle* gtk_rc_styles_match (GSList *sets,
+ const char *path);
+static gint gtk_rc_style_match (const char *set,
const char *path);
-static gint gtk_rc_style_match (const char *set,
- const char *path);
-static void gtk_rc_style_init (GtkRcStyle *rc_style);
-static gint gtk_rc_get_token (void);
-static gint gtk_rc_simple_token (char ch);
-static gint gtk_rc_symbol_token (const char *sym);
-static gint gtk_rc_get_next_token (void);
-static gint gtk_rc_peek_next_token (void);
-static gint gtk_rc_parse_statement (void);
-static gint gtk_rc_parse_style (void);
-static gint gtk_rc_parse_style_option (GtkRcStyle *rc_style);
-static gint gtk_rc_parse_base (GtkStyle *style);
-static gint gtk_rc_parse_bg (GtkStyle *style);
-static gint gtk_rc_parse_fg (GtkStyle *style);
-static gint gtk_rc_parse_bg_pixmap (GtkRcStyle *rc_style);
-static gint gtk_rc_parse_font (GtkRcStyle *rc_style);
-static gint gtk_rc_parse_fontset (GtkRcStyle *rc_style);
-static gint gtk_rc_parse_state (GtkStateType *state);
-static gint gtk_rc_parse_color (GdkColor *color);
-static gint gtk_rc_parse_pixmap_path (void);
-static void gtk_rc_parse_pixmap_path_string (gchar *pix_path);
-static char* gtk_rc_find_pixmap_in_path (gchar *pixmap_file);
-static gint gtk_rc_parse_widget_style (void);
-static gint gtk_rc_parse_widget_class_style (void);
-static char* gtk_rc_widget_path (GtkWidget *widget);
-static char* gtk_rc_widget_class_path (GtkWidget *widget);
-
+static void gtk_rc_style_init (GtkRcStyle *rc_style);
+static void gtk_rc_parse_any (const gchar *input_name,
+ gint input_fd,
+ const gchar *input_string);
+static gint gtk_rc_parse_statement (GScanner *scanner);
+static gint gtk_rc_parse_style (GScanner *scanner);
+static gint gtk_rc_parse_style_option (GScanner *scanner,
+ GtkRcStyle *rc_style);
+static gint gtk_rc_parse_base (GScanner *scanner,
+ GtkStyle *style);
+static gint gtk_rc_parse_bg (GScanner *scanner,
+ GtkStyle *style);
+static gint gtk_rc_parse_fg (GScanner *scanner,
+ GtkStyle *style);
+static gint gtk_rc_parse_bg_pixmap (GScanner *scanner,
+ GtkRcStyle *rc_style);
+static gint gtk_rc_parse_font (GScanner *scanner,
+ GtkRcStyle *rc_style);
+static gint gtk_rc_parse_fontset (GScanner *scanner,
+ GtkRcStyle *rc_style);
+static gint gtk_rc_parse_state (GScanner *scanner,
+ GtkStateType *state);
+static gint gtk_rc_parse_color (GScanner *scanner,
+ GdkColor *color);
+static gint gtk_rc_parse_pixmap_path (GScanner *scanner);
+static void gtk_rc_parse_pixmap_path_string (gchar *pix_path);
+static char* gtk_rc_find_pixmap_in_path (GScanner *scanner,
+ gchar *pixmap_file);
+static gint gtk_rc_parse_widget_style (GScanner *scanner);
+static gint gtk_rc_parse_widget_class_style (GScanner *scanner);
+static char* gtk_rc_widget_path (GtkWidget *widget);
+static char* gtk_rc_widget_class_path (GtkWidget *widget);
+
+
+static GScannerConfig gtk_rc_scanner_config =
+{
+ (
+ " \t\n"
+ ) /* cset_skip_characters */,
+ (
+ G_CSET_a_2_z
+ "_"
+ G_CSET_A_2_Z
+ ) /* cset_identifier_first */,
+ (
+ G_CSET_a_2_z
+ "_0123456789"
+ G_CSET_A_2_Z
+ G_CSET_LATINS
+ G_CSET_LATINC
+ ) /* cset_identifier_nth */,
+ ( "#\n" ) /* cpair_comment_single */,
+
+ TRUE /* case_sensitive */,
+
+ TRUE /* skip_comment_multi */,
+ TRUE /* skip_comment_single */,
+ TRUE /* scan_comment_multi */,
+ TRUE /* scan_identifier */,
+ FALSE /* scan_identifier_1char */,
+ FALSE /* scan_identifier_NULL */,
+ TRUE /* scan_symbols */,
+ TRUE /* scan_binary */,
+ TRUE /* scan_octal */,
+ TRUE /* scan_float */,
+ TRUE /* scan_hex */,
+ TRUE /* scan_hex_dollar */,
+ FALSE /* scan_string_sq */,
+ TRUE /* scan_string_dq */,
+ TRUE /* numbers_2_int */,
+ FALSE /* int_2_float */,
+ TRUE /* identifier_2_string */,
+ TRUE /* char_2_token */,
+ TRUE /* symbol_2_token */,
+};
static struct
{
@@ -144,40 +185,9 @@ static struct
{ "widget", TOKEN_WIDGET },
{ "widget_class", TOKEN_WIDGET_CLASS },
};
-
static int nsymbols = sizeof (symbols) / sizeof (symbols[0]);
-static struct
-{
- char ch;
- int token;
-} simple_tokens[] =
- {
- { '{', TOKEN_LEFT_CURLY },
- { '}', TOKEN_RIGHT_CURLY },
- { '[', TOKEN_LEFT_BRACE },
- { ']', TOKEN_RIGHT_BRACE },
- { '=', TOKEN_EQUAL_SIGN },
- { ',', TOKEN_COMMA },
- };
-
-static int nsimple_tokens = sizeof (simple_tokens) / sizeof (simple_tokens[0]);
-
-static FILE *input_fp = NULL;
-static char *buffer = NULL;
-static char *tokenbuf = NULL;
-static int position = 0;
-static int linenum = 1;
-static int buffer_size = 1024;
-static int tokenbuf_size = 1024;
-
static int done;
-static int cur_token;
-static int next_token;
-
-static char *token_str;
-static double token_float;
-static int token_int;
static GHashTable *rc_style_ht = NULL;
static GSList *widget_sets = NULL;
@@ -195,39 +205,27 @@ gtk_rc_init ()
}
void
-gtk_rc_parse (const char *filename)
+gtk_rc_parse_string (const gchar *rc_string)
{
- input_fp = fopen (filename, "r");
- if (!input_fp)
- return;
+ g_return_if_fail (rc_string != NULL);
- buffer = g_new (char, buffer_size + tokenbuf_size);
- tokenbuf = buffer + buffer_size;
- position = 0;
- linenum = 1;
+ gtk_rc_parse_any ("-", -1, rc_string);
+}
- cur_token = -1;
- next_token = -1;
- done = FALSE;
+void
+gtk_rc_parse (const gchar *filename)
+{
+ gint fd;
- while (!done)
- {
- if (gtk_rc_parse_statement () != PARSE_OK)
- {
- g_warning ("rc file parse error: \"%s\" line %d",
- filename, linenum);
- done = TRUE;
- }
- }
+ g_return_if_fail (filename != NULL);
- fclose (input_fp);
+ fd = open (filename, O_RDONLY);
+ if (fd < 0)
+ return;
- g_free (buffer);
+ gtk_rc_parse_any (filename, fd, NULL);
- buffer = NULL;
- tokenbuf = NULL;
- position = 0;
- linenum = 1;
+ close (fd);
}
GtkStyle*
@@ -235,7 +233,7 @@ gtk_rc_get_style (GtkWidget *widget)
{
GtkRcStyle *rc_style;
char *path;
-
+
if (widget_sets)
{
path = gtk_rc_widget_path (widget);
@@ -243,7 +241,7 @@ gtk_rc_get_style (GtkWidget *widget)
{
rc_style = gtk_rc_styles_match (widget_sets, path);
g_free (path);
-
+
if (rc_style)
{
gtk_rc_style_init (rc_style);
@@ -251,7 +249,7 @@ gtk_rc_get_style (GtkWidget *widget)
}
}
}
-
+
if (widget_class_sets)
{
path = gtk_rc_widget_class_path (widget);
@@ -259,7 +257,7 @@ gtk_rc_get_style (GtkWidget *widget)
{
rc_style = gtk_rc_styles_match (widget_class_sets, path);
g_free (path);
-
+
if (rc_style)
{
gtk_rc_style_init (rc_style);
@@ -267,35 +265,35 @@ gtk_rc_get_style (GtkWidget *widget)
}
}
}
-
+
return widget->style;
}
void
-gtk_rc_add_widget_name_style (GtkStyle *style,
- const char *pattern)
+gtk_rc_add_widget_name_style (GtkStyle *style,
+ const char *pattern)
{
GtkRcStyle *rc_style;
GtkRcSet *rc_set;
int i;
-
+
gtk_style_ref (style);
-
+
rc_style = g_new (GtkRcStyle, 1);
rc_style->initialize = FALSE;
rc_style->name = NULL;
rc_style->font_name = NULL;
rc_style->fontset_name = NULL;
-
+
for (i = 0; i < 5; i++)
rc_style->bg_pixmap_name[i] = NULL;
-
+
rc_style->style = style;
-
+
rc_set = g_new (GtkRcSet, 1);
rc_set->set = g_strdup (pattern);
rc_set->rc_style = rc_style;
-
+
widget_sets = g_slist_append (widget_sets, rc_set);
}
@@ -306,37 +304,84 @@ gtk_rc_add_widget_class_style (GtkStyle *style,
GtkRcStyle *rc_style;
GtkRcSet *rc_set;
int i;
-
+
gtk_style_ref (style);
-
+
rc_style = g_new (GtkRcStyle, 1);
rc_style->initialize = FALSE;
rc_style->name = NULL;
rc_style->font_name = NULL;
rc_style->fontset_name = NULL;
-
+
for (i = 0; i < 5; i++)
rc_style->bg_pixmap_name[i] = NULL;
-
+
rc_style->style = style;
-
+
rc_set = g_new (GtkRcSet, 1);
rc_set->set = g_strdup (pattern);
rc_set->rc_style = rc_style;
-
+
widget_class_sets = g_slist_append (widget_class_sets, rc_set);
}
+static void
+gtk_rc_parse_any (const gchar *input_name,
+ gint input_fd,
+ const gchar *input_string)
+{
+ GScanner *scanner;
+ guint i;
+
+ scanner = g_scanner_new (&gtk_rc_scanner_config);
+
+ if (input_fd >= 0)
+ {
+ g_assert (input_string == NULL);
+
+ g_scanner_input_file (scanner, input_fd);
+ }
+ else
+ {
+ g_assert (input_string != NULL);
+
+ g_scanner_input_text (scanner, input_string, strlen (input_string));
+ }
+
+ for (i = 0; i < nsymbols; i++)
+ g_scanner_add_symbol (scanner, symbols[i].name, (gpointer) symbols[i].token);
+
+ done = FALSE;
+ while (!done)
+ {
+ if (gtk_rc_parse_statement (scanner) != PARSE_OK)
+ {
+ if (scanner->next_token != G_TOKEN_NONE)
+ g_scanner_get_next_token (scanner);
+
+ if (input_string)
+ g_warning ("rc string parse error: line %d",
+ scanner->line);
+ else
+ g_warning ("rc file parse error: \"%s\" line %d",
+ input_name,
+ scanner->line);
+
+ done = TRUE;
+ }
+ }
+ g_scanner_destroy (scanner);
+}
static guint
gtk_rc_style_hash (const char *name)
{
guint result;
-
+
result = 0;
while (*name)
result += (result << 3) + *name++;
-
+
return result;
}
@@ -351,27 +396,27 @@ static GtkRcStyle*
gtk_rc_style_find (const char *name)
{
GtkRcStyle *rc_style;
-
+
rc_style = g_hash_table_lookup (rc_style_ht, (gpointer) name);
-
+
return rc_style;
}
static GtkRcStyle*
-gtk_rc_styles_match (GSList *sets,
- const char *path)
+gtk_rc_styles_match (GSList *sets,
+ const char *path)
{
GtkRcSet *rc_set;
-
+
while (sets)
{
rc_set = sets->data;
sets = sets->next;
-
+
if (gtk_rc_style_match (rc_set->set, path))
return rc_set->rc_style;
}
-
+
return NULL;
}
@@ -380,40 +425,40 @@ gtk_rc_style_match (const char *set,
const char *path)
{
char ch;
-
+
while (1)
{
ch = *set++;
if (ch == '\0')
return (*path == '\0');
-
+
switch (ch)
{
case '*':
while (*set == '*')
set++;
-
+
ch = *set++;
if (ch == '\0')
return TRUE;
-
+
while (*path)
{
while (*path && (ch != *path))
path++;
-
+
if (!(*path))
return FALSE;
-
+
path++;
if (gtk_rc_style_match (set, path))
return TRUE;
}
break;
-
+
case '?':
break;
-
+
default:
if (ch == *path)
path++;
@@ -422,7 +467,7 @@ gtk_rc_style_match (const char *set,
break;
}
}
-
+
return TRUE;
}
@@ -431,11 +476,11 @@ gtk_rc_style_init (GtkRcStyle *rc_style)
{
GdkFont *old_font;
gint i;
-
+
if (rc_style->initialize)
{
rc_style->initialize = FALSE;
-
+
if (rc_style->fontset_name)
{
old_font = rc_style->style->font;
@@ -454,7 +499,7 @@ gtk_rc_style_init (GtkRcStyle *rc_style)
else
rc_style->style->font = old_font;
}
-
+
for (i = 0; i < 5; i++)
if (rc_style->bg_pixmap_name[i])
{
@@ -469,226 +514,37 @@ gtk_rc_style_init (GtkRcStyle *rc_style)
}
static gint
-gtk_rc_get_token ()
-{
- int tokenpos;
- int state;
- int count;
- int token;
- int hex_number = FALSE;
- int float_number = FALSE;
- char ch;
-
- tokenpos = 0;
- state = PARSE_START;
-
- while (1)
- {
- if (position >= (buffer_size - 1))
- position = 0;
- if (!position || (buffer[position] == '\0'))
- {
- count = fread (buffer, sizeof (char), buffer_size - 1, input_fp);
- if ((count == 0) && feof (input_fp))
- return TOKEN_EOF;
- buffer[count] = '\0';
- }
-
- ch = buffer[position++];
- if (ch == '\n')
- linenum += 1;
-
- switch (state)
- {
- case PARSE_START:
- token = gtk_rc_simple_token (ch);
-
- if (token)
- return token;
- else if (ch == '#')
- state = PARSE_COMMENT;
- else if (ch == '"')
- state = PARSE_STRING;
- else if ((ch == ' ') || (ch == '\t') || (ch == '\n'))
- break;
- else if (ch == '.')
- {
- hex_number = FALSE;
- float_number = TRUE;
- tokenbuf[tokenpos++] = ch;
- state = PARSE_NUMBER;
- }
- else if ((ch == '$') || (ch == '#'))
- {
- hex_number = TRUE;
- float_number = FALSE;
- state = PARSE_NUMBER;
- }
- else if (isdigit (ch))
- {
- hex_number = FALSE;
- float_number = FALSE;
- tokenbuf[tokenpos++] = ch;
- state = PARSE_NUMBER;
- }
- else
- {
- tokenbuf[tokenpos++] = ch;
- state = PARSE_SYMBOL;
- }
- break;
-
- case PARSE_COMMENT:
- if (ch == '\n')
- state = PARSE_START;
- break;
-
- case PARSE_STRING:
- if (ch != '"')
- {
- tokenbuf[tokenpos++] = ch;
- }
- else
- {
- tokenbuf[tokenpos] = '\0';
- token_str = tokenbuf;
- return TOKEN_STRING;
- }
- break;
-
- case PARSE_SYMBOL:
- if ((ch != ' ') && (ch != '\t') && (ch != '\n') &&
- (gtk_rc_simple_token (ch) == 0))
- {
- tokenbuf[tokenpos++] = ch;
- }
- else
- {
- position -= 1;
- tokenbuf[tokenpos] = '\0';
- token_str = tokenbuf;
- return gtk_rc_symbol_token (tokenbuf);
- }
- break;
-
- case PARSE_NUMBER:
- if (isdigit (ch) || (hex_number && isxdigit (ch)))
- {
- tokenbuf[tokenpos++] = ch;
- }
- else if (!hex_number && !float_number && (ch == '.'))
- {
- float_number = TRUE;
- tokenbuf[tokenpos++] = ch;
- }
- else if (!float_number &&
- (ch == 'x') && (tokenpos == 1) &&
- (tokenbuf[0] == '0'))
- {
- hex_number = TRUE;
- tokenpos = 0;
- }
- else
- {
- position -= 1;
- tokenbuf[tokenpos] = '\0';
- if (float_number)
- {
- sscanf (tokenbuf, "%lf", &token_float);
- return TOKEN_FLOAT;
- }
- else
- {
- sscanf (tokenbuf, (hex_number ? "%x" : "%d"), &token_int);
- return TOKEN_INTEGER;
- }
- }
- break;
- }
- }
-}
-
-static gint
-gtk_rc_simple_token (char ch)
-{
- gint i;
-
- for (i = 0; i < nsimple_tokens; i++)
- if (simple_tokens[i].ch == ch)
- return simple_tokens[i].token;
-
- return 0;
-}
-
-static gint
-gtk_rc_symbol_token (const char *sym)
-{
- gint i;
-
- for (i = 0; i < nsymbols; i++)
- if (strcmp (symbols[i].name, sym) == 0)
- return symbols[i].token;
-
- return TOKEN_STRING;
-}
-
-static gint
-gtk_rc_get_next_token ()
-{
- if (next_token != -1)
- {
- cur_token = next_token;
- next_token = -1;
- }
- else
- {
- cur_token = gtk_rc_get_token ();
- }
-
- return cur_token;
-}
-
-static gint
-gtk_rc_peek_next_token ()
-{
- if (next_token == -1)
- next_token = gtk_rc_get_token ();
-
- return next_token;
-}
-
-static gint
-gtk_rc_parse_statement ()
+gtk_rc_parse_statement (GScanner *scanner)
{
gint token;
gint error;
-
- token = gtk_rc_peek_next_token ();
- if (!token)
+
+ token = g_scanner_peek_next_token (scanner);
+ if (token == G_TOKEN_EOF)
{
done = TRUE;
return PARSE_OK;
}
-
- error = gtk_rc_parse_style ();
+
+ error = gtk_rc_parse_style (scanner);
if (error != PARSE_SYNTAX)
return error;
-
- error = gtk_rc_parse_pixmap_path ();
+
+ error = gtk_rc_parse_pixmap_path (scanner);
if (error != PARSE_SYNTAX)
return error;
-
- error = gtk_rc_parse_widget_style ();
+
+ error = gtk_rc_parse_widget_style (scanner);
if (error != PARSE_SYNTAX)
return error;
-
- error = gtk_rc_parse_widget_class_style ();
-
+
+ error = gtk_rc_parse_widget_class_style (scanner);
+
return error;
}
static gint
-gtk_rc_parse_style ()
+gtk_rc_parse_style (GScanner *scanner)
{
GtkRcStyle *rc_style;
GtkRcStyle *parent_style;
@@ -696,44 +552,44 @@ gtk_rc_parse_style ()
gint error;
gint insert;
gint i;
-
- token = gtk_rc_peek_next_token ();
- if (!token)
+
+ token = g_scanner_peek_next_token (scanner);
+ if (token == G_TOKEN_EOF || token == G_TOKEN_ERROR)
return PARSE_ERROR;
if (token != TOKEN_STYLE)
return PARSE_SYNTAX;
- token = gtk_rc_get_next_token ();
-
- token = gtk_rc_get_next_token ();
- if (!token || (token != TOKEN_STRING))
+ token = g_scanner_get_next_token (scanner);
+
+ token = g_scanner_get_next_token (scanner);
+ if (token != G_TOKEN_STRING)
return PARSE_ERROR;
-
+
insert = FALSE;
- rc_style = g_hash_table_lookup (rc_style_ht, token_str);
-
+ rc_style = g_hash_table_lookup (rc_style_ht, scanner->value.v_string);
+
if (!rc_style)
{
insert = TRUE;
rc_style = g_new (GtkRcStyle, 1);
rc_style->initialize = TRUE;
- rc_style->name = g_strdup (token_str);
+ rc_style->name = g_strdup (scanner->value.v_string);
rc_style->font_name = NULL;
rc_style->fontset_name = NULL;
-
+
for (i = 0; i < 5; i++)
rc_style->bg_pixmap_name[i] = NULL;
-
+
rc_style->style = gtk_style_new ();
gtk_style_ref (rc_style->style);
}
-
- token = gtk_rc_peek_next_token ();
- if (token == TOKEN_EQUAL_SIGN)
+
+ token = g_scanner_peek_next_token (scanner);
+ if (token == G_TOKEN_EQUAL_SIGN)
{
- token = gtk_rc_get_next_token ();
-
- token = gtk_rc_get_next_token ();
- if (!token || (token != TOKEN_STRING))
+ token = g_scanner_get_next_token (scanner);
+
+ token = g_scanner_get_next_token (scanner);
+ if (token != G_TOKEN_STRING)
{
if (insert)
{
@@ -742,8 +598,8 @@ gtk_rc_parse_style ()
}
return PARSE_ERROR;
}
-
- parent_style = g_hash_table_lookup (rc_style_ht, token_str);
+
+ parent_style = g_hash_table_lookup (rc_style_ht, scanner->value.v_string);
if (parent_style)
{
for (i = 0; i < 5; i++)
@@ -756,10 +612,10 @@ gtk_rc_parse_style ()
rc_style->style->text[i] = parent_style->style->text[i];
rc_style->style->base[i] = parent_style->style->base[i];
}
-
+
rc_style->style->black = parent_style->style->black;
rc_style->style->white = parent_style->style->white;
-
+
if (rc_style->fontset_name)
{
g_free (rc_style->fontset_name);
@@ -770,7 +626,7 @@ gtk_rc_parse_style ()
g_free (rc_style->font_name);
rc_style->font_name = g_strdup (parent_style->font_name);
}
-
+
for (i = 0; i < 5; i++)
{
if (rc_style->bg_pixmap_name[i])
@@ -779,9 +635,9 @@ gtk_rc_parse_style ()
}
}
}
-
- token = gtk_rc_get_next_token ();
- if (!token || (token != TOKEN_LEFT_CURLY))
+
+ token = g_scanner_get_next_token (scanner);
+ if (token != G_TOKEN_LEFT_CURLY)
{
if (insert)
{
@@ -790,10 +646,10 @@ gtk_rc_parse_style ()
}
return PARSE_ERROR;
}
-
+
while (1)
{
- error = gtk_rc_parse_style_option (rc_style);
+ error = gtk_rc_parse_style_option (scanner, rc_style);
if (error == PARSE_SYNTAX)
break;
if (error == PARSE_ERROR)
@@ -806,9 +662,9 @@ gtk_rc_parse_style ()
return error;
}
}
-
- token = gtk_rc_get_next_token ();
- if (!token || (token != TOKEN_RIGHT_CURLY))
+
+ token = g_scanner_get_next_token (scanner);
+ if (token != G_TOKEN_RIGHT_CURLY)
{
if (insert)
{
@@ -816,276 +672,285 @@ gtk_rc_parse_style ()
g_free (rc_style->fontset_name);
else if (rc_style->font_name)
g_free (rc_style->font_name);
-
+
for (i = 0; i < 5; i++)
if (rc_style->bg_pixmap_name[i])
g_free (rc_style->bg_pixmap_name[i]);
-
+
gtk_style_unref (rc_style->style);
g_free (rc_style);
}
return PARSE_ERROR;
}
-
+
if (insert)
g_hash_table_insert (rc_style_ht, rc_style->name, rc_style);
-
+
return PARSE_OK;
}
static gint
-gtk_rc_parse_style_option (GtkRcStyle *rc_style)
+gtk_rc_parse_style_option (GScanner *scanner,
+ GtkRcStyle *rc_style)
{
gint token;
gint error;
-
- token = gtk_rc_peek_next_token ();
- if (!token)
+
+ token = g_scanner_peek_next_token (scanner);
+ if (token == G_TOKEN_EOF || token == G_TOKEN_ERROR)
return PARSE_ERROR;
-
- error = gtk_rc_parse_base (rc_style->style);
+
+ error = gtk_rc_parse_base (scanner, rc_style->style);
if (error != PARSE_SYNTAX)
return error;
-
- error = gtk_rc_parse_bg (rc_style->style);
+
+ error = gtk_rc_parse_bg (scanner, rc_style->style);
if (error != PARSE_SYNTAX)
return error;
-
- error = gtk_rc_parse_fg (rc_style->style);
+
+ error = gtk_rc_parse_fg (scanner, rc_style->style);
if (error != PARSE_SYNTAX)
return error;
-
- error = gtk_rc_parse_bg_pixmap (rc_style);
+
+ error = gtk_rc_parse_bg_pixmap (scanner, rc_style);
if (error != PARSE_SYNTAX)
return error;
-
- error = gtk_rc_parse_font (rc_style);
+
+ error = gtk_rc_parse_font (scanner, rc_style);
if (error != PARSE_SYNTAX)
return error;
-
- error = gtk_rc_parse_fontset (rc_style);
-
+
+ error = gtk_rc_parse_fontset (scanner, rc_style);
+
return error;
}
static gint
-gtk_rc_parse_base (GtkStyle *style)
+gtk_rc_parse_base (GScanner *scanner,
+ GtkStyle *style)
{
GtkStateType state;
gint token;
gint error;
-
- token = gtk_rc_peek_next_token ();
- if (!token)
+
+ token = g_scanner_peek_next_token (scanner);
+ if (token == G_TOKEN_EOF || token == G_TOKEN_ERROR)
return PARSE_ERROR;
if (token != TOKEN_BASE)
return PARSE_SYNTAX;
- token = gtk_rc_get_next_token ();
-
- error = gtk_rc_parse_state (&state);
+ token = g_scanner_get_next_token (scanner);
+
+ error = gtk_rc_parse_state (scanner, &state);
if (error != PARSE_OK)
return error;
-
- token = gtk_rc_get_next_token ();
- if (!token || (token != TOKEN_EQUAL_SIGN))
+
+ token = g_scanner_get_next_token (scanner);
+ if (token != G_TOKEN_EQUAL_SIGN)
return PARSE_ERROR;
-
- error = gtk_rc_parse_color (&style->base[state]);
-
+
+ error = gtk_rc_parse_color (scanner, &style->base[state]);
+
return error;
}
static gint
-gtk_rc_parse_bg (GtkStyle *style)
+gtk_rc_parse_bg (GScanner *scanner,
+ GtkStyle *style)
{
GtkStateType state;
gint token;
gint error;
-
- token = gtk_rc_peek_next_token ();
- if (!token)
+
+ token = g_scanner_peek_next_token (scanner);
+ if (token == G_TOKEN_EOF || token == G_TOKEN_ERROR)
return PARSE_ERROR;
if (token != TOKEN_BG)
return PARSE_SYNTAX;
- token = gtk_rc_get_next_token ();
-
- error = gtk_rc_parse_state (&state);
+ token = g_scanner_get_next_token (scanner);
+
+ error = gtk_rc_parse_state (scanner, &state);
if (error != PARSE_OK)
return error;
-
- token = gtk_rc_get_next_token ();
- if (!token || (token != TOKEN_EQUAL_SIGN))
+
+ token = g_scanner_get_next_token (scanner);
+ if (token != G_TOKEN_EQUAL_SIGN)
return PARSE_ERROR;
-
- error = gtk_rc_parse_color (&style->bg[state]);
-
+
+ error = gtk_rc_parse_color (scanner, &style->bg[state]);
+
return error;
}
static gint
-gtk_rc_parse_fg (GtkStyle *style)
+gtk_rc_parse_fg (GScanner *scanner,
+ GtkStyle *style)
{
GtkStateType state;
gint token;
gint error;
-
- token = gtk_rc_peek_next_token ();
- if (!token)
+
+ token = g_scanner_peek_next_token (scanner);
+ if (token == G_TOKEN_EOF || token == G_TOKEN_ERROR)
return PARSE_ERROR;
if (token != TOKEN_FG)
return PARSE_SYNTAX;
- token = gtk_rc_get_next_token ();
-
- error = gtk_rc_parse_state (&state);
+ token = g_scanner_get_next_token (scanner);
+
+ error = gtk_rc_parse_state (scanner, &state);
if (error != PARSE_OK)
return error;
-
- token = gtk_rc_get_next_token ();
- if (!token || (token != TOKEN_EQUAL_SIGN))
+
+ token = g_scanner_get_next_token (scanner);
+ if (token != G_TOKEN_EQUAL_SIGN)
return PARSE_ERROR;
-
- error = gtk_rc_parse_color (&style->fg[state]);
-
+
+ error = gtk_rc_parse_color (scanner, &style->fg[state]);
+
return error;
}
static gint
-gtk_rc_parse_bg_pixmap (GtkRcStyle *rc_style)
+gtk_rc_parse_bg_pixmap (GScanner *scanner,
+ GtkRcStyle *rc_style)
{
GtkStateType state;
gint token;
gint error;
gchar *pixmap_file;
-
- token = gtk_rc_peek_next_token ();
- if (!token)
+
+ token = g_scanner_peek_next_token (scanner);
+ if (token == G_TOKEN_EOF || token == G_TOKEN_ERROR)
return PARSE_ERROR;
if (token != TOKEN_BG_PIXMAP)
return PARSE_SYNTAX;
- token = gtk_rc_get_next_token ();
-
- error = gtk_rc_parse_state (&state);
+ token = g_scanner_get_next_token (scanner);
+
+ error = gtk_rc_parse_state (scanner, &state);
if (error != PARSE_OK)
return error;
-
- token = gtk_rc_get_next_token ();
- if (!token || (token != TOKEN_EQUAL_SIGN))
+
+ token = g_scanner_get_next_token (scanner);
+ if (token != G_TOKEN_EQUAL_SIGN)
return PARSE_ERROR;
-
- token = gtk_rc_get_next_token ();
- if (!token || (token != TOKEN_STRING))
+
+ token = g_scanner_get_next_token (scanner);
+ if (token != G_TOKEN_STRING)
return PARSE_ERROR;
-
- if (strcmp (token_str, "<parent>"))
- pixmap_file = gtk_rc_find_pixmap_in_path (token_str);
+
+ if (strcmp (scanner->value.v_string, "<parent>"))
+ pixmap_file = gtk_rc_find_pixmap_in_path (scanner, scanner->value.v_string);
else
- pixmap_file = g_strdup(token_str);
-
+ pixmap_file = g_strdup (scanner->value.v_string);
+
if (pixmap_file)
{
if (rc_style->bg_pixmap_name[state])
g_free (rc_style->bg_pixmap_name[state]);
rc_style->bg_pixmap_name[state] = pixmap_file;
}
-
+
return PARSE_OK;
}
static char*
-gtk_rc_find_pixmap_in_path (gchar *pixmap_file)
+gtk_rc_find_pixmap_in_path (GScanner *scanner,
+ gchar *pixmap_file)
{
gint i;
- FILE *fp;
+ gint fd;
gchar *buf;
-
+
for (i = 0; (i < GTK_RC_MAX_PIXMAP_PATHS) && (pixmap_path[i] != NULL); i++)
{
buf = g_malloc (strlen (pixmap_path[i]) + strlen (pixmap_file) + 2);
sprintf (buf, "%s%c%s", pixmap_path[i], '/', pixmap_file);
-
- fp = fopen (buf, "r");
- if (fp)
+
+ fd = open (buf, O_RDONLY);
+ if (fd >= 0)
{
- fclose (fp);
+ close (fd);
return buf;
}
-
+
g_free (buf);
}
-
+
g_warning ("Unable to locate image file in pixmap_path: \"%s\" line %d",
- pixmap_file, linenum);
-
+ pixmap_file, scanner->line);
+
return NULL;
}
static gint
-gtk_rc_parse_font (GtkRcStyle *rc_style)
+gtk_rc_parse_font (GScanner *scanner,
+ GtkRcStyle *rc_style)
{
gint token;
-
- token = gtk_rc_peek_next_token ();
- if (!token)
+
+ token = g_scanner_peek_next_token (scanner);
+ if (token == G_TOKEN_EOF || token == G_TOKEN_ERROR)
return PARSE_ERROR;
if (token != TOKEN_FONT)
return PARSE_SYNTAX;
- token = gtk_rc_get_next_token ();
-
- token = gtk_rc_get_next_token ();
- if (!token || (token != TOKEN_EQUAL_SIGN))
+ token = g_scanner_get_next_token (scanner);
+
+ token = g_scanner_get_next_token (scanner);
+ if (token != G_TOKEN_EQUAL_SIGN)
return PARSE_ERROR;
-
- token = gtk_rc_get_next_token ();
- if (!token || (token != TOKEN_STRING))
+
+ token = g_scanner_get_next_token (scanner);
+ if (token != G_TOKEN_STRING)
return PARSE_ERROR;
-
+
if (rc_style->font_name)
g_free (rc_style->font_name);
- rc_style->font_name = g_strdup (token_str);
-
+ rc_style->font_name = g_strdup (scanner->value.v_string);
+
return PARSE_OK;
}
static gint
-gtk_rc_parse_fontset (GtkRcStyle *rc_style)
+gtk_rc_parse_fontset (GScanner *scanner,
+ GtkRcStyle *rc_style)
{
gint token;
-
- token = gtk_rc_peek_next_token ();
- if (!token)
+
+ token = g_scanner_peek_next_token (scanner);
+ if (token == G_TOKEN_EOF || token == G_TOKEN_ERROR)
return PARSE_ERROR;
if (token != TOKEN_FONTSET)
return PARSE_SYNTAX;
- token = gtk_rc_get_next_token ();
-
- token = gtk_rc_get_next_token ();
- if (!token || (token != TOKEN_EQUAL_SIGN))
+ token = g_scanner_get_next_token (scanner);
+
+ token = g_scanner_get_next_token (scanner);
+ if (token != G_TOKEN_EQUAL_SIGN)
return PARSE_ERROR;
-
- token = gtk_rc_get_next_token ();
- if (!token || (token != TOKEN_STRING))
+
+ token = g_scanner_get_next_token (scanner);
+ if (token != G_TOKEN_STRING)
return PARSE_ERROR;
-
+
if (rc_style->fontset_name)
g_free (rc_style->fontset_name);
- rc_style->fontset_name = g_strdup (token_str);
-
+ rc_style->fontset_name = g_strdup (scanner->value.v_string);
+
return PARSE_OK;
}
static gint
-gtk_rc_parse_state (GtkStateType *state)
+gtk_rc_parse_state (GScanner *scanner,
+ GtkStateType *state)
{
gint token;
-
- token = gtk_rc_peek_next_token ();
- if (!token)
+
+ token = g_scanner_peek_next_token (scanner);
+ if (token == G_TOKEN_EOF || token == G_TOKEN_ERROR)
return PARSE_ERROR;
- if (token != TOKEN_LEFT_BRACE)
+ if (token != G_TOKEN_LEFT_BRACE)
return PARSE_SYNTAX;
- token = gtk_rc_get_next_token ();
-
- token = gtk_rc_get_next_token ();
+ token = g_scanner_get_next_token (scanner);
+
+ token = g_scanner_get_next_token (scanner);
if (token == TOKEN_ACTIVE)
*state = GTK_STATE_ACTIVE;
else if (token == TOKEN_INSENSITIVE)
@@ -1098,116 +963,106 @@ gtk_rc_parse_state (GtkStateType *state)
*state = GTK_STATE_SELECTED;
else
return PARSE_ERROR;
-
- token = gtk_rc_get_next_token ();
- if (!token || (token != TOKEN_RIGHT_BRACE))
+
+ token = g_scanner_get_next_token (scanner);
+ if (token != G_TOKEN_RIGHT_BRACE)
return PARSE_ERROR;
-
+
return PARSE_OK;
}
static gint
-gtk_rc_parse_color (GdkColor *color)
+gtk_rc_parse_color (GScanner *scanner,
+ GdkColor *color)
{
gint token;
+ gint token_int;
gint length;
gint temp;
gchar buf[9];
gint i, j;
-
- token = gtk_rc_peek_next_token ();
- if (!token)
+
+ token = g_scanner_peek_next_token (scanner);
+ if (token == G_TOKEN_EOF || token == G_TOKEN_ERROR)
return PARSE_ERROR;
-
+
switch (token)
{
- case TOKEN_LEFT_CURLY:
- token = gtk_rc_get_next_token ();
-
- token = gtk_rc_get_next_token ();
- if (!token || ((token != TOKEN_INTEGER) && (token != TOKEN_FLOAT)))
+ case G_TOKEN_LEFT_CURLY:
+ token = g_scanner_get_next_token (scanner);
+
+ token = g_scanner_get_next_token (scanner);
+ if (token == G_TOKEN_INT)
+ token_int = scanner->value.v_int;
+ else if (token == G_TOKEN_FLOAT)
+ token_int = scanner->value.v_float * 65535.0;
+ else
return PARSE_ERROR;
-
- if (token == TOKEN_FLOAT)
- token_int = token_float * 65535.0;
- if (token_int < 0)
- token_int = 0;
- if (token_int > 65535)
- token_int = 65535;
-
- color->red = token_int;
-
- token = gtk_rc_get_next_token ();
- if (!token || (token != TOKEN_COMMA))
+ color->red = CLAMP (token_int, 0, 65535);
+
+ token = g_scanner_get_next_token (scanner);
+ if (token != G_TOKEN_COMMA)
return PARSE_ERROR;
-
- token = gtk_rc_get_next_token ();
- if (!token || ((token != TOKEN_INTEGER) && (token != TOKEN_FLOAT)))
+
+ token = g_scanner_get_next_token (scanner);
+ if (token == G_TOKEN_INT)
+ token_int = scanner->value.v_int;
+ else if (token == G_TOKEN_FLOAT)
+ token_int = scanner->value.v_float * 65535.0;
+ else
return PARSE_ERROR;
-
- if (token == TOKEN_FLOAT)
- token_int = token_float * 65535.0;
- if (token_int < 0)
- token_int = 0;
- if (token_int > 65535)
- token_int = 65535;
-
- color->green = token_int;
-
- token = gtk_rc_get_next_token ();
- if (!token || (token != TOKEN_COMMA))
+ color->green = CLAMP (token_int, 0, 65535);
+
+ token = g_scanner_get_next_token (scanner);
+ if (token != G_TOKEN_COMMA)
return PARSE_ERROR;
-
- token = gtk_rc_get_next_token ();
- if (!token || ((token != TOKEN_INTEGER) && (token != TOKEN_FLOAT)))
+
+ token = g_scanner_get_next_token (scanner);
+ if (token == G_TOKEN_INT)
+ token_int = scanner->value.v_int;
+ else if (token == G_TOKEN_FLOAT)
+ token_int = scanner->value.v_float * 65535.0;
+ else
return PARSE_ERROR;
-
- if (token == TOKEN_FLOAT)
- token_int = token_float * 65535.0;
- if (token_int < 0)
- token_int = 0;
- if (token_int > 65535)
- token_int = 65535;
-
- color->blue = token_int;
-
- token = gtk_rc_get_next_token ();
- if (!token || (token != TOKEN_RIGHT_CURLY))
+ color->blue = CLAMP (token_int, 0, 65535);
+
+ token = g_scanner_get_next_token (scanner);
+ if (token != G_TOKEN_RIGHT_CURLY)
return PARSE_ERROR;
break;
-
- case TOKEN_STRING:
- token = gtk_rc_get_next_token ();
-
- if (token_str[0] != '#')
+
+ case G_TOKEN_STRING:
+ token = g_scanner_get_next_token (scanner);
+
+ if (scanner->value.v_string[0] != '#')
return PARSE_ERROR;
-
- length = strlen (token_str) - 1;
+
+ length = strlen (scanner->value.v_string) - 1;
if (((length % 3) != 0) || (length > 12))
return PARSE_ERROR;
length /= 3;
-
+
for (i = 0, j = 1; i < length; i++, j++)
- buf[i] = token_str[j];
+ buf[i] = scanner->value.v_string[j];
buf[i] = '\0';
-
+
sscanf (buf, "%x", &temp);
color->red = temp;
-
+
for (i = 0; i < length; i++, j++)
- buf[i] = token_str[j];
+ buf[i] = scanner->value.v_string[j];
buf[i] = '\0';
-
+
sscanf (buf, "%x", &temp);
color->green = temp;
-
+
for (i = 0; i < length; i++, j++)
- buf[i] = token_str[j];
+ buf[i] = scanner->value.v_string[j];
buf[i] = '\0';
-
+
sscanf (buf, "%x", &temp);
color->blue = temp;
-
+
if (length == 1)
{
color->red *= 4369;
@@ -1227,33 +1082,36 @@ gtk_rc_parse_color (GdkColor *color)
color->blue *= 16;
}
break;
-
+
+ case G_TOKEN_ERROR:
+ return PARSE_ERROR;
+
default:
return PARSE_SYNTAX;
}
-
+
return PARSE_OK;
}
static gint
-gtk_rc_parse_pixmap_path ()
+gtk_rc_parse_pixmap_path (GScanner *scanner)
{
gint token;
-
- token = gtk_rc_peek_next_token ();
- if (!token)
+
+ token = g_scanner_peek_next_token (scanner);
+ if (token == G_TOKEN_EOF || token == G_TOKEN_ERROR)
return PARSE_ERROR;
if (token != TOKEN_PIXMAP_PATH)
return PARSE_SYNTAX;
- token = gtk_rc_get_next_token ();
-
- token = gtk_rc_get_next_token ();
-
- if (!token || (token != TOKEN_STRING))
+ token = g_scanner_get_next_token (scanner);
+
+ token = g_scanner_get_next_token (scanner);
+
+ if (token != G_TOKEN_STRING)
return PARSE_ERROR;
-
- gtk_rc_parse_pixmap_path_string(token_str);
-
+
+ gtk_rc_parse_pixmap_path_string (scanner->value.v_string);
+
return PARSE_OK;
}
@@ -1278,7 +1136,7 @@ gtk_rc_parse_pixmap_path_string (gchar *pix_path)
path_len = strlen (pix_path);
buf = g_strdup (pix_path);
-
+
for (end_offset = 0; end_offset <= path_len; end_offset++)
{
if ((buf[end_offset] == ':') ||
@@ -1295,100 +1153,100 @@ gtk_rc_parse_pixmap_path_string (gchar *pix_path)
}
static gint
-gtk_rc_parse_widget_style ()
+gtk_rc_parse_widget_style (GScanner *scanner)
{
GtkRcSet *rc_set;
gint token;
-
- token = gtk_rc_peek_next_token ();
- if (!token)
+
+ token = g_scanner_peek_next_token (scanner);
+ if (token == G_TOKEN_EOF || token == G_TOKEN_ERROR)
return PARSE_ERROR;
if (token != TOKEN_WIDGET)
return PARSE_SYNTAX;
- token = gtk_rc_get_next_token ();
-
- token = gtk_rc_get_next_token ();
- if (!token || (token != TOKEN_STRING))
+ token = g_scanner_get_next_token (scanner);
+
+ token = g_scanner_get_next_token (scanner);
+ if (token != G_TOKEN_STRING)
return PARSE_ERROR;
-
+
rc_set = g_new (GtkRcSet, 1);
- rc_set->set = g_strdup (token_str);
-
- token = gtk_rc_get_next_token ();
- if (!token || (token != TOKEN_STYLE))
+ rc_set->set = g_strdup (scanner->value.v_string);
+
+ token = g_scanner_get_next_token (scanner);
+ if (token != TOKEN_STYLE)
{
g_free (rc_set->set);
g_free (rc_set);
return PARSE_ERROR;
}
-
- token = gtk_rc_get_next_token ();
- if (!token || (token != TOKEN_STRING))
+
+ token = g_scanner_get_next_token (scanner);
+ if (token != G_TOKEN_STRING)
{
g_free (rc_set->set);
g_free (rc_set);
return PARSE_ERROR;
}
-
- rc_set->rc_style = gtk_rc_style_find (token_str);
+
+ rc_set->rc_style = gtk_rc_style_find (scanner->value.v_string);
if (!rc_set->rc_style)
{
g_free (rc_set->set);
g_free (rc_set);
return PARSE_ERROR;
}
-
+
widget_sets = g_slist_append (widget_sets, rc_set);
-
+
return PARSE_OK;
}
static gint
-gtk_rc_parse_widget_class_style ()
+gtk_rc_parse_widget_class_style (GScanner *scanner)
{
GtkRcSet *rc_set;
gint token;
-
- token = gtk_rc_peek_next_token ();
- if (!token)
+
+ token = g_scanner_peek_next_token (scanner);
+ if (token == G_TOKEN_EOF || token == G_TOKEN_ERROR)
return PARSE_ERROR;
if (token != TOKEN_WIDGET_CLASS)
return PARSE_SYNTAX;
- token = gtk_rc_get_next_token ();
-
- token = gtk_rc_get_next_token ();
- if (!token || (token != TOKEN_STRING))
+ token = g_scanner_get_next_token (scanner);
+
+ token = g_scanner_get_next_token (scanner);
+ if (token != G_TOKEN_STRING)
return PARSE_ERROR;
-
+
rc_set = g_new (GtkRcSet, 1);
- rc_set->set = g_strdup (token_str);
-
- token = gtk_rc_get_next_token ();
- if (!token || (token != TOKEN_STYLE))
+ rc_set->set = g_strdup (scanner->value.v_string);
+
+ token = g_scanner_get_next_token (scanner);
+ if (token != TOKEN_STYLE)
{
g_free (rc_set->set);
g_free (rc_set);
return PARSE_ERROR;
}
-
- token = gtk_rc_get_next_token ();
- if (!token || (token != TOKEN_STRING))
+
+ token = g_scanner_get_next_token (scanner);
+ if (token != G_TOKEN_STRING)
{
g_free (rc_set->set);
g_free (rc_set);
return PARSE_ERROR;
}
-
- rc_set->rc_style = gtk_rc_style_find (token_str);
+
+ rc_set->rc_style = gtk_rc_style_find (scanner->value.v_string);
if (!rc_set->rc_style)
{
g_free (rc_set->set);
g_free (rc_set);
return PARSE_ERROR;
}
-
+
widget_class_sets = g_slist_append (widget_class_sets, rc_set);
-
+
return PARSE_OK;
}
@@ -1400,43 +1258,43 @@ gtk_rc_widget_path (GtkWidget *widget)
char *name;
int pathlength;
int namelength;
-
+
path = NULL;
pathlength = 0;
-
+
tmp_widget = widget;
while (tmp_widget)
{
name = gtk_widget_get_name (tmp_widget);
pathlength += strlen (name);
-
+
tmp_widget = tmp_widget->parent;
-
+
if (tmp_widget)
pathlength += 1;
}
-
+
path = g_new (char, pathlength + 1);
path[pathlength] = '\0';
-
+
tmp_widget = widget;
while (tmp_widget)
{
name = gtk_widget_get_name (tmp_widget);
namelength = strlen (name);
-
+
strncpy (&path[pathlength - namelength], name, namelength);
pathlength -= namelength;
-
+
tmp_widget = tmp_widget->parent;
-
+
if (tmp_widget)
{
pathlength -= 1;
path[pathlength] = '.';
}
}
-
+
return path;
}
@@ -1448,42 +1306,42 @@ gtk_rc_widget_class_path (GtkWidget *widget)
char *name;
int pathlength;
int namelength;
-
+
path = NULL;
pathlength = 0;
-
+
tmp_widget = widget;
while (tmp_widget)
{
name = gtk_type_name (GTK_WIDGET_TYPE (tmp_widget));
pathlength += strlen (name);
-
+
tmp_widget = tmp_widget->parent;
-
+
if (tmp_widget)
pathlength += 1;
}
-
+
path = g_new (char, pathlength + 1);
path[pathlength] = '\0';
-
+
tmp_widget = widget;
while (tmp_widget)
{
name = gtk_type_name (GTK_WIDGET_TYPE (tmp_widget));
namelength = strlen (name);
-
+
strncpy (&path[pathlength - namelength], name, namelength);
pathlength -= namelength;
-
+
tmp_widget = tmp_widget->parent;
-
+
if (tmp_widget)
{
pathlength -= 1;
path[pathlength] = '.';
}
}
-
+
return path;
}
diff --git a/gtk/gtkrc.h b/gtk/gtkrc.h
index 8c761bb9e..c89858a4f 100644
--- a/gtk/gtkrc.h
+++ b/gtk/gtkrc.h
@@ -8,7 +8,7 @@
*
* 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
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
@@ -28,13 +28,14 @@ extern "C" {
#endif /* __cplusplus */
-void gtk_rc_init (void);
-void gtk_rc_parse (const char *filename);
-GtkStyle* gtk_rc_get_style (GtkWidget *widget);
-void gtk_rc_add_widget_name_style (GtkStyle *style,
- const char *pattern);
-void gtk_rc_add_widget_class_style (GtkStyle *style,
- const char *pattern);
+void gtk_rc_init (void);
+void gtk_rc_parse (const gchar *filename);
+void gtk_rc_parse_string (const gchar *rc_string);
+GtkStyle* gtk_rc_get_style (GtkWidget *widget);
+void gtk_rc_add_widget_name_style (GtkStyle *style,
+ const gchar *pattern);
+void gtk_rc_add_widget_class_style (GtkStyle *style,
+ const gchar *pattern);
#ifdef __cplusplus