diff options
author | Bram Moolenaar <Bram@vim.org> | 2019-11-21 15:36:18 +0100 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2019-11-21 15:36:18 +0100 |
commit | 10455d43fef041309ce0613fa792c635dd71e3a8 (patch) | |
tree | 66b437223be119f47c759603193a6b1c6ff205c3 /src/evalfunc.c | |
parent | 9ae862ebba4a8962cb1c6811a2a46656fa672599 (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.c | 42 |
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 */ |