From: Heng Li Date: Fri, 22 May 2015 02:18:41 +0000 (-0400) Subject: check unknown function names X-Git-Url: http://www.kaiwu.me/postgresql/commit/static/gitweb.js?a=commitdiff_plain;h=28ab7faa4fd99af0b7b56c8d29f5094e04b8ef5e;p=klib.git check unknown function names --- diff --git a/kexpr.c b/kexpr.c index 1cc75b1..87429d0 100644 --- 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 8cca627..d2e73ad 100644 --- 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" {