0
0
mirror of https://github.com/vim/vim.git synced 2025-10-13 06:54:15 -04:00

patch 8.1.2326: cannot parse a date/time string

Problem:    Cannot parse a date/time string.
Solution:   Add strptime(). (Stephen Wall, closes #)
This commit is contained in:
Bram Moolenaar
2019-11-21 15:36:18 +01:00
parent 9ae862ebba
commit 10455d43fe
9 changed files with 121 additions and 20 deletions

View File

@@ -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
*/