On 01/28/22 18:04, Richard W.M. Jones wrote:
 On Fri, Jan 28, 2022 at 05:12:14PM +0100, Laszlo Ersek wrote:
> Move the guts of v2v_osinfo_os_get_all_devices() to a new static function
> called v2v_osinfo_device_list_to_value_list().
>
> Bugzilla: 
https://bugzilla.redhat.com/show_bug.cgi?id=2043333
> Signed-off-by: Laszlo Ersek <lersek(a)redhat.com>
> ---
>  convert/libosinfo-c.c | 126 +++++++++++++++++++++++-------------------
>  1 file changed, 68 insertions(+), 58 deletions(-)
>
> diff --git a/convert/libosinfo-c.c b/convert/libosinfo-c.c
> index ec7c06d379e3..bc5816f6dacb 100644
> --- a/convert/libosinfo-c.c
> +++ b/convert/libosinfo-c.c
> @@ -207,65 +207,12 @@ glist_to_value_list (GList *list)
>      rv = v;
>    }
>  
>    CAMLreturn (rv);
>  }
>  
> -value
> -v2v_osinfo_os_get_device_drivers (value osv)
> -{
> -  CAMLparam1 (osv);
> -  CAMLlocal4 (rv, v, vi, copyv);
> -  OsinfoDeviceDriverList *list;
> -  gint i, len;
> -
> -  list = osinfo_os_get_device_drivers (OsinfoOs_t_val (osv));
> -  len = osinfo_list_get_length (OSINFO_LIST(list));
> -
> -  rv = Val_emptylist;
> -  for (i = len - 1; i >= 0; --i) {
> -    OsinfoDeviceDriver *driver;
> -    const gchar *str;
> -    gboolean b;
> -    GList *l;
> -    gint64 i64;
> -
> -    driver = OSINFO_DEVICE_DRIVER(osinfo_list_get_nth (OSINFO_LIST(list), i));
> -
> -    vi = caml_alloc (6, 0);
> -    str = osinfo_device_driver_get_architecture (driver);
> -    copyv = caml_copy_string (str);
> -    Store_field (vi, 0, copyv);
> -    str = osinfo_device_driver_get_location (driver);
> -    copyv = caml_copy_string (str);
> -    Store_field (vi, 1, copyv);
> -    b = osinfo_device_driver_get_pre_installable (driver);
> -    Store_field (vi, 2, Val_bool (b));
> -    b = osinfo_device_driver_get_signed (driver);
> -    Store_field (vi, 3, Val_bool (b));
> -#if IS_LIBOSINFO_VERSION(1, 7, 0)
> -    i64 = osinfo_device_driver_get_priority (driver);
> -#else
> -    /* Same as OSINFO_DEVICE_DRIVER_DEFAULT_PRIORITY in libosinfo 1.7.0+. */
> -    i64 = 50;
> -#endif
> -    copyv = caml_copy_int64 (i64);
> -    Store_field (vi, 4, copyv);
> -    l = osinfo_device_driver_get_files (driver);
> -    Store_field (vi, 5, glist_to_value_list (l));
> -    g_list_free (l);
> -
> -    v = caml_alloc (2, 0);
> -    Store_field (v, 0, vi);
> -    Store_field (v, 1, rv);
> -    rv = v;
> -  }
> -
> -  CAMLreturn (rv);
> -}
> -
>  /* Collect OsinfoDevice properties from two levels:
>   *
>   * - The OSINFO_ENTITY_PROP_ID property, originating from the OsinfoEntity base
>   *   class. This is a unique URI, identifying the device.
>   *
>   * - All currently known OSINFO_DEVICE_PROP_* properties, originating from the
> @@ -285,23 +232,21 @@ static const char * const device_prop[] = {
>    OSINFO_DEVICE_PROP_CLASS,
>    OSINFO_DEVICE_PROP_BUS_TYPE,
>    OSINFO_DEVICE_PROP_SUBSYSTEM,
>  };
>  #define NUM_DEVICE_PROPS (sizeof device_prop / sizeof device_prop[0])
>  
> -value
> -v2v_osinfo_os_get_all_devices (value osv)
> +static value
> +v2v_osinfo_device_list_to_value_list (OsinfoDeviceList *dev_list)
>  {
> -  CAMLparam1 (osv);
> +  CAMLparam0 ();
>    CAMLlocal4 (retvalv, linkv, propsv, copyv);
> -  g_autoptr (OsinfoDeviceList) dev_list = NULL;
>    OsinfoList *ent_list;
>    gint ent_nr;
>  
>    retvalv = Val_emptylist;
> -  dev_list = osinfo_os_get_all_devices (OsinfoOs_t_val (osv), NULL);
>    ent_list = OSINFO_LIST (dev_list);
>    ent_nr = osinfo_list_get_length (ent_list);
>  
>    while (ent_nr > 0) {
>      OsinfoEntity *ent;
>      size_t prop_nr;
> @@ -325,6 +270,71 @@ v2v_osinfo_os_get_all_devices (value osv)
>      Store_field (linkv, 1, retvalv);
>      retvalv = linkv;
>    }
>  
>    CAMLreturn (retvalv);
>  }
> +
> +value
> +v2v_osinfo_os_get_device_drivers (value osv)
> +{
> +  CAMLparam1 (osv);
> +  CAMLlocal4 (rv, v, vi, copyv);
> +  OsinfoDeviceDriverList *list;
> +  gint i, len;
> +
> +  list = osinfo_os_get_device_drivers (OsinfoOs_t_val (osv));
> +  len = osinfo_list_get_length (OSINFO_LIST(list));
> +
> +  rv = Val_emptylist;
> +  for (i = len - 1; i >= 0; --i) {
> +    OsinfoDeviceDriver *driver;
> +    const gchar *str;
> +    gboolean b;
> +    GList *l;
> +    gint64 i64;
> +
> +    driver = OSINFO_DEVICE_DRIVER(osinfo_list_get_nth (OSINFO_LIST(list), i));
> +
> +    vi = caml_alloc (6, 0);
> +    str = osinfo_device_driver_get_architecture (driver);
> +    copyv = caml_copy_string (str);
> +    Store_field (vi, 0, copyv);
> +    str = osinfo_device_driver_get_location (driver);
> +    copyv = caml_copy_string (str);
> +    Store_field (vi, 1, copyv);
> +    b = osinfo_device_driver_get_pre_installable (driver);
> +    Store_field (vi, 2, Val_bool (b));
> +    b = osinfo_device_driver_get_signed (driver);
> +    Store_field (vi, 3, Val_bool (b));
> +#if IS_LIBOSINFO_VERSION(1, 7, 0)
> +    i64 = osinfo_device_driver_get_priority (driver);
> +#else
> +    /* Same as OSINFO_DEVICE_DRIVER_DEFAULT_PRIORITY in libosinfo 1.7.0+. */
> +    i64 = 50;
> +#endif
> +    copyv = caml_copy_int64 (i64);
> +    Store_field (vi, 4, copyv);
> +    l = osinfo_device_driver_get_files (driver);
> +    Store_field (vi, 5, glist_to_value_list (l));
> +    g_list_free (l);
> +
> +    v = caml_alloc (2, 0);
> +    Store_field (v, 0, vi);
> +    Store_field (v, 1, rv);
> +    rv = v;
> +  }
> +
> +  CAMLreturn (rv);
> +}
> +
> +value
> +v2v_osinfo_os_get_all_devices (value osv)
> +{
> +  CAMLparam1 (osv);
> +  CAMLlocal1 (retvalv);
> +  g_autoptr (OsinfoDeviceList) dev_list = NULL;
> +
> +  dev_list = osinfo_os_get_all_devices (OsinfoOs_t_val (osv), NULL);
> +  retvalv = v2v_osinfo_device_list_to_value_list (dev_list);
> +  CAMLreturn (retvalv);
> +}
 
 Patch is a bit confusing because of the necessary reordering of
 functions, 
I was surprised myself, but this is what the "patience" diff algorithm
generates, which I've grown to prefer (in general) very much to the
default "myers" diff algorithm.
 but looks good.