--- 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.");