summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/Make_mvc.mak44
-rw-r--r--src/diff.c3
-rw-r--r--src/edit.c55
-rw-r--r--src/eval.c29
-rw-r--r--src/ex_cmds.c1
-rw-r--r--src/ex_docmd.c3
-rw-r--r--src/ex_eval.c6
-rw-r--r--src/fold.c3
-rw-r--r--src/getchar.c19
-rw-r--r--src/gui_gtk.c4
-rw-r--r--src/gui_gtk_x11.c6
-rw-r--r--src/gui_w32.c131
-rw-r--r--src/hardcopy.c10
-rw-r--r--src/mbyte.c2
-rw-r--r--src/menu.c3
-rw-r--r--src/message.c32
-rw-r--r--src/misc1.c10
-rw-r--r--src/misc2.c28
-rw-r--r--src/netbeans.c38
-rw-r--r--src/normal.c6
-rw-r--r--src/ops.c11
-rw-r--r--src/option.c26
-rw-r--r--src/os_mswin.c20
-rw-r--r--src/os_unix.c2
-rw-r--r--src/os_win32.c2
-rw-r--r--src/proto/message.pro137
-rw-r--r--src/regexp.c6
-rw-r--r--src/spell.c8
-rw-r--r--src/syntax.c3
-rw-r--r--src/testdir/test61.in7
-rw-r--r--src/testdir/test61.ok2
-rw-r--r--src/version.h6
-rw-r--r--src/vim.h10
-rw-r--r--src/window.c2
34 files changed, 448 insertions, 227 deletions
diff --git a/src/Make_mvc.mak b/src/Make_mvc.mak
index f9d211d34..a78f756ec 100644
--- a/src/Make_mvc.mak
+++ b/src/Make_mvc.mak
@@ -1,9 +1,8 @@
-# Makefile for Vim on Win32 (Windows NT and Windows 95), using the
-# Microsoft Visual C++ 2.x and MSVC 4.x compilers (or newer).
-# It builds on Windows 95 and all four NT platforms: i386, Alpha, MIPS, and
-# PowerPC. The NT/i386 binary and the Windows 95 binary are identical.
+# Makefile for Vim on Win32 (Windows NT/2000/XP/2003 and Windows 95/98/Me)
+# and Win64, using the Microsoft Visual C++ compilers. Known to work with
+# VC5, VC6 (VS98), VC7.0 (VS2002), VC7.1 (VS2003), and VC8 (VS2005).
#
-# To build using Borland C++, use Make_bc3.mak or Make_bc5.mak.
+# To build using other Windows compilers, see INSTALLpc.txt
#
# This makefile can build the console, GUI, OLE-enable, Perl-enabled and
# Python-enabled versions of vim for Win32 platforms.
@@ -172,8 +171,11 @@ OBJDIR = $(OBJDIR)d
!ifdef PROCESSOR_ARCHITECTURE
# We're on Windows NT or using VC 6+
-! ifndef CPU
+! ifdef CPU
+ASSEMBLY_ARCHITECTURE=$(CPU)
+! else
CPU = $(PROCESSOR_ARCHITECTURE)
+ASSEMBLY_ARCHITECTURE = $(PROCESSOR_ARCHITECTURE)
! if ("$(CPU)" == "x86") || ("$(CPU)" == "X86")
CPU = i386
! endif
@@ -183,6 +185,9 @@ CPU = i386
CPU = i386
!endif # !PROCESSOR_ARCHITECTURE
+!if ("$(CPU)" == "AMD64") || ("$(CPU)" == "IA64")
+DEFINES=$(DEFINES) /Wp64
+!endif
# Build a retail version by default
@@ -752,6 +757,7 @@ clean:
- if exist $(VIM).pdb del $(VIM).pdb
- if exist $(VIM).map del $(VIM).map
- if exist $(VIM).ncb del $(VIM).ncb
+ - if exist gvim.exe.mnf del gvim.exe.mnf
- if exist vimrun.exe del vimrun.exe
- if exist install.exe del install.exe
- if exist uninstal.exe del uninstal.exe
@@ -933,7 +939,7 @@ $(OUTDIR)/window.obj: $(OUTDIR) window.c $(INCL)
$(OUTDIR)/xpm_w32.obj: $(OUTDIR) xpm_w32.c
$(CC) $(CFLAGS) $(XPM_INC) xpm_w32.c
-$(OUTDIR)/vim.res: $(OUTDIR) vim.rc version.h tools.bmp tearoff.bmp \
+$(OUTDIR)/vim.res: $(OUTDIR) gvim.exe.mnf vim.rc version.h tools.bmp tearoff.bmp \
vim.ico vim_error.ico vim_alert.ico vim_info.ico vim_quest.ico
$(RC) /l 0x409 /Fo$(OUTDIR)/vim.res $(RCFLAGS) vim.rc
@@ -963,6 +969,30 @@ $(PATHDEF_SRC): auto
@echo char_u *compiled_user = (char_u *)"$(USERNAME)"; >> $(PATHDEF_SRC)
@echo char_u *compiled_sys = (char_u *)"$(USERDOMAIN)"; >> $(PATHDEF_SRC)
+gvim.exe.mnf: auto
+ @echo ^<?xml version="1.0" encoding="UTF-8" standalone="yes"?^> >$@
+ @echo ^<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"^> >>$@
+ @echo ^<assemblyIdentity >>$@
+ @echo processorArchitecture="$(ASSEMBLY_ARCHITECTURE)" >>$@
+ @echo version="7.0.0.0" >>$@
+ @echo type="win32" >>$@
+ @echo name="Vim" >>$@
+ @echo /^> >>$@
+ @echo ^<description^>Vi Improved - A Text Editor^</description^> >>$@
+ @echo ^<dependency^> >>$@
+ @echo ^<dependentAssembly^> >>$@
+ @echo ^<assemblyIdentity >>$@
+ @echo type="win32" >>$@
+ @echo name="Microsoft.Windows.Common-Controls" >>$@
+ @echo version="6.0.0.0" >>$@
+ @echo publicKeyToken="6595b64144ccf1df" >>$@
+ @echo language="*" >>$@
+ @echo processorArchitecture="$(ASSEMBLY_ARCHITECTURE)" >>$@
+ @echo /^> >>$@
+ @echo ^</dependentAssembly^> >>$@
+ @echo ^</dependency^> >>$@
+ @echo ^</assembly^> >>$@
+
auto:
if not exist auto/nul mkdir auto
diff --git a/src/diff.c b/src/diff.c
index 5f8a84a17..22cf5af0d 100644
--- a/src/diff.c
+++ b/src/diff.c
@@ -1330,7 +1330,7 @@ diff_read(idx_orig, idx_new, fname)
/* Allocate a new diffblock. */
dp = diff_alloc_new(curtab, dprev, dp);
if (dp == NULL)
- return;
+ goto done;
dp->df_lnum[idx_orig] = lnum_orig;
dp->df_count[idx_orig] = count_orig;
@@ -1357,6 +1357,7 @@ diff_read(idx_orig, idx_new, fname)
notset = TRUE;
}
+done:
fclose(fd);
}
diff --git a/src/edit.c b/src/edit.c
index ed416f30a..2c9711960 100644
--- a/src/edit.c
+++ b/src/edit.c
@@ -178,7 +178,9 @@ static int spell_bad_len = 0; /* length of located bad word */
#endif
static void stop_insert __ARGS((pos_T *end_insert_pos, int esc));
static int echeck_abbr __ARGS((int));
+#if 0
static void replace_push_off __ARGS((int c));
+#endif
static int replace_pop __ARGS((void));
static void replace_join __ARGS((int off));
static void replace_pop_ins __ARGS((void));
@@ -5823,7 +5825,7 @@ redo_literal(c)
*/
static void
start_arrow(end_insert_pos)
- pos_T *end_insert_pos;
+ pos_T *end_insert_pos; /* can be NULL */
{
if (!arrow_used) /* something has been inserted */
{
@@ -5912,11 +5914,13 @@ stop_arrow()
}
/*
- * do a few things to stop inserting
+ * Do a few things to stop inserting.
+ * "end_insert_pos" is where insert ended. It is NULL when we already jumped
+ * to another window/buffer.
*/
static void
stop_insert(end_insert_pos, esc)
- pos_T *end_insert_pos; /* where insert ended */
+ pos_T *end_insert_pos;
int esc; /* called by ins_esc() */
{
int cc;
@@ -5941,7 +5945,7 @@ stop_insert(end_insert_pos, esc)
else
vim_free(ptr);
- if (!arrow_used)
+ if (!arrow_used && end_insert_pos != NULL)
{
/* Auto-format now. It may seem strange to do this when stopping an
* insertion (or moving the cursor), but it's required when appending
@@ -5987,7 +5991,7 @@ stop_insert(end_insert_pos, esc)
* of the line, and put the cursor back.
* Do this when ESC was used or moving the cursor up/down. */
if (did_ai && (esc || (vim_strchr(p_cpo, CPO_INDENT) == NULL
- && curwin->w_cursor.lnum != end_insert_pos->lnum)))
+ && curwin->w_cursor.lnum != end_insert_pos->lnum)))
{
pos_T tpos = curwin->w_cursor;
@@ -6030,9 +6034,13 @@ stop_insert(end_insert_pos, esc)
can_si_back = FALSE;
#endif
- /* set '[ and '] to the inserted text */
- curbuf->b_op_start = Insstart;
- curbuf->b_op_end = *end_insert_pos;
+ /* Set '[ and '] to the inserted text. When end_insert_pos is NULL we are
+ * now in a different buffer. */
+ if (end_insert_pos != NULL)
+ {
+ curbuf->b_op_start = Insstart;
+ curbuf->b_op_end = *end_insert_pos;
+ }
}
/*
@@ -6563,6 +6571,7 @@ replace_push(c)
++replace_stack_nr;
}
+#if 0
/*
* call replace_push(c) with replace_offset set to the first NUL.
*/
@@ -6580,6 +6589,7 @@ replace_push_off(c)
replace_push(c);
replace_offset = 0;
}
+#endif
/*
* Pop one item from the replace stack.
@@ -8023,7 +8033,9 @@ ins_bs(c, mode, inserted_space_p)
int ts;
colnr_T vcol;
colnr_T want_vcol;
+#if 0
int extra = 0;
+#endif
*inserted_space_p = FALSE;
if (p_sta && in_indent)
@@ -8082,15 +8094,19 @@ ins_bs(c, mode, inserted_space_p)
#endif
{
ins_str((char_u *)" ");
- if ((State & REPLACE_FLAG) && extra <= 1)
+ if ((State & REPLACE_FLAG) /* && extra <= 1 */)
{
+#if 0
if (extra)
replace_push_off(NUL);
else
+#endif
replace_push(NUL);
}
+#if 0
if (extra == 2)
extra = 1;
+#endif
}
getvcol(curwin, &curwin->w_cursor, &vcol, NULL, NULL);
}
@@ -8205,6 +8221,7 @@ ins_mouse(c)
int c;
{
pos_T tpos;
+ win_T *old_curwin = curwin;
# ifdef FEAT_GUI
/* When GUI is active, also move/paste when 'mouse' is empty */
@@ -8217,7 +8234,25 @@ ins_mouse(c)
tpos = curwin->w_cursor;
if (do_mouse(NULL, c, BACKWARD, 1L, 0))
{
- start_arrow(&tpos);
+#ifdef FEAT_WINDOWS
+ win_T *new_curwin = curwin;
+
+ if (curwin != old_curwin && win_valid(old_curwin))
+ {
+ /* Mouse took us to another window. We need to go back to the
+ * previous one to stop insert there properly. */
+ curwin = old_curwin;
+ curbuf = curwin->w_buffer;
+ }
+#endif
+ start_arrow(curwin == old_curwin ? &tpos : NULL);
+#ifdef FEAT_WINDOWS
+ if (curwin != new_curwin && win_valid(new_curwin))
+ {
+ curwin = new_curwin;
+ curbuf = curwin->w_buffer;
+ }
+#endif
# ifdef FEAT_CINDENT
can_cindent = TRUE;
# endif
diff --git a/src/eval.c b/src/eval.c
index 1e75a31a3..14460a0a9 100644
--- a/src/eval.c
+++ b/src/eval.c
@@ -1413,7 +1413,7 @@ call_vim_function(func, argc, argv, safe, rettv)
void *save_funccalp = NULL;
int ret;
- argvars = (typval_T *)alloc((unsigned)(argc * sizeof(typval_T)));
+ argvars = (typval_T *)alloc((unsigned)((argc + 1) * sizeof(typval_T)));
if (argvars == NULL)
return FAIL;
@@ -7318,7 +7318,7 @@ get_func_tv(name, len, rettv, arg, firstline, lastline, doesrange,
{
char_u *argp;
int ret = OK;
- typval_T argvars[MAX_FUNC_ARGS]; /* vars for arguments */
+ typval_T argvars[MAX_FUNC_ARGS + 1]; /* vars for arguments */
int argcount = 0; /* number of arguments found */
/*
@@ -7375,7 +7375,8 @@ call_func(name, len, rettv, argcount, argvars, firstline, lastline,
int len; /* length of "name" */
typval_T *rettv; /* return value goes here */
int argcount; /* number of "argvars" */
- typval_T *argvars; /* vars for arguments */
+ typval_T *argvars; /* vars for arguments, must have "argcount"
+ PLUS ONE elements! */
linenr_T firstline; /* first line of range */
linenr_T lastline; /* last line of range */
int *doesrange; /* return: function handled range */
@@ -8064,7 +8065,7 @@ f_call(argvars, rettv)
typval_T *rettv;
{
char_u *func;
- typval_T argv[MAX_FUNC_ARGS];
+ typval_T argv[MAX_FUNC_ARGS + 1];
int argc = 0;
listitem_T *item;
int dummy;
@@ -8943,7 +8944,7 @@ f_extend(argvars, rettv)
break;
if (i == 3)
{
- EMSGN(_(e_invarg2), action);
+ EMSG2(_(e_invarg2), action);
return;
}
}
@@ -12997,7 +12998,7 @@ remote_common(argvars, rettv, expr)
char_u str[30];
char_u *idvar;
- sprintf((char *)str, "0x%x", (unsigned int)w);
+ sprintf((char *)str, PRINTF_HEX_LONG_U, (long_u)w);
v.di_tv.v_type = VAR_STRING;
v.di_tv.vval.v_string = vim_strsave(str);
idvar = get_tv_string_chk(&argvars[2]);
@@ -13064,7 +13065,7 @@ f_remote_peek(argvars, rettv)
dictitem_T v;
char_u *s = NULL;
# ifdef WIN32
- int n = 0;
+ long_u n = 0;
# endif
char_u *serverid;
@@ -13080,7 +13081,7 @@ f_remote_peek(argvars, rettv)
return; /* type error; errmsg already given */
}
# ifdef WIN32
- sscanf(serverid, "%x", &n);
+ sscanf(serverid, SCANF_HEX_LONG_U, &n);
if (n == 0)
rettv->vval.v_number = -1;
else
@@ -13128,9 +13129,9 @@ f_remote_read(argvars, rettv)
{
# ifdef WIN32
/* The server's HWND is encoded in the 'id' parameter */
- int n = 0;
+ long_u n = 0;
- sscanf(serverid, "%x", &n);
+ sscanf(serverid, SCANF_HEX_LONG_U, &n);
if (n != 0)
r = serverGetReply((HWND)n, FALSE, TRUE, TRUE);
if (r == NULL)
@@ -14585,7 +14586,7 @@ item_compare2(s1, s2)
{
int res;
typval_T rettv;
- typval_T argv[2];
+ typval_T argv[3];
int dummy;
/* shortcut after failure in previous call; compare all items equal */
@@ -15133,11 +15134,12 @@ f_strridx(argvars, rettv)
needle = get_tv_string_chk(&argvars[1]);
haystack = get_tv_string_buf_chk(&argvars[0], buf);
- haystack_len = (int)STRLEN(haystack);
rettv->vval.v_number = -1;
if (needle == NULL || haystack == NULL)
return; /* type error; errmsg already given */
+
+ haystack_len = (int)STRLEN(haystack);
if (argvars[2].v_type != VAR_UNKNOWN)
{
/* Third argument: upper limit for index */
@@ -15398,7 +15400,10 @@ f_system(argvars, rettv)
}
p = get_tv_string_buf_chk(&argvars[1], buf);
if (p == NULL)
+ {
+ fclose(fd);
goto done; /* type error; errmsg already given */
+ }
if (fwrite(p, STRLEN(p), 1, fd) != 1)
err = TRUE;
if (fclose(fd) != 0)
diff --git a/src/ex_cmds.c b/src/ex_cmds.c
index aafe31cf0..b5920c8d0 100644
--- a/src/ex_cmds.c
+++ b/src/ex_cmds.c
@@ -1778,6 +1778,7 @@ write_viminfo(file, forceit)
tt = msg_didany;
EMSG2(_("E137: Viminfo file is not writable: %s"), fname);
msg_didany = tt;
+ fclose(fp_in);
goto end;
}
#endif
diff --git a/src/ex_docmd.c b/src/ex_docmd.c
index 4943bfcfb..3e4c963c4 100644
--- a/src/ex_docmd.c
+++ b/src/ex_docmd.c
@@ -9438,7 +9438,8 @@ eval_vars(src, usedlen, lnump, errormsg, srcstart)
break;
#if defined(FEAT_CLIENTSERVER)
case SPEC_CLIENT: /* Source of last submitted input */
- sprintf((char *)strbuf, "0x%x", (unsigned int)clientWindow);
+ sprintf((char *)strbuf, PRINTF_HEX_LONG_U,
+ (long_u)clientWindow);
result = strbuf;
break;
#endif
diff --git a/src/ex_eval.c b/src/ex_eval.c
index c89cb2bd0..8714958f0 100644
--- a/src/ex_eval.c
+++ b/src/ex_eval.c
@@ -1136,7 +1136,7 @@ ex_continue(eap)
* next). Therefor, inactivate all conditionals except the ":while"
* itself (if reached). */
idx = cleanup_conditionals(cstack, CSF_WHILE | CSF_FOR, FALSE);
- if ((cstack->cs_flags[idx] & (CSF_WHILE | CSF_FOR)))
+ if (idx >= 0 && (cstack->cs_flags[idx] & (CSF_WHILE | CSF_FOR)))
{
rewind_conditionals(cstack, idx, CSF_TRY, &cstack->cs_trylevel);
@@ -1175,7 +1175,7 @@ ex_break(eap)
* executed next) is found. In the latter case, make the ":break"
* pending for execution at the ":endtry". */
idx = cleanup_conditionals(cstack, CSF_WHILE | CSF_FOR, TRUE);
- if (!(cstack->cs_flags[idx] & (CSF_WHILE | CSF_FOR)))
+ if (idx >= 0 && !(cstack->cs_flags[idx] & (CSF_WHILE | CSF_FOR)))
{
cstack->cs_pending[idx] = CSTP_BREAK;
report_make_pending(CSTP_BREAK, NULL);
@@ -1861,7 +1861,7 @@ ex_endtry(eap)
* after errors except when this ":endtry" is not within a ":try".
* Restore "emsg_silent" if it has been reset by this try conditional.
*/
- cleanup_conditionals(cstack, CSF_TRY | CSF_SILENT, TRUE);
+ (void)cleanup_conditionals(cstack, CSF_TRY | CSF_SILENT, TRUE);
--cstack->cs_idx;
--cstack->cs_trylevel;
diff --git a/src/fold.c b/src/fold.c
index 8cd51a9c2..bb7b8b7cc 100644
--- a/src/fold.c
+++ b/src/fold.c
@@ -2594,8 +2594,9 @@ foldUpdateIEMSRecurse(gap, level, startlnum, flp, getlevel, bot, topflags)
/*
* The fold includes the line "flp->lnum" and "flp->lnum_save".
+ * Check "fp" for safety.
*/
- if (lvl > level)
+ if (lvl > level && fp != NULL)
{
/*
* There is a nested fold, handle it recursively.
diff --git a/src/getchar.c b/src/getchar.c
index 88381b176..782bdbee0 100644
--- a/src/getchar.c
+++ b/src/getchar.c
@@ -4053,14 +4053,19 @@ ExpandMappings(regmatch, num_file, file)
}
} /* for (round) */
- /* Sort the matches */
- sort_strings(*file, count);
-
- /* Remove multiple entries */
+ if (count > 1)
{
- char_u **ptr1 = *file;
- char_u **ptr2 = ptr1 + 1;
- char_u **ptr3 = ptr1 + count;
+ char_u **ptr1;
+ char_u **ptr2;
+ char_u **ptr3;
+
+ /* Sort the matches */
+ sort_strings(*file, count);
+
+ /* Remove multiple entries */
+ ptr1 = *file;
+ ptr2 = ptr1 + 1;
+ ptr3 = ptr1 + count;
while (ptr2 < ptr3)
{
diff --git a/src/gui_gtk.c b/src/gui_gtk.c
index d9477d5b6..6c8694859 100644
--- a/src/gui_gtk.c
+++ b/src/gui_gtk.c
@@ -787,12 +787,12 @@ gui_mch_add_menu_item(vimmenu_T *menu, int idx)
# endif /* FEAT_TOOLBAR */
{
/* No parent, must be a non-menubar menu */
- if (parent->submenu_id == NULL)
+ if (parent == NULL || parent->submenu_id == NULL)
return;
/* Make place for the possible tearoff handle item. Not in the popup
* menu, it doesn't have a tearoff item. */
- if (parent != NULL && !menu_is_popup(parent->name))
+ if (!menu_is_popup(parent->name))
++idx;
if (menu_is_separator(menu->name))
diff --git a/src/gui_gtk_x11.c b/src/gui_gtk_x11.c
index 79557a834..3bec1f59f 100644
--- a/src/gui_gtk_x11.c
+++ b/src/gui_gtk_x11.c
@@ -2024,6 +2024,8 @@ drag_handle_uri_list(GdkDragContext *context,
gui_handle_drop(x, y, modifiers, fnames, nfiles);
}
+ else
+ vim_free(fnames);
}
static void
@@ -4707,7 +4709,7 @@ gui_mch_font_dialog(char_u *oldval)
* that, because in 'guifont' it separates names. */
p = vim_strsave_escaped((char_u *)name, (char_u *)",");
g_free(name);
- if (input_conv.vc_type != CONV_NONE)
+ if (p != NULL && input_conv.vc_type != CONV_NONE)
{
fontname = string_convert(&input_conv, p, NULL);
vim_free(p);
@@ -6870,7 +6872,7 @@ mch_set_mouse_shape(int shape)
else
id &= ~1; /* they are always even (why?) */
}
- else
+ else if (shape < sizeof(mshape_ids) / sizeof(int))
id = mshape_ids[shape];
# ifdef HAVE_GTK_MULTIHEAD
c = gdk_cursor_new_for_display(
diff --git a/src/gui_w32.c b/src/gui_w32.c
index ac05ee9a1..a700ac0c4 100644
--- a/src/gui_w32.c
+++ b/src/gui_w32.c
@@ -181,13 +181,14 @@
# define ID_BEVAL_TOOLTIP 200
# define BEVAL_TEXT_LEN MAXPATHL
-static void make_tooltip __ARGS((BalloonEval *beval, char *text, POINT pt));
-static void delete_tooltip __ARGS((BalloonEval *beval));
-static VOID CALLBACK BevalTimerProc __ARGS((HWND hwnd, UINT uMsg, UINT idEvent, DWORD dwTime));
-
#ifndef UINT_PTR
# define UINT_PTR UINT
#endif
+
+static void make_tooltip __ARGS((BalloonEval *beval, char *text, POINT pt));
+static void delete_tooltip __ARGS((BalloonEval *beval));
+static VOID CALLBACK BevalTimerProc __ARGS((HWND hwnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime));
+
static BalloonEval *cur_beval = NULL;
static UINT_PTR BevalTimerId = 0;
static DWORD LastActivity = 0;
@@ -811,9 +812,102 @@ _WndProc(
case WM_NOTIFY:
switch (((LPNMHDR) lParam)->code)
{
-# ifdef FEAT_TOOLBAR
+# ifdef FEAT_MBYTE
+ case TTN_GETDISPINFOW:
+# endif
case TTN_NEEDTEXT:
+# ifdef FEAT_GUI_TABLINE
+ if (gui_mch_showing_tabline()
+ && ((LPNMHDR)lParam)->hwndFrom ==
+ TabCtrl_GetToolTips(s_tabhwnd))
{
+ LPNMTTDISPINFO lpdi;
+ POINT pt;
+ static char *tt_text = NULL;
+ static int tt_text_len = 0;
+
+ /*
+ * Mouse is over the GUI tabline. Display the tooltip
+ * for the tab under the cursor
+ */
+ lpdi = (LPNMTTDISPINFO)lParam;
+ lpdi->hinst = NULL;
+ lpdi->szText[0] = '\0';
+
+ /*
+ * Get the cursor position within the tab control
+ */
+ GetCursorPos(&pt);
+ if (ScreenToClient(s_tabhwnd, &pt) != 0)
+ {
+ TCHITTESTINFO htinfo;
+ int idx;
+
+ /*
+ * Get the tab under the cursor
+ */
+ htinfo.pt.x = pt.x;
+ htinfo.pt.y = pt.y;
+ idx = TabCtrl_HitTest(s_tabhwnd, &htinfo);
+ if (idx != -1)
+ {
+ tabpage_T *tp;
+
+ tp = find_tabpage(idx + 1);
+ if (tp != NULL)
+ {
+# ifdef FEAT_MBYTE
+ WCHAR *wstr = NULL;
+# endif
+ get_tabline_label(tp, TRUE);
+# ifdef FEAT_MBYTE
+ if (enc_codepage >= 0
+ && (int)GetACP() != enc_codepage)
+ {
+ wstr = enc_to_ucs2(NameBuff, NULL);
+ if (wstr != NULL)
+ {
+ int wlen;
+
+ wlen = (wcslen(wstr) + 1)
+ * sizeof(WCHAR);
+ if (tt_text_len < wlen)
+ {
+ tt_text = vim_realloc(tt_text,
+ wlen);
+ if (tt_text != NULL)
+ tt_text_len = wlen;
+ }
+ if (tt_text != NULL)
+ wcscpy((WCHAR *)tt_text, wstr);
+ lpdi->lpszText = tt_text;
+ vim_free(wstr);
+ }
+ }
+ if (wstr == NULL)
+# endif
+ {
+ int len;
+
+ len = STRLEN(NameBuff) + 1;
+ if (tt_text_len < len)
+ {
+ tt_text = vim_realloc(tt_text, len);
+ if (tt_text != NULL)
+ tt_text_len = len;
+ }
+ if (tt_text != NULL)
+ STRCPY(tt_text, NameBuff);
+ lpdi->lpszText = tt_text;
+ }
+ }
+ }
+ }
+ }
+ else
+# endif
+ {
+# ifdef FEAT_TOOLBAR
LPTOOLTIPTEXT lpttt;
UINT idButton;
int idx;
@@ -831,9 +925,9 @@ _WndProc(
lpttt->lpszText = pMenu->strings[idx];
}
}
+# endif
}
break;
-# endif
# ifdef FEAT_GUI_TABLINE
case TCN_SELCHANGE:
if (gui_mch_showing_tabline()
@@ -2341,7 +2435,7 @@ gui_mch_add_menu(
{
InsertMenu((parent == NULL) ? s_menuBar : parent->submenu_id,
(UINT)pos, MF_POPUP | MF_STRING | MF_BYPOSITION,
- (UINT)menu->submenu_id, (LPCTSTR) menu->name);
+ (long_u)menu->submenu_id, (LPCTSTR) menu->name);
}
else
{
@@ -2361,7 +2455,7 @@ gui_mch_add_menu(
infow.cbSize = sizeof(infow);
infow.fMask = MIIM_DATA | MIIM_TYPE | MIIM_ID
| MIIM_SUBMENU;
- infow.dwItemData = (DWORD)menu;
+ infow.dwItemData = (long_u)menu;
infow.wID = menu->id;
infow.fType = MFT_STRING;
infow.dwTypeData = wn;
@@ -2384,7 +2478,7 @@ gui_mch_add_menu(
info.cbSize = sizeof(info);
info.fMask = MIIM_DATA | MIIM_TYPE | MIIM_ID | MIIM_SUBMENU;
- info.dwItemData = (DWORD)menu;
+ info.dwItemData = (long_u)menu;
info.wID = menu->id;
info.fType = MFT_STRING;
info.dwTypeData = (LPTSTR)menu->name;
@@ -2661,7 +2755,7 @@ gui_mch_menu_grey(
if (menu->children == NULL)
menuID = (WORD)(menu->id);
else
- menuID = (WORD)((DWORD)(menu->submenu_id) | (DWORD)0x8000);
+ menuID = (WORD)((long_u)(menu->submenu_id) | (DWORD)0x8000);
menuHandle = GetDlgItem(menu->parent->tearoff_handle, menuID);
if (menuHandle)
EnableWindow(menuHandle, !grey);
@@ -2860,7 +2954,7 @@ gui_mch_dialog(
/* allocate some memory for dialog template */
/* TODO should compute this really */
pdlgtemplate = p = (PWORD)LocalAlloc(LPTR,
- DLG_ALLOC_SIZE + STRLEN(message));
+ DLG_ALLOC_SIZE + STRLEN(message) * 2);
if (p == NULL)
return -1;
@@ -3281,6 +3375,7 @@ gui_mch_dialog(
}
#endif /* FEAT_GUI_DIALOG */
+
/*
* Put a simple element (basic class) onto a dialog template in memory.
* return a pointer to where the next item should be added.
@@ -3344,9 +3439,9 @@ add_dialog_element(
lpwAlign(
LPWORD lpIn)
{
- ULONG ul;
+ long_u ul;
- ul = (ULONG)lpIn;
+ ul = (long_u)lpIn;
ul += 3;
ul >>= 2;
ul <<= 2;
@@ -3435,7 +3530,7 @@ tearoff_callback(
if (GetCursorPos(&mp) && GetWindowRect(hwnd, &rect))
{
(void)TrackPopupMenu(
- (HMENU)(LOWORD(wParam) ^ 0x8000),
+ (HMENU)(long_u)(LOWORD(wParam) ^ 0x8000),
TPM_LEFTALIGN | TPM_LEFTBUTTON,
(int)rect.right - 8,
(int)mp.y,
@@ -3794,7 +3889,7 @@ gui_mch_tearoff(
else
{
len += (int)STRLEN(TEAROFF_SUBMENU_LABEL);
- menuID = (WORD)((DWORD)(menu->submenu_id) | (DWORD)0x8000);
+ menuID = (WORD)((long_u)(menu->submenu_id) | (DWORD)0x8000);
}
/* Allocate menu label and fill it in */
@@ -3953,7 +4048,7 @@ get_toolbar_bitmap(vimmenu_T *menu)
TBADDBITMAP tbAddBitmap;
tbAddBitmap.hInst = NULL;
- tbAddBitmap.nID = (UINT)hbitmap;
+ tbAddBitmap.nID = (long_u)hbitmap;
i = (int)SendMessage(s_toolbarhwnd, TB_ADDBITMAP,
(WPARAM)1, (LPARAM)&tbAddBitmap);
@@ -3978,7 +4073,7 @@ initialise_tabline(void)
InitCommonControls();
s_tabhwnd = CreateWindow(WC_TABCONTROL, "Vim tabline",
- WS_CHILD|TCS_FOCUSNEVER,
+ WS_CHILD|TCS_FOCUSNEVER|TCS_TOOLTIPS,
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
CW_USEDEFAULT, s_hwnd, NULL, s_hinst, NULL);
@@ -4404,7 +4499,7 @@ delete_tooltip(beval)
BevalTimerProc(hwnd, uMsg, idEvent, dwTime)
HWND hwnd;
UINT uMsg;
- UINT idEvent;
+ UINT_PTR idEvent;
DWORD dwTime;
{
POINT pt;
diff --git a/src/hardcopy.c b/src/hardcopy.c
index 62567a3db..bc5a219fc 100644
--- a/src/hardcopy.c
+++ b/src/hardcopy.c
@@ -2538,12 +2538,11 @@ mch_print_init(psettings, jobname, forceit)
/* Build CMap name - will be same for all multi-byte fonts used */
prt_cmap[0] = NUL;
- prt_custom_cmap = prt_out_mbyte && p_mbchar == NULL;
-
+ prt_custom_cmap = (p_mbchar == NULL);
if (!prt_custom_cmap)
{
/* Check encoding and character set are compatible */
- if ((p_mbenc->needs_charset&p_mbchar->has_charset) == 0)
+ if ((p_mbenc->needs_charset & p_mbchar->has_charset) == 0)
{
EMSG(_("E673: Incompatible multi-byte encoding and character set."));
return FALSE;
@@ -2862,6 +2861,7 @@ mch_print_begin(psettings)
struct prt_ps_resource_S res_encoding;
char buffer[256];
char_u *p_encoding;
+ char_u *p;
#ifdef FEAT_MBYTE
struct prt_ps_resource_S res_cidfont;
struct prt_ps_resource_S res_cmap;
@@ -2880,7 +2880,9 @@ mch_print_begin(psettings)
now = time(NULL);
p_time = ctime(&now);
/* Note: ctime() adds a \n so we have to remove it :-( */
- *(vim_strchr((char_u *)p_time, '\n')) = '\0';
+ p = vim_strchr((char_u *)p_time, '\n');
+ if (p != NULL)
+ *p = NUL;
prt_dsc_textline("CreationDate", p_time);
prt_dsc_textline("DocumentData", "Clean8Bit");
prt_dsc_textline("Orientation", "Portrait");
diff --git a/src/mbyte.c b/src/mbyte.c
index 98d4e0009..2114654d5 100644
--- a/src/mbyte.c
+++ b/src/mbyte.c
@@ -3100,7 +3100,7 @@ enc_locale()
else
s = p + 1;
}
- for (i = 0; s[i] != NUL && i < sizeof(buf) - 1; ++i)
+ for (i = 0; s[i] != NUL && s + i < buf + sizeof(buf) - 1; ++i)
{
if (s[i] == '_' || s[i] == '-')
buf[i] = '-';
diff --git a/src/menu.c b/src/menu.c
index 55fba1fd6..8b4539563 100644
--- a/src/menu.c
+++ b/src/menu.c
@@ -59,7 +59,7 @@ static char_u *menutrans_lookup __ARGS((char_u *name, int len));
#endif
/* The character for each menu mode */
-static char_u menu_mode_chars[] = {'n', 'v', 'o', 'i', 'c', 't'};
+static char_u menu_mode_chars[] = {'n', 'v', 's', 'o', 'i', 'c', 't'};
static char_u e_notsubmenu[] = N_("E327: Part of menu-item path is not sub-menu");
static char_u e_othermode[] = N_("E328: Menu only exists in another mode");
@@ -1293,6 +1293,7 @@ set_context_in_menu_cmd(xp, cmd, arg, forceit)
name = p;
menu = menu->children;
}
+ vim_free(path_name);
xp->xp_context = expand_menus ? EXPAND_MENUNAMES : EXPAND_MENUS;
xp->xp_pattern = after_dot;
diff --git a/src/message.c b/src/message.c
index c0146c962..08810ad82 100644
--- a/src/message.c
+++ b/src/message.c
@@ -529,6 +529,25 @@ msg_source(attr)
}
/*
+ * Return TRUE if not giving error messages right now:
+ * If "emsg_off" is set: no error messages at the moment.
+ * If "msg" is in 'debug': do error message but without side effects.
+ * If "emsg_skip" is set: never do error messages.
+ */
+ int
+emsg_not_now()
+{
+ if ((emsg_off > 0 && vim_strchr(p_debug, 'm') == NULL
+ && vim_strchr(p_debug, 't') == NULL)
+#ifdef FEAT_EVAL
+ || emsg_skip > 0
+#endif
+ )
+ return TRUE;
+ return FALSE;
+}
+
+/*
* emsg() - display an error message
*
* Rings the bell, if appropriate, and calls message() to do the real work
@@ -559,17 +578,8 @@ emsg(s)
emsg_severe = FALSE;
#endif
- /*
- * If "emsg_off" is set: no error messages at the moment.
- * If "msg" is in 'debug': do error message but without side effects.
- * If "emsg_skip" is set: never do error messages.
- */
- if ((emsg_off > 0 && vim_strchr(p_debug, 'm') == NULL
- && vim_strchr(p_debug, 't') == NULL)
-#ifdef FEAT_EVAL
- || emsg_skip > 0
-#endif
- )
+ /* Skip this if not giving error messages at the moment. */
+ if (emsg_not_now())
return TRUE;
if (!emsg_off || vim_strchr(p_debug, 't') != NULL)
diff --git a/src/misc1.c b/src/misc1.c
index 67a2fc06d..4f0ef0274 100644
--- a/src/misc1.c
+++ b/src/misc1.c
@@ -321,7 +321,7 @@ copy_indent(size, src)
++ind_done;
}
++ind_len;
- if (round == 2)
+ if (p != NULL)
*p++ = *s;
++s;
}
@@ -332,7 +332,7 @@ copy_indent(size, src)
{
todo -= tab_pad;
++ind_len;
- if (round == 2)
+ if (p != NULL)
*p++ = TAB;
}
@@ -341,7 +341,7 @@ copy_indent(size, src)
{
todo -= (int)curbuf->b_p_ts;
++ind_len;
- if (round == 2)
+ if (p != NULL)
*p++ = TAB;
}
@@ -350,11 +350,11 @@ copy_indent(size, src)
{
--todo;
++ind_len;
- if (round == 2)
+ if (p != NULL)
*p++ = ' ';
}
- if (round == 1)
+ if (p == NULL)
{
/* Allocate memory for the result: the copied indent, new indent
* and the rest of the line. */
diff --git a/src/misc2.c b/src/misc2.c
index 4667a563d..a9f8fef0c 100644
--- a/src/misc2.c
+++ b/src/misc2.c
@@ -270,14 +270,15 @@ coladvance2(pos, addspaces, finetune, wcol)
/* Break a tab */
int linelen = (int)STRLEN(line);
int correct = wcol - col - csize + 1; /* negative!! */
- char_u *newline = alloc(linelen + csize);
+ char_u *newline;
int t, s = 0;
int v;
- /*
- * break a tab
- */
- if (newline == NULL || -correct > csize)
+ if (-correct > csize)
+ return FAIL;
+
+ newline = alloc(linelen + csize);
+ if (newline == NULL)
return FAIL;
for (t = 0; t < linelen; t++)
@@ -5816,14 +5817,9 @@ filewritable(fname)
emsg3(s, a1, a2)
char_u *s, *a1, *a2;
{
- if ((emsg_off > 0 && vim_strchr(p_debug, 'm') == NULL
- && vim_strchr(p_debug, 't') == NULL)
-#ifdef FEAT_EVAL
- || emsg_skip > 0
-#endif
- )
+ if (emsg_not_now())
return TRUE; /* no error messages at the moment */
- vim_snprintf((char *)IObuff, IOSIZE, (char *)s, (long)a1, (long)a2);
+ vim_snprintf((char *)IObuff, IOSIZE, (char *)s, (long_u)a1, (long_u)a2);
return emsg(IObuff);
}
@@ -5836,14 +5832,8 @@ emsgn(s, n)
char_u *s;
long n;
{
- if ((emsg_off > 0 && vim_strchr(p_debug, 'm') == NULL
- && vim_strchr(p_debug, 't') == NULL)
-#ifdef FEAT_EVAL
- || emsg_skip > 0
-#endif
- )
+ if (emsg_not_now())
return TRUE; /* no error messages at the moment */
vim_snprintf((char *)IObuff, IOSIZE, (char *)s, n);
return emsg(IObuff);
}
-
diff --git a/src/netbeans.c b/src/netbeans.c
index 731b98b24..e2f3a9da9 100644
--- a/src/netbeans.c
+++ b/src/netbeans.c
@@ -1641,17 +1641,30 @@ nb_do_cmd(
}
else if (streq((char *)cmd, "insertDone"))
{
- buf->bufp->b_start_eol = *args == 'T';
- buf->insertDone = TRUE;
- args += 2;
- buf->bufp->b_p_ro = *args == 'T';
- print_read_msg(buf);
+ if (buf == NULL || buf->bufp == NULL)
+ {
+ nbdebug((" null bufp in insertDone"));
+ }
+ else
+ {
+ buf->bufp->b_start_eol = *args == 'T';
+ buf->insertDone = TRUE;
+ args += 2;
+ buf->bufp->b_p_ro = *args == 'T';
+ print_read_msg(buf);
+ }
/* =====================================================================*/
}
else if (streq((char *)cmd, "saveDone"))
{
- long savedChars = atol((char *) args);
- print_save_msg(buf, savedChars);
+ long savedChars = atol((char *)args);
+
+ if (buf == NULL || buf->bufp == NULL)
+ {
+ nbdebug((" null bufp in saveDone"));
+ }
+ else
+ print_save_msg(buf, savedChars);
/* =====================================================================*/
}
else if (streq((char *)cmd, "startDocumentListen"))
@@ -1856,12 +1869,17 @@ nb_do_cmd(
}
else if (streq((char *)cmd, "setModtime"))
{
- buf->bufp->b_mtime = atoi((char *) args);
+ if (buf == NULL || buf->bufp == NULL)
+ nbdebug((" null bufp in setModtime"));
+ else
+ buf->bufp->b_mtime = atoi((char *)args);
/* =====================================================================*/
}
else if (streq((char *)cmd, "setReadOnly"))
{
- if (streq((char *)args, "T"))
+ if (buf == NULL || buf->bufp == NULL)
+ nbdebug((" null bufp in setReadOnly"));
+ else if (streq((char *)args, "T"))
buf->bufp->b_p_ro = TRUE;
else
buf->bufp->b_p_ro = FALSE;
@@ -2637,7 +2655,7 @@ netbeans_file_activated(buf_T *bufp)
return;
q = nb_quote(bufp->b_ffname);
- if (q == NULL || bp == NULL || bufp == NULL)
+ if (q == NULL || bp == NULL)
return;
vim_snprintf(buffer, sizeof(buffer), "%d:fileOpened=%d \"%s\" %s %s\n",
diff --git a/src/normal.c b/src/normal.c
index 189b21c66..651257451 100644
--- a/src/normal.c
+++ b/src/normal.c
@@ -831,6 +831,12 @@ getcount:
{
unshift_special(&ca);
idx = find_command(ca.cmdchar);
+ if (idx < 0)
+ {
+ /* Just in case */
+ clearopbeep(oap);
+ goto normal_end;
+ }
}
else if ((nv_cmds[idx].cmd_flags & NV_SSS)
&& (mod_mask & MOD_MASK_SHIFT))
diff --git a/src/ops.c b/src/ops.c
index 5122b87e0..00780acd7 100644
--- a/src/ops.c
+++ b/src/ops.c
@@ -3723,11 +3723,10 @@ error:
end:
if (allocated)
- {
vim_free(insert_string);
- if (regname == '=')
- vim_free(y_array);
- }
+ if (regname == '=')
+ vim_free(y_array);
+
/* If the cursor is past the end of the line put it at the end. */
if (gchar_cursor() == NUL
&& curwin->w_cursor.col > 0
@@ -4967,10 +4966,6 @@ do_addsub(command, Prenum1)
--col;
}
- /* truncate to max length of a number */
- if (length >= NUMBUFLEN - 1)
- length = NUMBUFLEN - 2;
-
/*
* If a number was found, and saving for undo works, replace the number.
*/
diff --git a/src/option.c b/src/option.c
index c1fc7dc3d..59b84fd06 100644
--- a/src/option.c
+++ b/src/option.c
@@ -3396,7 +3396,7 @@ set_option_default(opt_idx, opt_flags, compatible)
win_comp_scroll(curwin);
else
{
- *(long *)varp = (long)options[opt_idx].def_val[dvi];
+ *(long *)varp = (long)(long_i)options[opt_idx].def_val[dvi];
/* May also set global value for local option. */
if (both)
*(long *)get_varp_scope(&(options[opt_idx]), OPT_GLOBAL) =
@@ -3405,8 +3405,9 @@ set_option_default(opt_idx, opt_flags, compatible)
}
else /* P_BOOL */
{
- /* the cast to long is required for Manx C */
- *(int *)varp = (int)(long)options[opt_idx].def_val[dvi];
+ /* the cast to long is required for Manx C, long_i is needed for
+ * MSVC */
+ *(int *)varp = (int)(long)(long_i)options[opt_idx].def_val[dvi];
/* May also set global value for local option. */
if (both)
*(int *)get_varp_scope(&(options[opt_idx]), OPT_GLOBAL) =
@@ -3488,7 +3489,7 @@ set_number_default(name, val)
opt_idx = findoption((char_u *)name);
if (opt_idx >= 0)
- options[opt_idx].def_val[VI_DEFAULT] = (char_u *)val;
+ options[opt_idx].def_val[VI_DEFAULT] = (char_u *)(long_i)val;
}
#if defined(EXITFREE) || defined(PROTO)
@@ -3858,7 +3859,7 @@ set_title_defaults()
else
#endif
val = mch_can_restore_title();
- options[idx1].def_val[VI_DEFAULT] = (char_u *)val;
+ options[idx1].def_val[VI_DEFAULT] = (char_u *)(long_i)val;
p_title = val;
}
idx1 = findoption((char_u *)"icon");
@@ -3870,7 +3871,7 @@ set_title_defaults()
else
#endif
val = mch_can_restore_icon();
- options[idx1].def_val[VI_DEFAULT] = (char_u *)val;
+ options[idx1].def_val[VI_DEFAULT] = (char_u *)(long_i)val;
p_icon = val;
}
}
@@ -4206,7 +4207,7 @@ do_set(arg, opt_flags)
if (nextchar == '!')
value = *(int *)(varp) ^ 1;
else if (nextchar == '&')
- value = (int)(long)options[opt_idx].def_val[
+ value = (int)(long)(long_i)options[opt_idx].def_val[
((flags & P_VI_DEF) || cp_val)
? VI_DEFAULT : VIM_DEFAULT];
else if (nextchar == '<')
@@ -4261,7 +4262,7 @@ do_set(arg, opt_flags)
*/
++arg;
if (nextchar == '&')
- value = (long)options[opt_idx].def_val[
+ value = (long)(long_i)options[opt_idx].def_val[
((flags & P_VI_DEF) || cp_val)
? VI_DEFAULT : VIM_DEFAULT];
else if (nextchar == '<')
@@ -8401,10 +8402,11 @@ optval_default(p, varp)
return TRUE; /* hidden option is always at default */
dvi = ((p->flags & P_VI_DEF) || p_cp) ? VI_DEFAULT : VIM_DEFAULT;
if (p->flags & P_NUM)
- return (*(long *)varp == (long)p->def_val[dvi]);
+ return (*(long *)varp == (long)(long_i)p->def_val[dvi]);
if (p->flags & P_BOOL)
- /* the cast to long is required for Manx C */
- return (*(int *)varp == (int)(long)p->def_val[dvi]);
+ /* the cast to long is required for Manx C, long_i is
+ * needed for MSVC */
+ return (*(int *)varp == (int)(long)(long_i)p->def_val[dvi]);
/* P_STRING */
return (STRCMP(*(char_u **)varp, p->def_val[dvi]) == 0);
}
@@ -9993,7 +9995,7 @@ option_value2string(opp, opt_flags)
NameBuff[0] = NUL;
#ifdef FEAT_CRYPT
/* don't show the actual value of 'key', only that it's set */
- if (opp->var == (char_u *)&p_key && *varp)
+ else if (opp->var == (char_u *)&p_key && *varp)
STRCPY(NameBuff, "*****");
#endif
else if (opp->flags & P_EXPAND)
diff --git a/src/os_mswin.c b/src/os_mswin.c
index 642dc43b4..9e8b64d2d 100644
--- a/src/os_mswin.c
+++ b/src/os_mswin.c
@@ -770,14 +770,14 @@ check_str_len(char_u *str)
if (VirtualQuery(str, &mbi, sizeof(mbi)))
{
/* pre cast these (typing savers) */
- DWORD dwStr = (DWORD)str;
- DWORD dwBaseAddress = (DWORD)mbi.BaseAddress;
+ long_u dwStr = (long_u)str;
+ long_u dwBaseAddress = (long_u)mbi.BaseAddress;
/* get start address of page that str is on */
- DWORD strPage = dwStr - (dwStr - dwBaseAddress) % si.dwPageSize;
+ long_u strPage = dwStr - (dwStr - dwBaseAddress) % si.dwPageSize;
/* get length from str to end of page */
- DWORD pageLength = si.dwPageSize - (dwStr - strPage);
+ long_u pageLength = si.dwPageSize - (dwStr - strPage);
for (p = str; !IsBadReadPtr(p, pageLength);
p += pageLength, pageLength = si.dwPageSize)
@@ -2625,7 +2625,7 @@ Messaging_WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
#ifdef FEAT_AUTOCMD
else if (data->dwData == COPYDATA_REPLY)
{
- sprintf((char *)winstr, "0x%x", (unsigned)sender);
+ sprintf((char *)winstr, PRINTF_HEX_LONG_U, (long_u)sender);
apply_autocmds(EVENT_REMOTEREPLY, winstr, str,
TRUE, curbuf);
}
@@ -2834,13 +2834,13 @@ serverSendReply(name, reply)
{
HWND target;
COPYDATASTRUCT data;
- int n = 0;
+ long_u n = 0;
/* The "name" argument is a magic cookie obtained from expand("<client>").
* It should be of the form 0xXXXXX - i.e. a C hex literal, which is the
* value of the client's message window HWND.
*/
- sscanf((char *)name, "%x", &n);
+ sscanf((char *)name, SCANF_HEX_LONG_U, &n);
if (n == 0)
return -1;
@@ -3130,7 +3130,7 @@ int current_font_height = -12; /* also used in gui_w48.c */
* calculation is for a vertical (height) size or a horizontal (width) one.
*/
static int
-points_to_pixels(char_u *str, char_u **end, int vertical, int pprinter_dc)
+points_to_pixels(char_u *str, char_u **end, int vertical, long_i pprinter_dc)
{
int pixels;
int points = 0;
@@ -3338,10 +3338,10 @@ get_logfont(
switch (*p++)
{
case 'h':
- lf->lfHeight = - points_to_pixels(p, &p, TRUE, (int)printer_dc);
+ lf->lfHeight = - points_to_pixels(p, &p, TRUE, (long_i)printer_dc);
break;
case 'w':
- lf->lfWidth = points_to_pixels(p, &p, FALSE, (int)printer_dc);
+ lf->lfWidth = points_to_pixels(p, &p, FALSE, (long_i)printer_dc);
break;
case 'b':
#ifndef MSWIN16_FASTTEXT
diff --git a/src/os_unix.c b/src/os_unix.c
index 90129744f..5d52a7fae 100644
--- a/src/os_unix.c
+++ b/src/os_unix.c
@@ -3602,7 +3602,7 @@ mch_call_shell(cmd, options)
*p++ = NUL;
p = skipwhite(p);
}
- if (i == 0)
+ if (argv == NULL)
{
argv = (char **)alloc((unsigned)((argc + 4) * sizeof(char *)));
if (argv == NULL) /* out of memory */
diff --git a/src/os_win32.c b/src/os_win32.c
index 630df5a4a..af6590652 100644
--- a/src/os_win32.c
+++ b/src/os_win32.c
@@ -1288,7 +1288,7 @@ create_conin(void)
g_hConIn = CreateFile("CONIN$", GENERIC_READ|GENERIC_WRITE,
FILE_SHARE_READ|FILE_SHARE_WRITE,
(LPSECURITY_ATTRIBUTES) NULL,
- OPEN_EXISTING, (DWORD)NULL, (HANDLE)NULL);
+ OPEN_EXISTING, 0, (HANDLE)NULL);
did_create_conin = TRUE;
}
diff --git a/src/proto/message.pro b/src/proto/message.pro
index 9161b054f..cff7d6b50 100644
--- a/src/proto/message.pro
+++ b/src/proto/message.pro
@@ -1,70 +1,71 @@
/* message.c */
-extern int msg __ARGS((char_u *s));
-extern int verb_msg __ARGS((char_u *s));
-extern int msg_attr __ARGS((char_u *s, int attr));
-extern int msg_attr_keep __ARGS((char_u *s, int attr, int keep));
-extern char_u *msg_strtrunc __ARGS((char_u *s, int force));
-extern void trunc_string __ARGS((char_u *s, char_u *buf, int room));
-extern void reset_last_sourcing __ARGS((void));
-extern void msg_source __ARGS((int attr));
-extern int emsg __ARGS((char_u *s));
-extern int emsg2 __ARGS((char_u *s, char_u *a1));
-extern void emsg_invreg __ARGS((int name));
-extern char_u *msg_trunc_attr __ARGS((char_u *s, int force, int attr));
-extern char_u *msg_may_trunc __ARGS((int force, char_u *s));
-extern int delete_first_msg __ARGS((void));
-extern void ex_messages __ARGS((exarg_T *eap));
-extern void msg_end_prompt __ARGS((void));
-extern void wait_return __ARGS((int redraw));
-extern void set_keep_msg __ARGS((char_u *s, int attr));
-extern void set_keep_msg_from_hist __ARGS((void));
-extern void msg_start __ARGS((void));
-extern void msg_starthere __ARGS((void));
-extern void msg_putchar __ARGS((int c));
-extern void msg_putchar_attr __ARGS((int c, int attr));
-extern void msg_outnum __ARGS((long n));
-extern void msg_home_replace __ARGS((char_u *fname));
-extern void msg_home_replace_hl __ARGS((char_u *fname));
-extern int msg_outtrans __ARGS((char_u *str));
-extern int msg_outtrans_attr __ARGS((char_u *str, int attr));
-extern int msg_outtrans_len __ARGS((char_u *str, int len));
-extern char_u *msg_outtrans_one __ARGS((char_u *p, int attr));
-extern int msg_outtrans_len_attr __ARGS((char_u *msgstr, int len, int attr));
-extern void msg_make __ARGS((char_u *arg));
-extern int msg_outtrans_special __ARGS((char_u *strstart, int from));
-extern char_u *str2special __ARGS((char_u **sp, int from));
-extern void str2specialbuf __ARGS((char_u *sp, char_u *buf, int len));
-extern void msg_prt_line __ARGS((char_u *s, int list));
-extern void msg_puts __ARGS((char_u *s));
-extern void msg_puts_title __ARGS((char_u *s));
-extern void msg_puts_long_attr __ARGS((char_u *longstr, int attr));
-extern void msg_puts_long_len_attr __ARGS((char_u *longstr, int len, int attr));
-extern void msg_puts_attr __ARGS((char_u *s, int attr));
-extern void may_clear_sb_text __ARGS((void));
-extern void clear_sb_text __ARGS((void));
-extern void show_sb_text __ARGS((void));
-extern int msg_use_printf __ARGS((void));
-extern void mch_errmsg __ARGS((char *str));
-extern void mch_msg __ARGS((char *str));
-extern void msg_moremsg __ARGS((int full));
-extern void repeat_message __ARGS((void));
-extern void msg_clr_eos __ARGS((void));
-extern void msg_clr_eos_force __ARGS((void));
-extern void msg_clr_cmdline __ARGS((void));
-extern int msg_end __ARGS((void));
-extern void msg_check __ARGS((void));
-extern void verbose_enter __ARGS((void));
-extern void verbose_leave __ARGS((void));
-extern void verbose_enter_scroll __ARGS((void));
-extern void verbose_leave_scroll __ARGS((void));
-extern void verbose_stop __ARGS((void));
-extern int verbose_open __ARGS((void));
-extern void give_warning __ARGS((char_u *message, int hl));
-extern void msg_advance __ARGS((int col));
-extern int do_dialog __ARGS((int type, char_u *title, char_u *message, char_u *buttons, int dfltbutton, char_u *textfield));
-extern void display_confirm_msg __ARGS((void));
-extern int vim_dialog_yesno __ARGS((int type, char_u *title, char_u *message, int dflt));
-extern int vim_dialog_yesnocancel __ARGS((int type, char_u *title, char_u *message, int dflt));
-extern int vim_dialog_yesnoallcancel __ARGS((int type, char_u *title, char_u *message, int dflt));
-extern char_u *do_browse __ARGS((int flags, char_u *title, char_u *dflt, char_u *ext, char_u *initdir, char_u *filter, buf_T *buf));
+int msg __ARGS((char_u *s));
+int verb_msg __ARGS((char_u *s));
+int msg_attr __ARGS((char_u *s, int attr));
+int msg_attr_keep __ARGS((char_u *s, int attr, int keep));
+char_u *msg_strtrunc __ARGS((char_u *s, int force));
+void trunc_string __ARGS((char_u *s, char_u *buf, int room));
+void reset_last_sourcing __ARGS((void));
+void msg_source __ARGS((int attr));
+int emsg_not_now __ARGS((void));
+int emsg __ARGS((char_u *s));
+int emsg2 __ARGS((char_u *s, char_u *a1));
+void emsg_invreg __ARGS((int name));
+char_u *msg_trunc_attr __ARGS((char_u *s, int force, int attr));
+char_u *msg_may_trunc __ARGS((int force, char_u *s));
+int delete_first_msg __ARGS((void));
+void ex_messages __ARGS((exarg_T *eap));
+void msg_end_prompt __ARGS((void));
+void wait_return __ARGS((int redraw));
+void set_keep_msg __ARGS((char_u *s, int attr));
+void set_keep_msg_from_hist __ARGS((void));
+void msg_start __ARGS((void));
+void msg_starthere __ARGS((void));
+void msg_putchar __ARGS((int c));
+void msg_putchar_attr __ARGS((int c, int attr));
+void msg_outnum __ARGS((long n));
+void msg_home_replace __ARGS((char_u *fname));
+void msg_home_replace_hl __ARGS((char_u *fname));
+int msg_outtrans __ARGS((char_u *str));
+int msg_outtrans_attr __ARGS((char_u *str, int attr));
+int msg_outtrans_len __ARGS((char_u *str, int len));
+char_u *msg_outtrans_one __ARGS((char_u *p, int attr));
+int msg_outtrans_len_attr __ARGS((char_u *msgstr, int len, int attr));
+void msg_make __ARGS((char_u *arg));
+int msg_outtrans_special __ARGS((char_u *strstart, int from));
+char_u *str2special __ARGS((char_u **sp, int from));
+void str2specialbuf __ARGS((char_u *sp, char_u *buf, int len));
+void msg_prt_line __ARGS((char_u *s, int list));
+void msg_puts __ARGS((char_u *s));
+void msg_puts_title __ARGS((char_u *s));
+void msg_puts_long_attr __ARGS((char_u *longstr, int attr));
+void msg_puts_long_len_attr __ARGS((char_u *longstr, int len, int attr));
+void msg_puts_attr __ARGS((char_u *s, int attr));
+void may_clear_sb_text __ARGS((void));
+void clear_sb_text __ARGS((void));
+void show_sb_text __ARGS((void));
+int msg_use_printf __ARGS((void));
+void mch_errmsg __ARGS((char *str));
+void mch_msg __ARGS((char *str));
+void msg_moremsg __ARGS((int full));
+void repeat_message __ARGS((void));
+void msg_clr_eos __ARGS((void));
+void msg_clr_eos_force __ARGS((void));
+void msg_clr_cmdline __ARGS((void));
+int msg_end __ARGS((void));
+void msg_check __ARGS((void));
+void verbose_enter __ARGS((void));
+void verbose_leave __ARGS((void));
+void verbose_enter_scroll __ARGS((void));
+void verbose_leave_scroll __ARGS((void));
+void verbose_stop __ARGS((void));
+int verbose_open __ARGS((void));
+void give_warning __ARGS((char_u *message, int hl));
+void msg_advance __ARGS((int col));
+int do_dialog __ARGS((int type, char_u *title, char_u *message, char_u *buttons, int dfltbutton, char_u *textfield));
+void display_confirm_msg __ARGS((void));
+int vim_dialog_yesno __ARGS((int type, char_u *title, char_u *message, int dflt));
+int vim_dialog_yesnocancel __ARGS((int type, char_u *title, char_u *message, int dflt));
+int vim_dialog_yesnoallcancel __ARGS((int type, char_u *title, char_u *message, int dflt));
+char_u *do_browse __ARGS((int flags, char_u *title, char_u *dflt, char_u *ext, char_u *initdir, char_u *filter, buf_T *buf));
/* vim: set ft=c : */
diff --git a/src/regexp.c b/src/regexp.c
index e0bfb0305..2cd3120c6 100644
--- a/src/regexp.c
+++ b/src/regexp.c
@@ -7054,7 +7054,7 @@ reg_submatch(no)
int round;
linenr_T lnum;
- if (!can_f_submatch)
+ if (!can_f_submatch || no < 0)
return NULL;
if (submatch_match == NULL)
@@ -7112,10 +7112,10 @@ reg_submatch(no)
++len;
}
- if (round == 1)
+ if (retval == NULL)
{
retval = lalloc((long_u)len, TRUE);
- if (s == NULL)
+ if (retval == NULL)
return NULL;
}
}
diff --git a/src/spell.c b/src/spell.c
index 3ae44d4d0..5db914eaf 100644
--- a/src/spell.c
+++ b/src/spell.c
@@ -5102,7 +5102,10 @@ spell_read_aff(spin, fname)
*/
aff = (afffile_T *)getroom(spin, sizeof(afffile_T), TRUE);
if (aff == NULL)
+ {
+ fclose(fd);
return NULL;
+ }
hash_init(&aff->af_pref);
hash_init(&aff->af_suff);
hash_init(&aff->af_comp);
@@ -7361,7 +7364,8 @@ tree_add_word(spin, word, root, flags, region, affixID)
/* Link the new node in the list, there will be one ref. */
np->wn_refs = 1;
- *copyprev = np;
+ if (copyprev != NULL)
+ *copyprev = np;
copyprev = &np->wn_sibling;
/* Let "node" point to the head of the copied list. */
@@ -15464,7 +15468,7 @@ spell_dump_compl(buf, pat, ic, dir, dumpflags_arg)
if (pat != NULL && slang->sl_pbyts == NULL)
patlen = (int)STRLEN(pat);
else
- patlen = 0;
+ patlen = -1;
/* round 1: case-folded tree
* round 2: keep-case tree */
diff --git a/src/syntax.c b/src/syntax.c
index 714de44d2..5308f903c 100644
--- a/src/syntax.c
+++ b/src/syntax.c
@@ -1371,7 +1371,8 @@ store_current_state(sp)
for (p = syn_buf->b_sst_first; p != NULL; p = p->sst_next)
if (p->sst_next == sp)
break;
- p->sst_next = sp->sst_next;
+ if (p != NULL) /* just in case */
+ p->sst_next = sp->sst_next;
}
syn_stack_free_entry(syn_buf, sp);
sp = NULL;
diff --git a/src/testdir/test61.in b/src/testdir/test61.in
index 749d8ad04..7ce72e627 100644
--- a/src/testdir/test61.in
+++ b/src/testdir/test61.in
@@ -43,6 +43,13 @@ Ac:set ul=100
:.w >>test.out
:later 1h
:.w >>test.out
+:"
+:" test undojoin
+Goaaaa:set ul=100
+obbbbu:.w >>test.out
+obbbb:set ul=100
+:undojoin
+occccu:.w >>test.out
:qa!
ENDTEST
diff --git a/src/testdir/test61.ok b/src/testdir/test61.ok
index c23fe2298..020dd5383 100644
--- a/src/testdir/test61.ok
+++ b/src/testdir/test61.ok
@@ -20,3 +20,5 @@
123456789
123456
123456abc
+aaaa
+aaaa
diff --git a/src/version.h b/src/version.h
index bb77f87e2..ef0ff31ce 100644
--- a/src/version.h
+++ b/src/version.h
@@ -35,6 +35,6 @@
*/
#define VIM_VERSION_NODOT "vim70e"
#define VIM_VERSION_SHORT "7.0e"
-#define VIM_VERSION_MEDIUM "7.0e05 BETA"
-#define VIM_VERSION_LONG "VIM - Vi IMproved 7.0e05 BETA (2006 Apr 21)"
-#define VIM_VERSION_LONG_DATE "VIM - Vi IMproved 7.0e05 BETA (2006 Apr 21, compiled "
+#define VIM_VERSION_MEDIUM "7.0e06 BETA"
+#define VIM_VERSION_LONG "VIM - Vi IMproved 7.0e06 BETA (2006 Apr 22)"
+#define VIM_VERSION_LONG_DATE "VIM - Vi IMproved 7.0e06 BETA (2006 Apr 22, compiled "
diff --git a/src/vim.h b/src/vim.h
index f24f15d2d..5f78ac88c 100644
--- a/src/vim.h
+++ b/src/vim.h
@@ -342,14 +342,19 @@
typedef unsigned char char_u;
typedef unsigned short short_u;
typedef unsigned int int_u;
-/* Make sure long_u is big enough to hold a pointer. On Win64 longs are 32
- * bit and pointers 64 bit. */
+/* Make sure long_u is big enough to hold a pointer.
+ * On Win64 longs are 32 bit and pointers 64 bit.
+ * For printf() and scanf() we need to take care of long_u specifically. */
#ifdef _WIN64
typedef unsigned __int64 long_u;
typedef __int64 long_i;
+# define SCANF_HEX_LONG_U "%Ix"
+# define PRINTF_HEX_LONG_U "0x%Ix"
#else
typedef unsigned long long_u;
typedef long long_i;
+# define SCANF_HEX_LONG_U "%lx"
+# define PRINTF_HEX_LONG_U "0x%lx"
#endif
/*
@@ -1382,6 +1387,7 @@ typedef enum
#define EMSG2(s, p) emsg2((char_u *)(s), (char_u *)(p))
#define EMSG3(s, p, q) emsg3((char_u *)(s), (char_u *)(p), (char_u *)(q))
#define EMSGN(s, n) emsgn((char_u *)(s), (long)(n))
+#define EMSGU(s, n) emsgu((char_u *)(s), (long_u)(n))
#define OUT_STR(s) out_str((char_u *)(s))
#define OUT_STR_NF(s) out_str_nf((char_u *)(s))
#define MSG_PUTS(s) msg_puts((char_u *)(s))
diff --git a/src/window.c b/src/window.c
index d9d5bca23..628f9e0f9 100644
--- a/src/window.c
+++ b/src/window.c
@@ -5077,7 +5077,7 @@ win_drag_vsep_line(dragwin, offset)
int n;
fr = dragwin->w_frame;
- if (fr == topframe) /* only one window (cannot happe?) */
+ if (fr == topframe) /* only one window (cannot happen?) */
return;
curfr = fr;
fr = fr->fr_parent;