summaryrefslogtreecommitdiffstats
path: root/src/evalfunc.c
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2019-11-21 15:36:18 +0100
committerBram Moolenaar <Bram@vim.org>2019-11-21 15:36:18 +0100
commit10455d43fef041309ce0613fa792c635dd71e3a8 (patch)
tree66b437223be119f47c759603193a6b1c6ff205c3 /src/evalfunc.c
parent9ae862ebba4a8962cb1c6811a2a46656fa672599 (diff)
patch 8.1.2326: cannot parse a date/time stringv8.1.2326
Problem: Cannot parse a date/time string. Solution: Add strptime(). (Stephen Wall, closes #)
Diffstat (limited to 'src/evalfunc.c')
-rw-r--r--src/evalfunc.c42
1 files changed, 41 insertions, 1 deletions
diff --git a/src/evalfunc.c b/src/evalfunc.c
index 945c5f227f..63c4057ba7 100644
--- a/src/evalfunc.c
+++ b/src/evalfunc.c
@@ -20,7 +20,7 @@
# include <float.h>
#endif
-#ifdef MACOS_X
+#if defined(MACOS_X)
# include <time.h> // for time_t
#endif
@@ -237,6 +237,9 @@ static void f_stridx(typval_T *argvars, typval_T *rettv);
static void f_strlen(typval_T *argvars, typval_T *rettv);
static void f_strcharpart(typval_T *argvars, typval_T *rettv);
static void f_strpart(typval_T *argvars, typval_T *rettv);
+#ifdef HAVE_STRPTIME
+static void f_strptime(typval_T *argvars, typval_T *rettv);
+#endif
static void f_strridx(typval_T *argvars, typval_T *rettv);
static void f_strtrans(typval_T *argvars, typval_T *rettv);
static void f_strdisplaywidth(typval_T *argvars, typval_T *rettv);
@@ -738,6 +741,9 @@ static funcentry_T global_functions[] =
{"string", 1, 1, FEARG_1, f_string},
{"strlen", 1, 1, FEARG_1, f_strlen},
{"strpart", 2, 3, FEARG_1, f_strpart},
+#ifdef HAVE_STRPTIME
+ {"strptime", 2, 2, FEARG_1, f_strptime},
+#endif
{"strridx", 2, 3, FEARG_1, f_strridx},
{"strtrans", 1, 1, FEARG_1, f_strtrans},
{"strwidth", 1, 1, FEARG_1, f_strwidth},
@@ -7412,6 +7418,40 @@ f_strpart(typval_T *argvars, typval_T *rettv)
rettv->vval.v_string = vim_strnsave(p + n, len);
}
+#ifdef HAVE_STRPTIME
+/*
+ * "strptime({format}, {timestring})" function
+ */
+ static void
+f_strptime(typval_T *argvars, typval_T *rettv)
+{
+ struct tm tmval;
+ char_u *fmt;
+ char_u *str;
+ vimconv_T conv;
+ char_u *enc;
+
+ vim_memset(&tmval, NUL, sizeof(tmval));
+ fmt = tv_get_string(&argvars[0]);
+ str = tv_get_string(&argvars[1]);
+
+ conv.vc_type = CONV_NONE;
+ enc = enc_locale();
+ convert_setup(&conv, p_enc, enc);
+ if (conv.vc_type != CONV_NONE)
+ fmt = string_convert(&conv, fmt, NULL);
+ if (fmt == NULL
+ || strptime((char *)str, (char *)fmt, &tmval) == NULL
+ || (rettv->vval.v_number = mktime(&tmval)) == -1)
+ rettv->vval.v_number = 0;
+
+ if (conv.vc_type != CONV_NONE)
+ vim_free(fmt);
+ convert_setup(&conv, NULL, NULL);
+ vim_free(enc);
+}
+#endif
+
/*
* "strridx()" function
*/