script_return script_execute (script_state* state, script_op* op)
{
script_return reply = {SCRIPT_RETURN_TYPE_NORMAL, NULL};
+ if (!op) return reply;
switch (op->type){
case SCRIPT_OP_TYPE_EXPRESSION:
{
{
script_obj* obj = script_evaluate (state, op->data.cond_op.cond);
if (script_obj_as_bool(obj)){
- reply = script_execute (state, op->data.cond_op.op); // FIXME propagate break
+ reply = script_execute (state, op->data.cond_op.op1);
+ }
+ else {
+ reply = script_execute (state, op->data.cond_op.op2);
}
script_obj_unref(obj);
break;
while (1){
obj = script_evaluate (state, op->data.cond_op.cond);
if (script_obj_as_bool(obj)){
- reply = script_execute (state, op->data.cond_op.op); // FIXME handle break
+ reply = script_execute (state, op->data.cond_op.op1);
script_obj_unref(obj);
switch (reply.type) {
case SCRIPT_RETURN_TYPE_NORMAL:
curtoken = ply_scan_get_next_token(scan);
script_op* cond_op = script_parse_op(scan);
+ script_op* else_op = NULL;
+
+ curtoken = ply_scan_get_current_token(scan);
+ if (type == SCRIPT_OP_TYPE_IF &&
+ curtoken->type == PLY_SCAN_TOKEN_TYPE_IDENTIFIER &&
+ !strcmp(curtoken->data.string, "else")){
+ curtoken = ply_scan_get_next_token(scan);
+ else_op = script_parse_op(scan);
+ }
+
script_op* op = malloc(sizeof(script_op));
op->type = type;
op->data.cond_op.cond = cond;
- op->data.cond_op.op = cond_op;
+ op->data.cond_op.op1 = cond_op;
+ op->data.cond_op.op2 = else_op;
return op;
}
void script_parse_op_free (script_op* op)
{
+ if (!op) return;
switch (op->type){
case SCRIPT_OP_TYPE_EXPRESSION:
{
case SCRIPT_OP_TYPE_WHILE:
{
script_parse_exp_free (op->data.cond_op.cond);
- script_parse_op_free (op->data.cond_op.op);
+ script_parse_op_free (op->data.cond_op.op1);
+ script_parse_op_free (op->data.cond_op.op2);
break;
}
{