aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--evaluator.c2
-rw-r--r--evaluator.h1
-rw-r--r--plugin_math.c23
3 files changed, 25 insertions, 1 deletions
diff --git a/evaluator.c b/evaluator.c
index e2b103f..aaebee9 100644
--- a/evaluator.c
+++ b/evaluator.c
@@ -274,7 +274,7 @@ RESULT *SetResult(RESULT ** result, const int type, const void *value)
}
-static RESULT *CopyResult(RESULT ** result, RESULT * value)
+RESULT *CopyResult(RESULT ** result, RESULT * value)
{
if (*result == NULL) {
if ((*result = NewResult()) == NULL)
diff --git a/evaluator.h b/evaluator.h
index 6b4cbca..412aeec 100644
--- a/evaluator.h
+++ b/evaluator.h
@@ -51,6 +51,7 @@ void DeleteFunctions(void);
void DelResult(RESULT * result);
RESULT *SetResult(RESULT ** result, const int type, const void *value);
+RESULT *CopyResult(RESULT ** result, RESULT * value);
double R2N(RESULT * result);
char *R2S(RESULT * result);
diff --git a/plugin_math.c b/plugin_math.c
index b74f188..c3748e1 100644
--- a/plugin_math.c
+++ b/plugin_math.c
@@ -114,6 +114,26 @@ static void my_ceil(RESULT * result, RESULT * arg)
SetResult(&result, R_NUMBER, &value);
}
+static void my_decode(RESULT * result, int argc, RESULT * argv[])
+{
+ int index;
+
+ if (argc < 2) {
+ error("decode(): wrong number of parameters");
+ SetResult(&result, R_STRING, "");
+ return;
+ }
+
+ index = R2N(argv[0]);
+
+ if (index < 0 || index >= argc-1) {
+ SetResult(&result, R_STRING, "");
+ return;
+ }
+
+ CopyResult (&result, argv[index+1]);
+}
+
int plugin_init_math(void)
{
@@ -138,6 +158,9 @@ int plugin_init_math(void)
AddFunction("floor", 1, my_floor);
AddFunction("ceil", 1, my_ceil);
+ /* decode */
+ AddFunction("decode", -1, my_decode);
+
return 0;
}