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_ */