aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPřemysl Eric Janouch <p@janouch.name>2021-10-29 01:28:52 +0200
committerPřemysl Eric Janouch <p@janouch.name>2021-10-29 01:31:50 +0200
commit9dcef6a14fad722acd76c1cf042e977d1a2640ae (patch)
treef96b2a8cf0b0bb1489f91098087ce8f69053baad
parentee7be81434bebee566150817fedb600658fc07ed (diff)
downloadlogdiag-9dcef6a14fad722acd76c1cf042e977d1a2640ae.tar.gz
logdiag-9dcef6a14fad722acd76c1cf042e977d1a2640ae.tar.xz
logdiag-9dcef6a14fad722acd76c1cf042e977d1a2640ae.zip
Make ld_library_find_symbol() easier to read
As well as shorter, strangely. Symbols may technically exist directly in the root category now.
-rw-r--r--liblogdiag/ld-library.c73
1 files changed, 32 insertions, 41 deletions
diff --git a/liblogdiag/ld-library.c b/liblogdiag/ld-library.c
index 756dca4..9772ad7 100644
--- a/liblogdiag/ld-library.c
+++ b/liblogdiag/ld-library.c
@@ -49,6 +49,8 @@ static gboolean foreach_dir (const gchar *path,
gboolean (*callback) (const gchar *, const gchar *, gpointer),
gpointer userdata, GError **error);
+static LdSymbol *traverse_path (LdCategory *category, gchar **path);
+
G_DEFINE_TYPE (LdLibrary, ld_library, G_TYPE_OBJECT)
@@ -356,62 +358,51 @@ ld_library_load (LdLibrary *self, const gchar *directory)
LdSymbol *
ld_library_find_symbol (LdLibrary *self, const gchar *identifier)
{
- gchar **id_el_start, **id_el;
- const GSList *list, *list_el;
- LdCategory *cat;
+ gchar **path;
+ LdSymbol *symbol = NULL;
g_return_val_if_fail (LD_IS_LIBRARY (self), NULL);
g_return_val_if_fail (identifier != NULL, NULL);
- id_el_start = g_strsplit (identifier, LD_LIBRARY_IDENTIFIER_SEPARATOR, 0);
- if (!id_el_start)
- return NULL;
+ path = g_strsplit (identifier, LD_LIBRARY_IDENTIFIER_SEPARATOR, 0);
+ if (path)
+ {
+ symbol = traverse_path (self->priv->root, path);
+ g_strfreev (path);
+ }
+ return symbol;
+}
- /* We need at least one category name plus the symbol name. */
- id_el = id_el_start;
- if (!id_el[0] || !id_el[1])
- goto ld_library_find_symbol_error;
+static LdSymbol *
+traverse_path (LdCategory *category, gchar **path)
+{
+ const GSList *list, *iter;
+ LdSymbol *symbol;
- /* Find the category where the symbol is in. */
- cat = self->priv->root;
- while (1)
- {
- gboolean found = FALSE;
+ g_return_val_if_fail (*path != NULL, NULL);
- list = ld_category_get_children (cat);
- for (list_el = list; list_el; list_el = g_slist_next (list_el))
+ /* Walk the category tree to where the symbol is supposed to be. */
+ for (; path[1]; path++)
+ {
+ list = ld_category_get_children (category);
+ for (iter = list; iter; iter = g_slist_next (iter))
{
- cat = LD_CATEGORY (list_el->data);
- if (!strcmp (*id_el, ld_category_get_name (cat)))
- {
- found = TRUE;
+ category = LD_CATEGORY (iter->data);
+ if (!strcmp (*path, ld_category_get_name (category)))
break;
- }
}
-
- if (!found)
- goto ld_library_find_symbol_error;
-
- if (!(id_el++)[2])
- break;
+ if (!iter)
+ return NULL;
}
- /* And then the actual symbol. */
- list = ld_category_get_symbols (cat);
- for (list_el = list; list_el; list_el = g_slist_next (list_el))
+ /* And look up the actual symbol at the leaf. */
+ list = ld_category_get_symbols (category);
+ for (iter = list; iter; iter = g_slist_next (iter))
{
- LdSymbol *symbol;
-
- symbol = LD_SYMBOL (list_el->data);
- if (!strcmp (*id_el, ld_symbol_get_name (symbol)))
- {
- g_strfreev (id_el_start);
+ symbol = LD_SYMBOL (iter->data);
+ if (!strcmp (*path, ld_symbol_get_name (symbol)))
return symbol;
- }
}
-
-ld_library_find_symbol_error:
- g_strfreev (id_el_start);
return NULL;
}