summaryrefslogtreecommitdiff
path: root/grel.c
diff options
context:
space:
mode:
authorTim Janik <timj@gtk.org>1998-08-18 03:50:35 +0000
committerTim Janik <timj@src.gnome.org>1998-08-18 03:50:35 +0000
commite1f0fb0c1e096407b41c98c7817fc4fc2aba5217 (patch)
tree85c341f53d4a4fb840a323fc0bf307456b35d48b /grel.c
parentd7f23839498d1f6115ad86a2df4a173206651c82 (diff)
downloadglib-e1f0fb0c1e096407b41c98c7817fc4fc2aba5217.tar.gz
new function g_log_set_always_fatal() to set an additional fatal_mask for
Tue Aug 18 04:40:17 1998 Tim Janik <timj@gtk.org> * glib.h: * gmessages.c: new function g_log_set_always_fatal() to set an additional fatal_mask for log levels that are considered to be fatal globally (required by gtk). since this mask is not domain-associated, it is restricted to the log levels, introduced by glib itself. * gmem.c: * grel.c: * gtree.c (g_tree_node_check): don't use g_print() calls for informational/debugging output, but log all this stuff through g_log() with G_LOG_LEVEL_INFO. libraries shouldn't use printf(), g_print() or g_printerr() at all.
Diffstat (limited to 'grel.c')
-rw-r--r--grel.c173
1 files changed, 88 insertions, 85 deletions
diff --git a/grel.c b/grel.c
index 979a7d1b2..5fdf88098 100644
--- a/grel.c
+++ b/grel.c
@@ -26,11 +26,11 @@ struct _GRealRelation
{
gint fields;
gint current_field;
-
+
GHashTable *all_tuples;
GHashTable **hashed_tuple_tables;
GMemChunk *tuple_chunk;
-
+
gint count;
};
@@ -47,7 +47,7 @@ tuple_equal_2 (gconstpointer v_a,
{
gpointer* a = (gpointer*) v_a;
gpointer* b = (gpointer*) v_b;
-
+
return a[0] == b[0] && a[1] == b[1];
}
@@ -55,7 +55,7 @@ static guint
tuple_hash_2 (gconstpointer v_a)
{
gpointer* a = (gpointer*) v_a;
-
+
return (gulong)a[0] ^ (gulong)a[1];
}
@@ -69,7 +69,7 @@ tuple_hash (gint fields)
default:
g_error ("no tuple hash for %d", fields);
}
-
+
return NULL;
}
@@ -83,7 +83,7 @@ tuple_equal (gint fields)
default:
g_error ("no tuple equal for %d", fields);
}
-
+
return NULL;
}
@@ -91,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),
@@ -99,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;
}
@@ -114,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])
@@ -128,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);
}
@@ -141,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);
}
@@ -155,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);
}
}
@@ -197,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;
}
@@ -234,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;
}
@@ -261,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;
}
@@ -281,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;
}
@@ -309,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);
}
@@ -328,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;
}
@@ -347,7 +347,7 @@ void
g_tuples_destroy (GTuples *tuples0)
{
GRealTuples *tuples = (GRealTuples*) tuples0;
-
+
if (tuples)
{
g_free (tuples->data);
@@ -361,9 +361,9 @@ g_tuples_index (GTuples *tuples0,
gint field)
{
GRealTuples *tuples = (GRealTuples*) tuples0;
-
+
g_assert (field < tuples->width);
-
+
return tuples->data[index * tuples->width + field];
}
@@ -376,20 +376,23 @@ g_relation_print_one (gpointer tuple_key,
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);
}
static void
@@ -399,9 +402,9 @@ g_relation_print_index (gpointer tuple_key,
{
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);
@@ -412,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);
}
-
+
}