Mercurial > vim
comparison src/evalfunc.c @ 18669:9007e9896303 v8.1.2326
patch 8.1.2326: cannot parse a date/time string
Commit: https://github.com/vim/vim/commit/10455d43fef041309ce0613fa792c635dd71e3a8
Author: Bram Moolenaar <Bram@vim.org>
Date: Thu Nov 21 15:36:18 2019 +0100
patch 8.1.2326: cannot parse a date/time string
Problem: Cannot parse a date/time string.
Solution: Add strptime(). (Stephen Wall, closes #)
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Thu, 21 Nov 2019 15:45:03 +0100 |
parents | 3089b422b9dc |
children | df141c730008 |
comparison
equal
deleted
inserted
replaced
18668:ce55d198b1b5 | 18669:9007e9896303 |
---|---|
18 | 18 |
19 #ifdef VMS | 19 #ifdef VMS |
20 # include <float.h> | 20 # include <float.h> |
21 #endif | 21 #endif |
22 | 22 |
23 #ifdef MACOS_X | 23 #if defined(MACOS_X) |
24 # include <time.h> // for time_t | 24 # include <time.h> // for time_t |
25 #endif | 25 #endif |
26 | 26 |
27 #ifdef FEAT_FLOAT | 27 #ifdef FEAT_FLOAT |
28 static void f_abs(typval_T *argvars, typval_T *rettv); | 28 static void f_abs(typval_T *argvars, typval_T *rettv); |
235 static void f_strgetchar(typval_T *argvars, typval_T *rettv); | 235 static void f_strgetchar(typval_T *argvars, typval_T *rettv); |
236 static void f_stridx(typval_T *argvars, typval_T *rettv); | 236 static void f_stridx(typval_T *argvars, typval_T *rettv); |
237 static void f_strlen(typval_T *argvars, typval_T *rettv); | 237 static void f_strlen(typval_T *argvars, typval_T *rettv); |
238 static void f_strcharpart(typval_T *argvars, typval_T *rettv); | 238 static void f_strcharpart(typval_T *argvars, typval_T *rettv); |
239 static void f_strpart(typval_T *argvars, typval_T *rettv); | 239 static void f_strpart(typval_T *argvars, typval_T *rettv); |
240 #ifdef HAVE_STRPTIME | |
241 static void f_strptime(typval_T *argvars, typval_T *rettv); | |
242 #endif | |
240 static void f_strridx(typval_T *argvars, typval_T *rettv); | 243 static void f_strridx(typval_T *argvars, typval_T *rettv); |
241 static void f_strtrans(typval_T *argvars, typval_T *rettv); | 244 static void f_strtrans(typval_T *argvars, typval_T *rettv); |
242 static void f_strdisplaywidth(typval_T *argvars, typval_T *rettv); | 245 static void f_strdisplaywidth(typval_T *argvars, typval_T *rettv); |
243 static void f_strwidth(typval_T *argvars, typval_T *rettv); | 246 static void f_strwidth(typval_T *argvars, typval_T *rettv); |
244 static void f_submatch(typval_T *argvars, typval_T *rettv); | 247 static void f_submatch(typval_T *argvars, typval_T *rettv); |
736 {"strgetchar", 2, 2, FEARG_1, f_strgetchar}, | 739 {"strgetchar", 2, 2, FEARG_1, f_strgetchar}, |
737 {"stridx", 2, 3, FEARG_1, f_stridx}, | 740 {"stridx", 2, 3, FEARG_1, f_stridx}, |
738 {"string", 1, 1, FEARG_1, f_string}, | 741 {"string", 1, 1, FEARG_1, f_string}, |
739 {"strlen", 1, 1, FEARG_1, f_strlen}, | 742 {"strlen", 1, 1, FEARG_1, f_strlen}, |
740 {"strpart", 2, 3, FEARG_1, f_strpart}, | 743 {"strpart", 2, 3, FEARG_1, f_strpart}, |
744 #ifdef HAVE_STRPTIME | |
745 {"strptime", 2, 2, FEARG_1, f_strptime}, | |
746 #endif | |
741 {"strridx", 2, 3, FEARG_1, f_strridx}, | 747 {"strridx", 2, 3, FEARG_1, f_strridx}, |
742 {"strtrans", 1, 1, FEARG_1, f_strtrans}, | 748 {"strtrans", 1, 1, FEARG_1, f_strtrans}, |
743 {"strwidth", 1, 1, FEARG_1, f_strwidth}, | 749 {"strwidth", 1, 1, FEARG_1, f_strwidth}, |
744 {"submatch", 1, 2, FEARG_1, f_submatch}, | 750 {"submatch", 1, 2, FEARG_1, f_submatch}, |
745 {"substitute", 4, 4, FEARG_1, f_substitute}, | 751 {"substitute", 4, 4, FEARG_1, f_substitute}, |
7410 | 7416 |
7411 rettv->v_type = VAR_STRING; | 7417 rettv->v_type = VAR_STRING; |
7412 rettv->vval.v_string = vim_strnsave(p + n, len); | 7418 rettv->vval.v_string = vim_strnsave(p + n, len); |
7413 } | 7419 } |
7414 | 7420 |
7421 #ifdef HAVE_STRPTIME | |
7422 /* | |
7423 * "strptime({format}, {timestring})" function | |
7424 */ | |
7425 static void | |
7426 f_strptime(typval_T *argvars, typval_T *rettv) | |
7427 { | |
7428 struct tm tmval; | |
7429 char_u *fmt; | |
7430 char_u *str; | |
7431 vimconv_T conv; | |
7432 char_u *enc; | |
7433 | |
7434 vim_memset(&tmval, NUL, sizeof(tmval)); | |
7435 fmt = tv_get_string(&argvars[0]); | |
7436 str = tv_get_string(&argvars[1]); | |
7437 | |
7438 conv.vc_type = CONV_NONE; | |
7439 enc = enc_locale(); | |
7440 convert_setup(&conv, p_enc, enc); | |
7441 if (conv.vc_type != CONV_NONE) | |
7442 fmt = string_convert(&conv, fmt, NULL); | |
7443 if (fmt == NULL | |
7444 || strptime((char *)str, (char *)fmt, &tmval) == NULL | |
7445 || (rettv->vval.v_number = mktime(&tmval)) == -1) | |
7446 rettv->vval.v_number = 0; | |
7447 | |
7448 if (conv.vc_type != CONV_NONE) | |
7449 vim_free(fmt); | |
7450 convert_setup(&conv, NULL, NULL); | |
7451 vim_free(enc); | |
7452 } | |
7453 #endif | |
7454 | |
7415 /* | 7455 /* |
7416 * "strridx()" function | 7456 * "strridx()" function |
7417 */ | 7457 */ |
7418 static void | 7458 static void |
7419 f_strridx(typval_T *argvars, typval_T *rettv) | 7459 f_strridx(typval_T *argvars, typval_T *rettv) |