diff --git a/libc3/tag.c b/libc3/tag.c
index d4fbfd4..0c3fcb5 100644
--- a/libc3/tag.c
+++ b/libc3/tag.c
@@ -1263,41 +1263,44 @@ s_tag * tag_array (s_tag *tag, const s_array *a)
s_tag * tag_band (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_u8(result, tmp_a.data.bool &
- (b->data.bool ? 1 : 0));
+ return tag_init_bool(result, tmp_a.data.bool &
+ (b->data.bool ? 1 : 0));
case TAG_CHARACTER:
- return tag_init_u32(result, (u32) tmp_a.data.bool & b->data.character);
+ return tag_init_bool(result, tmp_a.data.bool & b->data.character);
case TAG_INTEGER:
integer_init_u8(&tmp, tmp_a.data.bool);
- result->type = TAG_INTEGER;
- integer_band(&tmp, &a->data.integer, &result->data.integer);
+ integer_band(&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_sw(result, ~a->data.sw);
+ return tag_init_bool(result, tmp_a.data.bool & b->data.sw);
case TAG_S64:
- return tag_init_s64(result, ~a->data.s64);
+ return tag_init_bool(result, tmp_a.data.bool & b->data.s64);
case TAG_S32:
- return tag_init_s32(result, ~a->data.s32);
+ return tag_init_bool(result, tmp_a.data.bool & b->data.s32);
case TAG_S16:
- return tag_init_s16(result, ~a->data.s16);
+ return tag_init_bool(result, tmp_a.data.bool & b->data.s16);
case TAG_S8:
- return tag_init_s8(result, ~a->data.s8);
+ return tag_init_bool(result, tmp_a.data.bool & b->data.s8);
case TAG_U8:
- return tag_init_u8(result, ~a->data.u8);
+ return tag_init_bool(result, tmp_a.data.bool & b->data.u8);
case TAG_U16:
- return tag_init_u16(result, ~a->data.u16);
+ return tag_init_bool(result, tmp_a.data.bool & b->data.u16);
case TAG_U32:
- return tag_init_u32(result, ~a->data.u32);
+ return tag_init_bool(result, tmp_a.data.bool & b->data.u32);
case TAG_U64:
- return tag_init_u64(result, ~a->data.u64);
+ return tag_init_bool(result, tmp_a.data.bool & b->data.u64);
case TAG_UW:
- return tag_init_uw(result, ~a->data.uw);
+ return tag_init_bool(result, tmp_a.data.bool & b->data.uw);
case TAG_VOID:
case TAG_ARRAY:
case TAG_CALL:
@@ -1317,31 +1320,674 @@ s_tag * tag_band (const s_tag *a, const s_tag *b, s_tag *result)
goto error;
}
case TAG_CHARACTER:
- return tag_init_u32(result, ~a->data.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_band(&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:
- result->type = TAG_INTEGER;
- integer_bnot(&a->data.integer, &result->data.integer);
- return result;
+ switch (b->type) {
+ case TAG_BOOL:
+ integer_init_u8(&tmp, b->data.bool ? 1 : 0);
+ result->type = TAG_INTEGER;
+ integer_band(&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_band(&a->data.integer, &tmp, &result->data.integer);
+ integer_clean(&tmp);
+ return result;
+ case TAG_INTEGER:
+ result->type = TAG_INTEGER;
+ integer_band(&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_band(&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_band(&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_band(&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_band(&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_band(&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_band(&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_band(&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_band(&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_band(&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_band(&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:
- return tag_init_sw(result, ~a->data.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_band(&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:
- return tag_init_s64(result, ~a->data.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_band(&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:
- return tag_init_s32(result, ~a->data.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_band(&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:
- return tag_init_s16(result, ~a->data.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_band(&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:
- return tag_init_s8(result, ~a->data.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_band(&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:
- return tag_init_u8(result, ~a->data.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_band(&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:
- return tag_init_u16(result, ~a->data.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_band(&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:
- return tag_init_u32(result, ~a->data.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_band(&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:
- return tag_init_u64(result, ~a->data.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_band(&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:
- return tag_init_uw(result, ~a->data.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_band(&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: