From 0af9579ea253ccccd24c31f30827ee99150386f6 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Sun, 9 Nov 2003 21:07:31 +0000 Subject: [PATCH] New function to write out the information for a single loader, factored Sun Nov 9 21:56:20 2003 Matthias Clasen * queryloaders.c (write_loader_info): New function to write out the information for a single loader, factored out of query_module(). (loader_sanity_check): New function to perform sanity checks on a loader. (query_module): Use the new functions. --- gdk-pixbuf/ChangeLog | 9 ++++ gdk-pixbuf/queryloaders.c | 101 ++++++++++++++++++++++++++++++-------- 2 files changed, 89 insertions(+), 21 deletions(-) diff --git a/gdk-pixbuf/ChangeLog b/gdk-pixbuf/ChangeLog index 608e545315..f5747e2eaa 100644 --- a/gdk-pixbuf/ChangeLog +++ b/gdk-pixbuf/ChangeLog @@ -1,3 +1,12 @@ +Sun Nov 9 21:56:20 2003 Matthias Clasen + + * queryloaders.c (write_loader_info): New function to write + out the information for a single loader, factored out of + query_module(). + (loader_sanity_check): New function to perform + sanity checks on a loader. + (query_module): Use the new functions. + Thu Nov 6 00:27:27 2003 Matthias Clasen * io-pcx.c (gdk_pixbuf__pcx_load_increment): Fold two similar diff --git a/gdk-pixbuf/queryloaders.c b/gdk-pixbuf/queryloaders.c index 15c3bdb98f..0e1502a443 100644 --- a/gdk-pixbuf/queryloaders.c +++ b/gdk-pixbuf/queryloaders.c @@ -53,6 +53,76 @@ print_escaped (const char *str) g_free (tmp); } +static int +loader_sanity_check (const char *path, GdkPixbufFormat *info, GdkPixbufModule *vtable) +{ + const GdkPixbufModulePattern *pattern; + const char *error = ""; + + for (pattern = info->signature; pattern->prefix; pattern++) + if (strlen (pattern->prefix) == 0) + { + error = "empty pattern"; + + goto error; + } + + if (!vtable->load && !vtable->begin_load && !vtable->load_animation) + { + error = "no load method implemented"; + + goto error; + } + + if (vtable->begin_load && (!vtable->stop_load || !vtable->load_increment)) + { + error = "incremental loading support incomplete"; + + goto error; + } + + if ((info->flags & GDK_PIXBUF_FORMAT_WRITABLE) & !vtable->save) + { + error = "loader claims to support saving but doesn't implement save"; + goto error; + } + + return 1; + + error: + g_fprintf (stderr, "Loader sanity check failed for %s: %s\n", + path, error); + + return 0; +} + +static void +write_loader_info (const char *path, GdkPixbufFormat *info) +{ + const GdkPixbufModulePattern *pattern; + char **mime; + char **ext; + + g_printf("\"%s\"\n", path); + g_printf ("\"%s\" %d \"%s\" \"%s\"\n", + info->name, info->flags, + info->domain ? info->domain : GETTEXT_PACKAGE, info->description); + for (mime = info->mime_types; *mime; mime++) { + g_printf ("\"%s\" ", *mime); + } + g_printf ("\"\"\n"); + for (ext = info->extensions; *ext; ext++) { + g_printf ("\"%s\" ", *ext); + } + g_printf ("\"\"\n"); + for (pattern = info->signature; pattern->prefix; pattern++) { + print_escaped (pattern->prefix); + print_escaped (pattern->mask ? (const char *)pattern->mask : ""); + g_printf ("%d\n", pattern->relevance); + } + g_printf ("\n"); +} + static void query_module (const char *dir, const char *file) { @@ -60,9 +130,6 @@ query_module (const char *dir, const char *file) GModule *module; void (*fill_info) (GdkPixbufFormat *info); void (*fill_vtable) (GdkPixbufModule *module); - char **mime; - char **ext; - const GdkPixbufModulePattern *pattern; if (g_path_is_absolute (file)) path = g_strdup (file); @@ -74,27 +141,19 @@ query_module (const char *dir, const char *file) g_module_symbol (module, "fill_info", (gpointer *) &fill_info) && g_module_symbol (module, "fill_vtable", (gpointer *) &fill_vtable)) { GdkPixbufFormat *info; - g_printf("\"%s\"\n", path); + GdkPixbufModule *vtable; + info = g_new0 (GdkPixbufFormat, 1); + vtable = g_new0 (GdkPixbufModule, 1); + (*fill_info) (info); - g_printf ("\"%s\" %d \"%s\" \"%s\"\n", - info->name, info->flags, - info->domain ? info->domain : GETTEXT_PACKAGE, info->description); - for (mime = info->mime_types; *mime; mime++) { - g_printf ("\"%s\" ", *mime); - } - g_printf ("\"\"\n"); - for (ext = info->extensions; *ext; ext++) { - g_printf ("\"%s\" ", *ext); - } - g_printf ("\"\"\n"); - for (pattern = info->signature; pattern->prefix; pattern++) { - print_escaped (pattern->prefix); - print_escaped (pattern->mask ? (const char *)pattern->mask : ""); - g_printf ("%d\n", pattern->relevance); - } - g_printf ("\n"); + (*fill_vtable) (vtable); + + if (loader_sanity_check (path, info, vtable)) + write_loader_info (path, info); + g_free (info); + g_free (vtable); } else { if (module == NULL)