[PATCH v2 1/5] libqmi-glib: add GDOUBLE_FROM_LE and GFLOAT_FROM_LE

Aleksander Morgado aleksander at aleksander.es
Sun Feb 11 20:14:04 UTC 2018


On Sun, Feb 11, 2018 at 7:18 PM, Thomas Weißschuh <thomas at t-8ch.de> wrote:
> On Sun, 2018-02-11T15:12+0100, Aleksander Morgado wrote:
>> On Fri, Feb 9, 2018 at 10:07 PM, Thomas Weißschuh <thomas at t-8ch.de> wrote:
>> > Lifted from Gstreamer gstutils.h v1.12.4.
>> > ---
>> >  .../libqmi-glib/libqmi-glib-common.sections        |  11 ++
>> >  src/libqmi-glib/qmi-utils.h                        | 131 +++++++++++++++++++++
>> >  2 files changed, 142 insertions(+)
>> >
>> > diff --git a/docs/reference/libqmi-glib/libqmi-glib-common.sections b/docs/reference/libqmi-glib/libqmi-glib-common.sections
>> > index bc088e7..bae5a5c 100644
>> > --- a/docs/reference/libqmi-glib/libqmi-glib-common.sections
>> > +++ b/docs/reference/libqmi-glib/libqmi-glib-common.sections
>> > @@ -1208,6 +1208,17 @@ qmi_utils_write_gint64_to_buffer
>> >  qmi_utils_write_sized_guint_to_buffer
>> >  qmi_utils_write_string_to_buffer
>> >  qmi_utils_write_fixed_size_string_to_buffer
>> > +<SUBSECTION Byteorder>
>> > +GFLOAT_FROM_BE
>> > +GFLOAT_FROM_LE
>> > +GFLOAT_SWAP_LE_BE
>> > +GFLOAT_TO_BE
>> > +GFLOAT_TO_LE
>> > +GDOUBLE_FROM_BE
>> > +GDOUBLE_FROM_LE
>> > +GDOUBLE_SWAP_LE_BE
>> > +GDOUBLE_TO_BE
>> > +GDOUBLE_TO_LE
>> >  </SECTION>
>> >
>>
>> Don't know what GStreamer is doing, but we should not introduce public
>> symbols for these operations, especially if they start with the G
>> prefix.
>> It would be ok to have them defined in qmi-utils.h, but inside the #if
>> defined (LIBQMI_GLIB_COMPILATION) section and flagged with
>> G_GNUC_INTERNAL (and not documented anywhere in the API)
>
> I assumed wrongly that the header was internal.
> Will do.
>
>> If they're internal we can keep them named like that, or better, avoid
>> future incompatibilities just naming them as "__GDOUBLE_TO..." and
>> such. Or even "__QMIDOUBLE_TO...".
>
>> >  <SECTION>
>> > diff --git a/src/libqmi-glib/qmi-utils.h b/src/libqmi-glib/qmi-utils.h
>> > index 4fd5199..ca5c9fd 100644
>> > --- a/src/libqmi-glib/qmi-utils.h
>> > +++ b/src/libqmi-glib/qmi-utils.h
>> > @@ -20,6 +20,10 @@
>> >   *
>> >   * Copyright (C) 2012-2015 Dan Williams <dcbw at redhat.com>
>> >   * Copyright (C) 2012-2017 Aleksander Morgado <aleksander at aleksander.es>
>> > + * Copyright (C) 1999,2000 Erik Walthinsen <omega at cse.ogi.edu>
>> > + * Copyright (C) 2000 Wim Taymans <wtay at chello.be>
>> > + * Copyright (C) 2002 Thomas Vander Stichele <thomas at apestaart.org>
>> > +
>> >   */
>> >
>> >  #ifndef _LIBQMI_GLIB_QMI_UTILS_H_
>> > @@ -653,6 +657,133 @@ G_GNUC_INTERNAL
>> >  gchar *__qmi_utils_get_driver (const gchar *cdc_wdm_path);
>> >  #endif
>> >
>> > +/* FIXME: Remove this once we depend on a GLib version with this */
>> > +#ifndef GFLOAT_FROM_LE
>>
>> Don't think this check will work as it's supposed to. If we ever get
>> to the point where GLib provides any of these methods, we could check
>> for the specific version of GLib here, or have a configure macro
>> checking the support for us during configure. In the meantime (I truly
>> have no idea how these endianness things behave in LE/BE either), I'd
>> suggest to keep them internal *and* renamed to something not starting
>> with G.
>
> In terms of forward compatibility I would prefer to check via #ifdef or
> renaming them.
> I will rename them in the next series.
>

But ifdef wouldn't work for function declarations, that's what I
meant. The usual way to cope with that would be to e.g. AC_CHECK_LIB()
in configure to detect implemented methods in a library and then
include the generated config.h that defines symbols for the methods
looked for during configure.

Renaming them is the easiest way to cope with this now before even
knowing whether GLib wants to support something like this, I would
say.

>> > +/**
>> > + * GFLOAT_SWAP_LE_BE:
>> > + * @in: input value
>> > + *
>> > + * Swap byte order of a 32-bit floating point value (float).
>> > + *
>> > + * Returns: @in byte-swapped.
>> > + */
>> > +static inline gfloat
>> > +GFLOAT_SWAP_LE_BE(gfloat in)
>> > +{
>> > +  union
>> > +  {
>> > +    guint32 i;
>> > +    gfloat f;
>> > +  } u;
>> > +
>> > +  u.f = in;
>> > +  u.i = GUINT32_SWAP_LE_BE (u.i);
>> > +  return u.f;
>> > +}
>> > +
>> > +/**
>> > + * GDOUBLE_SWAP_LE_BE:
>> > + * @in: input value
>> > + *
>> > + * Swap byte order of a 64-bit floating point value (double).
>> > + *
>> > + * Returns: @in byte-swapped.
>> > + */
>> > +static inline gdouble
>> > +GDOUBLE_SWAP_LE_BE(gdouble in)
>> > +{
>> > +  union
>> > +  {
>> > +    guint64 i;
>> > +    gdouble d;
>> > +  } u;
>> > +
>> > +  u.d = in;
>> > +  u.i = GUINT64_SWAP_LE_BE (u.i);
>> > +  return u.d;
>> > +}
>> > +
>> > +/**
>> > + * GDOUBLE_TO_LE:
>> > + * @val: value
>> > + *
>> > + * Convert 64-bit floating point value (double) from native byte order into
>> > + * little endian byte order.
>> > + */
>> > +/**
>> > + * GDOUBLE_TO_BE:
>> > + * @val: value
>> > + *
>> > + * Convert 64-bit floating point value (double) from native byte order into
>> > + * big endian byte order.
>> > + */
>> > +/**
>> > + * GDOUBLE_FROM_LE:
>> > + * @val: value
>> > + *
>> > + * Convert 64-bit floating point value (double) from little endian byte order
>> > + * into native byte order.
>> > + */
>> > +/**
>> > + * GDOUBLE_FROM_BE:
>> > + * @val: value
>> > + *
>> > + * Convert 64-bit floating point value (double) from big endian byte order
>> > + * into native byte order.
>> > + */
>> > +
>> > +/**
>> > + * GFLOAT_TO_LE:
>> > + * @val: value
>> > + *
>> > + * Convert 32-bit floating point value (float) from native byte order into
>> > + * little endian byte order.
>> > + */
>> > +/**
>> > + * GFLOAT_TO_BE:
>> > + * @val: value
>> > + *
>> > + * Convert 32-bit floating point value (float) from native byte order into
>> > + * big endian byte order.
>> > + */
>> > +/**
>> > + * GFLOAT_FROM_LE:
>> > + * @val: value
>> > + *
>> > + * Convert 32-bit floating point value (float) from little endian byte order
>> > + * into native byte order.
>> > + */
>> > +/**
>> > + * GFLOAT_FROM_BE:
>> > + * @val: value
>> > + *
>> > + * Convert 32-bit floating point value (float) from big endian byte order
>> > + * into native byte order.
>> > + */
>> > +
>> > +#if G_BYTE_ORDER == G_LITTLE_ENDIAN
>> > +#define GFLOAT_TO_LE(val)    ((gfloat) (val))
>> > +#define GFLOAT_TO_BE(val)    (GFLOAT_SWAP_LE_BE (val))
>> > +#define GDOUBLE_TO_LE(val)   ((gdouble) (val))
>> > +#define GDOUBLE_TO_BE(val)   (GDOUBLE_SWAP_LE_BE (val))
>> > +
>> > +#elif G_BYTE_ORDER == G_BIG_ENDIAN
>> > +#define GFLOAT_TO_LE(val)    (GFLOAT_SWAP_LE_BE (val))
>> > +#define GFLOAT_TO_BE(val)    ((gfloat) (val))
>> > +#define GDOUBLE_TO_LE(val)   (GDOUBLE_SWAP_LE_BE (val))
>> > +#define GDOUBLE_TO_BE(val)   ((gdouble) (val))
>> > +
>> > +#else /* !G_LITTLE_ENDIAN && !G_BIG_ENDIAN */
>> > +#error unknown ENDIAN type
>> > +#endif /* !G_LITTLE_ENDIAN && !G_BIG_ENDIAN */
>> > +
>> > +#define GFLOAT_FROM_LE(val)  (GFLOAT_TO_LE (val))
>> > +#define GFLOAT_FROM_BE(val)  (GFLOAT_TO_BE (val))
>> > +#define GDOUBLE_FROM_LE(val) (GDOUBLE_TO_LE (val))
>> > +#define GDOUBLE_FROM_BE(val) (GDOUBLE_TO_BE (val))
>> > +
>> > +#endif /* !defined(GFLOAT_FROM_LE) */
>> > +
>> >  G_END_DECLS
>> >
>> >  #endif /* _LIBQMI_GLIB_QMI_UTILS_H_ */
>> > --
>> > 2.16.1
>> >
>>
>>
>>
>> --
>> Aleksander
>> https://aleksander.es



-- 
Aleksander
https://aleksander.es


More information about the libqmi-devel mailing list