diff --git a/libc3/tag.c b/libc3/tag.c
index 0c3fcb5..d0780b7 100644
--- a/libc3/tag.c
+++ b/libc3/tag.c
@@ -2066,6 +2066,759 @@ s_tag * tag_bnot (const s_tag *tag, s_tag *result)
return NULL;
}
+s_tag * tag_bor (const s_tag *a, const s_tag *b, s_tag *result)
+{
+ s_integer tmp;
+ s_integer tmp2;
+ s_tag tmp_a;
+ switch (a->type) {
+ case TAG_BOOL:
+ tmp_a.data.bool = a->data.bool ? 1 : 0;
+ switch (b->type) {
+ case TAG_BOOL:
+ return tag_init_bool(result, tmp_a.data.bool &
+ (b->data.bool ? 1 : 0));
+ case TAG_CHARACTER:
+ return tag_init_bool(result, tmp_a.data.bool | b->data.character);
+ case TAG_INTEGER:
+ integer_init_u8(&tmp, tmp_a.data.bool);
+ integer_bor(&tmp, &b->data.integer, &tmp2);
+ tag_init_bool(result, integer_to_u8(&tmp2));
+ integer_clean(&tmp);
+ integer_clean(&tmp2);
+ return result;
+ case TAG_SW:
+ return tag_init_bool(result, tmp_a.data.bool | b->data.sw);
+ case TAG_S64:
+ return tag_init_bool(result, tmp_a.data.bool | b->data.s64);
+ case TAG_S32:
+ return tag_init_bool(result, tmp_a.data.bool | b->data.s32);
+ case TAG_S16:
+ return tag_init_bool(result, tmp_a.data.bool | b->data.s16);
+ case TAG_S8:
+ return tag_init_bool(result, tmp_a.data.bool | b->data.s8);
+ case TAG_U8:
+ return tag_init_bool(result, tmp_a.data.bool | b->data.u8);
+ case TAG_U16:
+ return tag_init_bool(result, tmp_a.data.bool | b->data.u16);
+ case TAG_U32:
+ return tag_init_bool(result, tmp_a.data.bool | b->data.u32);
+ case TAG_U64:
+ return tag_init_bool(result, tmp_a.data.bool | b->data.u64);
+ case TAG_UW:
+ return tag_init_bool(result, tmp_a.data.bool | b->data.uw);
+ case TAG_VOID:
+ case TAG_ARRAY:
+ case TAG_CALL:
+ case TAG_CFN:
+ case TAG_F32:
+ case TAG_F64:
+ case TAG_FACT:
+ case TAG_FN:
+ case TAG_IDENT:
+ case TAG_LIST:
+ case TAG_PTAG:
+ case TAG_QUOTE:
+ case TAG_STR:
+ case TAG_SYM:
+ case TAG_TUPLE:
+ case TAG_VAR:
+ goto error;
+ }
+ case TAG_CHARACTER:
+ switch (b->type) {
+ case TAG_BOOL:
+ return tag_init_character(result, a->data.character &
+ (b->data.bool ? 1 : 0));
+ case TAG_CHARACTER:
+ return tag_init_character(result, a->data.character | b->data.character);
+ case TAG_INTEGER:
+ integer_init_u32(&tmp, a->data.character);
+ integer_bor(&tmp, &b->data.integer, &tmp2);
+ tag_init_character(result, integer_to_u32(&tmp2));
+ integer_clean(&tmp);
+ integer_clean(&tmp2);
+ return result;
+ case TAG_SW:
+ return tag_init_character(result, a->data.character | b->data.sw);
+ case TAG_S64:
+ return tag_init_character(result, a->data.character | b->data.s64);
+ case TAG_S32:
+ return tag_init_character(result, a->data.character | b->data.s32);
+ case TAG_S16:
+ return tag_init_character(result, a->data.character | b->data.s16);
+ case TAG_S8:
+ return tag_init_character(result, a->data.character | b->data.s8);
+ case TAG_U8:
+ return tag_init_character(result, a->data.character | b->data.u8);
+ case TAG_U16:
+ return tag_init_character(result, a->data.character | b->data.u16);
+ case TAG_U32:
+ return tag_init_character(result, a->data.character | b->data.u32);
+ case TAG_U64:
+ return tag_init_character(result, a->data.character | b->data.u64);
+ case TAG_UW:
+ return tag_init_character(result, a->data.character | b->data.uw);
+ case TAG_VOID:
+ case TAG_ARRAY:
+ case TAG_CALL:
+ case TAG_CFN:
+ case TAG_F32:
+ case TAG_F64:
+ case TAG_FACT:
+ case TAG_FN:
+ case TAG_IDENT:
+ case TAG_LIST:
+ case TAG_PTAG:
+ case TAG_QUOTE:
+ case TAG_STR:
+ case TAG_SYM:
+ case TAG_TUPLE:
+ case TAG_VAR:
+ goto error;
+ }
+ case TAG_INTEGER:
+ switch (b->type) {
+ case TAG_BOOL:
+ integer_init_u8(&tmp, b->data.bool ? 1 : 0);
+ result->type = TAG_INTEGER;
+ integer_bor(&a->data.integer, &tmp, &result->data.integer);
+ integer_clean(&tmp);
+ return result;
+ case TAG_CHARACTER:
+ integer_init_u32(&tmp, b->data.character);
+ result->type = TAG_INTEGER;
+ integer_bor(&a->data.integer, &tmp, &result->data.integer);
+ integer_clean(&tmp);
+ return result;
+ case TAG_INTEGER:
+ result->type = TAG_INTEGER;
+ integer_bor(&a->data.integer, &b->data.integer,
+ &result->data.integer);
+ return result;
+ case TAG_SW:
+ integer_init_sw(&tmp, b->data.sw);
+ result->type = TAG_INTEGER;
+ integer_bor(&a->data.integer, &tmp, &result->data.integer);
+ integer_clean(&tmp);
+ return result;
+ case TAG_S64:
+ integer_init_s64(&tmp, b->data.s64);
+ result->type = TAG_INTEGER;
+ integer_bor(&a->data.integer, &tmp, &result->data.integer);
+ integer_clean(&tmp);
+ return result;
+ case TAG_S32:
+ integer_init_s32(&tmp, b->data.s32);
+ result->type = TAG_INTEGER;
+ integer_bor(&a->data.integer, &tmp, &result->data.integer);
+ integer_clean(&tmp);
+ return result;
+ case TAG_S16:
+ integer_init_s16(&tmp, b->data.s16);
+ result->type = TAG_INTEGER;
+ integer_bor(&a->data.integer, &tmp, &result->data.integer);
+ integer_clean(&tmp);
+ return result;
+ case TAG_S8:
+ integer_init_s8(&tmp, b->data.s8);
+ result->type = TAG_INTEGER;
+ integer_bor(&a->data.integer, &tmp, &result->data.integer);
+ integer_clean(&tmp);
+ return result;
+ case TAG_U8:
+ integer_init_u8(&tmp, b->data.u8);
+ result->type = TAG_INTEGER;
+ integer_bor(&a->data.integer, &tmp, &result->data.integer);
+ integer_clean(&tmp);
+ return result;
+ case TAG_U16:
+ integer_init_u16(&tmp, b->data.u16);
+ result->type = TAG_INTEGER;
+ integer_bor(&a->data.integer, &tmp, &result->data.integer);
+ integer_clean(&tmp);
+ return result;
+ case TAG_U32:
+ integer_init_u32(&tmp, b->data.u32);
+ result->type = TAG_INTEGER;
+ integer_bor(&a->data.integer, &tmp, &result->data.integer);
+ integer_clean(&tmp);
+ return result;
+ case TAG_U64:
+ integer_init_u64(&tmp, b->data.u64);
+ result->type = TAG_INTEGER;
+ integer_bor(&a->data.integer, &tmp, &result->data.integer);
+ integer_clean(&tmp);
+ return result;
+ case TAG_UW:
+ integer_init_uw(&tmp, b->data.uw);
+ result->type = TAG_INTEGER;
+ integer_bor(&a->data.integer, &tmp, &result->data.integer);
+ integer_clean(&tmp);
+ return result;
+ case TAG_VOID:
+ case TAG_ARRAY:
+ case TAG_CALL:
+ case TAG_CFN:
+ case TAG_F32:
+ case TAG_F64:
+ case TAG_FACT:
+ case TAG_FN:
+ case TAG_IDENT:
+ case TAG_LIST:
+ case TAG_PTAG:
+ case TAG_QUOTE:
+ case TAG_STR:
+ case TAG_SYM:
+ case TAG_TUPLE:
+ case TAG_VAR:
+ goto error;
+ }
+ case TAG_SW:
+ switch (b->type) {
+ case TAG_BOOL:
+ return tag_init_sw(result, a->data.sw &
+ (b->data.bool ? 1 : 0));
+ case TAG_CHARACTER:
+ return tag_init_sw(result, a->data.sw | b->data.character);
+ case TAG_INTEGER:
+ integer_init_sw(&tmp, a->data.sw);
+ integer_bor(&tmp, &b->data.integer, &tmp2);
+ tag_init_sw(result, integer_to_sw(&tmp2));
+ integer_clean(&tmp);
+ integer_clean(&tmp2);
+ return result;
+ case TAG_SW:
+ return tag_init_sw(result, a->data.sw | b->data.sw);
+ case TAG_S64:
+ return tag_init_sw(result, a->data.sw | b->data.s64);
+ case TAG_S32:
+ return tag_init_sw(result, a->data.sw | b->data.s32);
+ case TAG_S16:
+ return tag_init_sw(result, a->data.sw | b->data.s16);
+ case TAG_S8:
+ return tag_init_sw(result, a->data.sw | b->data.s8);
+ case TAG_U8:
+ return tag_init_sw(result, a->data.sw | b->data.u8);
+ case TAG_U16:
+ return tag_init_sw(result, a->data.sw | b->data.u16);
+ case TAG_U32:
+ return tag_init_sw(result, a->data.sw | b->data.u32);
+ case TAG_U64:
+ return tag_init_sw(result, a->data.sw | b->data.u64);
+ case TAG_UW:
+ return tag_init_sw(result, a->data.sw | b->data.uw);
+ case TAG_VOID:
+ case TAG_ARRAY:
+ case TAG_CALL:
+ case TAG_CFN:
+ case TAG_F32:
+ case TAG_F64:
+ case TAG_FACT:
+ case TAG_FN:
+ case TAG_IDENT:
+ case TAG_LIST:
+ case TAG_PTAG:
+ case TAG_QUOTE:
+ case TAG_STR:
+ case TAG_SYM:
+ case TAG_TUPLE:
+ case TAG_VAR:
+ goto error;
+ }
+ case TAG_S64:
+ switch (b->type) {
+ case TAG_BOOL:
+ return tag_init_s64(result, a->data.s64 &
+ (b->data.bool ? 1 : 0));
+ case TAG_CHARACTER:
+ return tag_init_s64(result, a->data.s64 | b->data.character);
+ case TAG_INTEGER:
+ integer_init_s64(&tmp, a->data.s64);
+ integer_bor(&tmp, &b->data.integer, &tmp2);
+ tag_init_s64(result, integer_to_s64(&tmp2));
+ integer_clean(&tmp);
+ integer_clean(&tmp2);
+ return result;
+ case TAG_SW:
+ return tag_init_s64(result, a->data.s64 | b->data.sw);
+ case TAG_S64:
+ return tag_init_s64(result, a->data.s64 | b->data.s64);
+ case TAG_S32:
+ return tag_init_s64(result, a->data.s64 | b->data.s32);
+ case TAG_S16:
+ return tag_init_s64(result, a->data.s64 | b->data.s16);
+ case TAG_S8:
+ return tag_init_s64(result, a->data.s64 | b->data.s8);
+ case TAG_U8:
+ return tag_init_s64(result, a->data.s64 | b->data.u8);
+ case TAG_U16:
+ return tag_init_s64(result, a->data.s64 | b->data.u16);
+ case TAG_U32:
+ return tag_init_s64(result, a->data.s64 | b->data.u32);
+ case TAG_U64:
+ return tag_init_s64(result, a->data.s64 | b->data.u64);
+ case TAG_UW:
+ return tag_init_s64(result, a->data.s64 | b->data.uw);
+ case TAG_VOID:
+ case TAG_ARRAY:
+ case TAG_CALL:
+ case TAG_CFN:
+ case TAG_F32:
+ case TAG_F64:
+ case TAG_FACT:
+ case TAG_FN:
+ case TAG_IDENT:
+ case TAG_LIST:
+ case TAG_PTAG:
+ case TAG_QUOTE:
+ case TAG_STR:
+ case TAG_SYM:
+ case TAG_TUPLE:
+ case TAG_VAR:
+ goto error;
+ }
+ case TAG_S32:
+ switch (b->type) {
+ case TAG_BOOL:
+ return tag_init_s32(result, a->data.s32 &
+ (b->data.bool ? 1 : 0));
+ case TAG_CHARACTER:
+ return tag_init_s32(result, a->data.s32 | b->data.character);
+ case TAG_INTEGER:
+ integer_init_s32(&tmp, a->data.s32);
+ integer_bor(&tmp, &b->data.integer, &tmp2);
+ tag_init_s32(result, integer_to_s32(&tmp2));
+ integer_clean(&tmp);
+ integer_clean(&tmp2);
+ return result;
+ case TAG_SW:
+ return tag_init_s32(result, a->data.s32 | b->data.sw);
+ case TAG_S64:
+ return tag_init_s32(result, a->data.s32 | b->data.s64);
+ case TAG_S32:
+ return tag_init_s32(result, a->data.s32 | b->data.s32);
+ case TAG_S16:
+ return tag_init_s32(result, a->data.s32 | b->data.s16);
+ case TAG_S8:
+ return tag_init_s32(result, a->data.s32 | b->data.s8);
+ case TAG_U8:
+ return tag_init_s32(result, a->data.s32 | b->data.u8);
+ case TAG_U16:
+ return tag_init_s32(result, a->data.s32 | b->data.u16);
+ case TAG_U32:
+ return tag_init_s32(result, a->data.s32 | b->data.u32);
+ case TAG_U64:
+ return tag_init_s32(result, a->data.s32 | b->data.u64);
+ case TAG_UW:
+ return tag_init_s32(result, a->data.s32 | b->data.uw);
+ case TAG_VOID:
+ case TAG_ARRAY:
+ case TAG_CALL:
+ case TAG_CFN:
+ case TAG_F32:
+ case TAG_F64:
+ case TAG_FACT:
+ case TAG_FN:
+ case TAG_IDENT:
+ case TAG_LIST:
+ case TAG_PTAG:
+ case TAG_QUOTE:
+ case TAG_STR:
+ case TAG_SYM:
+ case TAG_TUPLE:
+ case TAG_VAR:
+ goto error;
+ }
+ case TAG_S16:
+ switch (b->type) {
+ case TAG_BOOL:
+ return tag_init_s16(result, a->data.s16 &
+ (b->data.bool ? 1 : 0));
+ case TAG_CHARACTER:
+ return tag_init_s16(result, a->data.s16 | b->data.character);
+ case TAG_INTEGER:
+ integer_init_s16(&tmp, a->data.s16);
+ integer_bor(&tmp, &b->data.integer, &tmp2);
+ tag_init_s16(result, integer_to_s16(&tmp2));
+ integer_clean(&tmp);
+ integer_clean(&tmp2);
+ return result;
+ case TAG_SW:
+ return tag_init_s16(result, a->data.s16 | b->data.sw);
+ case TAG_S64:
+ return tag_init_s16(result, a->data.s16 | b->data.s64);
+ case TAG_S32:
+ return tag_init_s16(result, a->data.s16 | b->data.s32);
+ case TAG_S16:
+ return tag_init_s16(result, a->data.s16 | b->data.s16);
+ case TAG_S8:
+ return tag_init_s16(result, a->data.s16 | b->data.s8);
+ case TAG_U8:
+ return tag_init_s16(result, a->data.s16 | b->data.u8);
+ case TAG_U16:
+ return tag_init_s16(result, a->data.s16 | b->data.u16);
+ case TAG_U32:
+ return tag_init_s16(result, a->data.s16 | b->data.u32);
+ case TAG_U64:
+ return tag_init_s16(result, a->data.s16 | b->data.u64);
+ case TAG_UW:
+ return tag_init_s16(result, a->data.s16 | b->data.uw);
+ case TAG_VOID:
+ case TAG_ARRAY:
+ case TAG_CALL:
+ case TAG_CFN:
+ case TAG_F32:
+ case TAG_F64:
+ case TAG_FACT:
+ case TAG_FN:
+ case TAG_IDENT:
+ case TAG_LIST:
+ case TAG_PTAG:
+ case TAG_QUOTE:
+ case TAG_STR:
+ case TAG_SYM:
+ case TAG_TUPLE:
+ case TAG_VAR:
+ goto error;
+ }
+ case TAG_S8:
+ switch (b->type) {
+ case TAG_BOOL:
+ return tag_init_s8(result, a->data.s8 &
+ (b->data.bool ? 1 : 0));
+ case TAG_CHARACTER:
+ return tag_init_s8(result, a->data.s8 | b->data.character);
+ case TAG_INTEGER:
+ integer_init_s8(&tmp, a->data.s8);
+ integer_bor(&tmp, &b->data.integer, &tmp2);
+ tag_init_s8(result, integer_to_s8(&tmp2));
+ integer_clean(&tmp);
+ integer_clean(&tmp2);
+ return result;
+ case TAG_SW:
+ return tag_init_s8(result, a->data.s8 | b->data.sw);
+ case TAG_S64:
+ return tag_init_s8(result, a->data.s8 | b->data.s64);
+ case TAG_S32:
+ return tag_init_s8(result, a->data.s8 | b->data.s32);
+ case TAG_S16:
+ return tag_init_s8(result, a->data.s8 | b->data.s16);
+ case TAG_S8:
+ return tag_init_s8(result, a->data.s8 | b->data.s8);
+ case TAG_U8:
+ return tag_init_s8(result, a->data.s8 | b->data.u8);
+ case TAG_U16:
+ return tag_init_s8(result, a->data.s8 | b->data.u16);
+ case TAG_U32:
+ return tag_init_s8(result, a->data.s8 | b->data.u32);
+ case TAG_U64:
+ return tag_init_s8(result, a->data.s8 | b->data.u64);
+ case TAG_UW:
+ return tag_init_s8(result, a->data.s8 | b->data.uw);
+ case TAG_VOID:
+ case TAG_ARRAY:
+ case TAG_CALL:
+ case TAG_CFN:
+ case TAG_F32:
+ case TAG_F64:
+ case TAG_FACT:
+ case TAG_FN:
+ case TAG_IDENT:
+ case TAG_LIST:
+ case TAG_PTAG:
+ case TAG_QUOTE:
+ case TAG_STR:
+ case TAG_SYM:
+ case TAG_TUPLE:
+ case TAG_VAR:
+ goto error;
+ }
+ case TAG_U8:
+ switch (b->type) {
+ case TAG_BOOL:
+ return tag_init_u8(result, a->data.u8 &
+ (b->data.bool ? 1 : 0));
+ case TAG_CHARACTER:
+ return tag_init_u8(result, a->data.u8 | b->data.character);
+ case TAG_INTEGER:
+ integer_init_u8(&tmp, a->data.u8);
+ integer_bor(&tmp, &b->data.integer, &tmp2);
+ tag_init_u8(result, integer_to_u8(&tmp2));
+ integer_clean(&tmp);
+ integer_clean(&tmp2);
+ return result;
+ case TAG_SW:
+ return tag_init_u8(result, a->data.u8 | b->data.sw);
+ case TAG_S64:
+ return tag_init_u8(result, a->data.u8 | b->data.s64);
+ case TAG_S32:
+ return tag_init_u8(result, a->data.u8 | b->data.s32);
+ case TAG_S16:
+ return tag_init_u8(result, a->data.u8 | b->data.s16);
+ case TAG_S8:
+ return tag_init_u8(result, a->data.u8 | b->data.s8);
+ case TAG_U8:
+ return tag_init_u8(result, a->data.u8 | b->data.u8);
+ case TAG_U16:
+ return tag_init_u8(result, a->data.u8 | b->data.u16);
+ case TAG_U32:
+ return tag_init_u8(result, a->data.u8 | b->data.u32);
+ case TAG_U64:
+ return tag_init_u8(result, a->data.u8 | b->data.u64);
+ case TAG_UW:
+ return tag_init_u8(result, a->data.u8 | b->data.uw);
+ case TAG_VOID:
+ case TAG_ARRAY:
+ case TAG_CALL:
+ case TAG_CFN:
+ case TAG_F32:
+ case TAG_F64:
+ case TAG_FACT:
+ case TAG_FN:
+ case TAG_IDENT:
+ case TAG_LIST:
+ case TAG_PTAG:
+ case TAG_QUOTE:
+ case TAG_STR:
+ case TAG_SYM:
+ case TAG_TUPLE:
+ case TAG_VAR:
+ goto error;
+ }
+ case TAG_U16:
+ switch (b->type) {
+ case TAG_BOOL:
+ return tag_init_u16(result, a->data.u16 &
+ (b->data.bool ? 1 : 0));
+ case TAG_CHARACTER:
+ return tag_init_u16(result, a->data.u16 | b->data.character);
+ case TAG_INTEGER:
+ integer_init_u16(&tmp, a->data.u16);
+ integer_bor(&tmp, &b->data.integer, &tmp2);
+ tag_init_u16(result, integer_to_u16(&tmp2));
+ integer_clean(&tmp);
+ integer_clean(&tmp2);
+ return result;
+ case TAG_SW:
+ return tag_init_u16(result, a->data.u16 | b->data.sw);
+ case TAG_S64:
+ return tag_init_u16(result, a->data.u16 | b->data.s64);
+ case TAG_S32:
+ return tag_init_u16(result, a->data.u16 | b->data.s32);
+ case TAG_S16:
+ return tag_init_u16(result, a->data.u16 | b->data.s16);
+ case TAG_S8:
+ return tag_init_u16(result, a->data.u16 | b->data.s8);
+ case TAG_U8:
+ return tag_init_u16(result, a->data.u16 | b->data.u8);
+ case TAG_U16:
+ return tag_init_u16(result, a->data.u16 | b->data.u16);
+ case TAG_U32:
+ return tag_init_u16(result, a->data.u16 | b->data.u32);
+ case TAG_U64:
+ return tag_init_u16(result, a->data.u16 | b->data.u64);
+ case TAG_UW:
+ return tag_init_u16(result, a->data.u16 | b->data.uw);
+ case TAG_VOID:
+ case TAG_ARRAY:
+ case TAG_CALL:
+ case TAG_CFN:
+ case TAG_F32:
+ case TAG_F64:
+ case TAG_FACT:
+ case TAG_FN:
+ case TAG_IDENT:
+ case TAG_LIST:
+ case TAG_PTAG:
+ case TAG_QUOTE:
+ case TAG_STR:
+ case TAG_SYM:
+ case TAG_TUPLE:
+ case TAG_VAR:
+ goto error;
+ }
+ case TAG_U32:
+ switch (b->type) {
+ case TAG_BOOL:
+ return tag_init_u32(result, a->data.u32 &
+ (b->data.bool ? 1 : 0));
+ case TAG_CHARACTER:
+ return tag_init_u32(result, a->data.u32 | b->data.character);
+ case TAG_INTEGER:
+ integer_init_u32(&tmp, a->data.u32);
+ integer_bor(&tmp, &b->data.integer, &tmp2);
+ tag_init_u32(result, integer_to_u32(&tmp2));
+ integer_clean(&tmp);
+ integer_clean(&tmp2);
+ return result;
+ case TAG_SW:
+ return tag_init_u32(result, a->data.u32 | b->data.sw);
+ case TAG_S64:
+ return tag_init_u32(result, a->data.u32 | b->data.s64);
+ case TAG_S32:
+ return tag_init_u32(result, a->data.u32 | b->data.s32);
+ case TAG_S16:
+ return tag_init_u32(result, a->data.u32 | b->data.s16);
+ case TAG_S8:
+ return tag_init_u32(result, a->data.u32 | b->data.s8);
+ case TAG_U8:
+ return tag_init_u32(result, a->data.u32 | b->data.u8);
+ case TAG_U16:
+ return tag_init_u32(result, a->data.u32 | b->data.u16);
+ case TAG_U32:
+ return tag_init_u32(result, a->data.u32 | b->data.u32);
+ case TAG_U64:
+ return tag_init_u32(result, a->data.u32 | b->data.u64);
+ case TAG_UW:
+ return tag_init_u32(result, a->data.u32 | b->data.uw);
+ case TAG_VOID:
+ case TAG_ARRAY:
+ case TAG_CALL:
+ case TAG_CFN:
+ case TAG_F32:
+ case TAG_F64:
+ case TAG_FACT:
+ case TAG_FN:
+ case TAG_IDENT:
+ case TAG_LIST:
+ case TAG_PTAG:
+ case TAG_QUOTE:
+ case TAG_STR:
+ case TAG_SYM:
+ case TAG_TUPLE:
+ case TAG_VAR:
+ goto error;
+ }
+ case TAG_U64:
+ switch (b->type) {
+ case TAG_BOOL:
+ return tag_init_u64(result, a->data.u64 &
+ (b->data.bool ? 1 : 0));
+ case TAG_CHARACTER:
+ return tag_init_u64(result, a->data.u64 | b->data.character);
+ case TAG_INTEGER:
+ integer_init_u64(&tmp, a->data.u64);
+ integer_bor(&tmp, &b->data.integer, &tmp2);
+ tag_init_u64(result, integer_to_u64(&tmp2));
+ integer_clean(&tmp);
+ integer_clean(&tmp2);
+ return result;
+ case TAG_SW:
+ return tag_init_u64(result, a->data.u64 | b->data.sw);
+ case TAG_S64:
+ return tag_init_u64(result, a->data.u64 | b->data.s64);
+ case TAG_S32:
+ return tag_init_u64(result, a->data.u64 | b->data.s32);
+ case TAG_S16:
+ return tag_init_u64(result, a->data.u64 | b->data.s16);
+ case TAG_S8:
+ return tag_init_u64(result, a->data.u64 | b->data.s8);
+ case TAG_U8:
+ return tag_init_u64(result, a->data.u64 | b->data.u8);
+ case TAG_U16:
+ return tag_init_u64(result, a->data.u64 | b->data.u16);
+ case TAG_U32:
+ return tag_init_u64(result, a->data.u64 | b->data.u32);
+ case TAG_U64:
+ return tag_init_u64(result, a->data.u64 | b->data.u64);
+ case TAG_UW:
+ return tag_init_u64(result, a->data.u64 | b->data.uw);
+ case TAG_VOID:
+ case TAG_ARRAY:
+ case TAG_CALL:
+ case TAG_CFN:
+ case TAG_F32:
+ case TAG_F64:
+ case TAG_FACT:
+ case TAG_FN:
+ case TAG_IDENT:
+ case TAG_LIST:
+ case TAG_PTAG:
+ case TAG_QUOTE:
+ case TAG_STR:
+ case TAG_SYM:
+ case TAG_TUPLE:
+ case TAG_VAR:
+ goto error;
+ }
+ case TAG_UW:
+ switch (b->type) {
+ case TAG_BOOL:
+ return tag_init_uw(result, a->data.uw &
+ (b->data.bool ? 1 : 0));
+ case TAG_CHARACTER:
+ return tag_init_uw(result, a->data.uw | b->data.character);
+ case TAG_INTEGER:
+ integer_init_uw(&tmp, a->data.uw);
+ integer_bor(&tmp, &b->data.integer, &tmp2);
+ tag_init_uw(result, integer_to_uw(&tmp2));
+ integer_clean(&tmp);
+ integer_clean(&tmp2);
+ return result;
+ case TAG_SW:
+ return tag_init_uw(result, a->data.uw | b->data.sw);
+ case TAG_S64:
+ return tag_init_uw(result, a->data.uw | b->data.s64);
+ case TAG_S32:
+ return tag_init_uw(result, a->data.uw | b->data.s32);
+ case TAG_S16:
+ return tag_init_uw(result, a->data.uw | b->data.s16);
+ case TAG_S8:
+ return tag_init_uw(result, a->data.uw | b->data.s8);
+ case TAG_U8:
+ return tag_init_uw(result, a->data.uw | b->data.u8);
+ case TAG_U16:
+ return tag_init_uw(result, a->data.uw | b->data.u16);
+ case TAG_U32:
+ return tag_init_uw(result, a->data.uw | b->data.u32);
+ case TAG_U64:
+ return tag_init_uw(result, a->data.uw | b->data.u64);
+ case TAG_UW:
+ return tag_init_uw(result, a->data.uw | b->data.uw);
+ case TAG_VOID:
+ case TAG_ARRAY:
+ case TAG_CALL:
+ case TAG_CFN:
+ case TAG_F32:
+ case TAG_F64:
+ case TAG_FACT:
+ case TAG_FN:
+ case TAG_IDENT:
+ case TAG_LIST:
+ case TAG_PTAG:
+ case TAG_QUOTE:
+ case TAG_STR:
+ case TAG_SYM:
+ case TAG_TUPLE:
+ case TAG_VAR:
+ goto error;
+ }
+ case TAG_VOID:
+ case TAG_ARRAY:
+ case TAG_CALL:
+ case TAG_CFN:
+ case TAG_F32:
+ case TAG_F64:
+ case TAG_FACT:
+ case TAG_FN:
+ case TAG_IDENT:
+ case TAG_LIST:
+ case TAG_PTAG:
+ case TAG_QUOTE:
+ case TAG_STR:
+ case TAG_SYM:
+ case TAG_TUPLE:
+ case TAG_VAR:
+ goto error;
+ }
+ error:
+ warnx("tag_bor: invalid tag type: %s bor %s",
+ tag_type_to_string(a->type),
+ tag_type_to_string(b->type));
+ return NULL;
+}
+
s_tag * tag_bool (s_tag *tag, bool b)
{
assert(tag);