|
@@ -180,6 +180,38 @@ static void sPostIncrement(Script* sc) {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+static void sPreDecrement(Script* sc) {
|
|
|
+ int value = 0;
|
|
|
+ if(sReadInt(sc, &value)) {
|
|
|
+ Object* o = sc->stack + value + sc->stackVarIndex;
|
|
|
+ if(o->type == OT_INT) {
|
|
|
+ o->data.intValue--;
|
|
|
+ } else if(o->type == OT_FLOAT) {
|
|
|
+ o->data.floatValue--;
|
|
|
+ } else {
|
|
|
+ sError(sc, "variable is not a number on line %d", sc->line);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ sPush(sc, o);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+static void sPostDecrement(Script* sc) {
|
|
|
+ int value = 0;
|
|
|
+ if(sReadInt(sc, &value)) {
|
|
|
+ Object* o = sc->stack + value + sc->stackVarIndex;
|
|
|
+ if(o->type == OT_INT) {
|
|
|
+ sPush(sc, o);
|
|
|
+ o->data.intValue--;
|
|
|
+ } else if(o->type == OT_FLOAT) {
|
|
|
+ sPush(sc, o);
|
|
|
+ o->data.floatValue--;
|
|
|
+ } else {
|
|
|
+ sError(sc, "variable is not a number on line %d", sc->line);
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
static void sPushCodeInt(Script* sc) {
|
|
|
int value = 0;
|
|
|
if(sReadInt(sc, &value)) {
|
|
@@ -423,6 +455,8 @@ static void sConsumeInstruction(Script* sc) {
|
|
|
case OP_GET: sGet(sc); break;
|
|
|
case OP_PRE_INCREMENT: sPreIncrement(sc); break;
|
|
|
case OP_POST_INCREMENT: sPostIncrement(sc); break;
|
|
|
+ case OP_PRE_DECREMENT: sPreDecrement(sc); break;
|
|
|
+ case OP_POST_DECREMENT: sPostDecrement(sc); break;
|
|
|
case OP_ADD: sNumberBinary(sc, sIntAdd, sFloatAdd); break;
|
|
|
case OP_SUB: sNumberBinary(sc, sIntSub, sFloatSub); break;
|
|
|
case OP_MUL: sNumberBinary(sc, sIntMul, sFloatMul); break;
|
|
@@ -526,6 +560,8 @@ void sPrintCode(Script* sc) {
|
|
|
case OP_GET: sPrintInt(sc, "Get"); break;
|
|
|
case OP_PRE_INCREMENT: sPrintInt(sc, "Pre Increment"); break;
|
|
|
case OP_POST_INCREMENT: sPrintInt(sc, "Post Increment"); break;
|
|
|
+ case OP_PRE_DECREMENT: sPrintInt(sc, "Pre Decrement"); break;
|
|
|
+ case OP_POST_DECREMENT: sPrintInt(sc, "Post Decrement"); break;
|
|
|
case OP_ADD: puts("Add"); break;
|
|
|
case OP_SUB: puts("Sub"); break;
|
|
|
case OP_MUL: puts("Mul"); break;
|