new function g_log_set_always_fatal() to set an additional fatal_mask for
[platform/upstream/glib.git] / glib / grel.c
index 91d2b68..5fdf880 100644 (file)
@@ -17,6 +17,7 @@
  */
 #include "glib.h"
 #include <stdarg.h>
+#include <string.h>
 
 typedef struct _GRealRelation      GRealRelation;
 typedef struct _GRealTuples        GRealTuples;
@@ -25,11 +26,11 @@ struct _GRealRelation
 {
   gint fields;
   gint current_field;
-
+  
   GHashTable   *all_tuples;
   GHashTable  **hashed_tuple_tables;
   GMemChunk    *tuple_chunk;
-
+  
   gint count;
 };
 
@@ -40,24 +41,25 @@ struct _GRealTuples
   gpointer *data;
 };
 
-gboolean
-tuple_equal_2 (gconstpointer v_a, gconstpointer v_b)
+static gboolean
+tuple_equal_2 (gconstpointer v_a,
+              gconstpointer v_b)
 {
   gpointer* a = (gpointer*) v_a;
   gpointer* b = (gpointer*) v_b;
-
+  
   return a[0] == b[0] && a[1] == b[1];
 }
 
-guint
+static guint
 tuple_hash_2 (gconstpointer v_a)
 {
   gpointer* a = (gpointer*) v_a;
-
+  
   return (gulong)a[0] ^ (gulong)a[1];
 }
 
-GHashFunc
+static GHashFunc
 tuple_hash (gint fields)
 {
   switch (fields)
@@ -67,11 +69,11 @@ tuple_hash (gint fields)
     default:
       g_error ("no tuple hash for %d", fields);
     }
-
+  
   return NULL;
 }
 
-GCompareFunc
+static GCompareFunc
 tuple_equal (gint fields)
 {
   switch (fields)
@@ -81,7 +83,7 @@ tuple_equal (gint fields)
     default:
       g_error ("no tuple equal for %d", fields);
     }
-
+  
   return NULL;
 }
 
@@ -89,7 +91,7 @@ GRelation*
 g_relation_new (gint fields)
 {
   GRealRelation* rel = g_new0 (GRealRelation, 1);
-
+  
   rel->fields = fields;
   rel->tuple_chunk = g_mem_chunk_new ("Relation Chunk",
                                      fields * sizeof (gpointer),
@@ -97,7 +99,7 @@ g_relation_new (gint fields)
                                      G_ALLOC_AND_FREE);
   rel->all_tuples = g_hash_table_new (tuple_hash (fields), tuple_equal (fields));
   rel->hashed_tuple_tables = g_new0 (GHashTable*, fields);
-
+  
   return (GRelation*) rel;
 }
 
@@ -112,12 +114,12 @@ g_relation_destroy (GRelation *relation)
 {
   GRealRelation *rel = (GRealRelation *) relation;
   gint i;
-
+  
   if (rel)
     {
       g_hash_table_destroy (rel->all_tuples);
       g_mem_chunk_destroy (rel->tuple_chunk);
-
+      
       for (i = 0; i < rel->fields; i += 1)
        {
          if (rel->hashed_tuple_tables[i])
@@ -126,7 +128,7 @@ g_relation_destroy (GRelation *relation)
              g_hash_table_destroy (rel->hashed_tuple_tables[i]);
            }
        }
-
+      
       g_free (rel->hashed_tuple_tables);
       g_free (rel);
     }
@@ -139,9 +141,9 @@ g_relation_index (GRelation   *relation,
                  GCompareFunc key_compare_func)
 {
   GRealRelation *rel = (GRealRelation *) relation;
-
+  
   g_assert (rel->count == 0 && rel->hashed_tuple_tables[field] == NULL);
-
+  
   rel->hashed_tuple_tables[field] = g_hash_table_new (hash_func, key_compare_func);
 }
 
@@ -153,38 +155,38 @@ g_relation_insert (GRelation   *relation,
   gpointer* tuple = g_chunk_new (gpointer, rel->tuple_chunk);
   va_list args;
   gint i;
-
+  
   va_start(args, relation);
-
+  
   for (i = 0; i < rel->fields; i += 1)
     tuple[i] = va_arg(args, gpointer);
-
+  
   va_end(args);
-
+  
   g_hash_table_insert (rel->all_tuples, tuple, tuple);
-
+  
   rel->count += 1;
-
+  
   for (i = 0; i < rel->fields; i += 1)
     {
       GHashTable *table;
       gpointer    key;
       GHashTable *per_key_table;
-
+      
       table = rel->hashed_tuple_tables[i];
-
+      
       if (table == NULL)
        continue;
-
+      
       key = tuple[i];
       per_key_table = g_hash_table_lookup (table, key);
-
+      
       if (per_key_table == NULL)
        {
          per_key_table = g_hash_table_new (tuple_hash (rel->fields), tuple_equal (rel->fields));
          g_hash_table_insert (table, key, per_key_table);
        }
-
+      
       g_hash_table_insert (per_key_table, tuple, tuple);
     }
 }
@@ -195,31 +197,31 @@ g_relation_delete_tuple (gpointer tuple_key, gpointer tuple_value, gpointer user
   gpointer      *tuple = (gpointer*) tuple_value;
   GRealRelation *rel = (GRealRelation *) user_data;
   gint           j;
-
+  
   g_assert (tuple_key == tuple_value);
-
+  
   for (j = 0; j < rel->fields; j += 1)
     {
       GHashTable *one_table = rel->hashed_tuple_tables[j];
       gpointer    one_key;
       GHashTable *per_key_table;
-
+      
       if (one_table == NULL)
        continue;
-
+      
       if (j == rel->current_field)
        /* can't delete from the table we're foreaching in */
        continue;
-
+      
       one_key = tuple[j];
-
+      
       per_key_table = g_hash_table_lookup (one_table, one_key);
-
+      
       g_hash_table_remove (per_key_table, tuple);
     }
-
+  
   g_hash_table_remove (rel->all_tuples, tuple);
-
+  
   rel->count -= 1;
 }
 
@@ -232,24 +234,24 @@ g_relation_delete  (GRelation   *relation,
   GHashTable *table = rel->hashed_tuple_tables[field];
   GHashTable *key_table;
   gint        count = rel->count;
-
+  
   g_assert (table);
-
+  
   key_table = g_hash_table_lookup (table, key);
-
+  
   if (!key_table)
     return 0;
-
+  
   rel->current_field = field;
-
+  
   g_hash_table_foreach (key_table, g_relation_delete_tuple, rel);
-
+  
   g_hash_table_remove (table, key);
-
+  
   g_hash_table_destroy (key_table);
-
-  /* @@@ Remove empty hash tables. */
-
+  
+  /* @@@ FIXME: Remove empty hash tables. */
+  
   return count - rel->count;
 }
 
@@ -259,13 +261,13 @@ g_relation_select_tuple (gpointer tuple_key, gpointer tuple_value, gpointer user
   gpointer    *tuple = (gpointer*) tuple_value;
   GRealTuples *tuples = (GRealTuples*) user_data;
   gint stride = sizeof (gpointer) * tuples->width;
-
+  
   g_assert (tuple_key == tuple_value);
-
+  
   memcpy (tuples->data + (tuples->len * tuples->width),
          tuple,
          stride);
-
+  
   tuples->len += 1;
 }
 
@@ -279,23 +281,23 @@ g_relation_select (GRelation   *relation,
   GHashTable  *key_table;
   GRealTuples *tuples = g_new0 (GRealTuples, 1);
   gint count;
-
+  
   g_assert (table);
-
+  
   key_table = g_hash_table_lookup (table, key);
-
+  
   if (!key_table)
     return (GTuples*)tuples;
-
+  
   count = g_relation_count (relation, key, field);
-
+  
   tuples->data = g_malloc (sizeof (gpointer) * rel->fields * count);
   tuples->width = rel->fields;
-
+  
   g_hash_table_foreach (key_table, g_relation_select_tuple, tuples);
-
+  
   g_assert (count == tuples->len);
-
+  
   return (GTuples*)tuples;
 }
 
@@ -307,14 +309,14 @@ g_relation_count (GRelation   *relation,
   GRealRelation *rel = (GRealRelation *) relation;
   GHashTable  *table = rel->hashed_tuple_tables[field];
   GHashTable  *key_table;
-
+  
   g_assert (table);
-
+  
   key_table = g_hash_table_lookup (table, key);
-
+  
   if (!key_table)
     return 0;
-
+  
   return g_hash_table_size (key_table);
 }
 
@@ -326,18 +328,18 @@ g_relation_exists (GRelation   *relation, ...)
   va_list args;
   gint i;
   gboolean result;
-
+  
   va_start(args, relation);
-
+  
   for (i = 0; i < rel->fields; i += 1)
     tuple[i] = va_arg(args, gpointer);
-
+  
   va_end(args);
-
+  
   result = g_hash_table_lookup (rel->all_tuples, tuple) != NULL;
-
+  
   g_mem_chunk_free (rel->tuple_chunk, tuple);
-
+  
   return result;
 }
 
@@ -345,7 +347,7 @@ void
 g_tuples_destroy (GTuples *tuples0)
 {
   GRealTuples *tuples = (GRealTuples*) tuples0;
-
+  
   if (tuples)
     {
       g_free (tuples->data);
@@ -359,43 +361,50 @@ g_tuples_index (GTuples     *tuples0,
                gint         field)
 {
   GRealTuples *tuples = (GRealTuples*) tuples0;
-
+  
   g_assert (field < tuples->width);
-
+  
   return tuples->data[index * tuples->width + field];
 }
 
 /* Print
  */
 
-void
-g_relation_print_one (gpointer tuple_key, gpointer tuple_value, gpointer user_data)
+static void
+g_relation_print_one (gpointer tuple_key,
+                     gpointer tuple_value,
+                     gpointer user_data)
 {
   gint i;
+  GString *gstring;
   GRealRelation* rel = (GRealRelation*) user_data;
   gpointer* tuples = (gpointer*) tuple_value;
 
-  g_print ("[");
-
+  gstring = g_string_new ("[");
+  
   for (i = 0; i < rel->fields; i += 1)
     {
-      g_print ("%p", tuples[i]);
-
+      g_string_sprintfa (gstring, "%p", tuples[i]);
+      
       if (i < (rel->fields - 1))
-       g_print (",");
+       g_string_append (gstring, ",");
     }
-
-  g_print ("]\n");
+  
+  g_string_append (gstring, "]");
+  g_log (g_log_domain_glib, G_LOG_LEVEL_INFO, gstring->str);
+  g_string_free (gstring, TRUE);
 }
 
-void
-g_relation_print_index (gpointer tuple_key, gpointer tuple_value, gpointer user_data)
+static void
+g_relation_print_index (gpointer tuple_key,
+                       gpointer tuple_value,
+                       gpointer user_data)
 {
   GRealRelation* rel = (GRealRelation*) user_data;
   GHashTable* table = (GHashTable*) tuple_value;
-
-  g_print ("*** key %p\n", tuple_key);
-
+  
+  g_log (g_log_domain_glib, G_LOG_LEVEL_INFO, "*** key %p", tuple_key);
+  
   g_hash_table_foreach (table,
                        g_relation_print_one,
                        rel);
@@ -406,23 +415,23 @@ g_relation_print (GRelation *relation)
 {
   gint i;
   GRealRelation* rel = (GRealRelation*) relation;
-
-  g_print ("*** all tuples (%d)\n", rel->count);
-
+  
+  g_log (g_log_domain_glib, G_LOG_LEVEL_INFO, "*** all tuples (%d)", rel->count);
+  
   g_hash_table_foreach (rel->all_tuples,
                        g_relation_print_one,
                        rel);
-
+  
   for (i = 0; i < rel->fields; i += 1)
     {
       if (rel->hashed_tuple_tables[i] == NULL)
        continue;
-
-      g_print ("*** index %d\n", i);
-
+      
+      g_log (g_log_domain_glib, G_LOG_LEVEL_INFO, "*** index %d", i);
+      
       g_hash_table_foreach (rel->hashed_tuple_tables[i],
                            g_relation_print_index,
                            rel);
     }
-
+  
 }