applied patch from Andreas Persenius <ndap@swipnet.se> that updates the
[platform/upstream/glib.git] / glib / gscanner.c
index 36606e8..8839dff 100644 (file)
@@ -5,21 +5,28 @@
  * Copyright (C) 1997, 1998 Tim Janik
  *
  * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
+ * modify it under the terms of the GNU Lesser General Public
  * License as published by the Free Software Foundation; either
  * version 2 of the License, or (at your option) any later version.
  *
  * This library is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.         See the GNU
- * Library General Public License for more details.
+ * Lesser General Public License for more details.
  *
- * You should have received a copy of the GNU Library General Public
+ * You should have received a copy of the GNU Lesser General Public
  * License along with this library; if not, write to the
  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
  * Boston, MA 02111-1307, USA.
  */
 
+/*
+ * Modified by the GLib Team and others 1997-2000.  See the AUTHORS
+ * file for a list of people on the GLib Team.  See the ChangeLog
+ * files for a list of changes.  These files are distributed with
+ * GLib at ftp://ftp.gtk.org/pub/gtk/. 
+ */
+
 /* 
  * MT safe
  */
@@ -41,7 +48,7 @@
 #include       <errno.h>
 #include       <sys/types.h>   /* needed for sys/stat.h */
 #include       <sys/stat.h>
-#ifdef _MSC_VER
+#ifdef G_OS_WIN32
 #include       <io.h>          /* For _read() */
 #endif
 
@@ -82,8 +89,9 @@ static GScannerConfig g_scanner_config_template =
    )                   /* cset_identifier_first */,
   (
    G_CSET_a_2_z
-   "_0123456789"
+   "_"
    G_CSET_A_2_Z
+   G_CSET_DIGITS
    G_CSET_LATINS
    G_CSET_LATINC
    )                   /* cset_identifier_nth */,
@@ -165,7 +173,7 @@ g_scanner_char_2_num (guchar        c,
 GScanner*
 g_scanner_new (GScannerConfig  *config_templ)
 {
-  register GScanner    *scanner;
+  GScanner *scanner;
   
   if (!config_templ)
     config_templ = &g_scanner_config_template;
@@ -182,6 +190,8 @@ g_scanner_new (GScannerConfig       *config_templ)
   
   scanner->config->case_sensitive      = config_templ->case_sensitive;
   scanner->config->cset_skip_characters        = config_templ->cset_skip_characters;
+  if (!scanner->config->cset_skip_characters)
+    scanner->config->cset_skip_characters = "";
   scanner->config->cset_identifier_first= config_templ->cset_identifier_first;
   scanner->config->cset_identifier_nth = config_templ->cset_identifier_nth;
   scanner->config->cpair_comment_single        = config_templ->cpair_comment_single;
@@ -340,8 +350,8 @@ static gint
 g_scanner_key_equal (gconstpointer v1,
                     gconstpointer v2)
 {
-  register const GScannerKey *key1 = v1;
-  register const GScannerKey *key2 = v2;
+  const GScannerKey *key1 = v1;
+  const GScannerKey *key2 = v2;
   
   return (key1->scope_id == key2->scope_id) && (strcmp (key1->symbol, key2->symbol) == 0);
 }
@@ -349,14 +359,14 @@ g_scanner_key_equal (gconstpointer v1,
 static guint
 g_scanner_key_hash (gconstpointer v)
 {
-  register const GScannerKey *key = v;
-  register gchar *c;
-  register guint h;
+  const GScannerKey *key = v;
+  gchar *c;
+  guint h;
   
   h = key->scope_id;
   for (c = key->symbol; *c; c++)
     {
-      register guint g;
+      guint g;
       
       h = (h << 4) + *c;
       g = h & 0xf0000000;
@@ -375,15 +385,15 @@ g_scanner_lookup_internal (GScanner       *scanner,
                           guint         scope_id,
                           const gchar  *symbol)
 {
-  register GScannerKey *key_p;
+  GScannerKey  *key_p;
   GScannerKey key;
   
   key.scope_id = scope_id;
   
   if (!scanner->config->case_sensitive)
     {
-      register gchar *d;
-      register const gchar *c;
+      gchar *d;
+      const gchar *c;
       
       key.symbol = g_new (gchar, strlen (symbol) + 1);
       for (d = key.symbol, c = symbol; *c; c++, d++)
@@ -407,7 +417,7 @@ g_scanner_scope_add_symbol (GScanner        *scanner,
                            const gchar *symbol,
                            gpointer     value)
 {
-  register GScannerKey *key;
+  GScannerKey  *key;
   
   g_return_if_fail (scanner != NULL);
   g_return_if_fail (symbol != NULL);
@@ -422,7 +432,7 @@ g_scanner_scope_add_symbol (GScanner        *scanner,
       key->value = value;
       if (!scanner->config->case_sensitive)
        {
-         register gchar *c;
+         gchar *c;
          
          c = key->symbol;
          while (*c != 0)
@@ -442,7 +452,7 @@ g_scanner_scope_remove_symbol (GScanner        *scanner,
                               guint        scope_id,
                               const gchar *symbol)
 {
-  register GScannerKey *key;
+  GScannerKey  *key;
   
   g_return_if_fail (scanner != NULL);
   g_return_if_fail (symbol != NULL);
@@ -461,8 +471,8 @@ gpointer
 g_scanner_lookup_symbol (GScanner      *scanner,
                         const gchar    *symbol)
 {
-  register GScannerKey *key;
-  register guint scope_id;
+  GScannerKey  *key;
+  guint scope_id;
   
   g_return_val_if_fail (scanner != NULL, NULL);
   
@@ -485,7 +495,7 @@ g_scanner_scope_lookup_symbol (GScanner           *scanner,
                               guint           scope_id,
                               const gchar    *symbol)
 {
-  register GScannerKey *key;
+  GScannerKey  *key;
   
   g_return_val_if_fail (scanner != NULL, NULL);
   
@@ -504,7 +514,7 @@ guint
 g_scanner_set_scope (GScanner      *scanner,
                     guint           scope_id)
 {
-  register guint old_scope_id;
+  guint old_scope_id;
   
   g_return_val_if_fail (scanner != NULL, 0);
   
@@ -519,11 +529,11 @@ g_scanner_foreach_internal (gpointer  _key,
                            gpointer  _value,
                            gpointer  _user_data)
 {
-  register GScannerKey *key;
-  register gpointer *d;
-  register GHFunc func;
-  register gpointer user_data;
-  register guint *scope_id;
+  GScannerKey *key;
+  gpointer *d;
+  GHFunc func;
+  gpointer user_data;
+  guint *scope_id;
   
   d = _user_data;
   func = (GHFunc) d[0];
@@ -555,17 +565,21 @@ g_scanner_scope_foreach_symbol (GScanner       *scanner,
 void
 g_scanner_freeze_symbol_table (GScanner *scanner)
 {
-  g_return_if_fail (scanner != NULL);
-  
-  g_hash_table_freeze (scanner->symbol_table);
+#ifdef G_ENABLE_DEBUG
+  static gboolean first_call = TRUE;
+
+  if (first_call)
+    {
+      g_warning("g_scanner_freeze_symbol_table and "
+               "g_scanner_thaw_symbol_table are deprecated.");
+      first_call = FALSE;
+    }
+#endif /* G_ENABLE_DEBUG */
 }
 
 void
 g_scanner_thaw_symbol_table (GScanner *scanner)
 {
-  g_return_if_fail (scanner != NULL);
-  
-  g_hash_table_thaw (scanner->symbol_table);
 }
 
 GTokenType
@@ -724,8 +738,8 @@ g_scanner_peek_next_char (GScanner *scanner)
     }
   else if (scanner->input_fd >= 0)
     {
-      register gint count;
-      register gchar *buffer;
+      gint count;
+      gchar *buffer;
 
       buffer = scanner->buffer;
       do
@@ -784,14 +798,14 @@ g_scanner_get_char (GScanner      *scanner,
                    guint       *line_p,
                    guint       *position_p)
 {
-  register guchar fchar;
+  guchar fchar;
 
   if (scanner->text < scanner->text_end)
     fchar = *(scanner->text++);
   else if (scanner->input_fd >= 0)
     {
-      register gint count;
-      register gchar *buffer;
+      gint count;
+      gchar *buffer;
 
       buffer = scanner->buffer;
       do
@@ -843,12 +857,12 @@ g_scanner_unexp_token (GScanner           *scanner,
                       const gchar      *message,
                       gint              is_error)
 {
-  register gchar       *token_string;
-  register guint       token_string_len;
-  register gchar       *expected_string;
-  register guint       expected_string_len;
-  register gchar       *message_prefix;
-  register gboolean    print_unexp;
+  gchar        *token_string;
+  guint        token_string_len;
+  gchar        *expected_string;
+  guint        expected_string_len;
+  gchar        *message_prefix;
+  gboolean print_unexp;
   void (*msg_handler)  (GScanner*, const gchar*, ...);
   
   g_return_if_fail (scanner != NULL);
@@ -966,7 +980,7 @@ g_scanner_unexp_token (GScanner             *scanner,
                  "%s%s `%s'",
                  print_unexp ? "" : "invalid ",
                  identifier_spec,
-                 scanner->value.v_string);
+                 scanner->token == G_TOKEN_IDENTIFIER ? scanner->value.v_string : "null");
       break;
       
     case G_TOKEN_BINARY:
@@ -1068,6 +1082,10 @@ g_scanner_unexp_token (GScanner          *scanner,
                  identifier_spec);
       break;
       
+    case G_TOKEN_EOF:
+      g_snprintf (expected_string, expected_string_len, "end of file");
+      break;
+
     case G_TOKEN_NONE:
       break;
     }
@@ -1197,15 +1215,15 @@ g_scanner_get_token_ll  (GScanner       *scanner,
                         guint          *line_p,
                         guint          *position_p)
 {
-  register GScannerConfig *config;
-  register GTokenType     token;
-  register gboolean       in_comment_multi;
-  register gboolean       in_comment_single;
-  register gboolean       in_string_sq;
-  register gboolean       in_string_dq;
-  register GString       *gstring;
-  GTokenValue             value;
-  guchar                  ch;
+  GScannerConfig *config;
+  GTokenType      token;
+  gboolean        in_comment_multi;
+  gboolean        in_comment_single;
+  gboolean        in_string_sq;
+  gboolean        in_string_dq;
+  GString        *gstring;
+  GTokenValue     value;
+  guchar          ch;
   
   config = scanner->config;
   (*value_p).v_int = 0;
@@ -1225,7 +1243,7 @@ g_scanner_get_token_ll    (GScanner       *scanner,
   
   do /* while (ch != 0) */
     {
-      register gboolean                dotted_float = FALSE;
+      gboolean dotted_float = FALSE;
       
       ch = g_scanner_get_char (scanner, line_p, position_p);
       
@@ -1309,8 +1327,8 @@ g_scanner_get_token_ll    (GScanner       *scanner,
                      ch = g_scanner_get_char (scanner, line_p, position_p);
                      switch (ch)
                        {
-                         register guint        i;
-                         register guint        fchar;
+                         guint i;
+                         guint fchar;
                          
                        case 0:
                          break;
@@ -1450,7 +1468,7 @@ g_scanner_get_token_ll    (GScanner       *scanner,
        case '9':
        number_parsing:
        {
-          register gboolean in_number = TRUE;
+          gboolean in_number = TRUE;
          gchar *endptr;
          
          if (token == G_TOKEN_NONE)
@@ -1461,7 +1479,7 @@ g_scanner_get_token_ll    (GScanner       *scanner,
          
          do /* while (in_number) */
            {
-             register gboolean is_E;
+             gboolean is_E;
              
              is_E = token == G_TOKEN_FLOAT && (ch == 'e' || ch == 'E');
              
@@ -1600,9 +1618,8 @@ g_scanner_get_token_ll    (GScanner       *scanner,
              token = G_TOKEN_COMMENT_SINGLE;
              in_comment_single = TRUE;
              gstring = g_string_new ("");
-             while ((ch = g_scanner_get_char (scanner,
-                                              line_p,
-                                              position_p)) != 0)
+             ch = g_scanner_get_char (scanner, line_p, position_p);
+             while (ch != 0)
                {
                  if (ch == config->cpair_comment_single[1])
                    {
@@ -1612,7 +1629,7 @@ g_scanner_get_token_ll    (GScanner       *scanner,
                    }
                  
                  gstring = g_string_append_c (gstring, ch);
-                 ch = 0;
+                 ch = g_scanner_get_char (scanner, line_p, position_p);
                }
            }
          else if (config->scan_identifier && ch &&
@@ -1689,8 +1706,8 @@ g_scanner_get_token_ll    (GScanner       *scanner,
     {
       if (config->scan_symbols)
        {
-         register GScannerKey  *key;
-         register guint scope_id;
+         GScannerKey *key;
+         guint scope_id;
          
          scope_id = scanner->scope_id;
          key = g_scanner_lookup_internal (scanner, scope_id, value.v_identifier);