Patch 8.1.2326
Problem:    Cannot parse a date/time string.
Solution:   Add strptime(). (Stephen Wall, closes #)
Files:      runtime/doc/eval.txt, runtime/doc/usr_41.txt, src/auto/configure,
            src/config.h.in, src/configure.ac, src/evalfunc.c, src/os_unix.h,
            src/testdir/test_functions.vim


*** ../vim-8.1.2325/runtime/doc/eval.txt        2019-11-16 18:21:57.986848040 
+0100
--- runtime/doc/eval.txt        2019-11-21 15:04:08.613993187 +0100
***************
*** 2770,2776 ****
  strcharpart({str}, {start} [, {len}])
                                String  {len} characters of {str} at {start}
  strdisplaywidth({expr} [, {col}]) Number display length of the String {expr}
! strftime({format} [, {time}]) String  time in specified format
  strgetchar({str}, {index})    Number  get char {index} from {str}
  stridx({haystack}, {needle} [, {start}])
                                Number  index of {needle} in {haystack}
--- 2770,2776 ----
  strcharpart({str}, {start} [, {len}])
                                String  {len} characters of {str} at {start}
  strdisplaywidth({expr} [, {col}]) Number display length of the String {expr}
! strftime({format} [, {time}]) String  format time with a specified format
  strgetchar({str}, {index})    Number  get char {index} from {str}
  stridx({haystack}, {needle} [, {start}])
                                Number  index of {needle} in {haystack}
***************
*** 2778,2783 ****
--- 2778,2785 ----
  strlen({expr})                        Number  length of the String {expr}
  strpart({str}, {start} [, {len}])
                                String  {len} characters of {str} at {start}
+ strptime({format}, {timestring})
+                               Number  Convert {timestring} to unix timestamp
  strridx({haystack}, {needle} [, {start}])
                                Number  last index of {needle} in {haystack}
  strtrans({expr})              String  translate string to make it printable
***************
*** 2885,2891 ****
  win_id2win({expr})            Number  get window nr from window ID
  win_screenpos({nr})           List    get screen position of window {nr}
  win_splitmove({nr}, {target} [, {options}])
!                               none    move window {nr} to split of {target}
  winbufnr({nr})                        Number  buffer number of window {nr}
  wincol()                      Number  window column of the cursor
  winheight({nr})                       Number  height of window {nr}
--- 2887,2893 ----
  win_id2win({expr})            Number  get window nr from window ID
  win_screenpos({nr})           List    get screen position of window {nr}
  win_splitmove({nr}, {target} [, {options}])
!                               Number  move window {nr} to split of {target}
  winbufnr({nr})                        Number  buffer number of window {nr}
  wincol()                      Number  window column of the cursor
  winheight({nr})                       Number  height of window {nr}
***************
*** 6608,6614 ****
  
  localtime()                                           *localtime()*
                Return the current time, measured as seconds since 1st Jan
!               1970.  See also |strftime()| and |getftime()|.
  
  
  log({expr})                                           *log()*
--- 6616,6622 ----
  
  localtime()                                           *localtime()*
                Return the current time, measured as seconds since 1st Jan
!               1970.  See also |strftime()|, |strptime()| and |getftime()|.
  
  
  log({expr})                                           *log()*
***************
*** 7054,7059 ****
--- 7062,7068 ----
  
                Can also be used as a |method|: >
                        GetText()->matchstrpos('word')
+ <
                                                        *max()*
  max({expr})   Return the maximum value of all items in {expr}.
                {expr} can be a list or a dictionary.  For a dictionary,
***************
*** 9242,9248 ****
                {format} depends on your system, thus this is not portable!
                See the manual page of the C function strftime() for the
                format.  The maximum length of the result is 80 characters.
!               See also |localtime()| and |getftime()|.
                The language can be changed with the |:language| command.
                Examples: >
                  :echo strftime("%c")             Sun Apr 27 11:49:23 1997
--- 9269,9275 ----
                {format} depends on your system, thus this is not portable!
                See the manual page of the C function strftime() for the
                format.  The maximum length of the result is 80 characters.
!               See also |localtime()|, |getftime()| and |strptime()|.
                The language can be changed with the |:language| command.
                Examples: >
                  :echo strftime("%c")             Sun Apr 27 11:49:23 1997
***************
*** 9287,9292 ****
--- 9314,9320 ----
  
                Can also be used as a |method|: >
                        GetHaystack()->stridx(needle)
+ <
                                                        *string()*
  string({expr})        Return {expr} converted to a String.  If {expr} is a 
Number,
                Float, String, Blob or a composition of them, then the result
***************
*** 9342,9347 ****
--- 9370,9403 ----
                Can also be used as a |method|: >
                        GetText()->strpart(5)
  
+ strptime({format}, {timestring})                              *strptime()*
+               The result is a Number, which is a unix timestamp representing
+               the date and time in {timestring}, which is expected to match
+               the format specified in {format}.
+ 
+               The accepted {format} depends on your system, thus this is not
+               portable!  See the manual page of the C function strptime()
+               for the format.  Especially avoid "%c".  The value of $TZ also
+               matters.
+ 
+               If the {timestring} cannot be parsed with {format} zero is
+               returned.  If you do not know the format of {timestring} you
+               can try different {format} values until you get a non-zero
+               result.
+ 
+               See also |strftime()|.
+               Examples: >
+                 :echo strptime("%Y %b %d %X", "1997 Apr 27 11:49:23")
+ <               862156163 >
+                 :echo strftime("%c", strptime("%y%m%d %T", "970427 11:53:55"))
+ <               Sun Apr 27 11:53:55 1997 >
+                 :echo strftime("%c", strptime("%Y%m%d%H%M%S", 
"19970427115355") + 3600)
+ <               Sun Apr 27 12:53:55 1997
+ 
+               Not available on all systems.  To check use: >
+                       :if exists("*strptime")
+ 
+ 
  strridx({haystack}, {needle} [, {start}])                     *strridx()*
                The result is a Number, which gives the byte index in
                {haystack} of the last occurrence of the String {needle}.
*** ../vim-8.1.2325/runtime/doc/usr_41.txt      2019-07-13 21:18:51.468469559 
+0200
--- runtime/doc/usr_41.txt      2019-11-21 13:50:04.513247470 +0100
***************
*** 796,801 ****
--- 796,802 ----
        getftime()              get last modification time of a file
        localtime()             get current time in seconds
        strftime()              convert time to a string
+       strptime()              convert a date/time string to time
        reltime()               get the current or elapsed time accurately
        reltimestr()            convert reltime() result to a string
        reltimefloat()          convert reltime() result to a Float
*** ../vim-8.1.2325/src/auto/configure  2019-11-17 19:07:38.341132068 +0100
--- src/auto/configure  2019-11-21 14:07:02.679652312 +0100
***************
*** 12572,12579 ****
        memset mkdtemp nanosleep opendir putenv qsort readlink select setenv \
        getpgid setpgid setsid sigaltstack sigstack sigset sigsetjmp sigaction \
        sigprocmask sigvec strcasecmp strerror strftime stricmp strncasecmp \
!       strnicmp strpbrk strtol tgetent towlower towupper iswupper tzset \
!       usleep utime utimes mblen ftruncate unsetenv posix_openpt
  do :
    as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
  ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
--- 12572,12579 ----
        memset mkdtemp nanosleep opendir putenv qsort readlink select setenv \
        getpgid setpgid setsid sigaltstack sigstack sigset sigsetjmp sigaction \
        sigprocmask sigvec strcasecmp strerror strftime stricmp strncasecmp \
!       strnicmp strpbrk strptime strtol tgetent towlower towupper iswupper \
!       tzset usleep utime utimes mblen ftruncate unsetenv posix_openpt
  do :
    as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
  ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
*** ../vim-8.1.2325/src/config.h.in     2019-06-18 22:53:19.014129858 +0200
--- src/config.h.in     2019-11-21 13:45:23.988516112 +0100
***************
*** 206,211 ****
--- 206,212 ----
  #undef HAVE_STRNCASECMP
  #undef HAVE_STRNICMP
  #undef HAVE_STRPBRK
+ #undef HAVE_STRPTIME
  #undef HAVE_STRTOL
  #undef HAVE_CANBERRA
  #undef HAVE_ST_BLKSIZE
*** ../vim-8.1.2325/src/configure.ac    2019-11-17 19:07:38.337132077 +0100
--- src/configure.ac    2019-11-21 13:45:23.988516112 +0100
***************
*** 3744,3751 ****
        memset mkdtemp nanosleep opendir putenv qsort readlink select setenv \
        getpgid setpgid setsid sigaltstack sigstack sigset sigsetjmp sigaction \
        sigprocmask sigvec strcasecmp strerror strftime stricmp strncasecmp \
!       strnicmp strpbrk strtol tgetent towlower towupper iswupper tzset \
!       usleep utime utimes mblen ftruncate unsetenv posix_openpt)
  AC_FUNC_SELECT_ARGTYPES
  AC_FUNC_FSEEKO
  
--- 3744,3751 ----
        memset mkdtemp nanosleep opendir putenv qsort readlink select setenv \
        getpgid setpgid setsid sigaltstack sigstack sigset sigsetjmp sigaction \
        sigprocmask sigvec strcasecmp strerror strftime stricmp strncasecmp \
!       strnicmp strpbrk strptime strtol tgetent towlower towupper iswupper \
!       tzset usleep utime utimes mblen ftruncate unsetenv posix_openpt)
  AC_FUNC_SELECT_ARGTYPES
  AC_FUNC_FSEEKO
  
*** ../vim-8.1.2325/src/evalfunc.c      2019-11-16 18:21:57.990848019 +0100
--- src/evalfunc.c      2019-11-21 14:52:42.967501521 +0100
***************
*** 20,27 ****
  # include <float.h>
  #endif
  
! #ifdef MACOS_X
! # include <time.h>    // for time_t
  #endif
  
  #ifdef FEAT_FLOAT
--- 20,27 ----
  # include <float.h>
  #endif
  
! #if defined(MACOS_X)
! # include <time.h>    // for time_t
  #endif
  
  #ifdef FEAT_FLOAT
***************
*** 237,242 ****
--- 237,245 ----
  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,743 ****
--- 741,749 ----
      {"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,7417 ****
--- 7418,7457 ----
      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
   */
*** ../vim-8.1.2325/src/os_unix.h       2019-09-04 20:59:10.491409987 +0200
--- src/os_unix.h       2019-11-21 14:25:14.741654669 +0100
***************
*** 127,135 ****
  # endif
  #endif
  
  #if !defined(HAVE_SYS_TIME_H) || defined(TIME_WITH_SYS_TIME)
! # include <time.h>        /* on some systems time.h should not be
!                              included together with sys/time.h */
  #endif
  #ifdef HAVE_SYS_TIME_H
  # include <sys/time.h>
--- 127,142 ----
  # endif
  #endif
  
+ // on some systems time.h should not be included together with sys/time.h
  #if !defined(HAVE_SYS_TIME_H) || defined(TIME_WITH_SYS_TIME)
! // Needed for strptime()
! # ifndef _XOPEN_SOURCE
! #  define _XOPEN_SOURCE
! # endif
! # ifndef __USE_XOPEN
! #  define __USE_XOPEN
! # endif
! # include <time.h>
  #endif
  #ifdef HAVE_SYS_TIME_H
  # include <sys/time.h>
*** ../vim-8.1.2325/src/testdir/test_functions.vim      2019-11-16 
18:21:57.990848019 +0100
--- src/testdir/test_functions.vim      2019-11-21 14:55:38.525894449 +0100
***************
*** 181,189 ****
  endfunc
  
  func Test_strftime()
!   if !exists('*strftime')
!     return
!   endif
    " Format of strftime() depends on system. We assume
    " that basic formats tested here are available and
    " identical on all systems which support strftime().
--- 181,188 ----
  endfunc
  
  func Test_strftime()
!   CheckFunction strftime
! 
    " Format of strftime() depends on system. We assume
    " that basic formats tested here are available and
    " identical on all systems which support strftime().
***************
*** 222,228 ****
--- 221,248 ----
    else
      unlet $TZ
    endif
+ endfunc
+ 
+ func Test_strptime()
+   CheckFunction strptime
+ 
+   if exists('$TZ')
+     let tz = $TZ
+   endif
+   let $TZ = 'UTC'
  
+   call assert_equal(1484653763, strptime('%Y-%m-%d %X', '2017-01-17 
11:49:23'))
+ 
+   call assert_fails('call strptime()', 'E119:')
+   call assert_fails('call strptime("xxx")', 'E119:')
+   call assert_equal(0, strptime("%Y", ''))
+   call assert_equal(0, strptime("%Y", "xxx"))
+ 
+   if exists('tz')
+     let $TZ = tz
+   else
+     unlet $TZ
+   endif
  endfunc
  
  func Test_resolve_unix()
*** ../vim-8.1.2325/src/version.c       2019-11-21 13:27:02.104312710 +0100
--- src/version.c       2019-11-21 13:50:34.172938327 +0100
***************
*** 743,744 ****
--- 743,746 ----
  {   /* Add new patch number below this line */
+ /**/
+     2326,
  /**/

-- 
hundred-and-one symptoms of being an internet addict:
97. Your mother tells you to remember something, and you look for
    a File/Save command.

 /// Bram Moolenaar -- [email protected] -- http://www.Moolenaar.net   \\\
///        sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
\\\  an exciting new programming language -- http://www.Zimbu.org        ///
 \\\            help me help AIDS victims -- http://ICCF-Holland.org    ///

-- 
-- 
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

--- 
You received this message because you are subscribed to the Google Groups 
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/vim_dev/201911211437.xALEb09O017050%40masaka.moolenaar.net.

Raspunde prin e-mail lui