|
|
|
@ -59,14 +59,14 @@ stmtIdentVar (s_stmt * stmt, s_block * actBlock) |
|
|
|
char * op = expValueString(_op); |
|
|
|
s_block * run = actBlock; |
|
|
|
|
|
|
|
while (ret == NULL && run != NULL) |
|
|
|
{ |
|
|
|
while (ret == NULL && run != NULL) { |
|
|
|
ret = identListSeekKey(blockIdl(run), op); |
|
|
|
run = blockPrev(run); |
|
|
|
} |
|
|
|
|
|
|
|
if (ret == NULL) |
|
|
|
if (ret == NULL) { |
|
|
|
ret = identListPutVal(blockIdl(actBlock), identUndefNew(-1, op)); |
|
|
|
} |
|
|
|
|
|
|
|
expValueFree(_op); |
|
|
|
free(op); |
|
|
|
@ -130,8 +130,7 @@ stmtAssign (s_stmt * stmt, s_block * actBlock) |
|
|
|
s_expVal * op2 = stmtDo(stmtQueueGet(args, 1), actBlock).eVal, |
|
|
|
* ret; |
|
|
|
|
|
|
|
if (op1 == NULL) |
|
|
|
op1 = getVariable (NULL, NULL); |
|
|
|
if (op1 == NULL) op1 = getVariable(NULL, NULL); |
|
|
|
|
|
|
|
ret = assign(op1, op2); |
|
|
|
|
|
|
|
@ -148,8 +147,7 @@ stmtPrint (s_stmt * stmt, s_block * actBlock) |
|
|
|
s_stmtQueue * args = stmt->sQueue; |
|
|
|
s_expVal * op = stmtDo(stmtQueueGet(args, 0), actBlock).eVal; |
|
|
|
|
|
|
|
if (op != NULL) |
|
|
|
{ |
|
|
|
if (op != NULL) { |
|
|
|
printExpr(op); |
|
|
|
expValueFree(op); |
|
|
|
} |
|
|
|
@ -181,20 +179,17 @@ stmtEvalCond (s_stmt * stmt, s_block * actBlock, int op) |
|
|
|
s_stmtQueue * args = stmt->sQueue; |
|
|
|
int op1 = stmtDo(stmtQueueGet(args, 0), actBlock).cond; |
|
|
|
|
|
|
|
switch (op) |
|
|
|
{ |
|
|
|
switch (op) { |
|
|
|
case LOGAND: |
|
|
|
{ |
|
|
|
int op2 = stmtDo(stmtQueueGet(args, 1), actBlock).cond; |
|
|
|
return (u_stmtType)(op1 && op2); |
|
|
|
} |
|
|
|
|
|
|
|
case LOGOR: |
|
|
|
{ |
|
|
|
int op2 = stmtDo(stmtQueueGet(args, 1), actBlock).cond; |
|
|
|
return (u_stmtType)(op1 || op2); |
|
|
|
} |
|
|
|
|
|
|
|
case LOGNEG: |
|
|
|
return (u_stmtType)(! op1); |
|
|
|
} |
|
|
|
@ -265,24 +260,20 @@ stmtBlock (s_stmt * stmt, s_block * actBlock) |
|
|
|
while (blockPrev(gBlock) != NULL) |
|
|
|
gBlock = blockPrev(gBlock); |
|
|
|
|
|
|
|
if (gIds != NULL) |
|
|
|
{ |
|
|
|
for (i = 0; i < stmtQueueGetSize (gIds); i++) |
|
|
|
{ |
|
|
|
if (gIds != NULL) { |
|
|
|
for (i=0; i < stmtQueueGetSize(gIds); i++) { |
|
|
|
s_expVal * tmp = stmtDo(stmtQueueGet (gIds, i), actBlock).eVal; |
|
|
|
char * _id; |
|
|
|
s_ident * id; |
|
|
|
|
|
|
|
if (tmp == NULL) |
|
|
|
exitError (0); |
|
|
|
if (tmp == NULL) exitError (0); |
|
|
|
|
|
|
|
_id = expValueString(tmp); |
|
|
|
id = identListSeekKey(blockGetIdl (gBlock), _id); |
|
|
|
expValueFree(tmp); |
|
|
|
free(_id); |
|
|
|
|
|
|
|
if (id == NULL) |
|
|
|
exitError (0); |
|
|
|
if (id == NULL) exitError (0); |
|
|
|
|
|
|
|
blockSetNonLocalId(gBlock, id); |
|
|
|
} |
|
|
|
@ -303,13 +294,10 @@ stmtIf (s_stmt * stmt, s_block * actBlock) |
|
|
|
int cond = stmtDo(stmtQueueGet (args, 0), actBlock).cond; |
|
|
|
s_stmt * _do; |
|
|
|
|
|
|
|
if (cond) |
|
|
|
_do = stmtQueueGet (args, 1); |
|
|
|
else |
|
|
|
_do = stmtQueueGet (args, 2); |
|
|
|
if (cond) _do = stmtQueueGet(args, 1); |
|
|
|
else _do = stmtQueueGet(args, 2); |
|
|
|
|
|
|
|
if (_do != NULL) |
|
|
|
stmtDo (_do, actBlock); |
|
|
|
if (_do != NULL) stmtDo(_do, actBlock); |
|
|
|
|
|
|
|
return (u_stmtType)0; |
|
|
|
} |
|
|
|
@ -399,11 +387,9 @@ stmtGetConstTyp (s_stmt * stmt) |
|
|
|
void |
|
|
|
stmtFree(s_stmt * stmt) |
|
|
|
{ |
|
|
|
if (stmt == NULL) |
|
|
|
return; |
|
|
|
if (stmt == NULL) return; |
|
|
|
|
|
|
|
switch (stmt->sConstTyp) |
|
|
|
{ |
|
|
|
switch(stmt->sConstTyp) { |
|
|
|
case STYP_NONE: stmtQueueFree (stmt->sQueue); break; |
|
|
|
case STYP_EVAL: expValueFree (stmt->sConst.eVal); break; |
|
|
|
case STYP_IDVAL: identFree (stmt->sConst.idVal); break; |
|
|
|
@ -415,46 +401,68 @@ stmtFree (s_stmt * stmt) |
|
|
|
u_stmtType |
|
|
|
stmtDo(s_stmt * stmt, s_block * actBlock) |
|
|
|
{ |
|
|
|
if (stmt == NULL) |
|
|
|
if (stmt == NULL) return (u_stmtType)0; |
|
|
|
|
|
|
|
switch (stmt->sId) { |
|
|
|
case STMT_CONST: |
|
|
|
return (u_stmtType)expValueClone(stmt->sConst.eVal); |
|
|
|
case STMT_BLOCK: |
|
|
|
return stmtBlock(stmt, actBlock); |
|
|
|
case STMT_PRINT: |
|
|
|
return stmtPrint(stmt, actBlock); |
|
|
|
case STMT_IF: |
|
|
|
return stmtIf(stmt, actBlock); |
|
|
|
case STMT_FOREACH: |
|
|
|
return stmtForeach(stmt, actBlock); |
|
|
|
case STMT_REPEAT: |
|
|
|
return stmtRepeat(stmt, actBlock); |
|
|
|
case STMT_ASSIGN: |
|
|
|
return stmtAssign(stmt, actBlock); |
|
|
|
case STMT_UNSET: |
|
|
|
return (u_stmtType)0; |
|
|
|
|
|
|
|
switch (stmt->sId) |
|
|
|
{ |
|
|
|
case STMT_CONST: return (u_stmtType) expValueClone (stmt->sConst.eVal); |
|
|
|
case STMT_BLOCK: return stmtBlock (stmt, actBlock); |
|
|
|
|
|
|
|
case STMT_PRINT: return stmtPrint (stmt, actBlock); |
|
|
|
case STMT_IF: return stmtIf (stmt, actBlock); |
|
|
|
case STMT_FOREACH: return stmtForeach (stmt, actBlock); |
|
|
|
case STMT_REPEAT: return stmtRepeat (stmt, actBlock); |
|
|
|
case STMT_ASSIGN: return stmtAssign (stmt, actBlock); |
|
|
|
case STMT_UNSET: return (u_stmtType) 0; |
|
|
|
|
|
|
|
case STMT_EVAL_PLUS: return stmtEval (stmt, actBlock, PLUS); |
|
|
|
case STMT_EVAL_MINUS: return stmtEval (stmt, actBlock, MINUS); |
|
|
|
case STMT_EVAL_TIMES: return stmtEval (stmt, actBlock, TIMES); |
|
|
|
case STMT_EVAL_OVER: return stmtEval (stmt, actBlock, OVER); |
|
|
|
case STMT_EVAL_MODULO: return stmtEval (stmt, actBlock, MODULO); |
|
|
|
case STMT_EVAL_NEG: return stmtEval (stmt, actBlock, NEG); |
|
|
|
|
|
|
|
case STMT_IDENT_VAR: return stmtIdentVar (stmt, actBlock); |
|
|
|
case STMT_IDENT_ARRAY: return stmtIdentArray (stmt, actBlock); |
|
|
|
case STMT_IDENT_VAL: return stmtIdentVal (stmt, actBlock); |
|
|
|
|
|
|
|
case STMT_CAST_INT: return stmtCastInt (stmt, actBlock); |
|
|
|
case STMT_CAST_FLOAT: return stmtCastFloat (stmt, actBlock); |
|
|
|
case STMT_CAST_STRING: return stmtCastString (stmt, actBlock); |
|
|
|
|
|
|
|
case STMT_COMP_EQ: return stmtEvalComp (stmt, actBlock, EQ); |
|
|
|
case STMT_COMP_NE: return stmtEvalComp (stmt, actBlock, NE); |
|
|
|
case STMT_COMP_LT: return stmtEvalComp (stmt, actBlock, LT); |
|
|
|
case STMT_COMP_GT: return stmtEvalComp (stmt, actBlock, GT); |
|
|
|
case STMT_COMP_LE: return stmtEvalComp (stmt, actBlock, LE); |
|
|
|
case STMT_COMP_GE: return stmtEvalComp (stmt, actBlock, GE); |
|
|
|
|
|
|
|
case STMT_COND_EXPR: return stmtEvalCondExpr (stmt, actBlock); |
|
|
|
case STMT_COND_AND: return stmtEvalCond (stmt, actBlock, LOGAND); |
|
|
|
case STMT_COND_OR: return stmtEvalCond (stmt, actBlock, LOGOR); |
|
|
|
case STMT_COND_NEG: return stmtEvalCond (stmt, actBlock, LOGNEG); |
|
|
|
case STMT_EVAL_PLUS: |
|
|
|
return stmtEval(stmt, actBlock, PLUS); |
|
|
|
case STMT_EVAL_MINUS: |
|
|
|
return stmtEval(stmt, actBlock, MINUS); |
|
|
|
case STMT_EVAL_TIMES: |
|
|
|
return stmtEval(stmt, actBlock, TIMES); |
|
|
|
case STMT_EVAL_OVER: |
|
|
|
return stmtEval(stmt, actBlock, OVER); |
|
|
|
case STMT_EVAL_MODULO: |
|
|
|
return stmtEval(stmt, actBlock, MODULO); |
|
|
|
case STMT_EVAL_NEG: |
|
|
|
return stmtEval(stmt, actBlock, NEG); |
|
|
|
case STMT_IDENT_VAR: |
|
|
|
return stmtIdentVar(stmt, actBlock); |
|
|
|
case STMT_IDENT_ARRAY: |
|
|
|
return stmtIdentArray(stmt, actBlock); |
|
|
|
case STMT_IDENT_VAL: |
|
|
|
return stmtIdentVal(stmt, actBlock); |
|
|
|
case STMT_CAST_INT: |
|
|
|
return stmtCastInt(stmt, actBlock); |
|
|
|
case STMT_CAST_FLOAT: |
|
|
|
return stmtCastFloat(stmt, actBlock); |
|
|
|
case STMT_CAST_STRING: |
|
|
|
return stmtCastString(stmt, actBlock); |
|
|
|
case STMT_COMP_EQ: |
|
|
|
return stmtEvalComp(stmt, actBlock, EQ); |
|
|
|
case STMT_COMP_NE: |
|
|
|
return stmtEvalComp(stmt, actBlock, NE); |
|
|
|
case STMT_COMP_LT: |
|
|
|
return stmtEvalComp(stmt, actBlock, LT); |
|
|
|
case STMT_COMP_GT: |
|
|
|
return stmtEvalComp(stmt, actBlock, GT); |
|
|
|
case STMT_COMP_LE: |
|
|
|
return stmtEvalComp(stmt, actBlock, LE); |
|
|
|
case STMT_COMP_GE: |
|
|
|
return stmtEvalComp(stmt, actBlock, GE); |
|
|
|
case STMT_COND_EXPR: |
|
|
|
return stmtEvalCondExpr(stmt, actBlock); |
|
|
|
case STMT_COND_AND: |
|
|
|
return stmtEvalCond(stmt, actBlock, LOGAND); |
|
|
|
case STMT_COND_OR: |
|
|
|
return stmtEvalCond(stmt, actBlock, LOGOR); |
|
|
|
case STMT_COND_NEG: |
|
|
|
return stmtEvalCond(stmt, actBlock, LOGNEG); |
|
|
|
} |
|
|
|
} |