changeset 666:d168fcf6f493

Merged.
author Matti Hamalainen <ccr@tnsp.org>
date Tue, 16 Apr 2013 09:33:31 +0300
parents f9a3b0e8f0fc (current diff) 57fc2ec4efdc (diff)
children f9f98a0f4e9a
files
diffstat 2 files changed, 34 insertions(+), 14 deletions(-) [+]
line wrap: on
line diff
--- a/dmeval.c	Tue Apr 16 08:13:20 2013 +0300
+++ b/dmeval.c	Tue Apr 16 09:33:31 2013 +0300
@@ -6,9 +6,27 @@
 #define DM_MAX_BUF     512
 #define DM_STACK_SIZE  512
 
-static DMValue int_clip(DMValue v)
+static DMValue func_int_clip(DMValue *v)
+{
+    return (*v < -1.0f) ? -1.0f : ((*v > 1.0f) ? 1.0f : *v);
+}
+
+
+static DMValue func_sin(DMValue *v)
 {
-    return (v < -1.0f) ? -1.0f : ((v > 1.0f) ? 1.0f : v);
+    return sin(*v);
+}
+
+
+static DMValue func_cos(DMValue *v)
+{
+    return cos(*v);
+}
+
+
+static DMValue func_pow(DMValue *v)
+{
+    return pow(v[0], v[1]);
 }
 
 
@@ -16,9 +34,10 @@
  */
 static const DMEvalId dm_eval_basic[] =
 {
-    { "sin",  ID_FUNC, sin, NULL },
-    { "cos",  ID_FUNC, cos, NULL },
-    { "clip", ID_FUNC, int_clip, NULL },
+    { "sin",  ID_FUNC, 1, func_sin, NULL },
+    { "cos",  ID_FUNC, 1, func_cos, NULL },
+    { "clip", ID_FUNC, 1, func_int_clip, NULL },
+    { "pow",  ID_FUNC, 2, func_pow, NULL },
 };
 
 static const int ndm_eval_basic = sizeof(dm_eval_basic) / sizeof(dm_eval_basic[0]);
@@ -103,7 +122,7 @@
 }
 
 
-DMEvalId *dm_eval_add_func(DMEvalContext *ev, const char *name, DMValue (*func)(DMValue))
+DMEvalId *dm_eval_add_func(DMEvalContext *ev, const char *name, DMValue (*func)(DMValue *))
 {
     DMEvalId *id = dm_eval_add_id(ev, name, ID_VAR);
     if (id == NULL)
@@ -221,10 +240,10 @@
     if (node == NULL)
         return NULL;
 
-    node->op = src->op;
-    node->val = src->val;
-    node->id = src->id;
-    node->subexpr = src->subexpr;
+    node->op       = src->op;
+    node->val      = src->val;
+    node->id       = src->id;
+    node->subexpr  = src->subexpr;
 
     return dm_eval_insert_node(list, node);
 }
@@ -740,8 +759,8 @@
 
 static int dm_eval_get(DMEvalContext *ev, DMEvalNode *node, DMValue *result)
 {
-    DMValue tmp;
-    
+    DMValue tmp[16];
+
     if (node == NULL)
         return -32;
     
--- a/dmeval.h	Tue Apr 16 08:13:20 2013 +0300
+++ b/dmeval.h	Tue Apr 16 09:33:31 2013 +0300
@@ -44,7 +44,8 @@
 {
     char *name;
     int type;
-    DMValue (*func)(DMValue);
+    int args;
+    DMValue (*func)(DMValue *);
     DMValue *var;
 } DMEvalId;
 
@@ -73,7 +74,7 @@
 
 DMEvalId *dm_eval_find_id(DMEvalContext *ev, const char *name);
 DMEvalId *dm_eval_add_var(DMEvalContext *ev, const char *name, DMValue *var);
-DMEvalId *dm_eval_add_func(DMEvalContext *ev, const char *name, DMValue (*func)(DMValue));
+DMEvalId *dm_eval_add_func(DMEvalContext *ev, const char *name, DMValue (*func)(DMValue *));
 
 DMEvalContext *dm_eval_new(void);
 void dm_eval_close(DMEvalContext *ev);