diff --git a/src/message.c b/src/message.c
index a5fb7e5..2e637a7 100644
--- a/src/message.c
+++ b/src/message.c
@@ -19,28 +19,28 @@
 # include <math.h>
 #endif
 
-static int other_sourcing_name __ARGS((void));
-static char_u *get_emsg_source __ARGS((void));
-static char_u *get_emsg_lnum __ARGS((void));
-static void add_msg_hist __ARGS((char_u *s, int len, int attr));
-static void hit_return_msg __ARGS((void));
-static void msg_home_replace_attr __ARGS((char_u *fname, int attr));
+static int other_sourcing_name(void);
+static char_u *get_emsg_source(void);
+static char_u *get_emsg_lnum(void);
+static void add_msg_hist(char_u *s, int len, int attr);
+static void hit_return_msg(void);
+static void msg_home_replace_attr(char_u *fname, int attr);
 #ifdef FEAT_MBYTE
-static char_u *screen_puts_mbyte __ARGS((char_u *s, int l, int attr));
+static char_u *screen_puts_mbyte(char_u *s, int l, int attr);
 #endif
-static void msg_puts_attr_len __ARGS((char_u *str, int maxlen, int attr));
-static void msg_puts_display __ARGS((char_u *str, int maxlen, int attr, int recurse));
-static void msg_scroll_up __ARGS((void));
-static void inc_msg_scrolled __ARGS((void));
-static void store_sb_text __ARGS((char_u **sb_str, char_u *s, int attr, int *sb_col, int finish));
-static void t_puts __ARGS((int *t_col, char_u *t_s, char_u *s, int attr));
-static void msg_puts_printf __ARGS((char_u *str, int maxlen));
-static int do_more_prompt __ARGS((int typed_char));
-static void msg_screen_putchar __ARGS((int c, int attr));
-static int  msg_check_screen __ARGS((void));
-static void redir_write __ARGS((char_u *s, int maxlen));
+static void msg_puts_attr_len(char_u *str, int maxlen, int attr);
+static void msg_puts_display(char_u *str, int maxlen, int attr, int recurse);
+static void msg_scroll_up(void);
+static void inc_msg_scrolled(void);
+static void store_sb_text(char_u **sb_str, char_u *s, int attr, int *sb_col, int finish);
+static void t_puts(int *t_col, char_u *t_s, char_u *s, int attr);
+static void msg_puts_printf(char_u *str, int maxlen);
+static int do_more_prompt(int typed_char);
+static void msg_screen_putchar(int c, int attr);
+static int  msg_check_screen(void);
+static void redir_write(char_u *s, int maxlen);
 #ifdef FEAT_CON_DIALOG
-static char_u *msg_show_console_dialog __ARGS((char_u *message, char_u *buttons, int dfltbutton));
+static char_u *msg_show_console_dialog(char_u *message, char_u *buttons, int dfltbutton);
 static int	confirm_msg_used = FALSE;	/* displaying confirm_msg */
 static char_u	*confirm_msg = NULL;		/* ":confirm" message */
 static char_u	*confirm_msg_tail;		/* tail of confirm_msg */
@@ -343,65 +343,13 @@
  * shorter than IOSIZE!!!
  */
 #ifndef PROTO
-# ifndef HAVE_STDARG_H
-
-int
-#ifdef __BORLANDC__
-_RTLENTRYF
-#endif
-smsg __ARGS((char_u *, long, long, long,
-			long, long, long, long, long, long, long));
-int
-#ifdef __BORLANDC__
-_RTLENTRYF
-#endif
-smsg_attr __ARGS((int, char_u *, long, long, long,
-			long, long, long, long, long, long, long));
-
-int vim_snprintf __ARGS((char *, size_t, char *, long, long, long,
-				   long, long, long, long, long, long, long));
-
-/*
- * smsg(str, arg, ...) is like using sprintf(buf, str, arg, ...) and then
- * calling msg(buf).
- * The buffer used is IObuff, the message is truncated at IOSIZE.
- */
-
-/* VARARGS */
-    int
-#ifdef __BORLANDC__
-_RTLENTRYF
-#endif
-smsg(s, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10)
-    char_u	*s;
-    long	a1, a2, a3, a4, a5, a6, a7, a8, a9, a10;
-{
-    return smsg_attr(0, s, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10);
-}
-
-/* VARARGS */
-    int
-#ifdef __BORLANDC__
-_RTLENTRYF
-#endif
-smsg_attr(attr, s, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10)
-    int		attr;
-    char_u	*s;
-    long	a1, a2, a3, a4, a5, a6, a7, a8, a9, a10;
-{
-    vim_snprintf((char *)IObuff, IOSIZE, (char *)s,
-				     a1, a2, a3, a4, a5, a6, a7, a8, a9, a10);
-    return msg_attr(IObuff, attr);
-}
-
-# else /* HAVE_STDARG_H */
 
 int vim_snprintf(char *str, size_t str_m, char *fmt, ...);
 
     int
-#ifdef __BORLANDC__
+# ifdef __BORLANDC__
 _RTLENTRYF
-#endif
+# endif
 smsg(char_u *s, ...)
 {
     va_list arglist;
@@ -413,9 +361,9 @@
 }
 
     int
-#ifdef __BORLANDC__
+# ifdef __BORLANDC__
 _RTLENTRYF
-#endif
+# endif
 smsg_attr(int attr, char_u *s, ...)
 {
     va_list arglist;
@@ -426,7 +374,6 @@
     return msg_attr(IObuff, attr);
 }
 
-# endif /* HAVE_STDARG_H */
 #endif
 
 /*
@@ -2270,8 +2217,8 @@
 
 static msgchunk_T *last_msgchunk = NULL; /* last displayed text */
 
-static msgchunk_T *msg_sb_start __ARGS((msgchunk_T *mps));
-static msgchunk_T *disp_sb_line __ARGS((int row, msgchunk_T *smp));
+static msgchunk_T *msg_sb_start(msgchunk_T *mps);
+static msgchunk_T *disp_sb_line(int row, msgchunk_T *smp);
 
 static int do_clear_sb_text = FALSE;	/* clear text on next msg */
 
@@ -3483,7 +3430,7 @@
     return retval;
 }
 
-static int copy_char __ARGS((char_u *from, char_u *to, int lowercase));
+static int copy_char(char_u *from, char_u *to, int lowercase);
 
 /*
  * Copy one character from "*from" to "*to", taking care of multi-byte
@@ -3925,13 +3872,13 @@
 }
 #endif
 
-#if defined(HAVE_STDARG_H) && defined(FEAT_EVAL)
+#if defined(FEAT_EVAL)
 static char *e_printf = N_("E766: Insufficient arguments for printf()");
 
-static long tv_nr __ARGS((typval_T *tvs, int *idxp));
-static char *tv_str __ARGS((typval_T *tvs, int *idxp));
+static long tv_nr(typval_T *tvs, int *idxp);
+static char *tv_str(typval_T *tvs, int *idxp);
 # ifdef FEAT_FLOAT
-static double tv_float __ARGS((typval_T *tvs, int *idxp));
+static double tv_float(typval_T *tvs, int *idxp);
 # endif
 
 /*
@@ -4055,7 +4002,6 @@
  * understand this. */
 #ifndef PROTO
 
-# ifdef HAVE_STDARG_H
 /* Like vim_vsnprintf() but append to the string. */
     int
 vim_snprintf_add(char *str, size_t str_m, char *fmt, ...)
@@ -4074,28 +4020,7 @@
     va_end(ap);
     return str_l;
 }
-# else
-/* Like vim_vsnprintf() but append to the string. */
-    int
-vim_snprintf_add(str, str_m, fmt, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10)
-    char	*str;
-    size_t	str_m;
-    char	*fmt;
-    long	a1, a2, a3, a4, a5, a6, a7, a8, a9, a10;
-{
-    size_t	len = STRLEN(str);
-    size_t	space;
 
-    if (str_m <= len)
-	space = 0;
-    else
-	space = str_m - len;
-    return vim_vsnprintf(str + len, space, fmt,
-				     a1, a2, a3, a4, a5, a6, a7, a8, a9, a10);
-}
-# endif
-
-# ifdef HAVE_STDARG_H
     int
 vim_snprintf(char *str, size_t str_m, char *fmt, ...)
 {
@@ -4110,26 +4035,11 @@
 
     int
 vim_vsnprintf(str, str_m, fmt, ap, tvs)
-# else
-    /* clumsy way to work around missing va_list */
-#  define get_a_arg(i) (++i, i == 2 ? a1 : i == 3 ? a2 : i == 4 ? a3 : i == 5 ? a4 : i == 6 ? a5 : i == 7 ? a6 : i == 8 ? a7 : i == 9 ? a8 : i == 10 ? a9 : a10)
-
-/* VARARGS */
-    int
-#ifdef __BORLANDC__
-_RTLENTRYF
-#endif
-vim_snprintf(str, str_m, fmt, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10)
-# endif
     char	*str;
     size_t	str_m;
     char	*fmt;
-# ifdef HAVE_STDARG_H
     va_list	ap;
     typval_T	*tvs;
-# else
-    long	a1, a2, a3, a4, a5, a6, a7, a8, a9, a10;
-# endif
 {
     size_t	str_l = 0;
     char	*p = fmt;
@@ -4168,13 +4078,13 @@
 	    char    length_modifier = '\0';
 
 	    /* temporary buffer for simple numeric->string conversion */
-#ifdef FEAT_FLOAT
-# define TMP_LEN 350	/* On my system 1e308 is the biggest number possible.
+# ifdef FEAT_FLOAT
+#  define TMP_LEN 350	/* On my system 1e308 is the biggest number possible.
 			 * That sounds reasonable to use as the maximum
 			 * printable. */
-#else
-# define TMP_LEN 32
-#endif
+# else
+#  define TMP_LEN 32
+# endif
 	    char    tmp[TMP_LEN];
 
 	    /* string address in case of string argument */
@@ -4229,14 +4139,10 @@
 
 		p++;
 		j =
-#ifndef HAVE_STDARG_H
-		    get_a_arg(arg_idx);
-#else
 # if defined(FEAT_EVAL)
 		    tvs != NULL ? tv_nr(tvs, &arg_idx) :
 # endif
 			va_arg(ap, int);
-#endif
 		if (j >= 0)
 		    min_field_width = j;
 		else
@@ -4266,14 +4172,10 @@
 		    int j;
 
 		    j =
-#ifndef HAVE_STDARG_H
-			get_a_arg(arg_idx);
-#else
 # if defined(FEAT_EVAL)
 			tvs != NULL ? tv_nr(tvs, &arg_idx) :
 # endif
 			    va_arg(ap, int);
-#endif
 		    p++;
 		    if (j >= 0)
 			precision = j;
@@ -4342,14 +4244,10 @@
 			int j;
 
 			j =
-#ifndef HAVE_STDARG_H
-			    get_a_arg(arg_idx);
-#else
 # if defined(FEAT_EVAL)
 			    tvs != NULL ? tv_nr(tvs, &arg_idx) :
 # endif
 				va_arg(ap, int);
-#endif
 			/* standard demands unsigned char */
 			uchar_arg = (unsigned char)j;
 			str_arg = (char *)&uchar_arg;
@@ -4359,14 +4257,10 @@
 		case 's':
 		case 'S':
 		    str_arg =
-#ifndef HAVE_STDARG_H
-				(char *)get_a_arg(arg_idx);
-#else
 # if defined(FEAT_EVAL)
 				tvs != NULL ? tv_str(tvs, &arg_idx) :
 # endif
 				    va_arg(ap, char *);
-#endif
 		    if (str_arg == NULL)
 		    {
 			str_arg = "[NULL]";
@@ -4383,18 +4277,18 @@
 		    {
 			/* Don't put the #if inside memchr(), it can be a
 			 * macro. */
-#if VIM_SIZEOF_INT <= 2
+# if VIM_SIZEOF_INT <= 2
 			char *q = memchr(str_arg, '\0', precision);
-#else
+# else
 			/* memchr on HP does not like n > 2^31  !!! */
 			char *q = memchr(str_arg, '\0',
 				  precision <= (size_t)0x7fffffffL ? precision
 						       : (size_t)0x7fffffffL);
-#endif
+# endif
 			str_arg_l = (q == NULL) ? precision
 						      : (size_t)(q - str_arg);
 		    }
-#ifdef FEAT_MBYTE
+# ifdef FEAT_MBYTE
 		    if (fmt_spec == 'S')
 		    {
 			if (min_field_width != 0)
@@ -4411,7 +4305,7 @@
 			    str_arg_l = precision = p1 - (char_u *)str_arg;
 			}
 		    }
-#endif
+# endif
 		    break;
 
 		default:
@@ -4448,14 +4342,10 @@
 		    {
 			length_modifier = '\0';
 			ptr_arg =
-#ifndef HAVE_STDARG_H
-				 (void *)get_a_arg(arg_idx);
-#else
 # if defined(FEAT_EVAL)
 				 tvs != NULL ? (void *)tv_str(tvs, &arg_idx) :
 # endif
 					va_arg(ap, void *);
-#endif
 			if (ptr_arg != NULL)
 			    arg_sign = 1;
 		    }
@@ -4468,14 +4358,10 @@
 			case 'h':
 			    /* char and short arguments are passed as int. */
 			    int_arg =
-#ifndef HAVE_STDARG_H
-					get_a_arg(arg_idx);
-#else
 # if defined(FEAT_EVAL)
 					tvs != NULL ? tv_nr(tvs, &arg_idx) :
 # endif
 					    va_arg(ap, int);
-#endif
 			    if (int_arg > 0)
 				arg_sign =  1;
 			    else if (int_arg < 0)
@@ -4483,14 +4369,10 @@
 			    break;
 			case 'l':
 			    long_arg =
-#ifndef HAVE_STDARG_H
-					get_a_arg(arg_idx);
-#else
 # if defined(FEAT_EVAL)
 					tvs != NULL ? tv_nr(tvs, &arg_idx) :
 # endif
 					    va_arg(ap, long int);
-#endif
 			    if (long_arg > 0)
 				arg_sign =  1;
 			    else if (long_arg < 0)
@@ -4506,29 +4388,21 @@
 			    case '\0':
 			    case 'h':
 				uint_arg =
-#ifndef HAVE_STDARG_H
-					    get_a_arg(arg_idx);
-#else
 # if defined(FEAT_EVAL)
 					    tvs != NULL ? (unsigned)
 							tv_nr(tvs, &arg_idx) :
 # endif
 						va_arg(ap, unsigned int);
-#endif
 				if (uint_arg != 0)
 				    arg_sign = 1;
 				break;
 			    case 'l':
 				ulong_arg =
-#ifndef HAVE_STDARG_H
-					    get_a_arg(arg_idx);
-#else
 # if defined(FEAT_EVAL)
 					    tvs != NULL ? (unsigned long)
 							tv_nr(tvs, &arg_idx) :
 # endif
 						va_arg(ap, unsigned long int);
-#endif
 				if (ulong_arg != 0)
 				    arg_sign = 1;
 				break;
@@ -4675,7 +4549,7 @@
 		    break;
 		}
 
-#ifdef FEAT_FLOAT
+# ifdef FEAT_FLOAT
 	    case 'f':
 	    case 'e':
 	    case 'E':
@@ -4690,14 +4564,10 @@
 		    int		remove_trailing_zeroes = FALSE;
 
 		    f =
-# ifndef HAVE_STDARG_H
-			get_a_arg(arg_idx);
-# else
 #  if defined(FEAT_EVAL)
 			tvs != NULL ? tv_float(tvs, &arg_idx) :
 #  endif
 			    va_arg(ap, double);
-# endif
 		    abs_f = f < 0 ? -f : f;
 
 		    if (fmt_spec == 'g' || fmt_spec == 'G')
@@ -4713,11 +4583,11 @@
 		    }
 
 		    if (fmt_spec == 'f' &&
-#ifdef VAX
+#  ifdef VAX
 			    abs_f > 1.0e38
-#else
+#  else
 			    abs_f > 1.0e307
-#endif
+#  endif
 			    )
 		    {
 			/* Avoid a buffer overflow */
@@ -4810,7 +4680,7 @@
 		    str_arg = tmp;
 		    break;
 		}
-#endif
+# endif
 
 	    default:
 		/* unrecognized conversion specifier, keep format string
@@ -4949,10 +4819,8 @@
 	str[str_l <= str_m - 1 ? str_l : str_m - 1] = '\0';
     }
 
-#ifdef HAVE_STDARG_H
     if (tvs != NULL && tvs[arg_idx - 1].v_type != VAR_UNKNOWN)
 	EMSG(_("E767: Too many arguments to printf()"));
-#endif
 
     /* Return the number of characters formatted (excluding trailing nul
      * character), that is, the number of characters that would have been
