diff options
Diffstat (limited to 'Src/Modules/example.c')
-rw-r--r-- | Src/Modules/example.c | 174 |
1 files changed, 165 insertions, 9 deletions
diff --git a/Src/Modules/example.c b/Src/Modules/example.c index 45ef3c28f..793d743fc 100644 --- a/Src/Modules/example.c +++ b/Src/Modules/example.c @@ -30,47 +30,203 @@ #include "example.mdh" #include "example.pro" +/* parameters */ + +static zlong intparam; +static char *strparam; +static char **arrparam; + + /**/ static int -bin_example(char *nam, char **args, char *ops, int func) +bin_example(char *nam, char **args, Options ops, int func) { unsigned char c; + char **oargs = args, **p = arrparam; + long i = 0; printf("Options: "); for (c = 32; ++c < 128;) - if (ops[c]) + if (OPT_ISSET(ops,c)) putchar(c); printf("\nArguments:"); - for (; *args; args++) { + for (; *args; i++, args++) { putchar(' '); fputs(*args, stdout); } printf("\nName: %s\n", nam); +#ifdef ZSH_64_BIT_TYPE + printf("\nInteger Parameter: %s\n", output64(intparam)); +#else + printf("\nInteger Parameter: %ld\n", intparam); +#endif + printf("String Parameter: %s\n", strparam ? strparam : ""); + printf("Array Parameter:"); + if (p) + while (*p) printf(" %s", *p++); + printf("\n"); + + intparam = i; + zsfree(strparam); + strparam = ztrdup(*oargs ? *oargs : ""); + freearray(arrparam); + arrparam = zarrdup(oargs); return 0; } +/**/ +static int +cond_p_len(char **a, int id) +{ + char *s1 = cond_str(a, 0, 0); + + if (a[1]) { + zlong v = cond_val(a, 1); + + return strlen(s1) == v; + } else { + return !s1[0]; + } +} + +/**/ +static int +cond_i_ex(char **a, int id) +{ + char *s1 = cond_str(a, 0, 0), *s2 = cond_str(a, 1, 0); + + 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(Eprog prog, FuncWrap w, char *name) +{ + if (strncmp(name, "example", 7)) + return 1; + else { + int ogd = opts[GLOBDOTS]; + + opts[GLOBDOTS] = 1; + runshfunc(prog, w, name); + opts[GLOBDOTS] = ogd; + + return 0; + } +} + /* - * boot_example is executed when the module is loaded. + * boot_ is executed when the module is loaded. */ static struct builtin bintab[] = { BUILTIN("example", 0, bin_example, 0, -1, 0, "flags", NULL), }; +static struct conddef cotab[] = { + CONDDEF("len", 0, cond_p_len, 1, 2, 0), + CONDDEF("ex", CONDF_INFIX, cond_i_ex, 0, 0, 0), +}; + +static struct paramdef patab[] = { + INTPARAMDEF("exint", &intparam), + STRPARAMDEF("exstr", &strparam), + 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), +}; + /**/ int -boot_example(Module m) +setup_(Module m) { - return !addbuiltins(m->nam, bintab, sizeof(bintab)/sizeof(*bintab)); + printf("The example module has now been set up.\n"); + fflush(stdout); + return 0; } -#ifdef MODULE +/**/ +int +boot_(Module m) +{ + intparam = 42; + strparam = ztrdup("example"); + arrparam = (char **) zalloc(3 * sizeof(char *)); + arrparam[0] = ztrdup("example"); + arrparam[1] = ztrdup("array"); + arrparam[2] = NULL; + 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)); +} /**/ int -cleanup_example(Module m) +cleanup_(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; +} + +/**/ +int +finish_(Module m) +{ + printf("Thank you for using the example module. Have a nice day.\n"); + fflush(stdout); return 0; } -#endif |