eclisp-sys 0.1.1

FFI Bindings for Embeddable Common Lisp
#ifndef ECLISP_WRAPPER_H
#define ECLISP_WRAPPER_H

#include <ecl/ecl.h>
#include <stdint.h>

enum {
    ECLISP_OK = 0,
    ECLISP_ERROR = 1,
    ECLISP_ALLOCATION_FAILED = 2,
    ECLISP_INVALID_ARGUMENT = -1
};

typedef struct {
    cl_object object;
} eclisp_root;

eclisp_root *eclisp_root_new(cl_object object);
cl_object eclisp_root_get(const eclisp_root *root);
int eclisp_root_copy(cl_object object, eclisp_root **out);
void eclisp_root_free(eclisp_root *root);

int eclisp_eval(const char *source, eclisp_root **out_root, char **out_error);
int eclisp_call(
    const char *function,
    size_t argc,
    const cl_object *argv,
    eclisp_root **out_root,
    char **out_error
);

typedef int (*eclisp_callback)(
    size_t callback_id,
    cl_object arguments,
    eclisp_root **out_result,
    char *error,
    size_t error_capacity
);

int eclisp_register_dispatcher(eclisp_callback callback);
int eclisp_args_length(cl_object arguments, size_t *out_length);
int eclisp_args_get(cl_object arguments, size_t index, cl_object *out);

int eclisp_int_new(int64_t value, eclisp_root **out);
int eclisp_float_new(double value, eclisp_root **out);
int eclisp_cons_new(cl_object car, cl_object cdr, eclisp_root **out);
int eclisp_list_new(size_t length, const cl_object *values, eclisp_root **out);
int eclisp_string_new(const char *text, size_t length, eclisp_root **out_root);
void eclisp_string_free(char *string);

int eclisp_is_nil(cl_object object);
int eclisp_is_t(cl_object object);
int eclisp_is_int(cl_object object);
int eclisp_is_float(cl_object object);
int eclisp_is_string(cl_object object);
int eclisp_is_cons(cl_object object);
int eclisp_is_list(cl_object object);

int eclisp_as_int(cl_object object, int64_t *out);
int eclisp_as_float(cl_object object, double *out);
int eclisp_as_string(cl_object object, char **out, size_t *out_length);
int eclisp_repr(cl_object object, char **out_repr);

int eclisp_car(cl_object object, eclisp_root **out_car);
int eclisp_cdr(cl_object object, eclisp_root **out_cdr);

#endif