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)