> ----- Original Message -----

> From: Daniel Brendle <grindh...@skarphed.org>
> Sent: Monday, 5 December 2016, 7:53
> Subject: [Vala] VAPI-Bindings to obscure c-types.

> In libode's code, there is a type called dReal. Depending on some
> compiler flags, dReal might be a double or a float:

> #if defined(dSINGLE)
> typedef float dReal;
> #ifdef dDOUBLE
> #error You can only #define dSINGLE or dDOUBLE, not both.
> #endif /* dDOUBLE */
> #elif defined(dDOUBLE)
> typedef double dReal;
> #else
> #error You must #define dSINGLE or dDOUBLE
> #endif

> The library then uses dReal in various method signatures that I have to

> bind against. Is there any possibility to cover this in vala?


These are macros that are defined without a value and are used by the C 
pre-processor. To define such a macro from valac, as you probably know, you use 
the -X option:
valac --pkg libode6 -X -DdDOUBLE example.vala

Vala has a similiar, but much simpler, pre-processor:
https://wiki.gnome.org/Projects/Vala/Manual/Preprocessor
https://wiki.gnome.org/Projects/Vala/ConditionalCompilationSample

The Vala pre-processor can also be used in a VAPI file:
#if ODE_FLOAT
  [SimpleType]

  [CCode (cname = "dReal", has_type_id = false)]
  public struct dReal : float {
  }
#else
  [SimpleType]
  [CCode (cname = "dReal", has_type_id = false)]
  public struct dReal : double {
  }
#endif

So for double you would compile with:
valac --pkg libode6 -X -DdDOUBLE example.vala


and for float:
valac --pkg libode6 -X -DdSINGLE -D ODE_FLOAT example.vala

You will have to use separate declarations for both the C pre-processor and the 
Vala pre-processor. While you can define a macro in a .vala file by using 
const, this cannot currently be emitted before the #include in the generated C 
file. So it is not set at the time when the C header is processed.

This is untested and probably doesn't reflect your binding, but should convey 
the method.

Al
_______________________________________________
vala-list mailing list
vala-list@gnome.org
https://mail.gnome.org/mailman/listinfo/vala-list

Reply via email to