--- /dev/null
+To: vim-dev@vim.org
+Subject: Patch 7.2.041
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=ISO-8859-1
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 7.2.041
+Problem: In diff mode, when using two tabs, each with two diffed buffers,
+ editing a buffer of the other tab messes up the diff. (Matt
+ Mzyzik)
+Solution: Only copy options from a window where the buffer was edited that
+ doesn't have 'diff' set or is for the current tab page.
+ Also fix that window options for a buffer are stored with the
+ wrong window.
+Files: src/buffer.c, src/ex_cmds.c, src/ex_cmds2.c, src/ex_docmd.c,
+ src/ex_getln.c, src/if_sniff.c, src/main.c, src/netbeans.c,
+ src/normal.c, src/popupmnu.c, src/proto/buffer.pro,
+ src/proto/ex_cmds.pro src/quickfix.c, src/window.c
+
+
+*** ../vim-7.2.040/src/buffer.c Wed Nov 12 12:51:38 2008
+--- src/buffer.c Wed Nov 12 17:45:01 2008
+***************
+*** 33,39 ****
+ static char_u *fname_match __ARGS((regprog_T *prog, char_u *name));
+ #endif
+ static void buflist_setfpos __ARGS((buf_T *buf, win_T *win, linenr_T lnum, colnr_T col, int copy_options));
+! static wininfo_T *find_wininfo __ARGS((buf_T *buf));
+ #ifdef UNIX
+ static buf_T *buflist_findname_stat __ARGS((char_u *ffname, struct stat *st));
+ static int otherfile_buf __ARGS((buf_T *buf, char_u *ffname, struct stat *stp));
+--- 33,39 ----
+ static char_u *fname_match __ARGS((regprog_T *prog, char_u *name));
+ #endif
+ static void buflist_setfpos __ARGS((buf_T *buf, win_T *win, linenr_T lnum, colnr_T col, int copy_options));
+! static wininfo_T *find_wininfo __ARGS((buf_T *buf, int skip_diff_buffer));
+ #ifdef UNIX
+ static buf_T *buflist_findname_stat __ARGS((char_u *ffname, struct stat *st));
+ static int otherfile_buf __ARGS((buf_T *buf, char_u *ffname, struct stat *stp));
+***************
+*** 1093,1099 ****
+ #endif
+ setpcmark();
+ retval = do_ecmd(0, NULL, NULL, NULL, ECMD_ONE,
+! forceit ? ECMD_FORCEIT : 0);
+
+ /*
+ * do_ecmd() may create a new buffer, then we have to delete
+--- 1093,1099 ----
+ #endif
+ setpcmark();
+ retval = do_ecmd(0, NULL, NULL, NULL, ECMD_ONE,
+! forceit ? ECMD_FORCEIT : 0, curwin);
+
+ /*
+ * do_ecmd() may create a new buffer, then we have to delete
+***************
+*** 1316,1322 ****
+ setpcmark();
+ if (!cmdmod.keepalt)
+ curwin->w_alt_fnum = curbuf->b_fnum; /* remember alternate file */
+! buflist_altfpos(); /* remember curpos */
+
+ #ifdef FEAT_VISUAL
+ /* Don't restart Select mode after switching to another buffer. */
+--- 1316,1322 ----
+ setpcmark();
+ if (!cmdmod.keepalt)
+ curwin->w_alt_fnum = curbuf->b_fnum; /* remember alternate file */
+! buflist_altfpos(curwin); /* remember curpos */
+
+ #ifdef FEAT_VISUAL
+ /* Don't restart Select mode after switching to another buffer. */
+***************
+*** 2404,2425 ****
+ return;
+ }
+
+ /*
+ * Find info for the current window in buffer "buf".
+ * If not found, return the info for the most recently used window.
+ * Returns NULL when there isn't any info.
+ */
+ static wininfo_T *
+! find_wininfo(buf)
+ buf_T *buf;
+ {
+ wininfo_T *wip;
+
+ for (wip = buf->b_wininfo; wip != NULL; wip = wip->wi_next)
+! if (wip->wi_win == curwin)
+ break;
+! if (wip == NULL) /* if no fpos for curwin, use the first in the list */
+! wip = buf->b_wininfo;
+ return wip;
+ }
+
+--- 2404,2473 ----
+ return;
+ }
+
++ #ifdef FEAT_DIFF
++ static int wininfo_other_tab_diff __ARGS((wininfo_T *wip));
++
++ /*
++ * Return TRUE when "wip" has 'diff' set and the diff is only for another tab
++ * page. That's because a diff is local to a tab page.
++ */
++ static int
++ wininfo_other_tab_diff(wip)
++ wininfo_T *wip;
++ {
++ win_T *wp;
++
++ if (wip->wi_opt.wo_diff)
++ {
++ for (wp = firstwin; wp != NULL; wp = wp->w_next)
++ /* return FALSE when it's a window in the current tab page, thus
++ * the buffer was in diff mode here */
++ if (wip->wi_win == wp)
++ return FALSE;
++ return TRUE;
++ }
++ return FALSE;
++ }
++ #endif
++
+ /*
+ * Find info for the current window in buffer "buf".
+ * If not found, return the info for the most recently used window.
++ * When "skip_diff_buffer" is TRUE avoid windows with 'diff' set that is in
++ * another tab page.
+ * Returns NULL when there isn't any info.
+ */
++ /*ARGSUSED*/
+ static wininfo_T *
+! find_wininfo(buf, skip_diff_buffer)
+ buf_T *buf;
++ int skip_diff_buffer;
+ {
+ wininfo_T *wip;
+
+ for (wip = buf->b_wininfo; wip != NULL; wip = wip->wi_next)
+! if (wip->wi_win == curwin
+! #ifdef FEAT_DIFF
+! && (!skip_diff_buffer || !wininfo_other_tab_diff(wip))
+! #endif
+! )
+ break;
+!
+! /* If no wininfo for curwin, use the first in the list (that doesn't have
+! * 'diff' set and is in another tab page). */
+! if (wip == NULL)
+! {
+! #ifdef FEAT_DIFF
+! if (skip_diff_buffer)
+! {
+! for (wip = buf->b_wininfo; wip != NULL; wip = wip->wi_next)
+! if (!wininfo_other_tab_diff(wip))
+! break;
+! }
+! else
+! #endif
+! wip = buf->b_wininfo;
+! }
+ return wip;
+ }
+
+***************
+*** 2440,2446 ****
+ clearFolding(curwin);
+ #endif
+
+! wip = find_wininfo(buf);
+ if (wip != NULL && wip->wi_optset)
+ {
+ copy_winopt(&wip->wi_opt, &curwin->w_onebuf_opt);
+--- 2488,2494 ----
+ clearFolding(curwin);
+ #endif
+
+! wip = find_wininfo(buf, TRUE);
+ if (wip != NULL && wip->wi_optset)
+ {
+ copy_winopt(&wip->wi_opt, &curwin->w_onebuf_opt);
+***************
+*** 2472,2478 ****
+ wininfo_T *wip;
+ static pos_T no_position = {1, 0};
+
+! wip = find_wininfo(buf);
+ if (wip != NULL)
+ return &(wip->wi_fpos);
+ else
+--- 2520,2526 ----
+ wininfo_T *wip;
+ static pos_T no_position = {1, 0};
+
+! wip = find_wininfo(buf, FALSE);
+ if (wip != NULL)
+ return &(wip->wi_fpos);
+ else
+***************
+*** 2793,2806 ****
+ #endif
+
+ /*
+! * Set alternate cursor position for current window.
+ * Also save the local window option values.
+ */
+ void
+! buflist_altfpos()
+ {
+! buflist_setfpos(curbuf, curwin, curwin->w_cursor.lnum,
+! curwin->w_cursor.col, TRUE);
+ }
+
+ /*
+--- 2841,2854 ----
+ #endif
+
+ /*
+! * Set alternate cursor position for the current buffer and window "win".
+ * Also save the local window option values.
+ */
+ void
+! buflist_altfpos(win)
+! win_T *win;
+ {
+! buflist_setfpos(curbuf, win, win->w_cursor.lnum, win->w_cursor.col, TRUE);
+ }
+
+ /*
+***************
+*** 4492,4498 ****
+ ECMD_ONE,
+ ((P_HID(curwin->w_buffer)
+ || bufIsChanged(curwin->w_buffer)) ? ECMD_HIDE : 0)
+! + ECMD_OLDBUF);
+ #ifdef FEAT_AUTOCMD
+ if (use_firstwin)
+ ++autocmd_no_leave;
+--- 4540,4546 ----
+ ECMD_ONE,
+ ((P_HID(curwin->w_buffer)
+ || bufIsChanged(curwin->w_buffer)) ? ECMD_HIDE : 0)
+! + ECMD_OLDBUF, curwin);
+ #ifdef FEAT_AUTOCMD
+ if (use_firstwin)
+ ++autocmd_no_leave;
+*** ../vim-7.2.040/src/ex_cmds.c Sun Nov 9 13:43:25 2008
+--- src/ex_cmds.c Wed Nov 12 22:41:41 2008
+***************
+*** 3052,3058 ****
+ retval = 0; /* it's in the same file */
+ }
+ else if (do_ecmd(fnum, ffname, sfname, NULL, lnum,
+! (P_HID(curbuf) ? ECMD_HIDE : 0) + (forceit ? ECMD_FORCEIT : 0)) == OK)
+ retval = -1; /* opened another file */
+ else
+ retval = 1; /* error encountered */
+--- 3052,3059 ----
+ retval = 0; /* it's in the same file */
+ }
+ else if (do_ecmd(fnum, ffname, sfname, NULL, lnum,
+! (P_HID(curbuf) ? ECMD_HIDE : 0) + (forceit ? ECMD_FORCEIT : 0),
+! curwin) == OK)
+ retval = -1; /* opened another file */
+ else
+ retval = 1; /* error encountered */
+***************
+*** 3085,3101 ****
+ * ECMD_OLDBUF: use existing buffer if it exists
+ * ECMD_FORCEIT: ! used for Ex command
+ * ECMD_ADDBUF: don't edit, just add to buffer list
+ *
+ * return FAIL for failure, OK otherwise
+ */
+ int
+! do_ecmd(fnum, ffname, sfname, eap, newlnum, flags)
+ int fnum;
+ char_u *ffname;
+ char_u *sfname;
+ exarg_T *eap; /* can be NULL! */
+ linenr_T newlnum;
+ int flags;
+ {
+ int other_file; /* TRUE if editing another file */
+ int oldbuf; /* TRUE if using existing buffer */
+--- 3086,3106 ----
+ * ECMD_OLDBUF: use existing buffer if it exists
+ * ECMD_FORCEIT: ! used for Ex command
+ * ECMD_ADDBUF: don't edit, just add to buffer list
++ * oldwin: Should be "curwin" when editing a new buffer in the current
++ * window, NULL when splitting the window first. When not NULL info
++ * of the previous buffer for "oldwin" is stored.
+ *
+ * return FAIL for failure, OK otherwise
+ */
+ int
+! do_ecmd(fnum, ffname, sfname, eap, newlnum, flags, oldwin)
+ int fnum;
+ char_u *ffname;
+ char_u *sfname;
+ exarg_T *eap; /* can be NULL! */
+ linenr_T newlnum;
+ int flags;
++ win_T *oldwin;
+ {
+ int other_file; /* TRUE if editing another file */
+ int oldbuf; /* TRUE if using existing buffer */
+***************
+*** 3267,3273 ****
+ {
+ if (!cmdmod.keepalt)
+ curwin->w_alt_fnum = curbuf->b_fnum;
+! buflist_altfpos();
+ }
+
+ if (fnum)
+--- 3272,3279 ----
+ {
+ if (!cmdmod.keepalt)
+ curwin->w_alt_fnum = curbuf->b_fnum;
+! if (oldwin != NULL)
+! buflist_altfpos(oldwin);
+ }
+
+ if (fnum)
+***************
+*** 3371,3377 ****
+
+ /* close the link to the current buffer */
+ u_sync(FALSE);
+! close_buffer(curwin, curbuf,
+ (flags & ECMD_HIDE) ? 0 : DOBUF_UNLOAD);
+
+ #ifdef FEAT_AUTOCMD
+--- 3377,3383 ----
+
+ /* close the link to the current buffer */
+ u_sync(FALSE);
+! close_buffer(oldwin, curbuf,
+ (flags & ECMD_HIDE) ? 0 : DOBUF_UNLOAD);
+
+ #ifdef FEAT_AUTOCMD
+***************
+*** 5609,5615 ****
+ */
+ alt_fnum = curbuf->b_fnum;
+ (void)do_ecmd(0, NULL, NULL, NULL, ECMD_LASTL,
+! ECMD_HIDE + ECMD_SET_HELP);
+ if (!cmdmod.keepalt)
+ curwin->w_alt_fnum = alt_fnum;
+ empty_fnum = curbuf->b_fnum;
+--- 5615,5627 ----
+ */
+ alt_fnum = curbuf->b_fnum;
+ (void)do_ecmd(0, NULL, NULL, NULL, ECMD_LASTL,
+! ECMD_HIDE + ECMD_SET_HELP,
+! #ifdef FEAT_WINDOWS
+! NULL /* buffer is still open, don't store info */
+! #else
+! curwin
+! #endif
+! );
+ if (!cmdmod.keepalt)
+ curwin->w_alt_fnum = alt_fnum;
+ empty_fnum = curbuf->b_fnum;
+*** ../vim-7.2.040/src/ex_cmds2.c Sun Sep 7 15:49:45 2008
+--- src/ex_cmds2.c Wed Nov 12 17:46:41 2008
+***************
+*** 2132,2139 ****
+ * argument index. */
+ if (do_ecmd(0, alist_name(&ARGLIST[curwin->w_arg_idx]), NULL,
+ eap, ECMD_LAST,
+! (P_HID(curwin->w_buffer) ? ECMD_HIDE : 0) +
+! (eap->forceit ? ECMD_FORCEIT : 0)) == FAIL)
+ curwin->w_arg_idx = old_arg_idx;
+ /* like Vi: set the mark where the cursor is in the file. */
+ else if (eap->cmdidx != CMD_argdo)
+--- 2132,2139 ----
+ * argument index. */
+ if (do_ecmd(0, alist_name(&ARGLIST[curwin->w_arg_idx]), NULL,
+ eap, ECMD_LAST,
+! (P_HID(curwin->w_buffer) ? ECMD_HIDE : 0)
+! + (eap->forceit ? ECMD_FORCEIT : 0), curwin) == FAIL)
+ curwin->w_arg_idx = old_arg_idx;
+ /* like Vi: set the mark where the cursor is in the file. */
+ else if (eap->cmdidx != CMD_argdo)
+*** ../vim-7.2.040/src/ex_docmd.c Sun Nov 9 13:43:25 2008
+--- src/ex_docmd.c Wed Nov 12 18:04:22 2008
+***************
+*** 7488,7494 ****
+ /* ":new" or ":tabnew" without argument: edit an new empty buffer */
+ setpcmark();
+ (void)do_ecmd(0, NULL, NULL, eap, ECMD_ONE,
+! ECMD_HIDE + (eap->forceit ? ECMD_FORCEIT : 0));
+ }
+ else if ((eap->cmdidx != CMD_split
+ #ifdef FEAT_VERTSPLIT
+--- 7488,7495 ----
+ /* ":new" or ":tabnew" without argument: edit an new empty buffer */
+ setpcmark();
+ (void)do_ecmd(0, NULL, NULL, eap, ECMD_ONE,
+! ECMD_HIDE + (eap->forceit ? ECMD_FORCEIT : 0),
+! old_curwin == NULL ? curwin : NULL);
+ }
+ else if ((eap->cmdidx != CMD_split
+ #ifdef FEAT_VERTSPLIT
+***************
+*** 7525,7531 ****
+ #ifdef FEAT_LISTCMDS
+ + (eap->cmdidx == CMD_badd ? ECMD_ADDBUF : 0 )
+ #endif
+! ) == FAIL)
+ {
+ /* Editing the file failed. If the window was split, close it. */
+ #ifdef FEAT_WINDOWS
+--- 7526,7532 ----
+ #ifdef FEAT_LISTCMDS
+ + (eap->cmdidx == CMD_badd ? ECMD_ADDBUF : 0 )
+ #endif
+! , old_curwin == NULL ? curwin : NULL) == FAIL)
+ {
+ /* Editing the file failed. If the window was split, close it. */
+ #ifdef FEAT_WINDOWS
+*** ../vim-7.2.040/src/ex_getln.c Sun Sep 14 14:41:44 2008
+--- src/ex_getln.c Wed Nov 12 18:06:25 2008
+***************
+*** 6051,6057 ****
+ cmdwin_type = '-';
+
+ /* Create the command-line buffer empty. */
+! (void)do_ecmd(0, NULL, NULL, NULL, ECMD_ONE, ECMD_HIDE);
+ (void)setfname(curbuf, (char_u *)"[Command Line]", NULL, TRUE);
+ set_option_value((char_u *)"bt", 0L, (char_u *)"nofile", OPT_LOCAL);
+ set_option_value((char_u *)"swf", 0L, NULL, OPT_LOCAL);
+--- 6051,6057 ----
+ cmdwin_type = '-';
+
+ /* Create the command-line buffer empty. */
+! (void)do_ecmd(0, NULL, NULL, NULL, ECMD_ONE, ECMD_HIDE, NULL);
+ (void)setfname(curbuf, (char_u *)"[Command Line]", NULL, TRUE);
+ set_option_value((char_u *)"bt", 0L, (char_u *)"nofile", OPT_LOCAL);
+ set_option_value((char_u *)"swf", 0L, NULL, OPT_LOCAL);
+*** ../vim-7.2.040/src/if_sniff.c Sat Aug 9 19:41:16 2008
+--- src/if_sniff.c Wed Nov 12 17:48:46 2008
+***************
+*** 1114,1120 ****
+ char *fname;
+ {
+ ++no_wait_return;
+! do_ecmd(0, (char_u *)fname, NULL, NULL, ECMD_ONE, ECMD_HIDE+ECMD_OLDBUF);
+ curbuf->b_sniff = TRUE;
+ --no_wait_return; /* [ex_docmd.c] */
+ }
+--- 1114,1121 ----
+ char *fname;
+ {
+ ++no_wait_return;
+! do_ecmd(0, (char_u *)fname, NULL, NULL, ECMD_ONE, ECMD_HIDE+ECMD_OLDBUF,
+! curwin);
+ curbuf->b_sniff = TRUE;
+ --no_wait_return; /* [ex_docmd.c] */
+ }
+*** ../vim-7.2.040/src/main.c Sun Nov 9 13:43:25 2008
+--- src/main.c Wed Nov 12 17:49:06 2008
+***************
+*** 2588,2594 ****
+ # endif
+ (void)do_ecmd(0, arg_idx < GARGCOUNT
+ ? alist_name(&GARGLIST[arg_idx]) : NULL,
+! NULL, NULL, ECMD_LASTL, ECMD_HIDE);
+ # ifdef HAS_SWAP_EXISTS_ACTION
+ if (swap_exists_did_quit)
+ {
+--- 2588,2594 ----
+ # endif
+ (void)do_ecmd(0, arg_idx < GARGCOUNT
+ ? alist_name(&GARGLIST[arg_idx]) : NULL,
+! NULL, NULL, ECMD_LASTL, ECMD_HIDE, curwin);
+ # ifdef HAS_SWAP_EXISTS_ACTION
+ if (swap_exists_did_quit)
+ {
+*** ../vim-7.2.040/src/netbeans.c Sun Jul 13 19:18:03 2008
+--- src/netbeans.c Wed Nov 12 17:49:40 2008
+***************
+*** 1795,1801 ****
+ buf->displayname = NULL;
+
+ netbeansReadFile = 0; /* don't try to open disk file */
+! do_ecmd(0, NULL, 0, 0, ECMD_ONE, ECMD_HIDE + ECMD_OLDBUF);
+ netbeansReadFile = 1;
+ buf->bufp = curbuf;
+ maketitle();
+--- 1795,1801 ----
+ buf->displayname = NULL;
+
+ netbeansReadFile = 0; /* don't try to open disk file */
+! do_ecmd(0, NULL, 0, 0, ECMD_ONE, ECMD_HIDE + ECMD_OLDBUF, curwin);
+ netbeansReadFile = 1;
+ buf->bufp = curbuf;
+ maketitle();
+***************
+*** 1960,1966 ****
+
+ netbeansReadFile = 0; /* don't try to open disk file */
+ do_ecmd(0, (char_u *)buf->displayname, 0, 0, ECMD_ONE,
+! ECMD_HIDE + ECMD_OLDBUF);
+ netbeansReadFile = 1;
+ buf->bufp = curbuf;
+ maketitle();
+--- 1960,1966 ----
+
+ netbeansReadFile = 0; /* don't try to open disk file */
+ do_ecmd(0, (char_u *)buf->displayname, 0, 0, ECMD_ONE,
+! ECMD_HIDE + ECMD_OLDBUF, curwin);
+ netbeansReadFile = 1;
+ buf->bufp = curbuf;
+ maketitle();
+***************
+*** 1979,1985 ****
+ vim_free(buf->displayname);
+ buf->displayname = nb_unquote(args, NULL);
+ do_ecmd(0, (char_u *)buf->displayname, NULL, NULL, ECMD_ONE,
+! ECMD_HIDE + ECMD_OLDBUF);
+ buf->bufp = curbuf;
+ buf->initDone = TRUE;
+ doupdate = 1;
+--- 1979,1985 ----
+ vim_free(buf->displayname);
+ buf->displayname = nb_unquote(args, NULL);
+ do_ecmd(0, (char_u *)buf->displayname, NULL, NULL, ECMD_ONE,
+! ECMD_HIDE + ECMD_OLDBUF, curwin);
+ buf->bufp = curbuf;
+ buf->initDone = TRUE;
+ doupdate = 1;
+*** ../vim-7.2.040/src/normal.c Sat Nov 1 13:51:57 2008
+--- src/normal.c Wed Nov 12 17:49:50 2008
+***************
+*** 6050,6056 ****
+ autowrite(curbuf, FALSE);
+ setpcmark();
+ (void)do_ecmd(0, ptr, NULL, NULL, ECMD_LAST,
+! P_HID(curbuf) ? ECMD_HIDE : 0);
+ if (cap->nchar == 'F' && lnum >= 0)
+ {
+ curwin->w_cursor.lnum = lnum;
+--- 6050,6056 ----
+ autowrite(curbuf, FALSE);
+ setpcmark();
+ (void)do_ecmd(0, ptr, NULL, NULL, ECMD_LAST,
+! P_HID(curbuf) ? ECMD_HIDE : 0, curwin);
+ if (cap->nchar == 'F' && lnum >= 0)
+ {
+ curwin->w_cursor.lnum = lnum;
+*** ../vim-7.2.040/src/popupmnu.c Sun Jul 13 19:33:51 2008
+--- src/popupmnu.c Wed Nov 12 18:08:07 2008
+***************
+*** 573,579 ****
+ {
+ /* Don't want to sync undo in the current buffer. */
+ ++no_u_sync;
+! res = do_ecmd(0, NULL, NULL, NULL, ECMD_ONE, 0);
+ --no_u_sync;
+ if (res == OK)
+ {
+--- 573,579 ----
+ {
+ /* Don't want to sync undo in the current buffer. */
+ ++no_u_sync;
+! res = do_ecmd(0, NULL, NULL, NULL, ECMD_ONE, 0, NULL);
+ --no_u_sync;
+ if (res == OK)
+ {
+*** ../vim-7.2.040/src/proto/buffer.pro Sun May 6 13:57:53 2007
+--- src/proto/buffer.pro Wed Nov 12 17:43:39 2008
+***************
+*** 33,39 ****
+ char_u *getaltfname __ARGS((int errmsg));
+ int buflist_add __ARGS((char_u *fname, int flags));
+ void buflist_slash_adjust __ARGS((void));
+! void buflist_altfpos __ARGS((void));
+ int otherfile __ARGS((char_u *ffname));
+ void buf_setino __ARGS((buf_T *buf));
+ void fileinfo __ARGS((int fullname, int shorthelp, int dont_truncate));
+--- 33,39 ----
+ char_u *getaltfname __ARGS((int errmsg));
+ int buflist_add __ARGS((char_u *fname, int flags));
+ void buflist_slash_adjust __ARGS((void));
+! void buflist_altfpos __ARGS((win_T *win));
+ int otherfile __ARGS((char_u *ffname));
+ void buf_setino __ARGS((buf_T *buf));
+ void fileinfo __ARGS((int fullname, int shorthelp, int dont_truncate));
+*** ../vim-7.2.040/src/proto/ex_cmds.pro Sun Nov 9 13:43:25 2008
+--- src/proto/ex_cmds.pro Wed Nov 12 17:44:27 2008
+***************
+*** 27,33 ****
+ void do_wqall __ARGS((exarg_T *eap));
+ int not_writing __ARGS((void));
+ int getfile __ARGS((int fnum, char_u *ffname, char_u *sfname, int setpm, linenr_T lnum, int forceit));
+! int do_ecmd __ARGS((int fnum, char_u *ffname, char_u *sfname, exarg_T *eap, linenr_T newlnum, int flags));
+ void ex_append __ARGS((exarg_T *eap));
+ void ex_change __ARGS((exarg_T *eap));
+ void ex_z __ARGS((exarg_T *eap));
+--- 27,33 ----
+ void do_wqall __ARGS((exarg_T *eap));
+ int not_writing __ARGS((void));
+ int getfile __ARGS((int fnum, char_u *ffname, char_u *sfname, int setpm, linenr_T lnum, int forceit));
+! int do_ecmd __ARGS((int fnum, char_u *ffname, char_u *sfname, exarg_T *eap, linenr_T newlnum, int flags, win_T *oldwin));
+ void ex_append __ARGS((exarg_T *eap));
+ void ex_change __ARGS((exarg_T *eap));
+ void ex_z __ARGS((exarg_T *eap));
+*** ../vim-7.2.040/src/quickfix.c Thu Jul 24 18:44:59 2008
+--- src/quickfix.c Wed Nov 12 18:12:00 2008
+***************
+*** 1420,1425 ****
+--- 1420,1426 ----
+ win_T *win;
+ win_T *altwin;
+ #endif
++ win_T *oldwin = curwin;
+ int print_message = TRUE;
+ int len;
+ #ifdef FEAT_FOLDING
+***************
+*** 1744,1750 ****
+ }
+ else
+ ok = do_ecmd(qf_ptr->qf_fnum, NULL, NULL, NULL, (linenr_T)1,
+! ECMD_HIDE + ECMD_SET_HELP);
+ }
+ else
+ ok = buflist_getfile(qf_ptr->qf_fnum,
+--- 1745,1752 ----
+ }
+ else
+ ok = do_ecmd(qf_ptr->qf_fnum, NULL, NULL, NULL, (linenr_T)1,
+! ECMD_HIDE + ECMD_SET_HELP,
+! oldwin == curwin ? curwin : NULL);
+ }
+ else
+ ok = buflist_getfile(qf_ptr->qf_fnum,
+***************
+*** 2267,2272 ****
+--- 2269,2275 ----
+ win_T *win;
+ tabpage_T *prevtab = curtab;
+ buf_T *qf_buf;
++ win_T *oldwin = curwin;
+
+ if (eap->cmdidx == CMD_lopen || eap->cmdidx == CMD_lwindow)
+ {
+***************
+*** 2326,2339 ****
+ win->w_llist->qf_refcount++;
+ }
+
+ if (qf_buf != NULL)
+ /* Use the existing quickfix buffer */
+ (void)do_ecmd(qf_buf->b_fnum, NULL, NULL, NULL, ECMD_ONE,
+! ECMD_HIDE + ECMD_OLDBUF);
+ else
+ {
+ /* Create a new quickfix buffer */
+! (void)do_ecmd(0, NULL, NULL, NULL, ECMD_ONE, ECMD_HIDE);
+ /* switch off 'swapfile' */
+ set_option_value((char_u *)"swf", 0L, NULL, OPT_LOCAL);
+ set_option_value((char_u *)"bt", 0L, (char_u *)"quickfix",
+--- 2329,2344 ----
+ win->w_llist->qf_refcount++;
+ }
+
++ if (oldwin != curwin)
++ oldwin = NULL; /* don't store info when in another window */
+ if (qf_buf != NULL)
+ /* Use the existing quickfix buffer */
+ (void)do_ecmd(qf_buf->b_fnum, NULL, NULL, NULL, ECMD_ONE,
+! ECMD_HIDE + ECMD_OLDBUF, oldwin);
+ else
+ {
+ /* Create a new quickfix buffer */
+! (void)do_ecmd(0, NULL, NULL, NULL, ECMD_ONE, ECMD_HIDE, oldwin);
+ /* switch off 'swapfile' */
+ set_option_value((char_u *)"swf", 0L, NULL, OPT_LOCAL);
+ set_option_value((char_u *)"bt", 0L, (char_u *)"quickfix",
+*** ../vim-7.2.040/src/window.c Wed Aug 6 18:32:11 2008
+--- src/window.c Wed Nov 12 18:12:37 2008
+***************
+*** 531,537 ****
+ # ifdef FEAT_SCROLLBIND
+ curwin->w_p_scb = FALSE;
+ # endif
+! (void)do_ecmd(0, ptr, NULL, NULL, ECMD_LASTL, ECMD_HIDE);
+ if (nchar == 'F' && lnum >= 0)
+ {
+ curwin->w_cursor.lnum = lnum;
+--- 531,538 ----
+ # ifdef FEAT_SCROLLBIND
+ curwin->w_p_scb = FALSE;
+ # endif
+! (void)do_ecmd(0, ptr, NULL, NULL, ECMD_LASTL,
+! ECMD_HIDE, NULL);
+ if (nchar == 'F' && lnum >= 0)
+ {
+ curwin->w_cursor.lnum = lnum;
+*** ../vim-7.2.040/src/version.c Wed Nov 12 16:04:43 2008
+--- src/version.c Wed Nov 12 16:54:35 2008
+***************
+*** 678,679 ****
+--- 678,681 ----
+ { /* Add new patch number below this line */
++ /**/
++ 41,
+ /**/
+
+--
+hundred-and-one symptoms of being an internet addict:
+260. Co-workers have to E-mail you about the fire alarm to get
+ you out of the building.
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ download, build and distribute -- http://www.A-A-P.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
--- /dev/null
+To: vim-dev@vim.org
+Subject: Patch 7.2.042
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=ISO-8859-1
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 7.2.042
+Problem: When using winrestview() in a BufWinEnter autocommand the window
+ is scrolled anyway. (Matt Zyzik)
+Solution: Don't recompute topline when above 'scrolloff' from the bottom.
+ Don't always put the cursor halfway when entering a buffer. Add
+ "w_topline_was_set".
+Files: src/buffer.c, src/move.c, src/structs.h
+
+
+*** ../vim-7.2.041/src/buffer.c Sat Nov 15 14:10:23 2008
+--- src/buffer.c Sat Nov 15 14:58:52 2008
+***************
+*** 1401,1406 ****
+--- 1401,1409 ----
+ curwin->w_cursor.coladd = 0;
+ #endif
+ curwin->w_set_curswant = TRUE;
++ #ifdef FEAT_AUTOCMD
++ curwin->w_topline_was_set = FALSE;
++ #endif
+
+ /* Make sure the buffer is loaded. */
+ if (curbuf->b_ml.ml_mfp == NULL) /* need to load the file */
+***************
+*** 1440,1446 ****
+ maketitle();
+ #endif
+ #ifdef FEAT_AUTOCMD
+! if (curwin->w_topline == 1) /* when autocmds didn't change it */
+ #endif
+ scroll_cursor_halfway(FALSE); /* redisplay at correct position */
+
+--- 1443,1450 ----
+ maketitle();
+ #endif
+ #ifdef FEAT_AUTOCMD
+! /* when autocmds didn't change it */
+! if (curwin->w_topline == 1 && !curwin->w_topline_was_set)
+ #endif
+ scroll_cursor_halfway(FALSE); /* redisplay at correct position */
+
+*** ../vim-7.2.041/src/move.c Sun Jul 13 19:25:23 2008
+--- src/move.c Sat Nov 15 14:56:47 2008
+***************
+*** 280,297 ****
+
+ if (curwin->w_botline <= curbuf->b_ml.ml_line_count)
+ {
+! if (curwin->w_cursor.lnum < curwin->w_botline
+! && ((long)curwin->w_cursor.lnum
+ >= (long)curwin->w_botline - p_so
+ #ifdef FEAT_FOLDING
+ || hasAnyFolding(curwin)
+ #endif
+ ))
+! {
+ lineoff_T loff;
+
+! /* Cursor is above botline, check if there are 'scrolloff'
+! * window lines below the cursor. If not, need to scroll. */
+ n = curwin->w_empty_rows;
+ loff.lnum = curwin->w_cursor.lnum;
+ #ifdef FEAT_FOLDING
+--- 280,299 ----
+
+ if (curwin->w_botline <= curbuf->b_ml.ml_line_count)
+ {
+! if (curwin->w_cursor.lnum < curwin->w_botline)
+! {
+! if (((long)curwin->w_cursor.lnum
+ >= (long)curwin->w_botline - p_so
+ #ifdef FEAT_FOLDING
+ || hasAnyFolding(curwin)
+ #endif
+ ))
+! {
+ lineoff_T loff;
+
+! /* Cursor is (a few lines) above botline, check if there are
+! * 'scrolloff' window lines below the cursor. If not, need to
+! * scroll. */
+ n = curwin->w_empty_rows;
+ loff.lnum = curwin->w_cursor.lnum;
+ #ifdef FEAT_FOLDING
+***************
+*** 317,322 ****
+--- 319,328 ----
+ if (n >= p_so)
+ /* sufficient context, no need to scroll */
+ check_botline = FALSE;
++ }
++ else
++ /* sufficient context, no need to scroll */
++ check_botline = FALSE;
+ }
+ if (check_botline)
+ {
+***************
+*** 509,514 ****
+--- 515,523 ----
+ /* Approximate the value of w_botline */
+ wp->w_botline += lnum - wp->w_topline;
+ wp->w_topline = lnum;
++ #ifdef FEAT_AUTOCMD
++ wp->w_topline_was_set = TRUE;
++ #endif
+ #ifdef FEAT_DIFF
+ wp->w_topfill = 0;
+ #endif
+*** ../vim-7.2.041/src/structs.h Sun Nov 9 13:43:25 2008
+--- src/structs.h Sat Nov 15 14:56:42 2008
+***************
+*** 1784,1793 ****
+ #endif
+
+ /*
+! * The next three specify the offsets for displaying the buffer:
+ */
+ linenr_T w_topline; /* buffer line number of the line at the
+ top of the window */
+ #ifdef FEAT_DIFF
+ int w_topfill; /* number of filler lines above w_topline */
+ int w_old_topfill; /* w_topfill at last redraw */
+--- 1784,1798 ----
+ #endif
+
+ /*
+! * "w_topline", "w_leftcol" and "w_skipcol" specify the offsets for
+! * displaying the buffer.
+ */
+ linenr_T w_topline; /* buffer line number of the line at the
+ top of the window */
++ #ifdef FEAT_AUTOCMD
++ char w_topline_was_set; /* flag set to TRUE when topline is set,
++ e.g. by winrestview() */
++ #endif
+ #ifdef FEAT_DIFF
+ int w_topfill; /* number of filler lines above w_topline */
+ int w_old_topfill; /* w_topfill at last redraw */
+*** ../vim-7.2.041/src/version.c Sat Nov 15 14:10:23 2008
+--- src/version.c Sat Nov 15 16:01:29 2008
+***************
+*** 678,679 ****
+--- 678,681 ----
+ { /* Add new patch number below this line */
++ /**/
++ 42,
+ /**/
+
+--
+hundred-and-one symptoms of being an internet addict:
+261. You find diskettes in your pockets when doing laundry.
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ download, build and distribute -- http://www.A-A-P.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
--- /dev/null
+To: vim-dev@vim.org
+Subject: Patch 7.2.043
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=ISO-8859-1
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 7.2.043
+Problem: VMS: Too many characters are escaped in filename and shell
+ commands.
+Solution: Escape fewer characters. (Zoltan Arpadffy)
+Files: src/vim.h
+
+
+*** ../vim-7.2.042/src/vim.h Sun Nov 9 13:43:25 2008
+--- src/vim.h Fri Nov 14 21:41:17 2008
+***************
+*** 341,348 ****
+ #ifdef BACKSLASH_IN_FILENAME
+ # define PATH_ESC_CHARS ((char_u *)" \t\n*?[{`%#'\"|!<")
+ #else
+! # define PATH_ESC_CHARS ((char_u *)" \t\n*?[{`$\\%#'\"|!<")
+! # define SHELL_ESC_CHARS ((char_u *)" \t\n*?[{`$\\%#'\"|!<>();&")
+ #endif
+
+ #define NUMBUFLEN 30 /* length of a buffer to store a number in ASCII */
+--- 341,354 ----
+ #ifdef BACKSLASH_IN_FILENAME
+ # define PATH_ESC_CHARS ((char_u *)" \t\n*?[{`%#'\"|!<")
+ #else
+! # ifdef VMS
+! /* VMS allows a lot of characters in the file name */
+! # define PATH_ESC_CHARS ((char_u *)" \t\n*?{`\\%#'\"|!")
+! # define SHELL_ESC_CHARS ((char_u *)" \t\n*?{`\\%#'|!()&")
+! # else
+! # define PATH_ESC_CHARS ((char_u *)" \t\n*?[{`$\\%#'\"|!<")
+! # define SHELL_ESC_CHARS ((char_u *)" \t\n*?[{`$\\%#'\"|!<>();&")
+! # endif
+ #endif
+
+ #define NUMBUFLEN 30 /* length of a buffer to store a number in ASCII */
+***************
+*** 370,376 ****
+ * Define __w64 as an empty token for everything but MSVC 7.x or later.
+ */
+ # if !defined(_MSC_VER) || (_MSC_VER < 1300)
+! # define __w64
+ # endif
+ typedef unsigned long __w64 long_u;
+ typedef long __w64 long_i;
+--- 376,382 ----
+ * Define __w64 as an empty token for everything but MSVC 7.x or later.
+ */
+ # if !defined(_MSC_VER) || (_MSC_VER < 1300)
+! # define __w64
+ # endif
+ typedef unsigned long __w64 long_u;
+ typedef long __w64 long_i;
+*** ../vim-7.2.042/src/version.c Sat Nov 15 16:05:30 2008
+--- src/version.c Thu Nov 20 10:23:51 2008
+***************
+*** 678,679 ****
+--- 678,681 ----
+ { /* Add new patch number below this line */
++ /**/
++ 43,
+ /**/
+
+--
+In his lifetime van Gogh painted 486 oil paintings. Oddly enough, 8975
+of them are to be found in the United States.
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ download, build and distribute -- http://www.A-A-P.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
--- /dev/null
+To: vim-dev@vim.org
+Subject: Patch 7.2.044
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=ISO-8859-1
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 7.2.044
+Problem: Crash because of STRCPY() being over protective of the destination
+ size. (Dominique Pelle)
+Solution: Add -D_FORTIFY_SOURCE=1 to CFLAGS. Use an intermediate variable
+ for the pointer to avoid a warning.
+Files: src/auto/configure, src/configure.in, src/eval.c
+
+
+*** ../vim-7.2.043/src/auto/configure Thu Jul 24 17:20:50 2008
+--- src/auto/configure Sun Nov 16 17:08:44 2008
+***************
+*** 16819,16839 ****
+ LDFLAGS="$LDFLAGS -isysroot /Developer/SDKs/MacOSX10.4u.sdk -arch i386 -arch ppc"
+ fi
+
+- { $as_echo "$as_me:$LINENO: checking for GCC 3 or later" >&5
+- $as_echo_n "checking for GCC 3 or later... " >&6; }
+ DEPEND_CFLAGS_FILTER=
+ if test "$GCC" = yes; then
+ gccmajor=`echo "$gccversion" | sed -e 's/^\([1-9]\)\..*$/\1/g'`
+ if test "$gccmajor" -gt "2"; then
+ DEPEND_CFLAGS_FILTER="| sed 's+-I */+-isystem /+g'"
+! fi
+! fi
+! if test "$DEPEND_CFLAGS_FILTER" = ""; then
+! { $as_echo "$as_me:$LINENO: result: no" >&5
+ $as_echo "no" >&6; }
+! else
+! { $as_echo "$as_me:$LINENO: result: yes" >&5
+ $as_echo "yes" >&6; }
+ fi
+
+
+--- 16819,16847 ----
+ LDFLAGS="$LDFLAGS -isysroot /Developer/SDKs/MacOSX10.4u.sdk -arch i386 -arch ppc"
+ fi
+
+ DEPEND_CFLAGS_FILTER=
+ if test "$GCC" = yes; then
++ { $as_echo "$as_me:$LINENO: checking for GCC 3 or later" >&5
++ $as_echo_n "checking for GCC 3 or later... " >&6; }
+ gccmajor=`echo "$gccversion" | sed -e 's/^\([1-9]\)\..*$/\1/g'`
+ if test "$gccmajor" -gt "2"; then
+ DEPEND_CFLAGS_FILTER="| sed 's+-I */+-isystem /+g'"
+! { $as_echo "$as_me:$LINENO: result: yes" >&5
+! $as_echo "yes" >&6; }
+! else
+! { $as_echo "$as_me:$LINENO: result: no" >&5
+ $as_echo "no" >&6; }
+! fi
+! { $as_echo "$as_me:$LINENO: checking whether we need -D_FORTIFY_SOURCE=1" >&5
+! $as_echo_n "checking whether we need -D_FORTIFY_SOURCE=1... " >&6; }
+! if test "$gccmajor" -gt "3"; then
+! CFLAGS="$CFLAGS -D_FORTIFY_SOURCE=1"
+! { $as_echo "$as_me:$LINENO: result: yes" >&5
+ $as_echo "yes" >&6; }
++ else
++ { $as_echo "$as_me:$LINENO: result: no" >&5
++ $as_echo "no" >&6; }
++ fi
+ fi
+
+
+*** ../vim-7.2.043/src/configure.in Thu Jul 24 17:20:31 2008
+--- src/configure.in Sun Nov 16 17:08:40 2008
+***************
+*** 3152,3169 ****
+ dnl But only when making dependencies, cproto and lint don't take "-isystem".
+ dnl Mac gcc returns "powerpc-apple-darwin8-gcc-4.0.1 (GCC)...", need to allow
+ dnl the number before the version number.
+- AC_MSG_CHECKING(for GCC 3 or later)
+ DEPEND_CFLAGS_FILTER=
+ if test "$GCC" = yes; then
+ gccmajor=`echo "$gccversion" | sed -e 's/^\([[1-9]]\)\..*$/\1/g'`
+ if test "$gccmajor" -gt "2"; then
+ DEPEND_CFLAGS_FILTER="| sed 's+-I */+-isystem /+g'"
+ fi
+- fi
+- if test "$DEPEND_CFLAGS_FILTER" = ""; then
+- AC_MSG_RESULT(no)
+- else
+- AC_MSG_RESULT(yes)
+ fi
+ AC_SUBST(DEPEND_CFLAGS_FILTER)
+
+--- 3152,3176 ----
+ dnl But only when making dependencies, cproto and lint don't take "-isystem".
+ dnl Mac gcc returns "powerpc-apple-darwin8-gcc-4.0.1 (GCC)...", need to allow
+ dnl the number before the version number.
+ DEPEND_CFLAGS_FILTER=
+ if test "$GCC" = yes; then
++ AC_MSG_CHECKING(for GCC 3 or later)
+ gccmajor=`echo "$gccversion" | sed -e 's/^\([[1-9]]\)\..*$/\1/g'`
+ if test "$gccmajor" -gt "2"; then
+ DEPEND_CFLAGS_FILTER="| sed 's+-I */+-isystem /+g'"
++ AC_MSG_RESULT(yes)
++ else
++ AC_MSG_RESULT(no)
++ fi
++ dnl -D_FORTIFY_SOURCE=2 crashes Vim on strcpy(buf, "000") when buf is
++ dnl declared as char x[1] but actually longer. Introduced in gcc 4.0.
++ AC_MSG_CHECKING(whether we need -D_FORTIFY_SOURCE=1)
++ if test "$gccmajor" -gt "3"; then
++ CFLAGS="$CFLAGS -D_FORTIFY_SOURCE=1"
++ AC_MSG_RESULT(yes)
++ else
++ AC_MSG_RESULT(no)
+ fi
+ fi
+ AC_SUBST(DEPEND_CFLAGS_FILTER)
+
+*** ../vim-7.2.043/src/eval.c Wed Nov 12 15:28:37 2008
+--- src/eval.c Sun Nov 16 20:46:28 2008
+***************
+*** 21150,21157 ****
+ init_var_dict(&fc.l_avars, &fc.l_avars_var);
+ add_nr_var(&fc.l_avars, &fc.fixvar[fixvar_idx++].var, "0",
+ (varnumber_T)(argcount - fp->uf_args.ga_len));
+ v = &fc.fixvar[fixvar_idx++].var;
+! STRCPY(v->di_key, "000");
+ v->di_flags = DI_FLAGS_RO | DI_FLAGS_FIX;
+ hash_add(&fc.l_avars.dv_hashtab, DI2HIKEY(v));
+ v->di_tv.v_type = VAR_LIST;
+--- 21150,21160 ----
+ init_var_dict(&fc.l_avars, &fc.l_avars_var);
+ add_nr_var(&fc.l_avars, &fc.fixvar[fixvar_idx++].var, "0",
+ (varnumber_T)(argcount - fp->uf_args.ga_len));
++ /* Use "name" to avoid a warning from some compiler that checks the
++ * destination size. */
+ v = &fc.fixvar[fixvar_idx++].var;
+! name = v->di_key;
+! STRCPY(name, "000");
+ v->di_flags = DI_FLAGS_RO | DI_FLAGS_FIX;
+ hash_add(&fc.l_avars.dv_hashtab, DI2HIKEY(v));
+ v->di_tv.v_type = VAR_LIST;
+*** ../vim-7.2.043/src/version.c Thu Nov 20 10:26:19 2008
+--- src/version.c Thu Nov 20 10:34:31 2008
+***************
+*** 678,679 ****
+--- 678,681 ----
+ { /* Add new patch number below this line */
++ /**/
++ 44,
+ /**/
+
+--
+Error:015 - Unable to exit Windows. Try the door.
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ download, build and distribute -- http://www.A-A-P.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
--- /dev/null
+To: vim-dev@vim.org
+Subject: Patch 7.2.045
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=ISO-8859-1
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 7.2.045
+Problem: The Python interface has an empty entry in sys.path.
+Solution: Filter out the empty entry. (idea from James Vega)
+Files: src/if_python.c
+
+
+*** ../vim-7.2.044/src/if_python.c Thu Jul 24 16:24:48 2008
+--- src/if_python.c Thu Nov 20 11:03:53 2008
+***************
+*** 531,536 ****
+--- 531,542 ----
+ if (PythonMod_Init())
+ goto fail;
+
++ /* Remove the element from sys.path that was added because of our
++ * argv[0] value in PythonMod_Init(). Previously we used an empty
++ * string, but dependinding on the OS we then get an empty entry or
++ * the current directory in sys.path. */
++ PyRun_SimpleString("import sys; sys.path = filter(lambda x: x != '/must>not&exist', sys.path)");
++
+ /* the first python thread is vim's, release the lock */
+ Python_SaveThread();
+
+***************
+*** 2345,2351 ****
+ {
+ PyObject *mod;
+ PyObject *dict;
+! static char *(argv[2]) = {"", NULL};
+
+ /* Fixups... */
+ BufferType.ob_type = &PyType_Type;
+--- 2351,2358 ----
+ {
+ PyObject *mod;
+ PyObject *dict;
+! /* The special value is removed from sys.path in Python_Init(). */
+! static char *(argv[2]) = {"/must>not&exist/foo", NULL};
+
+ /* Fixups... */
+ BufferType.ob_type = &PyType_Type;
+*** ../vim-7.2.044/src/version.c Thu Nov 20 10:36:04 2008
+--- src/version.c Thu Nov 20 10:58:11 2008
+***************
+*** 678,679 ****
+--- 678,681 ----
+ { /* Add new patch number below this line */
++ /**/
++ 45,
+ /**/
+
+--
+press CTRL-ALT-DEL for more information
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ download, build and distribute -- http://www.A-A-P.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
--- /dev/null
+To: vim-dev@vim.org
+Subject: Patch 7.2.046
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=ISO-8859-1
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 7.2.046
+Problem: Wrong check for filling buffer with encoding. (Danek Duvall)
+Solution: Remove pointers. (Dominique Pelle)
+Files: src/mbyte.c
+
+
+*** ../vim-7.2.045/src/mbyte.c Wed Nov 12 13:07:48 2008
+--- src/mbyte.c Wed Nov 19 21:44:50 2008
+***************
+*** 3131,3137 ****
+ else
+ s = p + 1;
+ }
+! for (i = 0; s[i] != NUL && s + i < buf + sizeof(buf) - 1; ++i)
+ {
+ if (s[i] == '_' || s[i] == '-')
+ buf[i] = '-';
+--- 3131,3137 ----
+ else
+ s = p + 1;
+ }
+! for (i = 0; s[i] != NUL && i < sizeof(buf) - 1; ++i)
+ {
+ if (s[i] == '_' || s[i] == '-')
+ buf[i] = '-';
+*** ../vim-7.2.045/src/version.c Thu Nov 20 11:04:01 2008
+--- src/version.c Thu Nov 20 11:54:23 2008
+***************
+*** 678,679 ****
+--- 678,681 ----
+ { /* Add new patch number below this line */
++ /**/
++ 46,
+ /**/
+
+--
+ He was not in the least bit scared to be mashed into a pulp
+ Or to have his eyes gouged out and his elbows broken;
+ To have his kneecaps split and his body burned away
+ And his limbs all hacked and mangled, brave Sir Robin.
+ "Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ download, build and distribute -- http://www.A-A-P.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
--- /dev/null
+To: vim-dev@vim.org
+Subject: Patch 7.2.047
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=ISO-8859-1
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 7.2.047
+Problem: Starting Vim with the -nb argument while it's not supported causes
+ the other side to hang.
+Solution: When -nb is used while it's not supported exit Vim. (Xavier de
+ Gaye)
+Files: src/main.c, src/vim.h
+
+
+*** ../vim-7.2.046/src/main.c Sat Nov 15 14:10:23 2008
+--- src/main.c Thu Nov 20 14:09:27 2008
+***************
+*** 1510,1516 ****
+ early_arg_scan(parmp)
+ mparm_T *parmp;
+ {
+! #if defined(FEAT_XCLIPBOARD) || defined(FEAT_CLIENTSERVER)
+ int argc = parmp->argc;
+ char **argv = parmp->argv;
+ int i;
+--- 1510,1517 ----
+ early_arg_scan(parmp)
+ mparm_T *parmp;
+ {
+! #if defined(FEAT_XCLIPBOARD) || defined(FEAT_CLIENTSERVER) \
+! || !defined(FEAT_NETBEANS_INTG)
+ int argc = parmp->argc;
+ char **argv = parmp->argv;
+ int i;
+***************
+*** 1582,1587 ****
+--- 1583,1596 ----
+ else if (STRICMP(argv[i], "--echo-wid") == 0)
+ echo_wid_arg = TRUE;
+ # endif
++ # ifndef FEAT_NETBEANS_INTG
++ else if (strncmp(argv[i], "-nb", (size_t)3) == 0)
++ {
++ mch_errmsg(_("'-nb' cannot be used: not enabled at compile time\n"));
++ mch_exit(2);
++ }
++ # endif
++
+ }
+ #endif
+ }
+*** ../vim-7.2.046/src/vim.h Thu Nov 20 10:26:19 2008
+--- src/vim.h Thu Nov 20 12:06:14 2008
+***************
+*** 1986,1991 ****
+--- 1986,1994 ----
+ # endif
+ #endif
+
++ #ifndef FEAT_NETBEANS_INTG
++ # undef NBDEBUG
++ #endif
+ #ifdef NBDEBUG /* Netbeans debugging. */
+ # include "nbdebug.h"
+ #else
+*** ../vim-7.2.046/src/version.c Thu Nov 20 11:55:53 2008
+--- src/version.c Thu Nov 20 14:07:57 2008
+***************
+*** 678,679 ****
+--- 678,681 ----
+ { /* Add new patch number below this line */
++ /**/
++ 47,
+ /**/
+
+--
+FIRST HEAD: Oh! quick! get the sword out I want to cut his head off.
+THIRD HEAD: Oh, cut your own head off.
+SECOND HEAD: Yes - do us all a favour.
+ "Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ download, build and distribute -- http://www.A-A-P.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
--- /dev/null
+To: vim-dev@vim.org
+Subject: Patch 7.2.048
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=ISO-8859-1
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 7.2.048
+Problem: v:prevcount is changed too often. Counts are not multiplied when
+ setting v:count.
+Solution: Set v:prevcount properly. Multiply counts. (idea by Ben Schmidt)
+Files: src/eval.c, src/normal.c, src/proto/eval.pro
+
+
+*** ../vim-7.2.047/src/eval.c Thu Nov 20 10:36:04 2008
+--- src/eval.c Thu Nov 20 15:53:47 2008
+***************
+*** 18146,18159 ****
+ }
+
+ /*
+! * Set v:count, v:count1 and v:prevcount.
+ */
+ void
+! set_vcount(count, count1)
+ long count;
+ long count1;
+ {
+! vimvars[VV_PREVCOUNT].vv_nr = vimvars[VV_COUNT].vv_nr;
+ vimvars[VV_COUNT].vv_nr = count;
+ vimvars[VV_COUNT1].vv_nr = count1;
+ }
+--- 18146,18162 ----
+ }
+
+ /*
+! * Set v:count to "count" and v:count1 to "count1".
+! * When "set_prevcount" is TRUE first set v:prevcount from v:count.
+ */
+ void
+! set_vcount(count, count1, set_prevcount)
+ long count;
+ long count1;
++ int set_prevcount;
+ {
+! if (set_prevcount)
+! vimvars[VV_PREVCOUNT].vv_nr = vimvars[VV_COUNT].vv_nr;
+ vimvars[VV_COUNT].vv_nr = count;
+ vimvars[VV_COUNT1].vv_nr = count1;
+ }
+*** ../vim-7.2.047/src/normal.c Sat Nov 15 14:10:23 2008
+--- src/normal.c Thu Nov 20 16:04:44 2008
+***************
+*** 580,585 ****
+--- 580,588 ----
+ static int old_mapped_len = 0;
+ #endif
+ int idx;
++ #ifdef FEAT_EVAL
++ int set_prevcount = FALSE;
++ #endif
+
+ vim_memset(&ca, 0, sizeof(ca)); /* also resets ca.retval */
+ ca.oap = oap;
+***************
+*** 615,621 ****
+--- 618,629 ----
+ /* When not finishing an operator and no register name typed, reset the
+ * count. */
+ if (!finish_op && !oap->regname)
++ {
+ ca.opcount = 0;
++ #ifdef FEAT_EVAL
++ set_prevcount = TRUE;
++ #endif
++ }
+
+ #ifdef FEAT_AUTOCMD
+ /* Restore counts from before receiving K_CURSORHOLD. This means after
+***************
+*** 719,725 ****
+ * command, so that v:count can be used in an expression mapping
+ * right after the count. */
+ if (toplevel && stuff_empty())
+! set_vcount(ca.count0, ca.count0 == 0 ? 1 : ca.count0);
+ #endif
+ if (ctrl_w)
+ {
+--- 727,741 ----
+ * command, so that v:count can be used in an expression mapping
+ * right after the count. */
+ if (toplevel && stuff_empty())
+! {
+! long count = ca.count0;
+!
+! /* multiply with ca.opcount the same way as below */
+! if (ca.opcount != 0)
+! count = ca.opcount * (count == 0 ? 1 : count);
+! set_vcount(count, count == 0 ? 1 : count, set_prevcount);
+! set_prevcount = FALSE; /* only set v:prevcount once */
+! }
+ #endif
+ if (ctrl_w)
+ {
+***************
+*** 806,812 ****
+ * Only set v:count when called from main() and not a stuffed command.
+ */
+ if (toplevel && stuff_empty())
+! set_vcount(ca.count0, ca.count1);
+ #endif
+
+ /*
+--- 822,828 ----
+ * Only set v:count when called from main() and not a stuffed command.
+ */
+ if (toplevel && stuff_empty())
+! set_vcount(ca.count0, ca.count1, set_prevcount);
+ #endif
+
+ /*
+*** ../vim-7.2.047/src/proto/eval.pro Sun Nov 9 13:43:25 2008
+--- src/proto/eval.pro Thu Nov 20 15:53:54 2008
+***************
+*** 61,67 ****
+ long get_vim_var_nr __ARGS((int idx));
+ char_u *get_vim_var_str __ARGS((int idx));
+ list_T *get_vim_var_list __ARGS((int idx));
+! void set_vcount __ARGS((long count, long count1));
+ void set_vim_var_string __ARGS((int idx, char_u *val, int len));
+ void set_vim_var_list __ARGS((int idx, list_T *val));
+ void set_reg_var __ARGS((int c));
+--- 61,67 ----
+ long get_vim_var_nr __ARGS((int idx));
+ char_u *get_vim_var_str __ARGS((int idx));
+ list_T *get_vim_var_list __ARGS((int idx));
+! void set_vcount __ARGS((long count, long count1, int set_prevcount));
+ void set_vim_var_string __ARGS((int idx, char_u *val, int len));
+ void set_vim_var_list __ARGS((int idx, list_T *val));
+ void set_reg_var __ARGS((int c));
+*** ../vim-7.2.047/src/version.c Thu Nov 20 14:11:47 2008
+--- src/version.c Thu Nov 20 16:08:19 2008
+***************
+*** 678,679 ****
+--- 678,681 ----
+ { /* Add new patch number below this line */
++ /**/
++ 48,
+ /**/
+
+--
+Microsoft's definition of a boolean: TRUE, FALSE, MAYBE
+"Embrace and extend"...?
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ download, build and distribute -- http://www.A-A-P.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
--- /dev/null
+To: vim-dev@vim.org
+Subject: Patch 7.2.049 (extra)
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=ISO-8859-1
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 7.2.049 (extra)
+Problem: Win32: the clipboard doesn't support UTF-16.
+Solution: Change UCS-2 support to UTF-16 support. (Jia Yanwei)
+Files: src/gui_w32.c, src/gui_w48.c, src/mbyte.c, src/misc1.c,
+ src/os_mswin.c, src/os_win32.c, src/proto/os_mswin.pro
+
+
+*** ../vim-7.2.048/src/gui_w32.c Tue Jun 24 23:46:14 2008
+--- src/gui_w32.c Thu Nov 20 16:47:10 2008
+***************
+*** 992,998 ****
+ SendMessage(lpdi->hdr.hwndFrom, TTM_SETMAXTIPWIDTH,
+ 0, 500);
+
+! tt_text = enc_to_ucs2(str, NULL);
+ lpdi->lpszText = tt_text;
+ /* can't show tooltip if failed */
+ }
+--- 992,998 ----
+ SendMessage(lpdi->hdr.hwndFrom, TTM_SETMAXTIPWIDTH,
+ 0, 500);
+
+! tt_text = enc_to_utf16(str, NULL);
+ lpdi->lpszText = tt_text;
+ /* can't show tooltip if failed */
+ }
+***************
+*** 1935,1941 ****
+ if (buf == NULL)
+ return NULL;
+
+! convbuf = ucs2_to_enc(buf, lenp);
+ pImmReleaseContext(hwnd, hIMC);
+ vim_free(buf);
+ return convbuf;
+--- 1935,1941 ----
+ if (buf == NULL)
+ return NULL;
+
+! convbuf = utf16_to_enc(buf, lenp);
+ pImmReleaseContext(hwnd, hIMC);
+ vim_free(buf);
+ return convbuf;
+***************
+*** 2566,2572 ****
+ {
+ /* 'encoding' differs from active codepage: convert menu name
+ * and use wide function */
+! wn = enc_to_ucs2(menu->name, NULL);
+ if (wn != NULL)
+ {
+ MENUITEMINFOW infow;
+--- 2566,2572 ----
+ {
+ /* 'encoding' differs from active codepage: convert menu name
+ * and use wide function */
+! wn = enc_to_utf16(menu->name, NULL);
+ if (wn != NULL)
+ {
+ MENUITEMINFOW infow;
+***************
+*** 2728,2734 ****
+ {
+ /* 'encoding' differs from active codepage: convert menu item name
+ * and use wide function */
+! wn = enc_to_ucs2(menu->name, NULL);
+ if (wn != NULL)
+ {
+ n = InsertMenuW(parent->submenu_id, (UINT)idx,
+--- 2728,2734 ----
+ {
+ /* 'encoding' differs from active codepage: convert menu item name
+ * and use wide function */
+! wn = enc_to_utf16(menu->name, NULL);
+ if (wn != NULL)
+ {
+ n = InsertMenuW(parent->submenu_id, (UINT)idx,
+***************
+*** 3570,3576 ****
+ if (enc_codepage == 0 && (int)GetACP() != enc_codepage)
+ {
+ /* Not a codepage, use our own conversion function. */
+! wn = enc_to_ucs2(lpAnsiIn, NULL);
+ if (wn != NULL)
+ {
+ wcscpy(lpWCStr, wn);
+--- 3570,3576 ----
+ if (enc_codepage == 0 && (int)GetACP() != enc_codepage)
+ {
+ /* Not a codepage, use our own conversion function. */
+! wn = enc_to_utf16(lpAnsiIn, NULL);
+ if (wn != NULL)
+ {
+ wcscpy(lpWCStr, wn);
+*** ../vim-7.2.048/src/gui_w48.c Wed Nov 12 13:35:31 2008
+--- src/gui_w48.c Thu Nov 20 16:42:32 2008
+***************
+*** 547,553 ****
+ else
+ {
+ len = 1;
+! ws = ucs2_to_enc(wstring, &len);
+ if (ws == NULL)
+ len = 0;
+ else
+--- 547,553 ----
+ else
+ {
+ len = 1;
+! ws = utf16_to_enc(wstring, &len);
+ if (ws == NULL)
+ len = 0;
+ else
+***************
+*** 2128,2134 ****
+ {
+ /* 'encoding' differs from active codepage: convert text and use wide
+ * function */
+! wstr = enc_to_ucs2(str, &wlen);
+ if (wstr != NULL)
+ {
+ n = GetTextExtentPointW(hdc, wstr, wlen, &size);
+--- 2128,2134 ----
+ {
+ /* 'encoding' differs from active codepage: convert text and use wide
+ * function */
+! wstr = enc_to_utf16(str, &wlen);
+ if (wstr != NULL)
+ {
+ n = GetTextExtentPointW(hdc, wstr, wlen, &size);
+***************
+*** 2252,2258 ****
+ {
+ /* 'encoding' differs from active codepage: convert menu name
+ * and use wide function */
+! wn = enc_to_ucs2(item_text, NULL);
+ if (wn != NULL)
+ {
+ MENUITEMINFOW infow;
+--- 2252,2258 ----
+ {
+ /* 'encoding' differs from active codepage: convert menu name
+ * and use wide function */
+! wn = enc_to_utf16(item_text, NULL);
+ if (wn != NULL)
+ {
+ MENUITEMINFOW infow;
+***************
+*** 2422,2428 ****
+ if (use_unicode)
+ {
+ /* Need to go through Unicode. */
+! wstr = enc_to_ucs2(NameBuff, NULL);
+ if (wstr != NULL)
+ {
+ TCITEMW tiw;
+--- 2422,2428 ----
+ if (use_unicode)
+ {
+ /* Need to go through Unicode. */
+! wstr = enc_to_utf16(NameBuff, NULL);
+ if (wstr != NULL)
+ {
+ TCITEMW tiw;
+***************
+*** 2521,2528 ****
+ WCHAR *wbuf;
+ int n;
+
+! /* Convert the title from 'encoding' to ucs2. */
+! wbuf = (WCHAR *)enc_to_ucs2((char_u *)title, NULL);
+ if (wbuf != NULL)
+ {
+ n = SetWindowTextW(hwnd, wbuf);
+--- 2521,2528 ----
+ WCHAR *wbuf;
+ int n;
+
+! /* Convert the title from 'encoding' to UTF-16. */
+! wbuf = (WCHAR *)enc_to_utf16((char_u *)title, NULL);
+ if (wbuf != NULL)
+ {
+ n = SetWindowTextW(hwnd, wbuf);
+***************
+*** 3222,3228 ****
+ char_u *initdir,
+ char_u *filter)
+ {
+! /* We always use the wide function. This means enc_to_ucs2() must work,
+ * otherwise it fails miserably! */
+ OPENFILENAMEW fileStruct;
+ WCHAR fileBuf[MAXPATHL];
+--- 3222,3228 ----
+ char_u *initdir,
+ char_u *filter)
+ {
+! /* We always use the wide function. This means enc_to_utf16() must work,
+ * otherwise it fails miserably! */
+ OPENFILENAMEW fileStruct;
+ WCHAR fileBuf[MAXPATHL];
+***************
+*** 3238,3244 ****
+ fileBuf[0] = NUL;
+ else
+ {
+! wp = enc_to_ucs2(dflt, NULL);
+ if (wp == NULL)
+ fileBuf[0] = NUL;
+ else
+--- 3238,3244 ----
+ fileBuf[0] = NUL;
+ else
+ {
+! wp = enc_to_utf16(dflt, NULL);
+ if (wp == NULL)
+ fileBuf[0] = NUL;
+ else
+***************
+*** 3263,3273 ****
+ #endif
+
+ if (title != NULL)
+! titlep = enc_to_ucs2(title, NULL);
+ fileStruct.lpstrTitle = titlep;
+
+ if (ext != NULL)
+! extp = enc_to_ucs2(ext, NULL);
+ fileStruct.lpstrDefExt = extp;
+
+ fileStruct.lpstrFile = fileBuf;
+--- 3263,3273 ----
+ #endif
+
+ if (title != NULL)
+! titlep = enc_to_utf16(title, NULL);
+ fileStruct.lpstrTitle = titlep;
+
+ if (ext != NULL)
+! extp = enc_to_utf16(ext, NULL);
+ fileStruct.lpstrDefExt = extp;
+
+ fileStruct.lpstrFile = fileBuf;
+***************
+*** 3278,3284 ****
+ if (initdir != NULL && *initdir != NUL)
+ {
+ /* Must have backslashes here, no matter what 'shellslash' says */
+! initdirp = enc_to_ucs2(initdir, NULL);
+ if (initdirp != NULL)
+ {
+ for (wp = initdirp; *wp != NUL; ++wp)
+--- 3278,3284 ----
+ if (initdir != NULL && *initdir != NUL)
+ {
+ /* Must have backslashes here, no matter what 'shellslash' says */
+! initdirp = enc_to_utf16(initdir, NULL);
+ if (initdirp != NULL)
+ {
+ for (wp = initdirp; *wp != NUL; ++wp)
+***************
+*** 3318,3324 ****
+ vim_free(extp);
+
+ /* Convert from UCS2 to 'encoding'. */
+! p = ucs2_to_enc(fileBuf, NULL);
+ if (p != NULL)
+ /* when out of memory we get garbage for non-ASCII chars */
+ STRCPY(fileBuf, p);
+--- 3318,3324 ----
+ vim_free(extp);
+
+ /* Convert from UCS2 to 'encoding'. */
+! p = utf16_to_enc(fileBuf, NULL);
+ if (p != NULL)
+ /* when out of memory we get garbage for non-ASCII chars */
+ STRCPY(fileBuf, p);
+***************
+*** 3518,3524 ****
+ {
+ #ifdef FEAT_MBYTE
+ if (DragQueryFileW(hDrop, i, wszFile, BUFPATHLEN) > 0)
+! fnames[i] = ucs2_to_enc(wszFile, NULL);
+ else
+ #endif
+ {
+--- 3518,3524 ----
+ {
+ #ifdef FEAT_MBYTE
+ if (DragQueryFileW(hDrop, i, wszFile, BUFPATHLEN) > 0)
+! fnames[i] = utf16_to_enc(wszFile, NULL);
+ else
+ #endif
+ {
+*** ../vim-7.2.048/src/mbyte.c Thu Nov 20 11:55:53 2008
+--- src/mbyte.c Thu Nov 20 16:47:41 2008
+***************
+*** 6101,6107 ****
+
+ /* 1. codepage/UTF-8 -> ucs-2. */
+ if (vcp->vc_cpfrom == 0)
+! tmp_len = utf8_to_ucs2(ptr, len, NULL, NULL);
+ else
+ tmp_len = MultiByteToWideChar(vcp->vc_cpfrom, 0,
+ ptr, len, 0, 0);
+--- 6101,6107 ----
+
+ /* 1. codepage/UTF-8 -> ucs-2. */
+ if (vcp->vc_cpfrom == 0)
+! tmp_len = utf8_to_utf16(ptr, len, NULL, NULL);
+ else
+ tmp_len = MultiByteToWideChar(vcp->vc_cpfrom, 0,
+ ptr, len, 0, 0);
+***************
+*** 6109,6121 ****
+ if (tmp == NULL)
+ break;
+ if (vcp->vc_cpfrom == 0)
+! utf8_to_ucs2(ptr, len, tmp, unconvlenp);
+ else
+ MultiByteToWideChar(vcp->vc_cpfrom, 0, ptr, len, tmp, tmp_len);
+
+ /* 2. ucs-2 -> codepage/UTF-8. */
+ if (vcp->vc_cpto == 0)
+! retlen = ucs2_to_utf8(tmp, tmp_len, NULL);
+ else
+ retlen = WideCharToMultiByte(vcp->vc_cpto, 0,
+ tmp, tmp_len, 0, 0, 0, 0);
+--- 6109,6121 ----
+ if (tmp == NULL)
+ break;
+ if (vcp->vc_cpfrom == 0)
+! utf8_to_utf16(ptr, len, tmp, unconvlenp);
+ else
+ MultiByteToWideChar(vcp->vc_cpfrom, 0, ptr, len, tmp, tmp_len);
+
+ /* 2. ucs-2 -> codepage/UTF-8. */
+ if (vcp->vc_cpto == 0)
+! retlen = utf16_to_utf8(tmp, tmp_len, NULL);
+ else
+ retlen = WideCharToMultiByte(vcp->vc_cpto, 0,
+ tmp, tmp_len, 0, 0, 0, 0);
+***************
+*** 6123,6129 ****
+ if (retval != NULL)
+ {
+ if (vcp->vc_cpto == 0)
+! ucs2_to_utf8(tmp, tmp_len, retval);
+ else
+ WideCharToMultiByte(vcp->vc_cpto, 0,
+ tmp, tmp_len, retval, retlen, 0, 0);
+--- 6123,6129 ----
+ if (retval != NULL)
+ {
+ if (vcp->vc_cpto == 0)
+! utf16_to_utf8(tmp, tmp_len, retval);
+ else
+ WideCharToMultiByte(vcp->vc_cpto, 0,
+ tmp, tmp_len, retval, retlen, 0, 0);
+*** ../vim-7.2.048/src/misc1.c Sun Nov 9 13:43:25 2008
+--- src/misc1.c Thu Nov 20 16:42:59 2008
+***************
+*** 8728,8734 ****
+ /* The active codepage differs from 'encoding'. Attempt using the
+ * wide function. If it fails because it is not implemented fall back
+ * to the non-wide version (for Windows 98) */
+! wn = enc_to_ucs2(buf, NULL);
+ if (wn != NULL)
+ {
+ hFind = FindFirstFileW(wn, &wfb);
+--- 8728,8734 ----
+ /* The active codepage differs from 'encoding'. Attempt using the
+ * wide function. If it fails because it is not implemented fall back
+ * to the non-wide version (for Windows 98) */
+! wn = enc_to_utf16(buf, NULL);
+ if (wn != NULL)
+ {
+ hFind = FindFirstFileW(wn, &wfb);
+***************
+*** 8756,8762 ****
+ #ifdef WIN3264
+ # ifdef FEAT_MBYTE
+ if (wn != NULL)
+! p = ucs2_to_enc(wfb.cFileName, NULL); /* p is allocated here */
+ else
+ # endif
+ p = (char_u *)fb.cFileName;
+--- 8756,8762 ----
+ #ifdef WIN3264
+ # ifdef FEAT_MBYTE
+ if (wn != NULL)
+! p = utf16_to_enc(wfb.cFileName, NULL); /* p is allocated here */
+ else
+ # endif
+ p = (char_u *)fb.cFileName;
+***************
+*** 8830,8836 ****
+ if (wn != NULL)
+ {
+ vim_free(wn);
+! wn = enc_to_ucs2(buf, NULL);
+ if (wn != NULL)
+ hFind = FindFirstFileW(wn, &wfb);
+ }
+--- 8830,8836 ----
+ if (wn != NULL)
+ {
+ vim_free(wn);
+! wn = enc_to_utf16(buf, NULL);
+ if (wn != NULL)
+ hFind = FindFirstFileW(wn, &wfb);
+ }
+*** ../vim-7.2.048/src/os_mswin.c Sat Aug 9 19:37:30 2008
+--- src/os_mswin.c Thu Nov 20 17:05:10 2008
+***************
+*** 309,315 ****
+ if (enc_codepage >= 0 && (int)GetACP() != enc_codepage)
+ {
+ /* Convert the title from 'encoding' to the active codepage. */
+! WCHAR *wp = enc_to_ucs2(title, NULL);
+ int n;
+
+ if (wp != NULL)
+--- 309,315 ----
+ if (enc_codepage >= 0 && (int)GetACP() != enc_codepage)
+ {
+ /* Convert the title from 'encoding' to the active codepage. */
+! WCHAR *wp = enc_to_utf16(title, NULL);
+ int n;
+
+ if (wp != NULL)
+***************
+*** 406,415 ****
+ * - invoke _wfullpath()
+ * - convert the result from UCS2 to 'encoding'.
+ */
+! wname = enc_to_ucs2(fname, NULL);
+ if (wname != NULL && _wfullpath(wbuf, wname, MAX_PATH - 1) != NULL)
+ {
+! cname = ucs2_to_enc((short_u *)wbuf, NULL);
+ if (cname != NULL)
+ {
+ vim_strncpy(buf, cname, len - 1);
+--- 406,415 ----
+ * - invoke _wfullpath()
+ * - convert the result from UCS2 to 'encoding'.
+ */
+! wname = enc_to_utf16(fname, NULL);
+ if (wname != NULL && _wfullpath(wbuf, wname, MAX_PATH - 1) != NULL)
+ {
+! cname = utf16_to_enc((short_u *)wbuf, NULL);
+ if (cname != NULL)
+ {
+ vim_strncpy(buf, cname, len - 1);
+***************
+*** 507,513 ****
+ # endif
+ )
+ {
+! WCHAR *wp = enc_to_ucs2(buf, NULL);
+ int n;
+
+ if (wp != NULL)
+--- 507,513 ----
+ # endif
+ )
+ {
+! WCHAR *wp = enc_to_utf16(buf, NULL);
+ int n;
+
+ if (wp != NULL)
+***************
+*** 668,674 ****
+ #ifdef FEAT_MBYTE
+ if (enc_codepage >= 0 && (int)GetACP() != enc_codepage)
+ {
+! WCHAR *p = enc_to_ucs2(path, NULL);
+ int n;
+
+ if (p != NULL)
+--- 668,674 ----
+ #ifdef FEAT_MBYTE
+ if (enc_codepage >= 0 && (int)GetACP() != enc_codepage)
+ {
+! WCHAR *p = enc_to_utf16(path, NULL);
+ int n;
+
+ if (p != NULL)
+***************
+*** 891,909 ****
+
+ #if defined(FEAT_MBYTE) || defined(PROTO)
+ /*
+! * Convert an UTF-8 string to UCS-2.
+ * "instr[inlen]" is the input. "inlen" is in bytes.
+! * When "outstr" is NULL only return the number of UCS-2 words produced.
+ * Otherwise "outstr" must be a buffer of sufficient size.
+! * Returns the number of UCS-2 words produced.
+ */
+ int
+! utf8_to_ucs2(char_u *instr, int inlen, short_u *outstr, int *unconvlenp)
+ {
+ int outlen = 0;
+ char_u *p = instr;
+ int todo = inlen;
+ int l;
+
+ while (todo > 0)
+ {
+--- 891,910 ----
+
+ #if defined(FEAT_MBYTE) || defined(PROTO)
+ /*
+! * Convert an UTF-8 string to UTF-16.
+ * "instr[inlen]" is the input. "inlen" is in bytes.
+! * When "outstr" is NULL only return the number of UTF-16 words produced.
+ * Otherwise "outstr" must be a buffer of sufficient size.
+! * Returns the number of UTF-16 words produced.
+ */
+ int
+! utf8_to_utf16(char_u *instr, int inlen, short_u *outstr, int *unconvlenp)
+ {
+ int outlen = 0;
+ char_u *p = instr;
+ int todo = inlen;
+ int l;
++ int ch;
+
+ while (todo > 0)
+ {
+***************
+*** 917,924 ****
+ break;
+ }
+
+! if (outstr != NULL)
+! *outstr++ = utf_ptr2char(p);
+ ++outlen;
+ p += l;
+ todo -= l;
+--- 918,936 ----
+ break;
+ }
+
+! ch = utf_ptr2char(p);
+! if (ch >= 0x10000)
+! {
+! /* non-BMP character, encoding with surrogate pairs */
+! ++outlen;
+! if (outstr != NULL)
+! {
+! *outstr++ = (0xD800 - (0x10000 >> 10)) + (ch >> 10);
+! *outstr++ = 0xDC00 | (ch & 0x3FF);
+! }
+! }
+! else if (outstr != NULL)
+! *outstr++ = ch;
+ ++outlen;
+ p += l;
+ todo -= l;
+***************
+*** 928,956 ****
+ }
+
+ /*
+! * Convert an UCS-2 string to UTF-8.
+! * The input is "instr[inlen]" with "inlen" in number of ucs-2 words.
+ * When "outstr" is NULL only return the required number of bytes.
+ * Otherwise "outstr" must be a buffer of sufficient size.
+ * Return the number of bytes produced.
+ */
+ int
+! ucs2_to_utf8(short_u *instr, int inlen, char_u *outstr)
+ {
+ int outlen = 0;
+ int todo = inlen;
+ short_u *p = instr;
+ int l;
+
+ while (todo > 0)
+ {
+ if (outstr != NULL)
+ {
+! l = utf_char2bytes(*p, outstr);
+ outstr += l;
+ }
+ else
+! l = utf_char2len(*p);
+ ++p;
+ outlen += l;
+ --todo;
+--- 940,981 ----
+ }
+
+ /*
+! * Convert an UTF-16 string to UTF-8.
+! * The input is "instr[inlen]" with "inlen" in number of UTF-16 words.
+ * When "outstr" is NULL only return the required number of bytes.
+ * Otherwise "outstr" must be a buffer of sufficient size.
+ * Return the number of bytes produced.
+ */
+ int
+! utf16_to_utf8(short_u *instr, int inlen, char_u *outstr)
+ {
+ int outlen = 0;
+ int todo = inlen;
+ short_u *p = instr;
+ int l;
++ int ch, ch2;
+
+ while (todo > 0)
+ {
++ ch = *p;
++ if (ch >= 0xD800 && ch <= 0xDBFF && todo > 1)
++ {
++ /* surrogate pairs handling */
++ ch2 = p[1];
++ if (ch2 >= 0xDC00 && ch2 <= 0xDFFF)
++ {
++ ch = ((ch - 0xD800) << 10) + (ch2 & 0x3FF) + 0x10000;
++ ++p;
++ --todo;
++ }
++ }
+ if (outstr != NULL)
+ {
+! l = utf_char2bytes(ch, outstr);
+ outstr += l;
+ }
+ else
+! l = utf_char2len(ch);
+ ++p;
+ outlen += l;
+ --todo;
+***************
+*** 1079,1092 ****
+ */
+
+ /*
+! * Convert "str" from 'encoding' to UCS-2.
+ * Input in "str" with length "*lenp". When "lenp" is NULL, use strlen().
+ * Output is returned as an allocated string. "*lenp" is set to the length of
+ * the result. A trailing NUL is always added.
+ * Returns NULL when out of memory.
+ */
+ short_u *
+! enc_to_ucs2(char_u *str, int *lenp)
+ {
+ vimconv_T conv;
+ WCHAR *ret;
+--- 1104,1117 ----
+ */
+
+ /*
+! * Convert "str" from 'encoding' to UTF-16.
+ * Input in "str" with length "*lenp". When "lenp" is NULL, use strlen().
+ * Output is returned as an allocated string. "*lenp" is set to the length of
+ * the result. A trailing NUL is always added.
+ * Returns NULL when out of memory.
+ */
+ short_u *
+! enc_to_utf16(char_u *str, int *lenp)
+ {
+ vimconv_T conv;
+ WCHAR *ret;
+***************
+*** 1102,1108 ****
+
+ if (enc_codepage > 0)
+ {
+! /* We can do any CP### -> UCS-2 in one pass, and we can do it
+ * without iconv() (convert_* may need iconv). */
+ MultiByteToWideChar_alloc(enc_codepage, 0, str, *lenp, &ret, &length);
+ }
+--- 1127,1133 ----
+
+ if (enc_codepage > 0)
+ {
+! /* We can do any CP### -> UTF-16 in one pass, and we can do it
+ * without iconv() (convert_* may need iconv). */
+ MultiByteToWideChar_alloc(enc_codepage, 0, str, *lenp, &ret, &length);
+ }
+***************
+*** 1123,1133 ****
+ }
+ convert_setup(&conv, NULL, NULL);
+
+! length = utf8_to_ucs2(str, *lenp, NULL, NULL);
+ ret = (WCHAR *)alloc((unsigned)((length + 1) * sizeof(WCHAR)));
+ if (ret != NULL)
+ {
+! utf8_to_ucs2(str, *lenp, (short_u *)ret, NULL);
+ ret[length] = 0;
+ }
+
+--- 1148,1158 ----
+ }
+ convert_setup(&conv, NULL, NULL);
+
+! length = utf8_to_utf16(str, *lenp, NULL, NULL);
+ ret = (WCHAR *)alloc((unsigned)((length + 1) * sizeof(WCHAR)));
+ if (ret != NULL)
+ {
+! utf8_to_utf16(str, *lenp, (short_u *)ret, NULL);
+ ret[length] = 0;
+ }
+
+***************
+*** 1139,1145 ****
+ }
+
+ /*
+! * Convert an UCS-2 string to 'encoding'.
+ * Input in "str" with length (counted in wide characters) "*lenp". When
+ * "lenp" is NULL, use wcslen().
+ * Output is returned as an allocated string. If "*lenp" is not NULL it is
+--- 1164,1170 ----
+ }
+
+ /*
+! * Convert an UTF-16 string to 'encoding'.
+ * Input in "str" with length (counted in wide characters) "*lenp". When
+ * "lenp" is NULL, use wcslen().
+ * Output is returned as an allocated string. If "*lenp" is not NULL it is
+***************
+*** 1147,1153 ****
+ * Returns NULL when out of memory.
+ */
+ char_u *
+! ucs2_to_enc(short_u *str, int *lenp)
+ {
+ vimconv_T conv;
+ char_u *utf8_str = NULL, *enc_str = NULL;
+--- 1172,1178 ----
+ * Returns NULL when out of memory.
+ */
+ char_u *
+! utf16_to_enc(short_u *str, int *lenp)
+ {
+ vimconv_T conv;
+ char_u *utf8_str = NULL, *enc_str = NULL;
+***************
+*** 1161,1167 ****
+
+ if (enc_codepage > 0)
+ {
+! /* We can do any UCS-2 -> CP### in one pass. */
+ int length;
+
+ WideCharToMultiByte_alloc(enc_codepage, 0, str, *lenp,
+--- 1186,1192 ----
+
+ if (enc_codepage > 0)
+ {
+! /* We can do any UTF-16 -> CP### in one pass. */
+ int length;
+
+ WideCharToMultiByte_alloc(enc_codepage, 0, str, *lenp,
+***************
+*** 1171,1180 ****
+ }
+
+ /* Avoid allocating zero bytes, it generates an error message. */
+! utf8_str = alloc(ucs2_to_utf8(str, *lenp == 0 ? 1 : *lenp, NULL));
+ if (utf8_str != NULL)
+ {
+! *lenp = ucs2_to_utf8(str, *lenp, utf8_str);
+
+ /* We might be called before we have p_enc set up. */
+ conv.vc_type = CONV_NONE;
+--- 1196,1205 ----
+ }
+
+ /* Avoid allocating zero bytes, it generates an error message. */
+! utf8_str = alloc(utf16_to_utf8(str, *lenp == 0 ? 1 : *lenp, NULL));
+ if (utf8_str != NULL)
+ {
+! *lenp = utf16_to_utf8(str, *lenp, utf8_str);
+
+ /* We might be called before we have p_enc set up. */
+ conv.vc_type = CONV_NONE;
+***************
+*** 1308,1314 ****
+ if (hMemWstr[str_size] == NUL)
+ break;
+ }
+! to_free = str = ucs2_to_enc((short_u *)hMemWstr, &str_size);
+ GlobalUnlock(hMemW);
+ }
+ }
+--- 1333,1339 ----
+ if (hMemWstr[str_size] == NUL)
+ break;
+ }
+! to_free = str = utf16_to_enc((short_u *)hMemWstr, &str_size);
+ GlobalUnlock(hMemW);
+ }
+ }
+***************
+*** 1340,1346 ****
+
+ # if defined(FEAT_MBYTE) && defined(WIN3264)
+ /* The text is in the active codepage. Convert to 'encoding',
+! * going through UCS-2. */
+ acp_to_enc(str, str_size, &to_free, &maxlen);
+ if (to_free != NULL)
+ {
+--- 1365,1371 ----
+
+ # if defined(FEAT_MBYTE) && defined(WIN3264)
+ /* The text is in the active codepage. Convert to 'encoding',
+! * going through UTF-16. */
+ acp_to_enc(str, str_size, &to_free, &maxlen);
+ if (to_free != NULL)
+ {
+***************
+*** 1404,1410 ****
+ if (widestr != NULL)
+ {
+ ++*outlen; /* Include the 0 after the string */
+! *out = ucs2_to_enc((short_u *)widestr, outlen);
+ vim_free(widestr);
+ }
+ }
+--- 1429,1435 ----
+ if (widestr != NULL)
+ {
+ ++*outlen; /* Include the 0 after the string */
+! *out = utf16_to_enc((short_u *)widestr, outlen);
+ vim_free(widestr);
+ }
+ }
+***************
+*** 1466,1474 ****
+ WCHAR *out;
+ int len = metadata.txtlen;
+
+! /* Convert the text to UCS-2. This is put on the clipboard as
+ * CF_UNICODETEXT. */
+! out = (WCHAR *)enc_to_ucs2(str, &len);
+ if (out != NULL)
+ {
+ WCHAR *lpszMemW;
+--- 1491,1499 ----
+ WCHAR *out;
+ int len = metadata.txtlen;
+
+! /* Convert the text to UTF-16. This is put on the clipboard as
+ * CF_UNICODETEXT. */
+! out = (WCHAR *)enc_to_utf16(str, &len);
+ if (out != NULL)
+ {
+ WCHAR *lpszMemW;
+***************
+*** 1488,1494 ****
+ WideCharToMultiByte(GetACP(), 0, out, len,
+ str, metadata.txtlen, 0, 0);
+
+! /* Allocate memory for the UCS-2 text, add one NUL word to
+ * terminate the string. */
+ hMemW = (LPSTR)GlobalAlloc(GMEM_MOVEABLE | GMEM_DDESHARE,
+ (len + 1) * sizeof(WCHAR));
+--- 1513,1519 ----
+ WideCharToMultiByte(GetACP(), 0, out, len,
+ str, metadata.txtlen, 0, 0);
+
+! /* Allocate memory for the UTF-16 text, add one NUL word to
+ * terminate the string. */
+ hMemW = (LPSTR)GlobalAlloc(GMEM_MOVEABLE | GMEM_DDESHARE,
+ (len + 1) * sizeof(WCHAR));
+*** ../vim-7.2.048/src/os_win32.c Thu Jul 24 20:50:30 2008
+--- src/os_win32.c Thu Nov 20 16:44:33 2008
+***************
+*** 1587,1593 ****
+ #ifdef FEAT_MBYTE
+ if (enc_codepage >= 0 && (int)GetACP() != enc_codepage)
+ {
+! WCHAR *p = enc_to_ucs2(name, NULL);
+ WCHAR fnamew[_MAX_PATH];
+ WCHAR *dumw;
+ long n;
+--- 1587,1593 ----
+ #ifdef FEAT_MBYTE
+ if (enc_codepage >= 0 && (int)GetACP() != enc_codepage)
+ {
+! WCHAR *p = enc_to_utf16(name, NULL);
+ WCHAR fnamew[_MAX_PATH];
+ WCHAR *dumw;
+ long n;
+***************
+*** 2440,2446 ****
+
+ if (GetCurrentDirectoryW(_MAX_PATH, wbuf) != 0)
+ {
+! char_u *p = ucs2_to_enc(wbuf, NULL);
+
+ if (p != NULL)
+ {
+--- 2440,2446 ----
+
+ if (GetCurrentDirectoryW(_MAX_PATH, wbuf) != 0)
+ {
+! char_u *p = utf16_to_enc(wbuf, NULL);
+
+ if (p != NULL)
+ {
+***************
+*** 2466,2472 ****
+ #ifdef FEAT_MBYTE
+ if (enc_codepage >= 0 && (int)GetACP() != enc_codepage)
+ {
+! WCHAR *p = enc_to_ucs2(name, NULL);
+ long n;
+
+ if (p != NULL)
+--- 2466,2472 ----
+ #ifdef FEAT_MBYTE
+ if (enc_codepage >= 0 && (int)GetACP() != enc_codepage)
+ {
+! WCHAR *p = enc_to_utf16(name, NULL);
+ long n;
+
+ if (p != NULL)
+***************
+*** 2495,2501 ****
+ #ifdef FEAT_MBYTE
+ if (enc_codepage >= 0 && (int)GetACP() != enc_codepage)
+ {
+! WCHAR *p = enc_to_ucs2(name, NULL);
+ long n;
+
+ if (p != NULL)
+--- 2495,2501 ----
+ #ifdef FEAT_MBYTE
+ if (enc_codepage >= 0 && (int)GetACP() != enc_codepage)
+ {
+! WCHAR *p = enc_to_utf16(name, NULL);
+ long n;
+
+ if (p != NULL)
+***************
+*** 2522,2528 ****
+ WCHAR *p = NULL;
+
+ if (enc_codepage >= 0 && (int)GetACP() != enc_codepage)
+! p = enc_to_ucs2(name, NULL);
+ #endif
+
+ #ifdef FEAT_MBYTE
+--- 2522,2528 ----
+ WCHAR *p = NULL;
+
+ if (enc_codepage >= 0 && (int)GetACP() != enc_codepage)
+! p = enc_to_utf16(name, NULL);
+ #endif
+
+ #ifdef FEAT_MBYTE
+***************
+*** 2590,2596 ****
+ WCHAR *wn = NULL;
+
+ if (enc_codepage >= 0 && (int)GetACP() != enc_codepage)
+! wn = enc_to_ucs2(fname, NULL);
+ if (wn != NULL)
+ {
+ hFile = CreateFileW(wn, /* file name */
+--- 2590,2596 ----
+ WCHAR *wn = NULL;
+
+ if (enc_codepage >= 0 && (int)GetACP() != enc_codepage)
+! wn = enc_to_utf16(fname, NULL);
+ if (wn != NULL)
+ {
+ hFile = CreateFileW(wn, /* file name */
+***************
+*** 4239,4245 ****
+
+ if (enc_codepage >= 0 && (int)GetACP() != enc_codepage)
+ {
+! wn = enc_to_ucs2(name, NULL);
+ if (wn != NULL)
+ {
+ SetFileAttributesW(wn, FILE_ATTRIBUTE_NORMAL);
+--- 4239,4245 ----
+
+ if (enc_codepage >= 0 && (int)GetACP() != enc_codepage)
+ {
+! wn = enc_to_utf16(name, NULL);
+ if (wn != NULL)
+ {
+ SetFileAttributesW(wn, FILE_ATTRIBUTE_NORMAL);
+***************
+*** 4382,4389 ****
+
+ if (enc_codepage >= 0 && (int)GetACP() != enc_codepage)
+ {
+! wold = enc_to_ucs2((char_u *)pszOldFile, NULL);
+! wnew = enc_to_ucs2((char_u *)pszNewFile, NULL);
+ if (wold != NULL && wnew != NULL)
+ retval = mch_wrename(wold, wnew);
+ vim_free(wold);
+--- 4382,4389 ----
+
+ if (enc_codepage >= 0 && (int)GetACP() != enc_codepage)
+ {
+! wold = enc_to_utf16((char_u *)pszOldFile, NULL);
+! wnew = enc_to_utf16((char_u *)pszNewFile, NULL);
+ if (wold != NULL && wnew != NULL)
+ retval = mch_wrename(wold, wnew);
+ vim_free(wold);
+***************
+*** 4492,4498 ****
+ WCHAR *wn = NULL;
+
+ if (enc_codepage >= 0 && (int)GetACP() != enc_codepage)
+! wn = enc_to_ucs2(n, NULL);
+ #endif
+
+ if (mch_isdir(n))
+--- 4492,4498 ----
+ WCHAR *wn = NULL;
+
+ if (enc_codepage >= 0 && (int)GetACP() != enc_codepage)
+! wn = enc_to_utf16(n, NULL);
+ #endif
+
+ if (mch_isdir(n))
+***************
+*** 4618,4624 ****
+
+ #if defined(FEAT_MBYTE) || defined(PROTO)
+ /*
+! * Version of open() that may use ucs2 file name.
+ */
+ int
+ mch_open(char *name, int flags, int mode)
+--- 4618,4624 ----
+
+ #if defined(FEAT_MBYTE) || defined(PROTO)
+ /*
+! * Version of open() that may use UTF-16 file name.
+ */
+ int
+ mch_open(char *name, int flags, int mode)
+***************
+*** 4630,4636 ****
+
+ if (enc_codepage >= 0 && (int)GetACP() != enc_codepage)
+ {
+! wn = enc_to_ucs2(name, NULL);
+ if (wn != NULL)
+ {
+ f = _wopen(wn, flags, mode);
+--- 4630,4636 ----
+
+ if (enc_codepage >= 0 && (int)GetACP() != enc_codepage)
+ {
+! wn = enc_to_utf16(name, NULL);
+ if (wn != NULL)
+ {
+ f = _wopen(wn, flags, mode);
+***************
+*** 4648,4654 ****
+ }
+
+ /*
+! * Version of fopen() that may use ucs2 file name.
+ */
+ FILE *
+ mch_fopen(char *name, char *mode)
+--- 4648,4654 ----
+ }
+
+ /*
+! * Version of fopen() that may use UTF-16 file name.
+ */
+ FILE *
+ mch_fopen(char *name, char *mode)
+***************
+*** 4675,4682 ****
+ else if (newMode == 'b')
+ _set_fmode(_O_BINARY);
+ # endif
+! wn = enc_to_ucs2(name, NULL);
+! wm = enc_to_ucs2(mode, NULL);
+ if (wn != NULL && wm != NULL)
+ f = _wfopen(wn, wm);
+ vim_free(wn);
+--- 4675,4682 ----
+ else if (newMode == 'b')
+ _set_fmode(_O_BINARY);
+ # endif
+! wn = enc_to_utf16(name, NULL);
+! wm = enc_to_utf16(mode, NULL);
+ if (wn != NULL && wm != NULL)
+ f = _wfopen(wn, wm);
+ vim_free(wn);
+***************
+*** 4776,4783 ****
+ int len;
+
+ /* Convert the file names to wide characters. */
+! fromw = enc_to_ucs2(from, NULL);
+! tow = enc_to_ucs2(to, NULL);
+ if (fromw != NULL && tow != NULL)
+ {
+ /* Open the file for reading. */
+--- 4776,4783 ----
+ int len;
+
+ /* Convert the file names to wide characters. */
+! fromw = enc_to_utf16(from, NULL);
+! tow = enc_to_utf16(to, NULL);
+ if (fromw != NULL && tow != NULL)
+ {
+ /* Open the file for reading. */
+***************
+*** 5122,5128 ****
+ for (i = 0; i < used_file_count; ++i)
+ {
+ idx = used_file_indexes[i];
+! str = ucs2_to_enc(ArglistW[idx], NULL);
+ if (str != NULL)
+ {
+ #ifdef FEAT_DIFF
+--- 5122,5128 ----
+ for (i = 0; i < used_file_count; ++i)
+ {
+ idx = used_file_indexes[i];
+! str = utf16_to_enc(ArglistW[idx], NULL);
+ if (str != NULL)
+ {
+ #ifdef FEAT_DIFF
+*** ../vim-7.2.048/src/proto/os_mswin.pro Sat May 5 19:07:50 2007
+--- src/proto/os_mswin.pro Thu Nov 20 16:41:00 2008
+***************
+*** 22,35 ****
+ int can_end_termcap_mode __ARGS((int give_msg));
+ int mch_screenmode __ARGS((char_u *arg));
+ int mch_libcall __ARGS((char_u *libname, char_u *funcname, char_u *argstring, int argint, char_u **string_result, int *number_result));
+! int utf8_to_ucs2 __ARGS((char_u *instr, int inlen, short_u *outstr, int *unconvlenp));
+! int ucs2_to_utf8 __ARGS((short_u *instr, int inlen, char_u *outstr));
+ void MultiByteToWideChar_alloc __ARGS((UINT cp, DWORD flags, LPCSTR in, int inlen, LPWSTR *out, int *outlen));
+ void WideCharToMultiByte_alloc __ARGS((UINT cp, DWORD flags, LPCWSTR in, int inlen, LPSTR *out, int *outlen, LPCSTR def, LPBOOL useddef));
+ int clip_mch_own_selection __ARGS((VimClipboard *cbd));
+ void clip_mch_lose_selection __ARGS((VimClipboard *cbd));
+! short_u *enc_to_ucs2 __ARGS((char_u *str, int *lenp));
+! char_u *ucs2_to_enc __ARGS((short_u *str, int *lenp));
+ void clip_mch_request_selection __ARGS((VimClipboard *cbd));
+ void acp_to_enc __ARGS((char_u *str, int str_size, char_u **out, int *outlen));
+ void clip_mch_set_selection __ARGS((VimClipboard *cbd));
+--- 22,35 ----
+ int can_end_termcap_mode __ARGS((int give_msg));
+ int mch_screenmode __ARGS((char_u *arg));
+ int mch_libcall __ARGS((char_u *libname, char_u *funcname, char_u *argstring, int argint, char_u **string_result, int *number_result));
+! int utf8_to_utf16 __ARGS((char_u *instr, int inlen, short_u *outstr, int *unconvlenp));
+! int utf16_to_utf8 __ARGS((short_u *instr, int inlen, char_u *outstr));
+ void MultiByteToWideChar_alloc __ARGS((UINT cp, DWORD flags, LPCSTR in, int inlen, LPWSTR *out, int *outlen));
+ void WideCharToMultiByte_alloc __ARGS((UINT cp, DWORD flags, LPCWSTR in, int inlen, LPSTR *out, int *outlen, LPCSTR def, LPBOOL useddef));
+ int clip_mch_own_selection __ARGS((VimClipboard *cbd));
+ void clip_mch_lose_selection __ARGS((VimClipboard *cbd));
+! short_u *enc_to_utf16 __ARGS((char_u *str, int *lenp));
+! char_u *utf16_to_enc __ARGS((short_u *str, int *lenp));
+ void clip_mch_request_selection __ARGS((VimClipboard *cbd));
+ void acp_to_enc __ARGS((char_u *str, int str_size, char_u **out, int *outlen));
+ void clip_mch_set_selection __ARGS((VimClipboard *cbd));
+*** ../vim-7.2.048/src/version.c Thu Nov 20 16:11:03 2008
+--- src/version.c Thu Nov 20 17:08:07 2008
+***************
+*** 678,679 ****
+--- 678,681 ----
+ { /* Add new patch number below this line */
++ /**/
++ 49,
+ /**/
+
+--
+FIRST HEAD: All right! All right! We'll kill him first and then have tea and
+ biscuits.
+ "Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ download, build and distribute -- http://www.A-A-P.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
--- /dev/null
+To: vim-dev@vim.org
+Subject: Patch 7.2.050
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=ISO-8859-1
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 7.2.050
+Problem: Warnings for not checking return value of fwrite(). (Chip Campbell)
+Solution: Use the return value.
+Files: src/spell.c
+
+
+*** ../vim-7.2.049/src/spell.c Mon Aug 25 04:12:38 2008
+--- src/spell.c Thu Nov 20 17:28:01 2008
+***************
+*** 7926,7931 ****
+--- 7926,7933 ----
+ char_u *p;
+ int rr;
+ int retval = OK;
++ int fwv = 1; /* collect return value of fwrite() to avoid
++ warnings from picky compiler */
+
+ fd = mch_fopen((char *)fname, "w");
+ if (fd == NULL)
+***************
+*** 7936,7946 ****
+
+ /* <HEADER>: <fileID> <versionnr> */
+ /* <fileID> */
+! if (fwrite(VIMSPELLMAGIC, VIMSPELLMAGICL, (size_t)1, fd) != 1)
+! {
+! EMSG(_(e_write));
+! retval = FAIL;
+! }
+ putc(VIMSPELLVERSION, fd); /* <versionnr> */
+
+ /*
+--- 7938,7944 ----
+
+ /* <HEADER>: <fileID> <versionnr> */
+ /* <fileID> */
+! fwv &= fwrite(VIMSPELLMAGIC, VIMSPELLMAGICL, (size_t)1, fd);
+ putc(VIMSPELLVERSION, fd); /* <versionnr> */
+
+ /*
+***************
+*** 7955,7961 ****
+
+ i = (int)STRLEN(spin->si_info);
+ put_bytes(fd, (long_u)i, 4); /* <sectionlen> */
+! fwrite(spin->si_info, (size_t)i, (size_t)1, fd); /* <infotext> */
+ }
+
+ /* SN_REGION: <regionname> ...
+--- 7953,7959 ----
+
+ i = (int)STRLEN(spin->si_info);
+ put_bytes(fd, (long_u)i, 4); /* <sectionlen> */
+! fwv &= fwrite(spin->si_info, (size_t)i, (size_t)1, fd); /* <infotext> */
+ }
+
+ /* SN_REGION: <regionname> ...
+***************
+*** 7966,7972 ****
+ putc(SNF_REQUIRED, fd); /* <sectionflags> */
+ l = spin->si_region_count * 2;
+ put_bytes(fd, (long_u)l, 4); /* <sectionlen> */
+! fwrite(spin->si_region_name, (size_t)l, (size_t)1, fd);
+ /* <regionname> ... */
+ regionmask = (1 << spin->si_region_count) - 1;
+ }
+--- 7964,7970 ----
+ putc(SNF_REQUIRED, fd); /* <sectionflags> */
+ l = spin->si_region_count * 2;
+ put_bytes(fd, (long_u)l, 4); /* <sectionlen> */
+! fwv &= fwrite(spin->si_region_name, (size_t)l, (size_t)1, fd);
+ /* <regionname> ... */
+ regionmask = (1 << spin->si_region_count) - 1;
+ }
+***************
+*** 8016,8022 ****
+ }
+
+ put_bytes(fd, (long_u)l, 2); /* <folcharslen> */
+! fwrite(folchars, (size_t)l, (size_t)1, fd); /* <folchars> */
+ }
+
+ /* SN_MIDWORD: <midword> */
+--- 8014,8020 ----
+ }
+
+ put_bytes(fd, (long_u)l, 2); /* <folcharslen> */
+! fwv &= fwrite(folchars, (size_t)l, (size_t)1, fd); /* <folchars> */
+ }
+
+ /* SN_MIDWORD: <midword> */
+***************
+*** 8027,8033 ****
+
+ i = (int)STRLEN(spin->si_midword);
+ put_bytes(fd, (long_u)i, 4); /* <sectionlen> */
+! fwrite(spin->si_midword, (size_t)i, (size_t)1, fd); /* <midword> */
+ }
+
+ /* SN_PREFCOND: <prefcondcnt> <prefcond> ... */
+--- 8025,8032 ----
+
+ i = (int)STRLEN(spin->si_midword);
+ put_bytes(fd, (long_u)i, 4); /* <sectionlen> */
+! fwv &= fwrite(spin->si_midword, (size_t)i, (size_t)1, fd);
+! /* <midword> */
+ }
+
+ /* SN_PREFCOND: <prefcondcnt> <prefcond> ... */
+***************
+*** 8113,8119 ****
+ p = rr == 1 ? ftp->ft_from : ftp->ft_to;
+ l = (int)STRLEN(p);
+ putc(l, fd);
+! fwrite(p, l, (size_t)1, fd);
+ }
+ }
+
+--- 8112,8118 ----
+ p = rr == 1 ? ftp->ft_from : ftp->ft_to;
+ l = (int)STRLEN(p);
+ putc(l, fd);
+! fwv &= fwrite(p, l, (size_t)1, fd);
+ }
+ }
+
+***************
+*** 8131,8141 ****
+ /* <sectionlen> */
+
+ put_bytes(fd, (long_u)l, 2); /* <sofofromlen> */
+! fwrite(spin->si_sofofr, l, (size_t)1, fd); /* <sofofrom> */
+
+ l = (int)STRLEN(spin->si_sofoto);
+ put_bytes(fd, (long_u)l, 2); /* <sofotolen> */
+! fwrite(spin->si_sofoto, l, (size_t)1, fd); /* <sofoto> */
+ }
+
+ /* SN_WORDS: <word> ...
+--- 8130,8140 ----
+ /* <sectionlen> */
+
+ put_bytes(fd, (long_u)l, 2); /* <sofofromlen> */
+! fwv &= fwrite(spin->si_sofofr, l, (size_t)1, fd); /* <sofofrom> */
+
+ l = (int)STRLEN(spin->si_sofoto);
+ put_bytes(fd, (long_u)l, 2); /* <sofotolen> */
+! fwv &= fwrite(spin->si_sofoto, l, (size_t)1, fd); /* <sofoto> */
+ }
+
+ /* SN_WORDS: <word> ...
+***************
+*** 8160,8166 ****
+ l = (int)STRLEN(hi->hi_key) + 1;
+ len += l;
+ if (round == 2) /* <word> */
+! fwrite(hi->hi_key, (size_t)l, (size_t)1, fd);
+ --todo;
+ }
+ if (round == 1)
+--- 8159,8165 ----
+ l = (int)STRLEN(hi->hi_key) + 1;
+ len += l;
+ if (round == 2) /* <word> */
+! fwv &= fwrite(hi->hi_key, (size_t)l, (size_t)1, fd);
+ --todo;
+ }
+ if (round == 1)
+***************
+*** 8176,8182 ****
+ putc(0, fd); /* <sectionflags> */
+ l = spin->si_map.ga_len;
+ put_bytes(fd, (long_u)l, 4); /* <sectionlen> */
+! fwrite(spin->si_map.ga_data, (size_t)l, (size_t)1, fd);
+ /* <mapstr> */
+ }
+
+--- 8175,8181 ----
+ putc(0, fd); /* <sectionflags> */
+ l = spin->si_map.ga_len;
+ put_bytes(fd, (long_u)l, 4); /* <sectionlen> */
+! fwv &= fwrite(spin->si_map.ga_data, (size_t)l, (size_t)1, fd);
+ /* <mapstr> */
+ }
+
+***************
+*** 8232,8241 ****
+ {
+ p = ((char_u **)(spin->si_comppat.ga_data))[i];
+ putc((int)STRLEN(p), fd); /* <comppatlen> */
+! fwrite(p, (size_t)STRLEN(p), (size_t)1, fd);/* <comppattext> */
+ }
+ /* <compflags> */
+! fwrite(spin->si_compflags, (size_t)STRLEN(spin->si_compflags),
+ (size_t)1, fd);
+ }
+
+--- 8231,8241 ----
+ {
+ p = ((char_u **)(spin->si_comppat.ga_data))[i];
+ putc((int)STRLEN(p), fd); /* <comppatlen> */
+! fwv &= fwrite(p, (size_t)STRLEN(p), (size_t)1, fd);
+! /* <comppattext> */
+ }
+ /* <compflags> */
+! fwv &= fwrite(spin->si_compflags, (size_t)STRLEN(spin->si_compflags),
+ (size_t)1, fd);
+ }
+
+***************
+*** 8259,8265 ****
+
+ l = (int)STRLEN(spin->si_syllable);
+ put_bytes(fd, (long_u)l, 4); /* <sectionlen> */
+! fwrite(spin->si_syllable, (size_t)l, (size_t)1, fd); /* <syllable> */
+ }
+
+ /* end of <SECTIONS> */
+--- 8259,8266 ----
+
+ l = (int)STRLEN(spin->si_syllable);
+ put_bytes(fd, (long_u)l, 4); /* <sectionlen> */
+! fwv &= fwrite(spin->si_syllable, (size_t)l, (size_t)1, fd);
+! /* <syllable> */
+ }
+
+ /* end of <SECTIONS> */
+***************
+*** 8295,8307 ****
+ (void)put_node(fd, tree, 0, regionmask, round == 3);
+ }
+
+! /* Write another byte to check for errors. */
+ if (putc(0, fd) == EOF)
+ retval = FAIL;
+
+ if (fclose(fd) == EOF)
+ retval = FAIL;
+
+ return retval;
+ }
+
+--- 8296,8313 ----
+ (void)put_node(fd, tree, 0, regionmask, round == 3);
+ }
+
+! /* Write another byte to check for errors (file system full). */
+ if (putc(0, fd) == EOF)
+ retval = FAIL;
+
+ if (fclose(fd) == EOF)
+ retval = FAIL;
+
++ if (fwv != 1)
++ retval = FAIL;
++ if (retval == FAIL)
++ EMSG(_(e_write));
++
+ return retval;
+ }
+
+***************
+*** 9890,9895 ****
+--- 9896,9902 ----
+ char_u *p;
+ int len;
+ int totlen;
++ int x = 1; /* collect return value of fwrite() */
+
+ if (fd != NULL)
+ put_bytes(fd, (long_u)gap->ga_len, 2); /* <prefcondcnt> */
+***************
+*** 9906,9912 ****
+ if (fd != NULL)
+ {
+ fputc(len, fd);
+! fwrite(p, (size_t)len, (size_t)1, fd);
+ }
+ totlen += len;
+ }
+--- 9913,9919 ----
+ if (fd != NULL)
+ {
+ fputc(len, fd);
+! x &= fwrite(p, (size_t)len, (size_t)1, fd);
+ }
+ totlen += len;
+ }
+*** ../vim-7.2.049/src/version.c Thu Nov 20 17:09:09 2008
+--- src/version.c Fri Nov 28 10:06:13 2008
+***************
+*** 678,679 ****
+--- 678,681 ----
+ { /* Add new patch number below this line */
++ /**/
++ 50,
+ /**/
+
+--
+You got to work at a mill? Lucky! I got sent back to work in the
+acid-mines for my daily crust of stale bread... which not even the
+birds would eat.
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ download, build and distribute -- http://www.A-A-P.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
--- /dev/null
+To: vim-dev@vim.org
+Subject: Patch 7.2.051
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=ISO-8859-1
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 7.2.051
+Problem: Can't avoid 'wildignore' and 'suffixes' for glob() and globpath().
+Solution: Add an extra argument to these functions. (Ingo Karkat)
+Files: src/eval.c, src/ex_getln.c, src/proto/ex_getln.pro,
+ runtime/doc/eval.txt, runtime/doc/options.txt
+
+
+*** ../vim-7.2.050/src/eval.c Thu Nov 20 16:11:03 2008
+--- src/eval.c Thu Nov 27 22:15:40 2008
+***************
+*** 7564,7571 ****
+ {"getwinposx", 0, 0, f_getwinposx},
+ {"getwinposy", 0, 0, f_getwinposy},
+ {"getwinvar", 2, 2, f_getwinvar},
+! {"glob", 1, 1, f_glob},
+! {"globpath", 2, 2, f_globpath},
+ {"has", 1, 1, f_has},
+ {"has_key", 2, 2, f_has_key},
+ {"haslocaldir", 0, 0, f_haslocaldir},
+--- 7564,7571 ----
+ {"getwinposx", 0, 0, f_getwinposx},
+ {"getwinposy", 0, 0, f_getwinposy},
+ {"getwinvar", 2, 2, f_getwinvar},
+! {"glob", 1, 2, f_glob},
+! {"globpath", 2, 3, f_globpath},
+ {"has", 1, 1, f_has},
+ {"has_key", 2, 2, f_has_key},
+ {"haslocaldir", 0, 0, f_haslocaldir},
+***************
+*** 9557,9563 ****
+ else
+ {
+ /* When the optional second argument is non-zero, don't remove matches
+! * for 'suffixes' and 'wildignore' */
+ if (argvars[1].v_type != VAR_UNKNOWN
+ && get_tv_number_chk(&argvars[1], &error))
+ flags |= WILD_KEEP_ALL;
+--- 9557,9563 ----
+ else
+ {
+ /* When the optional second argument is non-zero, don't remove matches
+! * for 'wildignore' and don't put matches for 'suffixes' at the end. */
+ if (argvars[1].v_type != VAR_UNKNOWN
+ && get_tv_number_chk(&argvars[1], &error))
+ flags |= WILD_KEEP_ALL;
+***************
+*** 11323,11335 ****
+ typval_T *argvars;
+ typval_T *rettv;
+ {
+ expand_T xpc;
+
+! ExpandInit(&xpc);
+! xpc.xp_context = EXPAND_FILES;
+! rettv->v_type = VAR_STRING;
+! rettv->vval.v_string = ExpandOne(&xpc, get_tv_string(&argvars[0]),
+! NULL, WILD_USE_NL|WILD_SILENT, WILD_ALL);
+ }
+
+ /*
+--- 11323,11347 ----
+ typval_T *argvars;
+ typval_T *rettv;
+ {
++ int flags = WILD_SILENT|WILD_USE_NL;
+ expand_T xpc;
++ int error = FALSE;
+
+! /* When the optional second argument is non-zero, don't remove matches
+! * for 'wildignore' and don't put matches for 'suffixes' at the end. */
+! if (argvars[1].v_type != VAR_UNKNOWN
+! && get_tv_number_chk(&argvars[1], &error))
+! flags |= WILD_KEEP_ALL;
+! rettv->v_type = VAR_STRING;
+! if (!error)
+! {
+! ExpandInit(&xpc);
+! xpc.xp_context = EXPAND_FILES;
+! rettv->vval.v_string = ExpandOne(&xpc, get_tv_string(&argvars[0]),
+! NULL, flags, WILD_ALL);
+! }
+! else
+! rettv->vval.v_string = NULL;
+ }
+
+ /*
+***************
+*** 11340,11353 ****
+ typval_T *argvars;
+ typval_T *rettv;
+ {
+ char_u buf1[NUMBUFLEN];
+ char_u *file = get_tv_string_buf_chk(&argvars[1], buf1);
+
+ rettv->v_type = VAR_STRING;
+! if (file == NULL)
+ rettv->vval.v_string = NULL;
+ else
+! rettv->vval.v_string = globpath(get_tv_string(&argvars[0]), file);
+ }
+
+ /*
+--- 11352,11373 ----
+ typval_T *argvars;
+ typval_T *rettv;
+ {
++ int flags = 0;
+ char_u buf1[NUMBUFLEN];
+ char_u *file = get_tv_string_buf_chk(&argvars[1], buf1);
++ int error = FALSE;
+
++ /* When the optional second argument is non-zero, don't remove matches
++ * for 'wildignore' and don't put matches for 'suffixes' at the end. */
++ if (argvars[2].v_type != VAR_UNKNOWN
++ && get_tv_number_chk(&argvars[2], &error))
++ flags |= WILD_KEEP_ALL;
+ rettv->v_type = VAR_STRING;
+! if (file == NULL || error)
+ rettv->vval.v_string = NULL;
+ else
+! rettv->vval.v_string = globpath(get_tv_string(&argvars[0]), file,
+! flags);
+ }
+
+ /*
+*** ../vim-7.2.050/src/ex_getln.c Sat Nov 15 14:10:23 2008
+--- src/ex_getln.c Thu Nov 20 18:37:20 2008
+***************
+*** 2524,2530 ****
+ && ccline.xpc->xp_context != EXPAND_NOTHING
+ && ccline.xpc->xp_context != EXPAND_UNSUCCESSFUL)
+ {
+! int i = ccline.xpc->xp_pattern - p;
+
+ /* If xp_pattern points inside the old cmdbuff it needs to be adjusted
+ * to point into the newly allocated memory. */
+--- 2524,2530 ----
+ && ccline.xpc->xp_context != EXPAND_NOTHING
+ && ccline.xpc->xp_context != EXPAND_UNSUCCESSFUL)
+ {
+! int i = (int)(ccline.xpc->xp_pattern - p);
+
+ /* If xp_pattern points inside the old cmdbuff it needs to be adjusted
+ * to point into the newly allocated memory. */
+***************
+*** 4897,4903 ****
+ if (s == NULL)
+ return FAIL;
+ sprintf((char *)s, "%s/%s*.vim", dirname, pat);
+! all = globpath(p_rtp, s);
+ vim_free(s);
+ if (all == NULL)
+ return FAIL;
+--- 4897,4903 ----
+ if (s == NULL)
+ return FAIL;
+ sprintf((char *)s, "%s/%s*.vim", dirname, pat);
+! all = globpath(p_rtp, s, 0);
+ vim_free(s);
+ if (all == NULL)
+ return FAIL;
+***************
+*** 4938,4946 ****
+ * newlines. Returns NULL for an error or no matches.
+ */
+ char_u *
+! globpath(path, file)
+ char_u *path;
+ char_u *file;
+ {
+ expand_T xpc;
+ char_u *buf;
+--- 4938,4947 ----
+ * newlines. Returns NULL for an error or no matches.
+ */
+ char_u *
+! globpath(path, file, expand_options)
+ char_u *path;
+ char_u *file;
++ int expand_options;
+ {
+ expand_T xpc;
+ char_u *buf;
+***************
+*** 4969,4978 ****
+ {
+ add_pathsep(buf);
+ STRCAT(buf, file);
+! if (ExpandFromContext(&xpc, buf, &num_p, &p, WILD_SILENT) != FAIL
+! && num_p > 0)
+ {
+! ExpandEscape(&xpc, buf, num_p, p, WILD_SILENT);
+ for (len = 0, i = 0; i < num_p; ++i)
+ len += (int)STRLEN(p[i]) + 1;
+
+--- 4970,4979 ----
+ {
+ add_pathsep(buf);
+ STRCAT(buf, file);
+! if (ExpandFromContext(&xpc, buf, &num_p, &p,
+! WILD_SILENT|expand_options) != FAIL && num_p > 0)
+ {
+! ExpandEscape(&xpc, buf, num_p, p, WILD_SILENT|expand_options);
+ for (len = 0, i = 0; i < num_p; ++i)
+ len += (int)STRLEN(p[i]) + 1;
+
+*** ../vim-7.2.050/src/proto/ex_getln.pro Wed May 28 16:49:01 2008
+--- src/proto/ex_getln.pro Thu Nov 20 18:27:57 2008
+***************
+*** 31,37 ****
+ void set_cmd_context __ARGS((expand_T *xp, char_u *str, int len, int col));
+ int expand_cmdline __ARGS((expand_T *xp, char_u *str, int col, int *matchcount, char_u ***matches));
+ int ExpandGeneric __ARGS((expand_T *xp, regmatch_T *regmatch, int *num_file, char_u ***file, char_u *((*func)(expand_T *, int))));
+! char_u *globpath __ARGS((char_u *path, char_u *file));
+ void init_history __ARGS((void));
+ int get_histtype __ARGS((char_u *name));
+ void add_to_history __ARGS((int histype, char_u *new_entry, int in_map, int sep));
+--- 31,37 ----
+ void set_cmd_context __ARGS((expand_T *xp, char_u *str, int len, int col));
+ int expand_cmdline __ARGS((expand_T *xp, char_u *str, int col, int *matchcount, char_u ***matches));
+ int ExpandGeneric __ARGS((expand_T *xp, regmatch_T *regmatch, int *num_file, char_u ***file, char_u *((*func)(expand_T *, int))));
+! char_u *globpath __ARGS((char_u *path, char_u *file, int expand_options));
+ void init_history __ARGS((void));
+ int get_histtype __ARGS((char_u *name));
+ void add_to_history __ARGS((int histype, char_u *new_entry, int in_map, int sep));
+*** ../vim-7.2.050/runtime/doc/eval.txt Sun Nov 9 13:43:25 2008
+--- runtime/doc/eval.txt Thu Nov 27 22:17:13 2008
+***************
+*** 1,4 ****
+! *eval.txt* For Vim version 7.2. Last change: 2008 Nov 02
+
+
+ VIM REFERENCE MANUAL by Bram Moolenaar
+--- 1,4 ----
+! *eval.txt* For Vim version 7.2. Last change: 2008 Nov 27
+
+
+ VIM REFERENCE MANUAL by Bram Moolenaar
+***************
+*** 1706,1712 ****
+ exists( {expr}) Number TRUE if {expr} exists
+ extend({expr1}, {expr2} [, {expr3}])
+ List/Dict insert items of {expr2} into {expr1}
+! expand( {expr}) String expand special keywords in {expr}
+ feedkeys( {string} [, {mode}]) Number add key sequence to typeahead buffer
+ filereadable( {file}) Number TRUE if {file} is a readable file
+ filewritable( {file}) Number TRUE if {file} is a writable file
+--- 1709,1715 ----
+ exists( {expr}) Number TRUE if {expr} exists
+ extend({expr1}, {expr2} [, {expr3}])
+ List/Dict insert items of {expr2} into {expr1}
+! expand( {expr} [, {flag}]) String expand special keywords in {expr}
+ feedkeys( {string} [, {mode}]) Number add key sequence to typeahead buffer
+ filereadable( {file}) Number TRUE if {file} is a readable file
+ filewritable( {file}) Number TRUE if {file} is a writable file
+***************
+*** 1758,1765 ****
+ getwinposx() Number X coord in pixels of GUI Vim window
+ getwinposy() Number Y coord in pixels of GUI Vim window
+ getwinvar( {nr}, {varname}) any variable {varname} in window {nr}
+! glob( {expr}) String expand file wildcards in {expr}
+! globpath( {path}, {expr}) String do glob({expr}) for all dirs in {path}
+ has( {feature}) Number TRUE if feature {feature} supported
+ has_key( {dict}, {key}) Number TRUE if {dict} has entry {key}
+ haslocaldir() Number TRUE if current window executed |:lcd|
+--- 1761,1769 ----
+ getwinposx() Number X coord in pixels of GUI Vim window
+ getwinposy() Number Y coord in pixels of GUI Vim window
+ getwinvar( {nr}, {varname}) any variable {varname} in window {nr}
+! glob( {expr} [, {flag}]) String expand file wildcards in {expr}
+! globpath( {path}, {expr} [, {flag}])
+! String do glob({expr}) for all dirs in {path}
+ has( {feature}) Number TRUE if feature {feature} supported
+ has_key( {dict}, {key}) Number TRUE if {dict} has entry {key}
+ haslocaldir() Number TRUE if current window executed |:lcd|
+***************
+*** 3286,3299 ****
+ :let list_is_on = getwinvar(2, '&list')
+ :echo "myvar = " . getwinvar(1, 'myvar')
+ <
+! *glob()*
+! glob({expr}) Expand the file wildcards in {expr}. See |wildcards| for the
+ use of special characters.
+ The result is a String.
+ When there are several matches, they are separated by <NL>
+ characters.
+! The 'wildignore' option applies: Names matching one of the
+! patterns in 'wildignore' will be skipped.
+ If the expansion fails, the result is an empty string.
+ A name for a non-existing file is not included.
+
+--- 3290,3305 ----
+ :let list_is_on = getwinvar(2, '&list')
+ :echo "myvar = " . getwinvar(1, 'myvar')
+ <
+! glob({expr} [, {flag}]) *glob()*
+! Expand the file wildcards in {expr}. See |wildcards| for the
+ use of special characters.
+ The result is a String.
+ When there are several matches, they are separated by <NL>
+ characters.
+! Unless the optional {flag} argument is given and is non-zero,
+! the 'suffixes' and 'wildignore' options apply: Names matching
+! one of the patterns in 'wildignore' will be skipped and
+! 'suffixes' affect the ordering of matches.
+ If the expansion fails, the result is an empty string.
+ A name for a non-existing file is not included.
+
+***************
+*** 3307,3326 ****
+ See |expand()| for expanding special Vim variables. See
+ |system()| for getting the raw output of an external command.
+
+! globpath({path}, {expr}) *globpath()*
+ Perform glob() on all directories in {path} and concatenate
+ the results. Example: >
+ :echo globpath(&rtp, "syntax/c.vim")
+ < {path} is a comma-separated list of directory names. Each
+ directory name is prepended to {expr} and expanded like with
+! glob(). A path separator is inserted when needed.
+ To add a comma inside a directory name escape it with a
+ backslash. Note that on MS-Windows a directory may have a
+ trailing backslash, remove it if you put a comma after it.
+ If the expansion fails for one of the directories, there is no
+ error message.
+! The 'wildignore' option applies: Names matching one of the
+! patterns in 'wildignore' will be skipped.
+
+ The "**" item can be used to search in a directory tree.
+ For example, to find all "README.txt" files in the directories
+--- 3313,3334 ----
+ See |expand()| for expanding special Vim variables. See
+ |system()| for getting the raw output of an external command.
+
+! globpath({path}, {expr} [, {flag}]) *globpath()*
+ Perform glob() on all directories in {path} and concatenate
+ the results. Example: >
+ :echo globpath(&rtp, "syntax/c.vim")
+ < {path} is a comma-separated list of directory names. Each
+ directory name is prepended to {expr} and expanded like with
+! |glob()|. A path separator is inserted when needed.
+ To add a comma inside a directory name escape it with a
+ backslash. Note that on MS-Windows a directory may have a
+ trailing backslash, remove it if you put a comma after it.
+ If the expansion fails for one of the directories, there is no
+ error message.
+! Unless the optional {flag} argument is given and is non-zero,
+! the 'suffixes' and 'wildignore' options apply: Names matching
+! one of the patterns in 'wildignore' will be skipped and
+! 'suffixes' affect the ordering of matches.
+
+ The "**" item can be used to search in a directory tree.
+ For example, to find all "README.txt" files in the directories
+*** ../vim-7.2.050/runtime/doc/options.txt Sat Aug 9 19:36:49 2008
+--- runtime/doc/options.txt Tue Nov 25 23:43:55 2008
+***************
+*** 1,4 ****
+! *options.txt* For Vim version 7.2. Last change: 2008 Aug 06
+
+
+ VIM REFERENCE MANUAL by Bram Moolenaar
+--- 1,4 ----
+! *options.txt* For Vim version 7.2. Last change: 2008 Nov 25
+
+
+ VIM REFERENCE MANUAL by Bram Moolenaar
+***************
+*** 7472,7478 ****
+ {not available when compiled without the |+wildignore|
+ feature}
+ A list of file patterns. A file that matches with one of these
+! patterns is ignored when completing file or directory names.
+ The pattern is used like with |:autocmd|, see |autocmd-patterns|.
+ Also see 'suffixes'.
+ Example: >
+--- 7481,7489 ----
+ {not available when compiled without the |+wildignore|
+ feature}
+ A list of file patterns. A file that matches with one of these
+! patterns is ignored when completing file or directory names, and
+! influences the result of |expand()|, |glob()| and |globpath()| unless
+! a flag is passed to disable this.
+ The pattern is used like with |:autocmd|, see |autocmd-patterns|.
+ Also see 'suffixes'.
+ Example: >
+*** ../vim-7.2.050/src/version.c Fri Nov 28 10:08:05 2008
+--- src/version.c Fri Nov 28 10:55:44 2008
+***************
+*** 678,679 ****
+--- 678,681 ----
+ { /* Add new patch number below this line */
++ /**/
++ 51,
+ /**/
+
+--
+Not too long ago, unzipping in public was illegal...
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ download, build and distribute -- http://www.A-A-P.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
--- /dev/null
+To: vim-dev@vim.org
+Subject: Patch 7.2.052
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=ISO-8859-1
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 7.2.052
+Problem: synIDattr() doesn't support "sp" for special color.
+Solution: Recognize "sp" and "sp#". (Matt Wozniski)
+Files: runtime/doc/eval.txt, src/eval.c
+
+
+*** ../vim-7.2.051/runtime/doc/eval.txt Fri Nov 28 10:59:57 2008
+--- runtime/doc/eval.txt Thu Nov 27 22:17:13 2008
+***************
+*** 5348,5357 ****
+ "fg" foreground color (GUI: color name used to set
+ the color, cterm: color number as a string,
+ term: empty string)
+! "bg" background color (like "fg")
+ "fg#" like "fg", but for the GUI and the GUI is
+ running the name in "#RRGGBB" form
+ "bg#" like "fg#" for "bg"
+ "bold" "1" if bold
+ "italic" "1" if italic
+ "reverse" "1" if reverse
+--- 5359,5370 ----
+ "fg" foreground color (GUI: color name used to set
+ the color, cterm: color number as a string,
+ term: empty string)
+! "bg" background color (as with "fg")
+! "sp" special color (as with "fg") |highlight-guisp|
+ "fg#" like "fg", but for the GUI and the GUI is
+ running the name in "#RRGGBB" form
+ "bg#" like "fg#" for "bg"
++ "sp#" like "fg#" for "sp"
+ "bold" "1" if bold
+ "italic" "1" if italic
+ "reverse" "1" if reverse
+*** ../vim-7.2.051/src/eval.c Fri Nov 28 10:59:57 2008
+--- src/eval.c Thu Nov 27 22:15:40 2008
+***************
+*** 16648,16655 ****
+ p = highlight_has_attr(id, HL_INVERSE, modec);
+ break;
+
+! case 's': /* standout */
+! p = highlight_has_attr(id, HL_STANDOUT, modec);
+ break;
+
+ case 'u':
+--- 16648,16658 ----
+ p = highlight_has_attr(id, HL_INVERSE, modec);
+ break;
+
+! case 's':
+! if (TOLOWER_ASC(what[1]) == 'p') /* sp[#] */
+! p = highlight_color(id, what, modec);
+! else /* standout */
+! p = highlight_has_attr(id, HL_STANDOUT, modec);
+ break;
+
+ case 'u':
+*** ../vim-7.2.051/src/version.c Fri Nov 28 10:59:57 2008
+--- src/version.c Fri Nov 28 11:13:45 2008
+***************
+*** 678,679 ****
+--- 678,681 ----
+ { /* Add new patch number below this line */
++ /**/
++ 52,
+ /**/
+
+--
+Not too long ago, a keyboard was something to make music with...
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ download, build and distribute -- http://www.A-A-P.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
--- /dev/null
+To: vim-dev@vim.org
+Subject: Patch 7.2.053
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=ISO-8859-1
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 7.2.053
+Problem: Crash when using WorkShop command ":ws foo". (Dominique Pelle)
+Solution: Avoid using a NULL pointer.
+Files: src/workshop.c
+
+
+*** ../vim-7.2.052/src/workshop.c Tue Jun 24 23:34:50 2008
+--- src/workshop.c Thu Nov 27 22:31:27 2008
+***************
+*** 1121,1128 ****
+ ? (char *)curbuf->b_sfname : "<None>");
+ #endif
+
+! strcpy(ffname, (char *) curbuf->b_ffname);
+! *filename = ffname; /* copy so nobody can change b_ffname */
+ *curLine = curwin->w_cursor.lnum;
+ *curCol = curwin->w_cursor.col;
+
+--- 1121,1132 ----
+ ? (char *)curbuf->b_sfname : "<None>");
+ #endif
+
+! if (curbuf->b_ffname == NULL)
+! ffname[0] = NUL;
+! else
+! /* copy so nobody can change b_ffname */
+! strcpy(ffname, (char *) curbuf->b_ffname);
+! *filename = ffname;
+ *curLine = curwin->w_cursor.lnum;
+ *curCol = curwin->w_cursor.col;
+
+*** ../vim-7.2.052/src/version.c Fri Nov 28 11:15:10 2008
+--- src/version.c Fri Nov 28 11:44:23 2008
+***************
+*** 678,679 ****
+--- 678,681 ----
+ { /* Add new patch number below this line */
++ /**/
++ 53,
+ /**/
+
+--
+What the word 'politics' means: 'Poli' in Latin meaning 'many' and 'tics'
+meaning 'bloodsucking creatures'.
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ download, build and distribute -- http://www.A-A-P.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
--- /dev/null
+To: vim-dev@vim.org
+Subject: Patch 7.2.054
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=ISO-8859-1
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 7.2.054
+Problem: Compilation warnings for format in getchar.c.
+Solution: Use fputs() instead of fprintf(). (Dominique Pelle)
+Files: src/getchar.c
+
+
+*** ../vim-7.2.053/src/getchar.c Tue Jul 22 18:58:23 2008
+--- src/getchar.c Thu Nov 27 22:38:24 2008
+***************
+*** 4702,4708 ****
+ return FAIL;
+ if (mp->m_noremap != REMAP_YES && fprintf(fd, "nore") < 0)
+ return FAIL;
+! if (fprintf(fd, cmd) < 0)
+ return FAIL;
+ if (buf != NULL && fputs(" <buffer>", fd) < 0)
+ return FAIL;
+--- 4702,4708 ----
+ return FAIL;
+ if (mp->m_noremap != REMAP_YES && fprintf(fd, "nore") < 0)
+ return FAIL;
+! if (fputs(cmd, fd) < 0)
+ return FAIL;
+ if (buf != NULL && fputs(" <buffer>", fd) < 0)
+ return FAIL;
+***************
+*** 4801,4807 ****
+ }
+ if (IS_SPECIAL(c) || modifiers) /* special key */
+ {
+! if (fprintf(fd, (char *)get_special_key_name(c, modifiers)) < 0)
+ return FAIL;
+ continue;
+ }
+--- 4801,4807 ----
+ }
+ if (IS_SPECIAL(c) || modifiers) /* special key */
+ {
+! if (fputs((char *)get_special_key_name(c, modifiers), fd) < 0)
+ return FAIL;
+ continue;
+ }
+*** ../vim-7.2.053/src/version.c Fri Nov 28 11:47:14 2008
+--- src/version.c Fri Nov 28 12:02:48 2008
+***************
+*** 678,679 ****
+--- 678,681 ----
+ { /* Add new patch number below this line */
++ /**/
++ 54,
+ /**/
+
+--
+Not too long ago, compress was something you did to garbage...
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ download, build and distribute -- http://www.A-A-P.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
--- /dev/null
+To: vim-dev@vim.org
+Subject: Patch 7.2.055
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=ISO-8859-1
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 7.2.055
+Problem: Various compiler warnings with strict checking.
+Solution: Avoid the warnings by using return values and renaming.
+Files: src/diff.c, src/eval.c, src/ex_cmds.c, src/ex_docmd.c,
+ src/fileio.c, src/fold.c, src/globals.h, src/gui.c,
+ src/gui_at_sb.c, src/gui_gtk_x11.c, src/gui_xmdlg.c,
+ src/gui_xmebw.c, src/main.c, src/mbyte.c, src/message.c,
+ src/netbeans.c, src/option.c, src/os_unix.c, src/spell.c,
+ src/ui.c, src/window.c
+
+
+*** ../vim-7.2.054/src/diff.c Fri Jan 18 17:39:32 2008
+--- src/diff.c Fri Nov 28 17:23:35 2008
+***************
+*** 661,666 ****
+--- 665,671 ----
+ char_u *tmp_diff;
+ FILE *fd;
+ int ok;
++ int io_error = FALSE;
+
+ /* Delete all diffblocks. */
+ diff_clear(curtab);
+***************
+*** 697,714 ****
+ {
+ ok = FALSE;
+ fd = mch_fopen((char *)tmp_orig, "w");
+! if (fd != NULL)
+ {
+! fwrite("line1\n", (size_t)6, (size_t)1, fd);
+ fclose(fd);
+ fd = mch_fopen((char *)tmp_new, "w");
+! if (fd != NULL)
+ {
+! fwrite("line2\n", (size_t)6, (size_t)1, fd);
+ fclose(fd);
+ diff_file(tmp_orig, tmp_new, tmp_diff);
+ fd = mch_fopen((char *)tmp_diff, "r");
+! if (fd != NULL)
+ {
+ char_u linebuf[LBUFLEN];
+
+--- 702,727 ----
+ {
+ ok = FALSE;
+ fd = mch_fopen((char *)tmp_orig, "w");
+! if (fd == NULL)
+! io_error = TRUE;
+! else
+ {
+! if (fwrite("line1\n", (size_t)6, (size_t)1, fd) != 1)
+! io_error = TRUE;
+ fclose(fd);
+ fd = mch_fopen((char *)tmp_new, "w");
+! if (fd == NULL)
+! io_error = TRUE;
+! else
+ {
+! if (fwrite("line2\n", (size_t)6, (size_t)1, fd) != 1)
+! io_error = TRUE;
+ fclose(fd);
+ diff_file(tmp_orig, tmp_new, tmp_diff);
+ fd = mch_fopen((char *)tmp_diff, "r");
+! if (fd == NULL)
+! io_error = TRUE;
+! else
+ {
+ char_u linebuf[LBUFLEN];
+
+***************
+*** 761,766 ****
+--- 774,781 ----
+ }
+ if (!ok)
+ {
++ if (io_error)
++ EMSG(_("E810: Cannot read or write temp files"));
+ EMSG(_("E97: Cannot create diffs"));
+ diff_a_works = MAYBE;
+ #if defined(MSWIN) || defined(MSDOS)
+***************
+*** 925,934 ****
+ {
+ # ifdef TEMPDIRNAMES
+ if (vim_tempdir != NULL)
+! mch_chdir((char *)vim_tempdir);
+ else
+ # endif
+! mch_chdir("/tmp");
+ shorten_fnames(TRUE);
+ }
+ #endif
+--- 940,949 ----
+ {
+ # ifdef TEMPDIRNAMES
+ if (vim_tempdir != NULL)
+! ignored = mch_chdir((char *)vim_tempdir);
+ else
+ # endif
+! ignored = mch_chdir("/tmp");
+ shorten_fnames(TRUE);
+ }
+ #endif
+*** ../vim-7.2.054/src/eval.c Fri Nov 28 11:15:10 2008
+--- src/eval.c Fri Nov 28 12:23:13 2008
+***************
+*** 10641,10647 ****
+ # ifdef FEAT_WINDOWS
+ win_T *wp;
+ # endif
+! int n = 1;
+
+ if (row >= 0 && col >= 0)
+ {
+--- 10641,10647 ----
+ # ifdef FEAT_WINDOWS
+ win_T *wp;
+ # endif
+! int winnr = 1;
+
+ if (row >= 0 && col >= 0)
+ {
+***************
+*** 10651,10659 ****
+ (void)mouse_comp_pos(win, &row, &col, &lnum);
+ # ifdef FEAT_WINDOWS
+ for (wp = firstwin; wp != win; wp = wp->w_next)
+! ++n;
+ # endif
+! vimvars[VV_MOUSE_WIN].vv_nr = n;
+ vimvars[VV_MOUSE_LNUM].vv_nr = lnum;
+ vimvars[VV_MOUSE_COL].vv_nr = col + 1;
+ }
+--- 10651,10659 ----
+ (void)mouse_comp_pos(win, &row, &col, &lnum);
+ # ifdef FEAT_WINDOWS
+ for (wp = firstwin; wp != win; wp = wp->w_next)
+! ++winnr;
+ # endif
+! vimvars[VV_MOUSE_WIN].vv_nr = winnr;
+ vimvars[VV_MOUSE_LNUM].vv_nr = lnum;
+ vimvars[VV_MOUSE_COL].vv_nr = col + 1;
+ }
+*** ../vim-7.2.054/src/ex_cmds.c Sat Nov 15 14:10:23 2008
+--- src/ex_cmds.c Fri Nov 28 17:24:08 2008
+***************
+*** 1941,1947 ****
+ * root.
+ */
+ if (fp_out != NULL)
+! (void)fchown(fileno(fp_out), st_old.st_uid, st_old.st_gid);
+ #endif
+ }
+ }
+--- 1941,1947 ----
+ * root.
+ */
+ if (fp_out != NULL)
+! ignored = fchown(fileno(fp_out), st_old.st_uid, st_old.st_gid);
+ #endif
+ }
+ }
+*** ../vim-7.2.054/src/ex_docmd.c Sat Nov 15 14:10:23 2008
+--- src/ex_docmd.c Fri Nov 28 17:26:13 2008
+***************
+*** 8753,8760 ****
+ else if (*dirnow != NUL
+ && (ssop_flags & SSOP_CURDIR) && globaldir != NULL)
+ {
+! (void)mch_chdir((char *)globaldir);
+! shorten_fnames(TRUE);
+ }
+
+ failed |= (makeopens(fd, dirnow) == FAIL);
+--- 8753,8760 ----
+ else if (*dirnow != NUL
+ && (ssop_flags & SSOP_CURDIR) && globaldir != NULL)
+ {
+! if (mch_chdir((char *)globaldir) == OK)
+! shorten_fnames(TRUE);
+ }
+
+ failed |= (makeopens(fd, dirnow) == FAIL);
+*** ../vim-7.2.054/src/fileio.c Wed Nov 12 16:04:43 2008
+--- src/fileio.c Fri Nov 28 17:35:54 2008
+***************
+*** 2214,2220 ****
+ {
+ /* Use stderr for stdin, makes shell commands work. */
+ close(0);
+! dup(2);
+ }
+ #endif
+
+--- 2214,2220 ----
+ {
+ /* Use stderr for stdin, makes shell commands work. */
+ close(0);
+! ignored = dup(2);
+ }
+ #endif
+
+***************
+*** 3449,3455 ****
+ {
+ # ifdef UNIX
+ # ifdef HAVE_FCHOWN
+! fchown(fd, st_old.st_uid, st_old.st_gid);
+ # endif
+ if (mch_stat((char *)IObuff, &st) < 0
+ || st.st_uid != st_old.st_uid
+--- 3449,3455 ----
+ {
+ # ifdef UNIX
+ # ifdef HAVE_FCHOWN
+! ignored = fchown(fd, st_old.st_uid, st_old.st_gid);
+ # endif
+ if (mch_stat((char *)IObuff, &st) < 0
+ || st.st_uid != st_old.st_uid
+***************
+*** 4365,4371 ****
+ || st.st_uid != st_old.st_uid
+ || st.st_gid != st_old.st_gid)
+ {
+! fchown(fd, st_old.st_uid, st_old.st_gid);
+ if (perm >= 0) /* set permission again, may have changed */
+ (void)mch_setperm(wfname, perm);
+ }
+--- 4365,4371 ----
+ || st.st_uid != st_old.st_uid
+ || st.st_gid != st_old.st_gid)
+ {
+! ignored = fchown(fd, st_old.st_uid, st_old.st_gid);
+ if (perm >= 0) /* set permission again, may have changed */
+ (void)mch_setperm(wfname, perm);
+ }
+***************
+*** 6030,6038 ****
+ {
+ tbuf[FGETS_SIZE - 2] = NUL;
+ #ifdef USE_CR
+! fgets_cr((char *)tbuf, FGETS_SIZE, fp);
+ #else
+! fgets((char *)tbuf, FGETS_SIZE, fp);
+ #endif
+ } while (tbuf[FGETS_SIZE - 2] != NUL && tbuf[FGETS_SIZE - 2] != '\n');
+ }
+--- 6030,6038 ----
+ {
+ tbuf[FGETS_SIZE - 2] = NUL;
+ #ifdef USE_CR
+! ignoredp = fgets_cr((char *)tbuf, FGETS_SIZE, fp);
+ #else
+! ignoredp = fgets((char *)tbuf, FGETS_SIZE, fp);
+ #endif
+ } while (tbuf[FGETS_SIZE - 2] != NUL && tbuf[FGETS_SIZE - 2] != '\n');
+ }
+*** ../vim-7.2.054/src/fold.c Wed Aug 6 18:59:40 2008
+--- src/fold.c Fri Nov 28 12:24:16 2008
+***************
+*** 48,54 ****
+ static int foldFind __ARGS((garray_T *gap, linenr_T lnum, fold_T **fpp));
+ static int foldLevelWin __ARGS((win_T *wp, linenr_T lnum));
+ static void checkupdate __ARGS((win_T *wp));
+! static void setFoldRepeat __ARGS((linenr_T lnum, long count, int open));
+ static linenr_T setManualFold __ARGS((linenr_T lnum, int opening, int recurse, int *donep));
+ static linenr_T setManualFoldWin __ARGS((win_T *wp, linenr_T lnum, int opening, int recurse, int *donep));
+ static void foldOpenNested __ARGS((fold_T *fpr));
+--- 48,54 ----
+ static int foldFind __ARGS((garray_T *gap, linenr_T lnum, fold_T **fpp));
+ static int foldLevelWin __ARGS((win_T *wp, linenr_T lnum));
+ static void checkupdate __ARGS((win_T *wp));
+! static void setFoldRepeat __ARGS((linenr_T lnum, long count, int do_open));
+ static linenr_T setManualFold __ARGS((linenr_T lnum, int opening, int recurse, int *donep));
+ static linenr_T setManualFoldWin __ARGS((win_T *wp, linenr_T lnum, int opening, int recurse, int *donep));
+ static void foldOpenNested __ARGS((fold_T *fpr));
+***************
+*** 1241,1250 ****
+ * Repeat "count" times.
+ */
+ static void
+! setFoldRepeat(lnum, count, open)
+ linenr_T lnum;
+ long count;
+! int open;
+ {
+ int done;
+ long n;
+--- 1241,1250 ----
+ * Repeat "count" times.
+ */
+ static void
+! setFoldRepeat(lnum, count, do_open)
+ linenr_T lnum;
+ long count;
+! int do_open;
+ {
+ int done;
+ long n;
+***************
+*** 1252,1258 ****
+ for (n = 0; n < count; ++n)
+ {
+ done = DONE_NOTHING;
+! (void)setManualFold(lnum, open, FALSE, &done);
+ if (!(done & DONE_ACTION))
+ {
+ /* Only give an error message when no fold could be opened. */
+--- 1252,1258 ----
+ for (n = 0; n < count; ++n)
+ {
+ done = DONE_NOTHING;
+! (void)setManualFold(lnum, do_open, FALSE, &done);
+ if (!(done & DONE_ACTION))
+ {
+ /* Only give an error message when no fold could be opened. */
+*** ../vim-7.2.054/src/globals.h Thu Sep 18 21:29:07 2008
+--- src/globals.h Fri Nov 28 17:35:50 2008
+***************
+*** 1549,1554 ****
+--- 1549,1562 ----
+ EXTERN time_t starttime;
+
+ /*
++ * Some compilers warn for not using a return value, but in some situations we
++ * can't do anything useful with the value. Assign to this variable to avoid
++ * the warning.
++ */
++ EXTERN int ignored;
++ EXTERN char *ignoredp;
++
++ /*
+ * Optional Farsi support. Include it here, so EXTERN and INIT are defined.
+ */
+ #ifdef FEAT_FKMAP
+*** ../vim-7.2.054/src/gui.c Wed Aug 6 14:37:26 2008
+--- src/gui.c Fri Nov 28 18:48:31 2008
+***************
+*** 139,145 ****
+ /* The read returns when the child closes the pipe (or when
+ * the child dies for some reason). */
+ close(pipefd[1]);
+! (void)read(pipefd[0], &dummy, (size_t)1);
+ close(pipefd[0]);
+ }
+
+--- 139,145 ----
+ /* The read returns when the child closes the pipe (or when
+ * the child dies for some reason). */
+ close(pipefd[1]);
+! ignored = (int)read(pipefd[0], &dummy, (size_t)1);
+ close(pipefd[0]);
+ }
+
+*** ../vim-7.2.054/src/gui_at_sb.c Sun Jun 13 21:37:13 2004
+--- src/gui_at_sb.c Fri Nov 28 12:19:19 2008
+***************
+*** 1078,1083 ****
+--- 1078,1089 ----
+ Cardinal *num_params; /* unused */
+ {
+ ScrollbarWidget sbw = (ScrollbarWidget)w;
++ /* Use a union to avoid a warning for the weird conversion from float to
++ * XtPointer. Comes from Xaw/Scrollbar.c. */
++ union {
++ XtPointer xtp;
++ float xtf;
++ } xtpf;
+
+ if (LookAhead(w, event))
+ return;
+***************
+*** 1085,1091 ****
+ /* thumbProc is not pretty, but is necessary for backwards
+ compatibility on those architectures for which it work{s,ed};
+ the intent is to pass a (truncated) float by value. */
+! XtCallCallbacks(w, XtNthumbProc, *(XtPointer*)&sbw->scrollbar.top);
+ XtCallCallbacks(w, XtNjumpProc, (XtPointer)&sbw->scrollbar.top);
+ }
+
+--- 1091,1098 ----
+ /* thumbProc is not pretty, but is necessary for backwards
+ compatibility on those architectures for which it work{s,ed};
+ the intent is to pass a (truncated) float by value. */
+! xtpf.xtf = sbw->scrollbar.top;
+! XtCallCallbacks(w, XtNthumbProc, xtpf.xtp);
+ XtCallCallbacks(w, XtNjumpProc, (XtPointer)&sbw->scrollbar.top);
+ }
+
+*** ../vim-7.2.054/src/gui_gtk_x11.c Tue Jul 8 12:46:08 2008
+--- src/gui_gtk_x11.c Fri Nov 28 21:06:38 2008
+***************
+*** 4070,4083 ****
+
+ if (mask & (XValue | YValue))
+ {
+! int w, h;
+! gui_mch_get_screen_dimensions(&w, &h);
+! h += p_ghr + get_menu_tool_height();
+! w += get_menu_tool_width();
+ if (mask & XNegative)
+! x += w - pixel_width;
+ if (mask & YNegative)
+! y += h - pixel_height;
+ #ifdef HAVE_GTK2
+ gtk_window_move(GTK_WINDOW(gui.mainwin), x, y);
+ #else
+--- 4070,4083 ----
+
+ if (mask & (XValue | YValue))
+ {
+! int ww, hh;
+! gui_mch_get_screen_dimensions(&ww, &hh);
+! hh += p_ghr + get_menu_tool_height();
+! ww += get_menu_tool_width();
+ if (mask & XNegative)
+! x += ww - pixel_width;
+ if (mask & YNegative)
+! y += hh - pixel_height;
+ #ifdef HAVE_GTK2
+ gtk_window_move(GTK_WINDOW(gui.mainwin), x, y);
+ #else
+*** ../vim-7.2.054/src/gui_xmdlg.c Tue Jun 24 23:39:32 2008
+--- src/gui_xmdlg.c Fri Nov 28 21:04:08 2008
+***************
+*** 369,378 ****
+ char buf[TEMP_BUF_SIZE];
+ XmString items[MAX_ENTRIES_IN_LIST];
+ int i;
+! int index;
+
+! for (index = (int)ENCODING; index < (int)NONE; ++index)
+! count[index] = 0;
+
+ /* First we insert the wild char into every single list. */
+ if (fix != ENCODING)
+--- 369,378 ----
+ char buf[TEMP_BUF_SIZE];
+ XmString items[MAX_ENTRIES_IN_LIST];
+ int i;
+! int idx;
+
+! for (idx = (int)ENCODING; idx < (int)NONE; ++idx)
+! count[idx] = 0;
+
+ /* First we insert the wild char into every single list. */
+ if (fix != ENCODING)
+***************
+*** 503,516 ****
+ /*
+ * Now loop trough the remaining lists and set them up.
+ */
+! for (index = (int)NAME; index < (int)NONE; ++index)
+ {
+ Widget w;
+
+! if (fix == (enum ListSpecifier)index)
+ continue;
+
+! switch ((enum ListSpecifier)index)
+ {
+ case NAME:
+ w = data->list[NAME];
+--- 503,516 ----
+ /*
+ * Now loop trough the remaining lists and set them up.
+ */
+! for (idx = (int)NAME; idx < (int)NONE; ++idx)
+ {
+ Widget w;
+
+! if (fix == (enum ListSpecifier)idx)
+ continue;
+
+! switch ((enum ListSpecifier)idx)
+ {
+ case NAME:
+ w = data->list[NAME];
+***************
+*** 525,545 ****
+ w = (Widget)0; /* for lint */
+ }
+
+! for (i = 0; i < count[index]; ++i)
+ {
+! items[i] = XmStringCreateLocalized(list[index][i]);
+! XtFree(list[index][i]);
+ }
+ XmListDeleteAllItems(w);
+! XmListAddItems(w, items, count[index], 1);
+! if (data->sel[index])
+ {
+ XmStringFree(items[0]);
+! items[0] = XmStringCreateLocalized(data->sel[index]);
+ XmListSelectItem(w, items[0], False);
+ XmListSetBottomItem(w, items[0]);
+ }
+! for (i = 0; i < count[index]; ++i)
+ XmStringFree(items[i]);
+ }
+ }
+--- 525,545 ----
+ w = (Widget)0; /* for lint */
+ }
+
+! for (i = 0; i < count[idx]; ++i)
+ {
+! items[i] = XmStringCreateLocalized(list[idx][i]);
+! XtFree(list[idx][i]);
+ }
+ XmListDeleteAllItems(w);
+! XmListAddItems(w, items, count[idx], 1);
+! if (data->sel[idx])
+ {
+ XmStringFree(items[0]);
+! items[0] = XmStringCreateLocalized(data->sel[idx]);
+ XmListSelectItem(w, items[0], False);
+ XmListSetBottomItem(w, items[0]);
+ }
+! for (i = 0; i < count[idx]; ++i)
+ XmStringFree(items[i]);
+ }
+ }
+***************
+*** 695,708 ****
+ int n;
+ XmString str;
+ Arg args[4];
+! char *msg = _("no specific match");
+
+ n = 0;
+! str = XmStringCreateLocalized(msg);
+ XtSetArg(args[n], XmNlabelString, str); ++n;
+ XtSetValues(data->sample, args, n);
+ apply_fontlist(data->sample);
+! XmTextSetString(data->name, msg);
+ XmStringFree(str);
+
+ return False;
+--- 695,708 ----
+ int n;
+ XmString str;
+ Arg args[4];
+! char *nomatch_msg = _("no specific match");
+
+ n = 0;
+! str = XmStringCreateLocalized(nomatch_msg);
+ XtSetArg(args[n], XmNlabelString, str); ++n;
+ XtSetValues(data->sample, args, n);
+ apply_fontlist(data->sample);
+! XmTextSetString(data->name, nomatch_msg);
+ XmStringFree(str);
+
+ return False;
+***************
+*** 886,906 ****
+ {
+ int i;
+ int max;
+! int index = 0;
+ int size;
+! char str[128];
+
+ for (i = 0, max = 0; i < data->num; i++)
+ {
+! get_part(fn(data, i), 7, str);
+! size = atoi(str);
+ if ((size > max) && (size < MAX_DISPLAY_SIZE))
+ {
+! index = i;
+ max = size;
+ }
+ }
+! strcpy(big_font, fn(data, index));
+ }
+ data->old = XLoadQueryFont(XtDisplay(parent), big_font);
+ data->old_list = gui_motif_create_fontlist(data->old);
+--- 886,906 ----
+ {
+ int i;
+ int max;
+! int idx = 0;
+ int size;
+! char buf[128];
+
+ for (i = 0, max = 0; i < data->num; i++)
+ {
+! get_part(fn(data, i), 7, buf);
+! size = atoi(buf);
+ if ((size > max) && (size < MAX_DISPLAY_SIZE))
+ {
+! idx = i;
+ max = size;
+ }
+ }
+! strcpy(big_font, fn(data, idx));
+ }
+ data->old = XLoadQueryFont(XtDisplay(parent), big_font);
+ data->old_list = gui_motif_create_fontlist(data->old);
+***************
+*** 1217,1244 ****
+
+ if (i != 0)
+ {
+! char name[TEMP_BUF_SIZE];
+! char style[TEMP_BUF_SIZE];
+! char size[TEMP_BUF_SIZE];
+! char encoding[TEMP_BUF_SIZE];
+ char *found;
+
+ found = names[0];
+
+! name_part(found, name);
+! style_part(found, style);
+! size_part(found, size, data->in_pixels);
+! encoding_part(found, encoding);
+!
+! if (strlen(name) > 0
+! && strlen(style) > 0
+! && strlen(size) > 0
+! && strlen(encoding) > 0)
+ {
+! data->sel[NAME] = XtNewString(name);
+! data->sel[STYLE] = XtNewString(style);
+! data->sel[SIZE] = XtNewString(size);
+! data->sel[ENCODING] = XtNewString(encoding);
+ data->font_name = XtNewString(names[0]);
+ display_sample(data);
+ XmTextSetString(data->name, data->font_name);
+--- 1217,1244 ----
+
+ if (i != 0)
+ {
+! char namebuf[TEMP_BUF_SIZE];
+! char stylebuf[TEMP_BUF_SIZE];
+! char sizebuf[TEMP_BUF_SIZE];
+! char encodingbuf[TEMP_BUF_SIZE];
+ char *found;
+
+ found = names[0];
+
+! name_part(found, namebuf);
+! style_part(found, stylebuf);
+! size_part(found, sizebuf, data->in_pixels);
+! encoding_part(found, encodingbuf);
+!
+! if (strlen(namebuf) > 0
+! && strlen(stylebuf) > 0
+! && strlen(sizebuf) > 0
+! && strlen(encodingbuf) > 0)
+ {
+! data->sel[NAME] = XtNewString(namebuf);
+! data->sel[STYLE] = XtNewString(stylebuf);
+! data->sel[SIZE] = XtNewString(sizebuf);
+! data->sel[ENCODING] = XtNewString(encodingbuf);
+ data->font_name = XtNewString(names[0]);
+ display_sample(data);
+ XmTextSetString(data->name, data->font_name);
+*** ../vim-7.2.054/src/gui_xmebw.c Thu Nov 8 20:48:14 2007
+--- src/gui_xmebw.c Fri Nov 28 18:58:53 2008
+***************
+*** 1256,1262 ****
+ }
+ else
+ {
+! int adjust = 0;
+
+ #if !defined(LESSTIF_VERSION) && (XmVersion > 1002)
+ /*
+--- 1256,1262 ----
+ }
+ else
+ {
+! adjust = 0;
+
+ #if !defined(LESSTIF_VERSION) && (XmVersion > 1002)
+ /*
+***************
+*** 1268,1279 ****
+ {
+ case XmEXTERNAL_HIGHLIGHT:
+ adjust = (eb->primitive.highlight_thickness -
+! (eb->pushbutton.default_button_shadow_thickness ?
+! Xm3D_ENHANCE_PIXEL : 0));
+ break;
+
+ case XmINTERNAL_HIGHLIGHT:
+- adjust = 0;
+ break;
+
+ default:
+--- 1268,1278 ----
+ {
+ case XmEXTERNAL_HIGHLIGHT:
+ adjust = (eb->primitive.highlight_thickness -
+! (eb->pushbutton.default_button_shadow_thickness
+! ? Xm3D_ENHANCE_PIXEL : 0));
+ break;
+
+ case XmINTERNAL_HIGHLIGHT:
+ break;
+
+ default:
+*** ../vim-7.2.054/src/main.c Thu Nov 20 14:11:47 2008
+--- src/main.c Fri Nov 28 18:32:48 2008
+***************
+*** 2372,2378 ****
+ * Is there any other system that cannot do this?
+ */
+ close(0);
+! dup(2);
+ #endif
+ }
+
+--- 2372,2378 ----
+ * Is there any other system that cannot do this?
+ */
+ close(0);
+! ignored = dup(2);
+ #endif
+ }
+
+*** ../vim-7.2.054/src/mbyte.c Thu Nov 20 17:09:09 2008
+--- src/mbyte.c Fri Nov 28 18:44:05 2008
+***************
+*** 717,723 ****
+ * where mblen() returns 0 for invalid character.
+ * Therefore, following condition includes 0.
+ */
+! (void)mblen(NULL, 0); /* First reset the state. */
+ if (mblen(buf, (size_t)1) <= 0)
+ n = 2;
+ else
+--- 717,723 ----
+ * where mblen() returns 0 for invalid character.
+ * Therefore, following condition includes 0.
+ */
+! ignored = mblen(NULL, 0); /* First reset the state. */
+ if (mblen(buf, (size_t)1) <= 0)
+ n = 2;
+ else
+***************
+*** 5278,5284 ****
+
+ /*ARGSUSED*/
+ static void
+! preedit_start_cbproc(XIC xic, XPointer client_data, XPointer call_data)
+ {
+ #ifdef XIM_DEBUG
+ xim_log("xim_decide_input_style()\n");
+--- 5278,5284 ----
+
+ /*ARGSUSED*/
+ static void
+! preedit_start_cbproc(XIC thexic, XPointer client_data, XPointer call_data)
+ {
+ #ifdef XIM_DEBUG
+ xim_log("xim_decide_input_style()\n");
+***************
+*** 5312,5318 ****
+
+ /*ARGSUSED*/
+ static void
+! preedit_draw_cbproc(XIC xic, XPointer client_data, XPointer call_data)
+ {
+ XIMPreeditDrawCallbackStruct *draw_data;
+ XIMText *text;
+--- 5312,5318 ----
+
+ /*ARGSUSED*/
+ static void
+! preedit_draw_cbproc(XIC thexic, XPointer client_data, XPointer call_data)
+ {
+ XIMPreeditDrawCallbackStruct *draw_data;
+ XIMText *text;
+***************
+*** 5453,5459 ****
+
+ /*ARGSUSED*/
+ static void
+! preedit_caret_cbproc(XIC xic, XPointer client_data, XPointer call_data)
+ {
+ #ifdef XIM_DEBUG
+ xim_log("preedit_caret_cbproc()\n");
+--- 5453,5459 ----
+
+ /*ARGSUSED*/
+ static void
+! preedit_caret_cbproc(XIC thexic, XPointer client_data, XPointer call_data)
+ {
+ #ifdef XIM_DEBUG
+ xim_log("preedit_caret_cbproc()\n");
+***************
+*** 5462,5468 ****
+
+ /*ARGSUSED*/
+ static void
+! preedit_done_cbproc(XIC xic, XPointer client_data, XPointer call_data)
+ {
+ #ifdef XIM_DEBUG
+ xim_log("preedit_done_cbproc()\n");
+--- 5462,5468 ----
+
+ /*ARGSUSED*/
+ static void
+! preedit_done_cbproc(XIC thexic, XPointer client_data, XPointer call_data)
+ {
+ #ifdef XIM_DEBUG
+ xim_log("preedit_done_cbproc()\n");
+*** ../vim-7.2.054/src/message.c Sun Jul 13 19:18:44 2008
+--- src/message.c Fri Nov 28 12:26:56 2008
+***************
+*** 4585,4645 ****
+ if (remove_trailing_zeroes)
+ {
+ int i;
+! char *p;
+
+ /* Using %g or %G: remove superfluous zeroes. */
+ if (fmt_spec == 'f')
+! p = tmp + str_arg_l - 1;
+ else
+ {
+! p = (char *)vim_strchr((char_u *)tmp,
+ fmt_spec == 'e' ? 'e' : 'E');
+! if (p != NULL)
+ {
+ /* Remove superfluous '+' and leading
+ * zeroes from the exponent. */
+! if (p[1] == '+')
+ {
+ /* Change "1.0e+07" to "1.0e07" */
+! STRMOVE(p + 1, p + 2);
+ --str_arg_l;
+ }
+! i = (p[1] == '-') ? 2 : 1;
+! while (p[i] == '0')
+ {
+ /* Change "1.0e07" to "1.0e7" */
+! STRMOVE(p + i, p + i + 1);
+ --str_arg_l;
+ }
+! --p;
+ }
+ }
+
+! if (p != NULL && !precision_specified)
+ /* Remove trailing zeroes, but keep the one
+ * just after a dot. */
+! while (p > tmp + 2 && *p == '0' && p[-1] != '.')
+ {
+! STRMOVE(p, p + 1);
+! --p;
+ --str_arg_l;
+ }
+ }
+ else
+ {
+! char *p;
+
+ /* Be consistent: some printf("%e") use 1.0e+12
+ * and some 1.0e+012. Remove one zero in the last
+ * case. */
+! p = (char *)vim_strchr((char_u *)tmp,
+ fmt_spec == 'e' ? 'e' : 'E');
+! if (p != NULL && (p[1] == '+' || p[1] == '-')
+! && p[2] == '0'
+! && vim_isdigit(p[3])
+! && vim_isdigit(p[4]))
+ {
+! STRMOVE(p + 2, p + 3);
+ --str_arg_l;
+ }
+ }
+--- 4585,4646 ----
+ if (remove_trailing_zeroes)
+ {
+ int i;
+! char *tp;
+
+ /* Using %g or %G: remove superfluous zeroes. */
+ if (fmt_spec == 'f')
+! tp = tmp + str_arg_l - 1;
+ else
+ {
+! tp = (char *)vim_strchr((char_u *)tmp,
+ fmt_spec == 'e' ? 'e' : 'E');
+! if (tp != NULL)
+ {
+ /* Remove superfluous '+' and leading
+ * zeroes from the exponent. */
+! if (tp[1] == '+')
+ {
+ /* Change "1.0e+07" to "1.0e07" */
+! STRMOVE(tp + 1, tp + 2);
+ --str_arg_l;
+ }
+! i = (tp[1] == '-') ? 2 : 1;
+! while (tp[i] == '0')
+ {
+ /* Change "1.0e07" to "1.0e7" */
+! STRMOVE(tp + i, tp + i + 1);
+ --str_arg_l;
+ }
+! --tp;
+ }
+ }
+
+! if (tp != NULL && !precision_specified)
+ /* Remove trailing zeroes, but keep the one
+ * just after a dot. */
+! while (tp > tmp + 2 && *tp == '0'
+! && tp[-1] != '.')
+ {
+! STRMOVE(tp, tp + 1);
+! --tp;
+ --str_arg_l;
+ }
+ }
+ else
+ {
+! char *tp;
+
+ /* Be consistent: some printf("%e") use 1.0e+12
+ * and some 1.0e+012. Remove one zero in the last
+ * case. */
+! tp = (char *)vim_strchr((char_u *)tmp,
+ fmt_spec == 'e' ? 'e' : 'E');
+! if (tp != NULL && (tp[1] == '+' || tp[1] == '-')
+! && tp[2] == '0'
+! && vim_isdigit(tp[3])
+! && vim_isdigit(tp[4]))
+ {
+! STRMOVE(tp + 2, tp + 3);
+ --str_arg_l;
+ }
+ }
+*** ../vim-7.2.054/src/netbeans.c Sat Nov 15 14:10:23 2008
+--- src/netbeans.c Fri Nov 28 18:51:43 2008
+***************
+*** 1043,1049 ****
+ nbdebug(("EVT: %s", buf));
+ /* nb_send(buf, "netbeans_end"); avoid "write failed" messages */
+ if (sd >= 0)
+! sock_write(sd, buf, (int)STRLEN(buf)); /* ignore errors */
+ }
+ }
+
+--- 1043,1049 ----
+ nbdebug(("EVT: %s", buf));
+ /* nb_send(buf, "netbeans_end"); avoid "write failed" messages */
+ if (sd >= 0)
+! ignored = sock_write(sd, buf, (int)STRLEN(buf));
+ }
+ }
+
+***************
+*** 2277,2285 ****
+ int serNum;
+ int localTypeNum;
+ int typeNum;
+- # ifdef NBDEBUG
+- int len;
+- # endif
+ pos_T *pos;
+
+ if (buf == NULL || buf->bufp == NULL)
+--- 2277,2282 ----
+***************
+*** 2303,2315 ****
+ pos = get_off_or_lnum(buf->bufp, &args);
+
+ cp = (char *)args;
+! # ifdef NBDEBUG
+! len =
+! # endif
+! strtol(cp, &cp, 10);
+ args = (char_u *)cp;
+ # ifdef NBDEBUG
+! if (len != -1)
+ {
+ nbdebug((" partial line annotation -- Not Yet Implemented!\n"));
+ }
+--- 2300,2309 ----
+ pos = get_off_or_lnum(buf->bufp, &args);
+
+ cp = (char *)args;
+! ignored = (int)strtol(cp, &cp, 10);
+ args = (char_u *)cp;
+ # ifdef NBDEBUG
+! if (ignored != -1)
+ {
+ nbdebug((" partial line annotation -- Not Yet Implemented!\n"));
+ }
+*** ../vim-7.2.054/src/option.c Sun Nov 9 13:43:25 2008
+--- src/option.c Fri Nov 28 12:27:34 2008
+***************
+*** 8232,8244 ****
+ {
+ if (number == 0 && string != NULL)
+ {
+! int index;
+
+ /* Either we are given a string or we are setting option
+ * to zero. */
+! for (index = 0; string[index] == '0'; ++index)
+ ;
+! if (string[index] != NUL || index == 0)
+ {
+ /* There's another character after zeros or the string
+ * is empty. In both cases, we are trying to set a
+--- 8232,8244 ----
+ {
+ if (number == 0 && string != NULL)
+ {
+! int idx;
+
+ /* Either we are given a string or we are setting option
+ * to zero. */
+! for (idx = 0; string[idx] == '0'; ++idx)
+ ;
+! if (string[idx] != NUL || idx == 0)
+ {
+ /* There's another character after zeros or the string
+ * is empty. In both cases, we are trying to set a
+*** ../vim-7.2.054/src/os_unix.c Wed Nov 12 14:09:38 2008
+--- src/os_unix.c Fri Nov 28 18:39:55 2008
+***************
+*** 315,326 ****
+ {-1, "Unknown!", FALSE}
+ };
+
+ void
+ mch_write(s, len)
+ char_u *s;
+ int len;
+ {
+! write(1, (char *)s, len);
+ if (p_wd) /* Unix is too fast, slow down a bit more */
+ RealWaitForChar(read_cmd_fd, p_wd, NULL);
+ }
+--- 315,329 ----
+ {-1, "Unknown!", FALSE}
+ };
+
++ /*
++ * Write s[len] to the screen.
++ */
+ void
+ mch_write(s, len)
+ char_u *s;
+ int len;
+ {
+! ignored = (int)write(1, (char *)s, len);
+ if (p_wd) /* Unix is too fast, slow down a bit more */
+ RealWaitForChar(read_cmd_fd, p_wd, NULL);
+ }
+***************
+*** 3927,3935 ****
+ */
+ if (fd >= 0)
+ {
+! dup(fd); /* To replace stdin (file descriptor 0) */
+! dup(fd); /* To replace stdout (file descriptor 1) */
+! dup(fd); /* To replace stderr (file descriptor 2) */
+
+ /* Don't need this now that we've duplicated it */
+ close(fd);
+--- 3930,3938 ----
+ */
+ if (fd >= 0)
+ {
+! ignored = dup(fd); /* To replace stdin (fd 0) */
+! ignored = dup(fd); /* To replace stdout (fd 1) */
+! ignored = dup(fd); /* To replace stderr (fd 2) */
+
+ /* Don't need this now that we've duplicated it */
+ close(fd);
+***************
+*** 3997,4009 ****
+
+ /* set up stdin/stdout/stderr for the child */
+ close(0);
+! dup(pty_slave_fd);
+ close(1);
+! dup(pty_slave_fd);
+ if (gui.in_use)
+ {
+ close(2);
+! dup(pty_slave_fd);
+ }
+
+ close(pty_slave_fd); /* has been dupped, close it now */
+--- 4000,4012 ----
+
+ /* set up stdin/stdout/stderr for the child */
+ close(0);
+! ignored = dup(pty_slave_fd);
+ close(1);
+! ignored = dup(pty_slave_fd);
+ if (gui.in_use)
+ {
+ close(2);
+! ignored = dup(pty_slave_fd);
+ }
+
+ close(pty_slave_fd); /* has been dupped, close it now */
+***************
+*** 4014,4026 ****
+ /* set up stdin for the child */
+ close(fd_toshell[1]);
+ close(0);
+! dup(fd_toshell[0]);
+ close(fd_toshell[0]);
+
+ /* set up stdout for the child */
+ close(fd_fromshell[0]);
+ close(1);
+! dup(fd_fromshell[1]);
+ close(fd_fromshell[1]);
+
+ # ifdef FEAT_GUI
+--- 4017,4029 ----
+ /* set up stdin for the child */
+ close(fd_toshell[1]);
+ close(0);
+! ignored = dup(fd_toshell[0]);
+ close(fd_toshell[0]);
+
+ /* set up stdout for the child */
+ close(fd_fromshell[0]);
+ close(1);
+! ignored = dup(fd_fromshell[1]);
+ close(fd_fromshell[1]);
+
+ # ifdef FEAT_GUI
+***************
+*** 4028,4034 ****
+ {
+ /* set up stderr for the child */
+ close(2);
+! dup(1);
+ }
+ # endif
+ }
+--- 4031,4037 ----
+ {
+ /* set up stderr for the child */
+ close(2);
+! ignored = dup(1);
+ }
+ # endif
+ }
+***************
+*** 4159,4165 ****
+ && (lnum !=
+ curbuf->b_ml.ml_line_count
+ || curbuf->b_p_eol)))
+! write(toshell_fd, "\n", (size_t)1);
+ ++lnum;
+ if (lnum > curbuf->b_op_end.lnum)
+ {
+--- 4162,4169 ----
+ && (lnum !=
+ curbuf->b_ml.ml_line_count
+ || curbuf->b_p_eol)))
+! ignored = write(toshell_fd, "\n",
+! (size_t)1);
+ ++lnum;
+ if (lnum > curbuf->b_op_end.lnum)
+ {
+*** ../vim-7.2.054/src/spell.c Fri Nov 28 10:08:05 2008
+--- src/spell.c Fri Nov 28 12:28:24 2008
+***************
+*** 4950,4956 ****
+ static void put_sugtime __ARGS((spellinfo_T *spin, FILE *fd));
+ static int write_vim_spell __ARGS((spellinfo_T *spin, char_u *fname));
+ static void clear_node __ARGS((wordnode_T *node));
+! static int put_node __ARGS((FILE *fd, wordnode_T *node, int index, int regionmask, int prefixtree));
+ static void spell_make_sugfile __ARGS((spellinfo_T *spin, char_u *wfname));
+ static int sug_filltree __ARGS((spellinfo_T *spin, slang_T *slang));
+ static int sug_maketable __ARGS((spellinfo_T *spin));
+--- 4950,4956 ----
+ static void put_sugtime __ARGS((spellinfo_T *spin, FILE *fd));
+ static int write_vim_spell __ARGS((spellinfo_T *spin, char_u *fname));
+ static void clear_node __ARGS((wordnode_T *node));
+! static int put_node __ARGS((FILE *fd, wordnode_T *node, int idx, int regionmask, int prefixtree));
+ static void spell_make_sugfile __ARGS((spellinfo_T *spin, char_u *wfname));
+ static int sug_filltree __ARGS((spellinfo_T *spin, slang_T *slang));
+ static int sug_maketable __ARGS((spellinfo_T *spin));
+*** ../vim-7.2.054/src/ui.c Sun Sep 14 15:57:54 2008
+--- src/ui.c Fri Nov 28 19:04:36 2008
+***************
+*** 1820,1826 ****
+ #ifdef HAVE_DUP
+ /* Use stderr for stdin, also works for shell commands. */
+ close(0);
+! dup(2);
+ #else
+ read_cmd_fd = 2; /* read from stderr instead of stdin */
+ #endif
+--- 1820,1826 ----
+ #ifdef HAVE_DUP
+ /* Use stderr for stdin, also works for shell commands. */
+ close(0);
+! ignored = dup(2);
+ #else
+ read_cmd_fd = 2; /* read from stderr instead of stdin */
+ #endif
+*** ../vim-7.2.054/src/window.c Sat Nov 15 14:10:23 2008
+--- src/window.c Fri Nov 28 18:46:45 2008
+***************
+*** 4029,4042 ****
+ if (mch_dirname(cwd, MAXPATHL) == OK)
+ globaldir = vim_strsave(cwd);
+ }
+! mch_chdir((char *)curwin->w_localdir);
+! shorten_fnames(TRUE);
+ }
+ else if (globaldir != NULL)
+ {
+ /* Window doesn't have a local directory and we are not in the global
+ * directory: Change to the global directory. */
+! mch_chdir((char *)globaldir);
+ vim_free(globaldir);
+ globaldir = NULL;
+ shorten_fnames(TRUE);
+--- 4029,4042 ----
+ if (mch_dirname(cwd, MAXPATHL) == OK)
+ globaldir = vim_strsave(cwd);
+ }
+! if (mch_chdir((char *)curwin->w_localdir) == 0)
+! shorten_fnames(TRUE);
+ }
+ else if (globaldir != NULL)
+ {
+ /* Window doesn't have a local directory and we are not in the global
+ * directory: Change to the global directory. */
+! ignored = mch_chdir((char *)globaldir);
+ vim_free(globaldir);
+ globaldir = NULL;
+ shorten_fnames(TRUE);
+*** ../vim-7.2.054/src/version.c Fri Nov 28 12:05:07 2008
+--- src/version.c Fri Nov 28 21:12:42 2008
+***************
+*** 678,679 ****
+--- 678,681 ----
+ { /* Add new patch number below this line */
++ /**/
++ 55,
+ /**/
+
+--
+PRINCE: He's come to rescue me, father.
+LAUNCELOT: (embarrassed) Well, let's not jump to conclusions ...
+ "Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ download, build and distribute -- http://www.A-A-P.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
--- /dev/null
+To: vim-dev@vim.org
+Subject: Patch 7.2.056
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=ISO-8859-1
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 7.2.056 (after 7.2.050)
+Problem: Tests 58 and 59 fail.
+Solution: Don't invoke fwrite() with a zero length. (Dominique Pelle)
+Files: src/spell.c
+
+
+*** ../vim-7.2.055/src/spell.c Fri Nov 28 21:26:50 2008
+--- src/spell.c Sat Nov 29 19:58:21 2008
+***************
+*** 8112,8118 ****
+ p = rr == 1 ? ftp->ft_from : ftp->ft_to;
+ l = (int)STRLEN(p);
+ putc(l, fd);
+! fwv &= fwrite(p, l, (size_t)1, fd);
+ }
+ }
+
+--- 8218,8225 ----
+ p = rr == 1 ? ftp->ft_from : ftp->ft_to;
+ l = (int)STRLEN(p);
+ putc(l, fd);
+! if (l > 0)
+! fwv &= fwrite(p, l, (size_t)1, fd);
+ }
+ }
+
+*** ../vim-7.2.055/src/version.c Fri Nov 28 21:26:50 2008
+--- src/version.c Sat Nov 29 20:10:05 2008
+***************
+*** 678,679 ****
+--- 678,681 ----
+ { /* Add new patch number below this line */
++ /**/
++ 56,
+ /**/
+
+--
+GUARD #1: Where'd you get the coconut?
+ARTHUR: We found them.
+GUARD #1: Found them? In Mercea? The coconut's tropical!
+ARTHUR: What do you mean?
+GUARD #1: Well, this is a temperate zone.
+ The Quest for the Holy Grail (Monty Python)
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ download, build and distribute -- http://www.A-A-P.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
--- /dev/null
+To: vim-dev@vim.org
+Subject: Patch 7.2.057
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=ISO-8859-1
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 7.2.057 (after 7.2.056)
+Problem: Combination of int and size_t may not work.
+Solution: Use size_t for variable.
+Files: src/spell.c
+
+
+*** ../vim-7.2.056/src/spell.c Sat Nov 29 20:10:59 2008
+--- src/spell.c Sat Nov 29 20:15:43 2008
+***************
+*** 7926,7932 ****
+ char_u *p;
+ int rr;
+ int retval = OK;
+! int fwv = 1; /* collect return value of fwrite() to avoid
+ warnings from picky compiler */
+
+ fd = mch_fopen((char *)fname, "w");
+--- 8028,8034 ----
+ char_u *p;
+ int rr;
+ int retval = OK;
+! size_t fwv = 1; /* collect return value of fwrite() to avoid
+ warnings from picky compiler */
+
+ fd = mch_fopen((char *)fname, "w");
+***************
+*** 7939,7944 ****
+--- 8041,8050 ----
+ /* <HEADER>: <fileID> <versionnr> */
+ /* <fileID> */
+ fwv &= fwrite(VIMSPELLMAGIC, VIMSPELLMAGICL, (size_t)1, fd);
++ if (fwv != (size_t)1)
++ /* Catch first write error, don't try writing more. */
++ goto theend;
++
+ putc(VIMSPELLVERSION, fd); /* <versionnr> */
+
+ /*
+***************
+*** 8300,8310 ****
+ /* Write another byte to check for errors (file system full). */
+ if (putc(0, fd) == EOF)
+ retval = FAIL;
+!
+ if (fclose(fd) == EOF)
+ retval = FAIL;
+
+! if (fwv != 1)
+ retval = FAIL;
+ if (retval == FAIL)
+ EMSG(_(e_write));
+--- 8406,8416 ----
+ /* Write another byte to check for errors (file system full). */
+ if (putc(0, fd) == EOF)
+ retval = FAIL;
+! theend:
+ if (fclose(fd) == EOF)
+ retval = FAIL;
+
+! if (fwv != (size_t)1)
+ retval = FAIL;
+ if (retval == FAIL)
+ EMSG(_(e_write));
+***************
+*** 9897,9903 ****
+ char_u *p;
+ int len;
+ int totlen;
+! int x = 1; /* collect return value of fwrite() */
+
+ if (fd != NULL)
+ put_bytes(fd, (long_u)gap->ga_len, 2); /* <prefcondcnt> */
+--- 10003,10009 ----
+ char_u *p;
+ int len;
+ int totlen;
+! size_t x = 1; /* collect return value of fwrite() */
+
+ if (fd != NULL)
+ put_bytes(fd, (long_u)gap->ga_len, 2); /* <prefcondcnt> */
+*** ../vim-7.2.056/src/version.c Sat Nov 29 20:10:59 2008
+--- src/version.c Sat Nov 29 20:13:46 2008
+***************
+*** 678,679 ****
+--- 678,681 ----
+ { /* Add new patch number below this line */
++ /**/
++ 57,
+ /**/
+
+--
+GUARD #1: What -- a swallow carrying a coconut?
+ARTHUR: It could grip it by the husk!
+GUARD #1: It's not a question of where he grips it! It's a simple question
+ of weight ratios! A five ounce bird could not carry a 1 pound
+ coconut.
+ The Quest for the Holy Grail (Monty Python)
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ download, build and distribute -- http://www.A-A-P.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
--- /dev/null
+To: vim-dev@vim.org
+Subject: Patch 7.2.058
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=ISO-8859-1
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 7.2.058
+Problem: Can't add a patch name to the ":version" output.
+Solution: Add the extra_patches array.
+Files: src/version.c
+
+
+*** ../vim-7.2.057/src/version.c Sat Nov 29 20:18:44 2008
+--- src/version.c Sun Nov 30 12:12:31 2008
+***************
+*** 794,799 ****
+--- 796,814 ----
+ 0
+ };
+
++ /*
++ * Place to put a short description when adding a feature with a patch.
++ * Keep it short, e.g.,: "relative numbers", "persistent undo".
++ * Also add a comment marker to separate the lines.
++ * See the official Vim patches for the diff format: It must use a context of
++ * one line only. Use "diff -C2".
++ */
++ static char *(extra_patches[]) =
++ { /* Add your patch description below this line */
++ /**/
++ NULL
++ };
++
+ int
+ highest_patch()
+ {
+***************
+*** 939,944 ****
+--- 954,972 ----
+ }
+ }
+
++ /* Print the list of extra patch descriptions if there is at least one. */
++ if (extra_patches[0] != NULL)
++ {
++ MSG_PUTS(_("\nExtra patches: "));
++ s = "";
++ for (i = 0; extra_patches[i] != NULL; ++i)
++ {
++ MSG_PUTS(s);
++ s = ", ";
++ MSG_PUTS(extra_patches[i]);
++ }
++ }
++
+ #ifdef MODIFIED_BY
+ MSG_PUTS("\n");
+ MSG_PUTS(_("Modified by "));
+*** ../vim-7.2.057/src/version.c Sat Nov 29 20:18:44 2008
+--- src/version.c Sun Nov 30 12:12:31 2008
+***************
+*** 678,679 ****
+--- 678,681 ----
+ { /* Add new patch number below this line */
++ /**/
++ 58,
+ /**/
+
+--
+ARTHUR: Well, it doesn't matter. Will you go and tell your master that
+ Arthur from the Court of Camelot is here.
+GUARD #1: Listen, in order to maintain air-speed velocity, a swallow
+ needs to beat its wings 43 times every second, right?
+ARTHUR: Please!
+ The Quest for the Holy Grail (Monty Python)
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ download, build and distribute -- http://www.A-A-P.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
--- /dev/null
+To: vim-dev@vim.org
+Subject: Patch 7.2.059
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=ISO-8859-1
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 7.2.059
+Problem: Diff display is not always updated.
+Solution: Update the display more often.
+Files: src/diff.c
+
+
+*** ../vim-7.2.058/src/diff.c Fri Nov 28 21:26:50 2008
+--- src/diff.c Fri Nov 28 17:23:35 2008
+***************
+*** 73,78 ****
+--- 73,80 ----
+ {
+ tp->tp_diffbuf[i] = NULL;
+ tp->tp_diff_invalid = TRUE;
++ if (tp == curtab)
++ diff_redraw(TRUE);
+ }
+ }
+ }
+***************
+*** 102,107 ****
+--- 104,110 ----
+ {
+ curtab->tp_diffbuf[i] = NULL;
+ curtab->tp_diff_invalid = TRUE;
++ diff_redraw(TRUE);
+ }
+ }
+ }
+***************
+*** 131,136 ****
+--- 134,140 ----
+ {
+ curtab->tp_diffbuf[i] = buf;
+ curtab->tp_diff_invalid = TRUE;
++ diff_redraw(TRUE);
+ return;
+ }
+
+*** ../vim-7.2.058/src/version.c Sun Nov 30 12:14:35 2008
+--- src/version.c Sun Nov 30 15:13:18 2008
+***************
+*** 678,679 ****
+--- 678,681 ----
+ { /* Add new patch number below this line */
++ /**/
++ 59,
+ /**/
+
+--
+GUARD #2: Wait a minute -- supposing two swallows carried it together?
+GUARD #1: No, they'd have to have it on a line.
+GUARD #2: Well, simple! They'd just use a standard creeper!
+GUARD #1: What, held under the dorsal guiding feathers?
+GUARD #2: Well, why not?
+ The Quest for the Holy Grail (Monty Python)
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ download, build and distribute -- http://www.A-A-P.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
--- /dev/null
+To: vim-dev@vim.org
+Subject: Patch 7.2.060
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=ISO-8859-1
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 7.2.060
+Problem: When a spell files has many compound rules it may take a very long
+ time making the list of suggestions. Displaying also can be slow
+ when there are misspelled words.
+ Can't parse some Hunspell .aff files.
+Solution: Check if a compounding can possibly work before trying a
+ combination, if the compound rules don't contain wildcards.
+ Implement using CHECKCOMPOUNDPATTERN.
+ Ignore COMPOUNDRULES. Ignore a comment after most items.
+ Accept ONLYINCOMPOUND as an alias for NEEDCOMPOUND.
+ Accept FORBIDDENWORD as an alias for BAD.
+Files: runtime/doc/spell.txt, src/spell.c
+
+
+*** ../vim-7.2.059/runtime/doc/spell.txt Sat Aug 9 19:36:52 2008
+--- runtime/doc/spell.txt Sun Nov 30 16:30:02 2008
+***************
+*** 1,4 ****
+! *spell.txt* For Vim version 7.2. Last change: 2008 Jun 21
+
+
+ VIM REFERENCE MANUAL by Bram Moolenaar
+--- 1,4 ----
+! *spell.txt* For Vim version 7.2. Last change: 2008 Nov 30
+
+
+ VIM REFERENCE MANUAL by Bram Moolenaar
+***************
+*** 831,838 ****
+
+ # comment line ~
+
+! With some items it's also possible to put a comment after it, but this isn't
+! supported in general.
+
+
+ ENCODING *spell-SET*
+--- 831,841 ----
+
+ # comment line ~
+
+! Items with a fixed number of arguments can be followed by a comment. But only
+! if none of the arguments can contain white space. The comment must start with
+! a "#" character. Example:
+!
+! KEEPCASE = # fix case for words with this flag ~
+
+
+ ENCODING *spell-SET*
+***************
+*** 965,970 ****
+--- 968,976 ----
+
+ Note: When using utf-8 only characters up to 65000 may be used for flags.
+
++ Note: even when using "num" or "long" the number of flags available to
++ compounding and prefixes is limited to about 250.
++
+
+ AFFIXES
+ *spell-PFX* *spell-SFX*
+***************
+*** 1178,1183 ****
+--- 1185,1193 ----
+ The flag also applies to the word with affixes, thus this can be used to mark
+ a whole bunch of related words as bad.
+
++ *spell-FORBIDDENWORD*
++ FORBIDDENWORD can be used just like BAD. For compatibility with Hunspell.
++
+ *spell-NEEDAFFIX*
+ The NEEDAFFIX flag is used to require that a word is used with an affix. The
+ word itself is not a good word (unless there is an empty affix). Example:
+***************
+*** 1268,1273 ****
+--- 1278,1287 ----
+
+ NEEDCOMPOUND & ~
+
++ *spell-ONLYINCOMPOUND*
++ The ONLYINCOMPOUND does exactly the same as NEEDCOMPOUND. Supported for
++ compatiblity with Hunspell.
++
+ *spell-COMPOUNDMIN*
+ The minimal character length of a word used for compounding is specified with
+ COMPOUNDMIN. Example:
+***************
+*** 1328,1333 ****
+--- 1342,1361 ----
+ rules. Can also be used for an affix to count the affix as a compounding
+ word.
+
++ *spell-CHECKCOMPOUNDPATTERN*
++ CHECKCOMPOUNDPATTERN is used to define patterns that, when matching at the
++ position where two words are compounded together forbids the compound.
++ For example:
++ CHECKCOMPOUNDPATTERN o e ~
++
++ This forbids compounding if the first word ends in "o" and the second word
++ starts with "e".
++
++ The arguments must be plain text, no patterns are actually supported, despite
++ the item name. Case is always ignored.
++
++ The Hunspell feature to use three arguments and flags is not supported.
++
+ *spell-SYLLABLE*
+ The SYLLABLE item defines characters or character sequences that are used to
+ count the number of syllables in a word. Example:
+***************
+*** 1496,1501 ****
+--- 1524,1533 ----
+ ACCENT (Hunspell) *spell-ACCENT*
+ Use MAP instead. |spell-MAP|
+
++ BREAK (Hunspell) *spell-BREAK*
++ Define break points. Unclear how it works exactly.
++ Not supported.
++
+ CHECKCOMPOUNDCASE (Hunspell) *spell-CHECKCOMPOUNDCASE*
+ Disallow uppercase letters at compound word boundaries.
+ Not supported.
+***************
+*** 1512,1520 ****
+ Forbid three identical characters when compounding. Not
+ supported.
+
+- CHECKCOMPOUNDPATTERN (Hunspell) *spell-CHECKCOMPOUNDPATTERN*
+- Forbid compounding when patterns match. Not supported.
+-
+ COMPLEXPREFIXES (Hunspell) *spell-COMPLEXPREFIXES*
+ Enables using two prefixes. Not supported.
+
+--- 1544,1549 ----
+***************
+*** 1536,1548 ****
+ COMPOUNDMIDDLE (Hunspell) *spell-COMPOUNDMIDDLE*
+ Use COMPOUNDRULE instead. |spell-COMPOUNDRULE|
+
+ COMPOUNDSYLLABLE (Hunspell) *spell-COMPOUNDSYLLABLE*
+ Use SYLLABLE and COMPOUNDSYLMAX instead. |spell-SYLLABLE|
+ |spell-COMPOUNDSYLMAX|
+
+! FORBIDDENWORD (Hunspell) *spell-FORBIDDENWORD*
+! Use BAD instead. |spell-BAD|
+!
+ LANG (Hunspell) *spell-LANG*
+ This specifies language-specific behavior. This actually
+ moves part of the language knowledge into the program,
+--- 1565,1582 ----
+ COMPOUNDMIDDLE (Hunspell) *spell-COMPOUNDMIDDLE*
+ Use COMPOUNDRULE instead. |spell-COMPOUNDRULE|
+
++ COMPOUNDRULES (Hunspell) *spell-COMPOUNDRULES*
++ Number of COMPOUNDRULE lines following. Ignored, but the
++ argument must be a number.
++
+ COMPOUNDSYLLABLE (Hunspell) *spell-COMPOUNDSYLLABLE*
+ Use SYLLABLE and COMPOUNDSYLMAX instead. |spell-SYLLABLE|
+ |spell-COMPOUNDSYLMAX|
+
+! KEY (Hunspell) *spell-KEY*
+! Define characters that are close together on the keyboard.
+! Used to give better suggestions. Not supported.
+!
+ LANG (Hunspell) *spell-LANG*
+ This specifies language-specific behavior. This actually
+ moves part of the language knowledge into the program,
+***************
+*** 1553,1562 ****
+ Only needed for morphological analysis.
+
+ MAXNGRAMSUGS (Hunspell) *spell-MAXNGRAMSUGS*
+! Not supported.
+!
+! ONLYINCOMPOUND (Hunspell) *spell-ONLYINCOMPOUND*
+! Use NEEDCOMPOUND instead. |spell-NEEDCOMPOUND|
+
+ PSEUDOROOT (Hunspell) *spell-PSEUDOROOT*
+ Use NEEDAFFIX instead. |spell-NEEDAFFIX|
+--- 1587,1593 ----
+ Only needed for morphological analysis.
+
+ MAXNGRAMSUGS (Hunspell) *spell-MAXNGRAMSUGS*
+! Set number of n-gram suggestions. Not supported.
+
+ PSEUDOROOT (Hunspell) *spell-PSEUDOROOT*
+ Use NEEDAFFIX instead. |spell-NEEDAFFIX|
+*** ../vim-7.2.059/src/spell.c Sat Nov 29 20:18:44 2008
+--- src/spell.c Sun Nov 30 20:59:13 2008
+***************
+*** 469,474 ****
+--- 469,475 ----
+ garray_T sl_comppat; /* CHECKCOMPOUNDPATTERN items */
+ regprog_T *sl_compprog; /* COMPOUNDRULE turned into a regexp progrm
+ * (NULL when no compounding) */
++ char_u *sl_comprules; /* all COMPOUNDRULE concatenated (or NULL) */
+ char_u *sl_compstartflags; /* flags for first compound word */
+ char_u *sl_compallflags; /* all flags for compound words */
+ char_u sl_nobreak; /* When TRUE: no spaces between words */
+***************
+*** 839,845 ****
+--- 840,849 ----
+ static void slang_clear __ARGS((slang_T *lp));
+ static void slang_clear_sug __ARGS((slang_T *lp));
+ static void find_word __ARGS((matchinf_T *mip, int mode));
++ static int match_checkcompoundpattern __ARGS((char_u *ptr, int wlen, garray_T *gap));
+ static int can_compound __ARGS((slang_T *slang, char_u *word, char_u *flags));
++ static int can_be_compound __ARGS((trystate_T *sp, slang_T *slang, char_u *compflags, int flag));
++ static int match_compoundrule __ARGS((slang_T *slang, char_u *compflags));
+ static int valid_word_prefix __ARGS((int totprefcnt, int arridx, int flags, char_u *word, slang_T *slang, int cond_req));
+ static void find_prefix __ARGS((matchinf_T *mip, int mode));
+ static int fold_more __ARGS((matchinf_T *mip));
+***************
+*** 1519,1524 ****
+--- 1523,1533 ----
+ ((unsigned)flags >> 24)))
+ continue;
+
++ /* If there is a match with a CHECKCOMPOUNDPATTERN rule
++ * discard the compound word. */
++ if (match_checkcompoundpattern(ptr, wlen, &slang->sl_comppat))
++ continue;
++
+ if (mode == FIND_COMPOUND)
+ {
+ int capflags;
+***************
+*** 1577,1582 ****
+--- 1586,1596 ----
+ if (!can_compound(slang, fword, mip->mi_compflags))
+ continue;
+ }
++ else if (slang->sl_comprules != NULL
++ && !match_compoundrule(slang, mip->mi_compflags))
++ /* The compound flags collected so far do not match any
++ * COMPOUNDRULE, discard the compounded word. */
++ continue;
+ }
+
+ /* Check NEEDCOMPOUND: can't use word without compounding. */
+***************
+*** 1727,1732 ****
+--- 1741,1779 ----
+ }
+
+ /*
++ * Return TRUE if there is a match between the word ptr[wlen] and
++ * CHECKCOMPOUNDPATTERN rules, assuming that we will concatenate with another
++ * word.
++ * A match means that the first part of CHECKCOMPOUNDPATTERN matches at the
++ * end of ptr[wlen] and the second part matches after it.
++ */
++ static int
++ match_checkcompoundpattern(ptr, wlen, gap)
++ char_u *ptr;
++ int wlen;
++ garray_T *gap; /* &sl_comppat */
++ {
++ int i;
++ char_u *p;
++ int len;
++
++ for (i = 0; i + 1 < gap->ga_len; i += 2)
++ {
++ p = ((char_u **)gap->ga_data)[i + 1];
++ if (STRNCMP(ptr + wlen, p, STRLEN(p)) == 0)
++ {
++ /* Second part matches at start of following compound word, now
++ * check if first part matches at end of previous word. */
++ p = ((char_u **)gap->ga_data)[i];
++ len = STRLEN(p);
++ if (len <= wlen && STRNCMP(ptr + wlen - len, p, len) == 0)
++ return TRUE;
++ }
++ }
++ return FALSE;
++ }
++
++ /*
+ * Return TRUE if "flags" is a valid sequence of compound flags and "word"
+ * does not have too many syllables.
+ */
+***************
+*** 1773,1778 ****
+--- 1820,1917 ----
+ }
+
+ /*
++ * Return TRUE when the sequence of flags in "compflags" plus "flag" can
++ * possibly form a valid compounded word. This also checks the COMPOUNDRULE
++ * lines if they don't contain wildcards.
++ */
++ static int
++ can_be_compound(sp, slang, compflags, flag)
++ trystate_T *sp;
++ slang_T *slang;
++ char_u *compflags;
++ int flag;
++ {
++ /* If the flag doesn't appear in sl_compstartflags or sl_compallflags
++ * then it can't possibly compound. */
++ if (!byte_in_str(sp->ts_complen == sp->ts_compsplit
++ ? slang->sl_compstartflags : slang->sl_compallflags, flag))
++ return FALSE;
++
++ /* If there are no wildcards, we can check if the flags collected so far
++ * possibly can form a match with COMPOUNDRULE patterns. This only
++ * makes sense when we have two or more words. */
++ if (slang->sl_comprules != NULL && sp->ts_complen > sp->ts_compsplit)
++ {
++ int v;
++
++ compflags[sp->ts_complen] = flag;
++ compflags[sp->ts_complen + 1] = NUL;
++ v = match_compoundrule(slang, compflags + sp->ts_compsplit);
++ compflags[sp->ts_complen] = NUL;
++ return v;
++ }
++
++ return TRUE;
++ }
++
++
++ /*
++ * Return TRUE if the compound flags in compflags[] match the start of any
++ * compound rule. This is used to stop trying a compound if the flags
++ * collected so far can't possibly match any compound rule.
++ * Caller must check that slang->sl_comprules is not NULL.
++ */
++ static int
++ match_compoundrule(slang, compflags)
++ slang_T *slang;
++ char_u *compflags;
++ {
++ char_u *p;
++ int i;
++ int c;
++
++ /* loop over all the COMPOUNDRULE entries */
++ for (p = slang->sl_comprules; *p != NUL; ++p)
++ {
++ /* loop over the flags in the compound word we have made, match
++ * them against the current rule entry */
++ for (i = 0; ; ++i)
++ {
++ c = compflags[i];
++ if (c == NUL)
++ /* found a rule that matches for the flags we have so far */
++ return TRUE;
++ if (*p == '/' || *p == NUL)
++ break; /* end of rule, it's too short */
++ if (*p == '[')
++ {
++ int match = FALSE;
++
++ /* compare against all the flags in [] */
++ ++p;
++ while (*p != ']' && *p != NUL)
++ if (*p++ == c)
++ match = TRUE;
++ if (!match)
++ break; /* none matches */
++ }
++ else if (*p != c)
++ break; /* flag of word doesn't match flag in pattern */
++ ++p;
++ }
++
++ /* Skip to the next "/", where the next pattern starts. */
++ p = vim_strchr(p, '/');
++ if (p == NULL)
++ break;
++ }
++
++ /* Checked all the rules and none of them match the flags, so there
++ * can't possibly be a compound starting with these flags. */
++ return FALSE;
++ }
++
++ /*
+ * Return non-zero if the prefix indicated by "arridx" matches with the prefix
+ * ID in "flags" for the word "word".
+ * The WF_RAREPFX flag is included in the return value for a rare prefix.
+***************
+*** 2513,2521 ****
+--- 2652,2662 ----
+ lp->sl_midword = NULL;
+
+ vim_free(lp->sl_compprog);
++ vim_free(lp->sl_comprules);
+ vim_free(lp->sl_compstartflags);
+ vim_free(lp->sl_compallflags);
+ lp->sl_compprog = NULL;
++ lp->sl_comprules = NULL;
+ lp->sl_compstartflags = NULL;
+ lp->sl_compallflags = NULL;
+
+***************
+*** 3460,3465 ****
+--- 3601,3607 ----
+ char_u *pp;
+ char_u *cp;
+ char_u *ap;
++ char_u *crp;
+ int cnt;
+ garray_T *gap;
+
+***************
+*** 3545,3550 ****
+--- 3687,3698 ----
+ slang->sl_compallflags = ap;
+ *ap = NUL;
+
++ /* And a list of all patterns in their original form, for checking whether
++ * compounding may work in match_compoundrule(). This is freed when we
++ * encounter a wildcard, the check doesn't work then. */
++ crp = alloc(todo + 1);
++ slang->sl_comprules = crp;
++
+ pp = pat;
+ *pp++ = '^';
+ *pp++ = '\\';
+***************
+*** 3587,3592 ****
+--- 3735,3754 ----
+ atstart = 0;
+ }
+ }
++
++ /* Copy flag to "sl_comprules", unless we run into a wildcard. */
++ if (crp != NULL)
++ {
++ if (c == '+' || c == '*')
++ {
++ vim_free(slang->sl_comprules);
++ slang->sl_comprules = NULL;
++ crp = NULL;
++ }
++ else
++ *crp++ = c;
++ }
++
+ if (c == '/') /* slash separates two items */
+ {
+ *pp++ = '\\';
+***************
+*** 3611,3616 ****
+--- 3773,3781 ----
+ *pp++ = '$';
+ *pp = NUL;
+
++ if (crp != NULL)
++ *crp = NUL;
++
+ slang->sl_compprog = vim_regcomp(pat, RE_MAGIC + RE_STRING + RE_STRICT);
+ vim_free(pat);
+ if (slang->sl_compprog == NULL)
+***************
+*** 4915,4920 ****
+--- 5080,5086 ----
+ } spellinfo_T;
+
+ static afffile_T *spell_read_aff __ARGS((spellinfo_T *spin, char_u *fname));
++ static int is_aff_rule __ARGS((char_u **items, int itemcnt, char *rulename, int mincount));
+ static void aff_process_flags __ARGS((afffile_T *affile, affentry_T *entry));
+ static int spell_info_item __ARGS((char_u *s));
+ static unsigned affitem2flag __ARGS((int flagtype, char_u *item, char_u *fname, int lnum));
+***************
+*** 5223,5230 ****
+ /* Handle non-empty lines. */
+ if (itemcnt > 0)
+ {
+! if (STRCMP(items[0], "SET") == 0 && itemcnt == 2
+! && aff->af_enc == NULL)
+ {
+ #ifdef FEAT_MBYTE
+ /* Setup for conversion from "ENC" to 'encoding'. */
+--- 5389,5395 ----
+ /* Handle non-empty lines. */
+ if (itemcnt > 0)
+ {
+! if (is_aff_rule(items, itemcnt, "SET", 2) && aff->af_enc == NULL)
+ {
+ #ifdef FEAT_MBYTE
+ /* Setup for conversion from "ENC" to 'encoding'. */
+***************
+*** 5239,5245 ****
+ smsg((char_u *)_("Conversion in %s not supported"), fname);
+ #endif
+ }
+! else if (STRCMP(items[0], "FLAG") == 0 && itemcnt == 2
+ && aff->af_flagtype == AFT_CHAR)
+ {
+ if (STRCMP(items[1], "long") == 0)
+--- 5404,5410 ----
+ smsg((char_u *)_("Conversion in %s not supported"), fname);
+ #endif
+ }
+! else if (is_aff_rule(items, itemcnt, "FLAG", 2)
+ && aff->af_flagtype == AFT_CHAR)
+ {
+ if (STRCMP(items[1], "long") == 0)
+***************
+*** 5284,5352 ****
+ spin->si_info = p;
+ }
+ }
+! else if (STRCMP(items[0], "MIDWORD") == 0 && itemcnt == 2
+ && midword == NULL)
+ {
+ midword = getroom_save(spin, items[1]);
+ }
+! else if (STRCMP(items[0], "TRY") == 0 && itemcnt == 2)
+ {
+ /* ignored, we look in the tree for what chars may appear */
+ }
+ /* TODO: remove "RAR" later */
+! else if ((STRCMP(items[0], "RAR") == 0
+! || STRCMP(items[0], "RARE") == 0) && itemcnt == 2
+! && aff->af_rare == 0)
+ {
+ aff->af_rare = affitem2flag(aff->af_flagtype, items[1],
+ fname, lnum);
+ }
+ /* TODO: remove "KEP" later */
+! else if ((STRCMP(items[0], "KEP") == 0
+! || STRCMP(items[0], "KEEPCASE") == 0) && itemcnt == 2
+ && aff->af_keepcase == 0)
+ {
+ aff->af_keepcase = affitem2flag(aff->af_flagtype, items[1],
+ fname, lnum);
+ }
+! else if (STRCMP(items[0], "BAD") == 0 && itemcnt == 2
+! && aff->af_bad == 0)
+ {
+ aff->af_bad = affitem2flag(aff->af_flagtype, items[1],
+ fname, lnum);
+ }
+! else if (STRCMP(items[0], "NEEDAFFIX") == 0 && itemcnt == 2
+ && aff->af_needaffix == 0)
+ {
+ aff->af_needaffix = affitem2flag(aff->af_flagtype, items[1],
+ fname, lnum);
+ }
+! else if (STRCMP(items[0], "CIRCUMFIX") == 0 && itemcnt == 2
+ && aff->af_circumfix == 0)
+ {
+ aff->af_circumfix = affitem2flag(aff->af_flagtype, items[1],
+ fname, lnum);
+ }
+! else if (STRCMP(items[0], "NOSUGGEST") == 0 && itemcnt == 2
+ && aff->af_nosuggest == 0)
+ {
+ aff->af_nosuggest = affitem2flag(aff->af_flagtype, items[1],
+ fname, lnum);
+ }
+! else if (STRCMP(items[0], "NEEDCOMPOUND") == 0 && itemcnt == 2
+ && aff->af_needcomp == 0)
+ {
+ aff->af_needcomp = affitem2flag(aff->af_flagtype, items[1],
+ fname, lnum);
+ }
+! else if (STRCMP(items[0], "COMPOUNDROOT") == 0 && itemcnt == 2
+ && aff->af_comproot == 0)
+ {
+ aff->af_comproot = affitem2flag(aff->af_flagtype, items[1],
+ fname, lnum);
+ }
+! else if (STRCMP(items[0], "COMPOUNDFORBIDFLAG") == 0
+! && itemcnt == 2 && aff->af_compforbid == 0)
+ {
+ aff->af_compforbid = affitem2flag(aff->af_flagtype, items[1],
+ fname, lnum);
+--- 5449,5519 ----
+ spin->si_info = p;
+ }
+ }
+! else if (is_aff_rule(items, itemcnt, "MIDWORD", 2)
+ && midword == NULL)
+ {
+ midword = getroom_save(spin, items[1]);
+ }
+! else if (is_aff_rule(items, itemcnt, "TRY", 2))
+ {
+ /* ignored, we look in the tree for what chars may appear */
+ }
+ /* TODO: remove "RAR" later */
+! else if ((is_aff_rule(items, itemcnt, "RAR", 2)
+! || is_aff_rule(items, itemcnt, "RARE", 2))
+! && aff->af_rare == 0)
+ {
+ aff->af_rare = affitem2flag(aff->af_flagtype, items[1],
+ fname, lnum);
+ }
+ /* TODO: remove "KEP" later */
+! else if ((is_aff_rule(items, itemcnt, "KEP", 2)
+! || is_aff_rule(items, itemcnt, "KEEPCASE", 2))
+ && aff->af_keepcase == 0)
+ {
+ aff->af_keepcase = affitem2flag(aff->af_flagtype, items[1],
+ fname, lnum);
+ }
+! else if ((is_aff_rule(items, itemcnt, "BAD", 2)
+! || is_aff_rule(items, itemcnt, "FORBIDDENWORD", 2))
+! && aff->af_bad == 0)
+ {
+ aff->af_bad = affitem2flag(aff->af_flagtype, items[1],
+ fname, lnum);
+ }
+! else if (is_aff_rule(items, itemcnt, "NEEDAFFIX", 2)
+ && aff->af_needaffix == 0)
+ {
+ aff->af_needaffix = affitem2flag(aff->af_flagtype, items[1],
+ fname, lnum);
+ }
+! else if (is_aff_rule(items, itemcnt, "CIRCUMFIX", 2)
+ && aff->af_circumfix == 0)
+ {
+ aff->af_circumfix = affitem2flag(aff->af_flagtype, items[1],
+ fname, lnum);
+ }
+! else if (is_aff_rule(items, itemcnt, "NOSUGGEST", 2)
+ && aff->af_nosuggest == 0)
+ {
+ aff->af_nosuggest = affitem2flag(aff->af_flagtype, items[1],
+ fname, lnum);
+ }
+! else if ((is_aff_rule(items, itemcnt, "NEEDCOMPOUND", 2)
+! || is_aff_rule(items, itemcnt, "ONLYINCOMPOUND", 2))
+ && aff->af_needcomp == 0)
+ {
+ aff->af_needcomp = affitem2flag(aff->af_flagtype, items[1],
+ fname, lnum);
+ }
+! else if (is_aff_rule(items, itemcnt, "COMPOUNDROOT", 2)
+ && aff->af_comproot == 0)
+ {
+ aff->af_comproot = affitem2flag(aff->af_flagtype, items[1],
+ fname, lnum);
+ }
+! else if (is_aff_rule(items, itemcnt, "COMPOUNDFORBIDFLAG", 2)
+! && aff->af_compforbid == 0)
+ {
+ aff->af_compforbid = affitem2flag(aff->af_flagtype, items[1],
+ fname, lnum);
+***************
+*** 5354,5361 ****
+ smsg((char_u *)_("Defining COMPOUNDFORBIDFLAG after PFX item may give wrong results in %s line %d"),
+ fname, lnum);
+ }
+! else if (STRCMP(items[0], "COMPOUNDPERMITFLAG") == 0
+! && itemcnt == 2 && aff->af_comppermit == 0)
+ {
+ aff->af_comppermit = affitem2flag(aff->af_flagtype, items[1],
+ fname, lnum);
+--- 5521,5528 ----
+ smsg((char_u *)_("Defining COMPOUNDFORBIDFLAG after PFX item may give wrong results in %s line %d"),
+ fname, lnum);
+ }
+! else if (is_aff_rule(items, itemcnt, "COMPOUNDPERMITFLAG", 2)
+! && aff->af_comppermit == 0)
+ {
+ aff->af_comppermit = affitem2flag(aff->af_flagtype, items[1],
+ fname, lnum);
+***************
+*** 5363,5369 ****
+ smsg((char_u *)_("Defining COMPOUNDPERMITFLAG after PFX item may give wrong results in %s line %d"),
+ fname, lnum);
+ }
+! else if (STRCMP(items[0], "COMPOUNDFLAG") == 0 && itemcnt == 2
+ && compflags == NULL)
+ {
+ /* Turn flag "c" into COMPOUNDRULE compatible string "c+",
+--- 5530,5536 ----
+ smsg((char_u *)_("Defining COMPOUNDPERMITFLAG after PFX item may give wrong results in %s line %d"),
+ fname, lnum);
+ }
+! else if (is_aff_rule(items, itemcnt, "COMPOUNDFLAG", 2)
+ && compflags == NULL)
+ {
+ /* Turn flag "c" into COMPOUNDRULE compatible string "c+",
+***************
+*** 5376,5382 ****
+ compflags = p;
+ }
+ }
+! else if (STRCMP(items[0], "COMPOUNDRULE") == 0 && itemcnt == 2)
+ {
+ /* Concatenate this string to previously defined ones, using a
+ * slash to separate them. */
+--- 5543,5557 ----
+ compflags = p;
+ }
+ }
+! else if (is_aff_rule(items, itemcnt, "COMPOUNDRULES", 2))
+! {
+! /* We don't use the count, but do check that it's a number and
+! * not COMPOUNDRULE mistyped. */
+! if (atoi((char *)items[1]) == 0)
+! smsg((char_u *)_("Wrong COMPOUNDRULES value in %s line %d: %s"),
+! fname, lnum, items[1]);
+! }
+! else if (is_aff_rule(items, itemcnt, "COMPOUNDRULE", 2))
+ {
+ /* Concatenate this string to previously defined ones, using a
+ * slash to separate them. */
+***************
+*** 5395,5401 ****
+ compflags = p;
+ }
+ }
+! else if (STRCMP(items[0], "COMPOUNDWORDMAX") == 0 && itemcnt == 2
+ && compmax == 0)
+ {
+ compmax = atoi((char *)items[1]);
+--- 5570,5576 ----
+ compflags = p;
+ }
+ }
+! else if (is_aff_rule(items, itemcnt, "COMPOUNDWORDMAX", 2)
+ && compmax == 0)
+ {
+ compmax = atoi((char *)items[1]);
+***************
+*** 5403,5409 ****
+ smsg((char_u *)_("Wrong COMPOUNDWORDMAX value in %s line %d: %s"),
+ fname, lnum, items[1]);
+ }
+! else if (STRCMP(items[0], "COMPOUNDMIN") == 0 && itemcnt == 2
+ && compminlen == 0)
+ {
+ compminlen = atoi((char *)items[1]);
+--- 5578,5584 ----
+ smsg((char_u *)_("Wrong COMPOUNDWORDMAX value in %s line %d: %s"),
+ fname, lnum, items[1]);
+ }
+! else if (is_aff_rule(items, itemcnt, "COMPOUNDMIN", 2)
+ && compminlen == 0)
+ {
+ compminlen = atoi((char *)items[1]);
+***************
+*** 5411,5417 ****
+ smsg((char_u *)_("Wrong COMPOUNDMIN value in %s line %d: %s"),
+ fname, lnum, items[1]);
+ }
+! else if (STRCMP(items[0], "COMPOUNDSYLMAX") == 0 && itemcnt == 2
+ && compsylmax == 0)
+ {
+ compsylmax = atoi((char *)items[1]);
+--- 5586,5592 ----
+ smsg((char_u *)_("Wrong COMPOUNDMIN value in %s line %d: %s"),
+ fname, lnum, items[1]);
+ }
+! else if (is_aff_rule(items, itemcnt, "COMPOUNDSYLMAX", 2)
+ && compsylmax == 0)
+ {
+ compsylmax = atoi((char *)items[1]);
+***************
+*** 5419,5450 ****
+ smsg((char_u *)_("Wrong COMPOUNDSYLMAX value in %s line %d: %s"),
+ fname, lnum, items[1]);
+ }
+! else if (STRCMP(items[0], "CHECKCOMPOUNDDUP") == 0 && itemcnt == 1)
+ {
+ compoptions |= COMP_CHECKDUP;
+ }
+! else if (STRCMP(items[0], "CHECKCOMPOUNDREP") == 0 && itemcnt == 1)
+ {
+ compoptions |= COMP_CHECKREP;
+ }
+! else if (STRCMP(items[0], "CHECKCOMPOUNDCASE") == 0 && itemcnt == 1)
+ {
+ compoptions |= COMP_CHECKCASE;
+ }
+! else if (STRCMP(items[0], "CHECKCOMPOUNDTRIPLE") == 0
+! && itemcnt == 1)
+ {
+ compoptions |= COMP_CHECKTRIPLE;
+ }
+! else if (STRCMP(items[0], "CHECKCOMPOUNDPATTERN") == 0
+! && itemcnt == 2)
+ {
+ if (atoi((char *)items[1]) == 0)
+ smsg((char_u *)_("Wrong CHECKCOMPOUNDPATTERN value in %s line %d: %s"),
+ fname, lnum, items[1]);
+ }
+! else if (STRCMP(items[0], "CHECKCOMPOUNDPATTERN") == 0
+! && itemcnt == 3)
+ {
+ garray_T *gap = &spin->si_comppat;
+ int i;
+--- 5594,5622 ----
+ smsg((char_u *)_("Wrong COMPOUNDSYLMAX value in %s line %d: %s"),
+ fname, lnum, items[1]);
+ }
+! else if (is_aff_rule(items, itemcnt, "CHECKCOMPOUNDDUP", 1))
+ {
+ compoptions |= COMP_CHECKDUP;
+ }
+! else if (is_aff_rule(items, itemcnt, "CHECKCOMPOUNDREP", 1))
+ {
+ compoptions |= COMP_CHECKREP;
+ }
+! else if (is_aff_rule(items, itemcnt, "CHECKCOMPOUNDCASE", 1))
+ {
+ compoptions |= COMP_CHECKCASE;
+ }
+! else if (is_aff_rule(items, itemcnt, "CHECKCOMPOUNDTRIPLE", 1))
+ {
+ compoptions |= COMP_CHECKTRIPLE;
+ }
+! else if (is_aff_rule(items, itemcnt, "CHECKCOMPOUNDPATTERN", 2))
+ {
+ if (atoi((char *)items[1]) == 0)
+ smsg((char_u *)_("Wrong CHECKCOMPOUNDPATTERN value in %s line %d: %s"),
+ fname, lnum, items[1]);
+ }
+! else if (is_aff_rule(items, itemcnt, "CHECKCOMPOUNDPATTERN", 3))
+ {
+ garray_T *gap = &spin->si_comppat;
+ int i;
+***************
+*** 5463,5486 ****
+ = getroom_save(spin, items[2]);
+ }
+ }
+! else if (STRCMP(items[0], "SYLLABLE") == 0 && itemcnt == 2
+ && syllable == NULL)
+ {
+ syllable = getroom_save(spin, items[1]);
+ }
+! else if (STRCMP(items[0], "NOBREAK") == 0 && itemcnt == 1)
+ {
+ spin->si_nobreak = TRUE;
+ }
+! else if (STRCMP(items[0], "NOSPLITSUGS") == 0 && itemcnt == 1)
+ {
+ spin->si_nosplitsugs = TRUE;
+ }
+! else if (STRCMP(items[0], "NOSUGFILE") == 0 && itemcnt == 1)
+ {
+ spin->si_nosugfile = TRUE;
+ }
+! else if (STRCMP(items[0], "PFXPOSTPONE") == 0 && itemcnt == 1)
+ {
+ aff->af_pfxpostpone = TRUE;
+ }
+--- 5635,5658 ----
+ = getroom_save(spin, items[2]);
+ }
+ }
+! else if (is_aff_rule(items, itemcnt, "SYLLABLE", 2)
+ && syllable == NULL)
+ {
+ syllable = getroom_save(spin, items[1]);
+ }
+! else if (is_aff_rule(items, itemcnt, "NOBREAK", 1))
+ {
+ spin->si_nobreak = TRUE;
+ }
+! else if (is_aff_rule(items, itemcnt, "NOSPLITSUGS", 1))
+ {
+ spin->si_nosplitsugs = TRUE;
+ }
+! else if (is_aff_rule(items, itemcnt, "NOSUGFILE", 1))
+ {
+ spin->si_nosugfile = TRUE;
+ }
+! else if (is_aff_rule(items, itemcnt, "PFXPOSTPONE", 1))
+ {
+ aff->af_pfxpostpone = TRUE;
+ }
+***************
+*** 5771,5794 ****
+ }
+ }
+ }
+! else if (STRCMP(items[0], "FOL") == 0 && itemcnt == 2
+! && fol == NULL)
+ {
+ fol = vim_strsave(items[1]);
+ }
+! else if (STRCMP(items[0], "LOW") == 0 && itemcnt == 2
+! && low == NULL)
+ {
+ low = vim_strsave(items[1]);
+ }
+! else if (STRCMP(items[0], "UPP") == 0 && itemcnt == 2
+! && upp == NULL)
+ {
+ upp = vim_strsave(items[1]);
+ }
+! else if ((STRCMP(items[0], "REP") == 0
+! || STRCMP(items[0], "REPSAL") == 0)
+! && itemcnt == 2)
+ {
+ /* Ignore REP/REPSAL count */;
+ if (!isdigit(*items[1]))
+--- 5943,5962 ----
+ }
+ }
+ }
+! else if (is_aff_rule(items, itemcnt, "FOL", 2) && fol == NULL)
+ {
+ fol = vim_strsave(items[1]);
+ }
+! else if (is_aff_rule(items, itemcnt, "LOW", 2) && low == NULL)
+ {
+ low = vim_strsave(items[1]);
+ }
+! else if (is_aff_rule(items, itemcnt, "UPP", 2) && upp == NULL)
+ {
+ upp = vim_strsave(items[1]);
+ }
+! else if (is_aff_rule(items, itemcnt, "REP", 2)
+! || is_aff_rule(items, itemcnt, "REPSAL", 2))
+ {
+ /* Ignore REP/REPSAL count */;
+ if (!isdigit(*items[1]))
+***************
+*** 5819,5825 ****
+ : &spin->si_rep, items[1], items[2]);
+ }
+ }
+! else if (STRCMP(items[0], "MAP") == 0 && itemcnt == 2)
+ {
+ /* MAP item or count */
+ if (!found_map)
+--- 5987,5993 ----
+ : &spin->si_rep, items[1], items[2]);
+ }
+ }
+! else if (is_aff_rule(items, itemcnt, "MAP", 2))
+ {
+ /* MAP item or count */
+ if (!found_map)
+***************
+*** 5856,5864 ****
+ ga_append(&spin->si_map, '/');
+ }
+ }
+! /* Accept "SAL from to" and "SAL from to # comment". */
+! else if (STRCMP(items[0], "SAL") == 0
+! && (itemcnt == 3 || (itemcnt > 3 && items[3][0] == '#')))
+ {
+ if (do_sal)
+ {
+--- 6024,6031 ----
+ ga_append(&spin->si_map, '/');
+ }
+ }
+! /* Accept "SAL from to" and "SAL from to #comment". */
+! else if (is_aff_rule(items, itemcnt, "SAL", 3))
+ {
+ if (do_sal)
+ {
+***************
+*** 5877,5888 ****
+ : items[2]);
+ }
+ }
+! else if (STRCMP(items[0], "SOFOFROM") == 0 && itemcnt == 2
+ && sofofrom == NULL)
+ {
+ sofofrom = getroom_save(spin, items[1]);
+ }
+! else if (STRCMP(items[0], "SOFOTO") == 0 && itemcnt == 2
+ && sofoto == NULL)
+ {
+ sofoto = getroom_save(spin, items[1]);
+--- 6044,6055 ----
+ : items[2]);
+ }
+ }
+! else if (is_aff_rule(items, itemcnt, "SOFOFROM", 2)
+ && sofofrom == NULL)
+ {
+ sofofrom = getroom_save(spin, items[1]);
+ }
+! else if (is_aff_rule(items, itemcnt, "SOFOTO", 2)
+ && sofoto == NULL)
+ {
+ sofoto = getroom_save(spin, items[1]);
+***************
+*** 6017,6022 ****
+--- 6184,6205 ----
+ }
+
+ /*
++ * Return TRUE when items[0] equals "rulename", there are "mincount" items or
++ * a comment is following after item "mincount".
++ */
++ static int
++ is_aff_rule(items, itemcnt, rulename, mincount)
++ char_u **items;
++ int itemcnt;
++ char *rulename;
++ int mincount;
++ {
++ return (STRCMP(items[0], rulename) == 0
++ && (itemcnt == mincount
++ || (itemcnt > mincount && items[mincount][0] == '#')));
++ }
++
++ /*
+ * For affix "entry" move COMPOUNDFORBIDFLAG and COMPOUNDPERMITFLAG from
+ * ae_flags to ae_comppermit and ae_compforbid.
+ */
+***************
+*** 11492,11506 ****
+ vim_strncpy(preword + sp->ts_prewordlen,
+ tword + sp->ts_splitoff,
+ sp->ts_twordlen - sp->ts_splitoff);
+! p = preword;
+! while (*skiptowhite(p) != NUL)
+! p = skipwhite(skiptowhite(p));
+! if (fword_ends && !can_compound(slang, p,
+! compflags + sp->ts_compsplit))
+! /* Compound is not allowed. But it may still be
+! * possible if we add another (short) word. */
+ compound_ok = FALSE;
+
+ /* Get pointer to last char of previous word. */
+ p = preword + sp->ts_prewordlen;
+ mb_ptr_back(preword, p);
+--- 11675,11698 ----
+ vim_strncpy(preword + sp->ts_prewordlen,
+ tword + sp->ts_splitoff,
+ sp->ts_twordlen - sp->ts_splitoff);
+!
+! /* Verify CHECKCOMPOUNDPATTERN rules. */
+! if (match_checkcompoundpattern(preword, sp->ts_prewordlen,
+! &slang->sl_comppat))
+ compound_ok = FALSE;
+
++ if (compound_ok)
++ {
++ p = preword;
++ while (*skiptowhite(p) != NUL)
++ p = skipwhite(skiptowhite(p));
++ if (fword_ends && !can_compound(slang, p,
++ compflags + sp->ts_compsplit))
++ /* Compound is not allowed. But it may still be
++ * possible if we add another (short) word. */
++ compound_ok = FALSE;
++ }
++
+ /* Get pointer to last char of previous word. */
+ p = preword + sp->ts_prewordlen;
+ mb_ptr_back(preword, p);
+***************
+*** 11697,11706 ****
+ && (slang->sl_compsylmax < MAXWLEN
+ || sp->ts_complen + 1 - sp->ts_compsplit
+ < slang->sl_compmax)
+! && (byte_in_str(sp->ts_complen == sp->ts_compsplit
+! ? slang->sl_compstartflags
+! : slang->sl_compallflags,
+! ((unsigned)flags >> 24))))
+ {
+ try_compound = TRUE;
+ compflags[sp->ts_complen] = ((unsigned)flags >> 24);
+--- 11889,11897 ----
+ && (slang->sl_compsylmax < MAXWLEN
+ || sp->ts_complen + 1 - sp->ts_compsplit
+ < slang->sl_compmax)
+! && (can_be_compound(sp, slang,
+! compflags, ((unsigned)flags >> 24))))
+!
+ {
+ try_compound = TRUE;
+ compflags[sp->ts_complen] = ((unsigned)flags >> 24);
+*** ../vim-7.2.059/src/version.c Sun Nov 30 15:15:56 2008
+--- src/version.c Sun Nov 30 21:09:23 2008
+***************
+*** 678,679 ****
+--- 678,681 ----
+ { /* Add new patch number below this line */
++ /**/
++ 60,
+ /**/
+
+--
+DEAD PERSON: I'm getting better!
+CUSTOMER: No, you're not -- you'll be stone dead in a moment.
+MORTICIAN: Oh, I can't take him like that -- it's against regulations.
+ The Quest for the Holy Grail (Monty Python)
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ download, build and distribute -- http://www.A-A-P.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
--- /dev/null
+To: vim-dev@vim.org
+Subject: Patch 7.2.061
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=ISO-8859-1
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 7.2.061
+Problem: Can't create a funcref for an autoload function without loading
+ the script first. (Marc Weber)
+Solution: Accept autoload functions that don't exist yet in function().
+Files: src/eval.c
+
+
+*** ../vim-7.2.060/src/eval.c Fri Nov 28 21:26:50 2008
+--- src/eval.c Sat Nov 29 12:28:51 2008
+***************
+*** 10339,10345 ****
+ s = get_tv_string(&argvars[0]);
+ if (s == NULL || *s == NUL || VIM_ISDIGIT(*s))
+ EMSG2(_(e_invarg2), s);
+! else if (!function_exists(s))
+ EMSG2(_("E700: Unknown function: %s"), s);
+ else
+ {
+--- 10339,10346 ----
+ s = get_tv_string(&argvars[0]);
+ if (s == NULL || *s == NUL || VIM_ISDIGIT(*s))
+ EMSG2(_(e_invarg2), s);
+! /* Don't check an autoload name for existence here. */
+! else if (vim_strchr(s, AUTOLOAD_CHAR) == NULL && !function_exists(s))
+ EMSG2(_("E700: Unknown function: %s"), s);
+ else
+ {
+*** ../vim-7.2.060/src/version.c Sun Nov 30 21:11:54 2008
+--- src/version.c Wed Dec 3 09:49:07 2008
+***************
+*** 678,679 ****
+--- 678,681 ----
+ { /* Add new patch number below this line */
++ /**/
++ 61,
+ /**/
+
+--
+There are 2 kinds of people in my world: those who know Unix, Perl, Vim, GNU,
+Linux, etc, and those who know COBOL. It gets very difficult for me at
+parties, not knowing which group to socialise with :-)
+ Sitaram Chamarty
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ download, build and distribute -- http://www.A-A-P.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
--- /dev/null
+To: vim-dev@vim.org
+Subject: Patch 7.2.062
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=ISO-8859-1
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 7.2.062
+Problem: "[Scratch]" is not translated.
+Solution: Mark the string for translation. (Dominique Pelle)
+Files: src/buffer.c
+
+
+*** ../vim-7.2.061/src/buffer.c Sat Nov 15 16:05:30 2008
+--- src/buffer.c Tue Dec 2 21:51:02 2008
+***************
+*** 5118,5124 ****
+ {
+ if (buf->b_sfname != NULL)
+ return (char *)buf->b_sfname;
+! return "[Scratch]";
+ }
+ #endif
+ if (buf->b_fname == NULL)
+--- 5118,5124 ----
+ {
+ if (buf->b_sfname != NULL)
+ return (char *)buf->b_sfname;
+! return _("[Scratch]");
+ }
+ #endif
+ if (buf->b_fname == NULL)
+*** ../vim-7.2.061/src/version.c Wed Dec 3 09:51:19 2008
+--- src/version.c Wed Dec 3 11:20:30 2008
+***************
+*** 678,679 ****
+--- 678,681 ----
+ { /* Add new patch number below this line */
++ /**/
++ 62,
+ /**/
+
+--
+DENNIS: Listen -- strange women lying in ponds distributing swords is no
+ basis for a system of government. Supreme executive power derives
+ from a mandate from the masses, not from some farcical aquatic
+ ceremony.
+ The Quest for the Holy Grail (Monty Python)
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ download, build and distribute -- http://www.A-A-P.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
--- /dev/null
+To: vim-dev@vim.org
+Subject: Patch 7.2.063
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=ISO-8859-1
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 7.2.063
+Problem: Warning for NULL argument of Perl_sys_init3().
+Solution: Use Perl_sys_init() instead. (partly by Dominique Pelle)
+Files: src/if_perl.xs
+
+
+*** ../vim-7.2.062/src/if_perl.xs Mon Sep 1 17:56:05 2008
+--- src/if_perl.xs Wed Dec 3 12:44:38 2008
+***************
+*** 166,172 ****
+ # define Perl_Isv_yes_ptr dll_Perl_Isv_yes_ptr
+ # define boot_DynaLoader dll_boot_DynaLoader
+
+! # define Perl_sys_init3 dll_Perl_sys_init3
+ # define Perl_sys_term dll_Perl_sys_term
+ # define Perl_ISv_ptr dll_Perl_ISv_ptr
+ # define Perl_Istack_max_ptr dll_Perl_Istack_max_ptr
+--- 166,172 ----
+ # define Perl_Isv_yes_ptr dll_Perl_Isv_yes_ptr
+ # define boot_DynaLoader dll_boot_DynaLoader
+
+! # define Perl_sys_init dll_Perl_sys_init
+ # define Perl_sys_term dll_Perl_sys_term
+ # define Perl_ISv_ptr dll_Perl_ISv_ptr
+ # define Perl_Istack_max_ptr dll_Perl_Istack_max_ptr
+***************
+*** 272,278 ****
+
+ #if (PERL_REVISION == 5) && (PERL_VERSION >= 10)
+ static void (*Perl_sv_free2)(pTHX_ SV*);
+! static void (*Perl_sys_init3)(int* argc, char*** argv, char*** env);
+ static void (*Perl_sys_term)(void);
+ static SV** (*Perl_ISv_ptr)(register PerlInterpreter*);
+ static SV*** (*Perl_Istack_max_ptr)(register PerlInterpreter*);
+--- 272,278 ----
+
+ #if (PERL_REVISION == 5) && (PERL_VERSION >= 10)
+ static void (*Perl_sv_free2)(pTHX_ SV*);
+! static void (*Perl_sys_init)(int* argc, char*** argv);
+ static void (*Perl_sys_term)(void);
+ static SV** (*Perl_ISv_ptr)(register PerlInterpreter*);
+ static SV*** (*Perl_Istack_max_ptr)(register PerlInterpreter*);
+***************
+*** 372,378 ****
+ {"Perl_Tna_ptr", (PERL_PROC*)&Perl_Tna_ptr},
+ #else
+ {"Perl_sv_free2", (PERL_PROC*)&Perl_sv_free2},
+! {"Perl_sys_init3", (PERL_PROC*)&Perl_sys_init3},
+ {"Perl_sys_term", (PERL_PROC*)&Perl_sys_term},
+ {"Perl_ISv_ptr", (PERL_PROC*)&Perl_ISv_ptr},
+ {"Perl_Istack_sp_ptr", (PERL_PROC*)&Perl_Istack_sp_ptr},
+--- 372,378 ----
+ {"Perl_Tna_ptr", (PERL_PROC*)&Perl_Tna_ptr},
+ #else
+ {"Perl_sv_free2", (PERL_PROC*)&Perl_sv_free2},
+! {"Perl_sys_init", (PERL_PROC*)&Perl_sys_init},
+ {"Perl_sys_term", (PERL_PROC*)&Perl_sys_term},
+ {"Perl_ISv_ptr", (PERL_PROC*)&Perl_ISv_ptr},
+ {"Perl_Istack_sp_ptr", (PERL_PROC*)&Perl_Istack_sp_ptr},
+***************
+*** 460,466 ****
+ static char *argv[] = { "", "-e", "" };
+
+ #if (PERL_REVISION == 5) && (PERL_VERSION >= 10)
+! Perl_sys_init3(&argc, (char***)&argv, NULL);
+ #endif
+ perl_interp = perl_alloc();
+ perl_construct(perl_interp);
+--- 460,466 ----
+ static char *argv[] = { "", "-e", "" };
+
+ #if (PERL_REVISION == 5) && (PERL_VERSION >= 10)
+! Perl_sys_init(&argc, (char***)&argv);
+ #endif
+ perl_interp = perl_alloc();
+ perl_construct(perl_interp);
+*** ../vim-7.2.062/src/version.c Wed Dec 3 11:21:20 2008
+--- src/version.c Wed Dec 3 12:42:50 2008
+***************
+*** 678,679 ****
+--- 678,681 ----
+ { /* Add new patch number below this line */
++ /**/
++ 63,
+ /**/
+
+--
+Windows
+M!uqoms
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ download, build and distribute -- http://www.A-A-P.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
--- /dev/null
+To: vim-dev@vim.org
+Subject: Patch 7.2.064
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=ISO-8859-1
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 7.2.064
+Problem: Screen update bug when repeating "~" on a Visual block and the
+ last line doesn't change.
+Solution: Keep track of changes for all lines. (Moritz Orbach)
+Files: src/ops.c
+
+
+*** ../vim-7.2.063/src/ops.c Tue Jun 24 23:59:55 2008
+--- src/ops.c Wed Dec 3 13:12:06 2008
+***************
+*** 2209,2220 ****
+ {
+ for (; pos.lnum <= oap->end.lnum; ++pos.lnum)
+ {
+ block_prep(oap, &bd, pos.lnum, FALSE);
+ pos.col = bd.textcol;
+! did_change = swapchars(oap->op_type, &pos, bd.textlen);
+
+ # ifdef FEAT_NETBEANS_INTG
+! if (usingNetbeans && did_change)
+ {
+ char_u *ptr = ml_get_buf(curbuf, pos.lnum, FALSE);
+
+--- 2209,2223 ----
+ {
+ for (; pos.lnum <= oap->end.lnum; ++pos.lnum)
+ {
++ int one_change;
++
+ block_prep(oap, &bd, pos.lnum, FALSE);
+ pos.col = bd.textcol;
+! one_change = swapchars(oap->op_type, &pos, bd.textlen);
+! did_change |= one_change;
+
+ # ifdef FEAT_NETBEANS_INTG
+! if (usingNetbeans && one_change)
+ {
+ char_u *ptr = ml_get_buf(curbuf, pos.lnum, FALSE);
+
+*** ../vim-7.2.063/src/version.c Wed Dec 3 13:18:16 2008
+--- src/version.c Wed Dec 3 13:14:46 2008
+***************
+*** 678,679 ****
+--- 678,681 ----
+ { /* Add new patch number below this line */
++ /**/
++ 64,
+ /**/
+
+--
+Q: How many hardware engineers does it take to change a lightbulb?
+A: None. We'll fix it in software.
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ download, build and distribute -- http://www.A-A-P.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
--- /dev/null
+To: vim-dev@vim.org
+Subject: Patch 7.2.065
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=ISO-8859-1
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 7.2.065
+Problem: GTK GUI: the cursor disappears when doing ":vsp" and the Vim
+ window is maximized. (Dominique Pelle, Denis Smolyar)
+Solution: Don't change "Columns" back to an old value at a wrong moment.
+ Do change "Rows" when it should not be a problem.
+Files: src/gui.c
+
+
+*** ../vim-7.2.064/src/gui.c Fri Nov 28 21:26:50 2008
+--- src/gui.c Wed Dec 3 18:01:21 2008
+***************
+*** 3241,3247 ****
+ i = Rows;
+ gui_update_tabline();
+ Rows = i;
+! need_set_size = RESIZE_VERT;
+ if (using_tabline)
+ fix_size = TRUE;
+ if (!gui_use_tabline())
+--- 3241,3247 ----
+ i = Rows;
+ gui_update_tabline();
+ Rows = i;
+! need_set_size |= RESIZE_VERT;
+ if (using_tabline)
+ fix_size = TRUE;
+ if (!gui_use_tabline())
+***************
+*** 3275,3283 ****
+ if (gui.which_scrollbars[i] != prev_which_scrollbars[i])
+ {
+ if (i == SBAR_BOTTOM)
+! need_set_size = RESIZE_VERT;
+ else
+! need_set_size = RESIZE_HOR;
+ if (gui.which_scrollbars[i])
+ fix_size = TRUE;
+ }
+--- 3275,3283 ----
+ if (gui.which_scrollbars[i] != prev_which_scrollbars[i])
+ {
+ if (i == SBAR_BOTTOM)
+! need_set_size |= RESIZE_VERT;
+ else
+! need_set_size |= RESIZE_HOR;
+ if (gui.which_scrollbars[i])
+ fix_size = TRUE;
+ }
+***************
+*** 3297,3303 ****
+ gui_mch_enable_menu(gui.menu_is_active);
+ Rows = i;
+ prev_menu_is_active = gui.menu_is_active;
+! need_set_size = RESIZE_VERT;
+ if (gui.menu_is_active)
+ fix_size = TRUE;
+ }
+--- 3297,3303 ----
+ gui_mch_enable_menu(gui.menu_is_active);
+ Rows = i;
+ prev_menu_is_active = gui.menu_is_active;
+! need_set_size |= RESIZE_VERT;
+ if (gui.menu_is_active)
+ fix_size = TRUE;
+ }
+***************
+*** 3308,3314 ****
+ {
+ gui_mch_show_toolbar(using_toolbar);
+ prev_toolbar = using_toolbar;
+! need_set_size = RESIZE_VERT;
+ if (using_toolbar)
+ fix_size = TRUE;
+ }
+--- 3308,3314 ----
+ {
+ gui_mch_show_toolbar(using_toolbar);
+ prev_toolbar = using_toolbar;
+! need_set_size |= RESIZE_VERT;
+ if (using_toolbar)
+ fix_size = TRUE;
+ }
+***************
+*** 3318,3324 ****
+ {
+ gui_mch_enable_footer(using_footer);
+ prev_footer = using_footer;
+! need_set_size = RESIZE_VERT;
+ if (using_footer)
+ fix_size = TRUE;
+ }
+--- 3318,3324 ----
+ {
+ gui_mch_enable_footer(using_footer);
+ prev_footer = using_footer;
+! need_set_size |= RESIZE_VERT;
+ if (using_footer)
+ fix_size = TRUE;
+ }
+***************
+*** 3330,3339 ****
+ prev_tearoff = using_tearoff;
+ }
+ #endif
+! if (need_set_size)
+ {
+ #ifdef FEAT_GUI_GTK
+! long c = Columns;
+ #endif
+ /* Adjust the size of the window to make the text area keep the
+ * same size and to avoid that part of our window is off-screen
+--- 3330,3340 ----
+ prev_tearoff = using_tearoff;
+ }
+ #endif
+! if (need_set_size != 0)
+ {
+ #ifdef FEAT_GUI_GTK
+! long prev_Columns = Columns;
+! long prev_Rows = Rows;
+ #endif
+ /* Adjust the size of the window to make the text area keep the
+ * same size and to avoid that part of our window is off-screen
+***************
+*** 3349,3359 ****
+ * If you remove this, please test this command for resizing
+ * effects (with optional left scrollbar): ":vsp|q|vsp|q|vsp|q".
+ * Don't do this while starting up though.
+! * And don't change Rows, it may have be reduced intentionally
+! * when adding menu/toolbar/tabline. */
+! if (!gui.starting)
+ (void)char_avail();
+! Columns = c;
+ #endif
+ }
+ #ifdef FEAT_WINDOWS
+--- 3350,3363 ----
+ * If you remove this, please test this command for resizing
+ * effects (with optional left scrollbar): ":vsp|q|vsp|q|vsp|q".
+ * Don't do this while starting up though.
+! * Don't change Rows when adding menu/toolbar/tabline.
+! * Don't change Columns when adding vertical toolbar. */
+! if (!gui.starting && need_set_size != (RESIZE_VERT | RESIZE_HOR))
+ (void)char_avail();
+! if ((need_set_size & RESIZE_VERT) == 0)
+! Rows = prev_Rows;
+! if ((need_set_size & RESIZE_HOR) == 0)
+! Columns = prev_Columns;
+ #endif
+ }
+ #ifdef FEAT_WINDOWS
+*** ../vim-7.2.064/src/version.c Wed Dec 3 13:38:00 2008
+--- src/version.c Wed Dec 3 18:47:11 2008
+***************
+*** 678,679 ****
+--- 678,681 ----
+ { /* Add new patch number below this line */
++ /**/
++ 65,
+ /**/
+
+--
+Seen on the back of a biker's vest: If you can read this, my wife fell off.
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ download, build and distribute -- http://www.A-A-P.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
--- /dev/null
+To: vim-dev@vim.org
+Subject: Patch 7.2.066
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=ISO-8859-1
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 7.2.066
+Problem: It's not easy to see whether 'encoding' is a multi-byte encoding.
+Solution: Add has('multi_byte_encoding').
+Files: runtime/doc/eval.txt, src/eval.c
+
+
+*** ../vim-7.2.065/runtime/doc/eval.txt Fri Nov 28 11:15:10 2008
+--- runtime/doc/eval.txt Tue Dec 9 10:55:59 2008
+***************
+*** 5841,5847 ****
+ mouse_pterm Compiled with support for qnx pterm mouse.
+ mouse_sysmouse Compiled with support for sysmouse (*BSD console mouse)
+ mouse_xterm Compiled with support for xterm mouse.
+! multi_byte Compiled with support for editing Korean et al.
+ multi_byte_ime Compiled with support for IME input method.
+ multi_lang Compiled with support for multiple languages.
+ mzscheme Compiled with MzScheme interface |mzscheme|.
+--- 5852,5859 ----
+ mouse_pterm Compiled with support for qnx pterm mouse.
+ mouse_sysmouse Compiled with support for sysmouse (*BSD console mouse)
+ mouse_xterm Compiled with support for xterm mouse.
+! multi_byte Compiled with support for 'encoding'
+! multi_byte_encoding 'encoding' is set to a multi-byte encoding.
+ multi_byte_ime Compiled with support for IME input method.
+ multi_lang Compiled with support for multiple languages.
+ mzscheme Compiled with MzScheme interface |mzscheme|.
+*** ../vim-7.2.065/src/eval.c Wed Dec 3 09:51:19 2008
+--- src/eval.c Wed Dec 3 14:29:09 2008
+***************
+*** 11842,11847 ****
+--- 11842,11851 ----
+ n = has_patch(atoi((char *)name + 5));
+ else if (STRICMP(name, "vim_starting") == 0)
+ n = (starting != 0);
++ #ifdef FEAT_MBYTE
++ else if (STRICMP(name, "multi_byte_encoding") == 0)
++ n = has_mbyte;
++ #endif
+ #if defined(FEAT_BEVAL) && defined(FEAT_GUI_W32)
+ else if (STRICMP(name, "balloon_multiline") == 0)
+ n = multiline_balloon_available();
+*** ../vim-7.2.065/src/version.c Wed Dec 3 18:50:09 2008
+--- src/version.c Tue Dec 9 10:48:49 2008
+***************
+*** 678,679 ****
+--- 678,681 ----
+ { /* Add new patch number below this line */
++ /**/
++ 66,
+ /**/
+
+--
+ARTHUR: Listen, old crone! Unless you tell us where we can buy a shrubbery,
+ my friend and I will ... we will say "Ni!"
+CRONE: Do your worst!
+ "Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ download, build and distribute -- http://www.A-A-P.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
--- /dev/null
+To: vim-dev@vim.org
+Subject: Patch 7.2.067
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=ISO-8859-1
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 7.2.067
+Problem: Session file can't load extra file when the path contains special
+ characters.
+Solution: Escape the file name. (Lech Lorens)
+Files: src/ex_docmd.c
+
+
+*** ../vim-7.2.066/src/ex_docmd.c Fri Nov 28 21:26:50 2008
+--- src/ex_docmd.c Fri Dec 5 21:34:11 2008
+***************
+*** 10106,10112 ****
+ */
+ if (put_line(fd, "let s:sx = expand(\"<sfile>:p:r\").\"x.vim\"") == FAIL
+ || put_line(fd, "if file_readable(s:sx)") == FAIL
+! || put_line(fd, " exe \"source \" . s:sx") == FAIL
+ || put_line(fd, "endif") == FAIL)
+ return FAIL;
+
+--- 10106,10112 ----
+ */
+ if (put_line(fd, "let s:sx = expand(\"<sfile>:p:r\").\"x.vim\"") == FAIL
+ || put_line(fd, "if file_readable(s:sx)") == FAIL
+! || put_line(fd, " exe \"source \" . fnameescape(s:sx)") == FAIL
+ || put_line(fd, "endif") == FAIL)
+ return FAIL;
+
+*** ../vim-7.2.066/src/version.c Tue Dec 9 10:56:50 2008
+--- src/version.c Tue Dec 9 11:16:27 2008
+***************
+*** 678,679 ****
+--- 678,681 ----
+ { /* Add new patch number below this line */
++ /**/
++ 67,
+ /**/
+
+--
+Life is a gift, living is an art. (Bram Moolenaar)
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ download, build and distribute -- http://www.A-A-P.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
--- /dev/null
+To: vim-dev@vim.org
+Subject: Patch 7.2.068
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=ISO-8859-1
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 7.2.068
+Problem: Emacs tags file lines can be too long, resulting in an error
+ message. (James Vega)
+Solution: Ignore lines with errors if they are too long.
+Files: src/tag.c
+
+
+*** ../vim-7.2.067/src/tag.c Fri Jul 18 11:26:12 2008
+--- src/tag.c Sat Dec 6 13:54:33 2008
+***************
+*** 2725,2731 ****
+--- 2725,2748 ----
+ */
+ p_7f = vim_strchr(lbuf, 0x7f);
+ if (p_7f == NULL)
++ {
++ etag_fail:
++ if (vim_strchr(lbuf, '\n') == NULL)
++ {
++ /* Truncated line. Ignore it. */
++ if (p_verbose >= 5)
++ {
++ verbose_enter();
++ MSG(_("Ignoring long line in tags file"));
++ verbose_leave();
++ }
++ tagp->command = lbuf;
++ tagp->tagname = lbuf;
++ tagp->tagname_end = lbuf;
++ return OK;
++ }
+ return FAIL;
++ }
+
+ /* Find ^A. If not found the line number is after the 0x7f */
+ p = vim_strchr(p_7f, Ctrl_A);
+***************
+*** 2735,2741 ****
+ ++p;
+
+ if (!VIM_ISDIGIT(*p)) /* check for start of line number */
+! return FAIL;
+ tagp->command = p;
+
+
+--- 2752,2758 ----
+ ++p;
+
+ if (!VIM_ISDIGIT(*p)) /* check for start of line number */
+! goto etag_fail;
+ tagp->command = p;
+
+
+***************
+*** 2749,2755 ****
+ /* find end of tagname */
+ for (p = p_7f - 1; !vim_iswordc(*p); --p)
+ if (p == lbuf)
+! return FAIL;
+ tagp->tagname_end = p + 1;
+ while (p >= lbuf && vim_iswordc(*p))
+ --p;
+--- 2766,2772 ----
+ /* find end of tagname */
+ for (p = p_7f - 1; !vim_iswordc(*p); --p)
+ if (p == lbuf)
+! goto etag_fail;
+ tagp->tagname_end = p + 1;
+ while (p >= lbuf && vim_iswordc(*p))
+ --p;
+*** ../vim-7.2.067/src/version.c Tue Dec 9 11:17:23 2008
+--- src/version.c Tue Dec 9 12:05:41 2008
+***************
+*** 678,679 ****
+--- 678,681 ----
+ { /* Add new patch number below this line */
++ /**/
++ 68,
+ /**/
+
+--
+Q: What do you call a fish without an eye?
+A: fsh!
+Q: What do you call a deer with no eyes?
+A: no eye deer.
+Q: What do you call a deer with no eyes and no legs?
+A: still no eye deer.
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ download, build and distribute -- http://www.A-A-P.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
--- /dev/null
+To: vim-dev@vim.org
+Subject: Patch 7.2.069
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=ISO-8859-1
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 7.2.069 (after 7.2.060)
+Problem: Compiler warning for storing size_t in int.
+Solution: Add type cast.
+Files: src/spell.c
+
+
+*** ../vim-7.2.068/src/spell.c Sun Nov 30 21:11:54 2008
+--- src/spell.c Tue Dec 9 22:19:04 2008
+***************
+*** 1765,1771 ****
+ /* Second part matches at start of following compound word, now
+ * check if first part matches at end of previous word. */
+ p = ((char_u **)gap->ga_data)[i];
+! len = STRLEN(p);
+ if (len <= wlen && STRNCMP(ptr + wlen - len, p, len) == 0)
+ return TRUE;
+ }
+--- 1765,1771 ----
+ /* Second part matches at start of following compound word, now
+ * check if first part matches at end of previous word. */
+ p = ((char_u **)gap->ga_data)[i];
+! len = (int)STRLEN(p);
+ if (len <= wlen && STRNCMP(ptr + wlen - len, p, len) == 0)
+ return TRUE;
+ }
+*** ../vim-7.2.068/src/version.c Tue Dec 9 12:12:31 2008
+--- src/version.c Tue Dec 9 22:21:15 2008
+***************
+*** 678,679 ****
+--- 678,681 ----
+ { /* Add new patch number below this line */
++ /**/
++ 69,
+ /**/
+
+--
+The war between Emacs and Vi is over. Vi has won with 3 to 1.
+ http://www.ssc.com/lg/issue30/raymond.html
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ download, build and distribute -- http://www.A-A-P.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
--- /dev/null
+To: vim-dev@vim.org
+Subject: Patch 7.2.070
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=ISO-8859-1
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 7.2.070
+Problem: Crash when a function returns a:000. (Matt Wozkiski)
+Solution: Don't put the function struct on the stack, allocate it. Free it
+ only when nothing in it is used.
+Files: src/eval.c
+
+
+*** ../vim-7.2.069/src/eval.c Tue Dec 9 10:56:50 2008
+--- src/eval.c Wed Dec 17 21:32:26 2008
+***************
+*** 32,37 ****
+--- 32,40 ----
+
+ #define DICT_MAXNEST 100 /* maximum nesting of lists and dicts */
+
++ #define DO_NOT_FREE_CNT 99999 /* refcount for dict or list that should not
++ be freed. */
++
+ /*
+ * In a hashtab item "hi_key" points to "di_key" in a dictitem.
+ * This avoids adding a pointer to the hashtab item.
+***************
+*** 789,794 ****
+--- 792,799 ----
+ static void func_unref __ARGS((char_u *name));
+ static void func_ref __ARGS((char_u *name));
+ static void call_user_func __ARGS((ufunc_T *fp, int argcount, typval_T *argvars, typval_T *rettv, linenr_T firstline, linenr_T lastline, dict_T *selfdict));
++ static int can_free_funccal __ARGS((funccall_T *fc, int copyID)) ;
++ static void free_funccal __ARGS((funccall_T *fc, int free_val));
+ static void add_nr_var __ARGS((dict_T *dp, dictitem_T *v, char *name, varnumber_T nr));
+ static win_T *find_win_by_nr __ARGS((typval_T *vp, tabpage_T *tp));
+ static void getwinvar __ARGS((typval_T *argvars, typval_T *rettv, int off));
+***************
+*** 923,928 ****
+--- 928,937 ----
+ /* pointer to funccal for currently active function */
+ funccall_T *current_funccal = NULL;
+
++ /* pointer to list of previously used funccal, still around because some
++ * item in it is still being used. */
++ funccall_T *previous_funccal = NULL;
++
+ /*
+ * Return TRUE when a function was ended by a ":return" command.
+ */
+***************
+*** 6490,6496 ****
+ buf_T *buf;
+ win_T *wp;
+ int i;
+! funccall_T *fc;
+ int did_free = FALSE;
+ #ifdef FEAT_WINDOWS
+ tabpage_T *tp;
+--- 6499,6505 ----
+ buf_T *buf;
+ win_T *wp;
+ int i;
+! funccall_T *fc, **pfc;
+ int did_free = FALSE;
+ #ifdef FEAT_WINDOWS
+ tabpage_T *tp;
+***************
+*** 6574,6579 ****
+--- 6583,6602 ----
+ else
+ ll = ll->lv_used_next;
+
++ /* check if any funccal can be freed now */
++ for (pfc = &previous_funccal; *pfc != NULL; )
++ {
++ if (can_free_funccal(*pfc, copyID))
++ {
++ fc = *pfc;
++ *pfc = fc->caller;
++ free_funccal(fc, TRUE);
++ did_free = TRUE;
++ }
++ else
++ pfc = &(*pfc)->caller;
++ }
++
+ return did_free;
+ }
+
+***************
+*** 18962,18968 ****
+ dictitem_T *dict_var;
+ {
+ hash_init(&dict->dv_hashtab);
+! dict->dv_refcount = 99999;
+ dict_var->di_tv.vval.v_dict = dict;
+ dict_var->di_tv.v_type = VAR_DICT;
+ dict_var->di_tv.v_lock = VAR_FIXED;
+--- 18985,18991 ----
+ dictitem_T *dict_var;
+ {
+ hash_init(&dict->dv_hashtab);
+! dict->dv_refcount = DO_NOT_FREE_CNT;
+ dict_var->di_tv.vval.v_dict = dict;
+ dict_var->di_tv.v_type = VAR_DICT;
+ dict_var->di_tv.v_lock = VAR_FIXED;
+***************
+*** 19299,19304 ****
+--- 19322,19329 ----
+ * Copy the values from typval_T "from" to typval_T "to".
+ * When needed allocates string or increases reference count.
+ * Does not make a copy of a list or dict but copies the reference!
++ * It is OK for "from" and "to" to point to the same item. This is used to
++ * make a copy later.
+ */
+ static void
+ copy_tv(from, to)
+***************
+*** 21111,21117 ****
+ char_u *save_sourcing_name;
+ linenr_T save_sourcing_lnum;
+ scid_T save_current_SID;
+! funccall_T fc;
+ int save_did_emsg;
+ static int depth = 0;
+ dictitem_T *v;
+--- 21136,21142 ----
+ char_u *save_sourcing_name;
+ linenr_T save_sourcing_lnum;
+ scid_T save_current_SID;
+! funccall_T *fc;
+ int save_did_emsg;
+ static int depth = 0;
+ dictitem_T *v;
+***************
+*** 21137,21172 ****
+
+ line_breakcheck(); /* check for CTRL-C hit */
+
+! fc.caller = current_funccal;
+! current_funccal = &fc;
+! fc.func = fp;
+! fc.rettv = rettv;
+ rettv->vval.v_number = 0;
+! fc.linenr = 0;
+! fc.returned = FALSE;
+! fc.level = ex_nesting_level;
+ /* Check if this function has a breakpoint. */
+! fc.breakpoint = dbg_find_breakpoint(FALSE, fp->uf_name, (linenr_T)0);
+! fc.dbg_tick = debug_tick;
+
+ /*
+! * Note about using fc.fixvar[]: This is an array of FIXVAR_CNT variables
+ * with names up to VAR_SHORT_LEN long. This avoids having to alloc/free
+ * each argument variable and saves a lot of time.
+ */
+ /*
+ * Init l: variables.
+ */
+! init_var_dict(&fc.l_vars, &fc.l_vars_var);
+ if (selfdict != NULL)
+ {
+ /* Set l:self to "selfdict". Use "name" to avoid a warning from
+ * some compiler that checks the destination size. */
+! v = &fc.fixvar[fixvar_idx++].var;
+ name = v->di_key;
+ STRCPY(name, "self");
+ v->di_flags = DI_FLAGS_RO + DI_FLAGS_FIX;
+! hash_add(&fc.l_vars.dv_hashtab, DI2HIKEY(v));
+ v->di_tv.v_type = VAR_DICT;
+ v->di_tv.v_lock = 0;
+ v->di_tv.vval.v_dict = selfdict;
+--- 21162,21198 ----
+
+ line_breakcheck(); /* check for CTRL-C hit */
+
+! fc = (funccall_T *)alloc(sizeof(funccall_T));
+! fc->caller = current_funccal;
+! current_funccal = fc;
+! fc->func = fp;
+! fc->rettv = rettv;
+ rettv->vval.v_number = 0;
+! fc->linenr = 0;
+! fc->returned = FALSE;
+! fc->level = ex_nesting_level;
+ /* Check if this function has a breakpoint. */
+! fc->breakpoint = dbg_find_breakpoint(FALSE, fp->uf_name, (linenr_T)0);
+! fc->dbg_tick = debug_tick;
+
+ /*
+! * Note about using fc->fixvar[]: This is an array of FIXVAR_CNT variables
+ * with names up to VAR_SHORT_LEN long. This avoids having to alloc/free
+ * each argument variable and saves a lot of time.
+ */
+ /*
+ * Init l: variables.
+ */
+! init_var_dict(&fc->l_vars, &fc->l_vars_var);
+ if (selfdict != NULL)
+ {
+ /* Set l:self to "selfdict". Use "name" to avoid a warning from
+ * some compiler that checks the destination size. */
+! v = &fc->fixvar[fixvar_idx++].var;
+ name = v->di_key;
+ STRCPY(name, "self");
+ v->di_flags = DI_FLAGS_RO + DI_FLAGS_FIX;
+! hash_add(&fc->l_vars.dv_hashtab, DI2HIKEY(v));
+ v->di_tv.v_type = VAR_DICT;
+ v->di_tv.v_lock = 0;
+ v->di_tv.vval.v_dict = selfdict;
+***************
+*** 21178,21208 ****
+ * Set a:0 to "argcount".
+ * Set a:000 to a list with room for the "..." arguments.
+ */
+! init_var_dict(&fc.l_avars, &fc.l_avars_var);
+! add_nr_var(&fc.l_avars, &fc.fixvar[fixvar_idx++].var, "0",
+ (varnumber_T)(argcount - fp->uf_args.ga_len));
+ /* Use "name" to avoid a warning from some compiler that checks the
+ * destination size. */
+! v = &fc.fixvar[fixvar_idx++].var;
+ name = v->di_key;
+ STRCPY(name, "000");
+ v->di_flags = DI_FLAGS_RO | DI_FLAGS_FIX;
+! hash_add(&fc.l_avars.dv_hashtab, DI2HIKEY(v));
+ v->di_tv.v_type = VAR_LIST;
+ v->di_tv.v_lock = VAR_FIXED;
+! v->di_tv.vval.v_list = &fc.l_varlist;
+! vim_memset(&fc.l_varlist, 0, sizeof(list_T));
+! fc.l_varlist.lv_refcount = 99999;
+! fc.l_varlist.lv_lock = VAR_FIXED;
+
+ /*
+ * Set a:firstline to "firstline" and a:lastline to "lastline".
+ * Set a:name to named arguments.
+ * Set a:N to the "..." arguments.
+ */
+! add_nr_var(&fc.l_avars, &fc.fixvar[fixvar_idx++].var, "firstline",
+ (varnumber_T)firstline);
+! add_nr_var(&fc.l_avars, &fc.fixvar[fixvar_idx++].var, "lastline",
+ (varnumber_T)lastline);
+ for (i = 0; i < argcount; ++i)
+ {
+--- 21204,21234 ----
+ * Set a:0 to "argcount".
+ * Set a:000 to a list with room for the "..." arguments.
+ */
+! init_var_dict(&fc->l_avars, &fc->l_avars_var);
+! add_nr_var(&fc->l_avars, &fc->fixvar[fixvar_idx++].var, "0",
+ (varnumber_T)(argcount - fp->uf_args.ga_len));
+ /* Use "name" to avoid a warning from some compiler that checks the
+ * destination size. */
+! v = &fc->fixvar[fixvar_idx++].var;
+ name = v->di_key;
+ STRCPY(name, "000");
+ v->di_flags = DI_FLAGS_RO | DI_FLAGS_FIX;
+! hash_add(&fc->l_avars.dv_hashtab, DI2HIKEY(v));
+ v->di_tv.v_type = VAR_LIST;
+ v->di_tv.v_lock = VAR_FIXED;
+! v->di_tv.vval.v_list = &fc->l_varlist;
+! vim_memset(&fc->l_varlist, 0, sizeof(list_T));
+! fc->l_varlist.lv_refcount = DO_NOT_FREE_CNT;
+! fc->l_varlist.lv_lock = VAR_FIXED;
+
+ /*
+ * Set a:firstline to "firstline" and a:lastline to "lastline".
+ * Set a:name to named arguments.
+ * Set a:N to the "..." arguments.
+ */
+! add_nr_var(&fc->l_avars, &fc->fixvar[fixvar_idx++].var, "firstline",
+ (varnumber_T)firstline);
+! add_nr_var(&fc->l_avars, &fc->fixvar[fixvar_idx++].var, "lastline",
+ (varnumber_T)lastline);
+ for (i = 0; i < argcount; ++i)
+ {
+***************
+*** 21218,21224 ****
+ }
+ if (fixvar_idx < FIXVAR_CNT && STRLEN(name) <= VAR_SHORT_LEN)
+ {
+! v = &fc.fixvar[fixvar_idx++].var;
+ v->di_flags = DI_FLAGS_RO | DI_FLAGS_FIX;
+ }
+ else
+--- 21244,21250 ----
+ }
+ if (fixvar_idx < FIXVAR_CNT && STRLEN(name) <= VAR_SHORT_LEN)
+ {
+! v = &fc->fixvar[fixvar_idx++].var;
+ v->di_flags = DI_FLAGS_RO | DI_FLAGS_FIX;
+ }
+ else
+***************
+*** 21230,21236 ****
+ v->di_flags = DI_FLAGS_RO;
+ }
+ STRCPY(v->di_key, name);
+! hash_add(&fc.l_avars.dv_hashtab, DI2HIKEY(v));
+
+ /* Note: the values are copied directly to avoid alloc/free.
+ * "argvars" must have VAR_FIXED for v_lock. */
+--- 21256,21262 ----
+ v->di_flags = DI_FLAGS_RO;
+ }
+ STRCPY(v->di_key, name);
+! hash_add(&fc->l_avars.dv_hashtab, DI2HIKEY(v));
+
+ /* Note: the values are copied directly to avoid alloc/free.
+ * "argvars" must have VAR_FIXED for v_lock. */
+***************
+*** 21239,21247 ****
+
+ if (ai >= 0 && ai < MAX_FUNC_ARGS)
+ {
+! list_append(&fc.l_varlist, &fc.l_listitems[ai]);
+! fc.l_listitems[ai].li_tv = argvars[i];
+! fc.l_listitems[ai].li_tv.v_lock = VAR_FIXED;
+ }
+ }
+
+--- 21265,21273 ----
+
+ if (ai >= 0 && ai < MAX_FUNC_ARGS)
+ {
+! list_append(&fc->l_varlist, &fc->l_listitems[ai]);
+! fc->l_listitems[ai].li_tv = argvars[i];
+! fc->l_listitems[ai].li_tv.v_lock = VAR_FIXED;
+ }
+ }
+
+***************
+*** 21306,21312 ****
+ if (!fp->uf_profiling && has_profiling(FALSE, fp->uf_name, NULL))
+ func_do_profile(fp);
+ if (fp->uf_profiling
+! || (fc.caller != NULL && fc.caller->func->uf_profiling))
+ {
+ ++fp->uf_tm_count;
+ profile_start(&call_start);
+--- 21332,21338 ----
+ if (!fp->uf_profiling && has_profiling(FALSE, fp->uf_name, NULL))
+ func_do_profile(fp);
+ if (fp->uf_profiling
+! || (fc->caller != NULL && fc->caller->func->uf_profiling))
+ {
+ ++fp->uf_tm_count;
+ profile_start(&call_start);
+***************
+*** 21322,21328 ****
+ did_emsg = FALSE;
+
+ /* call do_cmdline() to execute the lines */
+! do_cmdline(NULL, get_func_line, (void *)&fc,
+ DOCMD_NOWAIT|DOCMD_VERBOSE|DOCMD_REPEAT);
+
+ --RedrawingDisabled;
+--- 21348,21354 ----
+ did_emsg = FALSE;
+
+ /* call do_cmdline() to execute the lines */
+! do_cmdline(NULL, get_func_line, (void *)fc,
+ DOCMD_NOWAIT|DOCMD_VERBOSE|DOCMD_REPEAT);
+
+ --RedrawingDisabled;
+***************
+*** 21337,21352 ****
+
+ #ifdef FEAT_PROFILE
+ if (do_profiling == PROF_YES && (fp->uf_profiling
+! || (fc.caller != NULL && fc.caller->func->uf_profiling)))
+ {
+ profile_end(&call_start);
+ profile_sub_wait(&wait_start, &call_start);
+ profile_add(&fp->uf_tm_total, &call_start);
+ profile_self(&fp->uf_tm_self, &call_start, &fp->uf_tm_children);
+! if (fc.caller != NULL && fc.caller->func->uf_profiling)
+ {
+! profile_add(&fc.caller->func->uf_tm_children, &call_start);
+! profile_add(&fc.caller->func->uf_tml_children, &call_start);
+ }
+ }
+ #endif
+--- 21363,21378 ----
+
+ #ifdef FEAT_PROFILE
+ if (do_profiling == PROF_YES && (fp->uf_profiling
+! || (fc->caller != NULL && fc->caller->func->uf_profiling)))
+ {
+ profile_end(&call_start);
+ profile_sub_wait(&wait_start, &call_start);
+ profile_add(&fp->uf_tm_total, &call_start);
+ profile_self(&fp->uf_tm_self, &call_start, &fp->uf_tm_children);
+! if (fc->caller != NULL && fc->caller->func->uf_profiling)
+ {
+! profile_add(&fc->caller->func->uf_tm_children, &call_start);
+! profile_add(&fc->caller->func->uf_tml_children, &call_start);
+ }
+ }
+ #endif
+***************
+*** 21359,21367 ****
+
+ if (aborting())
+ smsg((char_u *)_("%s aborted"), sourcing_name);
+! else if (fc.rettv->v_type == VAR_NUMBER)
+ smsg((char_u *)_("%s returning #%ld"), sourcing_name,
+! (long)fc.rettv->vval.v_number);
+ else
+ {
+ char_u buf[MSG_BUF_LEN];
+--- 21385,21393 ----
+
+ if (aborting())
+ smsg((char_u *)_("%s aborted"), sourcing_name);
+! else if (fc->rettv->v_type == VAR_NUMBER)
+ smsg((char_u *)_("%s returning #%ld"), sourcing_name,
+! (long)fc->rettv->vval.v_number);
+ else
+ {
+ char_u buf[MSG_BUF_LEN];
+***************
+*** 21372,21378 ****
+ /* The value may be very long. Skip the middle part, so that we
+ * have some idea how it starts and ends. smsg() would always
+ * truncate it at the end. */
+! s = tv2string(fc.rettv, &tofree, numbuf2, 0);
+ if (s != NULL)
+ {
+ trunc_string(s, buf, MSG_BUF_CLEN);
+--- 21398,21404 ----
+ /* The value may be very long. Skip the middle part, so that we
+ * have some idea how it starts and ends. smsg() would always
+ * truncate it at the end. */
+! s = tv2string(fc->rettv, &tofree, numbuf2, 0);
+ if (s != NULL)
+ {
+ trunc_string(s, buf, MSG_BUF_CLEN);
+***************
+*** 21408,21421 ****
+ }
+
+ did_emsg |= save_did_emsg;
+! current_funccal = fc.caller;
+
+! /* The a: variables typevals were not allocated, only free the allocated
+! * variables. */
+! vars_clear_ext(&fc.l_avars.dv_hashtab, FALSE);
+
+! vars_clear(&fc.l_vars.dv_hashtab); /* free all l: variables */
+! --depth;
+ }
+
+ /*
+--- 21434,21517 ----
+ }
+
+ did_emsg |= save_did_emsg;
+! current_funccal = fc->caller;
+! --depth;
+
+! /* if the a:000 list and the a: dict are not referenced we can free the
+! * funccall_T and what's in it. */
+! if (fc->l_varlist.lv_refcount == DO_NOT_FREE_CNT
+! && fc->l_vars.dv_refcount == DO_NOT_FREE_CNT
+! && fc->l_avars.dv_refcount == DO_NOT_FREE_CNT)
+! {
+! free_funccal(fc, FALSE);
+! }
+! else
+! {
+! hashitem_T *hi;
+! listitem_T *li;
+! int todo;
+
+! /* "fc" is still in use. This can happen when returning "a:000" or
+! * assigning "l:" to a global variable.
+! * Link "fc" in the list for garbage collection later. */
+! fc->caller = previous_funccal;
+! previous_funccal = fc;
+!
+! /* Make a copy of the a: variables, since we didn't do that above. */
+! todo = (int)fc->l_avars.dv_hashtab.ht_used;
+! for (hi = fc->l_avars.dv_hashtab.ht_array; todo > 0; ++hi)
+! {
+! if (!HASHITEM_EMPTY(hi))
+! {
+! --todo;
+! v = HI2DI(hi);
+! copy_tv(&v->di_tv, &v->di_tv);
+! }
+! }
+!
+! /* Make a copy of the a:000 items, since we didn't do that above. */
+! for (li = fc->l_varlist.lv_first; li != NULL; li = li->li_next)
+! copy_tv(&li->li_tv, &li->li_tv);
+! }
+! }
+!
+! /*
+! * Return TRUE if items in "fc" do not have "copyID". That means they are not
+! * referenced from anywyere.
+! */
+! static int
+! can_free_funccal(fc, copyID)
+! funccall_T *fc;
+! int copyID;
+! {
+! return (fc->l_varlist.lv_copyID != copyID
+! && fc->l_vars.dv_copyID != copyID
+! && fc->l_avars.dv_copyID != copyID);
+! }
+!
+! /*
+! * Free "fc" and what it contains.
+! */
+! static void
+! free_funccal(fc, free_val)
+! funccall_T *fc;
+! int free_val; /* a: vars were allocated */
+! {
+! listitem_T *li;
+!
+! /* The a: variables typevals may not have been allocated, only free the
+! * allocated variables. */
+! vars_clear_ext(&fc->l_avars.dv_hashtab, free_val);
+!
+! /* free all l: variables */
+! vars_clear(&fc->l_vars.dv_hashtab);
+!
+! /* Free the a:000 variables if they were allocated. */
+! if (free_val)
+! for (li = fc->l_varlist.lv_first; li != NULL; li = li->li_next)
+! clear_tv(&li->li_tv);
+!
+! vim_free(fc);
+ }
+
+ /*
+*** ../vim-7.2.069/src/version.c Tue Dec 9 22:34:02 2008
+--- src/version.c Sun Dec 21 12:47:07 2008
+***************
+*** 678,679 ****
+--- 678,681 ----
+ { /* Add new patch number below this line */
++ /**/
++ 70,
+ /**/
+
+--
+Close your shells, or I'll kill -9 you
+Tomorrow I'll quota you
+Remember the disks'll always be full
+And then while I'm away
+I'll write ~ everyday
+And I'll send-pr all my buggings to you.
+ [ CVS log "Beatles style" for FreeBSD ports/INDEX, Satoshi Asami ]
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ download, build and distribute -- http://www.A-A-P.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
--- /dev/null
+To: vim-dev@vim.org
+Subject: Patch 7.2.071
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=ISO-8859-1
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 7.2.071 (extra)
+Problem: Win32: Handling netbeans events while Vim is busy updating the
+ screen may cause a crash.
+Solution: Like with GTK, only handle netbeans messages in the main loop.
+ (Xavier de Gaye)
+Files: src/gui_w48.c, src/netbeans.c
+
+
+*** ../vim-7.2.070/src/gui_w48.c Thu Nov 20 17:09:09 2008
+--- src/gui_w48.c Thu Dec 11 23:47:18 2008
+***************
+*** 1937,1942 ****
+--- 1937,1947 ----
+ s_need_activate = FALSE;
+ }
+
++ #ifdef FEAT_NETBEANS_INTG
++ /* Process the queued netbeans messages. */
++ netbeans_parse_messages();
++ #endif
++
+ /*
+ * Don't use gui_mch_update() because then we will spin-lock until a
+ * char arrives, instead we use GetMessage() to hang until an
+*** ../vim-7.2.070/src/netbeans.c Fri Nov 28 21:26:50 2008
+--- src/netbeans.c Sun Nov 30 12:07:00 2008
+***************
+*** 769,779 ****
+ return; /* don't try to parse it */
+ }
+
+! #ifdef FEAT_GUI_GTK
+ if (gtk_main_level() > 0)
+ gtk_main_quit();
+ #else
+! /* Parse the messages, but avoid recursion. */
+ if (level == 1)
+ netbeans_parse_messages();
+
+--- 769,782 ----
+ return; /* don't try to parse it */
+ }
+
+! #if defined(FEAT_GUI_GTK) || defined(FEAT_GUI_W32)
+! /* Let the main loop handle messages. */
+! # ifdef FEAT_GUI_GTK
+ if (gtk_main_level() > 0)
+ gtk_main_quit();
++ # endif
+ #else
+! /* Parse the messages now, but avoid recursion. */
+ if (level == 1)
+ netbeans_parse_messages();
+
+*** ../vim-7.2.070/src/version.c Sun Dec 21 13:02:47 2008
+--- src/version.c Wed Dec 24 12:18:59 2008
+***************
+*** 678,679 ****
+--- 678,681 ----
+ { /* Add new patch number below this line */
++ /**/
++ 71,
+ /**/
+
+--
+No children may attend school with their breath smelling of "wild onions."
+ [real standing law in West Virginia, United States of America]
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ download, build and distribute -- http://www.A-A-P.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
--- /dev/null
+To: vim-dev@vim.org
+Subject: Patch 7.2.072 (extra)
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=ISO-8859-1
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 7.2.072 (extra)
+Problem: Compiler warning in Sniff code.
+Solution: Use return value of pipe(). (Dominique Pelle)
+Files: src/if_sniff.c
+
+
+*** ../vim-7.2.071/src/if_sniff.c Sat Nov 15 14:11:10 2008
+--- src/if_sniff.c Sat Dec 6 14:01:57 2008
+***************
+*** 716,723 ****
+ #else /* UNIX Version of the Code */
+ int ToSniffEmacs[2], FromSniffEmacs[2];
+
+! pipe(ToSniffEmacs);
+! pipe(FromSniffEmacs);
+
+ /* fork */
+ if ((sniffemacs_pid=fork()) == 0)
+--- 714,723 ----
+ #else /* UNIX Version of the Code */
+ int ToSniffEmacs[2], FromSniffEmacs[2];
+
+! if (pipe(ToSniffEmacs) != 0)
+! return 1;
+! if (pipe(FromSniffEmacs) != 0)
+! return 1;
+
+ /* fork */
+ if ((sniffemacs_pid=fork()) == 0)
+*** ../vim-7.2.071/src/version.c Wed Dec 24 12:20:10 2008
+--- src/version.c Wed Dec 24 12:42:13 2008
+***************
+*** 678,679 ****
+--- 678,681 ----
+ { /* Add new patch number below this line */
++ /**/
++ 72,
+ /**/
+
+--
+SIGIRO -- irony detected (iron core dumped)
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ download, build and distribute -- http://www.A-A-P.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
--- /dev/null
+To: vim-dev@vim.org
+Subject: Patch 7.2.073
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=ISO-8859-1
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 7.2.073
+Problem: ":set <xHome>" has the same output as ":set <Home>". (Matt
+ Wozniski)
+Solution: Don't translate "x" keys to its alternative for ":set".
+Files: src/misc2.c, src/option.c, src/proto/misc2.pro
+
+
+*** ../vim-7.2.072/src/misc2.c Wed Nov 12 13:07:48 2008
+--- src/misc2.c Sun Dec 14 12:28:47 2008
+***************
+*** 2561,2567 ****
+ int key;
+ int dlen = 0;
+
+! key = find_special_key(srcp, &modifiers, keycode);
+ if (key == 0)
+ return 0;
+
+--- 2561,2567 ----
+ int key;
+ int dlen = 0;
+
+! key = find_special_key(srcp, &modifiers, keycode, FALSE);
+ if (key == 0)
+ return 0;
+
+***************
+*** 2597,2606 ****
+ * returns 0 if there is no match.
+ */
+ int
+! find_special_key(srcp, modp, keycode)
+ char_u **srcp;
+ int *modp;
+! int keycode; /* prefer key code, e.g. K_DEL instead of DEL */
+ {
+ char_u *last_dash;
+ char_u *end_of_name;
+--- 2597,2607 ----
+ * returns 0 if there is no match.
+ */
+ int
+! find_special_key(srcp, modp, keycode, keep_x_key)
+ char_u **srcp;
+ int *modp;
+! int keycode; /* prefer key code, e.g. K_DEL instead of DEL */
+! int keep_x_key; /* don't translate xHome to Home key */
+ {
+ char_u *last_dash;
+ char_u *end_of_name;
+***************
+*** 2668,2674 ****
+ else
+ {
+ key = get_special_key_code(last_dash + 1);
+! key = handle_x_keys(key);
+ }
+
+ /*
+--- 2669,2676 ----
+ else
+ {
+ key = get_special_key_code(last_dash + 1);
+! if (!keep_x_key)
+! key = handle_x_keys(key);
+ }
+
+ /*
+*** ../vim-7.2.072/src/option.c Fri Nov 28 21:26:50 2008
+--- src/option.c Sun Dec 14 12:28:56 2008
+***************
+*** 8328,8334 ****
+ {
+ --arg; /* put arg at the '<' */
+ modifiers = 0;
+! key = find_special_key(&arg, &modifiers, TRUE);
+ if (modifiers) /* can't handle modifiers here */
+ key = 0;
+ }
+--- 8328,8334 ----
+ {
+ --arg; /* put arg at the '<' */
+ modifiers = 0;
+! key = find_special_key(&arg, &modifiers, TRUE, TRUE);
+ if (modifiers) /* can't handle modifiers here */
+ key = 0;
+ }
+*** ../vim-7.2.072/src/proto/misc2.pro Thu Jul 24 20:29:37 2008
+--- src/proto/misc2.pro Sun Dec 14 12:29:05 2008
+***************
+*** 59,65 ****
+ int handle_x_keys __ARGS((int key));
+ char_u *get_special_key_name __ARGS((int c, int modifiers));
+ int trans_special __ARGS((char_u **srcp, char_u *dst, int keycode));
+! int find_special_key __ARGS((char_u **srcp, int *modp, int keycode));
+ int extract_modifiers __ARGS((int key, int *modp));
+ int find_special_key_in_table __ARGS((int c));
+ int get_special_key_code __ARGS((char_u *name));
+--- 59,65 ----
+ int handle_x_keys __ARGS((int key));
+ char_u *get_special_key_name __ARGS((int c, int modifiers));
+ int trans_special __ARGS((char_u **srcp, char_u *dst, int keycode));
+! int find_special_key __ARGS((char_u **srcp, int *modp, int keycode, int keep_x_key));
+ int extract_modifiers __ARGS((int key, int *modp));
+ int find_special_key_in_table __ARGS((int c));
+ int get_special_key_code __ARGS((char_u *name));
+*** ../vim-7.2.072/src/version.c Wed Dec 24 12:43:15 2008
+--- src/version.c Wed Dec 24 12:51:26 2008
+***************
+*** 678,679 ****
+--- 678,681 ----
+ { /* Add new patch number below this line */
++ /**/
++ 73,
+ /**/
+
+
+--
+ARTHUR: If you do not open these doors, we will take this castle by force ...
+ [A bucket of slops land on ARTHUR. He tries to retain his dignity.]
+ "Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ download, build and distribute -- http://www.A-A-P.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
--- /dev/null
+To: vim-dev@vim.org
+Subject: Patch 7.2.074 (extra)
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=ISO-8859-1
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 7.2.074 (extra, after 7.2.073)
+Problem: ":set <xHome>" has the same output as ":set <Home>". (Matt
+ Wozniski)
+Solution: Don't translate "x" keys to its alternative for ":set".
+Files: src/gui_mac.c
+
+
+*** ../vim-7.2.073/src/gui_mac.c Sat Aug 9 19:37:28 2008
+--- src/gui_mac.c Sun Dec 14 12:28:26 2008
+***************
+*** 4966,4972 ****
+ char_u *p_actext;
+
+ p_actext = menu->actext;
+! key = find_special_key(&p_actext, &modifiers, /*keycode=*/0);
+ if (*p_actext != 0)
+ key = 0; /* error: trailing text */
+ /* find_special_key() returns a keycode with as many of the
+--- 4966,4972 ----
+ char_u *p_actext;
+
+ p_actext = menu->actext;
+! key = find_special_key(&p_actext, &modifiers, FALSE, FALSE);
+ if (*p_actext != 0)
+ key = 0; /* error: trailing text */
+ /* find_special_key() returns a keycode with as many of the
+*** ../vim-7.2.073/src/version.c Wed Dec 24 12:53:33 2008
+--- src/version.c Wed Dec 24 12:55:42 2008
+***************
+*** 678,679 ****
+--- 678,681 ----
+ { /* Add new patch number below this line */
++ /**/
++ 74,
+ /**/
+
+--
+ Another bucket of what can only be described as human ordure hits ARTHUR.
+ARTHUR: ... Right! (to the KNIGHTS) That settles it!
+ "Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ download, build and distribute -- http://www.A-A-P.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
--- /dev/null
+To: vim-dev@vim.org
+Subject: Patch 7.2.075
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=ISO-8859-1
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 7.2.075 (after 7.2.058)
+Problem: Explanation about making a diff for extra_patches is unclear.
+Solution: Adjust comment.
+Files: src/version.c
+
+
+*** ../vim-7.2.074/src/version.c Wed Dec 24 13:04:41 2008
+--- src/version.c Wed Dec 24 13:07:47 2008
+***************
+*** 833,839 ****
+ * Keep it short, e.g.,: "relative numbers", "persistent undo".
+ * Also add a comment marker to separate the lines.
+ * See the official Vim patches for the diff format: It must use a context of
+! * one line only. Use "diff -C2".
+ */
+ static char *(extra_patches[]) =
+ { /* Add your patch description below this line */
+--- 835,841 ----
+ * Keep it short, e.g.,: "relative numbers", "persistent undo".
+ * Also add a comment marker to separate the lines.
+ * See the official Vim patches for the diff format: It must use a context of
+! * one line only. Create it by hand or use "diff -C2" and edit the patch.
+ */
+ static char *(extra_patches[]) =
+ { /* Add your patch description below this line */
+*** ../vim-7.2.074/src/version.c Wed Dec 24 13:04:41 2008
+--- src/version.c Wed Dec 24 13:07:47 2008
+***************
+*** 678,679 ****
+--- 678,681 ----
+ { /* Add new patch number below this line */
++ /**/
++ 75,
+ /**/
+
+--
+BEDEVERE: Stand by for attack!!
+ [CUT TO enormous army forming up. Trebuchets, rows of PIKEMEN, siege
+ towers, pennants flying, shouts of "Stand by for attack!" Traditional
+ army build-up shots. The shouts echo across the ranks of the army.
+ We see various groups reacting, and stirring themselves in readiness.]
+ARTHUR: Who are they?
+BEDEVERE: Oh, just some friends!
+ "Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ download, build and distribute -- http://www.A-A-P.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///