diff options
author | Emmanuele Bassi <ebassi@openedhand.com> | 2008-02-29 16:37:18 +0000 |
---|---|---|
committer | Emmanuele Bassi <ebassi@openedhand.com> | 2008-02-29 16:37:18 +0000 |
commit | 8a2bb3c4400b9df6cd864eb29920a7767e8170c7 (patch) | |
tree | 7db3abf4665519b8909b31781334b569be78999e /json-glib/json-scanner.c | |
parent | 42f7800c5b1c30ff187fc824a9bb39565033488e (diff) | |
download | json-glib-8a2bb3c4400b9df6cd864eb29920a7767e8170c7.tar.gz |
Sanitize JsonScanner code
Use a closure instead of (*eugh*) an array of gpointers and casting
to void*.
Also, use the Slice allocator for the ScannerKey structs.
Diffstat (limited to 'json-glib/json-scanner.c')
-rw-r--r-- | json-glib/json-scanner.c | 42 |
1 files changed, 20 insertions, 22 deletions
diff --git a/json-glib/json-scanner.c b/json-glib/json-scanner.c index d2ee437..acf3b6c 100644 --- a/json-glib/json-scanner.c +++ b/json-glib/json-scanner.c @@ -309,7 +309,7 @@ json_scanner_destroy_symbol_table_entry (gpointer _key, JsonScannerKey *key = _key; g_free (key->symbol); - g_free (key); + g_slice_free (JsonScannerKey, key); } void @@ -418,7 +418,7 @@ json_scanner_key_hash (gconstpointer v) return h; } -static inline JsonScannerKey* +static inline JsonScannerKey * json_scanner_lookup_internal (JsonScanner *scanner, guint scope_id, const gchar *symbol) @@ -463,7 +463,7 @@ json_scanner_scope_add_symbol (JsonScanner *scanner, key = json_scanner_lookup_internal (scanner, scope_id, symbol); if (!key) { - key = g_new (JsonScannerKey, 1); + key = g_slice_new (JsonScannerKey); key->scope_id = scope_id; key->symbol = g_strdup (symbol); key->value = value; @@ -500,7 +500,7 @@ json_scanner_scope_remove_symbol (JsonScanner *scanner, { g_hash_table_remove (scanner->symbol_table, key); g_free (key->symbol); - g_free (key); + g_slice_free (JsonScannerKey, key); } } @@ -561,25 +561,22 @@ json_scanner_set_scope (JsonScanner *scanner, return old_scope_id; } +typedef struct { + GHFunc func; + gpointer data; + guint scope_id; +} ForeachClosure; + static void json_scanner_foreach_internal (gpointer _key, gpointer _value, gpointer _user_data) { - JsonScannerKey *key; - gpointer *d; - GHFunc func; - gpointer user_data; - guint *scope_id; - - d = _user_data; - func = (GHFunc) d[0]; - user_data = d[1]; - scope_id = d[2]; - key = _value; + JsonScannerKey *key = _value; + ForeachClosure *closure = _user_data; - if (key->scope_id == *scope_id) - func (key->symbol, key->value, user_data); + if (key->scope_id == closure->scope_id) + closure->func (key->symbol, key->value, closure->data); } void @@ -588,17 +585,18 @@ json_scanner_scope_foreach_symbol (JsonScanner *scanner, GHFunc func, gpointer user_data) { - gpointer d[3]; + ForeachClosure closure; g_return_if_fail (scanner != NULL); + g_return_if_fail (func != NULL); - d[0] = (gpointer) func; - d[1] = user_data; - d[2] = &scope_id; + closure.func = func; + closure.data = user_data; + closure.scope_id = scope_id; g_hash_table_foreach (scanner->symbol_table, json_scanner_foreach_internal, - d); + &closure); } GTokenType |