Copyright © Quviq AB, 2013-2023
Version: 1.46.3
This module provides a tool for generating conversion functions for enum-like C types.
Example use: given the C header fileanswer.h
:
typedef int Answer; #define YES 1 #define NO 0we can define
-module(enum_test). -compile(export_all). start() -> eqc_c_enum:load(answer_enum, ["answer.h"], {"Answer", ['YES', 'NO']}), eqc_c:start(answer, [{c_src, "answer.h"}, {casts, answer_enum}]).We can then work with
YES
and NO
as values of type Answer
:
1> enum_test:start(). ok 2> Ans = eqc_c:alloc("Answer", 'YES'). {ptr, "Answer", 140243361595616} 3> eqc_c:deref(Ans). 'YES'
You can also generate conversion functions for bitmask types, by giving the
bitmask
option to eqc_c_enum:load/2
. In this case C values are
converted to and from lists of atoms. For example, given bitmasks.h
:
typedef int XYZ; #define HAS_X 1 #define HAS_Y 2 #define HAS_Z 4we can load it as follows
1> eqc_c_enum:load(xyz, ["bitmasks.h"], {"XYZ", ['HAS_X', 'HAS_Y', 'HAS_Z'], bitmask}). ok 2> eqc_c:start(bitmasks, [{c_src, "bitmasks.h"}, {casts, xyz}]). ok 3> eqc_c:alloc("XYZ", 5). {ptr, "XYZ", 140567464902656} 4> eqc_c:deref(v(-1)). ['HAS_X', 'HAS_Z']
load/3 | Equivalent to load(Module, Includes, TypeSpecs, []). |
load/4 | Generate and load a module Module suitable for use as a casts
module with eqc_c:start/2 . |
load_module/2 | Equivalent to load_module(Module, Callback, []). |
load_module/3 | Given a callback module a type_cast module is generated. |
load(Module::atom(), Includes::[string()], TypeSpecs) -> ok
Equivalent to load(Module, Includes, TypeSpecs, []).
load(Module::atom(), Includes::[string()], TypeSpecs, Options::proplists:proplist()) -> ok
Generate and load a module Module
suitable for use as a casts
module with eqc_c:start/2
. Each TypeSpec
in TypeSpecs
is
a tuple, {Type, Tags}
. The function creates the functions
to_c/2
and from_c/2
converting between C integers and the atoms given
in Tags
. For each tag there should be a #define
in the include
files Includes
providing its value. If Tags
is a list of pairs,
the first component of each pair specifies the name of the #define and the
second component the desired Erlang value.
The type options can be used to restrict the conversion to be oneway.
With the read_only
option no conversion will take place from Erlang
to C, and with write_only
there is no conversion from C to Erlang.
The write_only
option is useful when there is no typedef on the C
side indicating when conversion to Erlang should take place.
If the bitmask
option is used, conversion from C produces a list of
all the atoms whose corresponding bits are set in the value. Conversion
from Erlang takes a list of atoms to the bitwise or of the corresponding
values.
Options
are passed to eqc_c:start/2
when starting the C
program to retrieve the tag values.
load_module(Module::atom(), Callback::atom()) -> ok
Equivalent to load_module(Module, Callback, []).
load_module(Module::atom(), Callback::atom(), Options::proplists:proplist()) -> ok
Given a callback module a type_cast module is generated. A callback module contains one obligatory function includes/0, which should return all C header files with #define's in it that one wants to represent symbolically in Erlang tests.
All other 0-ary functions in the callback module are considered type definitions for the symbols. For example, a function
'ReturnType'() -> [ 'OK', 'NOT_OK' ].Defines a type with two values which are defined in one of the specified header files. This allows the user to use 'OK' and 'NOT_OK' in the Erlang test specifications, instead of hard-coding their actual values. Type options can be supplied by returning a pair from the function:
'XYZ'() -> {['HAS_X', 'HAS_Y', 'HAS_Z'], bitmask}.
The provided Module is used by eqc_c as type cast module and should be added in
the compiler options to eqc_c:start/2
as {casts, Module}
.
Generated by EDoc