Current section

Files

Jump to
rclex priv templates rclex.gen.msgs msg_c.eex
Raw

priv/templates/rclex.gen.msgs/msg_c.eex

// clang-format off
#include "<%= header_name %>.h"
#include "../../../macros.h"
#include "../../../resource_types.h"
#include "../../../terms.h"
#include <erl_nif.h>
#include <rosidl_runtime_c/message_type_support_struct.h>
#include <rosidl_runtime_c/primitives_sequence.h>
#include <rosidl_runtime_c/primitives_sequence_functions.h>
#include <rosidl_runtime_c/string.h>
#include <rosidl_runtime_c/string_functions.h>
<%= for deps_header_prefix <- deps_header_prefix_list do %>
#include <<%= deps_header_prefix %>__functions.h>
#include <<%= deps_header_prefix %>__struct.h>
<% end %>
#include <<%= header_prefix %>__functions.h>
#include <<%= header_prefix %>__struct.h>
#include <<%= header_prefix %>__type_support.h>
#include <stddef.h>
#include <stdint.h>
#include <string.h>
ERL_NIF_TERM <%= function_prefix %>_type_support(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]) {
ignore_unused(argv);
if (argc != 0) return enif_make_badarg(env);
const rosidl_message_type_support_t *ts_p = <%= rosidl_get_msg_type_support %>;
rosidl_message_type_support_t *obj = enif_alloc_resource(rt_rosidl_message_type_support_t, sizeof(rosidl_message_type_support_t));
*obj = *ts_p;
ERL_NIF_TERM term = enif_make_resource(env, obj);
enif_release_resource(obj);
return term;
}
ERL_NIF_TERM <%= function_prefix %>_create(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]) {
ignore_unused(argv);
if (argc != 0) return enif_make_badarg(env);
<%= c_type %> *message_p = <%= c_type %>__create();
if (message_p == NULL) return raise(env, __FILE__, __LINE__);
void **obj = enif_alloc_resource(rt_ros_message, sizeof(void *));
*obj = (void *)message_p;
ERL_NIF_TERM term = enif_make_resource(env, obj);
enif_release_resource(obj);
return term;
}
ERL_NIF_TERM <%= function_prefix %>_destroy(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]) {
if (argc != 1) return enif_make_badarg(env);
void **ros_message_pp;
if (!enif_get_resource(env, argv[0], rt_ros_message, (void **)&ros_message_pp))
return enif_make_badarg(env);
<%= c_type %> *message_p = (<%= c_type %> *)*ros_message_pp;
<%= c_type %>__destroy(message_p);
return atom_ok;
}
ERL_NIF_TERM <%= function_prefix %>_set(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]) {
if (argc != 2) return enif_make_badarg(env);
void **ros_message_pp;
if (!enif_get_resource(env, argv[0], rt_ros_message, (void **)&ros_message_pp))
return enif_make_badarg(env);
<%= if not is_empty_type? do %>
<%= c_type %> *message_p = (<%= c_type %> *)*ros_message_pp;
int arity;
const ERL_NIF_TERM *tuple;
if (!enif_get_tuple(env, argv[1], &arity, &tuple)) return enif_make_badarg(env);
<%= set_fun_fragments %>
<% end %>
return atom_ok;
}
ERL_NIF_TERM <%= function_prefix %>_get(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]) {
if (argc != 1) return enif_make_badarg(env);
void **ros_message_pp;
if (!enif_get_resource(env, argv[0], rt_ros_message, (void **)&ros_message_pp))
return enif_make_badarg(env);
<%= if not is_empty_type? do %>
<%= c_type %> *message_p = (<%= c_type %> *)*ros_message_pp;
<% end %>
<%= get_fun_fragments %>
}
// clang-format on