97#define X_TYPE_NIL_NAME "NIL"
99#define X_TYPE_ATOM_NAME "ATOM"
101#define X_TYPE_PAIR_NAME "PAIR"
104#define X_OBJ_TRUE_TEXT "#t"
106#define X_OBJ_FALSE_TEXT "#f"
180 X_OBJ_FLAG_SHARED=0x100,
182 X_OBJ_FLAG_MARK=0x200,
232#define X_OBJ_UNITS_HEAP 1
235#define X_OBJ_UNITS_HEAP 0
238#ifndef X_OBJ_UNITS_TYPE
240#define X_OBJ_UNITS_TYPE 1
243#ifndef X_OBJ_UNITS_FLAGS
245#define X_OBJ_UNITS_FLAGS 1
258#ifndef X_OBJ_UNITS_META
260#define X_OBJ_UNITS_META X_OBJ_META_LEN
264#define X_OBJ_UNITS_ATOM 1
266#define X_OBJ_UNITS_PAIR 2
269#define X_OBJ_LENGTH_ATOM X_OBJ_UNITS_ATOM
271#define X_OBJ_LENGTH_PAIR X_OBJ_UNITS_PAIR
320#define x_obj_heap(X) ((X)[X_OBJ_META_HEAP].p)
324#define x_obj_type(X) ((X)[X_OBJ_META_TYPE].p)
327#define x_obj_flags(X) ((X)[X_OBJ_META_FLAGS].i)
330#define x_obj_data_ptr(X) ((X) + X_OBJ_META_LEN)
332#define x_obj_data_i(X,I) (x_obj_data_ptr((X))[(I)])
334#define x_obj_data(X) x_obj_data_i((X), 0)
337#define x_obj_meta_i(X, I) ((X)[-((I) + 1)])
341#define x_obj_set(T,F,...) { { .v = NULL }, { .p = (T) }, { .i = (F) }, __VA_ARGS__ }
344#define x_obj_set(T,F,...) { { .p = (T) }, { .i = (F) }, __VA_ARGS__ }
361#define x_obj_isnil(B,X) ((void)(B), (X) == NULL)
363#define x_obj_type_isnil(B,X) x_obj_isnil((B), x_obj_type(X))
365#define x_obj_is_type(B,X,T) (x_lib_strcmp(x_obj_type_name((B), (X)), (T)) == 0)
368#define x_obj_type_issatom(X) (x_obj_type((X)) == x_type_atom_obj)
370#define x_obj_type_isspair(X) (x_obj_type((X)) == x_type_pair_obj)
374#define x_mksatom(B,F,X) x_obj_make((B), x_type_atom_obj, (F), X_OBJ_LENGTH_ATOM, (X))
377#define x_mksatomown(B,F,X) x_obj_make((B), x_type_atom_obj, (F) | X_OBJ_FLAG_OWN, X_OBJ_LENGTH_ATOM, (X))
380#define x_mkspair(B,F,X,Y) x_obj_make((B), x_type_pair_obj, (F), X_OBJ_LENGTH_PAIR, (X), (Y))
392#define x_obj(X) ((X).p)
393#define x_fn(X) ((X).fn)
394#define x_int(X) ((X).i)
395#define x_char(X) ((X).c)
396#define x_str(X) ((X).s)
397#define x_ptr(X) ((X).v)
413#define x_first(X) x_obj_data_i((X),0)
414#define x_second(X) x_obj_data_i((X),1)
415#define x_rest(X) x_second((X))
417#define x_firstptr(X) x_ptr(x_first((X)))
418#define x_firstobj(X) x_obj(x_first((X)))
419#define x_firstint(X) x_int(x_first((X)))
420#define x_firstchar(X) x_char(x_first((X)))
421#define x_firststr(X) x_str(x_first((X)))
422#define x_firstfn(X) x_fn(x_first((X)))
424#define x_secondptr(X) x_ptr(x_rest((X)))
425#define x_secondobj(X) x_obj(x_rest((X)))
426#define x_secondint(X) x_int(x_rest((X)))
427#define x_secondchar(X) x_char(x_rest((X)))
428#define x_secondstr(X) x_str(x_rest((X)))
429#define x_secondfn(X) x_fn(x_rest((X)))
431#define x_atomptr(X) x_firstptr((X))
432#define x_atomobj(X) x_firstobj((X))
433#define x_atomint(X) x_firstint((X))
434#define x_atomchar(X) x_firstchar((X))
435#define x_atomstr(X) x_firststr((X))
436#define x_atomfn(X) x_firstfn((X))
438#define x_restptr(X) x_secondptr((X))
439#define x_restobj(X) x_secondobj((X))
440#define x_restint(X) x_secondint((X))
441#define x_restchar(X) x_secondchar((X))
442#define x_reststr(X) x_secondstr((X))
443#define x_restfn(X) x_secondfn((X))
459#define x_0(X) x_firstobj(X)
460#define x_1(X) x_restobj(X)
461#define x_00(X) x_0(x_0(X))
462#define x_01(X) x_0(x_1(X))
463#define x_10(X) x_1(x_0(X))
464#define x_11(X) x_1(x_1(X))
465#define x_000(X) x_0(x_00(X))
466#define x_001(X) x_0(x_01(X))
467#define x_010(X) x_0(x_10(X))
468#define x_011(X) x_0(x_11(X))
469#define x_100(X) x_1(x_00(X))
470#define x_101(X) x_1(x_01(X))
471#define x_110(X) x_1(x_10(X))
472#define x_111(X) x_1(x_11(X))
473#define x_0000(X) x_0(x_000(X))
474#define x_0001(X) x_0(x_001(X))
475#define x_0010(X) x_0(x_010(X))
476#define x_0011(X) x_0(x_011(X))
477#define x_0100(X) x_0(x_100(X))
478#define x_0101(X) x_0(x_101(X))
479#define x_0110(X) x_0(x_110(X))
480#define x_0111(X) x_0(x_111(X))
481#define x_1000(X) x_1(x_000(X))
482#define x_1001(X) x_1(x_001(X))
483#define x_1010(X) x_1(x_010(X))
484#define x_1011(X) x_1(x_011(X))
485#define x_1100(X) x_1(x_100(X))
486#define x_1101(X) x_1(x_101(X))
487#define x_1110(X) x_1(x_110(X))
488#define x_1111(X) x_1(x_111(X))
555void _x_obj_debug_va(
char *file,
long unsigned line,
x_obj_t *p_base,
char *fmt, va_list ap);
566#define x_obj_debug_va(p_base, fmt, ap)\
567 _x_obj_debug_va(__FILE__, __LINE__, p_base, fmt, ap)
570void _x_obj_debug(
char *file,
long unsigned line,
x_obj_t *p_base,
char *fmt, ...);
581#define x_obj_debug(p_base, fmt, ...)\
582 _x_obj_debug(__FILE__, __LINE__, p_base, fmt, __VA_ARGS__)
585void _x_obj_dump(
char *file,
long unsigned line,
x_obj_t *p_base,
x_obj_t *p_obj,
char *msg);
596#define x_obj_dump(p_base, p_obj, msg)\
597 _x_obj_dump(__FILE__, __LINE__, p_base, p_obj, msg)
602#define x_obj_debug_va(p_base, fmt, ap) ;
604#define x_obj_debug(p_base, fmt, ...) ;
606#define x_obj_dump(p_base, p_obj, msg) ;
static void x_obj_t * p_args
Definition x-prim.h:56
x_char_t c
Definition x-obj.h:218
x_int_t i
Definition x-obj.h:217
x_fn_t fn
Definition x-obj.h:216
x_obj_t * p
Definition x-obj.h:215
x_char_t * s
Definition x-obj.h:219
void * v
Definition x-obj.h:220
General-purpose library helpers.
x_satom_t x_false_obj
Definition x-obj.c:38
x_obj_t * x_obj_make(x_obj_t *p_base, x_obj_t *p_type, x_obj_flag_t flags, size_t units,...)
Definition x-obj.c:225
x_obj_t * x_obj_prim_type_name(x_obj_t *p_base, x_obj_t *p_args)
Definition x-obj.c:295
void x_obj_free(x_obj_t *p_base, x_obj_t *p_obj)
Definition x-obj.c:250
x_obj_t * x_pair_prim_length(x_obj_t *p_base, x_obj_t *p_args)
Definition x-obj.c:443
#define X_OBJ_UNITS_TYPE
Definition x-obj.h:240
x_satom_t x_type_length_atom_obj
Definition x-obj.c:35
x_obj_flag_enum
Definition x-obj.h:129
@ X_OBJ_FLAG_OBJ
Definition x-obj.h:135
@ X_OBJ_FLAG_3
Definition x-obj.h:142
@ X_OBJ_FLAG_MASK
Definition x-obj.h:177
@ X_OBJ_FLAG_2
Definition x-obj.h:140
@ X_OBJ_FLAG_META
Definition x-obj.h:173
@ X_OBJ_FLAG_INT
Definition x-obj.h:157
@ X_OBJ_FLAG_TYPE_MASK
Definition x-obj.h:166
@ X_OBJ_FLAG_1
Definition x-obj.h:138
@ X_OBJ_FLAG_PTR
Definition x-obj.h:163
@ X_OBJ_FLAG_NONE
Definition x-obj.h:131
@ X_OBJ_FLAG_SIMPLE_TYPE
Definition x-obj.h:151
@ X_OBJ_FLAG_RO
Definition x-obj.h:171
@ X_OBJ_FLAG_4
Definition x-obj.h:144
@ X_OBJ_FLAG_CHAR
Definition x-obj.h:159
@ X_OBJ_FLAG_ATTR_MASK
Definition x-obj.h:147
@ X_OBJ_FLAG_PRIM
Definition x-obj.h:153
@ X_OBJ_FLAG_STR
Definition x-obj.h:161
@ X_OBJ_FLAG_OWN
Definition x-obj.h:169
@ X_OBJ_FLAG_FN
Definition x-obj.h:155
x_satom_t x_type_units_atom_obj
Definition x-obj.c:33
x_obj_t * x_obj_pop(x_obj_t *p_base, x_obj_t *p_args)
Definition x-obj.c:579
#define X_OBJ_UNITS_HEAP
Definition x-obj.h:235
x_satom_t x_true_obj
Definition x-obj.c:37
void x_obj_error(x_obj_t *p_base, x_char_t *message, x_obj_t *p_obj)
Definition x-obj.c:599
x_int_t x_obj_units(x_obj_t *p_base, x_obj_t *p_obj)
Definition x-obj.c:410
x_obj_t * x_obj_prim_units(x_obj_t *p_base, x_obj_t *p_args)
Definition x-obj.c:377
x_satom_t x_type_units_pair_obj
Definition x-obj.c:34
#define X_OBJ_UNITS_ATOM
Definition x-obj.h:264
x_obj_t * x_obj_prim_length(x_obj_t *p_base, x_obj_t *p_args)
Definition x-obj.c:459
x_char_t * x_obj_type_name(x_obj_t *p_base, x_obj_t *p_obj)
Definition x-obj.c:328
enum x_obj_flag_enum x_obj_flag_t
@ X_OBJ_META_TYPE
Definition x-obj.h:253
@ X_OBJ_META_LEN
Definition x-obj.h:255
@ X_OBJ_META_FLAGS
Definition x-obj.h:254
x_obj_t *(* x_fn_t)(x_obj_t *p_base, x_obj_t *p_args)
Definition x-obj.h:199
x_satom_t x_type_length_pair_obj
Definition x-obj.c:36
#define X_OBJ_UNITS_PAIR
Definition x-obj.h:266
x_obj_t * x_pair_prim_units(x_obj_t *p_base, x_obj_t *p_args)
Definition x-obj.c:361
x_obj_t x_satom_t[X_OBJ_META_LEN+X_OBJ_UNITS_ATOM]
Definition x-obj.h:285
x_obj_t * x_atom_prim_length(x_obj_t *p_base, x_obj_t *p_args)
Definition x-obj.c:431
x_satom_t x_type_atom_obj
Definition x-obj.c:31
x_satom_t x_type_pair_obj
Definition x-obj.c:32
#define X_OBJ_UNITS_FLAGS
Definition x-obj.h:245
x_int_t x_obj_length(x_obj_t *p_base, x_obj_t *p_obj)
Definition x-obj.c:492
x_obj_t x_spair_t[X_OBJ_META_LEN+X_OBJ_UNITS_PAIR]
Definition x-obj.h:288
x_obj_t * x_obj_make_va(x_obj_t *p_base, x_obj_t *p_type, x_obj_flag_t flags, size_t units, va_list ap)
Definition x-obj.c:197
x_obj_t * x_obj_push(x_obj_t *p_base, x_obj_t *p_args)
Definition x-obj.c:558
x_obj_t * x_obj_alloc(x_obj_t *p_base, x_obj_t *p_type, x_obj_flag_t flags, size_t units)
Definition x-obj.c:73
x_obj_t * x_atom_prim_units(x_obj_t *p_base, x_obj_t *p_args)
Definition x-obj.c:349
x_obj_t * x_obj_push_field(x_obj_t *p_base, x_obj_t **p_field, x_obj_t *p_value, x_obj_flag_t flags)
Definition x-obj.c:519
x_obj_t * x_obj_pop_field(x_obj_t *p_base, x_obj_t **p_field)
Definition x-obj.c:537
long x_int_t
Definition x.h:129
char x_char_t
Definition x.h:138