[retro-gtk/auto-goodness: 35/36] core-descriptor: Use auto cleanups and throws where possible



commit 3af9a3d8624eb44378be5d2e77f24784bea51e24
Author: Adrien Plazas <kekun plazas laposte net>
Date:   Mon Mar 23 21:47:03 2020 +0100

    core-descriptor: Use auto cleanups and throws where possible

 retro-gtk/retro-core-descriptor.c | 332 ++++++++++----------------------------
 1 file changed, 84 insertions(+), 248 deletions(-)
---
diff --git a/retro-gtk/retro-core-descriptor.c b/retro-gtk/retro-core-descriptor.c
index 5e3dae2..ce8b704 100644
--- a/retro-gtk/retro-core-descriptor.c
+++ b/retro-gtk/retro-core-descriptor.c
@@ -2,6 +2,8 @@
 
 #include "retro-core-descriptor.h"
 
+#include "retro-error-private.h"
+
 struct _RetroCoreDescriptor
 {
   GObject parent_instance;
@@ -73,17 +75,14 @@ has_group_prefixed (RetroCoreDescriptor *self,
                     const gchar         *group_prefix,
                     const gchar         *group_suffix)
 {
-  gchar *group;
-  gboolean result;
+  g_autofree gchar *group = NULL;
 
   g_assert (group_prefix != NULL);
   g_assert (group_suffix != NULL);
 
   group = g_strconcat (group_prefix, group_suffix, NULL);
-  result = g_key_file_has_group (self->key_file, group);
-  g_free (group);
 
-  return result;
+  return g_key_file_has_group (self->key_file, group);
 }
 
 static gboolean
@@ -93,9 +92,9 @@ has_key_prefixed (RetroCoreDescriptor  *self,
                   const gchar          *key,
                   GError              **error)
 {
-  gchar *group;
+  g_autofree gchar *group = NULL;
   gboolean result;
-  GError *tmp_error = NULL;
+  g_autoptr (RetroError) tmp_error = NULL;
 
   g_assert (group_prefix != NULL);
   g_assert (group_suffix != NULL);
@@ -106,14 +105,7 @@ has_key_prefixed (RetroCoreDescriptor  *self,
                                group,
                                key,
                                &tmp_error);
-  if (G_UNLIKELY (tmp_error != NULL)) {
-    g_free (group);
-    g_propagate_error (error, tmp_error);
-
-    return FALSE;
-  }
-
-  g_free (group);
+  retro_propagate_val_if_error (error, tmp_error, FALSE);
 
   return result;
 }
@@ -125,9 +117,9 @@ get_string_prefixed (RetroCoreDescriptor  *self,
                      const gchar          *key,
                      GError              **error)
 {
-  gchar *group;
-  gchar *result;
-  GError *tmp_error = NULL;
+  g_autofree gchar *group = NULL;
+  g_autofree gchar *result = NULL;
+  g_autoptr (RetroError) tmp_error = NULL;
 
   g_assert (group_prefix != NULL);
   g_assert (group_suffix != NULL);
@@ -139,16 +131,9 @@ get_string_prefixed (RetroCoreDescriptor  *self,
                                   group,
                                   key,
                                   &tmp_error);
-  if (G_UNLIKELY (tmp_error != NULL)) {
-    g_free (group);
-    g_propagate_error (error, tmp_error);
+  retro_propagate_val_if_error (error, tmp_error, NULL);
 
-    return NULL;
-  }
-
-  g_free (group);
-
-  return result;
+  return g_steal_pointer (&result);
 }
 
 static gchar **
@@ -159,9 +144,9 @@ get_string_list_prefixed (RetroCoreDescriptor  *self,
                           gsize                *length,
                           GError              **error)
 {
-  gchar *group;
-  gchar **result;
-  GError *tmp_error = NULL;
+  g_autofree gchar *group = NULL;
+  g_auto (GStrv) result = NULL;
+  g_autoptr (RetroError) tmp_error = NULL;
 
   g_assert (group_prefix != NULL);
   g_assert (group_suffix != NULL);
@@ -174,16 +159,9 @@ get_string_list_prefixed (RetroCoreDescriptor  *self,
                                        key,
                                        length,
                                        &tmp_error);
-  if (G_UNLIKELY (tmp_error != NULL)) {
-  g_free (group);
-    g_propagate_error (error, tmp_error);
+  retro_propagate_val_if_error (error, tmp_error, NULL);
 
-    return NULL;
-  }
-
-  g_free (group);
-
-  return result;
+  return g_steal_pointer (&result);
 }
 
 static void
@@ -193,7 +171,7 @@ check_has_required_key (RetroCoreDescriptor  *self,
                         GError              **error)
 {
   gboolean has_key;
-  GError *tmp_error = NULL;
+  g_autoptr (RetroError) tmp_error = NULL;
 
   g_assert (group != NULL);
   g_assert (key != NULL);
@@ -202,68 +180,44 @@ check_has_required_key (RetroCoreDescriptor  *self,
                                 RETRO_CORE_DESCRIPTOR_LIBRETRO_GROUP,
                                 RETRO_CORE_DESCRIPTOR_TYPE_KEY,
                                 &tmp_error);
-  if (G_UNLIKELY (tmp_error != NULL)) {
-    g_propagate_error (error, tmp_error);
+  retro_propagate_if_error (error, tmp_error);
 
-    return;
-  }
-
-  if (!has_key)
-    g_set_error (error,
-                 RETRO_CORE_DESCRIPTOR_ERROR,
-                 RETRO_CORE_DESCRIPTOR_ERROR_REQUIRED_KEY_NOT_FOUND,
-                 "%s isn't a valid Libretro core descriptor: "
-                 "required key %s not found in group [%s].",
-                 self->filename,
-                 key,
-                 group);
+  retro_throw_if_fail (error,
+    has_key,
+    RETRO_CORE_DESCRIPTOR_ERROR, RETRO_CORE_DESCRIPTOR_ERROR_REQUIRED_KEY_NOT_FOUND,
+    "%s isn't a valid Libretro core descriptor: required key %s not found in group [%s].",
+    self->filename, key, group);
 }
 
 static void
 check_libretro_group (RetroCoreDescriptor  *self,
                       GError              **error)
 {
-  GError *tmp_error = NULL;
+  g_autoptr (RetroError) tmp_error = NULL;
 
   check_has_required_key (self,
                           RETRO_CORE_DESCRIPTOR_LIBRETRO_GROUP,
                           RETRO_CORE_DESCRIPTOR_TYPE_KEY,
                           &tmp_error);
-  if (G_UNLIKELY (tmp_error != NULL)) {
-    g_propagate_error (error, tmp_error);
-
-    return;
-  }
+  retro_propagate_if_error (error, tmp_error);
 
   check_has_required_key (self,
                           RETRO_CORE_DESCRIPTOR_LIBRETRO_GROUP,
                           RETRO_CORE_DESCRIPTOR_NAME_KEY,
                           &tmp_error);
-  if (G_UNLIKELY (tmp_error != NULL)) {
-    g_propagate_error (error, tmp_error);
-
-    return;
-  }
+  retro_propagate_if_error (error, tmp_error);
 
   check_has_required_key (self,
                           RETRO_CORE_DESCRIPTOR_LIBRETRO_GROUP,
                           RETRO_CORE_DESCRIPTOR_MODULE_KEY,
                           &tmp_error);
-  if (G_UNLIKELY (tmp_error != NULL)) {
-    g_propagate_error (error, tmp_error);
-
-    return;
-  }
+  retro_propagate_if_error (error, tmp_error);
 
   check_has_required_key (self,
                           RETRO_CORE_DESCRIPTOR_LIBRETRO_GROUP,
                           RETRO_CORE_DESCRIPTOR_LIBRETRO_VERSION_KEY,
                           &tmp_error);
-  if (G_UNLIKELY (tmp_error != NULL)) {
-    g_propagate_error (error, tmp_error);
-
-    return;
-  }
+  retro_propagate_if_error (error, tmp_error);
 }
 
 static void
@@ -272,10 +226,8 @@ check_platform_group (RetroCoreDescriptor  *self,
                       GError              **error)
 {
   gboolean has_key;
-  gchar **firmwares;
-  gchar **firmware_p;
-  gchar *firmware_group;
-  GError *tmp_error = NULL;
+  g_auto (GStrv) firmwares = NULL;
+  g_autoptr (RetroError) tmp_error = NULL;
 
   g_assert (group != NULL);
 
@@ -288,11 +240,7 @@ check_platform_group (RetroCoreDescriptor  *self,
                                 group,
                                 RETRO_CORE_DESCRIPTOR_PLATFORM_FIRMWARES_KEY,
                                 &tmp_error);
-  if (G_UNLIKELY (tmp_error != NULL)) {
-    g_propagate_error (error, tmp_error);
-
-    return;
-  }
+  retro_propagate_if_error (error, tmp_error);
 
   if (!has_key)
     return;
@@ -302,34 +250,16 @@ check_platform_group (RetroCoreDescriptor  *self,
                                           RETRO_CORE_DESCRIPTOR_PLATFORM_FIRMWARES_KEY,
                                           NULL,
                                           &tmp_error);
-  if (G_UNLIKELY (tmp_error != NULL)) {
-    g_propagate_error (error, tmp_error);
-
-    return;
+  retro_propagate_if_error (error, tmp_error);
+
+  for (GStrv firmware_p = firmwares; *firmware_p != NULL; firmware_p++) {
+    g_autofree gchar *firmware_group = g_strconcat (RETRO_CORE_DESCRIPTOR_FIRMWARE_GROUP_PREFIX, 
*firmware_p, NULL);
+    retro_throw_if_fail (error,
+      g_key_file_has_group (self->key_file, firmware_group),
+      RETRO_CORE_DESCRIPTOR_ERROR, RETRO_CORE_DESCRIPTOR_ERROR_FIRMWARE_NOT_FOUND,
+      "%s isn't a valid Libretro core descriptor: [%s] mentioned in [%s] not found.",
+      self->filename, firmware_group, group);
   }
-
-  for (firmware_p = firmwares; *firmware_p != NULL; firmware_p++) {
-    firmware_group = g_strconcat (RETRO_CORE_DESCRIPTOR_FIRMWARE_GROUP_PREFIX, *firmware_p, NULL);
-    if (!g_key_file_has_group (self->key_file, firmware_group)) {
-      g_set_error (error,
-                   RETRO_CORE_DESCRIPTOR_ERROR,
-                   RETRO_CORE_DESCRIPTOR_ERROR_FIRMWARE_NOT_FOUND,
-                   "%s isn't a valid Libretro core descriptor:"
-                   "[%s] mentioned in [%s] not found.",
-                   self->filename,
-                   firmware_group,
-                   group);
-
-      g_free (firmware_group);
-      g_strfreev (firmwares);
-
-      return;
-    }
-
-    g_free (firmware_group);
-  }
-
-  g_strfreev (firmwares);
 }
 
 static void
@@ -337,7 +267,7 @@ check_firmware_group (RetroCoreDescriptor  *self,
                       const gchar          *group,
                       GError              **error)
 {
-  GError *tmp_error = NULL;
+  g_autoptr (RetroError) tmp_error = NULL;
 
   g_assert (group != NULL);
 
@@ -345,21 +275,13 @@ check_firmware_group (RetroCoreDescriptor  *self,
                           group,
                           RETRO_CORE_DESCRIPTOR_FIRMWARE_PATH_KEY,
                           &tmp_error);
-  if (G_UNLIKELY (tmp_error != NULL)) {
-    g_propagate_error (error, tmp_error);
-
-    return;
-  }
+  retro_propagate_if_error (error, tmp_error);
 
   check_has_required_key (self,
                           group,
                           RETRO_CORE_DESCRIPTOR_FIRMWARE_MANDATORY_KEY,
                           &tmp_error);
-  if (G_UNLIKELY (tmp_error != NULL)) {
-    g_propagate_error (error, tmp_error);
-
-    return;
-  }
+  retro_propagate_if_error (error, tmp_error);
 }
 
 /* Public */
@@ -378,7 +300,7 @@ retro_core_descriptor_has_icon (RetroCoreDescriptor  *self,
                                 GError              **error)
 {
   gboolean has_icon;
-  GError *tmp_error = NULL;
+  g_autoptr (RetroError) tmp_error = NULL;
 
   g_return_val_if_fail (RETRO_IS_CORE_DESCRIPTOR (self), FALSE);
 
@@ -386,11 +308,7 @@ retro_core_descriptor_has_icon (RetroCoreDescriptor  *self,
                                  RETRO_CORE_DESCRIPTOR_LIBRETRO_GROUP,
                                  RETRO_CORE_DESCRIPTOR_ICON_KEY,
                                  &tmp_error);
-  if (G_UNLIKELY (tmp_error != NULL)) {
-    g_propagate_error (error, tmp_error);
-
-    return FALSE;
-  }
+  retro_propagate_val_if_error (error, tmp_error, FALSE);
 
   return has_icon;
 }
@@ -406,16 +324,13 @@ retro_core_descriptor_has_icon (RetroCoreDescriptor  *self,
 gchar *
 retro_core_descriptor_get_uri (RetroCoreDescriptor *self)
 {
-  gchar *result;
-  GFile *file;
+  g_autoptr (GFile) file = NULL;
 
   g_return_val_if_fail (RETRO_IS_CORE_DESCRIPTOR (self), NULL);
 
   file = g_file_new_for_path (self->filename);
-  result = g_file_get_uri (file);
-  g_object_unref (file);
 
-  return result;
+  return g_file_get_uri (file);
 }
 
 /**
@@ -447,9 +362,8 @@ gboolean
 retro_core_descriptor_get_is_game (RetroCoreDescriptor  *self,
                                    GError              **error)
 {
-  gchar *type;
-  gboolean is_game;
-  GError *tmp_error = NULL;
+  g_autofree gchar *type = NULL;
+  g_autoptr (RetroError) tmp_error = NULL;
 
   g_return_val_if_fail (RETRO_IS_CORE_DESCRIPTOR (self), FALSE);
 
@@ -457,16 +371,9 @@ retro_core_descriptor_get_is_game (RetroCoreDescriptor  *self,
                                   RETRO_CORE_DESCRIPTOR_LIBRETRO_GROUP,
                                   RETRO_CORE_DESCRIPTOR_TYPE_KEY,
                                   &tmp_error);
-  if (G_UNLIKELY (tmp_error != NULL)) {
-    g_propagate_error (error, tmp_error);
-
-    return FALSE;
-  }
+  retro_propagate_val_if_error (error, tmp_error, FALSE);
 
-  is_game = g_strcmp0 (type, RETRO_CORE_DESCRIPTOR_TYPE_GAME) == 0;
-  g_free (type);
-
-  return is_game;
+  return g_strcmp0 (type, RETRO_CORE_DESCRIPTOR_TYPE_GAME) == 0;
 }
 
 /**
@@ -482,9 +389,8 @@ gboolean
 retro_core_descriptor_get_is_emulator (RetroCoreDescriptor  *self,
                                        GError              **error)
 {
-  gchar *type;
-  gboolean is_game;
-  GError *tmp_error = NULL;
+  g_autofree gchar *type = NULL;
+  g_autoptr (RetroError) tmp_error = NULL;
 
   g_return_val_if_fail (RETRO_IS_CORE_DESCRIPTOR (self), FALSE);
 
@@ -492,16 +398,9 @@ retro_core_descriptor_get_is_emulator (RetroCoreDescriptor  *self,
                                   RETRO_CORE_DESCRIPTOR_LIBRETRO_GROUP,
                                   RETRO_CORE_DESCRIPTOR_TYPE_KEY,
                                   &tmp_error);
-  if (G_UNLIKELY (tmp_error != NULL)) {
-    g_propagate_error (error, tmp_error);
-
-    return FALSE;
-  }
+  retro_propagate_val_if_error (error, tmp_error, FALSE);
 
-  is_game = g_strcmp0 (type, RETRO_CORE_DESCRIPTOR_TYPE_EMULATOR) == 0;
-  g_free (type);
-
-  return is_game;
+  return g_strcmp0 (type, RETRO_CORE_DESCRIPTOR_TYPE_EMULATOR) == 0;
 }
 
 /**
@@ -536,9 +435,8 @@ GIcon *
 retro_core_descriptor_get_icon (RetroCoreDescriptor  *self,
                                 GError              **error)
 {
-  gchar *icon_name;
-  GIcon *icon;
-  GError *tmp_error = NULL;
+  g_autofree gchar *icon_name = NULL;
+  g_autoptr (RetroError) tmp_error = NULL;
 
   g_return_val_if_fail (RETRO_IS_CORE_DESCRIPTOR (self), NULL);
 
@@ -546,16 +444,9 @@ retro_core_descriptor_get_icon (RetroCoreDescriptor  *self,
                                      RETRO_CORE_DESCRIPTOR_LIBRETRO_GROUP,
                                      RETRO_CORE_DESCRIPTOR_ICON_KEY,
                                      &tmp_error);
-  if (G_UNLIKELY (tmp_error != NULL)) {
-    g_propagate_error (error, tmp_error);
-
-    return NULL;
-  }
-
-  icon = G_ICON (g_themed_icon_new (icon_name));
-  g_free (icon_name);
+  retro_propagate_val_if_error (error, tmp_error, NULL);
 
-  return icon;
+  return G_ICON (g_themed_icon_new (icon_name));
 }
 
 /**
@@ -592,41 +483,27 @@ GFile *
 retro_core_descriptor_get_module_file (RetroCoreDescriptor  *self,
                                        GError              **error)
 {
-  GFile *file;
-  GFile *dir;
-  gchar *module;
-  GFile *module_file;
-  GError *tmp_error = NULL;
+  g_autoptr (GFile) file = NULL;
+  g_autoptr (GFile) dir = NULL;
+  g_autofree gchar *module = NULL;
+  g_autoptr (GFile) module_file = NULL;
+  g_autoptr (RetroError) tmp_error = NULL;
 
   g_return_val_if_fail (RETRO_IS_CORE_DESCRIPTOR (self), NULL);
 
   file = g_file_new_for_path (self->filename);
   dir = g_file_get_parent (file);
-  g_object_unref (file);
   if (dir == NULL)
     return NULL;
 
   module = retro_core_descriptor_get_module (self, &tmp_error);
-  if (G_UNLIKELY (tmp_error != NULL)) {
-    g_propagate_error (error, tmp_error);
-    g_object_unref (dir);
-
-    return NULL;
-  }
+  retro_propagate_val_if_error (error, tmp_error, NULL);
 
   module_file = g_file_get_child (dir, module);
-  if (!g_file_query_exists (module_file, NULL)) {
-    g_object_unref (dir);
-    g_free (module);
-    g_object_unref (module_file);
-
+  if (!g_file_query_exists (module_file, NULL))
     return NULL;
-  }
 
-  g_object_unref (dir);
-  g_free (module);
-
-  return module_file;
+  return g_steal_pointer (&module_file);
 }
 
 /**
@@ -850,9 +727,9 @@ retro_core_descriptor_get_is_firmware_mandatory (RetroCoreDescriptor  *self,
                                                  const gchar          *firmware,
                                                  GError              **error)
 {
-  gchar *group;
+  g_autofree gchar *group = NULL;
   gboolean result;
-  GError *tmp_error = NULL;
+  g_autoptr (RetroError) tmp_error = NULL;
 
   g_return_val_if_fail (RETRO_IS_CORE_DESCRIPTOR (self), FALSE);
   g_return_val_if_fail (firmware != NULL, FALSE);
@@ -862,14 +739,7 @@ retro_core_descriptor_get_is_firmware_mandatory (RetroCoreDescriptor  *self,
                                    group,
                                    RETRO_CORE_DESCRIPTOR_FIRMWARE_MANDATORY_KEY,
                                    &tmp_error);
-  if (G_UNLIKELY (tmp_error != NULL)) {
-    g_free (group);
-    g_propagate_error (error, tmp_error);
-
-    return FALSE;
-  }
-
-  g_free (group);
+  retro_propagate_val_if_error (error, tmp_error, FALSE);
 
   return result;
 }
@@ -891,9 +761,9 @@ retro_core_descriptor_get_platform_supports_mime_types (RetroCoreDescriptor  *se
                                                         const gchar * const  *mime_types,
                                                         GError              **error)
 {
-  gchar **supported_mime_types;
+  g_auto (GStrv) supported_mime_types = NULL;
   gsize supported_mime_types_length;
-  GError *tmp_error = NULL;
+  g_autoptr (RetroError) tmp_error = NULL;
 
   g_return_val_if_fail (RETRO_IS_CORE_DESCRIPTOR (self), FALSE);
   g_return_val_if_fail (platform != NULL, FALSE);
@@ -904,21 +774,12 @@ retro_core_descriptor_get_platform_supports_mime_types (RetroCoreDescriptor  *se
                                          platform,
                                          &supported_mime_types_length,
                                          &tmp_error);
-  if (G_UNLIKELY (tmp_error != NULL)) {
-    g_propagate_error (error, tmp_error);
-
-    return FALSE;
-  }
+  retro_propagate_val_if_error (error, tmp_error, FALSE);
 
   for (; *mime_types != NULL; mime_types++)
     if (!g_strv_contains ((const char * const *) supported_mime_types,
-                          *mime_types)) {
-      g_strfreev (supported_mime_types);
-
+                          *mime_types))
       return FALSE;
-    }
-
-  g_strfreev (supported_mime_types);
 
   return TRUE;
 }
@@ -936,11 +797,10 @@ RetroCoreDescriptor *
 retro_core_descriptor_new (const gchar  *filename,
                            GError      **error)
 {
-  RetroCoreDescriptor *self;
-  gchar ** groups;
+  g_autoptr (RetroCoreDescriptor) self = NULL;
+  g_auto (GStrv) groups = NULL;
   gsize groups_length;
-  gsize i;
-  GError *tmp_error = NULL;
+  g_autoptr (RetroError) tmp_error = NULL;
 
   g_return_val_if_fail (filename != NULL, NULL);
 
@@ -951,48 +811,24 @@ retro_core_descriptor_new (const gchar  *filename,
                              filename,
                              G_KEY_FILE_NONE,
                              &tmp_error);
-  if (G_UNLIKELY (tmp_error != NULL)) {
-    g_object_unref (self);
-    g_propagate_error (error, tmp_error);
-
-    return NULL;
-  }
+  retro_propagate_val_if_error (error, tmp_error, NULL);
 
   check_libretro_group (self, &tmp_error);
-  if (G_UNLIKELY (tmp_error != NULL)) {
-    g_object_unref (self);
-    g_propagate_error (error, tmp_error);
-
-    return NULL;
-  }
+  retro_propagate_val_if_error (error, tmp_error, NULL);
 
   groups = g_key_file_get_groups (self->key_file, &groups_length);
-  for (i = 0; i < groups_length; i++) {
+  for (gsize i = 0; i < groups_length; i++) {
     if (g_str_has_prefix (groups[i],
                           RETRO_CORE_DESCRIPTOR_PLATFORM_GROUP_PREFIX)) {
       check_platform_group (self, groups[i], &tmp_error);
-      if (G_UNLIKELY (tmp_error != NULL)) {
-        g_strfreev (groups);
-        g_object_unref (self);
-        g_propagate_error (error, tmp_error);
-
-        return NULL;
-      }
+      retro_propagate_val_if_error (error, tmp_error, NULL);
     }
     else if (g_str_has_prefix (groups[i],
                                RETRO_CORE_DESCRIPTOR_FIRMWARE_GROUP_PREFIX)) {
       check_firmware_group (self, groups[i], &tmp_error);
-      if (G_UNLIKELY (tmp_error != NULL)) {
-        g_strfreev (groups);
-        g_object_unref (self);
-        g_propagate_error (error, tmp_error);
-
-        return NULL;
-      }
+      retro_propagate_val_if_error (error, tmp_error, NULL);
     }
   }
 
-  g_strfreev (groups);
-
-  return self;
+  return g_steal_pointer (&self);
 }


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]