diff options
author | Bram Moolenaar <Bram@vim.org> | 2010-05-21 16:33:48 +0200 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2010-05-21 16:33:48 +0200 |
commit | db7c686ea58323f8e8550dea287eac7ea4964a55 (patch) | |
tree | 0b0ff55ed0526a4209c349f833b611b23adad48e /src | |
parent | b382ad13ca50ee57d94150a3be50586d19db4204 (diff) | |
download | vim-git-db7c686ea58323f8e8550dea287eac7ea4964a55.tar.gz |
Add extra floating point functions.
Diffstat (limited to 'src')
-rw-r--r-- | src/eval.c | 244 |
1 files changed, 224 insertions, 20 deletions
diff --git a/src/eval.c b/src/eval.c index be59f9827..1803e0e55 100644 --- a/src/eval.c +++ b/src/eval.c @@ -470,6 +470,7 @@ static int non_zero_arg __ARGS((typval_T *argvars)); #ifdef FEAT_FLOAT static void f_abs __ARGS((typval_T *argvars, typval_T *rettv)); +static void f_acos __ARGS((typval_T *argvars, typval_T *rettv)); #endif static void f_add __ARGS((typval_T *argvars, typval_T *rettv)); static void f_append __ARGS((typval_T *argvars, typval_T *rettv)); @@ -477,7 +478,9 @@ static void f_argc __ARGS((typval_T *argvars, typval_T *rettv)); static void f_argidx __ARGS((typval_T *argvars, typval_T *rettv)); static void f_argv __ARGS((typval_T *argvars, typval_T *rettv)); #ifdef FEAT_FLOAT +static void f_asin __ARGS((typval_T *argvars, typval_T *rettv)); static void f_atan __ARGS((typval_T *argvars, typval_T *rettv)); +static void f_atan2 __ARGS((typval_T *argvars, typval_T *rettv)); #endif static void f_browse __ARGS((typval_T *argvars, typval_T *rettv)); static void f_browsedir __ARGS((typval_T *argvars, typval_T *rettv)); @@ -507,6 +510,7 @@ static void f_confirm __ARGS((typval_T *argvars, typval_T *rettv)); static void f_copy __ARGS((typval_T *argvars, typval_T *rettv)); #ifdef FEAT_FLOAT static void f_cos __ARGS((typval_T *argvars, typval_T *rettv)); +static void f_cosh __ARGS((typval_T *argvars, typval_T *rettv)); #endif static void f_count __ARGS((typval_T *argvars, typval_T *rettv)); static void f_cscope_connection __ARGS((typval_T *argvars, typval_T *rettv)); @@ -522,6 +526,9 @@ static void f_eval __ARGS((typval_T *argvars, typval_T *rettv)); static void f_eventhandler __ARGS((typval_T *argvars, typval_T *rettv)); static void f_executable __ARGS((typval_T *argvars, typval_T *rettv)); static void f_exists __ARGS((typval_T *argvars, typval_T *rettv)); +#ifdef FEAT_FLOAT +static void f_exp __ARGS((typval_T *argvars, typval_T *rettv)); +#endif static void f_expand __ARGS((typval_T *argvars, typval_T *rettv)); static void f_extend __ARGS((typval_T *argvars, typval_T *rettv)); static void f_feedkeys __ARGS((typval_T *argvars, typval_T *rettv)); @@ -533,6 +540,7 @@ static void f_findfile __ARGS((typval_T *argvars, typval_T *rettv)); #ifdef FEAT_FLOAT static void f_float2nr __ARGS((typval_T *argvars, typval_T *rettv)); static void f_floor __ARGS((typval_T *argvars, typval_T *rettv)); +static void f_fmod __ARGS((typval_T *argvars, typval_T *rettv)); #endif static void f_fnameescape __ARGS((typval_T *argvars, typval_T *rettv)); static void f_fnamemodify __ARGS((typval_T *argvars, typval_T *rettv)); @@ -606,6 +614,7 @@ static void f_line2byte __ARGS((typval_T *argvars, typval_T *rettv)); static void f_lispindent __ARGS((typval_T *argvars, typval_T *rettv)); static void f_localtime __ARGS((typval_T *argvars, typval_T *rettv)); #ifdef FEAT_FLOAT +static void f_log __ARGS((typval_T *argvars, typval_T *rettv)); static void f_log10 __ARGS((typval_T *argvars, typval_T *rettv)); #endif static void f_map __ARGS((typval_T *argvars, typval_T *rettv)); @@ -674,6 +683,7 @@ static void f_shellescape __ARGS((typval_T *argvars, typval_T *rettv)); static void f_simplify __ARGS((typval_T *argvars, typval_T *rettv)); #ifdef FEAT_FLOAT static void f_sin __ARGS((typval_T *argvars, typval_T *rettv)); +static void f_sinh __ARGS((typval_T *argvars, typval_T *rettv)); #endif static void f_sort __ARGS((typval_T *argvars, typval_T *rettv)); static void f_soundfold __ARGS((typval_T *argvars, typval_T *rettv)); @@ -708,6 +718,10 @@ static void f_taglist __ARGS((typval_T *argvars, typval_T *rettv)); static void f_tagfiles __ARGS((typval_T *argvars, typval_T *rettv)); static void f_tempname __ARGS((typval_T *argvars, typval_T *rettv)); static void f_test __ARGS((typval_T *argvars, typval_T *rettv)); +#ifdef FEAT_FLOAT +static void f_tan __ARGS((typval_T *argvars, typval_T *rettv)); +static void f_tanh __ARGS((typval_T *argvars, typval_T *rettv)); +#endif static void f_tolower __ARGS((typval_T *argvars, typval_T *rettv)); static void f_toupper __ARGS((typval_T *argvars, typval_T *rettv)); static void f_tr __ARGS((typval_T *argvars, typval_T *rettv)); @@ -4840,7 +4854,7 @@ eval7(arg, rettv, evaluate, want_string) char_u **arg; typval_T *rettv; int evaluate; - int want_string; /* after "." operator */ + int want_string UNUSED; /* after "." operator */ { long n; int len; @@ -7541,6 +7555,7 @@ static struct fst { #ifdef FEAT_FLOAT {"abs", 1, 1, f_abs}, + {"acos", 1, 1, f_acos}, /* WJMc */ #endif {"add", 2, 2, f_add}, {"append", 2, 2, f_append}, @@ -7548,7 +7563,9 @@ static struct fst {"argidx", 0, 0, f_argidx}, {"argv", 0, 1, f_argv}, #ifdef FEAT_FLOAT + {"asin", 1, 1, f_asin}, /* WJMc */ {"atan", 1, 1, f_atan}, + {"atan2", 2, 2, f_atan2}, #endif {"browse", 4, 4, f_browse}, {"browsedir", 2, 2, f_browsedir}, @@ -7581,6 +7598,7 @@ static struct fst {"copy", 1, 1, f_copy}, #ifdef FEAT_FLOAT {"cos", 1, 1, f_cos}, + {"cosh", 1, 1, f_cosh}, #endif {"count", 2, 4, f_count}, {"cscope_connection",0,3, f_cscope_connection}, @@ -7596,6 +7614,9 @@ static struct fst {"eventhandler", 0, 0, f_eventhandler}, {"executable", 1, 1, f_executable}, {"exists", 1, 1, f_exists}, +#ifdef FEAT_FLOAT + {"exp", 1, 1, f_exp}, +#endif {"expand", 1, 2, f_expand}, {"extend", 2, 3, f_extend}, {"feedkeys", 1, 2, f_feedkeys}, @@ -7608,6 +7629,7 @@ static struct fst #ifdef FEAT_FLOAT {"float2nr", 1, 1, f_float2nr}, {"floor", 1, 1, f_floor}, + {"fmod", 2, 2, f_fmod}, #endif {"fnameescape", 1, 1, f_fnameescape}, {"fnamemodify", 2, 2, f_fnamemodify}, @@ -7684,6 +7706,7 @@ static struct fst {"lispindent", 1, 1, f_lispindent}, {"localtime", 0, 0, f_localtime}, #ifdef FEAT_FLOAT + {"log", 1, 1, f_log}, {"log10", 1, 1, f_log10}, #endif {"map", 2, 2, f_map}, @@ -7752,6 +7775,7 @@ static struct fst {"simplify", 1, 1, f_simplify}, #ifdef FEAT_FLOAT {"sin", 1, 1, f_sin}, + {"sinh", 1, 1, f_sinh}, #endif {"sort", 1, 2, f_sort}, {"soundfold", 1, 1, f_soundfold}, @@ -7784,6 +7808,10 @@ static struct fst {"tabpagewinnr", 1, 2, f_tabpagewinnr}, {"tagfiles", 0, 0, f_tagfiles}, {"taglist", 1, 1, f_taglist}, +#ifdef FEAT_FLOAT + {"tan", 1, 1, f_tan}, + {"tanh", 1, 1, f_tanh}, +#endif {"tempname", 0, 0, f_tempname}, {"test", 1, 1, f_test}, {"tolower", 1, 1, f_tolower}, @@ -8251,6 +8279,31 @@ non_zero_arg(argvars) */ #ifdef FEAT_FLOAT +static int get_float_arg __ARGS((typval_T *argvars, float_T *f)); + +/* + * Get the float value of "argvars[0]" into "f". + * Returns FAIL when the argument is not a Number or Float. + */ + static int +get_float_arg(argvars, f) + typval_T *argvars; + float_T *f; +{ + if (argvars[0].v_type == VAR_FLOAT) + { + *f = argvars[0].vval.v_float; + return OK; + } + if (argvars[0].v_type == VAR_NUMBER) + { + *f = (float_T)argvars[0].vval.v_number; + return OK; + } + EMSG(_("E808: Number or Float required")); + return FAIL; +} + /* * "abs(expr)" function */ @@ -8278,6 +8331,23 @@ f_abs(argvars, rettv) rettv->vval.v_number = -n; } } + +/* + * "acos()" function + */ + static void +f_acos(argvars, rettv) + typval_T *argvars; + typval_T *rettv; +{ + float_T f; + + rettv->v_type = VAR_FLOAT; + if (get_float_arg(argvars, &f) == OK) + rettv->vval.v_float = acos(f); + else + rettv->vval.v_float = 0.0; +} #endif /* @@ -8406,29 +8476,21 @@ f_argv(argvars, rettv) } #ifdef FEAT_FLOAT -static int get_float_arg __ARGS((typval_T *argvars, float_T *f)); - /* - * Get the float value of "argvars[0]" into "f". - * Returns FAIL when the argument is not a Number or Float. + * "asin()" function */ - static int -get_float_arg(argvars, f) + static void +f_asin(argvars, rettv) typval_T *argvars; - float_T *f; + typval_T *rettv; { - if (argvars[0].v_type == VAR_FLOAT) - { - *f = argvars[0].vval.v_float; - return OK; - } - if (argvars[0].v_type == VAR_NUMBER) - { - *f = (float_T)argvars[0].vval.v_number; - return OK; - } - EMSG(_("E808: Number or Float required")); - return FAIL; + float_T f; + + rettv->v_type = VAR_FLOAT; + if (get_float_arg(argvars, &f) == OK) + rettv->vval.v_float = asin(f); + else + rettv->vval.v_float = 0.0; } /* @@ -8447,6 +8509,24 @@ f_atan(argvars, rettv) else rettv->vval.v_float = 0.0; } + +/* + * "atan2()" function + */ + static void +f_atan2(argvars, rettv) + typval_T *argvars; + typval_T *rettv; +{ + float_T fx, fy; + + rettv->v_type = VAR_FLOAT; + if (get_float_arg(argvars, &fx) == OK + && get_float_arg(&argvars[1], &fy) == OK) + rettv->vval.v_float = atan2(fx, fy); + else + rettv->vval.v_float = 0.0; +} #endif /* @@ -9117,6 +9197,23 @@ f_cos(argvars, rettv) else rettv->vval.v_float = 0.0; } + +/* + * "cosh()" function + */ + static void +f_cosh(argvars, rettv) + typval_T *argvars; + typval_T *rettv; +{ + float_T f; + + rettv->v_type = VAR_FLOAT; + if (get_float_arg(argvars, &f) == OK) + rettv->vval.v_float = cosh(f); + else + rettv->vval.v_float = 0.0; +} #endif /* @@ -9593,6 +9690,25 @@ f_exists(argvars, rettv) rettv->vval.v_number = n; } +#ifdef FEAT_FLOAT +/* + * "exp()" function + */ + static void +f_exp(argvars, rettv) + typval_T *argvars; + typval_T *rettv; +{ + float_T f; + + rettv->v_type = VAR_FLOAT; + if (get_float_arg(argvars, &f) == OK) + rettv->vval.v_float = exp(f); + else + rettv->vval.v_float = 0.0; +} +#endif + /* * "expand()" function */ @@ -10140,6 +10256,24 @@ f_floor(argvars, rettv) else rettv->vval.v_float = 0.0; } + +/* + * "fmod()" function + */ + static void +f_fmod(argvars, rettv) + typval_T *argvars; + typval_T *rettv; +{ + float_T fx, fy; + + rettv->v_type = VAR_FLOAT; + if (get_float_arg(argvars, &fx) == OK + && get_float_arg(&argvars[1], &fy) == OK) + rettv->vval.v_float = fmod(fx, fy); + else + rettv->vval.v_float = 0.0; +} #endif /* @@ -13005,6 +13139,23 @@ get_maparg(argvars, rettv, exact) #ifdef FEAT_FLOAT /* + * "log()" function + */ + static void +f_log(argvars, rettv) + typval_T *argvars; + typval_T *rettv; +{ + float_T f; + + rettv->v_type = VAR_FLOAT; + if (get_float_arg(argvars, &f) == OK) + rettv->vval.v_float = log(f); + else + rettv->vval.v_float = 0.0; +} + +/* * "log10()" function */ static void @@ -15823,6 +15974,23 @@ f_sin(argvars, rettv) else rettv->vval.v_float = 0.0; } + +/* + * "sinh()" function + */ + static void +f_sinh(argvars, rettv) + typval_T *argvars; + typval_T *rettv; +{ + float_T f; + + rettv->v_type = VAR_FLOAT; + if (get_float_arg(argvars, &f) == OK) + rettv->vval.v_float = sinh(f); + else + rettv->vval.v_float = 0.0; +} #endif static int @@ -17077,6 +17245,42 @@ f_test(argvars, rettv) #endif } +#ifdef FEAT_FLOAT +/* + * "tan()" function + */ + static void +f_tan(argvars, rettv) + typval_T *argvars; + typval_T *rettv; +{ + float_T f; + + rettv->v_type = VAR_FLOAT; + if (get_float_arg(argvars, &f) == OK) + rettv->vval.v_float = tan(f); + else + rettv->vval.v_float = 0.0; +} + +/* + * "tanh()" function + */ + static void +f_tanh(argvars, rettv) + typval_T *argvars; + typval_T *rettv; +{ + float_T f; + + rettv->v_type = VAR_FLOAT; + if (get_float_arg(argvars, &f) == OK) + rettv->vval.v_float = tanh(f); + else + rettv->vval.v_float = 0.0; +} +#endif + /* * "tolower(string)" function */ |