diff options
-rw-r--r-- | gvdb/gvdb-reader.c | 13 | ||||
-rw-r--r-- | gvdb/gvdb-reader.h | 37 | ||||
-rw-r--r-- | gvdb/meson.build | 1 | ||||
-rw-r--r-- | service/dconf-gvdb-utils.c | 4 | ||||
-rw-r--r-- | tests/dconf-mock-gvdb.c | 2 | ||||
-rw-r--r-- | tests/gvdb.c | 12 |
6 files changed, 44 insertions, 25 deletions
diff --git a/gvdb/gvdb-reader.c b/gvdb/gvdb-reader.c index aa3154f..9509388 100644 --- a/gvdb/gvdb-reader.c +++ b/gvdb/gvdb-reader.c @@ -332,7 +332,7 @@ gvdb_table_list_from_item (GvdbTable *table, /** * gvdb_table_get_names: * @table: a #GvdbTable - * @length: the number of items returned, or %NULL + * @length: (optional): the number of items returned, or %NULL * * Gets a list of all names contained in @table. * @@ -344,11 +344,11 @@ gvdb_table_list_from_item (GvdbTable *table, * above calls in the case of the corrupted file. Note also that the * returned strings may not be utf8. * - * Returns: a %NULL-terminated list of strings, of length @length + * Returns: (array length=length): a %NULL-terminated list of strings, of length @length **/ gchar ** gvdb_table_get_names (GvdbTable *table, - gint *length) + gsize *length) { gchar **names; gint n_names; @@ -462,7 +462,7 @@ gvdb_table_get_names (GvdbTable *table, { GPtrArray *fixed_names; - fixed_names = g_ptr_array_new (); + fixed_names = g_ptr_array_sized_new (n_names); for (i = 0; i < n_names; i++) if (names[i] != NULL) g_ptr_array_add (fixed_names, names[i]); @@ -474,7 +474,10 @@ gvdb_table_get_names (GvdbTable *table, } if (length) - *length = n_names; + { + G_STATIC_ASSERT (sizeof (*length) >= sizeof (n_names)); + *length = n_names; + } return names; } diff --git a/gvdb/gvdb-reader.h b/gvdb/gvdb-reader.h index 3982773..79a97d3 100644 --- a/gvdb/gvdb-reader.h +++ b/gvdb/gvdb-reader.h @@ -22,40 +22,55 @@ #include <glib.h> +/* We cannot enable the weak attribute unconditionally here because both + * gvdb/gvdb-reader.c and tests/dconf-mock-gvdb.c include this file. The + * intention of using weak symbols here is to allow the latter to override + * functions defined in the former, so functions in tests/dconf-mock-gvdb.c + * must have strong bindings. */ +#ifdef GVDB_USE_WEAK_SYMBOLS +# ifdef __GNUC__ +# define GVDB_GNUC_WEAK __attribute__((weak)) +# else +# define GVDB_GNUC_WEAK +# endif +#else +# define GVDB_GNUC_WEAK +#endif + typedef struct _GvdbTable GvdbTable; G_BEGIN_DECLS -G_GNUC_INTERNAL +G_GNUC_INTERNAL GVDB_GNUC_WEAK GvdbTable * gvdb_table_new_from_bytes (GBytes *bytes, gboolean trusted, GError **error); -G_GNUC_INTERNAL +G_GNUC_INTERNAL GVDB_GNUC_WEAK GvdbTable * gvdb_table_new (const gchar *filename, gboolean trusted, GError **error); -G_GNUC_INTERNAL +G_GNUC_INTERNAL GVDB_GNUC_WEAK void gvdb_table_free (GvdbTable *table); -G_GNUC_INTERNAL +G_GNUC_INTERNAL GVDB_GNUC_WEAK gchar ** gvdb_table_get_names (GvdbTable *table, - gint *length); -G_GNUC_INTERNAL + gsize *length); +G_GNUC_INTERNAL GVDB_GNUC_WEAK gchar ** gvdb_table_list (GvdbTable *table, const gchar *key); -G_GNUC_INTERNAL +G_GNUC_INTERNAL GVDB_GNUC_WEAK GvdbTable * gvdb_table_get_table (GvdbTable *table, const gchar *key); -G_GNUC_INTERNAL +G_GNUC_INTERNAL GVDB_GNUC_WEAK GVariant * gvdb_table_get_raw_value (GvdbTable *table, const gchar *key); -G_GNUC_INTERNAL +G_GNUC_INTERNAL GVDB_GNUC_WEAK GVariant * gvdb_table_get_value (GvdbTable *table, const gchar *key); -G_GNUC_INTERNAL +G_GNUC_INTERNAL GVDB_GNUC_WEAK gboolean gvdb_table_has_value (GvdbTable *table, const gchar *key); -G_GNUC_INTERNAL +G_GNUC_INTERNAL GVDB_GNUC_WEAK gboolean gvdb_table_is_valid (GvdbTable *table); G_END_DECLS diff --git a/gvdb/meson.build b/gvdb/meson.build index 1a1aba8..6b98825 100644 --- a/gvdb/meson.build +++ b/gvdb/meson.build @@ -10,6 +10,7 @@ gvdb_deps = [ cflags = [ '-DG_LOG_DOMAIN="gvdb (via dconf)"', '-DG_LOG_USE_STRUCTURED=1', + '-DGVDB_USE_WEAK_SYMBOLS', ] libgvdb = static_library( diff --git a/service/dconf-gvdb-utils.c b/service/dconf-gvdb-utils.c index 93a4719..d77ae97 100644 --- a/service/dconf-gvdb-utils.c +++ b/service/dconf-gvdb-utils.c @@ -102,8 +102,8 @@ dconf_gvdb_utils_read_and_back_up_file (const gchar *filename, if (table != NULL) { gchar **names; - gint n_names; - gint i; + gsize n_names; + gsize i; names = gvdb_table_get_names (table, &n_names); for (i = 0; i < n_names; i++) diff --git a/tests/dconf-mock-gvdb.c b/tests/dconf-mock-gvdb.c index 4f58de1..174bd71 100644 --- a/tests/dconf-mock-gvdb.c +++ b/tests/dconf-mock-gvdb.c @@ -170,7 +170,7 @@ gvdb_table_list (GvdbTable *table, gchar ** gvdb_table_get_names (GvdbTable *table, - gint *length) + gsize *length) { if (length) *length = 0; diff --git a/tests/gvdb.c b/tests/gvdb.c index d054067..765f4b8 100644 --- a/tests/gvdb.c +++ b/tests/gvdb.c @@ -35,8 +35,8 @@ test_reader_empty (void) GError *error = NULL; GvdbTable *table; gchar **names; - gint n_names; - gint i; + gsize n_names; + gsize i; table = gvdb_table_new (SRCDIR "/gvdbs/empty_gvdb", TRUE, &error); g_assert_no_error (error); @@ -85,7 +85,7 @@ verify_table (GvdbTable *table) { GVariant *value; gchar **list; - gint n_names; + gsize n_names; gboolean has; /* We could not normally expect these to be in a particular order but @@ -221,7 +221,7 @@ test_nested (void) GvdbTable *table; GvdbTable *locks; gchar **names; - gint n_names; + gsize n_names; gboolean has; table = gvdb_table_new (SRCDIR "/gvdbs/nested_gvdb", TRUE, &error); @@ -277,8 +277,8 @@ inspect_carefully (GvdbTable *table, }; gint found_items; gchar **names; - gint n_names; - gint i; + gsize n_names; + gsize i; if (level > 100) return; |