0
0
mirror of https://github.com/vim/vim.git synced 2025-09-27 04:14:06 -04:00

Add extra floating point functions.

This commit is contained in:
Bram Moolenaar
2010-05-21 16:33:48 +02:00
parent b382ad13ca
commit db7c686ea5
7 changed files with 392 additions and 23 deletions

View File

@@ -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
/*
@@ -13004,6 +13138,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
*/
@@ -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
*/