diff options
Diffstat (limited to 'lib/forlan.c')
-rw-r--r-- | lib/forlan.c | 36 |
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 } }; |