Patch 8.0.1745
Problem:    Build failure on MS-Windows.
Solution:   Build job arguments for MS-Windows. Fix allocating job twice.
Files:      src/structs.h, src/channel.c, src/os_unix.c, src/misc2.c,
            src/terminal.c, src/proto/misc2.pro


*** ../vim-8.0.1744/src/structs.h       2018-04-21 19:49:02.528104537 +0200
--- src/structs.h       2018-04-21 21:30:11.616228056 +0200
***************
*** 1488,1494 ****
      int               jv_copyID;
  
      channel_T *jv_channel;    /* channel for I/O, reference counted */
!     char_u    **argv;         /* command line used to start the job */
  };
  
  /*
--- 1488,1494 ----
      int               jv_copyID;
  
      channel_T *jv_channel;    /* channel for I/O, reference counted */
!     char_u    **jv_argv;      /* command line used to start the job */
  };
  
  /*
*** ../vim-8.0.1744/src/channel.c       2018-04-21 19:49:02.524104569 +0200
--- src/channel.c       2018-04-21 22:27:55.648820716 +0200
***************
*** 5021,5031 ****
      vim_free(job->jv_tty_out);
      vim_free(job->jv_stoponexit);
      free_callback(job->jv_exit_cb, job->jv_exit_partial);
!     if (job->argv != NULL)
      {
!       for (i = 0; job->argv[i] != NULL; i++)
!           vim_free(job->argv[i]);
!       vim_free(job->argv);
      }
  }
  
--- 5021,5031 ----
      vim_free(job->jv_tty_out);
      vim_free(job->jv_stoponexit);
      free_callback(job->jv_exit_cb, job->jv_exit_partial);
!     if (job->jv_argv != NULL)
      {
!       for (i = 0; job->jv_argv[i] != NULL; i++)
!           vim_free(job->jv_argv[i]);
!       vim_free(job->jv_argv);
      }
  }
  
***************
*** 5462,5477 ****
  {
      job_T     *job;
      char_u    *cmd = NULL;
- #if defined(UNIX)
- # define USE_ARGV
      char      **argv = NULL;
      int               argc = 0;
  #else
      garray_T  ga;
  #endif
      jobopt_T  opt;
      ch_part_T part;
-     int               len;
      int               i;
  
      job = job_alloc();
--- 5462,5476 ----
  {
      job_T     *job;
      char_u    *cmd = NULL;
      char      **argv = NULL;
      int               argc = 0;
+ #if defined(UNIX)
+ # define USE_ARGV
  #else
      garray_T  ga;
  #endif
      jobopt_T  opt;
      ch_part_T part;
      int               i;
  
      job = job_alloc();
***************
*** 5550,5556 ****
  #ifdef USE_ARGV
      if (argv_arg != NULL)
      {
!       argv = argv_arg;
      }
      else
  #endif
--- 5549,5563 ----
  #ifdef USE_ARGV
      if (argv_arg != NULL)
      {
!       /* Make a copy of argv_arg for job->jv_argv. */
!       for (i = 0; argv_arg[i] != NULL; i++)
!           argc++;
!       argv = (char **)alloc(sizeof(char_u *) * (argc + 1));
!       if (argv == NULL)
!           goto theend;
!       for (i = 0; i < argc; i++)
!           argv[i] = (char *)vim_strsave((char_u *)argv_arg[i]);
!       argv[argc] = NULL;
      }
      else
  #endif
***************
*** 5563,5574 ****
            EMSG(_(e_invarg));
            goto theend;
        }
- #ifdef USE_ARGV
        /* This will modify "cmd". */
        if (mch_parse_cmd(cmd, FALSE, &argv, &argc) == FAIL)
            goto theend;
        argv[argc] = NULL;
- #endif
      }
      else if (argvars[0].v_type != VAR_LIST
            || argvars[0].vval.v_list == NULL
--- 5570,5581 ----
            EMSG(_(e_invarg));
            goto theend;
        }
        /* This will modify "cmd". */
        if (mch_parse_cmd(cmd, FALSE, &argv, &argc) == FAIL)
            goto theend;
+       for (i = 0; i < argc; i++)
+           argv[i] = (char *)vim_strsave((char_u *)argv[i]);
        argv[argc] = NULL;
      }
      else if (argvars[0].v_type != VAR_LIST
            || argvars[0].vval.v_list == NULL
***************
*** 5580,5586 ****
      else
      {
        list_T      *l = argvars[0].vval.v_list;
- #ifdef USE_ARGV
        listitem_T  *li;
        char_u      *s;
  
--- 5587,5592 ----
***************
*** 5592,5618 ****
        {
            s = get_tv_string_chk(&li->li_tv);
            if (s == NULL)
                goto theend;
!           argv[argc++] = (char *)s;
        }
        argv[argc] = NULL;
! #else
        if (win32_build_cmd(l, &ga) == FAIL)
            goto theend;
        cmd = ga.ga_data;
  #endif
      }
  
!     /* Save the command used to start the job */
!     len = 0;
!     for (i = 0; argv[i] != NULL; i++)
!       len++;
!     job->argv = (char_u **)alloc(sizeof(char_u *) * (len + 1));
!     if (job->argv == NULL)
!       goto theend;
!     for (i = 0; argv[i] != NULL; i++)
!       job->argv[i] = vim_strsave((char_u *)argv[i]);
!     job->argv[i] = NULL;
  
  #ifdef USE_ARGV
      if (ch_log_active())
--- 5598,5621 ----
        {
            s = get_tv_string_chk(&li->li_tv);
            if (s == NULL)
+           {
+               for (i = 0; i < argc; ++i)
+                   vim_free(argv[i]);
                goto theend;
!           }
!           argv[argc++] = (char *)vim_strsave(s);
        }
        argv[argc] = NULL;
! 
! #ifndef USE_ARGV
        if (win32_build_cmd(l, &ga) == FAIL)
            goto theend;
        cmd = ga.ga_data;
  #endif
      }
  
!     /* Save the command used to start the job. */
!     job->jv_argv = (char_u **)argv;
  
  #ifdef USE_ARGV
      if (ch_log_active())
***************
*** 5640,5651 ****
        channel_write_in(job->jv_channel);
  
  theend:
! #ifdef USE_ARGV
!     if (argv != argv_arg)
!       vim_free(argv);
! #else
      vim_free(ga.ga_data);
  #endif
      free_job_options(&opt);
      return job;
  }
--- 5643,5653 ----
        channel_write_in(job->jv_channel);
  
  theend:
! #ifndef USE_ARGV
      vim_free(ga.ga_data);
  #endif
+     if ((char_u **)argv != job->jv_argv)
+       vim_free(argv);
      free_job_options(&opt);
      return job;
  }
***************
*** 5716,5723 ****
      if (l != NULL)
      {
        dict_add_list(dict, "cmd", l);
!       for (i = 0; job->argv[i] != NULL; i++)
!           list_append_string(l, job->argv[i], -1);
      }
  }
  
--- 5718,5726 ----
      if (l != NULL)
      {
        dict_add_list(dict, "cmd", l);
!       if (job->jv_argv != NULL)
!           for (i = 0; job->jv_argv[i] != NULL; i++)
!               list_append_string(l, job->jv_argv[i], -1);
      }
  }
  
*** ../vim-8.0.1744/src/os_unix.c       2018-04-05 22:59:23.274681873 +0200
--- src/os_unix.c       2018-04-21 21:43:12.624614976 +0200
***************
*** 4154,4244 ****
      return wait_pid;
  }
  
- #if defined(FEAT_JOB_CHANNEL) \
-       || !defined(USE_SYSTEM) \
-       || (defined(FEAT_GUI) && defined(FEAT_TERMINAL)) \
-       || defined(PROTO)
- /*
-  * Parse "cmd" and put the white-separated parts in "argv".
-  * "argv" is an allocated array with "argc" entries and room for 4 more.
-  * Returns FAIL when out of memory.
-  */
-     int
- mch_parse_cmd(char_u *cmd, int use_shcf, char ***argv, int *argc)
- {
-     int               i;
-     char_u    *p, *d;
-     int               inquote;
- 
-     /*
-      * Do this loop twice:
-      * 1: find number of arguments
-      * 2: separate them and build argv[]
-      */
-     for (i = 0; i < 2; ++i)
-     {
-       p = skipwhite(cmd);
-       inquote = FALSE;
-       *argc = 0;
-       for (;;)
-       {
-           if (i == 1)
-               (*argv)[*argc] = (char *)p;
-           ++*argc;
-           d = p;
-           while (*p != NUL && (inquote || (*p != ' ' && *p != TAB)))
-           {
-               if (p[0] == '"')
-                   /* quotes surrounding an argument and are dropped */
-                   inquote = !inquote;
-               else
-               {
-                   if (p[0] == '\\' && p[1] != NUL)
-                   {
-                       /* First pass: skip over "\ " and "\"".
-                        * Second pass: Remove the backslash. */
-                       ++p;
-                   }
-                   if (i == 1)
-                       *d++ = *p;
-               }
-               ++p;
-           }
-           if (*p == NUL)
-           {
-               if (i == 1)
-                   *d++ = NUL;
-               break;
-           }
-           if (i == 1)
-               *d++ = NUL;
-           p = skipwhite(p + 1);
-       }
-       if (*argv == NULL)
-       {
-           if (use_shcf)
-           {
-               /* Account for possible multiple args in p_shcf. */
-               p = p_shcf;
-               for (;;)
-               {
-                   p = skiptowhite(p);
-                   if (*p == NUL)
-                       break;
-                   ++*argc;
-                   p = skipwhite(p);
-               }
-           }
- 
-           *argv = (char **)alloc((unsigned)((*argc + 4) * sizeof(char *)));
-           if (*argv == NULL)      /* out of memory */
-               return FAIL;
-       }
-     }
-     return OK;
- }
- #endif
- 
  #if !defined(USE_SYSTEM) || defined(FEAT_JOB_CHANNEL)
  /*
   * Set the environment for a child process.
--- 4154,4159 ----
*** ../vim-8.0.1744/src/misc2.c 2018-04-04 22:57:24.109853647 +0200
--- src/misc2.c 2018-04-21 21:44:12.916305731 +0200
***************
*** 6429,6431 ****
--- 6429,6516 ----
  }
  # endif
  #endif
+ 
+ #if defined(FEAT_JOB_CHANNEL) \
+       || (defined(UNIX) && (!defined(USE_SYSTEM) \
+       || (defined(FEAT_GUI) && defined(FEAT_TERMINAL)))) \
+       || defined(PROTO)
+ /*
+  * Parse "cmd" and put the white-separated parts in "argv".
+  * "argv" is an allocated array with "argc" entries and room for 4 more.
+  * Returns FAIL when out of memory.
+  */
+     int
+ mch_parse_cmd(char_u *cmd, int use_shcf, char ***argv, int *argc)
+ {
+     int               i;
+     char_u    *p, *d;
+     int               inquote;
+ 
+     /*
+      * Do this loop twice:
+      * 1: find number of arguments
+      * 2: separate them and build argv[]
+      */
+     for (i = 0; i < 2; ++i)
+     {
+       p = skipwhite(cmd);
+       inquote = FALSE;
+       *argc = 0;
+       for (;;)
+       {
+           if (i == 1)
+               (*argv)[*argc] = (char *)p;
+           ++*argc;
+           d = p;
+           while (*p != NUL && (inquote || (*p != ' ' && *p != TAB)))
+           {
+               if (p[0] == '"')
+                   /* quotes surrounding an argument and are dropped */
+                   inquote = !inquote;
+               else
+               {
+                   if (p[0] == '\\' && p[1] != NUL)
+                   {
+                       /* First pass: skip over "\ " and "\"".
+                        * Second pass: Remove the backslash. */
+                       ++p;
+                   }
+                   if (i == 1)
+                       *d++ = *p;
+               }
+               ++p;
+           }
+           if (*p == NUL)
+           {
+               if (i == 1)
+                   *d++ = NUL;
+               break;
+           }
+           if (i == 1)
+               *d++ = NUL;
+           p = skipwhite(p + 1);
+       }
+       if (*argv == NULL)
+       {
+           if (use_shcf)
+           {
+               /* Account for possible multiple args in p_shcf. */
+               p = p_shcf;
+               for (;;)
+               {
+                   p = skiptowhite(p);
+                   if (*p == NUL)
+                       break;
+                   ++*argc;
+                   p = skipwhite(p);
+               }
+           }
+ 
+           *argv = (char **)alloc((unsigned)((*argc + 4) * sizeof(char *)));
+           if (*argv == NULL)      /* out of memory */
+               return FAIL;
+       }
+     }
+     return OK;
+ }
+ #endif
*** ../vim-8.0.1744/src/terminal.c      2018-04-21 20:02:32.738539943 +0200
--- src/terminal.c      2018-04-21 22:20:31.203479598 +0200
***************
*** 5312,5325 ****
      win32_build_env(opt->jo_env, &ga_env, TRUE);
      env_wchar = ga_env.ga_data;
  
-     job = job_alloc();
-     if (job == NULL)
-       goto failed;
- 
-     channel = add_channel();
-     if (channel == NULL)
-       goto failed;
- 
      term->tl_winpty_config = winpty_config_new(0, &winpty_err);
      if (term->tl_winpty_config == NULL)
        goto failed;
--- 5312,5317 ----
*** ../vim-8.0.1744/src/proto/misc2.pro 2018-02-10 18:45:21.080822072 +0100
--- src/proto/misc2.pro 2018-04-21 21:44:28.440225549 +0200
***************
*** 110,113 ****
--- 110,114 ----
  void time_to_bytes(time_T the_time, char_u *buf);
  int has_non_ascii(char_u *s);
  void parse_queued_messages(void);
+ int mch_parse_cmd(char_u *cmd, int use_shcf, char ***argv, int *argc);
  /* vim: set ft=c : */
*** ../vim-8.0.1744/src/version.c       2018-04-21 20:12:31.978855879 +0200
--- src/version.c       2018-04-21 22:29:04.804411871 +0200
***************
*** 763,764 ****
--- 763,766 ----
  {   /* Add new patch number below this line */
+ /**/
+     1745,
  /**/

-- 
"Marriage is when a man and woman become as one; the trouble starts
when they try to decide which one"

 /// 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].
For more options, visit https://groups.google.com/d/optout.

Raspunde prin e-mail lui