diff options
-rw-r--r-- | ChangeLog | 8 | ||||
-rw-r--r-- | ChangeLog.pre-2-0 | 8 | ||||
-rw-r--r-- | ChangeLog.pre-2-10 | 8 | ||||
-rw-r--r-- | ChangeLog.pre-2-2 | 8 | ||||
-rw-r--r-- | ChangeLog.pre-2-4 | 8 | ||||
-rw-r--r-- | ChangeLog.pre-2-6 | 8 | ||||
-rw-r--r-- | ChangeLog.pre-2-8 | 8 | ||||
-rw-r--r-- | gtk/gtkrc.c | 1164 | ||||
-rw-r--r-- | gtk/gtkrc.h | 17 |
9 files changed, 576 insertions, 661 deletions
@@ -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 (>k_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 |