diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2016-08-22 20:32:21 -0700 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2016-08-22 20:32:21 -0700 |
commit | 2ac1a60fa62041345bc461edb3e7d0d74a0055cd (patch) | |
tree | ba7f09cbec594b076d7541229032b606d26a76fd | |
parent | 2037ff7663e563e9f2497861b6151a6d5173c67b (diff) | |
download | txr-2ac1a60fa62041345bc461edb3e7d0d74a0055cd.tar.gz txr-2ac1a60fa62041345bc461edb3e7d0d74a0055cd.tar.bz2 txr-2ac1a60fa62041345bc461edb3e7d0d74a0055cd.zip |
Adding time-parse function: wrapper for strptime.
* configure: Test for strptime.
* eval.c (eval_init): register time-parse intrinsic.
* lib.c (time_parse): New function.
* lib.h (time_parse): Declared.
* txr.1: Documented.
-rwxr-xr-x | configure | 18 | ||||
-rw-r--r-- | eval.c | 1 | ||||
-rw-r--r-- | lib.c | 18 | ||||
-rw-r--r-- | lib.h | 3 | ||||
-rw-r--r-- | txr.1 | 28 |
5 files changed, 68 insertions, 0 deletions
@@ -1688,6 +1688,24 @@ else printf "no\n" fi +printf "Checking for strptime function ... " + +cat > conftest.c <<! +#include <time.h> + +int main(int argc, char **argv) +{ + struct tm stm = { 0 }; + strptime("2016-08-20 00:00:00", "%Y-%m-%d %H:%M:%S", &stm); + return 0; +} +! +if conftest ; then + printf "yes\n" + printf "#define HAVE_STRPTIME 1\n" >> $config_h +else + printf "no\n" +fi printf "Checking for POSIX sleep function ... " @@ -5337,6 +5337,7 @@ void eval_init(void) reg_fun(intern(lit("time-struct-utc"), user_package), func_n1(time_struct_utc)); reg_fun(intern(lit("make-time"), user_package), func_n7(make_time)); reg_fun(intern(lit("make-time-utc"), user_package), func_n7(make_time_utc)); + reg_fun(intern(lit("time-parse"), user_package), func_n2(time_parse)); reg_fun(intern(lit("source-loc"), user_package), func_n1(source_loc)); reg_fun(intern(lit("source-loc-str"), user_package), func_n2o(source_loc_str, 1)); @@ -9374,6 +9374,24 @@ val make_time(val year, val month, val day, return make_time_impl(mktime, year, month, day, hour, minute, second, isdst); } +#if HAVE_STRPTIME + +val time_parse(val format, val string) +{ + struct tm tms = { 0 }; + const wchar_t *w_str = c_str(string); + const wchar_t *w_fmt = c_str(format); + char *str = utf8_dup_to(w_str); + char *fmt = utf8_dup_to(w_fmt); + char *ptr = strptime(str, fmt, &tms); + int ret = ptr != 0; + free(fmt); + free(str); + return ret ? broken_time_struct(&tms) : nil; +} + +#endif + #if !HAVE_SETENV void setenv(const char *name, const char *value, int overwrite) @@ -992,6 +992,9 @@ val make_time(val year, val month, val day, val make_time_utc(val year, val month, val day, val hour, val minute, val second, val isdst); +#if HAVE_STRPTIME +val time_parse(val format, val string); +#endif void init(mem_t *(*oom_realloc)(mem_t *, size_t), val *stack_bottom); int compat_fixup(int compat_ver); @@ -36516,6 +36516,34 @@ function or from the .code time-usec function. +.coNP Function @ time-parse +.synb +.mets (time-parse < format << string ) +.syne +.desc +The +.code time-parse +function scans a time description in +.meta string +according to the specification given in the +.meta format +string. If the scan is successful, a structure +of type +.code time +is returned, otherwise +.codn nil . + +The +.meta format +argument follows the same conventions as the POSIX +C library function +.codn strptime . + +Note: the availability of +.code time-parse +depends on the availability of +.codn strptime . + .coNP Methods @ time-local and @ time-utc .synb .mets << time-struct .(time-local) |