diff -r 7707b26e82fd -r 320e4393785a yaubil.c --- a/yaubil.c Tue Nov 10 18:27:16 2009 +0200 +++ b/yaubil.c Tue Nov 10 19:36:54 2009 +0200 @@ -472,9 +472,9 @@ g_free (value); } -static value_t *process_expression (const char *str, gsize len) +static value_t *process_expression (const char *str, gsize *len) { - const char *strend = str + len; + const char *strend = str + *len; const char *p; op_t *op = NULL; int state = STATE_LVALUE; @@ -484,7 +484,7 @@ .str_value = NULL, }; - for (p = str; *p && p < strend; ++p) { + for (p = str; *p && p < strend && *p != ')'; ++p) { switch (state) { case STATE_LVALUE: case STATE_RVALUE: @@ -585,48 +585,21 @@ } else if (*p == '(') { - const char *e; - - { - int l = 0; - gboolean finished = FALSE; - - // XXX maybe we should just pass end of line and let it return real length... - for (e = p + 1; e < strend; ++e) { - if (*e == '(') - ++l; - else if (*e == ')') { - --l; - if (l < 0) { - finished = TRUE; - break; - } - } - } - - if (!finished) { - scr_LogPrint (LPRINT_NORMAL, MSGPREFIX "Error: Unmatched parenthesis."); - g_free (val.str_value); - return NULL; - } + gsize len = strend - p - 1; + value_t *n = process_expression (p + 1, &len); + + if (!n) { + scr_LogPrint (LPRINT_NORMAL, MSGPREFIX "Error: Error in subexpression."); + g_free (val.str_value); + return NULL; } - { - value_t *n = process_expression (p + 1, e - p - 1); - - if (!n) { - scr_LogPrint (LPRINT_NORMAL, MSGPREFIX "Error: Error in subexpression."); - g_free (val.str_value); - return NULL; - } + rval.type = n->type; + rval.int_value = n->int_value; + rval.str_value = g_strdup (n->str_value); + destroy_value (n); - rval.type = n->type; - rval.int_value = n->int_value; - rval.str_value = g_strdup (n->str_value); - destroy_value (n); - } - - p = e; + p += len + 1; } else { scr_LogPrint (LPRINT_NORMAL, MSGPREFIX "Error: unrecognized symbols."); @@ -687,6 +660,7 @@ } { // return value + *len = p - str; value_t *rval = g_new (value_t, 1); rval->type = val.type; @@ -699,7 +673,8 @@ static void do_eval (char *arg) { - value_t *val = process_expression (arg, strlen (arg)); + gsize len = strlen (arg); + value_t *val = process_expression (arg, &len); if (!val) { scr_LogPrint (LPRINT_NORMAL, "eval: Evaluation error."); @@ -738,8 +713,11 @@ namelen = p + 1 - arg; } - // evaluate expression - value = process_expression (val + 1, strlen (val + 1)); + { // evaluate expression + gsize len = strlen (val + 1); + + value = process_expression (val + 1, &len); + } if (!value) { scr_LogPrint (LPRINT_NORMAL, "let: Evaluation error."); @@ -767,7 +745,8 @@ static void do_if (char *arg) { - value_t *val = process_expression (arg, strlen (arg)); + gsize len = strlen (arg); + value_t *val = process_expression (arg, &len); if (!val) { scr_LogPrint (LPRINT_NORMAL, "if: Evaluation error.");