#define BI_INT_OPER(FUNCNAME_,OPERATOR_) \
int FUNCNAME_(struct object *caller,struct object *obj, \
struct object *player,struct var_stack **rts) { \
struct var tmp1,tmp2; \
\
if (popint(&tmp2,rts,obj)) return 1; \
if (popint(&tmp1,rts,obj)) return 1; \
tmp1.value.integer=((tmp1.value.integer) OPERATOR_ \
(tmp2.value.integer)); \
push(&tmp1,rts); \
return 0; \
}
#define CZBI_OPER(FUNCNAME_,OPERATOR_) \
int FUNCNAME_(struct object *caller,struct object *obj, \
struct object *player,struct var_stack **rts) { \
struct var tmp1,tmp2; \
\
if (popint(&tmp2,rts,obj)) return 1; \
if (popint(&tmp1,rts,obj)) return 1; \
if (tmp2.value.integer==0) return 1; \
tmp1.value.integer=((tmp1.value.integer) OPERATOR_ \
(tmp2.value.integer)); \
push(&tmp1,rts); \
return 0; \
}
#define EQ_INT_OPER(FUNCNAME_,OPERATOR_) \
int FUNCNAME_(struct object *caller,struct object *obj, \
struct object *player,struct var_stack **rts) { \
struct var tmp1,tmp2; \
\
if (popint(&tmp2,rts,obj)) return 1; \
if (pop(&tmp1,rts,obj)) return 1; \
if (tmp1.type!=GLOBAL_L_VALUE && tmp1.type!=LOCAL_L_VALUE) { \
clear_var(&tmp1); \
return 1; \
} \
if (tmp1.value.l_value.size!=1) return 1; \
if (tmp1.type==GLOBAL_L_VALUE) { \
if (obj->globals[tmp1.value.l_value.ref].type!=INTEGER) \
return 1; \
(obj->globals[tmp1.value.l_value.ref].value.integer) \
OPERATOR_ (tmp2.value.integer); \
push(&(obj->globals[tmp1.value.l_value.ref]),rts); \
obj->obj_state=DIRTY; \
} else { \
if (locals[tmp1.value.l_value.ref].type!=INTEGER) \
return 1; \
(locals[tmp1.value.l_value.ref].value.integer) \
OPERATOR_ (tmp2.value.integer); \
push(&(locals[tmp1.value.l_value.ref]),rts); \
} \
return 0; \
}
#define CZEQ_OPER(FUNCNAME_,OPERATOR_) \
int FUNCNAME_(struct object *caller,struct object *obj, \
struct object *player,struct var_stack **rts) { \
struct var tmp1,tmp2; \
\
if (popint(&tmp2,rts,obj)) return 1; \
if (pop(&tmp1,rts,obj)) return 1; \
if (tmp1.type!=GLOBAL_L_VALUE && tmp1.type!=LOCAL_L_VALUE) { \
clear_var(&tmp1); \
return 1; \
} \
if (tmp1.value.l_value.size!=1) return 1; \
if (tmp1.type==GLOBAL_L_VALUE) { \
if (obj->globals[tmp1.value.l_value.ref].type!=INTEGER) \
return 1; \
if (tmp2.value.integer==0) return 1; \
(obj->globals[tmp1.value.l_value.ref].value.integer) \
OPERATOR_ (tmp2.value.integer); \
push(&(obj->globals[tmp1.value.l_value.ref]),rts); \
obj->obj_state=DIRTY; \
} else { \
if (locals[tmp1.value.l_value.ref].type!=INTEGER) \
return 1; \
if (tmp2.value.integer==0) return 1; \
(locals[tmp1.value.l_value.ref].value.integer) \
OPERATOR_ (tmp2.value.integer); \
push(&(locals[tmp1.value.l_value.ref]),rts); \
} \
return 0; \
}