95#define X_TYPE_NIL_NAME "NIL"
97#define X_TYPE_ATOM_NAME "ATOM"
99#define X_TYPE_PAIR_NAME "PAIR"
102#define X_OBJ_TRUE_TEXT "#t"
104#define X_OBJ_FALSE_TEXT "#f"
178 X_OBJ_FLAG_SHARED=0x100,
180 X_OBJ_FLAG_MARK=0x200,
230#define X_OBJ_UNITS_HEAP 1
233#define X_OBJ_UNITS_HEAP 0
236#ifndef X_OBJ_UNITS_TYPE
238#define X_OBJ_UNITS_TYPE 1
241#ifndef X_OBJ_UNITS_FLAGS
243#define X_OBJ_UNITS_FLAGS 1
256#ifndef X_OBJ_UNITS_META
258#define X_OBJ_UNITS_META X_OBJ_META_LEN
262#define X_OBJ_UNITS_ATOM 1
264#define X_OBJ_UNITS_PAIR 2
267#define X_OBJ_LENGTH_ATOM X_OBJ_UNITS_ATOM
269#define X_OBJ_LENGTH_PAIR X_OBJ_UNITS_PAIR
318#define x_obj_heap(X) ((X)[X_OBJ_META_HEAP].p)
322#define x_obj_type(X) ((X)[X_OBJ_META_TYPE].p)
325#define x_obj_flags(X) ((X)[X_OBJ_META_FLAGS].i)
328#define x_obj_data_ptr(X) ((X) + X_OBJ_META_LEN)
330#define x_obj_data_i(X,I) (x_obj_data_ptr((X))[(I)])
332#define x_obj_data(X) x_obj_data_i((X), 0)
335#define x_obj_meta_i(X, I) ((X)[-((I) + 1)])
339#define x_obj_set(T,F,...) { { .v = NULL }, { .p = (T) }, { .i = (F) }, __VA_ARGS__ }
342#define x_obj_set(T,F,...) { { .p = (T) }, { .i = (F) }, __VA_ARGS__ }
359#define x_obj_type_isnil(B,X) x_obj_isnil((B), x_obj_type(X))
361#define x_obj_is_type(B,X,T) (x_lib_strcmp(x_obj_type_name((B), (X)), (T)) == 0)
364#define x_obj_type_issatom(X) (x_obj_type((X)) == x_type_atom_obj)
366#define x_obj_type_isspair(X) (x_obj_type((X)) == x_type_pair_obj)
370#define x_mksatom(B,F,X) x_obj_make((B), x_type_atom_obj, (F), X_OBJ_LENGTH_ATOM, (X))
373#define x_mksatomown(B,F,X) x_obj_make((B), x_type_atom_obj, (F) | X_OBJ_FLAG_OWN, X_OBJ_LENGTH_ATOM, (X))
376#define x_mkspair(B,F,X,Y) x_obj_make((B), x_type_pair_obj, (F), X_OBJ_LENGTH_PAIR, (X), (Y))
388#define x_obj(X) ((X).p)
389#define x_fn(X) ((X).fn)
390#define x_int(X) ((X).i)
391#define x_char(X) ((X).c)
392#define x_str(X) ((X).s)
393#define x_ptr(X) ((X).v)
409#define x_first(X) x_obj_data_i((X),0)
410#define x_second(X) x_obj_data_i((X),1)
411#define x_rest(X) x_second((X))
413#define x_firstptr(X) x_ptr(x_first((X)))
414#define x_firstobj(X) x_obj(x_first((X)))
415#define x_firstint(X) x_int(x_first((X)))
416#define x_firstchar(X) x_char(x_first((X)))
417#define x_firststr(X) x_str(x_first((X)))
418#define x_firstfn(X) x_fn(x_first((X)))
420#define x_secondptr(X) x_ptr(x_rest((X)))
421#define x_secondobj(X) x_obj(x_rest((X)))
422#define x_secondint(X) x_int(x_rest((X)))
423#define x_secondchar(X) x_char(x_rest((X)))
424#define x_secondstr(X) x_str(x_rest((X)))
425#define x_secondfn(X) x_fn(x_rest((X)))
427#define x_atomptr(X) x_firstptr((X))
428#define x_atomobj(X) x_firstobj((X))
429#define x_atomint(X) x_firstint((X))
430#define x_atomchar(X) x_firstchar((X))
431#define x_atomstr(X) x_firststr((X))
432#define x_atomfn(X) x_firstfn((X))
434#define x_restptr(X) x_secondptr((X))
435#define x_restobj(X) x_secondobj((X))
436#define x_restint(X) x_secondint((X))
437#define x_restchar(X) x_secondchar((X))
438#define x_reststr(X) x_secondstr((X))
439#define x_restfn(X) x_secondfn((X))
455#define x_0(X) x_firstobj(X)
456#define x_1(X) x_restobj(X)
457#define x_00(X) x_0(x_0(X))
458#define x_01(X) x_0(x_1(X))
459#define x_10(X) x_1(x_0(X))
460#define x_11(X) x_1(x_1(X))
461#define x_000(X) x_0(x_00(X))
462#define x_001(X) x_0(x_01(X))
463#define x_010(X) x_0(x_10(X))
464#define x_011(X) x_0(x_11(X))
465#define x_100(X) x_1(x_00(X))
466#define x_101(X) x_1(x_01(X))
467#define x_110(X) x_1(x_10(X))
468#define x_111(X) x_1(x_11(X))
469#define x_0000(X) x_0(x_000(X))
470#define x_0001(X) x_0(x_001(X))
471#define x_0010(X) x_0(x_010(X))
472#define x_0011(X) x_0(x_011(X))
473#define x_0100(X) x_0(x_100(X))
474#define x_0101(X) x_0(x_101(X))
475#define x_0110(X) x_0(x_110(X))
476#define x_0111(X) x_0(x_111(X))
477#define x_1000(X) x_1(x_000(X))
478#define x_1001(X) x_1(x_001(X))
479#define x_1010(X) x_1(x_010(X))
480#define x_1011(X) x_1(x_011(X))
481#define x_1100(X) x_1(x_100(X))
482#define x_1101(X) x_1(x_101(X))
483#define x_1110(X) x_1(x_110(X))
484#define x_1111(X) x_1(x_111(X))
554void _x_obj_debug_va(
char *file,
long unsigned line,
x_obj_t *p_base,
char *fmt, va_list ap);
565#define x_obj_debug_va(p_base, fmt, ap)\
566 _x_obj_debug_va(__FILE__, __LINE__, p_base, fmt, ap)
569void _x_obj_debug(
char *file,
long unsigned line,
x_obj_t *p_base,
char *fmt, ...);
580#define x_obj_debug(p_base, fmt, ...)\
581 _x_obj_debug(__FILE__, __LINE__, p_base, fmt, __VA_ARGS__)
584void _x_obj_dump(
char *file,
long unsigned line,
x_obj_t *p_base,
x_obj_t *p_obj,
char *msg);
595#define x_obj_dump(p_base, p_obj, msg)\
596 _x_obj_dump(__FILE__, __LINE__, p_base, p_obj, msg)
601#define x_obj_debug_va(p_base, fmt, ap) ;
603#define x_obj_debug(p_base, fmt, ...) ;
605#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:216
x_int_t i
Definition x-obj.h:215
x_fn_t fn
Definition x-obj.h:214
x_obj_t * p
Definition x-obj.h:213
x_char_t * s
Definition x-obj.h:217
void * v
Definition x-obj.h:218
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:239
x_obj_t * x_obj_prim_type_name(x_obj_t *p_base, x_obj_t *p_args)
Definition x-obj.c:309
void x_obj_free(x_obj_t *p_base, x_obj_t *p_obj)
Definition x-obj.c:264
x_obj_t * x_pair_prim_length(x_obj_t *p_base, x_obj_t *p_args)
Definition x-obj.c:457
#define X_OBJ_UNITS_TYPE
Definition x-obj.h:238
x_satom_t x_type_length_atom_obj
Definition x-obj.c:35
x_obj_flag_enum
Definition x-obj.h:127
@ X_OBJ_FLAG_OBJ
Definition x-obj.h:133
@ X_OBJ_FLAG_3
Definition x-obj.h:140
@ X_OBJ_FLAG_MASK
Definition x-obj.h:175
@ X_OBJ_FLAG_2
Definition x-obj.h:138
@ X_OBJ_FLAG_META
Definition x-obj.h:171
@ X_OBJ_FLAG_INT
Definition x-obj.h:155
@ X_OBJ_FLAG_TYPE_MASK
Definition x-obj.h:164
@ X_OBJ_FLAG_1
Definition x-obj.h:136
@ X_OBJ_FLAG_PTR
Definition x-obj.h:161
@ X_OBJ_FLAG_NONE
Definition x-obj.h:129
@ X_OBJ_FLAG_SIMPLE_TYPE
Definition x-obj.h:149
@ X_OBJ_FLAG_RO
Definition x-obj.h:169
@ X_OBJ_FLAG_4
Definition x-obj.h:142
@ X_OBJ_FLAG_CHAR
Definition x-obj.h:157
@ X_OBJ_FLAG_ATTR_MASK
Definition x-obj.h:145
@ X_OBJ_FLAG_PRIM
Definition x-obj.h:151
@ X_OBJ_FLAG_STR
Definition x-obj.h:159
@ X_OBJ_FLAG_OWN
Definition x-obj.h:167
@ X_OBJ_FLAG_FN
Definition x-obj.h:153
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:593
#define X_OBJ_UNITS_HEAP
Definition x-obj.h:233
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:613
x_int_t x_obj_units(x_obj_t *p_base, x_obj_t *p_obj)
Definition x-obj.c:424
x_obj_t * x_obj_prim_units(x_obj_t *p_base, x_obj_t *p_args)
Definition x-obj.c:391
int x_obj_isnil(x_obj_t *p_base, x_obj_t *p_obj)
Definition x-obj.c:54
x_satom_t x_type_units_pair_obj
Definition x-obj.c:34
#define X_OBJ_UNITS_ATOM
Definition x-obj.h:262
x_obj_t * x_obj_prim_length(x_obj_t *p_base, x_obj_t *p_args)
Definition x-obj.c:473
x_char_t * x_obj_type_name(x_obj_t *p_base, x_obj_t *p_obj)
Definition x-obj.c:342
enum x_obj_flag_enum x_obj_flag_t
@ X_OBJ_META_TYPE
Definition x-obj.h:251
@ X_OBJ_META_LEN
Definition x-obj.h:253
@ X_OBJ_META_FLAGS
Definition x-obj.h:252
x_obj_t *(* x_fn_t)(x_obj_t *p_base, x_obj_t *p_args)
Definition x-obj.h:197
x_satom_t x_type_length_pair_obj
Definition x-obj.c:36
#define X_OBJ_UNITS_PAIR
Definition x-obj.h:264
x_obj_t * x_pair_prim_units(x_obj_t *p_base, x_obj_t *p_args)
Definition x-obj.c:375
x_obj_t x_satom_t[X_OBJ_META_LEN+X_OBJ_UNITS_ATOM]
Definition x-obj.h:283
x_obj_t * x_atom_prim_length(x_obj_t *p_base, x_obj_t *p_args)
Definition x-obj.c:445
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:243
x_int_t x_obj_length(x_obj_t *p_base, x_obj_t *p_obj)
Definition x-obj.c:506
x_obj_t x_spair_t[X_OBJ_META_LEN+X_OBJ_UNITS_PAIR]
Definition x-obj.h:286
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:211
x_obj_t * x_obj_push(x_obj_t *p_base, x_obj_t *p_args)
Definition x-obj.c:572
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:88
x_obj_t * x_atom_prim_units(x_obj_t *p_base, x_obj_t *p_args)
Definition x-obj.c:363
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:533
x_obj_t * x_obj_pop_field(x_obj_t *p_base, x_obj_t **p_field)
Definition x-obj.c:551
long x_int_t
Definition x.h:129
char x_char_t
Definition x.h:138