Mercurial > repo
diff src/ploki/val.h @ 4223:ac0403686959
<oerjan> rm -rf src/ploki; mv ploki src
author | HackBot |
---|---|
date | Fri, 20 Dec 2013 22:18:50 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/ploki/val.h Fri Dec 20 22:18:50 2013 +0000 @@ -0,0 +1,80 @@ +#ifndef VAL_H_ +#define VAL_H_ + +#include "config.h" +#include "IO.h" +#include "Str.h" +#include "kork.h" +#include "list.h" +#include "sub.h" + +enum val_cont { + V_UNDEF = 0, + V_STR_K = 1, + V_NUM_K = V_STR_K << 1, + V_EXT_K = V_NUM_K << 1, + V_SUB_K = V_EXT_K << 1, + V_LIST_K = V_SUB_K << 1 +}; + +struct val { + enum val_cont type; + union { + IO *ext; + struct sub *sub; + struct list *list; + } magic; + struct kork *ko; + double num; +}; + +void v_init(struct val *); +void v_end(struct val *); +int v_cmp_ls(struct val *, struct val *); +void v_ok_str(struct val *); +void v_ok_num(struct val *); +int v_true(const struct val *); +void v_iniset(struct val *, const struct val *); +void v_set(struct val *, const struct val *); +void v_set_n(struct val *, double); +void v_set_s(struct val *, const String *); +void v_set_m(struct val *, const void *, size_t); +void v_set_undef(struct val *); +void v_set_io(struct val *, IO *); +void v_set_sub(struct val *, struct sub *); +void v_cat(struct val *, struct val *); +void v_cat_s(struct val *, const String *); +void v_cat_m(struct val *, const void *, size_t); +void v_cat_c(struct val *, char); +struct val *v_undef(void); +void v_delete(struct val *); + +const char *v_sptr(struct val *, size_t *); +struct kork *v_kork(struct val *); + +#define V_STR_P(v) ((v)->type & V_STR_K) +#define V_NUM_P(v) ((v)->type & V_NUM_K) +#define V_EXT_P(v) ((v)->type & V_EXT_K) +#define V_SUB_P(v) ((v)->type & V_SUB_K) +#define V_LIST_P(v) ((v)->type & V_LIST_K) + +#define V_STR(v) if (V_STR_P(v)); else v_ok_str(v) +#define V_NUM(v) if (V_NUM_P(v)); else v_ok_num(v) + +#define V_xxx_OFF(v) \ +do { \ + if (V_EXT_P(v)) { \ + io_decr((v)->magic.ext); \ + (v)->type &= ~V_EXT_K; \ + } else if (V_SUB_P(v)) { \ + sub_decr((v)->magic.sub); \ + (v)->type &= ~V_SUB_K; \ + } else if (V_LIST_P(v)) { \ + li_delete((v)->magic.list); \ + (v)->type &= ~V_LIST_K; \ + } \ +} while (0) + +#define RINT(x) ((x) + ((x) < 0.0 ? -.5 : .5)) + +#endif /* VAL_H_ */