view src/ploki/val.h @ 12292:d51f2100210c draft

<kspalaiologos> `` cat <<<"asmbf && bfi output.b" > /hackenv/ibin/asmbf
author HackEso <hackeso@esolangs.org>
date Thu, 02 Jan 2020 15:38:21 +0000
parents ac0403686959
children
line wrap: on
line source

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