From 6f698f634a85d0b3d34b5566d1adb807de577e86 Mon Sep 17 00:00:00 2001 From: Tanaka Akira Date: Wed, 22 Sep 1999 13:04:17 +0000 Subject: zsh-workers/7976 --- Src/Modules/example.c | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ Src/Modules/example.mdd | 1 + 2 files changed, 49 insertions(+) (limited to 'Src/Modules') diff --git a/Src/Modules/example.c b/Src/Modules/example.c index b0bbee967..fbe392e94 100644 --- a/Src/Modules/example.c +++ b/Src/Modules/example.c @@ -100,6 +100,47 @@ cond_i_ex(char **a, int id) return !strcmp("example", dyncat(s1, s2)); } +/**/ +static mnumber +math_sum(char *name, int argc, mnumber *argv, int id) +{ + mnumber ret; + int f = 0; + + ret.u.l = 0; + while (argc--) { + if (argv->type == MN_INTEGER) { + if (f) + ret.u.d += (double) argv->u.l; + else + ret.u.l += argv->u.l; + } else { + if (f) + ret.u.d += argv->u.d; + else { + ret.u.d = ((double) ret.u.l) + ((double) argv->u.d); + f = 1; + } + } + argv++; + } + ret.type = (f ? MN_FLOAT : MN_INTEGER); + + return ret; +} + +/**/ +static mnumber +math_length(char *name, char *arg, int id) +{ + mnumber ret; + + ret.type = MN_INTEGER; + ret.u.l = strlen(arg); + + return ret; +} + /**/ static int ex_wrapper(List list, FuncWrap w, char *name) @@ -136,6 +177,11 @@ static struct paramdef patab[] = { ARRPARAMDEF("exarr", &arrparam), }; +static struct mathfunc mftab[] = { + NUMMATHFUNC("sum", math_sum, 1, -1, 0), + STRMATHFUNC("length", math_length, 0), +}; + static struct funcwrap wrapper[] = { WRAPDEF(ex_wrapper), }; @@ -162,6 +208,7 @@ boot_example(Module m) return !(addbuiltins(m->nam, bintab, sizeof(bintab)/sizeof(*bintab)) | addconddefs(m->nam, cotab, sizeof(cotab)/sizeof(*cotab)) | addparamdefs(m->nam, patab, sizeof(patab)/sizeof(*patab)) | + addmathfuncs(m->nam, mftab, sizeof(mftab)/sizeof(*mftab)) | !addwrapper(m, wrapper)); } @@ -174,6 +221,7 @@ cleanup_example(Module m) deletebuiltins(m->nam, bintab, sizeof(bintab)/sizeof(*bintab)); deleteconddefs(m->nam, cotab, sizeof(cotab)/sizeof(*cotab)); deleteparamdefs(m->nam, patab, sizeof(patab)/sizeof(*patab)); + deletemathfuncs(m->nam, mftab, sizeof(mftab)/sizeof(*mftab)); deletewrapper(m, wrapper); return 0; } diff --git a/Src/Modules/example.mdd b/Src/Modules/example.mdd index 5ed55e6f1..e32e8182e 100644 --- a/Src/Modules/example.mdd +++ b/Src/Modules/example.mdd @@ -3,5 +3,6 @@ autobins="example" autoinfixconds="ex" autoprefixconds="len" autoparams="exint exstr exarr" +automathfuncs="sum length" objects="example.o" -- cgit 1.4.1