]> git.kaiwu.me - klib.git/commitdiff
check unknown function names
authorHeng Li <lh3@me.com>
Fri, 22 May 2015 02:18:41 +0000 (22:18 -0400)
committerHeng Li <lh3@me.com>
Fri, 22 May 2015 02:18:41 +0000 (22:18 -0400)
kexpr.c
kexpr.h

diff --git a/kexpr.c b/kexpr.c
index 1cc75b12a330b2b9af417c7bd83717be2d2a1b5c..87429d015f74b906ea37e3d54308ba1748466474 100644 (file)
--- a/kexpr.c
+++ b/kexpr.c
@@ -361,16 +361,23 @@ int ke_eval(const kexpr_t *ke, int64_t *_i, double *_r, int *int_ret)
                                p->vtype = KEV_INT;
                        }
                } else if (e->ttype == KET_FUNC) {
-                       if (strcmp(e->name, "abs") == 0) {
-                               p = &stack[top-1];
-                               if (p->vtype == KEV_INT) p->i = abs(p->i), p->r = (double)p->i;
-                               else p->r = fabs(p->r), p->i = (int64_t)(p->r + .5);
-                       } else if (strcmp(e->name, "log") == 0) _do_func1(log);
-                       else if (strcmp(e->name, "exp") == 0) _do_func1(exp);
-                       else if (strcmp(e->name, "log2") == 0) _do_func1(log2);
-                       else if (strcmp(e->name, "exp2") == 0) _do_func1(exp2);
-                       else if (strcmp(e->name, "log10") == 0) _do_func1(log10);
-                       else if (strcmp(e->name, "sqrt") == 0) _do_func1(sqrt);
+                       if (e->n_args == 1) {
+                               if (strcmp(e->name, "abs") == 0) {
+                                       p = &stack[top-1];
+                                       if (p->vtype == KEV_INT) p->i = abs(p->i), p->r = (double)p->i;
+                                       else p->r = fabs(p->r), p->i = (int64_t)(p->r + .5);
+                               } else if (strcmp(e->name, "log") == 0) _do_func1(log);
+                               else if (strcmp(e->name, "exp") == 0) _do_func1(exp);
+                               else if (strcmp(e->name, "log2") == 0) _do_func1(log2);
+                               else if (strcmp(e->name, "exp2") == 0) _do_func1(exp2);
+                               else if (strcmp(e->name, "log10") == 0) _do_func1(log10);
+                               else if (strcmp(e->name, "sqrt") == 0) _do_func1(sqrt);
+                               else { err |= KEE_UNFUNC; break; }
+                       } else {
+                               err |= KEE_UNFUNC;
+                               top -= e->n_args - 1;
+                               break;
+                       }
                }
        }
        if (top != 1) err |= KEE_ARG;
diff --git a/kexpr.h b/kexpr.h
index 8cca627ac9c3a78fb9900230d0b5a54a18a31933..d2e73ade4343c0123533a9be7c81ce69a56fbb0f 100644 (file)
--- a/kexpr.h
+++ b/kexpr.h
@@ -12,7 +12,8 @@ typedef struct kexpr_s kexpr_t;
 #define KEE_UNTO  8 // unknown tokens
 #define KEE_FUNC 16 // wrong function
 
-#define KEE_ARG  32
+#define KEE_ARG    32
+#define KEE_UNFUNC 64
 
 #ifdef __cplusplus
 extern "C" {