Packages
vix
0.16.3
0.40.0
0.39.0
0.38.0
0.37.0
0.36.0
0.35.0
0.34.0
0.33.1
0.33.0
0.32.0
0.31.1
0.31.0
0.30.0
0.29.0
0.28.0
0.27.0
0.26.0
0.25.0
0.24.0
0.23.1
0.22.0
0.21.0
0.20.0
0.19.0
0.18.0
0.17.0
0.16.4
0.16.3
0.16.2
0.16.1
0.16.0
0.15.1
0.15.0
0.14.0
0.13.0
0.12.0
0.11.0
0.10.1
0.10.0
0.9.0
0.8.0
0.7.0
0.6.1
0.6.0
0.5.0
0.4.0
0.3.0
0.2.1
0.2.0
retired
0.1.0
NIF based bindings for libvips
Current section
Files
Jump to
Current section
Files
c_src/utils.h
#ifndef VIX_UTILS_H
#define VIX_UTILS_H
#include "erl_nif.h"
#include <stdbool.h>
/* #define DEBUG */
#define vix_log(...) \
do { \
enif_fprintf(stderr, "%s:%d\t(fn \"%s\") - ", __FILE__, __LINE__, \
__func__); \
enif_fprintf(stderr, __VA_ARGS__); \
enif_fprintf(stderr, "\n"); \
} while (0)
#ifdef DEBUG
#define debug(...) vix_log(__VA_ARGS__)
#define start_timing() ErlNifTime __start = enif_monotonic_time(ERL_NIF_USEC)
#define elapsed_microseconds() (enif_monotonic_time(ERL_NIF_USEC) - __start)
#else
#define debug(...)
#define start_timing()
#define elapsed_microseconds() 0
#endif
#define error(...) \
do { \
char value[10] = {0}; \
size_t value_size = 10; \
if (enif_getenv("VIX_LOG_ERROR", value, &value_size) == 0) { \
if (strcmp(value, "true") == 0) { \
vix_log(__VA_ARGS__); \
} \
} \
} while (0)
#define ASSERT_ARGC(argc, count) \
if (argc != count) { \
error("number of arguments must be %d", count); \
return enif_make_badarg(env); \
}
// Using macro to preserve file and line number metadata in the error log
#define SET_ERROR_RESULT(env, reason, res) \
do { \
res.is_success = false; \
res.result = make_binary(env, reason); \
error(reason); \
} while (0)
#define SET_RESULT_FROM_VIPS_ERROR(env, label, res) \
do { \
res.is_success = false; \
res.result = enif_make_tuple2(env, make_binary(env, label), \
make_binary(env, vips_error_buffer())); \
error("%s: %s", label, vips_error_buffer()); \
vips_error_clear(); \
} while (0)
#define SET_VIX_RESULT(res, term) \
do { \
res.is_success = true; \
res.result = term; \
} while (0)
typedef struct _VixResult {
bool is_success;
ERL_NIF_TERM result;
} VixResult;
/* size of the data is not really needed. but can be useful for debugging */
typedef struct _VixBinaryResource {
void *data;
size_t size;
} VixBinaryResource;
extern ErlNifResourceType *VIX_BINARY_RT;
extern int MAX_G_TYPE_NAME_LENGTH;
extern ERL_NIF_TERM ATOM_OK;
extern ERL_NIF_TERM ATOM_ERROR;
extern ERL_NIF_TERM ATOM_NIL;
extern ERL_NIF_TERM ATOM_TRUE;
extern ERL_NIF_TERM ATOM_FALSE;
extern ERL_NIF_TERM ATOM_NULL_VALUE;
extern ERL_NIF_TERM ATOM_UNDEFINED;
extern ERL_NIF_TERM ATOM_EAGAIN;
extern const int VIX_FD_CLOSED;
ERL_NIF_TERM raise_exception(ErlNifEnv *env, const char *msg);
ERL_NIF_TERM raise_badarg(ErlNifEnv *env, const char *reason);
ERL_NIF_TERM make_ok(ErlNifEnv *env, ERL_NIF_TERM term);
ERL_NIF_TERM make_error(ErlNifEnv *env, const char *reason);
ERL_NIF_TERM make_error_term(ErlNifEnv *env, ERL_NIF_TERM term);
ERL_NIF_TERM make_atom(ErlNifEnv *env, const char *name);
ERL_NIF_TERM make_binary(ErlNifEnv *env, const char *str);
bool get_binary(ErlNifEnv *env, ERL_NIF_TERM bin_term, char *str, size_t size);
VixResult vix_result(ERL_NIF_TERM term);
int utils_init(ErlNifEnv *env);
int close_fd(int *fd);
void notify_consumed_timeslice(ErlNifEnv *env, ErlNifTime start,
ErlNifTime stop);
ERL_NIF_TERM to_binary_term(ErlNifEnv *env, void *data, size_t size);
#endif