aboutsummaryrefslogtreecommitdiff
path: root/lib/forlan.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/forlan.c')
-rw-r--r--lib/forlan.c36
1 files changed, 36 insertions, 0 deletions
diff --git a/lib/forlan.c b/lib/forlan.c
index e86189b..6b10cd7 100644
--- a/lib/forlan.c
+++ b/lib/forlan.c
@@ -18,6 +18,8 @@
#include <string.h>
#include <setjmp.h>
#include <ctype.h>
+#include <sysexits.h>
+#include <time.h>
#include "grecs.h"
#include "forlan.h"
@@ -414,6 +416,7 @@ eval_func(forlan_eval_env_t env, union forlan_node *node)
node->func.fp->func(env, vlist);
grecs_list_free(vlist);
+ env->retval.type = node->func.fp->rettype;
if (env->retval.type == forlan_value_node)
env->last = env->retval.v.node;
}
@@ -881,6 +884,13 @@ func_sort(forlan_eval_env_t env, struct grecs_list *list)
}
static void
+func_empty(forlan_eval_env_t env, struct grecs_list *list)
+{
+ struct forlan_value *val = list->head->data;
+ env->retval.v.num = !(val->v.node && val->v.node->down);
+}
+
+static void
func_decode(forlan_eval_env_t env, struct grecs_list *list)
{
struct forlan_value *val = list->head->data;
@@ -924,6 +934,30 @@ func_exit(forlan_eval_env_t env, struct grecs_list *list)
longjmp(env->stop_buf, 1);
}
+static void
+func_timestamp(forlan_eval_env_t env, struct grecs_list *list)
+{
+ struct forlan_value *val = list->head->data;
+ char *input = val->v.string;
+ struct tm tm;
+ char *buf = NULL;
+ size_t size = 0;
+ time_t t;
+
+ /* 2012-06-21T10:36:48.000Z */
+ memset(&tm, 0, sizeof(tm));
+ if (sscanf(val->v.string, "%d-%2d-%2dT%2d:%2d:%2d.",
+ &tm.tm_year, &tm.tm_mon, &tm.tm_mday,
+ &tm.tm_hour, &tm.tm_min, &tm.tm_sec) != 6)
+ die(EX_DATAERR, "invalid timestamp: %s", val->v.string);
+ tm.tm_year -= 1900;
+ tm.tm_mon--;
+ t = mktime(&tm);
+ grecs_asprintf(&buf, &size, "%lu", (unsigned long)t);
+ env->retval.v.string = buf;
+}
+
+
static struct forlan_function functab[] = {
{ "dump", forlan_value_void, "n", 1, 1, func_dump },
{ "print", forlan_value_void, "", 1, -1, func_print },
@@ -932,6 +966,8 @@ static struct forlan_function functab[] = {
{ "sort", forlan_value_void, "n", 1, 1, func_sort },
{ "decode", forlan_value_literal, "s", 1, 1, func_decode },
{ "exit", forlan_value_void, "s", 1, 1, func_exit },
+ { "empty", forlan_value_boolean, "n", 1, 1, func_empty },
+ { "timestamp", forlan_value_literal, "s", 1, 1, func_timestamp },
{ NULL }
};

Return to:

Send suggestions and report system problems to the System administrator.