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;
