#include "config.h"
#include "object.h"
#include "construct.h"
#include "instr.h"
#include "operproto.h"
#include "operdefine.h"
#include "globals.h"
int not_oper(struct object *caller, struct object *obj,
struct object *player, struct var_stack **rts) {
struct var tmp;
int result;
if (pop(&tmp,rts,obj)) return 1;
if (resolve_var(&tmp,obj)) return 1;
result=(tmp.type==INTEGER && tmp.value.integer==0);
clear_var(&tmp);
tmp.type=INTEGER;
tmp.value.integer=result;
push(&tmp,rts);
return 0;
}
int bitnot_oper(struct object *caller, struct object *obj,
struct object *player, struct var_stack **rts) {
struct var tmp;
if (popint(&tmp,rts,obj)) return 1;
tmp.value.integer=~tmp.value.integer;
push(&tmp,rts);
return 0;
}
int postadd_oper(struct object *caller, struct object *obj,
struct object *player, struct var_stack **rts) {
struct var tmp1,tmp2;
if (pop(&tmp1,rts,obj)) return 1;
if (tmp1.type!=GLOBAL_L_VALUE && tmp1.type!=LOCAL_L_VALUE) {
clear_var(&tmp1);
return 1;
}
tmp2=tmp1;
if (resolve_var(&tmp2,obj)) return 1;
if (tmp2.type!=INTEGER) {
clear_var(&tmp2);
return 1;
}
push(&tmp2,rts);
if (tmp1.type==GLOBAL_L_VALUE) {
++(obj->globals[tmp1.value.l_value.ref].value.integer);
obj->obj_state=DIRTY;
} else
++(locals[tmp1.value.l_value.ref].value.integer);
return 0;
}
int preadd_oper(struct object *caller, struct object *obj,
struct object *player, struct var_stack **rts) {
struct var tmp1,tmp2;
if (pop(&tmp1,rts,obj)) return 1;
if (tmp1.type!=GLOBAL_L_VALUE && tmp1.type!=LOCAL_L_VALUE) {
clear_var(&tmp1);
return 1;
}
tmp2=tmp1;
if (resolve_var(&tmp2,obj)) return 1;
if (tmp2.type!=INTEGER) {
clear_var(&tmp2);
return 1;
}
++(tmp2.value.integer);
push(&tmp2,rts);
if (tmp1.type==GLOBAL_L_VALUE) {
++(obj->globals[tmp1.value.l_value.ref].value.integer);
obj->obj_state=DIRTY;
} else
++(locals[tmp1.value.l_value.ref].value.integer);
return 0;
}
int postmin_oper(struct object *caller, struct object *obj,
struct object *player, struct var_stack **rts) {
struct var tmp1,tmp2;
if (pop(&tmp1,rts,obj)) return 1;
if (tmp1.type!=GLOBAL_L_VALUE && tmp1.type!=LOCAL_L_VALUE) {
clear_var(&tmp1);
return 1;
}
tmp2=tmp1;
if (resolve_var(&tmp2,obj)) return 1;
if (tmp2.type!=INTEGER) {
clear_var(&tmp2);
return 1;
}
push(&tmp2,rts);
if (tmp1.type==GLOBAL_L_VALUE) {
--(obj->globals[tmp1.value.l_value.ref].value.integer);
obj->obj_state=DIRTY;
} else
--(locals[tmp1.value.l_value.ref].value.integer);
return 0;
}
int premin_oper(struct object *caller, struct object *obj,
struct object *player, struct var_stack **rts) {
struct var tmp1,tmp2;
if (pop(&tmp1,rts,obj)) return 1;
if (tmp1.type!=GLOBAL_L_VALUE && tmp1.type!=LOCAL_L_VALUE) {
clear_var(&tmp1);
return 1;
}
tmp2=tmp1;
if (resolve_var(&tmp2,obj)) return 1;
if (tmp2.type!=INTEGER) {
clear_var(&tmp2);
return 1;
}
--(tmp2.value.integer);
push(&tmp2,rts);
if (tmp1.type==GLOBAL_L_VALUE) {
--(obj->globals[tmp1.value.l_value.ref].value.integer);
obj->obj_state=DIRTY;
} else
--(locals[tmp1.value.l_value.ref].value.integer);
return 0;
}
int umin_oper(struct object *caller, struct object *obj,
struct object *player, struct var_stack **rts) {
struct var tmp;
if (popint(&tmp,rts,obj)) return 1;
tmp.value.integer=-tmp.value.integer;
push(&tmp,rts);
return 0;
}
BI_INT_OPER(bitor_oper, | )
BI_INT_OPER(exor_oper, ^ )
BI_INT_OPER(bitand_oper, & )
BI_INT_OPER(less_oper, < )
BI_INT_OPER(lesseq_oper, <= )
BI_INT_OPER(great_oper, > )
BI_INT_OPER(greateq_oper, >= )
BI_INT_OPER(ls_oper, << )
BI_INT_OPER(rs_oper, >> )
BI_INT_OPER(min_oper, - )
BI_INT_OPER(mul_oper, * )
CZBI_OPER(div_oper, / )
CZBI_OPER(mod_oper, % )
EQ_INT_OPER(mieq_oper, -= )
EQ_INT_OPER(mueq_oper, *= )
EQ_INT_OPER(aneq_oper, &= )
EQ_INT_OPER(exeq_oper, ^= )
EQ_INT_OPER(oreq_oper, |= )
EQ_INT_OPER(lseq_oper, <<= )
EQ_INT_OPER(rseq_oper, >>= )
CZEQ_OPER(dieq_oper, /= )
CZEQ_OPER(moeq_oper, %= )