x-engine-c v0.2.13
The C engine for x-lang
Loading...
Searching...
No Matches
x-obj.h
Go to the documentation of this file.
1#ifndef X_OBJ_H
2#define X_OBJ_H
3
80/*
81 * # Includes
82 */
83#include "x-lib.h"
84
95#define X_TYPE_NIL_NAME "NIL"
97#define X_TYPE_ATOM_NAME "ATOM"
99#define X_TYPE_PAIR_NAME "PAIR"
100
102#define X_OBJ_TRUE_TEXT "#t"
104#define X_OBJ_FALSE_TEXT "#f"
105
108/*
109 * # Data Structures
110 */
111
126typedef enum x_obj_flag_enum
127{
130
131 /* Object type system flags. */
134
143
146
147 /* Simple type system enumeration 0x10 - 0x1F. */
162
165
172
173#ifndef X_HEAP
175 X_OBJ_FLAG_MASK=0xFF
176#else /* X_HEAP */
178 X_OBJ_FLAG_SHARED=0x100,
180 X_OBJ_FLAG_MARK=0x200,
181
183 X_OBJ_FLAG_MASK=0x3FF
184#endif /* X_HEAP */
186
188typedef union x_datum_union x_obj_t;
189
197typedef x_obj_t * (*x_fn_t)(x_obj_t *p_base, x_obj_t *p_args);
198
220
221
228#ifdef X_HEAP
230#define X_OBJ_UNITS_HEAP 1
231#else /* X_HEAP */
233#define X_OBJ_UNITS_HEAP 0
234#endif /* X_HEAP */
235
236#ifndef X_OBJ_UNITS_TYPE
238#define X_OBJ_UNITS_TYPE 1
239#endif /* X_OBJ_UNITS_TYPE */
240
241#ifndef X_OBJ_UNITS_FLAGS
243#define X_OBJ_UNITS_FLAGS 1
244#endif /* X_OBJ_UNITS_FLAGS */
245
247enum {
248#ifdef X_HEAP
249 X_OBJ_META_HEAP = 0,
250#endif /* X_HEAP */
255
256#ifndef X_OBJ_UNITS_META
258#define X_OBJ_UNITS_META X_OBJ_META_LEN
259#endif /* X_OBJ_UNITS_META */
260
262#define X_OBJ_UNITS_ATOM 1
264#define X_OBJ_UNITS_PAIR 2
265
267#define X_OBJ_LENGTH_ATOM X_OBJ_UNITS_ATOM
269#define X_OBJ_LENGTH_PAIR X_OBJ_UNITS_PAIR
270
271
287
300
302extern x_satom_t x_true_obj;
305
316#ifdef X_HEAP
318#define x_obj_heap(X) ((X)[X_OBJ_META_HEAP].p)
319#endif /* X_HEAP */
320
322#define x_obj_type(X) ((X)[X_OBJ_META_TYPE].p)
323
325#define x_obj_flags(X) ((X)[X_OBJ_META_FLAGS].i)
326
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)
333
335#define x_obj_meta_i(X, I) ((X)[-((I) + 1)])
336
337#ifdef X_HEAP
339#define x_obj_set(T,F,...) { { .v = NULL }, { .p = (T) }, { .i = (F) }, __VA_ARGS__ }
340#else /* X_HEAP */
342#define x_obj_set(T,F,...) { { .p = (T) }, { .i = (F) }, __VA_ARGS__ }
343#endif /* X_HEAP */
344
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)
362
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)
367
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))
377
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))
498int x_obj_isnil(x_obj_t *p_base, x_obj_t *p_obj);
499
501x_obj_t *x_obj_alloc(x_obj_t *p_base, x_obj_t *p_type, x_obj_flag_t flags, size_t units);
503x_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);
505x_obj_t *x_obj_make(x_obj_t *p_base, x_obj_t *p_type, x_obj_flag_t flags, size_t units, ...);
507void x_obj_free(x_obj_t *p_base, x_obj_t *p_obj);
508
512x_char_t *x_obj_type_name(x_obj_t *p_base, x_obj_t *p_obj);
513
521x_int_t x_obj_units(x_obj_t *p_base, x_obj_t *p_obj);
522
530x_int_t x_obj_length(x_obj_t *p_base, x_obj_t *p_obj);
531
533x_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);
535x_obj_t *x_obj_pop_field(x_obj_t *p_base, x_obj_t **p_field);
540
542void x_obj_error(x_obj_t *p_base, x_char_t *message, x_obj_t *p_obj);
543
552#ifdef DEBUG
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)
567
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__)
582
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)
597
598#else /* DEBUG */
599
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) ;
606
607#endif /* DEBUG */
608
611#endif /* X_OBJ_H */
static void x_obj_t * p_args
Definition x-prim.h:56
Definition x-obj.h:212
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