diff --git a/src/GvimExt/gvimext.cpp b/src/GvimExt/gvimext.cpp
index c204a0c..dbd769a 100644
--- a/src/GvimExt/gvimext.cpp
+++ b/src/GvimExt/gvimext.cpp
@@ -103,7 +103,7 @@
 	    strcpy(buf, searchpath(buf));
 
 	// remove "gvim.exe" from the end
-	for (idx = strlen(buf) - 1; idx >= 0; idx--)
+	for (idx = (int)strlen(buf) - 1; idx >= 0; idx--)
 	    if (buf[idx] == '\\' || buf[idx] == '/')
 	    {
 		buf[idx + 1] = 0;
@@ -279,7 +279,7 @@
     getRuntimeDir(szBuff);
     if (szBuff[0] != 0)
     {
-	len = strlen(szBuff);
+	len = (DWORD)strlen(szBuff);
 	if (dyn_libintl_init(szBuff))
 	{
 	    strcpy(szBuff + len, "lang");
@@ -740,7 +740,7 @@
     return NOERROR;
 }
 
-STDMETHODIMP CShellExt::GetCommandString(UINT idCmd,
+STDMETHODIMP CShellExt::GetCommandString(UINT_PTR idCmd,
 					 UINT uFlags,
 					 UINT FAR *reserved,
 					 LPSTR pszName,
diff --git a/src/GvimExt/gvimext.h b/src/GvimExt/gvimext.h
index d688073..c0e39cb 100644
--- a/src/GvimExt/gvimext.h
+++ b/src/GvimExt/gvimext.h
@@ -43,6 +43,12 @@
 #include <windowsx.h>
 #include <shlobj.h>
 
+/* Accommodate old versions of VC that don't have a modern Platform SDK */
+#if _MSC_VER < 1300
+#undef  UINT_PTR
+#define UINT_PTR UINT
+#endif
+
 #define ResultFromShort(i)  ResultFromScode(MAKE_SCODE(SEVERITY_SUCCESS, 0, (USHORT)(i)))
 
 // Initialize GUIDs (should be done only and at-least once per DLL/EXE)
@@ -152,7 +158,7 @@
 
     STDMETHODIMP InvokeCommand(LPCMINVOKECOMMANDINFO lpcmi);
 
-    STDMETHODIMP GetCommandString(UINT idCmd,
+    STDMETHODIMP GetCommandString(UINT_PTR idCmd,
 	    UINT uFlags,
 	    UINT FAR *reserved,
 	    LPSTR pszName,
diff --git a/src/Make_mvc.mak b/src/Make_mvc.mak
index 9bb0487..f9d211d 100644
--- a/src/Make_mvc.mak
+++ b/src/Make_mvc.mak
@@ -167,13 +167,16 @@
 OBJDIR = $(OBJDIR)d
 !endif
 
-# Win32.mak requires that CPU be set appropriately
+# Win32.mak requires that CPU be set appropriately.
+# To cross-compile for Win64, set CPU=AMD64 or CPU=IA64.
 
 !ifdef PROCESSOR_ARCHITECTURE
 # We're on Windows NT or using VC 6+
+! ifndef CPU
 CPU = $(PROCESSOR_ARCHITECTURE)
-! if ("$(CPU)" == "x86") || ("$(CPU)" == "X86")
+!  if ("$(CPU)" == "x86") || ("$(CPU)" == "X86")
 CPU = i386
+!  endif
 ! endif
 !else  # !PROCESSOR_ARCHITECTURE
 # We're on Windows 95
diff --git a/src/buffer.c b/src/buffer.c
index 64ed971..7d625f2 100644
--- a/src/buffer.c
+++ b/src/buffer.c
@@ -3171,7 +3171,7 @@
 		i_name = gettail(curbuf->b_ffname);
 	    *i_str = NUL;
 	    /* Truncate name at 100 bytes. */
-	    len = STRLEN(i_name);
+	    len = (int)STRLEN(i_name);
 	    if (len > 100)
 	    {
 		len -= 100;
@@ -3425,7 +3425,7 @@
 		}
 		else
 #endif
-		    n = (p - t) - item[groupitem[groupdepth]].maxwid + 1;
+		    n = (long)(p - t) - item[groupitem[groupdepth]].maxwid + 1;
 
 		*t = '<';
 		mch_memmove(t + 1, t + n, p - (t + n));
@@ -3461,7 +3461,7 @@
 		    mch_memmove(t + n - l, t, p - t);
 		    l = n - l;
 		    if (p + l >= out + outlen)
-			l = (out + outlen) - p - 1;
+			l = (long)((out + outlen) - p - 1);
 		    p += l;
 		    for (n = groupitem[groupdepth] + 1; n < curitem; n++)
 			item[n].start += l;
@@ -3792,7 +3792,7 @@
 	    {
 		item[curitem].type = Highlight;
 		item[curitem].start = p;
-		item[curitem].minwid = -syn_namen2id(t, s - t);
+		item[curitem].minwid = -syn_namen2id(t, (int)(s - t));
 		curitem++;
 	    }
 	    ++s;
diff --git a/src/charset.c b/src/charset.c
index df86852..6ad8ae5 100644
--- a/src/charset.c
+++ b/src/charset.c
@@ -351,7 +351,7 @@
 		else
 		{
 		    transchar_hex(hexbuf, c);
-		    len += STRLEN(hexbuf);
+		    len += (int)STRLEN(hexbuf);
 		}
 	    }
 	    else
diff --git a/src/diff.c b/src/diff.c
index f5577f1..5f8a84a 100644
--- a/src/diff.c
+++ b/src/diff.c
@@ -1850,8 +1850,8 @@
 			&& vim_iswhite(line_org[si_org])
 			&& vim_iswhite(line_new[si_new]))
 		{
-		    si_org = skipwhite(line_org + si_org) - line_org;
-		    si_new = skipwhite(line_new + si_new) - line_new;
+		    si_org = (int)(skipwhite(line_org + si_org) - line_org);
+		    si_new = (int)(skipwhite(line_new + si_new) - line_new);
 		}
 		else
 		{
diff --git a/src/edit.c b/src/edit.c
index 8fd9ed4..c6287e0 100644
--- a/src/edit.c
+++ b/src/edit.c
@@ -2485,7 +2485,7 @@
 	compl_match_arraysize = 0;
 	compl = compl_first_match;
 	if (compl_leader != NULL)
-	    lead_len = STRLEN(compl_leader);
+	    lead_len = (int)STRLEN(compl_leader);
 	do
 	{
 	    if ((compl->cp_flags & ORIGINAL_TEXT) == 0
@@ -2643,7 +2643,7 @@
      * pattern. */
     if (ctrl_x_mode == CTRL_X_WHOLE_LINE)
     {
-	i = STRLEN(pat) + 8;
+	i = (int)STRLEN(pat) + 8;
 	ptr = alloc(i);
 	if (ptr == NULL)
 	    return;
@@ -2967,7 +2967,7 @@
     mb_ptr_back(line, p);
 
     vim_free(compl_leader);
-    compl_leader = vim_strnsave(line + compl_col, (p - line) - compl_col);
+    compl_leader = vim_strnsave(line + compl_col, (int)(p - line) - compl_col);
     if (compl_leader != NULL)
     {
 	ins_compl_del_pum();
@@ -3988,7 +3988,7 @@
 	/* Set "compl_shown_match" to the actually shown match, it may differ
 	 * when "compl_leader" is used to omit some of the matches. */
 	while (!ins_compl_equal(compl_shown_match,
-					   compl_leader, STRLEN(compl_leader))
+				      compl_leader, (int)STRLEN(compl_leader))
 		&& compl_shown_match->cp_next != NULL
 		&& compl_shown_match->cp_next != compl_first_match)
 	    compl_shown_match = compl_shown_match->cp_next;
@@ -4038,7 +4038,7 @@
 	if ((compl_shown_match->cp_flags & ORIGINAL_TEXT) == 0
 		&& compl_leader != NULL
 		&& !ins_compl_equal(compl_shown_match,
-					  compl_leader, STRLEN(compl_leader)))
+				     compl_leader, (int)STRLEN(compl_leader)))
 	    ++todo;
 	else
 	    /* Remember a matching item. */
@@ -4446,7 +4446,7 @@
 	}
 	else if (ctrl_x_mode == CTRL_X_WHOLE_LINE)
 	{
-	    compl_col = skipwhite(line) - line;
+	    compl_col = (colnr_T)(skipwhite(line) - line);
 	    compl_length = (int)curs_col - (int)compl_col;
 	    if (compl_length < 0)	/* cursor in indent: empty pattern */
 		compl_length = 0;
@@ -5668,7 +5668,7 @@
     if (!wasatend && has_format_option(FO_WHITE_PAR))
     {
 	new = ml_get_curline();
-	len = STRLEN(new);
+	len = (colnr_T)STRLEN(new);
 	if (curwin->w_cursor.col == len)
 	{
 	    pnew = vim_strnsave(new, len + 2);
@@ -5984,7 +5984,7 @@
 	     * deleted characters. */
 	    if (VIsual_active && VIsual.lnum == curwin->w_cursor.lnum)
 	    {
-		cc = STRLEN(ml_get_curline());
+		cc = (int)STRLEN(ml_get_curline());
 		if (VIsual.col > (colnr_T)cc)
 		{
 		    VIsual.col = cc;
@@ -6718,7 +6718,7 @@
 	    del_char(FALSE);
 # ifdef FEAT_VREPLACE
 	    if (State & VREPLACE_FLAG)
-		orig_len = STRLEN(ml_get_cursor());
+		orig_len = (int)STRLEN(ml_get_cursor());
 # endif
 	    replace_push(cc);
 	}
@@ -6728,7 +6728,7 @@
 	    pchar_cursor(cc);
 #ifdef FEAT_VREPLACE
 	    if (State & VREPLACE_FLAG)
-		orig_len = STRLEN(ml_get_cursor()) - 1;
+		orig_len = (int)STRLEN(ml_get_cursor()) - 1;
 #endif
 	}
 	replace_pop_ins();
@@ -6738,7 +6738,7 @@
 	{
 	    /* Get the number of screen cells used by the inserted characters */
 	    p = ml_get_cursor();
-	    ins_len = STRLEN(p) - orig_len;
+	    ins_len = (int)STRLEN(p) - orig_len;
 	    vcol = start_vcol;
 	    for (i = 0; i < ins_len; ++i)
 	    {
@@ -7908,7 +7908,7 @@
 									TRUE);
 		    int	    len;
 
-		    len = STRLEN(ptr);
+		    len = (int)STRLEN(ptr);
 		    if (len > 0 && ptr[len - 1] == ' ')
 			ptr[len - 1] = NUL;
 		}
diff --git a/src/eval.c b/src/eval.c
index 4dc6a29..1f208b9 100644
--- a/src/eval.c
+++ b/src/eval.c
@@ -1913,7 +1913,7 @@
     dictitem_T	*di;
     int		todo;
 
-    todo = ht->ht_used;
+    todo = (int)ht->ht_used;
     for (hi = ht->ht_array; todo > 0 && !got_int; ++hi)
     {
 	if (!HASHITEM_EMPTY(hi))
@@ -2666,7 +2666,7 @@
 		typval_T tv;
 
 		/* handle +=, -= and .= */
-		if (get_var_tv(lp->ll_name, STRLEN(lp->ll_name),
+		if (get_var_tv(lp->ll_name, (int)STRLEN(lp->ll_name),
 							     &tv, TRUE) == OK)
 		{
 		    if (tv_op(&tv, rettv, op) == OK)
@@ -3129,7 +3129,7 @@
 	++fudi.fd_dict->dv_refcount;
 
     /* If it is the name of a variable of type VAR_FUNC use its contents. */
-    len = STRLEN(tofree);
+    len = (int)STRLEN(tofree);
     name = deref_func_name(tofree, &len);
 
     /* Skip white space to allow ":call func ()".  Not good, but required for
@@ -3164,7 +3164,7 @@
 	    curwin->w_cursor.col = 0;
 	}
 	arg = startarg;
-	if (get_func_tv(name, STRLEN(name), &rettv, &arg,
+	if (get_func_tv(name, (int)STRLEN(name), &rettv, &arg,
 		    eap->line1, eap->line2, &doesrange,
 					    !eap->skip, fudi.fd_dict) == FAIL)
 	{
@@ -3491,7 +3491,7 @@
 		if (deep < 0 || deep > 1)
 		{
 		    /* recursive: lock/unlock the items the List contains */
-		    todo = d->dv_hashtab.ht_used;
+		    todo = (int)d->dv_hashtab.ht_used;
 		    for (hi = d->dv_hashtab.ht_array; todo > 0; ++hi)
 		    {
 			if (!HASHITEM_EMPTY(hi))
@@ -3534,7 +3534,7 @@
     int		todo;
 
     hash_lock(&globvarht);
-    todo = globvarht.ht_used;
+    todo = (int)globvarht.ht_used;
     for (hi = globvarht.ht_array; todo > 0 && !got_int; ++hi)
     {
 	if (!HASHITEM_EMPTY(hi))
@@ -5480,7 +5480,7 @@
     if (dict_len(d1) != dict_len(d2))
 	return FALSE;
 
-    todo = d1->dv_hashtab.ht_used;
+    todo = (int)d1->dv_hashtab.ht_used;
     for (hi = d1->dv_hashtab.ht_array; todo > 0; ++hi)
     {
 	if (!HASHITEM_EMPTY(hi))
@@ -6130,7 +6130,7 @@
     int		todo;
     hashitem_T	*hi;
 
-    todo = ht->ht_used;
+    todo = (int)ht->ht_used;
     for (hi = ht->ht_array; todo > 0; ++hi)
 	if (!HASHITEM_EMPTY(hi))
 	{
@@ -6251,7 +6251,7 @@
 
     /* Lock the hashtab, we don't want it to resize while freeing items. */
     hash_lock(&d->dv_hashtab);
-    todo = d->dv_hashtab.ht_used;
+    todo = (int)d->dv_hashtab.ht_used;
     for (hi = d->dv_hashtab.ht_array; todo > 0; ++hi)
     {
 	if (!HASHITEM_EMPTY(hi))
@@ -6280,7 +6280,7 @@
 {
     dictitem_T *di;
 
-    di = (dictitem_T *)alloc(sizeof(dictitem_T) + STRLEN(key));
+    di = (dictitem_T *)alloc((unsigned)(sizeof(dictitem_T) + STRLEN(key)));
     if (di != NULL)
     {
 	STRCPY(di->di_key, key);
@@ -6298,7 +6298,8 @@
 {
     dictitem_T *di;
 
-    di = (dictitem_T *)alloc(sizeof(dictitem_T) + STRLEN(org->di_key));
+    di = (dictitem_T *)alloc((unsigned)(sizeof(dictitem_T)
+						      + STRLEN(org->di_key)));
     if (di != NULL)
     {
 	STRCPY(di->di_key, org->di_key);
@@ -6365,7 +6366,7 @@
 	    orig->dv_copyID = copyID;
 	    orig->dv_copydict = copy;
 	}
-	todo = orig->dv_hashtab.ht_used;
+	todo = (int)orig->dv_hashtab.ht_used;
 	for (hi = orig->dv_hashtab.ht_array; todo > 0 && !got_int; ++hi)
 	{
 	    if (!HASHITEM_EMPTY(hi))
@@ -6462,7 +6463,7 @@
 {
     if (d == NULL)
 	return 0L;
-    return d->dv_hashtab.ht_used;
+    return (long)d->dv_hashtab.ht_used;
 }
 
 /*
@@ -6567,7 +6568,7 @@
     ga_init2(&ga, (int)sizeof(char), 80);
     ga_append(&ga, '{');
 
-    todo = d->dv_hashtab.ht_used;
+    todo = (int)d->dv_hashtab.ht_used;
     for (hi = d->dv_hashtab.ht_array; todo > 0 && !got_int; ++hi)
     {
 	if (!HASHITEM_EMPTY(hi))
@@ -6859,7 +6860,7 @@
     len = (function ? 13 : 3);
     if (str != NULL)
     {
-	len += STRLEN(str);
+	len += (unsigned)STRLEN(str);
 	for (p = str; *p != NUL; mb_ptr_adv(p))
 	    if (*p == '\'')
 		++len;
@@ -7291,7 +7292,7 @@
 	    *lenp = 0;
 	    return (char_u *)"";	/* just in case */
 	}
-	*lenp = STRLEN(v->di_tv.vval.v_string);
+	*lenp = (int)STRLEN(v->di_tv.vval.v_string);
 	return v->di_tv.vval.v_string;
     }
 
@@ -7554,21 +7555,21 @@
 	switch (error)
 	{
 	    case ERROR_UNKNOWN:
-		    emsg_funcname("E117: Unknown function: %s", name);
+		    emsg_funcname(N_("E117: Unknown function: %s"), name);
 		    break;
 	    case ERROR_TOOMANY:
 		    emsg_funcname(e_toomanyarg, name);
 		    break;
 	    case ERROR_TOOFEW:
-		    emsg_funcname("E119: Not enough arguments for function: %s",
+		    emsg_funcname(N_("E119: Not enough arguments for function: %s"),
 									name);
 		    break;
 	    case ERROR_SCRIPT:
-		    emsg_funcname("E120: Using <SID> not in a script context: %s",
+		    emsg_funcname(N_("E120: Using <SID> not in a script context: %s"),
 									name);
 		    break;
 	    case ERROR_DICT:
-		    emsg_funcname("E725: Calling dict function without Dictionary: %s",
+		    emsg_funcname(N_("E725: Calling dict function without Dictionary: %s"),
 									name);
 		    break;
 	}
@@ -8047,7 +8048,7 @@
 	    return;
 	t += (*mb_ptr2len)(t);
     }
-    rettv->vval.v_number = t - str;
+    rettv->vval.v_number = (varnumber_T)(t - str);
 #else
     if (idx <= STRLEN(str))
 	rettv->vval.v_number = idx;
@@ -8110,7 +8111,7 @@
     }
 
     if (item == NULL)
-	(void)call_func(func, STRLEN(func), rettv, argc, argv,
+	(void)call_func(func, (int)STRLEN(func), rettv, argc, argv,
 				 curwin->w_cursor.lnum, curwin->w_cursor.lnum,
 						      &dummy, TRUE, selfdict);
 
@@ -8191,7 +8192,7 @@
 	{
 	    /* '> can be MAXCOL, get the length of the line then */
 	    if (fp->lnum <= curbuf->b_ml.ml_line_count)
-		col = STRLEN(ml_get(fp->lnum)) + 1;
+		col = (colnr_T)STRLEN(ml_get(fp->lnum)) + 1;
 	    else
 		col = MAXCOL;
 	}
@@ -8420,7 +8421,7 @@
 		    EMSG(_(e_invarg));
 	    }
 
-	    todo = error ? 0 : d->dv_hashtab.ht_used;
+	    todo = error ? 0 : (int)d->dv_hashtab.ht_used;
 	    for (hi = d->dv_hashtab.ht_array; todo > 0; ++hi)
 	    {
 		if (!HASHITEM_EMPTY(hi))
@@ -8952,7 +8953,7 @@
 
 	    /* Go over all entries in the second dict and add them to the
 	     * first dict. */
-	    todo = d2->dv_hashtab.ht_used;
+	    todo = (int)d2->dv_hashtab.ht_used;
 	    for (hi2 = d2->dv_hashtab.ht_array; todo > 0; ++hi2)
 	    {
 		if (!HASHITEM_EMPTY(hi2))
@@ -9154,7 +9155,7 @@
 
 	    ht = &d->dv_hashtab;
 	    hash_lock(ht);
-	    todo = ht->ht_used;
+	    todo = (int)ht->ht_used;
 	    for (hi = ht->ht_array; todo > 0; ++hi)
 	    {
 		if (!HASHITEM_EMPTY(hi))
@@ -11320,7 +11321,7 @@
 		if (xp_name == NULL)
 		    return;
 
-		xp_namelen = STRLEN(xp_name);
+		xp_namelen = (int)STRLEN(xp_name);
 
 		if (parse_compl_arg(xp_name, xp_namelen, &xp_type, &argt,
 							     &xp_arg) == FAIL)
@@ -11634,7 +11635,7 @@
     if (rettv_list_alloc(rettv) == FAIL)
 	return;
 
-    todo = d->dv_hashtab.ht_used;
+    todo = (int)d->dv_hashtab.ht_used;
     for (hi = d->dv_hashtab.ht_array; todo > 0; ++hi)
     {
 	if (!HASHITEM_EMPTY(hi))
@@ -12153,8 +12154,8 @@
 	    else
 	    {
 #ifdef FEAT_MBYTE
-		startcol = regmatch.startp[0]
-				    + (*mb_ptr2len)(regmatch.startp[0]) - str;
+		startcol = (colnr_T)(regmatch.startp[0]
+				    + (*mb_ptr2len)(regmatch.startp[0]) - str);
 #else
 		startcol = regmatch.startp[0] + 1 - str;
 #endif
@@ -12198,7 +12199,7 @@
 		else
 		    rettv->vval.v_number =
 					(varnumber_T)(regmatch.endp[0] - str);
-		rettv->vval.v_number += str - expr;
+		rettv->vval.v_number += (varnumber_T)(str - expr);
 	    }
 	}
 	vim_free(regmatch.regprog);
@@ -12323,7 +12324,7 @@
 	d = argvars[0].vval.v_dict;
 	if (d != NULL)
 	{
-	    todo = d->dv_hashtab.ht_used;
+	    todo = (int)d->dv_hashtab.ht_used;
 	    for (hi = d->dv_hashtab.ht_array; todo > 0; ++hi)
 	    {
 		if (!HASHITEM_EMPTY(hi))
@@ -12711,7 +12712,7 @@
     filtd = 0;
     while (cnt < maxline || maxline < 0)
     {
-	readlen = fread(buf + filtd, 1, FREAD_SIZE - filtd, fd);
+	readlen = (int)fread(buf + filtd, 1, FREAD_SIZE - filtd, fd);
 	buflen = filtd + readlen;
 	tolist = 0;
 	for ( ; filtd < buflen || readlen <= 0; ++filtd)
@@ -14599,7 +14600,7 @@
     copy_tv(&(*(listitem_T **)s2)->li_tv, &argv[1]);
 
     rettv.v_type = VAR_UNKNOWN;		/* clear_tv() uses this */
-    res = call_func(item_compare_func, STRLEN(item_compare_func),
+    res = call_func(item_compare_func, (int)STRLEN(item_compare_func),
 				 &rettv, 2, argv, 0L, 0L, &dummy, TRUE, NULL);
     clear_tv(&argv[0]);
     clear_tv(&argv[1]);
@@ -15134,7 +15135,7 @@
 
     needle = get_tv_string_chk(&argvars[1]);
     haystack = get_tv_string_buf_chk(&argvars[0], buf);
-    haystack_len = STRLEN(haystack);
+    haystack_len = (int)STRLEN(haystack);
 
     rettv->vval.v_number = -1;
     if (needle == NULL || haystack == NULL)
@@ -16972,7 +16973,7 @@
 
 	    /* Invoke the function.  Recursive! */
 	    s = functv.vval.v_string;
-	    ret = get_func_tv(s, STRLEN(s), rettv, arg,
+	    ret = get_func_tv(s, (int)STRLEN(s), rettv, arg,
 			curwin->w_cursor.lnum, curwin->w_cursor.lnum,
 			&len, evaluate, selfdict);
 
@@ -17512,7 +17513,7 @@
     dictitem_T	*v;
 
     hash_lock(ht);
-    todo = ht->ht_used;
+    todo = (int)ht->ht_used;
     for (hi = ht->ht_array; todo > 0; ++hi)
     {
 	if (!HASHITEM_EMPTY(hi))
@@ -18166,7 +18167,7 @@
     {
 	if (!eap->skip)
 	{
-	    todo = func_hashtab.ht_used;
+	    todo = (int)func_hashtab.ht_used;
 	    for (hi = func_hashtab.ht_array; todo > 0 && !got_int; ++hi)
 	    {
 		if (!HASHITEM_EMPTY(hi))
@@ -18200,7 +18201,7 @@
 	    {
 		regmatch.rm_ic = p_ic;
 
-		todo = func_hashtab.ht_used;
+		todo = (int)func_hashtab.ht_used;
 		for (hi = func_hashtab.ht_array; todo > 0 && !got_int; ++hi)
 		{
 		    if (!HASHITEM_EMPTY(hi))
@@ -18684,8 +18685,8 @@
 		if (scriptname != NULL)
 		{
 		    p = vim_strchr(scriptname, '/');
-		    plen = STRLEN(p);
-		    slen = STRLEN(sourcing_name);
+		    plen = (int)STRLEN(p);
+		    slen = (int)STRLEN(sourcing_name);
 		    if (slen > plen && fnamecmp(p,
 					    sourcing_name + slen - plen) == 0)
 			j = OK;
@@ -18866,7 +18867,7 @@
 
     if (lv.ll_exp_name != NULL)
     {
-	len = STRLEN(lv.ll_exp_name);
+	len = (int)STRLEN(lv.ll_exp_name);
 	if (lead <= 2 && lv.ll_name == lv.ll_exp_name
 					 && STRNCMP(lv.ll_name, "s:", 2) == 0)
 	{
@@ -19110,7 +19111,7 @@
     ufunc_T	**sorttab;
     int		st_len = 0;
 
-    todo = func_hashtab.ht_used;
+    todo = (int)func_hashtab.ht_used;
     sorttab = (ufunc_T **)alloc((unsigned)(sizeof(ufunc_T) * todo));
 
     for (hi = func_hashtab.ht_array; todo > 0; ++hi)
@@ -20274,7 +20275,7 @@
 
     fprintf(fp, _("\n# global variables:\n"));
 
-    todo = globvarht.ht_used;
+    todo = (int)globvarht.ht_used;
     for (hi = globvarht.ht_array; todo > 0; ++hi)
     {
 	if (!HASHITEM_EMPTY(hi))
@@ -20310,7 +20311,7 @@
     int		todo;
     char_u	*p, *t;
 
-    todo = globvarht.ht_used;
+    todo = (int)globvarht.ht_used;
     for (hi = globvarht.ht_array; todo > 0; ++hi)
     {
 	if (!HASHITEM_EMPTY(hi))
@@ -20542,7 +20543,7 @@
     else
 	pbuf = tfname = FullName_save(*fnamep, FALSE);
 
-    len = tflen = STRLEN(tfname);
+    len = tflen = (int)STRLEN(tfname);
 
     if (!get_short_pathname(&tfname, &pbuf, &len))
 	return -1;
diff --git a/src/ex_cmds.c b/src/ex_cmds.c
index 533b2cc..aafe31c 100644
--- a/src/ex_cmds.c
+++ b/src/ex_cmds.c
@@ -435,7 +435,7 @@
     for (lnum = eap->line1; lnum <= eap->line2; ++lnum)
     {
 	s = ml_get(lnum);
-	len = STRLEN(s);
+	len = (int)STRLEN(s);
 	if (maxlen < len)
 	    maxlen = len;
 
@@ -445,11 +445,11 @@
 	{
 	    if (sort_rx)
 	    {
-		start_col = regmatch.startp[0] - s;
-		end_col = regmatch.endp[0] - s;
+		start_col = (colnr_T)(regmatch.startp[0] - s);
+		end_col = (colnr_T)(regmatch.endp[0] - s);
 	    }
 	    else
-		start_col = regmatch.endp[0] - s;
+		start_col = (colnr_T)(regmatch.endp[0] - s);
 	}
 	else
 	    if (regmatch.regprog != NULL)
@@ -526,7 +526,7 @@
 	count = 0;
 
     /* Adjust marks for deleted (or added) lines and prepare for displaying. */
-    deleted = count - (lnum - eap->line2);
+    deleted = (long)(count - (lnum - eap->line2));
     if (deleted > 0)
 	mark_adjust(eap->line2 - deleted, eap->line2, (long)MAXLNUM, -deleted);
     else if (deleted < 0)
@@ -3182,7 +3182,7 @@
 
 	/* Set v:swapcommand for the SwapExists autocommands. */
 	if (command != NULL)
-	    len = STRLEN(command) + 3;
+	    len = (int)STRLEN(command) + 3;
 	else
 	    len = 30;
 	p = alloc((unsigned)len);
@@ -3986,7 +3986,7 @@
     switch (*kind)
     {
 	case '-':
-	    start = lnum - bigness * (x - kind);
+	    start = lnum - bigness * (linenr_T)(x - kind);
 	    end = start + bigness;
 	    curs = end;
 	    break;
@@ -4013,7 +4013,7 @@
 	default:  /* '+' */
 	    start = lnum;
 	    if (*kind == '+')
-		start += bigness * (x - kind - 1) + 1;
+		start += bigness * (linenr_T)(x - kind - 1) + 1;
 	    else if (eap->addr_count == 0)
 		++start;
 	    end = start + bigness - 1;
@@ -4514,7 +4514,7 @@
 		     * Avoids that ":s/\nB\@=//gc" get stuck. */
 		    if (nmatch > 1)
 		    {
-			matchcol = STRLEN(sub_firstline);
+			matchcol = (colnr_T)STRLEN(sub_firstline);
 			nmatch = 1;
 		    }
 		    sub_nsubs++;
@@ -4671,7 +4671,7 @@
 			 * Avoids that ":s/\nB\@=//gc" get stuck. */
 			if (nmatch > 1)
 			{
-			    matchcol = STRLEN(sub_firstline);
+			    matchcol = (colnr_T)STRLEN(sub_firstline);
 			    nmatch = 1;
 			}
 			goto skip;
@@ -5028,7 +5028,7 @@
 	if (got_int)
 	{
 	    STRCPY(msg_buf, _("(Interrupted) "));
-	    len = STRLEN(msg_buf);
+	    len = (int)STRLEN(msg_buf);
 	}
 	if (sub_nsubs == 1)
 	    vim_snprintf((char *)msg_buf + len, sizeof(msg_buf) - len,
@@ -5037,7 +5037,7 @@
 	    vim_snprintf((char *)msg_buf + len, sizeof(msg_buf) - len,
 		    count_only ? _("%ld matches") : _("%ld substitutions"),
 								   sub_nsubs);
-	len = STRLEN(msg_buf);
+	len = (int)STRLEN(msg_buf);
 	if (sub_nlines == 1)
 	    vim_snprintf((char *)msg_buf + len, sizeof(msg_buf) - len,
 		    "%s", _(" on 1 line"));
@@ -5407,7 +5407,7 @@
 	/* Find first item with the requested language. */
 	for (i = 0; i < num_matches; ++i)
 	{
-	    len = STRLEN(matches[i]);
+	    len = (int)STRLEN(matches[i]);
 	    if (len > 3 && matches[i][len - 3] == '@'
 				  && STRICMP(matches[i] + len - 2, lang) == 0)
 		break;
@@ -5539,7 +5539,7 @@
 check_help_lang(arg)
     char_u *arg;
 {
-    int len = STRLEN(arg);
+    int len = (int)STRLEN(arg);
 
     if (len >= 3 && arg[len - 3] == '@' && ASCII_ISALPHA(arg[len - 2])
 					       && ASCII_ISALPHA(arg[len - 1]))
@@ -6039,7 +6039,7 @@
     ga_init2(&ga, 1, 10);
     for (i = 0; i < filecount; ++i)
     {
-	len = STRLEN(files[i]);
+	len = (int)STRLEN(files[i]);
 	if (len > 4)
 	{
 	    if (STRICMP(files[i] + len - 4, ".txt") == 0)
@@ -6172,7 +6172,7 @@
 	    got_int = TRUE;
 	else
 	{
-	    s = alloc(18 + STRLEN(tagfname));
+	    s = alloc(18 + (unsigned)STRLEN(tagfname));
 	    if (s == NULL)
 		got_int = TRUE;
 	    else
@@ -6549,7 +6549,7 @@
 			    for (s = arg; s < p; ++s)
 				if (!vim_isprintc(*s))
 				    break;
-			    cells = s - arg;
+			    cells = (int)(s - arg);
 			}
 			/* Currently must be one or two display cells */
 			if (s != p || cells < 1 || cells > 2)
@@ -6562,7 +6562,7 @@
 			vim_free(sp->sn_text);
 			/* Allocate one byte more if we need to pad up
 			 * with a space. */
-			len = p - arg + ((cells == 1) ? 1 : 0);
+			len = (int)(p - arg + ((cells == 1) ? 1 : 0));
 			sp->sn_text = vim_strnsave(arg, len);
 
 			if (sp->sn_text != NULL && cells == 1)
diff --git a/src/ex_cmds2.c b/src/ex_cmds2.c
index 3d6e217..4d01039 100644
--- a/src/ex_cmds2.c
+++ b/src/ex_cmds2.c
@@ -1023,7 +1023,7 @@
     int		len;
 
     e = skiptowhite(eap->arg);
-    len = e - eap->arg;
+    len = (int)(e - eap->arg);
     e = skipwhite(e);
 
     if (len == 5 && STRNCMP(eap->arg, "start", 5) == 0 && *e != NUL)
diff --git a/src/ex_docmd.c b/src/ex_docmd.c
index 8323ca8..27c44ff 100644
--- a/src/ex_docmd.c
+++ b/src/ex_docmd.c
@@ -2142,7 +2142,7 @@
 #ifdef FEAT_USR_CMDS
     if (!USER_CMDIDX(ea.cmdidx))
 #endif
-	ea.argt = cmdnames[(int)ea.cmdidx].cmd_argt;
+	ea.argt = (long)cmdnames[(int)ea.cmdidx].cmd_argt;
 
     if (!ea.skip)
     {
@@ -2898,7 +2898,7 @@
 			eap->cmdidx = CMD_USER;
 		    else
 			eap->cmdidx = CMD_USER_BUF;
-		    eap->argt = uc->uc_argt;
+		    eap->argt = (long)uc->uc_argt;
 		    eap->useridx = j;
 
 # ifdef FEAT_CMDL_COMPL
@@ -3164,7 +3164,7 @@
 #ifdef FEAT_USR_CMDS
     if (!USER_CMDIDX(ea.cmdidx))
 #endif
-	ea.argt = cmdnames[(int)ea.cmdidx].cmd_argt;
+	ea.argt = (long)cmdnames[(int)ea.cmdidx].cmd_argt;
 
     arg = skipwhite(p);
 
@@ -5145,7 +5145,7 @@
 	for (i = 0; i < gap->ga_len; ++i)
 	{
 	    cmd = USER_CMD_GA(gap, i);
-	    a = cmd->uc_argt;
+	    a = (long)cmd->uc_argt;
 
 	    /* Skip commands which don't match the requested prefix */
 	    if (STRNCMP(name, cmd->uc_name, name_len) != 0)
@@ -7295,7 +7295,7 @@
 	    regmatch.rm_ic = p_ic;
 	    p = ml_get_curline();
 	    if (vim_regexec(&regmatch, p, (colnr_T)0))
-		curwin->w_cursor.col = regmatch.startp[0] - p;
+		curwin->w_cursor.col = (colnr_T)(regmatch.startp[0] - p);
 	    else
 		EMSG(_(e_nomatch));
 	    vim_free(regmatch.regprog);
diff --git a/src/ex_eval.c b/src/ex_eval.c
index eaa5dec..1da7f1b 100644
--- a/src/ex_eval.c
+++ b/src/ex_eval.c
@@ -453,7 +453,7 @@
 	mesg = excp->messages->throw_msg;
 	if (cmdname != NULL && *cmdname != NUL)
 	{
-	    cmdlen = STRLEN(cmdname);
+	    cmdlen = (int)STRLEN(cmdname);
 	    excp->value = vim_strnsave((char_u *)"Vim(",
 					   4 + cmdlen + 2 + (int)STRLEN(mesg));
 	    if (excp->value == NULL)
diff --git a/src/ex_getln.c b/src/ex_getln.c
index 044429e..10f3355 100644
--- a/src/ex_getln.c
+++ b/src/ex_getln.c
@@ -674,7 +674,7 @@
 
 		    if (p != NULL && realloc_cmdbuff((int)STRLEN(p) + 1) == OK)
 		    {
-			ccline.cmdlen = STRLEN(p);
+			ccline.cmdlen = (int)STRLEN(p);
 			STRCPY(ccline.cmdbuff, p);
 			vim_free(p);
 
@@ -2917,7 +2917,7 @@
 		    --w;
 		}
 	    }
-	    len = (ccline.cmdbuff + ccline.cmdlen) - w;
+	    len = (int)((ccline.cmdbuff + ccline.cmdlen) - w);
 	    if (p_ic ? STRNICMP(w, arg, len) == 0 : STRNCMP(w, arg, len) == 0)
 		p += len;
 	}
@@ -4794,7 +4794,7 @@
 	    {
 		ExpandEscape(&xpc, buf, num_p, p, WILD_SILENT);
 		for (len = 0, i = 0; i < num_p; ++i)
-		    len += (long_u)STRLEN(p[i]) + 1;
+		    len += (int)STRLEN(p[i]) + 1;
 
 		/* Concatenate new results to previous ones. */
 		if (ga_grow(&ga, len) == OK)
@@ -5071,7 +5071,7 @@
 	vim_free(hisptr->hisstr);
 
 	/* Store the separator after the NUL of the string. */
-	len = STRLEN(new_entry);
+	len = (int)STRLEN(new_entry);
 	hisptr->hisstr = vim_strnsave(new_entry, len + 2);
 	if (hisptr->hisstr != NULL)
 	    hisptr->hisstr[len + 1] = sep;
diff --git a/src/fileio.c b/src/fileio.c
index 46b50f8..1c4cab8 100644
--- a/src/fileio.c
+++ b/src/fileio.c
@@ -1143,7 +1143,7 @@
 		 * multiple of 2
 		 * ucs-4 to utf-8: 4 bytes become up to 6 bytes, size must be
 		 * multiple of 4 */
-		real_size = size;
+		real_size = (int)size;
 # ifdef USE_ICONV
 		if (iconv_fd != (iconv_t)-1)
 		    size = size / ICONV_MULT;
@@ -1200,7 +1200,7 @@
 				/* Filled up to "size", append partial line.
 				 * Change NL to NUL to reverse the effect done
 				 * below. */
-				n = size - tlen;
+				n = (int)(size - tlen);
 				for (ni = 0; ni < n; ++ni)
 				{
 				    if (p[ni] == NL)
@@ -1488,7 +1488,7 @@
 			/* Handle CP_UTF8 input ourselves to be able to handle
 			 * trailing bytes properly.
 			 * Get one UTF-8 character from src. */
-			bytelen = utf_ptr2len_len(src, size);
+			bytelen = (int)utf_ptr2len_len(src, size);
 			if (bytelen > size)
 			{
 			    /* Only got some bytes of a character.  Normally
@@ -1559,7 +1559,7 @@
 			     * the data doesn't fit in this encoding. */
 			    dstlen = WideCharToMultiByte(enc_codepage, 0,
 				    (LPCWSTR)ucs2buf, ucs2len,
-				    (LPSTR)dst, (src - dst),
+				    (LPSTR)dst, (int)(src - dst),
 				    replstr, &bad);
 			    if (bad)
 				found_bad = TRUE;
@@ -1599,7 +1599,7 @@
 		}
 
 		/* The new size is equal to how much "dst" was advanced. */
-		size = dst - ptr;
+		size = (long)(dst - ptr);
 	    }
 	    else
 # endif
@@ -1840,7 +1840,7 @@
 		 * read in the previous read() call. */
 		for (p = ptr - utf_head_off(buffer, ptr); ; ++p)
 		{
-		    int	 todo = (ptr + size) - p;
+		    int	 todo = (int)((ptr + size) - p);
 		    int	 l;
 
 		    if (todo <= 0)
@@ -4538,7 +4538,7 @@
 
     if (errmsg != NULL)
     {
-	int numlen = errnum != NULL ? STRLEN(errnum) : 0;
+	int numlen = errnum != NULL ? (int)STRLEN(errnum) : 0;
 
 	attr = hl_attr(HLF_E);	/* set highlight for error messages */
 	msg_add_fname(buf,
@@ -4958,7 +4958,7 @@
 		 * The buffer has been allocated to be big enough. */
 		while (fromlen > 0)
 		{
-		    n = utf_ptr2len_len(from, fromlen);
+		    n = (int)utf_ptr2len_len(from, (int)fromlen);
 		    if (n > (int)fromlen)	/* incomplete byte sequence */
 			break;
 		    u8c = utf_ptr2char(from);
@@ -4977,7 +4977,7 @@
 		    return FAIL;
 		}
 		mch_memmove(ip->bw_rest, from, fromlen);
-		ip->bw_restlen = fromlen;
+		ip->bw_restlen = (int)fromlen;
 	    }
 	    else
 	    {
@@ -4985,13 +4985,13 @@
 		 * buffer.  The buffer has been allocated to be big enough. */
 		ip->bw_restlen = 0;
 		needed = MultiByteToWideChar(enc_codepage,
-				  MB_ERR_INVALID_CHARS, (LPCSTR)from, fromlen,
+				  MB_ERR_INVALID_CHARS, (LPCSTR)from, (int)fromlen,
 								     NULL, 0);
 		if (needed == 0)
 		{
 		    /* When conversion fails there may be a trailing byte. */
 		    needed = MultiByteToWideChar(enc_codepage,
-			      MB_ERR_INVALID_CHARS, (LPCSTR)from, fromlen - 1,
+			      MB_ERR_INVALID_CHARS, (LPCSTR)from, (int)fromlen - 1,
 								     NULL, 0);
 		    if (needed == 0)
 		    {
@@ -5004,7 +5004,7 @@
 		    ip->bw_restlen = 1;
 		}
 		needed = MultiByteToWideChar(enc_codepage, MB_ERR_INVALID_CHARS,
-				       (LPCSTR)from, fromlen - ip->bw_restlen,
+				       (LPCSTR)from, (int)(fromlen - ip->bw_restlen),
 							  (LPWSTR)to, needed);
 		if (needed == 0)
 		{
@@ -5033,7 +5033,7 @@
 			return FAIL;
 		    }
 		}
-		len = to - buf;
+		len = (int)(to - buf);
 	    }
 	    else
 #endif
@@ -5044,7 +5044,7 @@
 		 * fail. */
 		len = WideCharToMultiByte(FIO_GET_CP(flags), 0,
 			(LPCWSTR)ip->bw_conv_buf, (int)fromlen / sizeof(WCHAR),
-			(LPSTR)to, ip->bw_conv_buflen - fromlen, 0, &bad);
+			(LPSTR)to, (int)(ip->bw_conv_buflen - fromlen), 0, &bad);
 		if (bad)
 		{
 		    ip->bw_conv_error = TRUE;
@@ -7835,7 +7835,7 @@
 	    /* normalize pat into standard "<buffer>#N" form */
 	    sprintf((char *)buflocal_pat, "<buffer=%d>", buflocal_nr);
 	    pat = buflocal_pat;			/* can modify pat and patlen */
-	    patlen = STRLEN(buflocal_pat);	/*   but not endpat */
+	    patlen = (int)STRLEN(buflocal_pat);	/*   but not endpat */
 	}
 
 	/*
diff --git a/src/fold.c b/src/fold.c
index 4e23d63..8cd51a9 100644
--- a/src/fold.c
+++ b/src/fold.c
@@ -2006,7 +2006,7 @@
 
     /* Ignore leading and trailing white space in 'commentstring'. */
     cms_start = skipwhite(curbuf->b_p_cms);
-    cms_slen = STRLEN(cms_start);
+    cms_slen = (int)STRLEN(cms_start);
     while (cms_slen > 0 && vim_iswhite(cms_start[cms_slen - 1]))
 	--cms_slen;
 
@@ -2014,8 +2014,8 @@
     cms_end = (char_u *)strstr((char *)cms_start, "%s");
     if (cms_end != NULL)
     {
-	cms_elen = cms_slen - (cms_end - cms_start);
-	cms_slen = cms_end - cms_start;
+	cms_elen = cms_slen - (int)(cms_end - cms_start);
+	cms_slen = (int)(cms_end - cms_start);
 
 	/* exclude white space before "%s" */
 	while (cms_slen > 0 && vim_iswhite(cms_start[cms_slen - 1]))
@@ -2023,7 +2023,7 @@
 
 	/* skip "%s" and white space after it */
 	s = skipwhite(cms_end + 2);
-	cms_elen -= s - cms_end;
+	cms_elen -= (int)(s - cms_end);
 	cms_end = s;
     }
     parseMarker(curwin);
@@ -2047,7 +2047,7 @@
 	    if (p >= str + cms_slen
 			   && STRNCMP(p - cms_slen, cms_start, cms_slen) == 0)
 	    {
-		len += (s - p) + cms_slen;
+		len += (int)(s - p) + cms_slen;
 		s = p - cms_slen;
 	    }
 	}
diff --git a/src/getchar.c b/src/getchar.c
index 4c38cd7..3d85165 100644
--- a/src/getchar.c
+++ b/src/getchar.c
@@ -270,7 +270,7 @@
 									TRUE);
 	if (p == NULL)
 	    return; /* no space, just forget it */
-	buf->bh_space = len - slen;
+	buf->bh_space = (int)(len - slen);
 	vim_strncpy(p->b_str, s, (size_t)slen);
 
 	p->b_next = buf->bh_curr->b_next;
diff --git a/src/gui.c b/src/gui.c
index 5ede4c1..c377a35 100644
--- a/src/gui.c
+++ b/src/gui.c
@@ -2566,7 +2566,7 @@
     /* Put the cursor back where it was */
     gui.row = old_row;
     gui.col = old_col;
-    gui.highlight_mask = old_hl_mask;
+    gui.highlight_mask = (int)old_hl_mask;
 
     return retval;
 }
@@ -4345,7 +4345,7 @@
     if (curwin->w_leftcol == scrollbar_value)
 	return FALSE;
 
-    curwin->w_leftcol = scrollbar_value;
+    curwin->w_leftcol = (colnr_T)scrollbar_value;
 
     /* When the line of the cursor is too short, move the cursor to the
      * longest visible line.  Do a sanity check on "longest_lnum", just in
@@ -4427,9 +4427,9 @@
 {
     long_u	rgb = gui_mch_get_rgb(pixel);
 
-    return (  (((rgb >> 16) & 0xff) * 299)
-	    + (((rgb >> 8)  & 0xff) * 587)
-	    +  ((rgb	    & 0xff) * 114)) / 1000;
+    return  (int)(  (((rgb >> 16) & 0xff) * 299)
+	           + (((rgb >> 8) & 0xff) * 587)
+	           +  ((rgb	  & 0xff) * 114)) / 1000;
 }
 
 #if defined(FEAT_GUI_X11) || defined(PROTO)
@@ -4808,7 +4808,7 @@
 	text = vim_strsave(text);
 	if (text != NULL)
 	{
-	    int len = STRLEN(text);
+	    int len = (int)STRLEN(text);
 	    int i;
 
 	    /* Remove "\V" */
diff --git a/src/gui_w32.c b/src/gui_w32.c
index 21b757b..be5a78b 100644
--- a/src/gui_w32.c
+++ b/src/gui_w32.c
@@ -186,7 +186,7 @@
 static VOID CALLBACK BevalTimerProc __ARGS((HWND hwnd, UINT uMsg, UINT idEvent, DWORD dwTime));
 
 static BalloonEval  *cur_beval = NULL;
-static UINT	    BevalTimerId = 0;
+static UINT_PTR	    BevalTimerId = 0;
 static DWORD	    LastActivity = 0;
 
 /*
@@ -758,7 +758,7 @@
     case WM_CHAR:
 	/* Don't use HANDLE_MSG() for WM_CHAR, it truncates wParam to a single
 	 * byte while we want the UTF-16 character value. */
-	_OnChar(hwnd, wParam, (int)(short)LOWORD(lParam));
+	_OnChar(hwnd, (UINT)wParam, (int)(short)LOWORD(lParam));
 	return 0L;
 
     case WM_SYSCHAR:
@@ -774,7 +774,7 @@
 		)
 #endif
 	{
-	    _OnSysChar(hwnd, wParam, (int)(short)LOWORD(lParam));
+	    _OnSysChar(hwnd, (UINT)wParam, (int)(short)LOWORD(lParam));
 	    return 0L;
 	}
 #ifdef FEAT_MENU
@@ -2362,7 +2362,7 @@
 		    infow.wID = menu->id;
 		    infow.fType = MFT_STRING;
 		    infow.dwTypeData = wn;
-		    infow.cch = wcslen(wn);
+		    infow.cch = (UINT)wcslen(wn);
 		    infow.hSubMenu = menu->submenu_id;
 		    n = InsertMenuItemW((parent == NULL)
 					    ? s_menuBar : parent->submenu_id,
@@ -2990,7 +2990,7 @@
 		if (last_white != NULL)
 		{
 		    /* break the line just after a space */
-		    ga.ga_len -= pend - (last_white + 1);
+		    ga.ga_len -= (int)(pend - (last_white + 1));
 		    pend = last_white + 1;
 		    last_white = NULL;
 		}
@@ -3374,7 +3374,7 @@
 	if (wn != NULL)
 	{
 	    wcscpy(lpWCStr, wn);
-	    nChar = wcslen(wn) + 1;
+	    nChar = (int)wcslen(wn) + 1;
 	    vim_free(wn);
 	}
     }
diff --git a/src/gui_w48.c b/src/gui_w48.c
index ef1e071..f417c72 100644
--- a/src/gui_w48.c
+++ b/src/gui_w48.c
@@ -3612,7 +3612,7 @@
 	    {
 		/* Backslashes are only special when followed by a double
 		 * quote. */
-		i = strspn(p, "\\");
+		i = (int)strspn(p, "\\");
 		if (p[i] == '"')
 		{
 		    /* Halve the number of backslashes. */
diff --git a/src/hardcopy.c b/src/hardcopy.c
index 2b5c70e..62567a3 100644
--- a/src/hardcopy.c
+++ b/src/hardcopy.c
@@ -901,7 +901,7 @@
 	if (line[col] == TAB || tab_spaces != 0)
 	{
 	    if (tab_spaces == 0)
-		tab_spaces = curbuf->b_p_ts - (print_pos % curbuf->b_p_ts);
+		tab_spaces = (int)(curbuf->b_p_ts - (print_pos % curbuf->b_p_ts));
 
 	    while (tab_spaces > 0)
 	    {
@@ -936,7 +936,7 @@
     }
 
     ppos->lead_spaces = tab_spaces;
-    ppos->print_pos = print_pos;
+    ppos->print_pos = (int)print_pos;
 
     /*
      * Start next line of file if we clip lines, or have reached end of the
@@ -1476,7 +1476,7 @@
 prt_write_file(buffer)
     char_u	*buffer;
 {
-    prt_write_file_len(buffer, STRLEN(buffer));
+    prt_write_file_len(buffer, (int)STRLEN(buffer));
 }
 
     static void
@@ -1937,7 +1937,7 @@
     vim_memset(prt_resfile.buffer, NUL, PRT_FILE_BUFFER_LEN);
 
     /* Parse first line to ensure valid resource file */
-    prt_resfile.len = fread((char *)prt_resfile.buffer, sizeof(char_u),
+    prt_resfile.len = (int)fread((char *)prt_resfile.buffer, sizeof(char_u),
                                             PRT_FILE_BUFFER_LEN, fd_resource);
     if (ferror(fd_resource))
     {
@@ -1955,7 +1955,7 @@
     offset = 0;
 
     if (prt_resfile_strncmp(offset, PRT_RESOURCE_HEADER,
-                                            STRLEN(PRT_RESOURCE_HEADER)) != 0)
+				       (int)STRLEN(PRT_RESOURCE_HEADER)) != 0)
     {
 	EMSG2(_("E618: file \"%s\" is not a PostScript resource file"),
 		resource->filename);
@@ -1964,7 +1964,7 @@
     }
 
     /* Skip over any version numbers and following ws */
-    offset += STRLEN(PRT_RESOURCE_HEADER);
+    offset += (int)STRLEN(PRT_RESOURCE_HEADER);
     offset = prt_resfile_skip_nonws(offset);
     if (offset == -1)
         return FALSE;
@@ -1973,24 +1973,24 @@
         return FALSE;
 
     if (prt_resfile_strncmp(offset, PRT_RESOURCE_RESOURCE,
-                                            STRLEN(PRT_RESOURCE_RESOURCE)) != 0)
+				     (int)STRLEN(PRT_RESOURCE_RESOURCE)) != 0)
     {
 	EMSG2(_("E619: file \"%s\" is not a supported PostScript resource file"),
 		resource->filename);
 	fclose(fd_resource);
 	return FALSE;
     }
-    offset += STRLEN(PRT_RESOURCE_RESOURCE);
+    offset += (int)STRLEN(PRT_RESOURCE_RESOURCE);
 
     /* Decide type of resource in the file */
     if (prt_resfile_strncmp(offset, PRT_RESOURCE_PROCSET,
-                                            STRLEN(PRT_RESOURCE_PROCSET)) == 0)
+				      (int)STRLEN(PRT_RESOURCE_PROCSET)) == 0)
 	resource->type = PRT_RESOURCE_TYPE_PROCSET;
     else if (prt_resfile_strncmp(offset, PRT_RESOURCE_ENCODING,
-                                            STRLEN(PRT_RESOURCE_ENCODING)) == 0)
+				     (int)STRLEN(PRT_RESOURCE_ENCODING)) == 0)
 	resource->type = PRT_RESOURCE_TYPE_ENCODING;
     else if (prt_resfile_strncmp(offset, PRT_RESOURCE_CMAP,
-                                            STRLEN(PRT_RESOURCE_CMAP)) == 0)
+					 (int)STRLEN(PRT_RESOURCE_CMAP)) == 0)
 	resource->type = PRT_RESOURCE_TYPE_CMAP;
     else
     {
@@ -2414,7 +2414,7 @@
 
     *pp_mbenc = NULL;
     /* Look for recognised encoding */
-    enc_len = STRLEN(p_encoding);
+    enc_len = (int)STRLEN(p_encoding);
     p_mbenc = p_cmap->encodings;
     for (mbenc = 0; mbenc < p_cmap->num_encodings; mbenc++)
     {
@@ -2441,7 +2441,7 @@
     /* Look for recognised character set, using default if one is not given */
     if (*p_charset == NUL)
         p_charset = p_cmap->defcs;
-    char_len = STRLEN(p_charset);
+    char_len = (int)STRLEN(p_charset);
     p_mbchar = p_cmap->charsets;
     for (mbchar = 0; mbchar < p_cmap->num_charsets; mbchar++)
     {
@@ -2831,7 +2831,7 @@
 	}
 	if (bytes_read == 0)
 	    break;
-	prt_write_file_raw_len(resource_buffer, bytes_read);
+	prt_write_file_raw_len(resource_buffer, (int)bytes_read);
 	if (prt_file_error)
 	{
 	    fclose(fd_resource);
@@ -3634,7 +3634,7 @@
 mch_print_set_bg(bgcol)
     long_u	bgcol;
 {
-    prt_bgcol = bgcol;
+    prt_bgcol = (int)bgcol;
     prt_attribute_change = TRUE;
     prt_need_bgcol = TRUE;
 }
@@ -3645,7 +3645,7 @@
 {
     if (fgcol != (long_u)prt_fgcol)
     {
-	prt_fgcol = fgcol;
+	prt_fgcol = (int)fgcol;
 	prt_attribute_change = TRUE;
 	prt_need_fgcol = TRUE;
     }
diff --git a/src/hashtab.c b/src/hashtab.c
index e3306b3..e0d3e1a 100644
--- a/src/hashtab.c
+++ b/src/hashtab.c
@@ -95,10 +95,10 @@
     hashtab_T	*ht;
     int		off;
 {
-    int		todo;
+    long	todo;
     hashitem_T	*hi;
 
-    todo = ht->ht_used;
+    todo = (long)ht->ht_used;
     for (hi = ht->ht_array; todo > 0; ++hi)
     {
 	if (!HASHITEM_EMPTY(hi))
@@ -150,7 +150,7 @@
      * - skip over a removed item
      * - return if the item matches
      */
-    idx = hash & ht->ht_mask;
+    idx = (int)(hash & ht->ht_mask);
     hi = &ht->ht_array[idx];
 
     if (hi->hi_key == NULL)
@@ -176,7 +176,7 @@
 #ifdef HT_DEBUG
 	++hash_count_perturb;	    /* count a "miss" for hashtab lookup */
 #endif
-	idx = (idx << 2) + idx + perturb + 1;
+	idx = (int)((idx << 2) + idx + perturb + 1);
 	hi = &ht->ht_array[idx & ht->ht_mask];
 	if (hi->hi_key == NULL)
 	    return freeitem == NULL ? hi : freeitem;
@@ -387,7 +387,7 @@
     {
 	/* Use specified size. */
 	if ((long_u)minitems < ht->ht_used)	/* just in case... */
-	    minitems = ht->ht_used;
+	    minitems = (int)ht->ht_used;
 	minsize = minitems * 3 / 2;	/* array is up to 2/3 full */
     }
 
@@ -439,7 +439,7 @@
      * is also a cleanup action.
      */
     newmask = newsize - 1;
-    todo = ht->ht_used;
+    todo = (int)ht->ht_used;
     for (olditem = oldarray; todo > 0; ++olditem)
 	if (!HASHITEM_EMPTY(olditem))
 	{
@@ -448,13 +448,13 @@
 	     * the algorithm to find an item in hash_lookup().  But we only
 	     * need to search for a NULL key, thus it's simpler.
 	     */
-	    newi = olditem->hi_hash & newmask;
+	    newi = (int)(olditem->hi_hash & newmask);
 	    newitem = &newarray[newi];
 
 	    if (newitem->hi_key != NULL)
 		for (perturb = olditem->hi_hash; ; perturb >>= PERTURB_SHIFT)
 		{
-		    newi = (newi << 2) + newi + perturb + 1;
+		    newi = (int)((newi << 2) + newi + perturb + 1);
 		    newitem = &newarray[newi & newmask];
 		    if (newitem->hi_key == NULL)
 			break;
diff --git a/src/if_cscope.c b/src/if_cscope.c
index aef48d0..81c7a6a 100644
--- a/src/if_cscope.c
+++ b/src/if_cscope.c
@@ -475,7 +475,7 @@
     /* if filename is a directory, append the cscope database name to it */
     if ((statbuf.st_mode & S_IFMT) == S_IFDIR)
     {
-	fname2 = (char *)alloc(strlen(CSCOPE_DBFILE) + strlen(fname) + 2);
+	fname2 = (char *)alloc((unsigned)(strlen(CSCOPE_DBFILE) + strlen(fname) + 2));
 	if (fname2 == NULL)
 	    goto add_err;
 
@@ -700,7 +700,7 @@
 	return NULL;
     }
 
-    if ((cmd = (char *)alloc(strlen(pattern) + 2)) == NULL)
+    if ((cmd = (char *)alloc((unsigned)(strlen(pattern) + 2))) == NULL)
 	return NULL;
 
     (void)sprintf(cmd, "%d%s", search, pattern);
@@ -723,7 +723,7 @@
     char *prog, *cmd, *ppath = NULL;
 #ifndef UNIX
     int in_save, out_save, err_save;
-    int ph;
+    long ph;
 # ifdef FEAT_GUI
     HWND activewnd = NULL;
     HWND consolewnd = NULL;
@@ -792,7 +792,7 @@
 	expand_env((char_u *)p_csprg, (char_u *)prog, MAXPATHL);
 
 	/* alloc space to hold the cscope command */
-	len = strlen(prog) + strlen(csinfo[i].fname) + 32;
+	len = (int)(strlen(prog) + strlen(csinfo[i].fname) + 32);
 	if (csinfo[i].ppath)
 	{
 	    /* expand the prepend path for env var's */
@@ -807,11 +807,11 @@
 	    }
 	    expand_env((char_u *)csinfo[i].ppath, (char_u *)ppath, MAXPATHL);
 
-	    len += strlen(ppath);
+	    len += (int)strlen(ppath);
 	}
 
 	if (csinfo[i].flags)
-	    len += strlen(csinfo[i].flags);
+	    len += (int)strlen(csinfo[i].flags);
 
 	if ((cmd = (char *)alloc(len)) == NULL)
 	{
@@ -881,9 +881,9 @@
 	/* May be use &shell, &shellquote etc */
 # ifdef __BORLANDC__
 	/* BCC 5.5 uses a different function name for spawnlp */
-	ph = spawnlp(P_NOWAIT, prog, cmd, NULL);
+	ph = (long)spawnlp(P_NOWAIT, prog, cmd, NULL);
 # else
-	ph = _spawnlp(_P_NOWAIT, prog, cmd, NULL);
+	ph = (long)_spawnlp(_P_NOWAIT, prog, cmd, NULL);
 # endif
 	vim_free(prog);
 	vim_free(cmd);
@@ -1034,7 +1034,7 @@
 	if (!verbose)
 	    return FALSE;
 
-	buf = (char *)alloc(strlen(opt) + strlen(pat) + strlen(nf));
+	buf = (char *)alloc((unsigned)(strlen(opt) + strlen(pat) + strlen(nf)));
 	if (buf == NULL)
 	    (void)EMSG(nf);
 	else
@@ -1086,7 +1086,7 @@
 	if (strchr(CSQF_FLAGS, *qfpos) == NULL)
 	{
 	    char *nf = _("E469: invalid cscopequickfix flag %c for %c");
-	    char *buf = (char *)alloc(strlen(nf));
+	    char *buf = (char *)alloc((unsigned)strlen(nf));
 
 	    /* strlen will be enough because we use chars */
 	    if (buf != NULL)
@@ -1330,14 +1330,14 @@
 	return -1;
     }
 
-    if ((csinfo[i].fname = (char *)alloc(strlen(fname)+1)) == NULL)
+    if ((csinfo[i].fname = (char *)alloc((unsigned)strlen(fname)+1)) == NULL)
 	return -1;
 
     (void)strcpy(csinfo[i].fname, (const char *)fname);
 
     if (ppath != NULL)
     {
-	if ((csinfo[i].ppath = (char *)alloc(strlen(ppath) + 1)) == NULL)
+	if ((csinfo[i].ppath = (char *)alloc((unsigned)strlen(ppath) + 1)) == NULL)
 	{
 	    vim_free(csinfo[i].fname);
 	    csinfo[i].fname = NULL;
@@ -1349,7 +1349,7 @@
 
     if (flags != NULL)
     {
-	if ((csinfo[i].flags = (char *)alloc(strlen(flags) + 1)) == NULL)
+	if ((csinfo[i].flags = (char *)alloc((unsigned)strlen(flags) + 1)) == NULL)
 	{
 	    vim_free(csinfo[i].fname);
 	    vim_free(csinfo[i].ppath);
@@ -1526,7 +1526,7 @@
 
     if (search != NULL)
     {
-	amt = strlen(fname) + strlen(slno) + strlen(tagstr) + strlen(search)+6;
+	amt = (int)(strlen(fname) + strlen(slno) + strlen(tagstr) + strlen(search)+6);
 	if ((buf = (char *)alloc(amt)) == NULL)
 	    return NULL;
 
@@ -1534,7 +1534,7 @@
     }
     else
     {
-	amt = strlen(fname) + strlen(slno) + strlen(tagstr) + 5;
+	amt = (int)(strlen(fname) + strlen(slno) + strlen(tagstr) + 5);
 	if ((buf = (char *)alloc(amt)) == NULL)
 	    return NULL;
 
@@ -1720,7 +1720,7 @@
 			   &slno, &search)) == NULL)
 	       continue;
 
-	   context = (char *)alloc(strlen(cntx)+5);
+	   context = (char *)alloc((unsigned)strlen(cntx)+5);
 	   if (context==NULL)
 	       continue;
 
@@ -1884,13 +1884,13 @@
 
     assert (num_matches > 0);
 
-    if ((tbuf = (char *)alloc(strlen(matches[0]) + 1)) == NULL)
+    if ((tbuf = (char *)alloc((unsigned)strlen(matches[0]) + 1)) == NULL)
 	return;
 
     strcpy(tbuf, matches[0]);
     ptag = strtok(tbuf, "\t");
 
-    newsize = strlen(cstag_msg) + strlen(ptag);
+    newsize = (int)(strlen(cstag_msg) + strlen(ptag));
     buf = (char *)alloc(newsize);
     if (buf != NULL)
     {
@@ -1914,7 +1914,7 @@
 	 * by parsing matches[i] on the fly and placing stuff into buf
 	 * directly, but that's too much of a hassle
 	 */
-	if ((tbuf = (char *)alloc(strlen(matches[idx]) + 1)) == NULL)
+	if ((tbuf = (char *)alloc((unsigned)strlen(matches[idx]) + 1)) == NULL)
 	    continue;
 	(void)strcpy(tbuf, matches[idx]);
 
@@ -1935,7 +1935,7 @@
 	lno[strlen(lno)-2] = '\0';  /* ignore ;" at the end */
 
 	/* hopefully 'num' (num of matches) will be less than 10^16 */
-	newsize = strlen(csfmt_str) + 16 + strlen(lno);
+	newsize = (int)(strlen(csfmt_str) + 16 + strlen(lno));
 	if (bufsize < newsize)
 	{
 	    buf = (char *)vim_realloc(buf, newsize);
@@ -1957,7 +1957,7 @@
 	    context = cntxts[idx];
 	else
 	    context = globalcntx;
-	newsize = strlen(context) + strlen(cntxformat);
+	newsize = (int)(strlen(context) + strlen(cntxformat));
 
 	if (bufsize < newsize)
 	{
@@ -2018,7 +2018,7 @@
     char	*cs_emsg;
     int		maxlen;
     static char *eprompt = "Press the RETURN key to continue:";
-    int		epromptlen = strlen(eprompt);
+    int		epromptlen = (int)strlen(eprompt);
     int		n;
 
     cs_emsg = _("E609: Cscope error: %s");
@@ -2236,9 +2236,9 @@
      * fullname is freed after cs_make_vim_style_matches, after it's been
      * copied into the tag buffer used by vim
      */
-    len = strlen(name) + 2;
+    len = (int)(strlen(name) + 2);
     if (csinfo[i].ppath != NULL)
-	len += strlen(csinfo[i].ppath);
+	len += (int)strlen(csinfo[i].ppath);
 
     if ((fullname = (char *)alloc(len)) == NULL)
 	return NULL;
diff --git a/src/if_ruby.c b/src/if_ruby.c
index 6bafdeb..78ccc00 100644
--- a/src/if_ruby.c
+++ b/src/if_ruby.c
@@ -362,7 +362,7 @@
 	    line = rb_lastline_get();
 	    if (!NIL_P(line)) {
 		if (TYPE(line) != T_STRING) {
-		    EMSG("E265: $_ must be an instance of String");
+		    EMSG(_("E265: $_ must be an instance of String"));
 		    return;
 		}
 		ml_replace(i, (char_u *) STR2CSTR(line), 1);
@@ -452,26 +452,26 @@
 
     switch (state) {
     case TAG_RETURN:
-	EMSG("E267: unexpected return");
+	EMSG(_("E267: unexpected return"));
 	break;
     case TAG_NEXT:
-	EMSG("E268: unexpected next");
+	EMSG(_("E268: unexpected next"));
 	break;
     case TAG_BREAK:
-	EMSG("E269: unexpected break");
+	EMSG(_("E269: unexpected break"));
 	break;
     case TAG_REDO:
-	EMSG("E270: unexpected redo");
+	EMSG(_("E270: unexpected redo"));
 	break;
     case TAG_RETRY:
-	EMSG("E271: retry outside of rescue clause");
+	EMSG(_("E271: retry outside of rescue clause"));
 	break;
     case TAG_RAISE:
     case TAG_FATAL:
 	eclass = CLASS_OF(ruby_errinfo);
 	einfo = rb_obj_as_string(ruby_errinfo);
 	if (eclass == rb_eRuntimeError && RSTRING(einfo)->len == 0) {
-	    EMSG("E272: unhandled exception");
+	    EMSG(_("E272: unhandled exception"));
 	}
 	else {
 	    VALUE epath;
diff --git a/src/main.c b/src/main.c
index f8b4fa9..51cd2c7 100644
--- a/src/main.c
+++ b/src/main.c
@@ -1872,7 +1872,7 @@
 		{
 		    set_option_value((char_u *)"verbosefile", 0L,
 					     (char_u *)argv[0] + argv_idx, 0);
-		    argv_idx = STRLEN(argv[0]);
+		    argv_idx = (int)STRLEN(argv[0]);
 		}
 		break;
 
diff --git a/src/mbyte.c b/src/mbyte.c
index 5db5c04..98d4e00 100644
--- a/src/mbyte.c
+++ b/src/mbyte.c
@@ -1104,7 +1104,7 @@
 
     /* binary search in table */
     bot = 0;
-    top = size / sizeof(struct interval) - 1;
+    top = (int)(size / sizeof(struct interval) - 1);
     while (top >= bot)
     {
 	mid = (bot + top) / 2;
@@ -2271,7 +2271,7 @@
     int		i, j, l;
     int		cdiff;
     int		incomplete = FALSE;
-    int		n = nn;
+    int		n = (int)nn;
 
     for (i = 0; i < n; i += l)
     {
@@ -2365,7 +2365,7 @@
 	}
 	sprintf((char *)IObuff + rlen, "%02x ", line[i]);
 	--clen;
-	rlen += STRLEN(IObuff + rlen);
+	rlen += (int)STRLEN(IObuff + rlen);
 	if (rlen > IOSIZE - 20)
 	    break;
     }
@@ -2640,12 +2640,12 @@
 				     || utf_char2len(utf_ptr2char(p)) != len))
 	    {
 		if (vimconv.vc_type == CONV_NONE)
-		    curwin->w_cursor.col += p - ml_get_cursor();
+		    curwin->w_cursor.col += (colnr_T)(p - ml_get_cursor());
 		else
 		{
 		    int	    l;
 
-		    len = p - tofree;
+		    len = (int)(p - tofree);
 		    for (p = ml_get_cursor(); *p != NUL && len-- > 0; p += l)
 		    {
 			l = utf_ptr2len(p);
@@ -3263,7 +3263,7 @@
 	{
 	    /* Handle an incomplete sequence at the end. */
 	    *to = NUL;
-	    *unconvlenp = fromlen;
+	    *unconvlenp = (int)fromlen;
 	    break;
 	}
 
@@ -3280,12 +3280,12 @@
 	    if ((*mb_ptr2cells)((char_u *)from) > 1)
 		*to++ = '?';
 	    if (enc_utf8)
-		l = utfc_ptr2len_len((char_u *)from, fromlen);
+		l = utfc_ptr2len_len((char_u *)from, (int)fromlen);
 	    else
 	    {
 		l = (*mb_ptr2len)((char_u *)from);
 		if (l > (int)fromlen)
-		    l = fromlen;
+		    l = (int)fromlen;
 	    }
 	    from += l;
 	    fromlen -= l;
diff --git a/src/memline.c b/src/memline.c
index 5543e5d..9284abb 100644
--- a/src/memline.c
+++ b/src/memline.c
@@ -809,7 +809,7 @@
 {
     int		n;
 
-    n = STRLEN(buf->b_p_fenc);
+    n = (int)STRLEN(buf->b_p_fenc);
     if (STRLEN(b0p->b0_fname) + n + 1 > B0_FNAME_SIZE)
 	b0p->b0_flags &= ~B0_HAS_FENC;
     else
@@ -1066,7 +1066,7 @@
 	for (p = b0p->b0_fname + B0_FNAME_SIZE;
 				       p > b0p->b0_fname && p[-1] != NUL; --p)
 	    ;
-	b0_fenc = vim_strnsave(p, b0p->b0_fname + B0_FNAME_SIZE - p);
+	b0_fenc = vim_strnsave(p, (int)(b0p->b0_fname + B0_FNAME_SIZE - p));
     }
 
     mf_put(mfp, hp, FALSE, FALSE);	/* release block 0 */
@@ -2638,7 +2638,7 @@
     if (usingNetbeans)
     {
 	if (STRLEN(line) > 0)
-	    netbeans_inserted(buf, lnum+1, (colnr_T)0, line, STRLEN(line));
+	    netbeans_inserted(buf, lnum+1, (colnr_T)0, line, (int)STRLEN(line));
 	netbeans_inserted(buf, lnum+1, (colnr_T)STRLEN(line),
 							   (char_u *)"\n", 1);
     }
@@ -2676,7 +2676,7 @@
     if (usingNetbeans)
     {
 	netbeans_removed(curbuf, lnum, 0, (long)STRLEN(ml_get(lnum)));
-	netbeans_inserted(curbuf, lnum, 0, line, STRLEN(line));
+	netbeans_inserted(curbuf, lnum, 0, line, (int)STRLEN(line));
     }
 #endif
     if (curbuf->b_ml.ml_line_lnum != lnum)	    /* other line buffered */
diff --git a/src/menu.c b/src/menu.c
index b9c7922..b4f06d2 100644
--- a/src/menu.c
+++ b/src/menu.c
@@ -759,7 +759,7 @@
 			STRCPY(menu->strings[i] + 1, call_data);
 			if (c == Ctrl_C)
 			{
-			    int	    len = STRLEN(menu->strings[i]);
+			    int	    len = (int)STRLEN(menu->strings[i]);
 
 			    /* Append CTRL-\ CTRL-G to obey 'insertmode'. */
 			    menu->strings[i][len] = Ctrl_BSL;
diff --git a/src/message.c b/src/message.c
index 0d56759..69b194d 100644
--- a/src/message.c
+++ b/src/message.c
@@ -2102,7 +2102,7 @@
 	    p = (char_u *)_("Unknown");
 	else
 	{
-	    len = STRLEN(p) + 40;
+	    len = (int)STRLEN(p) + 40;
 	    tofree = alloc(len);
 	    if (tofree != NULL)
 	    {
@@ -3511,11 +3511,11 @@
 	}
 	else
 	{
-	    len += STRLEN(message)
-		    + 2			/* for the NL's */
-		    + STRLEN(buttons)
-		    + 3;		/* for the ": " and NUL */
-	    lenhotkey++;		/* for the NUL */
+	    len += (int)(STRLEN(message)
+                        + 2			/* for the NL's */
+                        + STRLEN(buttons)
+                        + 3);	        	/* for the ": " and NUL */
+	    lenhotkey++;			/* for the NUL */
 
 	    /* If no hotkey is specified first char is used. */
 	    if (!has_hotkey[0])
@@ -4429,8 +4429,8 @@
 		    /* zero padding to specified minimal field width? */
 		    if (!justify_left && zero_padding)
 		    {
-			int n = min_field_width - (str_arg_l
-						    + number_of_zeros_to_pad);
+			int n = (int)(min_field_width - (str_arg_l
+						    + number_of_zeros_to_pad));
 			if (n > 0)
 			    number_of_zeros_to_pad += n;
 		    }
@@ -4464,7 +4464,7 @@
 	    if (!justify_left)
 	    {
 		/* left padding with blank or zero */
-		int pn = min_field_width - (str_arg_l + number_of_zeros_to_pad);
+		int pn = (int)(min_field_width - (str_arg_l + number_of_zeros_to_pad));
 
 		if (pn > 0)
 		{
@@ -4491,7 +4491,7 @@
 	    {
 		/* insert first part of numerics (sign or '0x') before zero
 		 * padding */
-		int zn = zero_padding_insertion_ind;
+		int zn = (int)zero_padding_insertion_ind;
 
 		if (zn > 0)
 		{
@@ -4507,7 +4507,7 @@
 
 		/* insert zero padding as requested by the precision or min
 		 * field width */
-		zn = number_of_zeros_to_pad;
+		zn = (int)number_of_zeros_to_pad;
 		if (zn > 0)
 		{
 		    if (str_l < str_m)
@@ -4524,7 +4524,7 @@
 	    /* insert formatted string
 	     * (or as-is conversion specifier for unknown conversions) */
 	    {
-		int sn = str_arg_l - zero_padding_insertion_ind;
+		int sn = (int)(str_arg_l - zero_padding_insertion_ind);
 
 		if (sn > 0)
 		{
@@ -4544,7 +4544,7 @@
 	    if (justify_left)
 	    {
 		/* right blank padding to the field width */
-		int pn = min_field_width - (str_arg_l + number_of_zeros_to_pad);
+		int pn = (int)(min_field_width - (str_arg_l + number_of_zeros_to_pad));
 
 		if (pn > 0)
 		{
diff --git a/src/misc1.c b/src/misc1.c
index 6c3b5ad..7d86e46 100644
--- a/src/misc1.c
+++ b/src/misc1.c
@@ -263,7 +263,7 @@
 	/* Correct saved cursor position if it's after the indent. */
 	if (saved_cursor.lnum == curwin->w_cursor.lnum
 				&& saved_cursor.col >= (colnr_T)(p - oldline))
-	    saved_cursor.col += ind_len - (p - oldline);
+	    saved_cursor.col += ind_len - (colnr_T)(p - oldline);
 	retval = TRUE;
     }
     else
@@ -1013,7 +1013,7 @@
 				mb_ptr_back(leader, p);
 				old_size += ptr2cells(p);
 			    }
-			    l = lead_repl_len - (endp - p);
+			    l = lead_repl_len - (int)(endp - p);
 			    if (l != 0)
 				mch_memmove(endp + l, endp,
 					(size_t)((leader + lead_len) - endp));
@@ -3418,7 +3418,7 @@
 
 	/* Convert from active codepage to UTF-8.  Other conversions are
 	 * not done, because they would fail for non-ASCII characters. */
-	acp_to_enc(var, STRLEN(var), &pp, &len);
+	acp_to_enc(var, (int)STRLEN(var), &pp, &len);
 	if (pp != NULL)
 	{
 	    homedir = pp;
@@ -3497,7 +3497,7 @@
     int		startstr_len = 0;
 
     if (startstr != NULL)
-	startstr_len = STRLEN(startstr);
+	startstr_len = (int)STRLEN(startstr);
 
     src = skipwhite(srcp);
     --dstlen;		    /* leave one char space for "\," */
@@ -3705,7 +3705,7 @@
 	    {
 		STRCPY(dst, var);
 		dstlen -= (int)STRLEN(var);
-		c = STRLEN(var);
+		c = (int)STRLEN(var);
 		/* if var[] ends in a path separator and tail[] starts
 		 * with it, skip a character */
 		if (*var != NUL && after_pathsep(dst, dst + c)
@@ -3780,7 +3780,7 @@
 
 	    /* Convert from active codepage to UTF-8.  Other conversions are
 	     * not done, because they would fail for non-ASCII characters. */
-	    acp_to_enc(p, STRLEN(p), &pp, &len);
+	    acp_to_enc(p, (int)STRLEN(p), &pp, &len);
 	    if (pp != NULL)
 	    {
 		p = pp;
@@ -3825,7 +3825,7 @@
 		/* Convert from active codepage to UTF-8.  Other conversions
 		 * are not done, because they would fail for non-ASCII
 		 * characters. */
-		acp_to_enc(p, STRLEN(p), &pp, &len);
+		acp_to_enc(p, (int)STRLEN(p), &pp, &len);
 		if (pp != NULL)
 		{
 		    if (mustfree)
@@ -5144,11 +5144,11 @@
 
     line = ml_get_curline();
     p = skipwhite(line);
-    len = skiptowhite(p) - p;
+    len = (int)(skiptowhite(p) - p);
     if (len == 6 && STRNCMP(p, "static", 6) == 0)
     {
 	p = skipwhite(p + 6);
-	len = skiptowhite(p) - p;
+        len = (int)(skiptowhite(p) - p);
     }
     if (len == 6 && STRNCMP(p, "struct", 6) == 0)
 	p = skipwhite(p + 6);
@@ -5489,7 +5489,7 @@
 	    {
 		/* Found ");" at end of the line, now check there is "while"
 		 * before the matching '('.  XXX */
-		i = p - line;
+		i = (int)(p - line);
 		curwin->w_cursor.col = i;
 		trypos = find_match_paren(ind_maxparen, ind_maxcomment);
 		if (trypos != NULL)
@@ -6468,7 +6468,7 @@
 		 * our matching '('. */
 		curwin->w_cursor.lnum = our_paren_pos.lnum;
 		line = ml_get_curline();
-		look_col = look - line;
+		look_col = (int)(look - line);
 		curwin->w_cursor.col = look_col + 1;
 		if ((trypos = findmatchlimit(NULL, ')', 0, ind_maxparen))
 								      != NULL
diff --git a/src/misc2.c b/src/misc2.c
index 004974a..f8a583b 100644
--- a/src/misc2.c
+++ b/src/misc2.c
@@ -2447,7 +2447,7 @@
     int		modifiers;
     int		bit;
     int		key;
-    long_u	n;
+    unsigned long n;
 
     src = *srcp;
     if (src[0] != '<')
diff --git a/src/netbeans.c b/src/netbeans.c
index ded4901..8928342 100644
--- a/src/netbeans.c
+++ b/src/netbeans.c
@@ -86,7 +86,13 @@
 static int  nb_do_cmd __ARGS((int, char_u *, int, int, char_u *));
 static void nb_send __ARGS((char *buf, char *fun));
 
-static int sd = -1;			/* socket fd for Netbeans connection */
+#ifdef WIN64
+typedef __int64 NBSOCK;
+#else
+typedef int NBSOCK;
+#endif
+
+static NBSOCK sd = -1;			/* socket fd for Netbeans connection */
 #ifdef FEAT_GUI_MOTIF
 static XtInputId inputHandler;		/* Cookie for input */
 #endif
@@ -315,7 +321,7 @@
 #ifdef INET_SOCKETS
     port = atoi(address);
 
-    if ((sd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
+    if ((sd = (NBSOCK)socket(AF_INET, SOCK_STREAM, 0)) == (NBSOCK)-1)
     {
 	PERROR("socket() in netbeans_connect()");
 	goto theend;
@@ -357,7 +363,7 @@
 	{
 	    sock_close(sd);
 #ifdef INET_SOCKETS
-	    if ((sd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
+	    if ((sd = (NBSOCK)socket(AF_INET, SOCK_STREAM, 0)) == (NBSOCK)-1)
 	    {
 		PERROR("socket()#2 in netbeans_connect()");
 		goto theend;
@@ -630,7 +636,7 @@
 	     * prepend the text to that buffer and delete this one.  */
 	    if (node->next == &head)
 		return;
-	    p = alloc(STRLEN(node->buffer) + STRLEN(node->next->buffer) + 1);
+	    p = alloc((unsigned)(STRLEN(node->buffer) + STRLEN(node->next->buffer) + 1));
 	    if (p == NULL)
 		return;	    /* out of memory */
 	    STRCPY(p, node->buffer);
@@ -1010,7 +1016,7 @@
 	nbdebug(("EVT: %s", buf));
 /*	nb_send(buf, "netbeans_end");    avoid "write failed" messages */
 	if (sd >= 0)
-	    sock_write(sd, buf, STRLEN(buf));  /* ignore errors */
+	    sock_write(sd, buf, (int)STRLEN(buf));  /* ignore errors */
     }
 }
 
@@ -1030,7 +1036,7 @@
 	    EMSG2("E630: %s(): write while not connected", fun);
 	did_error = TRUE;
     }
-    else if (sock_write(sd, buf, STRLEN(buf)) != (int)STRLEN(buf))
+    else if (sock_write(sd, buf, (int)STRLEN(buf)) != (int)STRLEN(buf))
     {
 	if (!did_error)
 	    EMSG2("E631: %s(): write failed", fun);
@@ -1073,7 +1079,7 @@
 
     nbdebug(("REP %d: %s\n", cmdno, (char *)result));
 
-    reply = alloc(STRLEN(result) + 32);
+    reply = alloc((unsigned)STRLEN(result) + 32);
     sprintf((char *)reply, "%d %s\n", cmdno, (char *)result);
     nb_send((char *)reply, "nb_reply_text");
 
@@ -1105,7 +1111,7 @@
     static char_u *
 nb_quote(char_u *txt)
 {
-    char_u *buf = alloc(2 * STRLEN(txt) + 1);
+    char_u *buf = alloc((unsigned)(2 * STRLEN(txt) + 1));
     char_u *p = txt;
     char_u *q = buf;
 
@@ -1149,7 +1155,7 @@
     int done = 0;
 
     /* result is never longer than input */
-    result = (char *)alloc_clear(STRLEN(p) + 1);
+    result = (char *)alloc_clear((unsigned)STRLEN(p) + 1);
     if (result == NULL)
 	return NULL;
 
@@ -1547,7 +1553,7 @@
 
 			/* Insert halfway a line.  For simplicity we assume we
 			 * need to append to the line. */
-			newline = alloc_check(STRLEN(oldline) + len + 1);
+			newline = alloc_check((unsigned)(STRLEN(oldline) + len + 1));
 			if (newline != NULL)
 			{
 			    STRCPY(newline, oldline);
@@ -1559,7 +1565,7 @@
 		    {
 			/* Append a new line.  Not that we always do this,
 			 * also when the text doesn't end in a "\n". */
-			ml_append((linenr_T)(lnum - 1), args, len + 1, FALSE);
+			ml_append((linenr_T)(lnum - 1), args, (colnr_T)(len + 1), FALSE);
 			++added;
 		    }
 
@@ -3292,7 +3298,7 @@
 	    eol_size = 1;
 	for (lnum = 1; lnum <= bufp->b_ml.ml_line_count; ++lnum)
 	{
-	    char_count += STRLEN(ml_get(lnum)) + eol_size;
+	    char_count += (long)STRLEN(ml_get(lnum)) + eol_size;
 	    /* Check for a CTRL-C every 100000 characters */
 	    if (char_count > last_check)
 	    {
@@ -3393,7 +3399,7 @@
     nbbuf_T	*buf;
 {
     int	    lnum = buf->bufp->b_ml.ml_line_count;
-    long    nchars = buf->bufp->b_orig_size;
+    long    nchars = (long)buf->bufp->b_orig_size;
     char_u  c;
 
     msg_add_fname(buf->bufp, buf->bufp->b_ffname);
diff --git a/src/normal.c b/src/normal.c
index bc6955d..189b21c 100644
--- a/src/normal.c
+++ b/src/normal.c
@@ -3389,7 +3389,7 @@
 	    else
 # endif
 		this_class = mb_get_class(ptr + col);
-	    while (col > 0)
+	    while (col > 0 && this_class != 0)
 	    {
 		prevcol = col - 1 - (*mb_head_off)(ptr, ptr + col - 1);
 		prev_class = mb_get_class(ptr + prevcol);
@@ -6986,7 +6986,7 @@
 		    if (did_change)
 		    {
 			ptr = ml_get(pos.lnum);
-			count = STRLEN(ptr) - pos.col;
+			count = (int)STRLEN(ptr) - pos.col;
 			netbeans_removed(curbuf, pos.lnum, pos.col,
 								 (long)count);
 			netbeans_inserted(curbuf, pos.lnum, pos.col,
diff --git a/src/ops.c b/src/ops.c
index a13cee7..5122b87 100644
--- a/src/ops.c
+++ b/src/ops.c
@@ -2023,7 +2023,7 @@
 #ifdef FEAT_MBYTE
 	    if (has_mbyte)
 	    {
-		n = STRLEN(newp);
+		n = (int)STRLEN(newp);
 		while (--num_chars >= 0)
 		    n += (*mb_char2bytes)(c, newp + n);
 	    }
@@ -2225,7 +2225,7 @@
 		while (pos.lnum < oap->end.lnum)
 		{
 		    ptr = ml_get_buf(curbuf, pos.lnum, FALSE);
-		    count = STRLEN(ptr) - pos.col;
+		    count = (int)STRLEN(ptr) - pos.col;
 		    netbeans_removed(curbuf, pos.lnum, pos.col, (long)count);
 		    netbeans_inserted(curbuf, pos.lnum, pos.col,
 						 &ptr[pos.col], count);
@@ -2886,7 +2886,7 @@
 		    else
 		    {
 			if (endcol == MAXCOL)
-			    endcol = STRLEN(p);
+			    endcol = (colnr_T)STRLEN(p);
 			bd.textlen = endcol - startcol + oap->inclusive;
 		    }
 		    bd.textstart = p + startcol;
@@ -4910,7 +4910,7 @@
     char_u	buf2[NUMBUFLEN];
     int		hex;		/* 'X' or 'x': hex; '0': octal */
     static int	hexupper = FALSE;	/* 0xABC */
-    long_u	n;
+    unsigned long n;
     long_u	oldn;
     char_u	*ptr;
     int		c;
@@ -5317,7 +5317,7 @@
 	    /* Skip register if there is more text than the maximum size. */
 	    len = 0;
 	    for (j = 0; j < num_lines; j++)
-		len += STRLEN(y_regs[i].y_array[j]) + 1L;
+		len += (long)STRLEN(y_regs[i].y_array[j]) + 1L;
 	    if (len > (long)max_kbyte * 1024L)
 		continue;
 	}
diff --git a/src/option.c b/src/option.c
index 70f686a..cb456bf 100644
--- a/src/option.c
+++ b/src/option.c
@@ -2909,7 +2909,7 @@
 {
     char_u	*p;
     int		opt_idx;
-    long	n;
+    long_u	n;
 
 #ifdef FEAT_LANGMAP
     langmap_init();
@@ -2970,7 +2970,7 @@
 	    if (p != NULL && *p != NUL)
 	    {
 		/* First time count the NUL, otherwise count the ','. */
-		len = STRLEN(p) + 3;
+		len = (int)STRLEN(p) + 3;
 		if (ga_grow(&ga, len) == OK)
 		{
 		    if (ga.ga_len > 0)
@@ -4631,7 +4631,7 @@
 	if (errmsg != NULL)
 	{
 	    vim_strncpy(IObuff, (char_u *)_(errmsg), IOSIZE - 1);
-	    i = STRLEN(IObuff) + 2;
+	    i = (int)STRLEN(IObuff) + 2;
 	    if (i + (arg - startarg) < IOSIZE)
 	    {
 		/* append the argument with the error */
@@ -5336,7 +5336,7 @@
     char_u	*s, *p;
     int		did_chartab = FALSE;
     char_u	**gvarp;
-    int		free_oldval = (options[opt_idx].flags & P_ALLOCED);
+    long_u	free_oldval = (options[opt_idx].flags & P_ALLOCED);
 
     /* Get the global option to compare with, otherwise we would have to check
      * two values for all local options. */
@@ -6191,7 +6191,7 @@
 
 	if (varp == &(curbuf->b_p_spf))
 	{
-	    l = STRLEN(curbuf->b_p_spf);
+	    l = (int)STRLEN(curbuf->b_p_spf);
 	    if (l > 0 && (l < 4 || STRCMP(curbuf->b_p_spf + l - 4,
 								".add") != 0))
 		errmsg = e_invarg;
@@ -8122,7 +8122,7 @@
 {
     int		opt_idx;
     char_u	*varp;
-    int		flags;
+    long_u	flags;
 
     opt_idx = findoption(name);
     if (opt_idx == -1)
diff --git a/src/os_mswin.c b/src/os_mswin.c
index d196c86..642dc43 100644
--- a/src/os_mswin.c
+++ b/src/os_mswin.c
@@ -1094,7 +1094,7 @@
 
     if (lenp == NULL)
     {
-	len_loc = STRLEN(str) + 1;
+	len_loc = (int)STRLEN(str) + 1;
 	lenp = &len_loc;
     }
 
@@ -1153,7 +1153,7 @@
 
     if (lenp == NULL)
     {
-	len_loc = wcslen(str) + 1;
+	len_loc = (int)wcslen(str) + 1;
 	lenp = &len_loc;
     }
 
@@ -1267,7 +1267,7 @@
 	    {
 		n = STRLEN(p_enc) + 1;
 		str = rawp + n;
-		str_size = metadata.rawlen - n;
+		str_size = (int)(metadata.rawlen - n);
 	    }
 	    else
 	    {
@@ -1292,7 +1292,7 @@
 
 	    /* Use the length of our metadata if possible, but limit it to the
 	     * GlobalSize() for safety. */
-	    maxlen = GlobalSize(hMemW) / sizeof(WCHAR);
+	    maxlen = (int)(GlobalSize(hMemW) / sizeof(WCHAR));
 	    if (metadata.ucslen >= 0)
 	    {
 		if (metadata.ucslen > maxlen)
@@ -1321,7 +1321,7 @@
 
 	    /* The length is either what our metadata says or the strlen().
 	     * But limit it to the GlobalSize() for safety. */
-	    maxlen = GlobalSize(hMem);
+	    maxlen = (int)GlobalSize(hMem);
 	    if (metadata.txtlen >= 0)
 	    {
 		if (metadata.txtlen > maxlen)
@@ -1444,7 +1444,7 @@
     {
 	LPSTR lpszMemRaw;
 
-	metadata.rawlen = txtlen + STRLEN(p_enc) + 1;
+	metadata.rawlen = (int)(txtlen + STRLEN(p_enc) + 1);
 	hMemRaw = (LPSTR)GlobalAlloc(GMEM_MOVEABLE | GMEM_DDESHARE,
 							 metadata.rawlen + 1);
 	lpszMemRaw = (LPSTR)GlobalLock(hMemRaw);
@@ -2370,7 +2370,7 @@
      * CoCreateInstance(), it's quite slow. */
     if (fname == NULL)
 	return rfname;
-    len = STRLEN(fname);
+    len = (int)STRLEN(fname);
     if (len <= 4 || STRNICMP(fname + len - 4, ".lnk", 4) != 0)
 	return rfname;
 
@@ -2484,7 +2484,7 @@
 
     data.dwData = COPYDATA_ENCODING;
 #ifdef FEAT_MBYTE
-    data.cbData = STRLEN(p_enc) + 1;
+    data.cbData = (DWORD)STRLEN(p_enc) + 1;
     data.lpData = p_enc;
 #else
     data.cbData = STRLEN("latin1") + 1;
@@ -2600,10 +2600,10 @@
 	    else
 		reply.dwData = COPYDATA_RESULT;
 	    reply.lpData = res;
-	    reply.cbData = STRLEN(res) + 1;
+	    reply.cbData = (DWORD)STRLEN(res) + 1;
 
 	    serverSendEnc(sender);
-	    retval = SendMessage(sender, WM_COPYDATA, (WPARAM)message_window,
+	    retval = (int)SendMessage(sender, WM_COPYDATA, (WPARAM)message_window,
 							    (LPARAM)(&reply));
 	    vim_free(res);
 	    return retval;
@@ -2772,7 +2772,7 @@
     char_u	*p;
 
     /* Leave enough space for a 9-digit suffix to ensure uniqueness! */
-    ok_name = alloc(STRLEN(name) + 10);
+    ok_name = alloc((unsigned)STRLEN(name) + 10);
 
     STRCPY(ok_name, name);
     p = ok_name + STRLEN(name);
@@ -2849,7 +2849,7 @@
 	return -1;
 
     data.dwData = COPYDATA_REPLY;
-    data.cbData = STRLEN(reply) + 1;
+    data.cbData = (DWORD)STRLEN(reply) + 1;
     data.lpData = reply;
 
     serverSendEnc(target);
@@ -2885,7 +2885,7 @@
 	*(HWND *)ptarget = target;
 
     data.dwData = asExpr ? COPYDATA_EXPR : COPYDATA_KEYS;
-    data.cbData = STRLEN(cmd) + 1;
+    data.cbData = (DWORD)STRLEN(cmd) + 1;
     data.lpData = cmd;
 
     serverSendEnc(target);
diff --git a/src/os_win32.c b/src/os_win32.c
index 3973592..630df5a 100644
--- a/src/os_win32.c
+++ b/src/os_win32.c
@@ -2652,7 +2652,7 @@
 mch_can_exe(char_u *name)
 {
     char_u	buf[_MAX_PATH];
-    int		len = STRLEN(name);
+    int		len = (int)STRLEN(name);
     char_u	*p;
 
     if (len >= _MAX_PATH)	/* safety check */
@@ -3914,7 +3914,7 @@
     {
 	/* optimization: use one single write_chars for runs of text,
 	 * rather than once per character  It ain't curses, but it helps. */
-	DWORD  prefix = strcspn(s, "\n\r\b\a\033");
+	DWORD  prefix = (DWORD)strcspn(s, "\n\r\b\a\033");
 
 	if (p_wd)
 	{
@@ -4065,7 +4065,7 @@
 		    delete_lines(arg1);
 		}
 
-		len -= p - s;
+		len -= (int)(p - s);
 		s = p + 1;
 		break;
 
@@ -4716,8 +4716,8 @@
 	for (done = 0; done < len; done += written)
 	{
 	    /* (size_t) cast for Borland C 5.5 */
-	    todo = (size_t)(len - done) > sizeof(buf) ? sizeof(buf)
-						       : (size_t)(len - done);
+	    todo = (DWORD)((size_t)(len - done) > sizeof(buf) ? sizeof(buf)
+						       : (size_t)(len - done));
 	    if (!BackupRead(sh, (LPBYTE)buf, todo, &readcnt,
 						       FALSE, FALSE, context)
 		    || readcnt != todo
@@ -4765,7 +4765,7 @@
 		/* Get the header to find the length of the stream name.  If
 		 * the "readcount" is zero we have done all info streams. */
 		ZeroMemory(&sid, sizeof(WIN32_STREAM_ID));
-		headersize = (char *)&sid.cStreamName - (char *)&sid.dwStreamId;
+		headersize = (int)((char *)&sid.cStreamName - (char *)&sid.dwStreamId);
 		if (!BackupRead(sh, (LPBYTE)&sid, headersize,
 					   &readcount, FALSE, FALSE, &context)
 			|| readcount == 0)
@@ -4986,7 +4986,7 @@
 
 		/* Convert each Unicode argument to the current codepage. */
 		WideCharToMultiByte_alloc(GetACP(), 0,
-				ArglistW[i], wcslen(ArglistW[i]) + 1,
+				ArglistW[i], (int)wcslen(ArglistW[i]) + 1,
 				(LPSTR *)&argv[i], &len, 0, 0);
 		if (argv[i] == NULL)
 		{
diff --git a/src/po/zh_TW.UTF-8.po b/src/po/zh_TW.UTF-8.po
index 199bb76..b4260b4 100644
--- a/src/po/zh_TW.UTF-8.po
+++ b/src/po/zh_TW.UTF-8.po
@@ -5,8 +5,15 @@
 #
 # FIRST AUTHOR  Francis S.Lin <piaip@csie.ntu.edu.tw>, 2000
 # FIRST RELEASE Thu Jun 14 14:24:17 CST 2001
+# MAINTAINER: Debian VIM Maintainers <pkg-vim-maintainers@lists.alioth.debian.org>
 #
-# Last update: 2005/01/27 07:03 (6.3)
+# Last update: $LastChangedDate: 2006-04-16 22:06:40 -0400 (dom, 16 apr 2006) $
+#
+# XXX This file is in need of a new maintainer, Debian VIM Maintainers maintain
+#     it only because patches have been submitted for it by Debian users and the
+#     former maintainer was MIA (Missing In Action), taking over its
+#     maintenance was thus the only way to include those patches.
+#     If you care about this file, and have time to maintain it please do so!
 #
 # To update, search pattern:		/fuzzy\|^msgstr ""\(\n"\)\@!
 #
@@ -3288,11 +3295,11 @@
 
 #, c-format
 msgid "%ld more lines"
-msgstr "還有 %ld 行 "
+msgstr "多了 %ld 行 "
 
 #, c-format
 msgid "%ld fewer lines"
-msgstr "只剩 %ld 行 "
+msgstr "少了 %ld 行 "
 
 msgid " (Interrupted)"
 msgstr " (已中斷)"
diff --git a/src/popupmnu.c b/src/popupmnu.c
index a332477..fc5ffff 100644
--- a/src/popupmnu.c
+++ b/src/popupmnu.c
@@ -279,7 +279,7 @@
 		    if (*p == NUL || *p == TAB || totwidth + w > pum_width)
 		    {
 			/* Display the text that fits or comes before a Tab. */
-			screen_puts_len(s, p - s, row, col, attr);
+			screen_puts_len(s, (int)(p - s), row, col, attr);
 			col += width;
 
 			if (*p != TAB)
@@ -462,7 +462,7 @@
 			else
 			{
 			    *e = NUL;
-			    ml_append(lnum++, p, e - p + 1, FALSE);
+			    ml_append(lnum++, p, (int)(e - p + 1), FALSE);
 			    *e = '\n';
 			    p = e + 1;
 			}
diff --git a/src/proto/os_mswin.pro b/src/proto/os_mswin.pro
index aaef05b..f46a3f8 100644
--- a/src/proto/os_mswin.pro
+++ b/src/proto/os_mswin.pro
@@ -46,8 +46,8 @@
 extern void mch_print_start_line __ARGS((int margin, int page_line));
 extern int mch_print_text_out __ARGS((char_u *p, int len));
 extern void mch_print_set_font __ARGS((int iBold, int iItalic, int iUnderline));
-extern void mch_print_set_bg __ARGS((unsigned long bgcol));
-extern void mch_print_set_fg __ARGS((unsigned long fgcol));
+extern void mch_print_set_bg __ARGS((long_u bgcol));
+extern void mch_print_set_fg __ARGS((long_u fgcol));
 extern char_u *mch_resolve_shortcut __ARGS((char_u *fname));
 extern void win32_set_foreground __ARGS((void));
 extern void serverInitMessaging __ARGS((void));
diff --git a/src/quickfix.c b/src/quickfix.c
index f22c860..21b524c 100644
--- a/src/quickfix.c
+++ b/src/quickfix.c
@@ -511,9 +511,9 @@
 
 		    p = vim_strchr(p_str, '\n');
 		    if (p)
-			len = p - p_str + 1;
+			len = (int)(p - p_str + 1);
 		    else
-			len = STRLEN(p_str);
+			len = (int)STRLEN(p_str);
 
 		    if (len > CMDBUFFSIZE - 2)
 			vim_strncpy(IObuff, p_str, CMDBUFFSIZE - 2);
@@ -531,7 +531,7 @@
 		    if (!p_li)			/* End of the list */
 			break;
 
-		    len = STRLEN(p_li->li_tv.vval.v_string);
+		    len = (int)STRLEN(p_li->li_tv.vval.v_string);
 		    if (len > CMDBUFFSIZE - 2)
 			len = CMDBUFFSIZE - 2;
 
@@ -3684,7 +3684,7 @@
 			{
 			    if (vim_regexec(&regmatch, IObuff, (colnr_T)0))
 			    {
-				int	l = STRLEN(IObuff);
+				int	l = (int)STRLEN(IObuff);
 
 				/* remove trailing CR, LF, spaces, etc. */
 				while (l > 0 && IObuff[l - 1] <= ' ')
diff --git a/src/screen.c b/src/screen.c
index 8d2a69e..c293de1 100644
--- a/src/screen.c
+++ b/src/screen.c
@@ -2896,7 +2896,7 @@
     {
 	/* For checking first word with a capital skip white space. */
 	if (cap_col == 0)
-	    cap_col = skipwhite(line) - line;
+	    cap_col = (int)(skipwhite(line) - line);
 
 	/* To be able to spell-check over line boundaries copy the end of the
 	 * current line into nextline[].  Above the start of the next line was
@@ -2909,7 +2909,7 @@
 	}
 	else
 	{
-	    v = STRLEN(line);
+	    v = (long)STRLEN(line);
 	    if (v < SPWORDLEN)
 	    {
 		/* Short line, use it completely and append the start of the
@@ -3008,14 +3008,14 @@
 
 	    pos = wp->w_cursor;
 	    wp->w_cursor.lnum = lnum;
-	    wp->w_cursor.col = ptr - line;
+	    wp->w_cursor.col = (colnr_T)(ptr - line);
 	    len = spell_move_to(wp, FORWARD, TRUE, TRUE, &spell_hlf);
 	    if (len == 0 || (int)wp->w_cursor.col > ptr - line)
 	    {
 		/* no bad word found at line start, don't check until end of a
 		 * word */
 		spell_hlf = HLF_COUNT;
-		word_end = spell_to_word_end(ptr, wp->w_buffer) - line + 1;
+		word_end = (int)(spell_to_word_end(ptr, wp->w_buffer) - line + 1);
 	    }
 	    else
 	    {
@@ -3223,7 +3223,7 @@
 			    if (p_extra != NULL)
 			    {
 				c_extra = NUL;
-				n_extra = STRLEN(p_extra);
+				n_extra = (int)STRLEN(p_extra);
 			    }
 			    char_attr = sign_get_attr(text_sign, FALSE);
 			}
@@ -3867,7 +3867,7 @@
 			    p = nextline + (prev_ptr - line) - nextlinecol;
 			else
 			    p = prev_ptr;
-			cap_col -= (prev_ptr - line);
+			cap_col -= (int)(prev_ptr - line);
 			len = spell_check(wp, p, &spell_hlf, &cap_col,
 								    nochange);
 			word_end = v + len;
@@ -3891,7 +3891,7 @@
 			    /* Remember that the good word continues at the
 			     * start of the next line. */
 			    checked_lnum = lnum + 1;
-			    checked_col = (p - nextline) + len - nextline_idx;
+			    checked_col = (int)((p - nextline) + len - nextline_idx);
 			}
 
 			/* Turn index into actual attributes. */
@@ -3906,12 +3906,12 @@
 				/* Remember that the word in the next line
 				 * must start with a capital. */
 				capcol_lnum = lnum + 1;
-				cap_col = (p - nextline) + cap_col
-							       - nextline_idx;
+				cap_col = (int)((p - nextline) + cap_col
+							       - nextline_idx);
 			    }
 			    else
 				/* Compute the actual column. */
-				cap_col += (prev_ptr - line);
+				cap_col += (int)(prev_ptr - line);
 			}
 		    }
 		}
@@ -5871,7 +5871,7 @@
 				buf, sizeof(buf),
 				p, use_sandbox,
 				fillchar, maxwidth, hltab, tabtab);
-    len = STRLEN(buf);
+    len = (int)STRLEN(buf);
 
     while (width < maxwidth && len < sizeof(buf) - 1)
     {
@@ -8904,7 +8904,7 @@
 		if (wincount > 1)
 		{
 		    vim_snprintf((char *)NameBuff, MAXPATHL, "%d", wincount);
-		    len = STRLEN(NameBuff);
+		    len = (int)STRLEN(NameBuff);
 		    if (col + len >= Columns - 3)
 			break;
 		    screen_puts_len(NameBuff, len, 0, col,
@@ -8946,7 +8946,7 @@
 		if (len > Columns - col - 1)
 		    len = Columns - col - 1;
 
-		screen_puts_len(p, STRLEN(p), 0, col, attr);
+		screen_puts_len(p, (int)STRLEN(p), 0, col, attr);
 		col += len;
 	    }
 	    screen_putchar(' ', 0, col++, attr);
diff --git a/src/search.c b/src/search.c
index addb9cd..0e535ab 100644
--- a/src/search.c
+++ b/src/search.c
@@ -909,7 +909,7 @@
     if (pos->lnum > buf->b_ml.ml_line_count)
     {
 	pos->lnum = buf->b_ml.ml_line_count;
-	pos->col = STRLEN(ml_get_buf(buf, pos->lnum, FALSE));
+	pos->col = (int)STRLEN(ml_get_buf(buf, pos->lnum, FALSE));
 	if (pos->col > 0)
 	    --pos->col;
     }
@@ -1075,7 +1075,7 @@
 	    if (strcopy != ps)
 	    {
 		/* made a copy of "pat" to change "\?" to "?" */
-		searchcmdlen += STRLEN(pat) - STRLEN(strcopy);
+		searchcmdlen += (int)(STRLEN(pat) - STRLEN(strcopy));
 		pat = strcopy;
 		searchstr = strcopy;
 	    }
@@ -3660,7 +3660,7 @@
     }
 
     pos.lnum = curwin->w_cursor.lnum;
-    pos.col = p - line;
+    pos.col = (colnr_T)(p - line);
 
     mb_ptr_adv(p);
     if (end_tag)
@@ -3780,7 +3780,7 @@
     p = ml_get_cursor();
     for (cp = p; *cp != NUL && *cp != '>' && !vim_iswhite(*cp); mb_ptr_adv(cp))
 	;
-    len = cp - p;
+    len = (int)(cp - p);
     if (len == 0)
     {
 	curwin->w_cursor = old_pos;
@@ -4527,7 +4527,7 @@
 	    if (inc_opt != NULL && strstr((char *)inc_opt, "\\zs") != NULL)
 		/* Use text from '\zs' to '\ze' (or end) of 'include'. */
 		new_fname = find_file_name_in_path(incl_regmatch.startp[0],
-			      incl_regmatch.endp[0] - incl_regmatch.startp[0],
+			      (int)(incl_regmatch.endp[0] - incl_regmatch.startp[0]),
 				 FNAME_EXP|FNAME_INCL|FNAME_REL, 1L, p_fname);
 	    else
 		/* Use text after match with 'include'. */
@@ -4613,7 +4613,7 @@
 			{
 			    /* Nothing found, use the rest of the line. */
 			    p = incl_regmatch.endp[0];
-			    i = STRLEN(p);
+			    i = (int)STRLEN(p);
 			}
 			else
 			{
@@ -5270,7 +5270,7 @@
 {
     if (spats[idx].pat != NULL)
     {
-	fprintf(fp, "\n# Last %sSearch Pattern:\n~", s);
+	fprintf(fp, _("\n# Last %sSearch Pattern:\n~"), s);
 	/* off.dir is not stored, it's reset to forward */
 	fprintf(fp, "%c%c%c%c%ld%s%c",
 		spats[idx].magic    ? 'M' : 'm',	/* magic */
diff --git a/src/spell.c b/src/spell.c
index 803f32d..3ae44d4 100644
--- a/src/spell.c
+++ b/src/spell.c
@@ -587,7 +587,7 @@
 } wordcount_T;
 
 static wordcount_T dumwc;
-#define WC_KEY_OFF  (dumwc.wc_word - (char_u *)&dumwc)
+#define WC_KEY_OFF  (unsigned)(dumwc.wc_word - (char_u *)&dumwc)
 #define HI2WC(hi)     ((wordcount_T *)((hi)->hi_key - WC_KEY_OFF))
 #define MAXWORDCOUNT 0xffff
 
@@ -1048,7 +1048,7 @@
 	    mi.mi_end = skiphex(ptr + 2);
 	else
 	    mi.mi_end = skipdigits(ptr);
-	nrlen = mi.mi_end - ptr;
+	nrlen = (int)(mi.mi_end - ptr);
     }
 
     /* Find the normal end of the word (until the next non-word character). */
@@ -1086,7 +1086,7 @@
 
     (void)spell_casefold(ptr, (int)(mi.mi_fend - ptr), mi.mi_fword,
 							     MAXWLEN + 1);
-    mi.mi_fwordlen = STRLEN(mi.mi_fword);
+    mi.mi_fwordlen = (int)STRLEN(mi.mi_fword);
 
     /* The word is bad unless we recognize it. */
     mi.mi_result = SP_BAD;
@@ -1187,7 +1187,7 @@
 		    mb_ptr_adv(fp);
 		    if (p >= mi.mi_end)
 			break;
-		    mi.mi_compoff = fp - mi.mi_fword;
+		    mi.mi_compoff = (int)(fp - mi.mi_fword);
 		    find_word(&mi, FIND_COMPOUND);
 		    if (mi.mi_result != SP_BAD)
 		    {
@@ -1416,7 +1416,7 @@
 	    {
 		for (s = ptr; s < ptr + wlen; mb_ptr_adv(s))
 		    mb_ptr_adv(p);
-		wlen = p - mip->mi_word;
+		wlen = (int)(p - mip->mi_word);
 	    }
 	}
 #endif
@@ -1617,7 +1617,7 @@
 		    {
 			for (s = ptr; s < ptr + wlen; mb_ptr_adv(s))
 			    mb_ptr_adv(p);
-			mip->mi_compoff = p - mip->mi_fword;
+			mip->mi_compoff = (int)(p - mip->mi_fword);
 		    }
 		}
 #endif
@@ -1980,7 +1980,7 @@
     (void)spell_casefold(p, (int)(mip->mi_fend - p),
 			     mip->mi_fword + mip->mi_fwordlen,
 			     MAXWLEN - mip->mi_fwordlen);
-    flen = STRLEN(mip->mi_fword + mip->mi_fwordlen);
+    flen = (int)STRLEN(mip->mi_fword + mip->mi_fwordlen);
     mip->mi_fwordlen += flen;
     return flen;
 }
@@ -2074,7 +2074,7 @@
     {
 	line = ml_get_buf(wp->w_buffer, lnum, FALSE);
 
-	len = STRLEN(line);
+	len = (int)STRLEN(line);
 	if (buflen < len + MAXWLEN + 2)
 	{
 	    vim_free(buf);
@@ -2090,7 +2090,19 @@
 
 	/* For checking first word with a capital skip white space. */
 	if (capcol == 0)
-	    capcol = skipwhite(line) - line;
+	    capcol = (int)(skipwhite(line) - line);
+	else if (curline && wp == curwin)
+	{
+	    int	    col = (int)(skipwhite(line) - line);
+
+	    /* For spellbadword(): check if first word needs a capital. */
+	    if (check_need_cap(lnum, col))
+		capcol = col;
+
+	    /* Need to get the line again, may have looked at the previous
+	     * one. */
+	    line = ml_get_buf(wp->w_buffer, lnum, FALSE);
+	}
 
 	/* Copy the line into "buf" and append the start of the next line if
 	 * possible. */
@@ -2134,7 +2146,7 @@
 # ifdef FEAT_SYN_HL
 			if (has_syntax)
 			{
-			    col = p - buf;
+			    col = (int)(p - buf);
 			    (void)syn_get_id(wp, lnum, (colnr_T)col,
 						       FALSE, &can_spell);
 			}
@@ -2145,7 +2157,7 @@
 			if (can_spell)
 			{
 			    found_pos.lnum = lnum;
-			    found_pos.col = p - buf;
+			    found_pos.col = (int)(p - buf);
 #ifdef FEAT_VIRTUALEDIT
 			    found_pos.coladd = 0;
 #endif
@@ -2231,11 +2243,11 @@
 	    /* Skip the characters at the start of the next line that were
 	     * included in a match crossing line boundaries. */
 	    if (attr == HLF_COUNT)
-		skip = p - endp;
+		skip = (int)(p - endp);
 	    else
 		skip = 0;
 
-	    /* Capscol skips over the inserted space. */
+	    /* Capcol skips over the inserted space. */
 	    --capcol;
 
 	    /* But after empty line check first word in next line */
@@ -2271,7 +2283,7 @@
     {
 	*buf = ' ';
 	vim_strncpy(buf + 1, line, maxlen - 2);
-	n = p - line;
+	n = (int)(p - line);
 	if (n >= maxlen)
 	    n = maxlen - 1;
 	vim_memset(buf + 1, ' ', n);
@@ -3161,7 +3173,7 @@
 		break;
 	    *p++ = c;
 	}
-	smp->sm_leadlen = p - smp->sm_lead;
+	smp->sm_leadlen = (int)(p - smp->sm_lead);
 	*p++ = NUL;
 
 	/* Put (abc) chars in sm_oneof, if any. */
@@ -3321,7 +3333,7 @@
     hi = hash_lookup(&lp->sl_wordcount, p, hash);
     if (HASHITEM_EMPTY(hi))
     {
-	wc = (wordcount_T *)alloc(sizeof(wordcount_T) + STRLEN(p));
+	wc = (wordcount_T *)alloc((unsigned)(sizeof(wordcount_T) + STRLEN(p)));
 	if (wc == NULL)
 	    return;
 	STRCPY(wc->wc_word, p);
@@ -3632,9 +3644,9 @@
 	s = p;
 	p = vim_strchr(p, '/');
 	if (p == NULL)
-	    l = STRLEN(s);
+	    l = (int)STRLEN(s);
 	else
-	    l = p - s;
+	    l = (int)(p - s);
 	if (l >= SY_MAXLEN)
 	    return SP_FORMERROR;
 	if (ga_grow(&slang->sl_syl_items, 1) == FAIL)
@@ -4101,7 +4113,7 @@
 	copy_option_part(&splp, lang, MAXWLEN, ",");
 
 	region = NULL;
-	len = STRLEN(lang);
+	len = (int)STRLEN(lang);
 
 	/* If the name ends in ".spl" use it as the name of the spell file.
 	 * If there is a region name let "region" point to it and remove it
@@ -4390,7 +4402,7 @@
 	    else
 	    {
 		/* Append multi-byte chars to "b_spell_ismw_mb". */
-		n = STRLEN(buf->b_spell_ismw_mb);
+		n = (int)STRLEN(buf->b_spell_ismw_mb);
 		bp = vim_strnsave(buf->b_spell_ismw_mb, n + l);
 		if (bp != NULL)
 		{
@@ -5312,9 +5324,9 @@
 	    {
 		/* Concatenate this string to previously defined ones, using a
 		 * slash to separate them. */
-		l = STRLEN(items[1]) + 1;
+		l = (int)STRLEN(items[1]) + 1;
 		if (compflags != NULL)
-		    l += STRLEN(compflags) + 1;
+		    l += (int)STRLEN(compflags) + 1;
 		p = getroom(spin, l, FALSE);
 		if (p != NULL)
 		{
@@ -6100,9 +6112,9 @@
     /* Make room for the old and the new compflags, concatenated with a / in
      * between.  Processing it makes it shorter, but we don't know by how
      * much, thus allocate the maximum. */
-    len = STRLEN(compflags) + 1;
+    len = (int)STRLEN(compflags) + 1;
     if (spin->si_compflags != NULL)
-	len += STRLEN(spin->si_compflags) + 1;
+	len += (int)STRLEN(spin->si_compflags) + 1;
     p = getroom(spin, len, FALSE);
     if (p == NULL)
 	return;
@@ -6285,9 +6297,9 @@
     if (ga_grow(gap, 1) == OK)
     {
 	ftp = ((fromto_T *)gap->ga_data) + gap->ga_len;
-	(void)spell_casefold(from, STRLEN(from), word, MAXWLEN);
+	(void)spell_casefold(from, (int)STRLEN(from), word, MAXWLEN);
 	ftp->ft_from = getroom_save(spin, word);
-	(void)spell_casefold(to, STRLEN(to), word, MAXWLEN);
+	(void)spell_casefold(to, (int)STRLEN(to), word, MAXWLEN);
 	ftp->ft_to = getroom_save(spin, word);
 	++gap->ga_len;
     }
@@ -6338,7 +6350,7 @@
     /* All this trouble to free the "ae_prog" items... */
     for (ht = &aff->af_pref; ; ht = &aff->af_suff)
     {
-	todo = ht->ht_used;
+	todo = (int)ht->ht_used;
 	for (hi = ht->ht_array; todo > 0; ++hi)
 	{
 	    if (!HASHITEM_EMPTY(hi))
@@ -6428,7 +6440,7 @@
 
 	/* Remove CR, LF and white space from the end.  White space halfway
 	 * the word is kept to allow e.g., "et al.". */
-	l = STRLEN(line);
+	l = (int)STRLEN(line);
 	while (l > 0 && line[l - 1] <= ' ')
 	    --l;
 	if (l == 0)
@@ -6727,7 +6739,7 @@
     size_t	wordlen = STRLEN(word);
     int		use_condit;
 
-    todo = ht->ht_used;
+    todo = (int)ht->ht_used;
     for (hi = ht->ht_array; todo > 0 && retval == OK; ++hi)
     {
 	if (!HASHITEM_EMPTY(hi))
@@ -6802,7 +6814,7 @@
 			    {
 				/* Remove chop string. */
 				p = newword + STRLEN(newword);
-				i = MB_CHARLEN(ae->ae_chop);
+				i = (int)MB_CHARLEN(ae->ae_chop);
 				for ( ; i > 0; --i)
 				    mb_ptr_back(newword, p);
 				*p = NUL;
@@ -7006,7 +7018,7 @@
 	    continue;
 
 	/* Remove CR, LF and white space from the end. */
-	l = STRLEN(rline);
+	l = (int)STRLEN(rline);
 	while (l > 0 && rline[l - 1] <= ' ')
 	    --l;
 	if (l == 0)
@@ -7080,7 +7092,7 @@
 						       fname, lnum, line);
 		    else
 		    {
-			spin->si_region_count = STRLEN(line) / 2;
+			spin->si_region_count = (int)STRLEN(line) / 2;
 			STRCPY(spin->si_region_name, line);
 
 			/* Adjust the mask for a word valid in all regions. */
@@ -7200,7 +7212,7 @@
     }
 
     p = bl->sb_data + bl->sb_used;
-    bl->sb_used += len;
+    bl->sb_used += (int)len;
 
     return p;
 }
@@ -7267,7 +7279,7 @@
     char_u	*pfxlist;	/* list of prefix IDs or NULL */
     int		need_affix;	/* only store word with affix ID */
 {
-    int		len = STRLEN(word);
+    int		len = (int)STRLEN(word);
     int		ct = captype(word, word + len);
     char_u	foldword[MAXWLEN];
     int		res = OK;
@@ -7715,7 +7727,7 @@
 	    n = np->wn_flags + (np->wn_region << 8) + (np->wn_affixID << 16);
 	else
 	    /* byte node: use the byte value and the child pointer */
-	    n = np->wn_byte + ((long_u)np->wn_child << 8);
+	    n = (unsigned)(np->wn_byte + ((long_u)np->wn_child << 8));
 	nr = nr * 101 + n;
     }
 
@@ -7884,7 +7896,7 @@
 	putc(SN_INFO, fd);				/* <sectionID> */
 	putc(0, fd);					/* <sectionflags> */
 
-	i = STRLEN(spin->si_info);
+	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> */
     }
@@ -7956,7 +7968,7 @@
 	putc(SN_MIDWORD, fd);				/* <sectionID> */
 	putc(SNF_REQUIRED, fd);				/* <sectionflags> */
 
-	i = STRLEN(spin->si_midword);
+	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> */
     }
@@ -8014,8 +8026,8 @@
 	for (i = 0; i < gap->ga_len; ++i)
 	{
 	    ftp = &((fromto_T *)gap->ga_data)[i];
-	    l += 1 + STRLEN(ftp->ft_from);  /* count <*fromlen> and <*from> */
-	    l += 1 + STRLEN(ftp->ft_to);    /* count <*tolen> and <*to> */
+	    l += 1 + (int)STRLEN(ftp->ft_from);  /* count <*fromlen> and <*from> */
+	    l += 1 + (int)STRLEN(ftp->ft_to);    /* count <*tolen> and <*to> */
 	}
 	if (round == 2)
 	    ++l;	/* count <salflags> */
@@ -8042,7 +8054,7 @@
 	    for (rr = 1; rr <= 2; ++rr)
 	    {
 		p = rr == 1 ? ftp->ft_from : ftp->ft_to;
-		l = STRLEN(p);
+		l = (int)STRLEN(p);
 		putc(l, fd);
 		fwrite(p, l, (size_t)1, fd);
 	    }
@@ -8057,14 +8069,14 @@
 	putc(SN_SOFO, fd);				/* <sectionID> */
 	putc(0, fd);					/* <sectionflags> */
 
-	l = STRLEN(spin->si_sofofr);
+	l = (int)STRLEN(spin->si_sofofr);
 	put_bytes(fd, (long_u)(l + STRLEN(spin->si_sofoto) + 4), 4);
 							/* <sectionlen> */
 
 	put_bytes(fd, (long_u)l, 2);			/* <sofofromlen> */
 	fwrite(spin->si_sofofr, l, (size_t)1, fd);	/* <sofofrom> */
 
-	l = STRLEN(spin->si_sofoto);
+	l = (int)STRLEN(spin->si_sofoto);
 	put_bytes(fd, (long_u)l, 2);			/* <sofotolen> */
 	fwrite(spin->si_sofoto, l, (size_t)1, fd);	/* <sofoto> */
     }
@@ -8084,11 +8096,11 @@
 	    int		len = 0;
 	    hashitem_T	*hi;
 
-	    todo = spin->si_commonwords.ht_used;
+	    todo = (int)spin->si_commonwords.ht_used;
 	    for (hi = spin->si_commonwords.ht_array; todo > 0; ++hi)
 		if (!HASHITEM_EMPTY(hi))
 		{
-		    l = STRLEN(hi->hi_key) + 1;
+		    l = (int)STRLEN(hi->hi_key) + 1;
 		    len += l;
 		    if (round == 2)			/* <word> */
 			fwrite(hi->hi_key, (size_t)l, (size_t)1, fd);
@@ -8147,9 +8159,9 @@
 	putc(SN_COMPOUND, fd);				/* <sectionID> */
 	putc(0, fd);					/* <sectionflags> */
 
-	l = STRLEN(spin->si_compflags);
+	l = (int)STRLEN(spin->si_compflags);
 	for (i = 0; i < spin->si_comppat.ga_len; ++i)
-	    l += STRLEN(((char_u **)(spin->si_comppat.ga_data))[i]) + 1;
+	    l += (int)STRLEN(((char_u **)(spin->si_comppat.ga_data))[i]) + 1;
 	put_bytes(fd, (long_u)(l + 7), 4);		/* <sectionlen> */
 
 	putc(spin->si_compmax, fd);			/* <compmax> */
@@ -8162,7 +8174,7 @@
 	for (i = 0; i < spin->si_comppat.ga_len; ++i)
 	{
 	    p = ((char_u **)(spin->si_comppat.ga_data))[i];
-	    putc(STRLEN(p), fd);			/* <comppatlen> */
+	    putc((int)STRLEN(p), fd);			/* <comppatlen> */
 	    fwrite(p, (size_t)STRLEN(p), (size_t)1, fd);/* <comppattext> */
 	}
 							/* <compflags> */
@@ -8188,7 +8200,7 @@
 	putc(SN_SYLLABLE, fd);				/* <sectionID> */
 	putc(0, fd);					/* <sectionflags> */
 
-	l = STRLEN(spin->si_syllable);
+	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> */
     }
@@ -8499,7 +8511,7 @@
      * Make the file name by changing ".spl" to ".sug".
      */
     STRCPY(fname, wfname);
-    len = STRLEN(fname);
+    len = (int)STRLEN(fname);
     fname[len - 2] = 'u';
     fname[len - 1] = 'g';
     sug_write(spin, fname);
@@ -8874,7 +8886,7 @@
     {
 	/* <sugline>: <sugnr> ... NUL */
 	line = ml_get_buf(spin->si_spellbuf, lnum, FALSE);
-	len = STRLEN(line) + 1;
+	len = (int)STRLEN(line) + 1;
 	if (fwrite(line, (size_t)len, (size_t)1, fd) == 0)
 	{
 	    EMSG(_(e_write));
@@ -8981,7 +8993,7 @@
 
     if (fcount >= 1)
     {
-	len = STRLEN(fnames[0]);
+	len = (int)STRLEN(fnames[0]);
 	if (fcount == 1 && len > 4 && STRCMP(fnames[0] + len - 4, ".add") == 0)
 	{
 	    /* For ":mkspell path/en.latin1.add" output file is
@@ -9048,7 +9060,7 @@
 
 	    if (incount > 1)
 	    {
-		len = STRLEN(innames[i]);
+		len = (int)STRLEN(innames[i]);
 		if (STRLEN(gettail(innames[i])) < 5
 						|| innames[i][len - 3] != '_')
 		{
@@ -9215,7 +9227,7 @@
 ex_spell(eap)
     exarg_T *eap;
 {
-    spell_add_word(eap->arg, STRLEN(eap->arg), eap->cmdidx == CMD_spellwrong,
+    spell_add_word(eap->arg, (int)STRLEN(eap->arg), eap->cmdidx == CMD_spellwrong,
 				   eap->forceit ? 0 : (int)eap->line2,
 				   eap->cmdidx == CMD_spellundo);
 }
@@ -9419,16 +9431,16 @@
 		else
 		{
 		    /* Create the "spell" directory if it doesn't exist yet. */
-		    l = STRLEN(buf);
+		    l = (int)STRLEN(buf);
 		    vim_snprintf((char *)buf + l, MAXPATHL - l, "/spell");
 		    if (!filewritable(buf) != 2)
 			vim_mkdir(buf, 0755);
 
-		    l = STRLEN(buf);
+		    l = (int)STRLEN(buf);
 		    vim_snprintf((char *)buf + l, MAXPATHL - l,
 				 "/%.*s", (int)(lend - lstart), lstart);
 		}
-		l = STRLEN(buf);
+		l = (int)STRLEN(buf);
 		fname = LANGP_ENTRY(curbuf->b_langp, 0)->lp_slang->sl_fname;
 		vim_snprintf((char *)buf + l, MAXPATHL - l, ".%s.add",
 			fname != NULL
@@ -9812,7 +9824,7 @@
 	p = ((char_u **)gap->ga_data)[i];
 	if (p != NULL)
 	{
-	    len = STRLEN(p);
+	    len = (int)STRLEN(p);
 	    if (fd != NULL)
 	    {
 		fputc(len, fd);
@@ -10009,7 +10021,7 @@
 	    beep_flush();
 	    return;
 	}
-	curwin->w_cursor.col = p - line;
+	curwin->w_cursor.col = (colnr_T)(p - line);
     }
 
     /* Get the word and its length. */
@@ -10152,10 +10164,10 @@
 	}
 
 	/* Replace the word. */
-	p = alloc(STRLEN(line) - stp->st_orglen + stp->st_wordlen + 1);
+	p = alloc((unsigned)STRLEN(line) - stp->st_orglen + stp->st_wordlen + 1);
 	if (p != NULL)
 	{
-	    c = sug.su_badptr - line;
+	    c = (int)(sug.su_badptr - line);
 	    mch_memmove(p, line, c);
 	    STRCPY(p + c, stp->st_word);
 	    STRCAT(p, sug.su_badptr + stp->st_orglen);
@@ -10216,7 +10228,7 @@
 		/* Append a space in place of the line break. */
 		line_copy = concat_str(line, (char_u *)" ");
 		line = line_copy;
-		endcol = STRLEN(line);
+		endcol = (colnr_T)STRLEN(line);
 	    }
 	}
     }
@@ -10270,9 +10282,9 @@
 	EMSG(_("E752: No previous spell replacement"));
 	return;
     }
-    addlen = STRLEN(repl_to) - STRLEN(repl_from);
+    addlen = (int)(STRLEN(repl_to) - STRLEN(repl_from));
 
-    frompat = alloc(STRLEN(repl_from) + 7);
+    frompat = alloc((unsigned)STRLEN(repl_from) + 7);
     if (frompat == NULL)
 	return;
     sprintf((char *)frompat, "\\V\\<%s\\>", repl_from);
@@ -10293,7 +10305,7 @@
 	if (addlen <= 0 || STRNCMP(line + curwin->w_cursor.col,
 					       repl_to, STRLEN(repl_to)) != 0)
 	{
-	    p = alloc(STRLEN(line) + addlen + 1);
+	    p = alloc((unsigned)STRLEN(line) + addlen + 1);
 	    if (p == NULL)
 		break;
 	    mch_memmove(p, line, curwin->w_cursor.col);
@@ -10309,7 +10321,7 @@
 	    }
 	    ++sub_nsubs;
 	}
-	curwin->w_cursor.col += STRLEN(repl_to);
+	curwin->w_cursor.col += (colnr_T)STRLEN(repl_to);
     }
 
     p_ws = save_ws;
@@ -10352,7 +10364,7 @@
 	    /* The suggested word may replace only part of "word", add the not
 	     * replaced part. */
 	    wcopy = alloc(stp->st_wordlen
-				+ STRLEN(sug.su_badptr + stp->st_orglen) + 1);
+		      + (unsigned)STRLEN(sug.su_badptr + stp->st_orglen) + 1);
 	    if (wcopy == NULL)
 		break;
 	    STRCPY(wcopy, stp->st_word);
@@ -11060,9 +11072,9 @@
      * to find matches (esp. REP items).  Append some more text, changing
      * chars after the bad word may help. */
     STRCPY(fword, su->su_fbadword);
-    n = STRLEN(fword);
+    n = (int)STRLEN(fword);
     p = su->su_badptr + su->su_badlen;
-    (void)spell_casefold(p, STRLEN(p), fword + n, MAXWLEN - n);
+    (void)spell_casefold(p, (int)STRLEN(p), fword + n, MAXWLEN - n);
 
     for (lpi = 0; lpi < curbuf->b_langp.ga_len; ++lpi)
     {
@@ -11266,7 +11278,7 @@
 		    tword[sp->ts_twordlen] = NUL;
 		    make_case_word(tword + sp->ts_splitoff,
 					  preword + sp->ts_prewordlen, flags);
-		    sp->ts_prewordlen = STRLEN(preword);
+		    sp->ts_prewordlen = (char_u)STRLEN(preword);
 		    sp->ts_splitoff = sp->ts_twordlen;
 		}
 		break;
@@ -11674,7 +11686,7 @@
 			/* Append a space to preword when splitting. */
 			if (!try_compound && !fword_ends)
 			    STRCAT(preword, " ");
-			sp->ts_prewordlen = STRLEN(preword);
+			sp->ts_prewordlen = (char_u)STRLEN(preword);
 			sp->ts_splitoff = sp->ts_twordlen;
 			sp->ts_splitfidx = sp->ts_fidx;
 
@@ -12482,8 +12494,8 @@
 
 		    /* Change the "from" to the "to" string. */
 		    ++depth;
-		    fl = STRLEN(ftp->ft_from);
-		    tl = STRLEN(ftp->ft_to);
+		    fl = (int)STRLEN(ftp->ft_from);
+		    tl = (int)STRLEN(ftp->ft_to);
 		    if (fl != tl)
 		    {
 			mch_memmove(p + tl, p + fl, STRLEN(p + fl) + 1);
@@ -12511,8 +12523,8 @@
 	    else
 		gap = &lp->lp_replang->sl_rep;
 	    ftp = (fromto_T *)gap->ga_data + sp->ts_curi - 1;
-	    fl = STRLEN(ftp->ft_from);
-	    tl = STRLEN(ftp->ft_to);
+	    fl = (int)STRLEN(ftp->ft_from);
+	    tl = (int)STRLEN(ftp->ft_to);
 	    p = fword + sp->ts_fidx;
 	    if (fl != tl)
 	    {
@@ -13054,7 +13066,7 @@
 	if (slang->sl_sal.ga_len > 0 && slang->sl_sbyts != NULL)
 	{
 	    /* Free the info about handled words. */
-	    todo = slang->sl_sounddone.ht_used;
+	    todo = (int)slang->sl_sounddone.ht_used;
 	    for (hi = slang->sl_sounddone.ht_array; todo > 0; ++hi)
 		if (!HASHITEM_EMPTY(hi))
 		{
@@ -13106,7 +13118,7 @@
     hi = hash_lookup(&slang->sl_sounddone, goodword, hash);
     if (HASHITEM_EMPTY(hi))
     {
-	sft = (sftword_T *)alloc(sizeof(sftword_T) + STRLEN(goodword));
+	sft = (sftword_T *)alloc((unsigned)(sizeof(sftword_T) + STRLEN(goodword)));
 	if (sft != NULL)
 	{
 	    sft->sft_score = score;
@@ -13533,8 +13545,8 @@
     pbad = su->su_badptr + badlenarg;
     for (;;)
     {
-	goodlen = pgood - goodword;
-	badlen = pbad - su->su_badptr;
+	goodlen = (int)(pgood - goodword);
+	badlen = (int)(pbad - su->su_badptr);
 	if (goodlen <= 0 || badlen <= 0)
 	    break;
 	mb_ptr_back(goodword, pgood);
@@ -13867,7 +13879,7 @@
 	    word = inword;
 	else
 	{
-	    (void)spell_casefold(inword, STRLEN(inword), fword, MAXWLEN);
+	    (void)spell_casefold(inword, (int)STRLEN(inword), fword, MAXWLEN);
 	    word = fword;
 	}
 
@@ -14590,8 +14602,8 @@
 	}
     }
 
-    goodlen = STRLEN(goodsound);
-    badlen = STRLEN(badsound);
+    goodlen = (int)STRLEN(goodsound);
+    badlen = (int)STRLEN(badsound);
 
     /* Return quickly if the lenghts are too different to be fixed by two
      * changes. */
@@ -14813,8 +14825,8 @@
     else
 #endif
     {
-	badlen = STRLEN(badword) + 1;
-	goodlen = STRLEN(goodword) + 1;
+	badlen = (int)STRLEN(badword) + 1;
+	goodlen = (int)STRLEN(goodword) + 1;
     }
 
     /* We use "cnt" as an array: CNT(badword_idx, goodword_idx). */
@@ -15450,7 +15462,7 @@
 	/* When matching with a pattern and there are no prefixes only use
 	 * parts of the tree that match "pat". */
 	if (pat != NULL && slang->sl_pbyts == NULL)
-	    patlen = STRLEN(pat);
+	    patlen = (int)STRLEN(pat);
 	else
 	    patlen = 0;
 
@@ -15804,7 +15816,7 @@
     /* Go back to start of the word. */
     while (p > line)
     {
-	col = p - line;
+	col = (int)(p - line);
 	mb_ptr_back(line, p);
 	if (!spell_iswordp(p, curbuf))
 	    break;
diff --git a/src/syntax.c b/src/syntax.c
index d6ce69c..baded60 100644
--- a/src/syntax.c
+++ b/src/syntax.c
@@ -2986,7 +2986,7 @@
 	if (result->lnum > syn_buf->b_ml.ml_line_count)
 	    len = 0;
 	else
-	    len = STRLEN(ml_get_buf(syn_buf, result->lnum, FALSE));
+	    len = (int)STRLEN(ml_get_buf(syn_buf, result->lnum, FALSE));
 	if (col > len)
 	    result->col = len;
 	else
@@ -3950,7 +3950,7 @@
      * Unfortunately, this list of keywords is not sorted on alphabet but on
      * hash value...
      */
-    todo = ht->ht_used;
+    todo = (int)ht->ht_used;
     for (hi = ht->ht_array; todo > 0 && !got_int; ++hi)
     {
 	if (!HASHITEM_EMPTY(hi))
@@ -4038,7 +4038,7 @@
     int		todo;
 
     hash_lock(ht);
-    todo = ht->ht_used;
+    todo = (int)ht->ht_used;
     for (hi = ht->ht_array; todo > 0; ++hi)
     {
 	if (!HASHITEM_EMPTY(hi))
@@ -4087,7 +4087,7 @@
     keyentry_T	*kp;
     keyentry_T	*kp_next;
 
-    todo = ht->ht_used;
+    todo = (int)ht->ht_used;
     for (hi = ht->ht_array; todo > 0; ++hi)
     {
 	if (!HASHITEM_EMPTY(hi))
diff --git a/src/tag.c b/src/tag.c
index a9ac537..3f0a35b 100644
--- a/src/tag.c
+++ b/src/tag.c
@@ -796,7 +796,7 @@
 		    parse_match(matches[i], &tagp);
 
 		    /* Save the tag name */
-		    len = tagp.tagname_end - tagp.tagname;
+		    len = (int)(tagp.tagname_end - tagp.tagname);
 		    if (len > 128)
 			len = 128;
 		    vim_strncpy(tag_name, tagp.tagname, len);
@@ -872,7 +872,7 @@
 			STRCAT(cmd, "\\V");
 			len += 2;
 
-			cmd_len = cmd_end - cmd_start + 1;
+			cmd_len = (int)(cmd_end - cmd_start + 1);
 			if (cmd_len > (CMDBUFFSIZE - 5))
 			    cmd_len = CMDBUFFSIZE - 5;
 			STRNCAT(cmd, cmd_start, cmd_len);
@@ -1490,7 +1490,7 @@
 	    {
 		/* Prefer help tags according to 'helplang'.  Put the
 		 * two-letter language name in help_lang[]. */
-		i = STRLEN(tag_fname);
+		i = (int)STRLEN(tag_fname);
 		if (i > 3 && tag_fname[i - 3] == '-')
 		    STRCPY(help_lang, tag_fname + i - 2);
 		else
@@ -1507,7 +1507,7 @@
 		if ((flags & TAG_KEEP_LANG)
 			&& help_lang_find == NULL
 			&& curbuf->b_fname != NULL
-			&& (i = STRLEN(curbuf->b_fname)) > 4
+			&& (i = (int)STRLEN(curbuf->b_fname)) > 4
 			&& curbuf->b_fname[i - 1] == 'x'
 			&& curbuf->b_fname[i - 4] == '.'
 			&& STRNICMP(curbuf->b_fname + i - 3, help_lang, 2) == 0)
@@ -3766,7 +3766,7 @@
 	    while (end > start && (end[-1] == '\r' || end[-1] == '\n'))
 		--end;
 	}
-	len = end - start;
+	len = (int)(end - start);
 	if (len > sizeof(buf) - 1)
 	    len = sizeof(buf) - 1;
 	vim_strncpy(buf, start, len);
@@ -3840,7 +3840,7 @@
 			n = p;
 			while (*p != NUL && *p >= ' ' && *p < 127 && *p != ':')
 			    ++p;
-			len = p - n;
+			len = (int)(p - n);
 			if (*p == ':' && len > 0)
 			{
 			    s = ++p;
diff --git a/src/undo.c b/src/undo.c
index a2861d5..f9e735a 100644
--- a/src/undo.c
+++ b/src/undo.c
@@ -1393,7 +1393,7 @@
     }
     else
 #endif
-	vim_snprintf((char *)buf, buflen, "%ld seconds ago",
+	vim_snprintf((char *)buf, buflen, _("%ld seconds ago"),
 						     (long)(time(NULL) - tt));
 }
 
diff --git a/src/version.h b/src/version.h
index 7f6e96e..f631b8f 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.0e BETA"
-#define VIM_VERSION_LONG	"VIM - Vi IMproved 7.0e BETA (2006 Apr 16)"
-#define VIM_VERSION_LONG_DATE	"VIM - Vi IMproved 7.0e BETA (2006 Apr 16, compiled "
+#define VIM_VERSION_MEDIUM	"7.0e01 BETA"
+#define VIM_VERSION_LONG	"VIM - Vi IMproved 7.0e01 BETA (2006 Apr 17)"
+#define VIM_VERSION_LONG_DATE	"VIM - Vi IMproved 7.0e01 BETA (2006 Apr 17, compiled "
