summaryrefslogtreecommitdiff
path: root/Src/Modules/example.c
diff options
context:
space:
mode:
Diffstat (limited to 'Src/Modules/example.c')
-rw-r--r--Src/Modules/example.c174
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