diff --git a/src/arabic.c b/src/arabic.c
index d6679d6..1c30598 100644
--- a/src/arabic.c
+++ b/src/arabic.c
@@ -43,8 +43,7 @@
  * Returns True if c is an ISO-8859-6 shaped ARABIC letter (user entered)
  */
     static int
-A_is_a(cur_c)
-    int cur_c;
+A_is_a(int cur_c)
 {
     switch (cur_c)
     {
@@ -96,8 +95,7 @@
  * Returns True if c is an Isolated Form-B ARABIC letter
  */
     static int
-A_is_s(cur_c)
-    int cur_c;
+A_is_s(int cur_c)
 {
     switch (cur_c)
     {
@@ -148,8 +146,7 @@
  * Returns True if c is a Final shape of an ARABIC letter
  */
     static int
-A_is_f(cur_c)
-    int cur_c;
+A_is_f(int cur_c)
 {
     switch (cur_c)
     {
@@ -202,8 +199,7 @@
  * Change shape - from ISO-8859-6/Isolated to Form-B Isolated
  */
     static int
-chg_c_a2s(cur_c)
-    int cur_c;
+chg_c_a2s(int cur_c)
 {
     int tempc;
 
@@ -332,8 +328,7 @@
  * Change shape - from ISO-8859-6/Isolated to Initial
  */
     static int
-chg_c_a2i(cur_c)
-    int cur_c;
+chg_c_a2i(int cur_c)
 {
     int tempc;
 
@@ -462,8 +457,7 @@
  * Change shape - from ISO-8859-6/Isolated to Medial
  */
     static int
-chg_c_a2m(cur_c)
-    int cur_c;
+chg_c_a2m(int cur_c)
 {
     int tempc;
 
@@ -592,8 +586,7 @@
  * Change shape - from ISO-8859-6/Isolated to final
  */
     static int
-chg_c_a2f(cur_c)
-    int cur_c;
+chg_c_a2f(int cur_c)
 {
     int tempc;
 
@@ -732,8 +725,7 @@
  * Change shape - from Initial to Medial
  */
     static int
-chg_c_i2m(cur_c)
-    int cur_c;
+chg_c_i2m(int cur_c)
 {
     int tempc;
 
@@ -820,8 +812,7 @@
  * Change shape - from Final to Medial
  */
     static int
-chg_c_f2m(cur_c)
-    int cur_c;
+chg_c_f2m(int cur_c)
 {
     int tempc;
 
@@ -930,8 +921,7 @@
  * Change shape - from Combination (2 char) to an Isolated
  */
     static int
-chg_c_laa2i(hid_c)
-    int hid_c;
+chg_c_laa2i(int hid_c)
 {
     int tempc;
 
@@ -961,8 +951,7 @@
  * Change shape - from Combination-Isolated to Final
  */
     static int
-chg_c_laa2f(hid_c)
-    int hid_c;
+chg_c_laa2f(int hid_c)
 {
     int tempc;
 
@@ -991,8 +980,7 @@
  * Do "half-shaping" on character "c".  Return zero if no shaping.
  */
     static int
-half_shape(c)
-    int		c;
+half_shape(int c)
 {
     if (A_is_a(c))
 	return chg_c_a2i(c);
@@ -1011,13 +999,13 @@
  * in:     "next_c"  is the next character (not shaped).
  */
     int
-arabic_shape(c, ccp, c1p, prev_c, prev_c1, next_c)
-    int		c;
-    int		*ccp;
-    int		*c1p;
-    int		prev_c;
-    int		prev_c1;
-    int		next_c;
+arabic_shape(
+    int		c,
+    int		*ccp,
+    int		*c1p,
+    int		prev_c,
+    int		prev_c1,
+    int		next_c)
 {
     int		curr_c;
     int		shape_c;
@@ -1082,9 +1070,9 @@
  * A_firstc_laa returns first character of LAA combination if it exists
  */
     static int
-A_firstc_laa(c, c1)
-    int c;	/* base character */
-    int c1;	/* first composing character */
+A_firstc_laa(
+    int c,	/* base character */
+    int c1)	/* first composing character */
 {
     if (c1 != NUL && c == a_LAM && !A_is_harakat(c1))
 	return c1;
@@ -1097,8 +1085,7 @@
  *		(harakat/tanween)
  */
     static int
-A_is_harakat(c)
-    int c;
+A_is_harakat(int c)
 {
     return (c >= a_FATHATAN && c <= a_SUKUN);
 }
@@ -1109,8 +1096,7 @@
  *		(alphabet/number/punctuation)
  */
     static int
-A_is_iso(c)
-    int c;
+A_is_iso(int c)
 {
     return ((c >= a_HAMZA && c <= a_GHAIN)
 	    || (c >= a_TATWEEL && c <= a_HAMZA_BELOW)
@@ -1123,8 +1109,7 @@
  *		(alphabet/number/punctuation)
  */
     static int
-A_is_formb(c)
-    int c;
+A_is_formb(int c)
 {
     return ((c >= a_s_FATHATAN && c <= a_s_DAMMATAN)
 	    || c == a_s_KASRATAN
@@ -1137,8 +1122,7 @@
  * A_is_ok returns TRUE if 'c' is an Arabic 10646 (8859-6 or Form-B)
  */
     static int
-A_is_ok(c)
-    int c;
+A_is_ok(int c)
 {
     return (A_is_iso(c) || A_is_formb(c));
 }
@@ -1149,8 +1133,7 @@
  *		with some exceptions/exclusions
  */
     static int
-A_is_valid(c)
-    int c;
+A_is_valid(int c)
 {
     return (A_is_ok(c) && !A_is_special(c));
 }
@@ -1161,8 +1144,7 @@
  *		Specials don't adhere to most of the rules.
  */
     static int
-A_is_special(c)
-    int c;
+A_is_special(int c)
 {
     return (c == a_HAMZA || c == a_s_HAMZA);
 }
diff --git a/src/blowfish.c b/src/blowfish.c
index 2191baf..d24aa2c 100644
--- a/src/blowfish.c
+++ b/src/blowfish.c
@@ -348,10 +348,10 @@
     bfs->sbx[3][xr & 0xFF];
 
     static void
-bf_e_block(bfs, p_xl, p_xr)
-    bf_state_T *bfs;
-    UINT32_T *p_xl;
-    UINT32_T *p_xr;
+bf_e_block(
+    bf_state_T *bfs,
+    UINT32_T *p_xl,
+    UINT32_T *p_xr)
 {
     UINT32_T temp;
     UINT32_T xl = *p_xl;
@@ -384,9 +384,9 @@
 #endif
 
     static void
-bf_e_cblock(bfs, block)
-    bf_state_T *bfs;
-    char_u *block;
+bf_e_cblock(
+    bf_state_T *bfs,
+    char_u *block)
 {
     block8	bk;
 
@@ -404,11 +404,11 @@
  * "salt[salt_len]" as the salt.
  */
     static void
-bf_key_init(bfs, password, salt, salt_len)
-    bf_state_T	*bfs;
-    char_u	*password;
-    char_u	*salt;
-    int		salt_len;
+bf_key_init(
+    bf_state_T	*bfs,
+    char_u	*password,
+    char_u	*salt,
+    int		salt_len)
 {
     int      i, j, keypos = 0;
     unsigned u;
@@ -470,10 +470,10 @@
  * Blowfish self-test for corrupted tables or instructions.
  */
     static int
-bf_check_tables(pax, sbx, val)
-    UINT32_T pax[18];
-    UINT32_T sbx[4][256];
-    UINT32_T val;
+bf_check_tables(
+    UINT32_T pax[18],
+    UINT32_T sbx[4][256],
+    UINT32_T val)
 {
     int i, j;
     UINT32_T c = 0;
@@ -514,7 +514,7 @@
  * Return FAIL when there is something wrong with blowfish encryption.
  */
     static int
-bf_self_test()
+bf_self_test(void)
 {
     int    i, bn;
     int    err = 0;
@@ -566,10 +566,10 @@
  * Initialize with seed "seed[seed_len]".
  */
     static void
-bf_cfb_init(bfs, seed, seed_len)
-    bf_state_T	*bfs;
-    char_u	*seed;
-    int		seed_len;
+bf_cfb_init(
+    bf_state_T	*bfs,
+    char_u	*seed,
+    int		seed_len)
 {
     int i, mi;
 
@@ -602,11 +602,11 @@
  * "from" and "to" can be equal to encrypt in place.
  */
     void
-crypt_blowfish_encode(state, from, len, to)
-    cryptstate_T *state;
-    char_u	*from;
-    size_t	len;
-    char_u	*to;
+crypt_blowfish_encode(
+    cryptstate_T *state,
+    char_u	*from,
+    size_t	len,
+    char_u	*to)
 {
     bf_state_T *bfs = state->method_state;
     size_t	i;
@@ -625,11 +625,11 @@
  * Decrypt "from[len]" into "to[len]".
  */
     void
-crypt_blowfish_decode(state, from, len, to)
-    cryptstate_T *state;
-    char_u	*from;
-    size_t	len;
-    char_u	*to;
+crypt_blowfish_decode(
+    cryptstate_T *state,
+    char_u	*from,
+    size_t	len,
+    char_u	*to)
 {
     bf_state_T *bfs = state->method_state;
     size_t	i;
@@ -644,13 +644,13 @@
 }
 
     void
-crypt_blowfish_init(state, key, salt, salt_len, seed, seed_len)
-    cryptstate_T	*state;
-    char_u*		key;
-    char_u*		salt;
-    int			salt_len;
-    char_u*		seed;
-    int			seed_len;
+crypt_blowfish_init(
+    cryptstate_T	*state,
+    char_u*		key,
+    char_u*		salt,
+    int			salt_len,
+    char_u*		seed,
+    int			seed_len)
 {
     bf_state_T	*bfs = (bf_state_T *)alloc_clear(sizeof(bf_state_T));
 
@@ -672,7 +672,7 @@
  * Give an error and return FAIL when not.
  */
     int
-blowfish_self_test()
+blowfish_self_test(void)
 {
     if (sha256_self_test() == FAIL)
     {
diff --git a/src/buffer.c b/src/buffer.c
index 92513cc..9f61eef 100644
--- a/src/buffer.c
+++ b/src/buffer.c
@@ -73,10 +73,10 @@
  * Return FAIL for failure, OK otherwise.
  */
     int
-open_buffer(read_stdin, eap, flags)
-    int		read_stdin;	    /* read file from stdin */
-    exarg_T	*eap;		    /* for forced 'ff' and 'fenc' or NULL */
-    int		flags;		    /* extra flags for readfile() */
+open_buffer(
+    int		read_stdin,	    /* read file from stdin */
+    exarg_T	*eap,		    /* for forced 'ff' and 'fenc' or NULL */
+    int		flags)		    /* extra flags for readfile() */
 {
     int		retval = OK;
 #ifdef FEAT_AUTOCMD
@@ -307,8 +307,7 @@
  * Return TRUE if "buf" points to a valid buffer (in the buffer list).
  */
     int
-buf_valid(buf)
-    buf_T	*buf;
+buf_valid(buf_T *buf)
 {
     buf_T	*bp;
 
@@ -336,11 +335,11 @@
  * supposed to close the window but autocommands close all other windows.
  */
     void
-close_buffer(win, buf, action, abort_if_last)
-    win_T	*win;		/* if not NULL, set b_last_cursor */
-    buf_T	*buf;
-    int		action;
-    int		abort_if_last UNUSED;
+close_buffer(
+    win_T	*win,		/* if not NULL, set b_last_cursor */
+    buf_T	*buf,
+    int		action,
+    int		abort_if_last UNUSED)
 {
 #ifdef FEAT_AUTOCMD
     int		is_curbuf;
@@ -538,8 +537,7 @@
  * Make buffer not contain a file.
  */
     void
-buf_clear_file(buf)
-    buf_T	*buf;
+buf_clear_file(buf_T *buf)
 {
     buf->b_ml.ml_line_count = 1;
     unchanged(buf, TRUE);
@@ -567,9 +565,7 @@
  * BFA_KEEP_UNDO  do not free undo information
  */
     void
-buf_freeall(buf, flags)
-    buf_T	*buf;
-    int		flags;
+buf_freeall(buf_T *buf, int flags)
 {
 #ifdef FEAT_AUTOCMD
     int		is_curbuf = (buf == curbuf);
@@ -653,8 +649,7 @@
  * itself (not the file, that must have been done already).
  */
     static void
-free_buffer(buf)
-    buf_T	*buf;
+free_buffer(buf_T *buf)
 {
     free_buffer_stuff(buf, TRUE);
 #ifdef FEAT_EVAL
@@ -696,9 +691,9 @@
  * Free stuff in the buffer for ":bdel" and when wiping out the buffer.
  */
     static void
-free_buffer_stuff(buf, free_options)
-    buf_T	*buf;
-    int		free_options;		/* free options as well */
+free_buffer_stuff(
+    buf_T	*buf,
+    int		free_options)		/* free options as well */
 {
     if (free_options)
     {
@@ -735,8 +730,7 @@
  * Free the b_wininfo list for buffer "buf".
  */
     static void
-clear_wininfo(buf)
-    buf_T	*buf;
+clear_wininfo(buf_T *buf)
 {
     wininfo_T	*wip;
 
@@ -760,11 +754,11 @@
  * Go to another buffer.  Handles the result of the ATTENTION dialog.
  */
     void
-goto_buffer(eap, start, dir, count)
-    exarg_T	*eap;
-    int		start;
-    int		dir;
-    int		count;
+goto_buffer(
+    exarg_T	*eap,
+    int		start,
+    int		dir,
+    int		count)
 {
 # if defined(FEAT_WINDOWS) && defined(HAS_SWAP_EXISTS_ACTION)
     buf_T	*old_curbuf = curbuf;
@@ -807,8 +801,7 @@
  * It is allowed for "old_curbuf" to be NULL or invalid.
  */
     void
-handle_swap_exists(old_curbuf)
-    buf_T	*old_curbuf;
+handle_swap_exists(buf_T *old_curbuf)
 {
 # if defined(FEAT_AUTOCMD) && defined(FEAT_EVAL)
     cleanup_T	cs;
@@ -889,13 +882,13 @@
  * Returns error message or NULL
  */
     char_u *
-do_bufdel(command, arg, addr_count, start_bnr, end_bnr, forceit)
-    int		command;
-    char_u	*arg;		/* pointer to extra arguments */
-    int		addr_count;
-    int		start_bnr;	/* first buffer number in a range */
-    int		end_bnr;	/* buffer nr or last buffer nr in a range */
-    int		forceit;
+do_bufdel(
+    int		command,
+    char_u	*arg,		/* pointer to extra arguments */
+    int		addr_count,
+    int		start_bnr,	/* first buffer number in a range */
+    int		end_bnr,	/* buffer nr or last buffer nr in a range */
+    int		forceit)
 {
     int		do_current = 0;	/* delete current buffer? */
     int		deleted = 0;	/* number of buffers deleted */
@@ -1013,10 +1006,10 @@
  * Used when it is wiped out and it's the last buffer.
  */
     static int
-empty_curbuf(close_others, forceit, action)
-    int close_others;
-    int forceit;
-    int action;
+empty_curbuf(
+    int close_others,
+    int forceit,
+    int action)
 {
     int	    retval;
     buf_T   *buf = curbuf;
@@ -1067,12 +1060,12 @@
  * Return FAIL or OK.
  */
     int
-do_buffer(action, start, dir, count, forceit)
-    int		action;
-    int		start;
-    int		dir;		/* FORWARD or BACKWARD */
-    int		count;		/* buffer number or number of buffers */
-    int		forceit;	/* TRUE for :...! */
+do_buffer(
+    int		action,
+    int		start,
+    int		dir,		/* FORWARD or BACKWARD */
+    int		count,		/* buffer number or number of buffers */
+    int		forceit)	/* TRUE for :...! */
 {
     buf_T	*buf;
     buf_T	*bp;
@@ -1428,9 +1421,7 @@
  * DOBUF_WIPE	    wipe it out
  */
     void
-set_curbuf(buf, action)
-    buf_T	*buf;
-    int		action;
+set_curbuf(buf_T *buf, int action)
 {
     buf_T	*prevbuf;
     int		unload = (action == DOBUF_UNLOAD || action == DOBUF_DEL
@@ -1517,8 +1508,7 @@
  * be pointing to freed memory.
  */
     void
-enter_buffer(buf)
-    buf_T	*buf;
+enter_buffer(buf_T *buf)
 {
     /* Copy buffer and window local option values.  Not for a help buffer. */
     buf_copy_options(buf, BCO_ENTER | BCO_NOHELP);
@@ -1629,7 +1619,7 @@
  * Change to the directory of the current buffer.
  */
     void
-do_autochdir()
+do_autochdir(void)
 {
     if (curbuf->b_ffname != NULL && vim_chdirfile(curbuf->b_ffname) == OK)
 	shorten_fnames(TRUE);
@@ -1652,11 +1642,11 @@
 static int  top_file_num = 1;		/* highest file number */
 
     buf_T *
-buflist_new(ffname, sfname, lnum, flags)
-    char_u	*ffname;	/* full path of fname or relative */
-    char_u	*sfname;	/* short fname or NULL */
-    linenr_T	lnum;		/* preferred cursor line */
-    int		flags;		/* BLN_ defines */
+buflist_new(
+    char_u	*ffname,	/* full path of fname or relative */
+    char_u	*sfname,	/* short fname or NULL */
+    linenr_T	lnum,		/* preferred cursor line */
+    int		flags)		/* BLN_ defines */
 {
     buf_T	*buf;
 #ifdef UNIX
@@ -1899,9 +1889,9 @@
  * 'fileencoding'.
  */
     void
-free_buf_options(buf, free_p_ff)
-    buf_T	*buf;
-    int		free_p_ff;
+free_buf_options(
+    buf_T	*buf,
+    int		free_p_ff)
 {
     if (free_p_ff)
     {
@@ -2019,11 +2009,11 @@
  * return FAIL for failure, OK for success
  */
     int
-buflist_getfile(n, lnum, options, forceit)
-    int		n;
-    linenr_T	lnum;
-    int		options;
-    int		forceit;
+buflist_getfile(
+    int		n,
+    linenr_T	lnum,
+    int		options,
+    int		forceit)
 {
     buf_T	*buf;
 #ifdef FEAT_WINDOWS
@@ -2120,7 +2110,7 @@
  * go to the last know line number for the current buffer
  */
     void
-buflist_getfpos()
+buflist_getfpos(void)
 {
     pos_T	*fpos;
 
@@ -2148,8 +2138,7 @@
  * Returns NULL if not found.
  */
     buf_T *
-buflist_findname_exp(fname)
-    char_u *fname;
+buflist_findname_exp(char_u *fname)
 {
     char_u	*ffname;
     buf_T	*buf = NULL;
@@ -2178,8 +2167,7 @@
  * Returns NULL if not found.
  */
     buf_T *
-buflist_findname(ffname)
-    char_u	*ffname;
+buflist_findname(char_u *ffname)
 {
 #ifdef UNIX
     struct stat st;
@@ -2195,9 +2183,9 @@
  * Returns NULL if not found.
  */
     static buf_T *
-buflist_findname_stat(ffname, stp)
-    char_u	*ffname;
-    struct stat	*stp;
+buflist_findname_stat(
+    char_u	*ffname,
+    struct stat	*stp)
 {
 #endif
     buf_T	*buf;
@@ -2220,12 +2208,12 @@
  * Return < 0 for error.
  */
     int
-buflist_findpat(pattern, pattern_end, unlisted, diffmode, curtab_only)
-    char_u	*pattern;
-    char_u	*pattern_end;	/* pointer to first char after pattern */
-    int		unlisted;	/* find unlisted buffers */
-    int		diffmode UNUSED; /* find diff-mode buffers only */
-    int		curtab_only;	/* find buffers in current tab only */
+buflist_findpat(
+    char_u	*pattern,
+    char_u	*pattern_end,	/* pointer to first char after pattern */
+    int		unlisted,	/* find unlisted buffers */
+    int		diffmode UNUSED, /* find diff-mode buffers only */
+    int		curtab_only)	/* find buffers in current tab only */
 {
     buf_T	*buf;
     int		match = -1;
@@ -2350,11 +2338,11 @@
  * Return OK if matches found, FAIL otherwise.
  */
     int
-ExpandBufnames(pat, num_file, file, options)
-    char_u	*pat;
-    int		*num_file;
-    char_u	***file;
-    int		options;
+ExpandBufnames(
+    char_u	*pat,
+    int		*num_file,
+    char_u	***file,
+    int		options)
 {
     int		count = 0;
     buf_T	*buf;
@@ -2455,10 +2443,10 @@
  * Check for a match on the file name for buffer "buf" with regprog "prog".
  */
     static char_u *
-buflist_match(rmp, buf, ignore_case)
-    regmatch_T	*rmp;
-    buf_T	*buf;
-    int		ignore_case;  /* when TRUE ignore case, when FALSE use 'fic' */
+buflist_match(
+    regmatch_T	*rmp,
+    buf_T	*buf,
+    int		ignore_case)  /* when TRUE ignore case, when FALSE use 'fic' */
 {
     char_u	*match;
 
@@ -2475,10 +2463,10 @@
  * Return "name" when there is a match, NULL when not.
  */
     static char_u *
-fname_match(rmp, name, ignore_case)
-    regmatch_T	*rmp;
-    char_u	*name;
-    int		ignore_case;  /* when TRUE ignore case, when FALSE use 'fic' */
+fname_match(
+    regmatch_T	*rmp,
+    char_u	*name,
+    int		ignore_case)  /* when TRUE ignore case, when FALSE use 'fic' */
 {
     char_u	*match = NULL;
     char_u	*p;
@@ -2507,8 +2495,7 @@
  * find file in buffer list by number
  */
     buf_T *
-buflist_findnr(nr)
-    int		nr;
+buflist_findnr(int nr)
 {
     buf_T	*buf;
 
@@ -2527,10 +2514,10 @@
  * Returns a pointer to allocated memory, of NULL when failed.
  */
     char_u *
-buflist_nr2name(n, fullname, helptail)
-    int		n;
-    int		fullname;
-    int		helptail;	/* for help buffers return tail only */
+buflist_nr2name(
+    int		n,
+    int		fullname,
+    int		helptail)	/* for help buffers return tail only */
 {
     buf_T	*buf;
 
@@ -2547,12 +2534,12 @@
  * When "lnum" is 0 only do the options.
  */
     static void
-buflist_setfpos(buf, win, lnum, col, copy_options)
-    buf_T	*buf;
-    win_T	*win;
-    linenr_T	lnum;
-    colnr_T	col;
-    int		copy_options;
+buflist_setfpos(
+    buf_T	*buf,
+    win_T	*win,
+    linenr_T	lnum,
+    colnr_T	col,
+    int		copy_options)
 {
     wininfo_T	*wip;
 
@@ -2620,8 +2607,7 @@
  * page.  That's because a diff is local to a tab page.
  */
     static int
-wininfo_other_tab_diff(wip)
-    wininfo_T	*wip;
+wininfo_other_tab_diff(wininfo_T *wip)
 {
     win_T	*wp;
 
@@ -2646,9 +2632,9 @@
  * Returns NULL when there isn't any info.
  */
     static wininfo_T *
-find_wininfo(buf, skip_diff_buffer)
-    buf_T	*buf;
-    int		skip_diff_buffer UNUSED;
+find_wininfo(
+    buf_T	*buf,
+    int		skip_diff_buffer UNUSED)
 {
     wininfo_T	*wip;
 
@@ -2685,8 +2671,7 @@
  * global values for the window.
  */
     void
-get_winopts(buf)
-    buf_T	*buf;
+get_winopts(buf_T *buf)
 {
     wininfo_T	*wip;
 
@@ -2724,8 +2709,7 @@
  * Returns a pointer to no_position if no position is found.
  */
     pos_T *
-buflist_findfpos(buf)
-    buf_T	*buf;
+buflist_findfpos(buf_T *buf)
 {
     wininfo_T	*wip;
     static pos_T no_position = INIT_POS_T(1, 0, 0);
@@ -2741,8 +2725,7 @@
  * Find the lnum for the buffer 'buf' for the current window.
  */
     linenr_T
-buflist_findlnum(buf)
-    buf_T	*buf;
+buflist_findlnum(buf_T *buf)
 {
     return buflist_findfpos(buf)->lnum;
 }
@@ -2752,8 +2735,7 @@
  * List all know file names (for :files and :buffers command).
  */
     void
-buflist_list(eap)
-    exarg_T	*eap;
+buflist_list(exarg_T *eap)
 {
     buf_T	*buf;
     int		len;
@@ -2820,10 +2802,10 @@
  * Return FAIL if not found, OK for success.
  */
     int
-buflist_name_nr(fnum, fname, lnum)
-    int		fnum;
-    char_u	**fname;
-    linenr_T	*lnum;
+buflist_name_nr(
+    int		fnum,
+    char_u	**fname,
+    linenr_T	*lnum)
 {
     buf_T	*buf;
 
@@ -2844,10 +2826,11 @@
  *	OK otherwise.
  */
     int
-setfname(buf, ffname, sfname, message)
-    buf_T	*buf;
-    char_u	*ffname, *sfname;
-    int		message;	/* give message when buffer already exists */
+setfname(
+    buf_T	*buf,
+    char_u	*ffname,
+    char_u	*sfname,
+    int		message)	/* give message when buffer already exists */
 {
     buf_T	*obuf = NULL;
 #ifdef UNIX
@@ -2941,9 +2924,7 @@
  * The name should be relative to the current directory.
  */
     void
-buf_set_name(fnum, name)
-    int		fnum;
-    char_u	*name;
+buf_set_name(int fnum, char_u *name)
 {
     buf_T	*buf;
 
@@ -2966,8 +2947,7 @@
  * changed.
  */
     void
-buf_name_changed(buf)
-    buf_T	*buf;
+buf_name_changed(buf_T *buf)
 {
     /*
      * If the file name changed, also change the name of the swapfile
@@ -2994,10 +2974,10 @@
  * Return the buffer.
  */
     buf_T *
-setaltfname(ffname, sfname, lnum)
-    char_u	*ffname;
-    char_u	*sfname;
-    linenr_T	lnum;
+setaltfname(
+    char_u	*ffname,
+    char_u	*sfname,
+    linenr_T	lnum)
 {
     buf_T	*buf;
 
@@ -3013,8 +2993,8 @@
  * Return NULL if there isn't any, and give error message if requested.
  */
     char_u  *
-getaltfname(errmsg)
-    int		errmsg;		/* give error message */
+getaltfname(
+    int		errmsg)		/* give error message */
 {
     char_u	*fname;
     linenr_T	dummy;
@@ -3035,9 +3015,7 @@
  * used by qf_init(), main() and doarglist()
  */
     int
-buflist_add(fname, flags)
-    char_u	*fname;
-    int		flags;
+buflist_add(char_u *fname, int flags)
 {
     buf_T	*buf;
 
@@ -3052,7 +3030,7 @@
  * Adjust slashes in file names.  Called after 'shellslash' was set.
  */
     void
-buflist_slash_adjust()
+buflist_slash_adjust(void)
 {
     buf_T	*bp;
 
@@ -3071,8 +3049,7 @@
  * Also save the local window option values.
  */
     void
-buflist_altfpos(win)
-    win_T *win;
+buflist_altfpos(win_T *win)
 {
     buflist_setfpos(curbuf, win, win->w_cursor.lnum, win->w_cursor.col, TRUE);
 }
@@ -3082,8 +3059,7 @@
  * Fname must have a full path (expanded by mch_FullName()).
  */
     int
-otherfile(ffname)
-    char_u	*ffname;
+otherfile(char_u *ffname)
 {
     return otherfile_buf(curbuf, ffname
 #ifdef UNIX
@@ -3093,16 +3069,13 @@
 }
 
     static int
-otherfile_buf(buf, ffname
+otherfile_buf(
+    buf_T		*buf,
+    char_u		*ffname
 #ifdef UNIX
-	, stp
+    , struct stat	*stp
 #endif
-	)
-    buf_T	*buf;
-    char_u	*ffname;
-#ifdef UNIX
-    struct stat	*stp;
-#endif
+    )
 {
     /* no name is different */
     if (ffname == NULL || *ffname == NUL || buf->b_ffname == NULL)
@@ -3146,8 +3119,7 @@
  * Must always be called when b_fname is changed!.
  */
     void
-buf_setino(buf)
-    buf_T	*buf;
+buf_setino(buf_T *buf)
 {
     struct stat	st;
 
@@ -3165,9 +3137,9 @@
  * Return TRUE if dev/ino in buffer "buf" matches with "stp".
  */
     static int
-buf_same_ino(buf, stp)
-    buf_T	*buf;
-    struct stat *stp;
+buf_same_ino(
+    buf_T	*buf,
+    struct stat *stp)
 {
     return (buf->b_dev_valid
 	    && stp->st_dev == buf->b_dev
@@ -3179,10 +3151,10 @@
  * Print info about the current buffer.
  */
     void
-fileinfo(fullname, shorthelp, dont_truncate)
-    int fullname;	    /* when non-zero print full path */
-    int shorthelp;
-    int	dont_truncate;
+fileinfo(
+    int fullname,	    /* when non-zero print full path */
+    int shorthelp,
+    int	dont_truncate)
 {
     char_u	*name;
     int		n;
@@ -3298,11 +3270,11 @@
 }
 
     void
-col_print(buf, buflen, col, vcol)
-    char_u  *buf;
-    size_t  buflen;
-    int	    col;
-    int	    vcol;
+col_print(
+    char_u  *buf,
+    size_t  buflen,
+    int	    col,
+    int	    vcol)
 {
     if (col == vcol)
 	vim_snprintf((char *)buf, buflen, "%d", col);
@@ -3319,7 +3291,7 @@
 static char_u *lasticon = NULL;
 
     void
-maketitle()
+maketitle(void)
 {
     char_u	*p;
     char_u	*t_str = NULL;
@@ -3528,9 +3500,7 @@
  * Return TRUE when "*last" changed.
  */
     static int
-ti_change(str, last)
-    char_u	*str;
-    char_u	**last;
+ti_change(char_u *str, char_u **last)
 {
     if ((str == NULL) != (*last == NULL)
 	    || (str != NULL && *last != NULL && STRCMP(str, *last) != 0))
@@ -3549,14 +3519,14 @@
  * Put current window title back (used after calling a shell)
  */
     void
-resettitle()
+resettitle(void)
 {
     mch_settitle(lasttitle, lasticon);
 }
 
 # if defined(EXITFREE) || defined(PROTO)
     void
-free_titles()
+free_titles(void)
 {
     vim_free(lasttitle);
     vim_free(lasticon);
@@ -3581,17 +3551,16 @@
  * or truncated if too long, fillchar is used for all whitespace.
  */
     int
-build_stl_str_hl(wp, out, outlen, fmt, use_sandbox, fillchar,
-						      maxwidth, hltab, tabtab)
-    win_T	*wp;
-    char_u	*out;		/* buffer to write into != NameBuff */
-    size_t	outlen;		/* length of out[] */
-    char_u	*fmt;
-    int		use_sandbox UNUSED; /* "fmt" was set insecurely, use sandbox */
-    int		fillchar;
-    int		maxwidth;
-    struct stl_hlrec *hltab;	/* return: HL attributes (can be NULL) */
-    struct stl_hlrec *tabtab;	/* return: tab page nrs (can be NULL) */
+build_stl_str_hl(
+    win_T	*wp,
+    char_u	*out,		/* buffer to write into != NameBuff */
+    size_t	outlen,		/* length of out[] */
+    char_u	*fmt,
+    int		use_sandbox UNUSED, /* "fmt" was set insecurely, use sandbox */
+    int		fillchar,
+    int		maxwidth,
+    struct stl_hlrec *hltab,	/* return: HL attributes (can be NULL) */
+    struct stl_hlrec *tabtab)	/* return: tab page nrs (can be NULL) */
 {
     char_u	*p;
     char_u	*s;
@@ -4424,10 +4393,10 @@
  * using "Top", "Bot" or "All" when appropriate.
  */
     void
-get_rel_pos(wp, buf, buflen)
-    win_T	*wp;
-    char_u	*buf;
-    int		buflen;
+get_rel_pos(
+    win_T	*wp,
+    char_u	*buf,
+    int		buflen)
 {
     long	above; /* number of lines above window */
     long	below; /* number of lines below window */
@@ -4460,11 +4429,11 @@
  * Return TRUE if it was appended.
  */
     static int
-append_arg_number(wp, buf, buflen, add_file)
-    win_T	*wp;
-    char_u	*buf;
-    int		buflen;
-    int		add_file;	/* Add "file" before the arg number */
+append_arg_number(
+    win_T	*wp,
+    char_u	*buf,
+    int		buflen,
+    int		add_file)	/* Add "file" before the arg number */
 {
     char_u	*p;
 
@@ -4492,8 +4461,7 @@
  * Returns pointer to allocated memory (NULL for failure).
  */
     char_u  *
-fix_fname(fname)
-    char_u  *fname;
+fix_fname(char_u  *fname)
 {
     /*
      * Force expanding the path always for Unix, because symbolic links may
@@ -4539,10 +4507,10 @@
  * "ffname" becomes a pointer to allocated memory (or NULL).
  */
     void
-fname_expand(buf, ffname, sfname)
-    buf_T	*buf UNUSED;
-    char_u	**ffname;
-    char_u	**sfname;
+fname_expand(
+    buf_T	*buf UNUSED,
+    char_u	**ffname,
+    char_u	**sfname)
 {
     if (*ffname == NULL)	/* if no file name given, nothing to do */
 	return;
@@ -4571,8 +4539,7 @@
  * Get the file name for an argument list entry.
  */
     char_u *
-alist_name(aep)
-    aentry_T	*aep;
+alist_name(aentry_T *aep)
 {
     buf_T	*bp;
 
@@ -4588,10 +4555,10 @@
  * do_arg_all(): Open up to 'count' windows, one for each argument.
  */
     void
-do_arg_all(count, forceit, keep_tabs)
-    int	count;
-    int	forceit;		/* hide buffers in current windows */
-    int keep_tabs;		/* keep current tabs, for ":tab drop file" */
+do_arg_all(
+    int	count,
+    int	forceit,		/* hide buffers in current windows */
+    int keep_tabs)		/* keep current tabs, for ":tab drop file" */
 {
     int		i;
     win_T	*wp, *wpnext;
@@ -4885,8 +4852,7 @@
  * Open a window for a number of buffers.
  */
     void
-ex_buffer_all(eap)
-    exarg_T	*eap;
+ex_buffer_all(exarg_T *eap)
 {
     buf_T	*buf;
     win_T	*wp, *wpnext;
@@ -5130,8 +5096,7 @@
  * Returns immediately if the "ml" option isn't set.
  */
     void
-do_modelines(flags)
-    int		flags;
+do_modelines(int flags)
 {
     linenr_T	lnum;
     int		nmlines;
@@ -5165,9 +5130,9 @@
  * Return FAIL if an error encountered.
  */
     static int
-chk_modeline(lnum, flags)
-    linenr_T	lnum;
-    int		flags;		/* Same as for do_modelines(). */
+chk_modeline(
+    linenr_T	lnum,
+    int		flags)		/* Same as for do_modelines(). */
 {
     char_u	*s;
     char_u	*e;
@@ -5287,9 +5252,9 @@
 
 #if defined(FEAT_VIMINFO) || defined(PROTO)
     int
-read_viminfo_bufferlist(virp, writing)
-    vir_T	*virp;
-    int		writing;
+read_viminfo_bufferlist(
+    vir_T	*virp,
+    int		writing)
 {
     char_u	*tab;
     linenr_T	lnum;
@@ -5341,8 +5306,7 @@
 }
 
     void
-write_viminfo_bufferlist(fp)
-    FILE    *fp;
+write_viminfo_bufferlist(FILE *fp)
 {
     buf_T	*buf;
 #ifdef FEAT_WINDOWS
@@ -5401,8 +5365,7 @@
  * Returns NULL when the buffer has a normal file name.
  */
     char_u *
-buf_spname(buf)
-    buf_T	*buf;
+buf_spname(buf_T *buf)
 {
 #if defined(FEAT_QUICKFIX) && defined(FEAT_WINDOWS)
     if (bt_quickfix(buf))
@@ -5444,10 +5407,10 @@
  * If not found FAIL is returned.
  */
     int
-find_win_for_buf(buf, wp, tp)
-    buf_T     *buf;
-    win_T     **wp;
-    tabpage_T **tp;
+find_win_for_buf(
+    buf_T     *buf,
+    win_T     **wp,
+    tabpage_T **tp)
 {
     FOR_ALL_TAB_WINDOWS(*tp, *wp)
 	if ((*wp)->w_buffer == buf)
@@ -5463,13 +5426,13 @@
  * Insert the sign into the signlist.
  */
     static void
-insert_sign(buf, prev, next, id, lnum, typenr)
-    buf_T	*buf;		/* buffer to store sign in */
-    signlist_T	*prev;		/* previous sign entry */
-    signlist_T	*next;		/* next sign entry */
-    int		id;		/* sign ID */
-    linenr_T	lnum;		/* line number which gets the mark */
-    int		typenr;		/* typenr of sign we are adding */
+insert_sign(
+    buf_T	*buf,		/* buffer to store sign in */
+    signlist_T	*prev,		/* previous sign entry */
+    signlist_T	*next,		/* next sign entry */
+    int		id,		/* sign ID */
+    linenr_T	lnum,		/* line number which gets the mark */
+    int		typenr)		/* typenr of sign we are adding */
 {
     signlist_T	*newsign;
 
@@ -5512,11 +5475,11 @@
  * Add the sign into the signlist. Find the right spot to do it though.
  */
     void
-buf_addsign(buf, id, lnum, typenr)
-    buf_T	*buf;		/* buffer to store sign in */
-    int		id;		/* sign ID */
-    linenr_T	lnum;		/* line number which gets the mark */
-    int		typenr;		/* typenr of sign we are adding */
+buf_addsign(
+    buf_T	*buf,		/* buffer to store sign in */
+    int		id,		/* sign ID */
+    linenr_T	lnum,		/* line number which gets the mark */
+    int		typenr)		/* typenr of sign we are adding */
 {
     signlist_T	*sign;		/* a sign in the signlist */
     signlist_T	*prev;		/* the previous sign */
@@ -5571,10 +5534,10 @@
  * Returns the line number of the sign, or zero if the sign is not found.
  */
     linenr_T
-buf_change_sign_type(buf, markId, typenr)
-    buf_T	*buf;		/* buffer to store sign in */
-    int		markId;		/* sign ID */
-    int		typenr;		/* typenr of sign we are adding */
+buf_change_sign_type(
+    buf_T	*buf,		/* buffer to store sign in */
+    int		markId,		/* sign ID */
+    int		typenr)		/* typenr of sign we are adding */
 {
     signlist_T	*sign;		/* a sign in the signlist */
 
@@ -5591,10 +5554,10 @@
 }
 
     int
-buf_getsigntype(buf, lnum, type)
-    buf_T	*buf;
-    linenr_T	lnum;
-    int		type;	/* SIGN_ICON, SIGN_TEXT, SIGN_ANY, SIGN_LINEHL */
+buf_getsigntype(
+    buf_T	*buf,
+    linenr_T	lnum,
+    int		type)	/* SIGN_ICON, SIGN_TEXT, SIGN_ANY, SIGN_LINEHL */
 {
     signlist_T	*sign;		/* a sign in a b_signlist */
 
@@ -5615,9 +5578,9 @@
 
 
     linenr_T
-buf_delsign(buf, id)
-    buf_T	*buf;		/* buffer sign is stored in */
-    int		id;		/* sign id */
+buf_delsign(
+    buf_T	*buf,		/* buffer sign is stored in */
+    int		id)		/* sign id */
 {
     signlist_T	**lastp;	/* pointer to pointer to current sign */
     signlist_T	*sign;		/* a sign in a b_signlist */
@@ -5662,9 +5625,9 @@
  * get loaded.
  */
     int
-buf_findsign(buf, id)
-    buf_T	*buf;		/* buffer to store sign in */
-    int		id;		/* sign ID */
+buf_findsign(
+    buf_T	*buf,		/* buffer to store sign in */
+    int		id)		/* sign ID */
 {
     signlist_T	*sign;		/* a sign in the signlist */
 
@@ -5676,9 +5639,9 @@
 }
 
     int
-buf_findsign_id(buf, lnum)
-    buf_T	*buf;		/* buffer whose sign we are searching for */
-    linenr_T	lnum;		/* line number of sign */
+buf_findsign_id(
+    buf_T	*buf,		/* buffer whose sign we are searching for */
+    linenr_T	lnum)		/* line number of sign */
 {
     signlist_T	*sign;		/* a sign in the signlist */
 
@@ -5693,10 +5656,10 @@
 # if defined(FEAT_NETBEANS_INTG) || defined(PROTO)
 /* see if a given type of sign exists on a specific line */
     int
-buf_findsigntype_id(buf, lnum, typenr)
-    buf_T	*buf;		/* buffer whose sign we are searching for */
-    linenr_T	lnum;		/* line number of sign */
-    int		typenr;		/* sign type number */
+buf_findsigntype_id(
+    buf_T	*buf,		/* buffer whose sign we are searching for */
+    linenr_T	lnum,		/* line number of sign */
+    int		typenr)		/* sign type number */
 {
     signlist_T	*sign;		/* a sign in the signlist */
 
@@ -5711,9 +5674,7 @@
 #  if defined(FEAT_SIGN_ICONS) || defined(PROTO)
 /* return the number of icons on the given line */
     int
-buf_signcount(buf, lnum)
-    buf_T	*buf;
-    linenr_T	lnum;
+buf_signcount(buf_T *buf, linenr_T lnum)
 {
     signlist_T	*sign;		/* a sign in the signlist */
     int		count = 0;
@@ -5733,8 +5694,7 @@
  * Delete signs in buffer "buf".
  */
     void
-buf_delete_signs(buf)
-    buf_T	*buf;
+buf_delete_signs(buf_T *buf)
 {
     signlist_T	*next;
 
@@ -5758,7 +5718,7 @@
  * Delete all signs in all buffers.
  */
     void
-buf_delete_all_signs()
+buf_delete_all_signs(void)
 {
     buf_T	*buf;		/* buffer we are checking for signs */
 
@@ -5771,8 +5731,7 @@
  * List placed signs for "rbuf".  If "rbuf" is NULL do it for all buffers.
  */
     void
-sign_list_placed(rbuf)
-    buf_T	*rbuf;
+sign_list_placed(buf_T *rbuf)
 {
     buf_T	*buf;
     signlist_T	*p;
@@ -5809,11 +5768,11 @@
  * Adjust a placed sign for inserted/deleted lines.
  */
     void
-sign_mark_adjust(line1, line2, amount, amount_after)
-    linenr_T	line1;
-    linenr_T	line2;
-    long	amount;
-    long	amount_after;
+sign_mark_adjust(
+    linenr_T	line1,
+    linenr_T	line2,
+    long	amount,
+    long	amount_after)
 {
     signlist_T	*sign;		/* a sign in a b_signlist */
 
@@ -5836,8 +5795,7 @@
  * Set 'buflisted' for curbuf to "on" and trigger autocommands if it changed.
  */
     void
-set_buflisted(on)
-    int		on;
+set_buflisted(int on)
 {
     if (on != curbuf->b_p_bl)
     {
@@ -5856,8 +5814,7 @@
  * Return TRUE if it changed or this could not be checked.
  */
     int
-buf_contents_changed(buf)
-    buf_T	*buf;
+buf_contents_changed(buf_T *buf)
 {
     buf_T	*newbuf;
     int		differ = TRUE;
@@ -5914,9 +5871,9 @@
  * marks.
  */
     void
-wipe_buffer(buf, aucmd)
-    buf_T	*buf;
-    int		aucmd UNUSED;	    /* When TRUE trigger autocommands. */
+wipe_buffer(
+    buf_T	*buf,
+    int		aucmd UNUSED)	    /* When TRUE trigger autocommands. */
 {
     if (buf->b_fnum == top_file_num - 1)
 	--top_file_num;
diff --git a/src/channel.c b/src/channel.c
index 46c45b6..2a75342 100644
--- a/src/channel.c
+++ b/src/channel.c
@@ -745,7 +745,7 @@
  * Return a unique ID to be used in a message.
  */
     int
-channel_get_id()
+channel_get_id(void)
 {
     static int next_id = 1;
 
diff --git a/src/charset.c b/src/charset.c
index 4df4e7f..538d821 100644
--- a/src/charset.c
+++ b/src/charset.c
@@ -68,15 +68,15 @@
  * error, OK otherwise.
  */
     int
-init_chartab()
+init_chartab(void)
 {
     return buf_init_chartab(curbuf, TRUE);
 }
 
     int
-buf_init_chartab(buf, global)
-    buf_T	*buf;
-    int		global;		/* FALSE: only set buf->b_chartab[] */
+buf_init_chartab(
+    buf_T	*buf,
+    int		global)		/* FALSE: only set buf->b_chartab[] */
 {
     int		c;
     int		c2;
@@ -313,9 +313,9 @@
  * enough room, not all characters will be translated.
  */
     void
-trans_characters(buf, bufsize)
-    char_u	*buf;
-    int		bufsize;
+trans_characters(
+    char_u	*buf,
+    int		bufsize)
 {
     int		len;		/* length of string needing translation */
     int		room;		/* room in buffer after string */
@@ -356,8 +356,7 @@
  * printable chars.  Returns NULL when out of memory.
  */
     char_u *
-transstr(s)
-    char_u	*s;
+transstr(char_u *s)
 {
     char_u	*res;
     char_u	*p;
@@ -434,11 +433,11 @@
  * Otherwise puts the result in "buf[buflen]".
  */
     char_u *
-str_foldcase(str, orglen, buf, buflen)
-    char_u	*str;
-    int		orglen;
-    char_u	*buf;
-    int		buflen;
+str_foldcase(
+    char_u	*str,
+    int		orglen,
+    char_u	*buf,
+    int		buflen)
 {
     garray_T	ga;
     int		i;
@@ -552,8 +551,7 @@
 static char_u	transchar_buf[7];
 
     char_u *
-transchar(c)
-    int		c;
+transchar(int c)
 {
     int			i;
 
@@ -592,8 +590,7 @@
  * for an illegal UTF-8 byte.
  */
     char_u *
-transchar_byte(c)
-    int		c;
+transchar_byte(int c)
 {
     if (enc_utf8 && c >= 0x80)
     {
@@ -610,9 +607,7 @@
  * Does NOT work for multi-byte characters, c must be <= 255.
  */
     void
-transchar_nonprint(buf, c)
-    char_u	*buf;
-    int		c;
+transchar_nonprint(char_u *buf, int c)
 {
     if (c == NL)
 	c = NUL;		/* we use newline in place of a NUL */
@@ -679,9 +674,7 @@
 }
 
     void
-transchar_hex(buf, c)
-    char_u	*buf;
-    int		c;
+transchar_hex(char_u *buf, int c)
 {
     int		i = 0;
 
@@ -705,8 +698,7 @@
  * function key 1.
  */
     static unsigned
-nr2hex(c)
-    unsigned	c;
+nr2hex(unsigned c)
 {
     if ((c & 0xf) <= 9)
 	return (c & 0xf) + '0';
@@ -722,8 +714,7 @@
  * cells depends on further bytes.
  */
     int
-byte2cells(b)
-    int		b;
+byte2cells(int b)
 {
 #ifdef FEAT_MBYTE
     if (enc_utf8 && b >= 0x80)
@@ -738,8 +729,7 @@
  * A TAB is counted as two cells: "^I" or four: "<09>".
  */
     int
-char2cells(c)
-    int		c;
+char2cells(int c)
 {
     if (IS_SPECIAL(c))
 	return char2cells(K_SECOND(c)) + 2;
@@ -767,8 +757,7 @@
  * A TAB is counted as two cells: "^I" or four: "<09>".
  */
     int
-ptr2cells(p)
-    char_u	*p;
+ptr2cells(char_u *p)
 {
 #ifdef FEAT_MBYTE
     /* For UTF-8 we need to look at more bytes if the first byte is >= 0x80. */
@@ -784,8 +773,7 @@
  * counting TABs as two characters: "^I".
  */
     int
-vim_strsize(s)
-    char_u	*s;
+vim_strsize(char_u *s)
 {
     return vim_strnsize(s, (int)MAXCOL);
 }
@@ -795,9 +783,7 @@
  * screen, counting TABs as two characters: "^I".
  */
     int
-vim_strnsize(s, len)
-    char_u	*s;
-    int		len;
+vim_strnsize(char_u *s, int len)
 {
     int		size = 0;
 
@@ -839,9 +825,7 @@
 #if defined(FEAT_VREPLACE) || defined(FEAT_EX_EXTRA) || defined(FEAT_GUI) \
 	|| defined(FEAT_VIRTUALEDIT) || defined(PROTO)
     int
-chartabsize(p, col)
-    char_u	*p;
-    colnr_T	col;
+chartabsize(char_u *p, colnr_T col)
 {
     RET_WIN_BUF_CHARTABSIZE(curwin, curbuf, p, col)
 }
@@ -849,10 +833,7 @@
 
 #ifdef FEAT_LINEBREAK
     static int
-win_chartabsize(wp, p, col)
-    win_T	*wp;
-    char_u	*p;
-    colnr_T	col;
+win_chartabsize(win_T *wp, char_u *p, colnr_T col)
 {
     RET_WIN_BUF_CHARTABSIZE(wp, wp->w_buffer, p, col)
 }
@@ -863,8 +844,7 @@
  * taking into account the size of a tab.
  */
     int
-linetabsize(s)
-    char_u	*s;
+linetabsize(char_u *s)
 {
     return linetabsize_col(0, s);
 }
@@ -873,9 +853,7 @@
  * Like linetabsize(), but starting at column "startcol".
  */
     int
-linetabsize_col(startcol, s)
-    int		startcol;
-    char_u	*s;
+linetabsize_col(int startcol, char_u *s)
 {
     colnr_T	col = startcol;
     char_u	*line = s; /* pointer to start of line, for breakindent */
@@ -889,10 +867,7 @@
  * Like linetabsize(), but for a given window instead of the current one.
  */
     int
-win_linetabsize(wp, line, len)
-    win_T	*wp;
-    char_u	*line;
-    colnr_T	len;
+win_linetabsize(win_T *wp, char_u *line, colnr_T len)
 {
     colnr_T	col = 0;
     char_u	*s;
@@ -908,8 +883,7 @@
  * Letters and characters from the 'isident' option.
  */
     int
-vim_isIDc(c)
-    int c;
+vim_isIDc(int c)
 {
     return (c > 0 && c < 0x100 && (g_chartab[c] & CT_ID_CHAR));
 }
@@ -920,16 +894,13 @@
  * For multi-byte characters mb_get_class() is used (builtin rules).
  */
     int
-vim_iswordc(c)
-    int c;
+vim_iswordc(int c)
 {
     return vim_iswordc_buf(c, curbuf);
 }
 
     int
-vim_iswordc_buf(c, buf)
-    int		c;
-    buf_T	*buf;
+vim_iswordc_buf(int c, buf_T *buf)
 {
 #ifdef FEAT_MBYTE
     if (c >= 0x100)
@@ -947,8 +918,7 @@
  * Just like vim_iswordc() but uses a pointer to the (multi-byte) character.
  */
     int
-vim_iswordp(p)
-    char_u *p;
+vim_iswordp(char_u *p)
 {
 #ifdef FEAT_MBYTE
     if (has_mbyte && MB_BYTE2LEN(*p) > 1)
@@ -958,9 +928,7 @@
 }
 
     int
-vim_iswordp_buf(p, buf)
-    char_u	*p;
-    buf_T	*buf;
+vim_iswordp_buf(char_u *p, buf_T *buf)
 {
 #ifdef FEAT_MBYTE
     if (has_mbyte && MB_BYTE2LEN(*p) > 1)
@@ -974,8 +942,7 @@
  * Assume characters above 0x100 are valid (multi-byte).
  */
     int
-vim_isfilec(c)
-    int	c;
+vim_isfilec(int c)
 {
     return (c >= 0x100 || (c > 0 && (g_chartab[c] & CT_FNAME_CHAR)));
 }
@@ -987,8 +954,7 @@
  * returns false.
  */
     int
-vim_isfilec_or_wc(c)
-    int c;
+vim_isfilec_or_wc(int c)
 {
     char_u buf[2];
 
@@ -1003,8 +969,7 @@
  * Unicode.
  */
     int
-vim_isprintc(c)
-    int c;
+vim_isprintc(int c)
 {
 #ifdef FEAT_MBYTE
     if (enc_utf8 && c >= 0x100)
@@ -1018,8 +983,7 @@
  * byte of a double-byte character.
  */
     int
-vim_isprintc_strict(c)
-    int	c;
+vim_isprintc_strict(int c)
 {
 #ifdef FEAT_MBYTE
     if (enc_dbcs != 0 && c < 0x100 && MB_BYTE2LEN(c) > 1)
@@ -1034,10 +998,10 @@
  * like chartabsize(), but also check for line breaks on the screen
  */
     int
-lbr_chartabsize(line, s, col)
-    char_u		*line UNUSED; /* start of the line */
-    unsigned char	*s;
-    colnr_T		col;
+lbr_chartabsize(
+    char_u		*line UNUSED, /* start of the line */
+    unsigned char	*s,
+    colnr_T		col)
 {
 #ifdef FEAT_LINEBREAK
     if (!curwin->w_p_lbr && *p_sbr == NUL && !curwin->w_p_bri)
@@ -1058,10 +1022,10 @@
  * Call lbr_chartabsize() and advance the pointer.
  */
     int
-lbr_chartabsize_adv(line, s, col)
-    char_u	*line; /* start of the line */
-    char_u	**s;
-    colnr_T	col;
+lbr_chartabsize_adv(
+    char_u	*line, /* start of the line */
+    char_u	**s,
+    colnr_T	col)
 {
     int		retval;
 
@@ -1078,12 +1042,12 @@
  * value, init to 0 before calling.
  */
     int
-win_lbr_chartabsize(wp, line, s, col, headp)
-    win_T	*wp;
-    char_u	*line UNUSED; /* start of the line */
-    char_u	*s;
-    colnr_T	col;
-    int		*headp UNUSED;
+win_lbr_chartabsize(
+    win_T	*wp,
+    char_u	*line UNUSED, /* start of the line */
+    char_u	*s,
+    colnr_T	col,
+    int		*headp UNUSED)
 {
 #ifdef FEAT_LINEBREAK
     int		c;
@@ -1254,11 +1218,11 @@
  * doesn't fit at the end of the screen line.
  */
     static int
-win_nolbr_chartabsize(wp, s, col, headp)
-    win_T	*wp;
-    char_u	*s;
-    colnr_T	col;
-    int		*headp;
+win_nolbr_chartabsize(
+    win_T	*wp,
+    char_u	*s,
+    colnr_T	col,
+    int		*headp)
 {
     int		n;
 
@@ -1284,9 +1248,7 @@
  * "wp".
  */
     int
-in_win_border(wp, vcol)
-    win_T	*wp;
-    colnr_T	vcol;
+in_win_border(win_T *wp, colnr_T vcol)
 {
     int		width1;		/* width of first line (after line number) */
     int		width2;		/* width of further lines */
@@ -1316,12 +1278,12 @@
  * This is used very often, keep it fast!
  */
     void
-getvcol(wp, pos, start, cursor, end)
-    win_T	*wp;
-    pos_T	*pos;
-    colnr_T	*start;
-    colnr_T	*cursor;
-    colnr_T	*end;
+getvcol(
+    win_T	*wp,
+    pos_T	*pos,
+    colnr_T	*start,
+    colnr_T	*cursor,
+    colnr_T	*end)
 {
     colnr_T	vcol;
     char_u	*ptr;		/* points to current char */
@@ -1446,8 +1408,7 @@
  * Get virtual cursor column in the current window, pretending 'list' is off.
  */
     colnr_T
-getvcol_nolist(posp)
-    pos_T	*posp;
+getvcol_nolist(pos_T *posp)
 {
     int		list_save = curwin->w_p_list;
     colnr_T	vcol;
@@ -1463,12 +1424,12 @@
  * Get virtual column in virtual mode.
  */
     void
-getvvcol(wp, pos, start, cursor, end)
-    win_T	*wp;
-    pos_T	*pos;
-    colnr_T	*start;
-    colnr_T	*cursor;
-    colnr_T	*end;
+getvvcol(
+    win_T	*wp,
+    pos_T	*pos,
+    colnr_T	*start,
+    colnr_T	*cursor,
+    colnr_T	*end)
 {
     colnr_T	col;
     colnr_T	coladd;
@@ -1519,10 +1480,12 @@
  * Used for Visual block mode.
  */
     void
-getvcols(wp, pos1, pos2, left, right)
-    win_T	*wp;
-    pos_T	*pos1, *pos2;
-    colnr_T	*left, *right;
+getvcols(
+    win_T	*wp,
+    pos_T	*pos1,
+    pos_T	*pos2,
+    colnr_T	*left,
+    colnr_T	*right)
 {
     colnr_T	from1, from2, to1, to2;
 
@@ -1555,8 +1518,7 @@
  * skipwhite: skip over ' ' and '\t'.
  */
     char_u *
-skipwhite(q)
-    char_u	*q;
+skipwhite(char_u *q)
 {
     char_u	*p = q;
 
@@ -1569,8 +1531,7 @@
  * skip over digits
  */
     char_u *
-skipdigits(q)
-    char_u	*q;
+skipdigits(char_u *q)
 {
     char_u	*p = q;
 
@@ -1584,8 +1545,7 @@
  * skip over binary digits
  */
     char_u *
-skipbin(q)
-    char_u	*q;
+skipbin(char_u *q)
 {
     char_u	*p = q;
 
@@ -1598,8 +1558,7 @@
  * skip over digits and hex characters
  */
     char_u *
-skiphex(q)
-    char_u	*q;
+skiphex(char_u *q)
 {
     char_u	*p = q;
 
@@ -1614,8 +1573,7 @@
  * skip to bin digit (or NUL after the string)
  */
     char_u *
-skiptobin(q)
-    char_u	*q;
+skiptobin(char_u *q)
 {
     char_u	*p = q;
 
@@ -1628,8 +1586,7 @@
  * skip to digit (or NUL after the string)
  */
     char_u *
-skiptodigit(q)
-    char_u	*q;
+skiptodigit(char_u *q)
 {
     char_u	*p = q;
 
@@ -1642,8 +1599,7 @@
  * skip to hex character (or NUL after the string)
  */
     char_u *
-skiptohex(q)
-    char_u	*q;
+skiptohex(char_u *q)
 {
     char_u	*p = q;
 
@@ -1660,8 +1616,7 @@
  * Use the VIM_ISDIGIT() macro for simple arguments.
  */
     int
-vim_isdigit(c)
-    int		c;
+vim_isdigit(int c)
 {
     return (c >= '0' && c <= '9');
 }
@@ -1672,8 +1627,7 @@
  * superscript 1 to be a digit.
  */
     int
-vim_isxdigit(c)
-    int		c;
+vim_isxdigit(int c)
 {
     return (c >= '0' && c <= '9')
 	|| (c >= 'a' && c <= 'f')
@@ -1685,8 +1639,7 @@
  * characters > 0x100.
  */
     int
-vim_isbdigit(c)
-    int		c;
+vim_isbdigit(int c)
 {
     return (c == '0' || c == '1');
 }
@@ -1706,8 +1659,7 @@
 static char_u latin1lower[257] = "                                 !\"#$%&'()*+,-./0123456789:;<=>?@abcdefghijklmnopqrstuvwxyz[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xd7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff";
 
     int
-vim_islower(c)
-    int	    c;
+vim_islower(int c)
 {
     if (c <= '@')
 	return FALSE;
@@ -1731,8 +1683,7 @@
 }
 
     int
-vim_isupper(c)
-    int	    c;
+vim_isupper(int c)
 {
     if (c <= '@')
 	return FALSE;
@@ -1756,8 +1707,7 @@
 }
 
     int
-vim_toupper(c)
-    int	    c;
+vim_toupper(int c)
 {
     if (c <= '@')
 	return c;
@@ -1781,8 +1731,7 @@
 }
 
     int
-vim_tolower(c)
-    int	    c;
+vim_tolower(int c)
 {
     if (c <= '@')
 	return c;
@@ -1810,8 +1759,7 @@
  * skiptowhite: skip over text until ' ' or '\t' or NUL.
  */
     char_u *
-skiptowhite(p)
-    char_u	*p;
+skiptowhite(char_u *p)
 {
     while (*p != ' ' && *p != '\t' && *p != NUL)
 	++p;
@@ -1824,8 +1772,7 @@
  * skiptowhite_esc: Like skiptowhite(), but also skip escaped chars
  */
     char_u *
-skiptowhite_esc(p)
-    char_u	*p;
+skiptowhite_esc(char_u *p)
 {
     while (*p != ' ' && *p != '\t' && *p != NUL)
     {
@@ -1842,8 +1789,7 @@
  * Note: the argument is a pointer to a char_u pointer!
  */
     long
-getdigits(pp)
-    char_u **pp;
+getdigits(char_u **pp)
 {
     char_u	*p;
     long	retval;
@@ -1861,8 +1807,7 @@
  * Return TRUE if "lbuf" is empty or only contains blanks.
  */
     int
-vim_isblankline(lbuf)
-    char_u	*lbuf;
+vim_isblankline(char_u *lbuf)
 {
     char_u	*p;
 
@@ -1890,16 +1835,16 @@
  * If maxlen > 0, check at a maximum maxlen chars
  */
     void
-vim_str2nr(start, prep, len, what, nptr, unptr, maxlen)
-    char_u		*start;
-    int			*prep;	    /* return: type of number 0 = decimal, 'x'
+vim_str2nr(
+    char_u		*start,
+    int			*prep,	    /* return: type of number 0 = decimal, 'x'
 				       or 'X' is hex, '0' = octal, 'b' or 'B'
 				       is bin */
-    int			*len;	    /* return: detected length of number */
-    int			what;	    /* what numbers to recognize */
-    long		*nptr;	    /* return: signed result */
-    unsigned long	*unptr;	    /* return: unsigned result */
-    int			maxlen;     /* max length of string to check */
+    int			*len,	    /* return: detected length of number */
+    int			what,	    /* what numbers to recognize */
+    long		*nptr,	    /* return: signed result */
+    unsigned long	*unptr,	    /* return: unsigned result */
+    int			maxlen)     /* max length of string to check */
 {
     char_u	    *ptr = start;
     int		    pre = 0;		/* default is decimal */
@@ -2024,8 +1969,7 @@
  * Only valid when the argument is '0' - '9', 'A' - 'F' or 'a' - 'f'.
  */
     int
-hex2nr(c)
-    int		c;
+hex2nr(int c)
 {
     if (c >= 'a' && c <= 'f')
 	return c - 'a' + 10;
@@ -2041,8 +1985,7 @@
  * Return -1 if one of the characters is not hex.
  */
     int
-hexhex2nr(p)
-    char_u	*p;
+hexhex2nr(char_u *p)
 {
     if (!vim_isxdigit(p[0]) || !vim_isxdigit(p[1]))
 	return -1;
@@ -2064,8 +2007,7 @@
  * characters.
  */
     int
-rem_backslash(str)
-    char_u  *str;
+rem_backslash(char_u *str)
 {
 #ifdef BACKSLASH_IN_FILENAME
     return (str[0] == '\\'
@@ -2088,8 +2030,7 @@
  * is not a normal file character.
  */
     void
-backslash_halve(p)
-    char_u	*p;
+backslash_halve(char_u *p)
 {
     for ( ; *p; ++p)
 	if (rem_backslash(p))
@@ -2100,8 +2041,7 @@
  * backslash_halve() plus save the result in allocated memory.
  */
     char_u *
-backslash_halve_save(p)
-    char_u	*p;
+backslash_halve_save(char_u *p)
 {
     char_u	*res;
 
@@ -2159,9 +2099,7 @@
  * wanting 7-bit ASCII characters out the other end.
  */
     void
-ebcdic2ascii(buffer, len)
-    char_u	*buffer;
-    int		len;
+ebcdic2ascii(char_u *buffer, int len)
 {
     int		i;
 
diff --git a/src/crypt.c b/src/crypt.c
index f25a2c4..1c84e96 100644
--- a/src/crypt.c
+++ b/src/crypt.c
@@ -130,8 +130,7 @@
  * 2 for "blowfish2".
  */
     int
-crypt_method_nr_from_name(name)
-    char_u  *name;
+crypt_method_nr_from_name(char_u *name)
 {
     int i;
 
@@ -147,9 +146,7 @@
  * Returns -1 when no encryption used.
  */
     int
-crypt_method_nr_from_magic(ptr, len)
-    char  *ptr;
-    int   len;
+crypt_method_nr_from_magic(char *ptr, int len)
 {
     int i;
 
@@ -171,8 +168,7 @@
  * Return TRUE if the crypt method for "method_nr" can be done in-place.
  */
     int
-crypt_works_inplace(state)
-    cryptstate_T *state;
+crypt_works_inplace(cryptstate_T *state)
 {
     return cryptmethods[state->method_nr].works_inplace;
 }
@@ -181,8 +177,7 @@
  * Get the crypt method for buffer "buf" as a number.
  */
     int
-crypt_get_method_nr(buf)
-    buf_T *buf;
+crypt_get_method_nr(buf_T *buf)
 {
     return crypt_method_nr_from_name(*buf->b_p_cm == NUL ? p_cm : buf->b_p_cm);
 }
@@ -192,8 +187,7 @@
  * whole undo file, not only the text.
  */
     int
-crypt_whole_undofile(method_nr)
-    int method_nr;
+crypt_whole_undofile(int method_nr)
 {
     return cryptmethods[method_nr].whole_undofile;
 }
@@ -202,8 +196,7 @@
  * Get crypt method specifc length of the file header in bytes.
  */
     int
-crypt_get_header_len(method_nr)
-    int method_nr;
+crypt_get_header_len(int method_nr)
 {
     return CRYPT_MAGIC_LEN
 	+ cryptmethods[method_nr].salt_len
@@ -215,9 +208,7 @@
  * returned by crypt_method_nr_from_name().
  */
     void
-crypt_set_cm_option(buf, method_nr)
-    buf_T   *buf;
-    int	    method_nr;
+crypt_set_cm_option(buf_T *buf, int method_nr)
 {
     free_string_option(buf->b_p_cm);
     buf->b_p_cm = vim_strsave((char_u *)cryptmethods[method_nr].name);
@@ -228,7 +219,7 @@
  * return OK/FAIL.
  */
     int
-crypt_self_test()
+crypt_self_test(void)
 {
     int method_nr = crypt_get_method_nr(curbuf);
 
@@ -241,13 +232,13 @@
  * Allocate a crypt state and initialize it.
  */
     cryptstate_T *
-crypt_create(method_nr, key, salt, salt_len, seed, seed_len)
-    int		method_nr;
-    char_u	*key;
-    char_u	*salt;
-    int		salt_len;
-    char_u	*seed;
-    int		seed_len;
+crypt_create(
+    int		method_nr,
+    char_u	*key,
+    char_u	*salt,
+    int		salt_len,
+    char_u	*seed,
+    int		seed_len)
 {
     cryptstate_T *state = (cryptstate_T *)alloc((int)sizeof(cryptstate_T));
 
@@ -262,10 +253,10 @@
  * crypt_get_header_len() returns for "method_nr".
  */
     cryptstate_T *
-crypt_create_from_header(method_nr, key, header)
-    int		method_nr;
-    char_u	*key;
-    char_u	*header;
+crypt_create_from_header(
+    int		method_nr,
+    char_u	*key,
+    char_u	*header)
 {
     char_u	*salt = NULL;
     char_u	*seed = NULL;
@@ -285,9 +276,7 @@
  * Return an allocated cryptstate_T or NULL on error.
  */
     cryptstate_T *
-crypt_create_from_file(fp, key)
-    FILE    *fp;
-    char_u  *key;
+crypt_create_from_file(FILE *fp, char_u *key)
 {
     int		method_nr;
     int		header_len;
@@ -326,11 +315,11 @@
  * Returns the state or NULL on failure.
  */
     cryptstate_T *
-crypt_create_for_writing(method_nr, key, header, header_len)
-    int	    method_nr;
-    char_u  *key;
-    char_u  **header;
-    int	    *header_len;
+crypt_create_for_writing(
+    int	    method_nr,
+    char_u  *key,
+    char_u  **header,
+    int	    *header_len)
 {
     int	    len = crypt_get_header_len(method_nr);
     char_u  *salt = NULL;
@@ -371,8 +360,7 @@
  * Free the crypt state.
  */
     void
-crypt_free_state(state)
-    cryptstate_T	*state;
+crypt_free_state(cryptstate_T *state)
 {
     vim_free(state->method_state);
     vim_free(state);
@@ -384,11 +372,11 @@
  * Return number of bytes in "newptr", 0 for need more or -1 on error.
  */
     long
-crypt_encode_alloc(state, from, len, newptr)
-    cryptstate_T *state;
-    char_u	*from;
-    size_t	len;
-    char_u	**newptr;
+crypt_encode_alloc(
+    cryptstate_T *state,
+    char_u	*from,
+    size_t	len,
+    char_u	**newptr)
 {
     cryptmethod_T *method = &cryptmethods[state->method_nr];
 
@@ -412,11 +400,11 @@
  * Return number of bytes in "newptr", 0 for need more or -1 on error.
  */
     long
-crypt_decode_alloc(state, ptr, len, newptr)
-    cryptstate_T *state;
-    char_u	*ptr;
-    long	len;
-    char_u      **newptr;
+crypt_decode_alloc(
+    cryptstate_T *state,
+    char_u	*ptr,
+    long	len,
+    char_u      **newptr)
 {
     cryptmethod_T *method = &cryptmethods[state->method_nr];
 
@@ -439,11 +427,11 @@
  * Encrypting "from[len]" into "to[len]".
  */
     void
-crypt_encode(state, from, len, to)
-    cryptstate_T *state;
-    char_u	*from;
-    size_t	len;
-    char_u	*to;
+crypt_encode(
+    cryptstate_T *state,
+    char_u	*from,
+    size_t	len,
+    char_u	*to)
 {
     cryptmethods[state->method_nr].encode_fn(state, from, len, to);
 }
@@ -452,11 +440,11 @@
  * decrypting "from[len]" into "to[len]".
  */
     void
-crypt_decode(state, from, len, to)
-    cryptstate_T *state;
-    char_u	*from;
-    size_t	len;
-    char_u	*to;
+crypt_decode(
+    cryptstate_T *state,
+    char_u	*from,
+    size_t	len,
+    char_u	*to)
 {
     cryptmethods[state->method_nr].decode_fn(state, from, len, to);
 }
@@ -465,10 +453,10 @@
  * Simple inplace encryption, modifies "buf[len]" in place.
  */
     void
-crypt_encode_inplace(state, buf, len)
-    cryptstate_T *state;
-    char_u	*buf;
-    size_t	len;
+crypt_encode_inplace(
+    cryptstate_T *state,
+    char_u	*buf,
+    size_t	len)
 {
     cryptmethods[state->method_nr].encode_inplace_fn(state, buf, len, buf);
 }
@@ -477,10 +465,10 @@
  * Simple inplace decryption, modifies "buf[len]" in place.
  */
     void
-crypt_decode_inplace(state, buf, len)
-    cryptstate_T *state;
-    char_u	*buf;
-    size_t	len;
+crypt_decode_inplace(
+    cryptstate_T *state,
+    char_u	*buf,
+    size_t	len)
 {
     cryptmethods[state->method_nr].decode_inplace_fn(state, buf, len, buf);
 }
@@ -490,8 +478,7 @@
  * in memory anywhere.
  */
     void
-crypt_free_key(key)
-    char_u *key;
+crypt_free_key(char_u *key)
 {
     char_u *p;
 
@@ -507,8 +494,7 @@
  * Check the crypt method and give a warning if it's outdated.
  */
     void
-crypt_check_method(method)
-    int method;
+crypt_check_method(int method)
 {
     if (method < CRYPT_M_BF2)
     {
@@ -518,7 +504,7 @@
 }
 
     void
-crypt_check_current_method()
+crypt_check_current_method(void)
 {
     crypt_check_method(crypt_get_method_nr(curbuf));
 }
@@ -531,9 +517,9 @@
  * Returns NULL on failure.
  */
     char_u *
-crypt_get_key(store, twice)
-    int		store;
-    int		twice;	    /* Ask for the key twice. */
+crypt_get_key(
+    int		store,
+    int		twice)	    /* Ask for the key twice. */
 {
     char_u	*p1, *p2 = NULL;
     int		round;
@@ -589,8 +575,8 @@
  * Append a message to IObuff for the encryption/decryption method being used.
  */
     void
-crypt_append_msg(buf)
-    buf_T *buf;
+crypt_append_msg(
+    buf_T *buf)
 {
     if (crypt_get_method_nr(buf) == 0)
 	STRCAT(IObuff, _("[crypted]"));
diff --git a/src/crypt_zip.c b/src/crypt_zip.c
index f7b69b0..d109f5a 100644
--- a/src/crypt_zip.c
+++ b/src/crypt_zip.c
@@ -44,7 +44,7 @@
  * Fill the CRC table, if not done already.
  */
     static void
-make_crc_tab()
+make_crc_tab(void)
 {
     u32_T	s, t, v;
     static int	done = FALSE;
@@ -85,13 +85,13 @@
  * Initialize for encryption/decryption.
  */
     void
-crypt_zip_init(state, key, salt, salt_len, seed, seed_len)
-    cryptstate_T    *state;
-    char_u	    *key;
-    char_u	    *salt UNUSED;
-    int		    salt_len UNUSED;
-    char_u	    *seed UNUSED;
-    int		    seed_len UNUSED;
+crypt_zip_init(
+    cryptstate_T    *state,
+    char_u	    *key,
+    char_u	    *salt UNUSED,
+    int		    salt_len UNUSED,
+    char_u	    *seed UNUSED,
+    int		    seed_len UNUSED)
 {
     char_u	*p;
     zip_state_T	*zs;
@@ -114,11 +114,11 @@
  * "from" and "to" can be equal to encrypt in place.
  */
     void
-crypt_zip_encode(state, from, len, to)
-    cryptstate_T *state;
-    char_u	*from;
-    size_t	len;
-    char_u	*to;
+crypt_zip_encode(
+    cryptstate_T *state,
+    char_u	*from,
+    size_t	len,
+    char_u	*to)
 {
     zip_state_T *zs = state->method_state;
     size_t	i;
@@ -137,11 +137,11 @@
  * Decrypt "from[len]" into "to[len]".
  */
     void
-crypt_zip_decode(state, from, len, to)
-    cryptstate_T *state;
-    char_u	*from;
-    size_t	len;
-    char_u	*to;
+crypt_zip_decode(
+    cryptstate_T *state,
+    char_u	*from,
+    size_t	len,
+    char_u	*to)
 {
     zip_state_T *zs = state->method_state;
     size_t	i;
diff --git a/src/diff.c b/src/diff.c
index 035f0ad..db1d066 100644
--- a/src/diff.c
+++ b/src/diff.c
@@ -60,8 +60,7 @@
  * Called when deleting or unloading a buffer: No longer make a diff with it.
  */
     void
-diff_buf_delete(buf)
-    buf_T	*buf;
+diff_buf_delete(buf_T *buf)
 {
     int		i;
     tabpage_T	*tp;
@@ -84,8 +83,7 @@
  * diff buffers.
  */
     void
-diff_buf_adjust(win)
-    win_T	*win;
+diff_buf_adjust(win_T *win)
 {
     win_T	*wp;
     int		i;
@@ -121,8 +119,7 @@
  * about the screen contents.
  */
     void
-diff_buf_add(buf)
-    buf_T	*buf;
+diff_buf_add(buf_T *buf)
 {
     int		i;
 
@@ -146,8 +143,7 @@
  * Return its index or DB_COUNT if not found.
  */
     static int
-diff_buf_idx(buf)
-    buf_T	*buf;
+diff_buf_idx(buf_T *buf)
 {
     int		idx;
 
@@ -162,9 +158,7 @@
  * Return its index or DB_COUNT if not found.
  */
     static int
-diff_buf_idx_tp(buf, tp)
-    buf_T	*buf;
-    tabpage_T	*tp;
+diff_buf_idx_tp(buf_T *buf, tabpage_T *tp)
 {
     int		idx;
 
@@ -179,8 +173,7 @@
  * when info is requested.
  */
     void
-diff_invalidate(buf)
-    buf_T	*buf;
+diff_invalidate(buf_T *buf)
 {
     tabpage_T	*tp;
     int		i;
@@ -201,11 +194,11 @@
  * Called by mark_adjust(): update line numbers in "curbuf".
  */
     void
-diff_mark_adjust(line1, line2, amount, amount_after)
-    linenr_T	line1;
-    linenr_T	line2;
-    long	amount;
-    long	amount_after;
+diff_mark_adjust(
+    linenr_T	line1,
+    linenr_T	line2,
+    long	amount,
+    long	amount_after)
 {
     int		idx;
     tabpage_T	*tp;
@@ -227,13 +220,13 @@
  * When inserting/deleting lines in existing change blocks, update them.
  */
     static void
-diff_mark_adjust_tp(tp, idx, line1, line2, amount, amount_after)
-    tabpage_T	*tp;
-    int		idx;
-    linenr_T	line1;
-    linenr_T	line2;
-    long	amount;
-    long	amount_after;
+diff_mark_adjust_tp(
+    tabpage_T	*tp,
+    int		idx,
+    linenr_T	line1,
+    linenr_T	line2,
+    long	amount,
+    long	amount_after)
 {
     diff_T	*dp;
     diff_T	*dprev;
@@ -479,10 +472,7 @@
  * Allocate a new diff block and link it between "dprev" and "dp".
  */
     static diff_T *
-diff_alloc_new(tp, dprev, dp)
-    tabpage_T	*tp;
-    diff_T	*dprev;
-    diff_T	*dp;
+diff_alloc_new(tabpage_T *tp, diff_T *dprev, diff_T *dp)
 {
     diff_T	*dnew;
 
@@ -505,9 +495,7 @@
  * must take care of removing it.
  */
     static void
-diff_check_unchanged(tp, dp)
-    tabpage_T	*tp;
-    diff_T	*dp;
+diff_check_unchanged(tabpage_T *tp, diff_T *dp)
 {
     int		i_org;
     int		i_new;
@@ -581,9 +569,7 @@
  * This can happen when the diff program returns invalid results.
  */
     static int
-diff_check_sanity(tp, dp)
-    tabpage_T	*tp;
-    diff_T	*dp;
+diff_check_sanity(tabpage_T *tp, diff_T *dp)
 {
     int		i;
 
@@ -599,8 +585,8 @@
  * Mark all diff buffers in the current tab page for redraw.
  */
     static void
-diff_redraw(dofold)
-    int		dofold;	    /* also recompute the folds */
+diff_redraw(
+    int		dofold)	    /* also recompute the folds */
 {
     win_T	*wp;
     int		n;
@@ -633,9 +619,7 @@
  * Return FAIL for failure
  */
     static int
-diff_write(buf, fname)
-    buf_T	*buf;
-    char_u	*fname;
+diff_write(buf_T *buf, char_u *fname)
 {
     int		r;
     char_u	*save_ff;
@@ -656,8 +640,8 @@
  * could have been produced by autocommands, e.g. the netrw plugin).
  */
     void
-ex_diffupdate(eap)
-    exarg_T	*eap UNUSED;	    /* can be NULL */
+ex_diffupdate(
+    exarg_T	*eap UNUSED)	    /* can be NULL */
 {
     buf_T	*buf;
     int		idx_orig;
@@ -832,10 +816,10 @@
  * Make a diff between files "tmp_orig" and "tmp_new", results in "tmp_diff".
  */
     static void
-diff_file(tmp_orig, tmp_new, tmp_diff)
-    char_u	*tmp_orig;
-    char_u	*tmp_new;
-    char_u	*tmp_diff;
+diff_file(
+    char_u	*tmp_orig,
+    char_u	*tmp_new,
+    char_u	*tmp_diff)
 {
     char_u	*cmd;
     size_t	len;
@@ -888,8 +872,7 @@
  * could have been produced by autocommands, e.g. the netrw plugin).
  */
     void
-ex_diffpatch(eap)
-    exarg_T	*eap;
+ex_diffpatch(exarg_T *eap)
 {
     char_u	*tmp_orig;	/* name of original temp file */
     char_u	*tmp_new;	/* name of patched temp file */
@@ -1083,8 +1066,7 @@
  * Split the window and edit another file, setting options to show the diffs.
  */
     void
-ex_diffsplit(eap)
-    exarg_T	*eap;
+ex_diffsplit(exarg_T *eap)
 {
     win_T	*old_curwin = curwin;
     buf_T	*old_curbuf = curbuf;
@@ -1126,8 +1108,7 @@
  * Set options to show diffs for the current window.
  */
     void
-ex_diffthis(eap)
-    exarg_T	*eap UNUSED;
+ex_diffthis(exarg_T *eap UNUSED)
 {
     /* Set 'diff', 'scrollbind' on and 'wrap' off. */
     diff_win_options(curwin, TRUE);
@@ -1137,9 +1118,9 @@
  * Set options in window "wp" for diff mode.
  */
     void
-diff_win_options(wp, addbuf)
-    win_T	*wp;
-    int		addbuf;		/* Add buffer to diff. */
+diff_win_options(
+    win_T	*wp,
+    int		addbuf)		/* Add buffer to diff. */
 {
 # ifdef FEAT_FOLDING
     win_T *old_curwin = curwin;
@@ -1209,8 +1190,7 @@
  * Only in the current tab page.
  */
     void
-ex_diffoff(eap)
-    exarg_T	*eap;
+ex_diffoff(exarg_T *eap)
 {
     win_T	*wp;
 #ifdef FEAT_SCROLLBIND
@@ -1279,10 +1259,10 @@
  * Read the diff output and add each entry to the diff list.
  */
     static void
-diff_read(idx_orig, idx_new, fname)
-    int		idx_orig;	/* idx of original file */
-    int		idx_new;	/* idx of new file */
-    char_u	*fname;		/* name of diff output file */
+diff_read(
+    int		idx_orig,	/* idx of original file */
+    int		idx_new,	/* idx of new file */
+    char_u	*fname)		/* name of diff output file */
 {
     FILE	*fd;
     diff_T	*dprev = NULL;
@@ -1473,11 +1453,11 @@
  * Copy an entry at "dp" from "idx_orig" to "idx_new".
  */
     static void
-diff_copy_entry(dprev, dp, idx_orig, idx_new)
-    diff_T	*dprev;
-    diff_T	*dp;
-    int		idx_orig;
-    int		idx_new;
+diff_copy_entry(
+    diff_T	*dprev,
+    diff_T	*dp,
+    int		idx_orig,
+    int		idx_new)
 {
     long	off;
 
@@ -1494,8 +1474,7 @@
  * Clear the list of diffblocks for tab page "tp".
  */
     void
-diff_clear(tp)
-    tabpage_T	*tp;
+diff_clear(tabpage_T *tp)
 {
     diff_T	*p, *next_p;
 
@@ -1517,9 +1496,7 @@
  * This should only be used for windows where 'diff' is set.
  */
     int
-diff_check(wp, lnum)
-    win_T	*wp;
-    linenr_T	lnum;
+diff_check(win_T *wp, linenr_T lnum)
 {
     int		idx;		/* index in tp_diffbuf[] for this buffer */
     diff_T	*dp;
@@ -1611,10 +1588,7 @@
  * Compare two entries in diff "*dp" and return TRUE if they are equal.
  */
     static int
-diff_equal_entry(dp, idx1, idx2)
-    diff_T	*dp;
-    int		idx1;
-    int		idx2;
+diff_equal_entry(diff_T *dp, int idx1, int idx2)
 {
     int		i;
     char_u	*line;
@@ -1644,9 +1618,7 @@
  * Return non-zero when they are different.
  */
     static int
-diff_cmp(s1, s2)
-    char_u	*s1;
-    char_u	*s2;
+diff_cmp(char_u *s1, char_u *s2)
 {
     char_u	*p1, *p2;
 #ifdef FEAT_MBYTE
@@ -1709,9 +1681,7 @@
  * Return the number of filler lines above "lnum".
  */
     int
-diff_check_fill(wp, lnum)
-    win_T	*wp;
-    linenr_T	lnum;
+diff_check_fill(win_T *wp, linenr_T lnum)
 {
     int		n;
 
@@ -1729,9 +1699,7 @@
  * show the same diff'ed lines.
  */
     void
-diff_set_topline(fromwin, towin)
-    win_T	*fromwin;
-    win_T	*towin;
+diff_set_topline(win_T *fromwin, win_T *towin)
 {
     buf_T	*frombuf = fromwin->w_buffer;
     linenr_T	lnum = fromwin->w_topline;
@@ -1851,7 +1819,7 @@
  * This is called when 'diffopt' is changed.
  */
     int
-diffopt_changed()
+diffopt_changed(void)
 {
     char_u	*p;
     int		diff_context_new = 6;
@@ -1929,7 +1897,7 @@
  * Return TRUE if 'diffopt' contains "horizontal".
  */
     int
-diffopt_horizontal()
+diffopt_horizontal(void)
 {
     return (diff_flags & DIFF_HORIZONTAL) != 0;
 }
@@ -1939,11 +1907,11 @@
  * Returns TRUE if the line was added, no other buffer has it.
  */
     int
-diff_find_change(wp, lnum, startp, endp)
-    win_T	*wp;
-    linenr_T	lnum;
-    int		*startp;	/* first char of the change */
-    int		*endp;		/* last char of the change */
+diff_find_change(
+    win_T	*wp,
+    linenr_T	lnum,
+    int		*startp,	/* first char of the change */
+    int		*endp)		/* last char of the change */
 {
     char_u	*line_org;
     char_u	*line_new;
@@ -2063,9 +2031,7 @@
  * Return FALSE if there are no diff blocks at all in this window.
  */
     int
-diff_infold(wp, lnum)
-    win_T	*wp;
-    linenr_T	lnum;
+diff_infold(win_T *wp, linenr_T lnum)
 {
     int		i;
     int		idx = -1;
@@ -2112,9 +2078,7 @@
  * "dp" and "do" commands.
  */
     void
-nv_diffgetput(put, count)
-    int		put;
-    long	count;
+nv_diffgetput(int put, long count)
 {
     exarg_T	ea;
     char_u	buf[30];
@@ -2141,8 +2105,7 @@
  * ":diffput"
  */
     void
-ex_diffgetput(eap)
-    exarg_T	*eap;
+ex_diffgetput(exarg_T *eap)
 {
     linenr_T	lnum;
     int		count;
@@ -2464,9 +2427,7 @@
  * When there are no diffs, all folds are removed.
  */
     static void
-diff_fold_update(dp, skip_idx)
-    diff_T	*dp;
-    int		skip_idx;
+diff_fold_update(diff_T *dp, int skip_idx)
 {
     int		i;
     win_T	*wp;
@@ -2483,8 +2444,7 @@
  * Return TRUE if buffer "buf" is in diff-mode.
  */
     int
-diff_mode_buf(buf)
-    buf_T	*buf;
+diff_mode_buf(buf_T *buf)
 {
     tabpage_T	*tp;
 
@@ -2499,9 +2459,7 @@
  * Return FAIL if there isn't such a diff block.
  */
     int
-diff_move_to(dir, count)
-    int		dir;
-    long	count;
+diff_move_to(int dir, long count)
 {
     int		idx;
     linenr_T	lnum = curwin->w_cursor.lnum;
@@ -2554,11 +2512,11 @@
 }
 
     linenr_T
-diff_get_corresponding_line(buf1, lnum1, buf2, lnum3)
-    buf_T	*buf1;
-    linenr_T	lnum1;
-    buf_T	*buf2;
-    linenr_T	lnum3;
+diff_get_corresponding_line(
+    buf_T	*buf1,
+    linenr_T	lnum1,
+    buf_T	*buf2,
+    linenr_T	lnum3)
 {
     int		idx1;
     int		idx2;
@@ -2628,9 +2586,7 @@
  * "wp", compensating for inserted/deleted lines.
  */
     linenr_T
-diff_lnum_win(lnum, wp)
-    linenr_T	lnum;
-    win_T	*wp;
+diff_lnum_win(linenr_T lnum, win_T *wp)
 {
     diff_T	*dp;
     int		idx;
diff --git a/src/digraph.c b/src/digraph.c
index 5814ab2..2195d64 100644
--- a/src/digraph.c
+++ b/src/digraph.c
@@ -2013,8 +2013,7 @@
  * handle digraphs after typing a character
  */
     int
-do_digraph(c)
-    int	    c;
+do_digraph(int c)
 {
     static int	backspaced;	/* character before K_BS */
     static int	lastchar;	/* last typed character */
@@ -2041,8 +2040,8 @@
  * Returns composed character, or NUL when ESC was used.
  */
     int
-get_digraph(cmdline)
-    int		cmdline;	/* TRUE when called from the cmdline */
+get_digraph(
+    int		cmdline)	/* TRUE when called from the cmdline */
 {
     int		c, cc;
 
@@ -2085,10 +2084,7 @@
  * If "meta_char" is TRUE and "char1" is a space, return "char2" | 0x80.
  */
     static int
-getexactdigraph(char1, char2, meta_char)
-    int		char1;
-    int		char2;
-    int		meta_char;
+getexactdigraph(int char1, int char2, int meta_char)
 {
     int		i;
     int		retval = 0;
@@ -2173,10 +2169,7 @@
  * Allow for both char1-char2 and char2-char1
  */
     int
-getdigraph(char1, char2, meta_char)
-    int	char1;
-    int	char2;
-    int	meta_char;
+getdigraph(int char1, int char2, int meta_char)
 {
     int	    retval;
 
@@ -2192,8 +2185,7 @@
  * format: {c1}{c2} char {c1}{c2} char ...
  */
     void
-putdigraph(str)
-    char_u *str;
+putdigraph(char_u *str)
 {
     int		char1, char2, n;
     int		i;
@@ -2252,7 +2244,7 @@
 }
 
     void
-listdigraphs()
+listdigraphs(void)
 {
     int		i;
     digr_T	*dp;
@@ -2297,8 +2289,7 @@
 }
 
     static void
-printdigraph(dp)
-    digr_T	*dp;
+printdigraph(digr_T *dp)
 {
     char_u	buf[30];
     char_u	*p;
@@ -2366,7 +2357,7 @@
  * checked.
  */
     char_u *
-keymap_init()
+keymap_init(void)
 {
     curbuf->b_kmap_state &= ~KEYMAP_INIT;
 
@@ -2419,8 +2410,7 @@
  * ":loadkeymap" command: load the following lines as the keymap.
  */
     void
-ex_loadkeymap(eap)
-    exarg_T	*eap;
+ex_loadkeymap(exarg_T *eap)
 {
     char_u	*line;
     char_u	*p;
@@ -2505,7 +2495,7 @@
  * Stop using 'keymap'.
  */
     static void
-keymap_unload()
+keymap_unload(void)
 {
     char_u	buf[KMAP_MAXLEN + 10];
     int		i;
diff --git a/src/edit.c b/src/edit.c
index 72edd53..4edf4f4 100644
--- a/src/edit.c
+++ b/src/edit.c
@@ -321,10 +321,10 @@
  * Return TRUE if a CTRL-O command caused the return (insert mode pending).
  */
     int
-edit(cmdchar, startln, count)
-    int		cmdchar;
-    int		startln;	/* if set, insert at start of line */
-    long	count;
+edit(
+    int		cmdchar,
+    int		startln,	/* if set, insert at start of line */
+    long	count)
 {
     int		c = 0;
     char_u	*ptr;
@@ -1569,8 +1569,8 @@
  * inserting sequences of characters (e.g., for CTRL-R).
  */
     static void
-ins_redraw(ready)
-    int		ready UNUSED;	    /* not busy with something */
+ins_redraw(
+    int		ready UNUSED)	    /* not busy with something */
 {
 #ifdef FEAT_CONCEAL
     linenr_T	conceal_old_cursor_line = 0;
@@ -1667,7 +1667,7 @@
  * Handle a CTRL-V or CTRL-Q typed in Insert mode.
  */
     static void
-ins_ctrl_v()
+ins_ctrl_v(void)
 {
     int		c;
     int		did_putchar = FALSE;
@@ -1716,9 +1716,7 @@
 static int  pc_col;
 
     void
-edit_putchar(c, highlight)
-    int	    c;
-    int	    highlight;
+edit_putchar(int c, int highlight)
 {
     int	    attr;
 
@@ -1779,7 +1777,7 @@
  * Undo the previous edit_putchar().
  */
     void
-edit_unputchar()
+edit_unputchar(void)
 {
     if (pc_status != PC_STATUS_UNSET && pc_row >= msg_scrolled)
     {
@@ -1799,8 +1797,7 @@
  * Only works when cursor is in the line that changes.
  */
     void
-display_dollar(col)
-    colnr_T	col;
+display_dollar(colnr_T col)
 {
     colnr_T save_col;
 
@@ -1834,7 +1831,7 @@
  * in insert mode.
  */
     static void
-undisplay_dollar()
+undisplay_dollar(void)
 {
     if (dollar_vcol >= 0)
     {
@@ -1852,12 +1849,12 @@
  * if round is TRUE, round the indent to 'shiftwidth' (only with _INC and _Dec).
  */
     void
-change_indent(type, amount, round, replaced, call_changed_bytes)
-    int		type;
-    int		amount;
-    int		round;
-    int		replaced;	/* replaced character, put on replace stack */
-    int		call_changed_bytes;	/* call changed_bytes() */
+change_indent(
+    int		type,
+    int		amount,
+    int		round,
+    int		replaced,	/* replaced character, put on replace stack */
+    int		call_changed_bytes)	/* call changed_bytes() */
 {
     int		vcol;
     int		last_vcol;
@@ -2101,8 +2098,7 @@
  * modes.
  */
     void
-truncate_spaces(line)
-    char_u  *line;
+truncate_spaces(char_u *line)
 {
     int	    i;
 
@@ -2124,8 +2120,7 @@
  * character.
  */
     void
-backspace_until_column(col)
-    int	    col;
+backspace_until_column(int col)
 {
     while ((int)curwin->w_cursor.col > col)
     {
@@ -2144,8 +2139,7 @@
  * Return TRUE when something was deleted.
  */
    static int
-del_char_after_col(limit_col)
-    int limit_col UNUSED;
+del_char_after_col(int limit_col UNUSED)
 {
 #ifdef FEAT_MBYTE
     if (enc_utf8 && limit_col >= 0)
@@ -2179,7 +2173,7 @@
  * CTRL-X pressed in Insert mode.
  */
     static void
-ins_ctrl_x()
+ins_ctrl_x(void)
 {
     /* CTRL-X after CTRL-X CTRL-V doesn't do anything, so that CTRL-X
      * CTRL-V works like CTRL-N */
@@ -2203,8 +2197,7 @@
  * Return TRUE if the 'dict' or 'tsr' option can be used.
  */
     static int
-has_compl_option(dict_opt)
-    int	    dict_opt;
+has_compl_option(int dict_opt)
 {
     if (dict_opt ? (*curbuf->b_p_dict == NUL && *p_dict == NUL
 # ifdef FEAT_SPELL
@@ -2235,8 +2228,7 @@
  * This depends on the current mode.
  */
     int
-vim_is_ctrl_x_key(c)
-    int	    c;
+vim_is_ctrl_x_key(int c)
 {
     /* Always allow ^R - let it's results then be checked */
     if (c == Ctrl_R)
@@ -2299,8 +2291,7 @@
  * is visible.
  */
     static int
-ins_compl_accept_char(c)
-    int c;
+ins_compl_accept_char(int c)
 {
     if (ctrl_x_mode & CTRL_X_WANT_IDENT)
 	/* When expanding an identifier only accept identifier chars. */
@@ -2334,13 +2325,13 @@
  * the rest of the word to be in -- webb
  */
     int
-ins_compl_add_infercase(str, len, icase, fname, dir, flags)
-    char_u	*str;
-    int		len;
-    int		icase;
-    char_u	*fname;
-    int		dir;
-    int		flags;
+ins_compl_add_infercase(
+    char_u	*str,
+    int		len,
+    int		icase,
+    char_u	*fname,
+    int		dir,
+    int		flags)
 {
     char_u	*p;
     int		i, c;
@@ -2503,15 +2494,15 @@
  * maybe because alloc() returns NULL, then FAIL is returned.
  */
     static int
-ins_compl_add(str, len, icase, fname, cptext, cdir, flags, adup)
-    char_u	*str;
-    int		len;
-    int		icase;
-    char_u	*fname;
-    char_u	**cptext;   /* extra text for popup menu or NULL */
-    int		cdir;
-    int		flags;
-    int		adup;	    /* accept duplicate match */
+ins_compl_add(
+    char_u	*str,
+    int		len,
+    int		icase,
+    char_u	*fname,
+    char_u	**cptext,   /* extra text for popup menu or NULL */
+    int		cdir,
+    int		flags,
+    int		adup)	    /* accept duplicate match */
 {
     compl_T	*match;
     int		dir = (cdir == 0 ? compl_direction : cdir);
@@ -2622,10 +2613,7 @@
  * match->cp_icase.
  */
     static int
-ins_compl_equal(match, str, len)
-    compl_T	*match;
-    char_u	*str;
-    int		len;
+ins_compl_equal(compl_T *match, char_u *str, int len)
 {
     if (match->cp_icase)
 	return STRNICMP(match->cp_str, str, (size_t)len) == 0;
@@ -2636,8 +2624,7 @@
  * Reduce the longest common string for match "match".
  */
     static void
-ins_compl_longest_match(match)
-    compl_T	*match;
+ins_compl_longest_match(compl_T *match)
 {
     char_u	*p, *s;
     int		c1, c2;
@@ -2721,10 +2708,10 @@
  * Frees matches[].
  */
     static void
-ins_compl_add_matches(num_matches, matches, icase)
-    int		num_matches;
-    char_u	**matches;
-    int		icase;
+ins_compl_add_matches(
+    int		num_matches,
+    char_u	**matches,
+    int		icase)
 {
     int		i;
     int		add_r = OK;
@@ -2742,7 +2729,7 @@
  * Return the number of matches (excluding the original).
  */
     static int
-ins_compl_make_cyclic()
+ins_compl_make_cyclic(void)
 {
     compl_T *match;
     int	    count = 0;
@@ -2771,9 +2758,7 @@
  * "list" is the list of matches.
  */
     void
-set_completion(startcol, list)
-    colnr_T startcol;
-    list_T  *list;
+set_completion(colnr_T startcol, list_T *list)
 {
     /* If already doing completions stop it. */
     if (ctrl_x_mode != 0)
@@ -2822,7 +2807,7 @@
  * Update the screen and when there is any scrolling remove the popup menu.
  */
     static void
-ins_compl_upd_pum()
+ins_compl_upd_pum(void)
 {
     int		h;
 
@@ -2839,7 +2824,7 @@
  * Remove any popup menu.
  */
     static void
-ins_compl_del_pum()
+ins_compl_del_pum(void)
 {
     if (compl_match_array != NULL)
     {
@@ -2853,7 +2838,7 @@
  * Return TRUE if the popup menu should be displayed.
  */
     static int
-pum_wanted()
+pum_wanted(void)
 {
     /* 'completeopt' must contain "menu" or "menuone" */
     if (vim_strchr(p_cot, 'm') == NULL)
@@ -2874,7 +2859,7 @@
  * One if 'completopt' contains "menuone".
  */
     static int
-pum_enough_matches()
+pum_enough_matches(void)
 {
     compl_T     *compl;
     int		i;
@@ -2901,7 +2886,7 @@
  * Also adjusts "compl_shown_match" to an entry that is actually displayed.
  */
     void
-ins_compl_show_pum()
+ins_compl_show_pum(void)
 {
     compl_T     *compl;
     compl_T     *shown_compl = NULL;
@@ -3049,11 +3034,11 @@
  * files "dict_start" to the list of completions.
  */
     static void
-ins_compl_dictionaries(dict_start, pat, flags, thesaurus)
-    char_u	*dict_start;
-    char_u	*pat;
-    int		flags;		/* DICT_FIRST and/or DICT_EXACT */
-    int		thesaurus;	/* Thesaurus completion */
+ins_compl_dictionaries(
+    char_u	*dict_start,
+    char_u	*pat,
+    int		flags,		/* DICT_FIRST and/or DICT_EXACT */
+    int		thesaurus)	/* Thesaurus completion */
 {
     char_u	*dict = dict_start;
     char_u	*ptr;
@@ -3173,14 +3158,14 @@
 }
 
     static void
-ins_compl_files(count, files, thesaurus, flags, regmatch, buf, dir)
-    int		count;
-    char_u	**files;
-    int		thesaurus;
-    int		flags;
-    regmatch_T	*regmatch;
-    char_u	*buf;
-    int		*dir;
+ins_compl_files(
+    int		count,
+    char_u	**files,
+    int		thesaurus,
+    int		flags,
+    regmatch_T	*regmatch,
+    char_u	*buf,
+    int		*dir)
 {
     char_u	*ptr;
     int		i;
@@ -3282,8 +3267,7 @@
  * Returns a pointer to the first char of the word.  Also stops at a NUL.
  */
     char_u *
-find_word_start(ptr)
-    char_u	*ptr;
+find_word_start(char_u *ptr)
 {
 #ifdef FEAT_MBYTE
     if (has_mbyte)
@@ -3301,8 +3285,7 @@
  * Returns a pointer to just after the word.
  */
     char_u *
-find_word_end(ptr)
-    char_u	*ptr;
+find_word_end(char_u *ptr)
 {
 #ifdef FEAT_MBYTE
     int		start_class;
@@ -3330,8 +3313,7 @@
  * Returns a pointer to just after the line.
  */
     static char_u *
-find_line_end(ptr)
-    char_u	*ptr;
+find_line_end(char_u *ptr)
 {
     char_u	*s;
 
@@ -3345,7 +3327,7 @@
  * Free the list of completions
  */
     static void
-ins_compl_free()
+ins_compl_free(void)
 {
     compl_T *match;
     int	    i;
@@ -3379,7 +3361,7 @@
 }
 
     static void
-ins_compl_clear()
+ins_compl_clear(void)
 {
     compl_cont_status = 0;
     compl_started = FALSE;
@@ -3400,7 +3382,7 @@
  * Return TRUE when Insert completion is active.
  */
     int
-ins_compl_active()
+ins_compl_active(void)
 {
     return compl_started;
 }
@@ -3412,7 +3394,7 @@
  * to be got from the user.
  */
     static int
-ins_compl_bs()
+ins_compl_bs(void)
 {
     char_u	*line;
     char_u	*p;
@@ -3452,7 +3434,7 @@
  * be called.
  */
     static int
-ins_compl_need_restart()
+ins_compl_need_restart(void)
 {
     /* Return TRUE if we didn't complete finding matches or when the
      * 'completefunc' returned "always" in the "refresh" dictionary item. */
@@ -3467,7 +3449,7 @@
  * May also search for matches again if the previous search was interrupted.
  */
     static void
-ins_compl_new_leader()
+ins_compl_new_leader(void)
 {
     ins_compl_del_pum();
     ins_compl_delete();
@@ -3517,7 +3499,7 @@
  * the cursor column.  Making sure it never goes below zero.
  */
     static int
-ins_compl_len()
+ins_compl_len(void)
 {
     int off = (int)curwin->w_cursor.col - (int)compl_col;
 
@@ -3531,8 +3513,7 @@
  * matches.
  */
     static void
-ins_compl_addleader(c)
-    int		c;
+ins_compl_addleader(int c)
 {
 #ifdef FEAT_MBYTE
     int		cc;
@@ -3577,7 +3558,7 @@
  * BS or a key was typed while still searching for matches.
  */
     static void
-ins_compl_restart()
+ins_compl_restart(void)
 {
     ins_compl_free();
     compl_started = FALSE;
@@ -3590,8 +3571,7 @@
  * Set the first match, the original text.
  */
     static void
-ins_compl_set_original_text(str)
-    char_u	*str;
+ins_compl_set_original_text(char_u *str)
 {
     char_u	*p;
 
@@ -3612,7 +3592,7 @@
  * matches.
  */
     static void
-ins_compl_addfrommatch()
+ins_compl_addfrommatch(void)
 {
     char_u	*p;
     int		len = (int)curwin->w_cursor.col - (int)compl_col;
@@ -3655,8 +3635,7 @@
  * Returns TRUE when the character is not to be inserted;
  */
     static int
-ins_compl_prep(c)
-    int	    c;
+ins_compl_prep(int c)
 {
     char_u	*ptr;
     int		want_cindent;
@@ -3947,8 +3926,7 @@
  * "ptr" is the known leader text or NUL.
  */
     static void
-ins_compl_fixRedoBufForLeader(ptr_arg)
-    char_u *ptr_arg;
+ins_compl_fixRedoBufForLeader(char_u *ptr_arg)
 {
     int	    len;
     char_u  *p;
@@ -3988,9 +3966,7 @@
  * Returns the buffer to scan, if any, otherwise returns curbuf -- Acevedo
  */
     static buf_T *
-ins_compl_next_buf(buf, flag)
-    buf_T	*buf;
-    int		flag;
+ins_compl_next_buf(buf_T *buf, int flag)
 {
 #ifdef FEAT_WINDOWS
     static win_T *wp;
@@ -4031,9 +4007,9 @@
  * get matches in "matches".
  */
     static void
-expand_by_function(type, base)
-    int		type;	    /* CTRL_X_OMNI or CTRL_X_FUNCTION */
-    char_u	*base;
+expand_by_function(
+    int		type,	    /* CTRL_X_OMNI or CTRL_X_FUNCTION */
+    char_u	*base)
 {
     list_T      *matchlist = NULL;
     dict_T	*matchdict = NULL;
@@ -4105,8 +4081,7 @@
  * Add completions from a list.
  */
     static void
-ins_compl_add_list(list)
-    list_T	*list;
+ins_compl_add_list(list_T *list)
 {
     listitem_T	*li;
     int		dir = compl_direction;
@@ -4126,8 +4101,7 @@
  * Add completions from a dict.
  */
     static void
-ins_compl_add_dict(dict)
-    dict_T	*dict;
+ins_compl_add_dict(dict_T *dict)
 {
     dictitem_T	*di_refresh;
     dictitem_T	*di_words;
@@ -4156,9 +4130,7 @@
  * maybe because alloc() returns NULL, then FAIL is returned.
  */
     int
-ins_compl_add_tv(tv, dir)
-    typval_T	*tv;
-    int		dir;
+ins_compl_add_tv(typval_T *tv, int dir)
 {
     char_u	*word;
     int		icase = FALSE;
@@ -4205,8 +4177,7 @@
  * Return the total number of matches or -1 if still unknown -- Acevedo
  */
     static int
-ins_compl_get_exp(ini)
-    pos_T	*ini;
+ins_compl_get_exp(pos_T *ini)
 {
     static pos_T	first_match_pos;
     static pos_T	last_match_pos;
@@ -4628,7 +4599,7 @@
 
 /* Delete the old text being completed. */
     static void
-ins_compl_delete()
+ins_compl_delete(void)
 {
     int	    i;
 
@@ -4648,7 +4619,7 @@
 
 /* Insert the new text being completed. */
     static void
-ins_compl_insert()
+ins_compl_insert(void)
 {
     dict_T	*dict;
 
@@ -4694,11 +4665,11 @@
  * calls this function with "allow_get_expansion" FALSE.
  */
     static int
-ins_compl_next(allow_get_expansion, count, insert_match)
-    int	    allow_get_expansion;
-    int	    count;		/* repeat completion this many times; should
+ins_compl_next(
+    int	    allow_get_expansion,
+    int	    count,		/* repeat completion this many times; should
 				   be at least 1 */
-    int	    insert_match;	/* Insert the newly selected match */
+    int	    insert_match)	/* Insert the newly selected match */
 {
     int	    num_matches = -1;
     int	    i;
@@ -4915,8 +4886,7 @@
  * "frequency" specifies out of how many calls we actually check.
  */
     void
-ins_compl_check_keys(frequency)
-    int		frequency;
+ins_compl_check_keys(int frequency)
 {
     static int	count = 0;
 
@@ -4974,8 +4944,7 @@
  * Returns BACKWARD or FORWARD.
  */
     static int
-ins_compl_key2dir(c)
-    int		c;
+ins_compl_key2dir(int c)
 {
     if (c == Ctrl_P || c == Ctrl_L
 	    || (pum_visible() && (c == K_PAGEUP || c == K_KPAGEUP
@@ -4989,8 +4958,7 @@
  * is visible.
  */
     static int
-ins_compl_pum_key(c)
-    int		c;
+ins_compl_pum_key(int c)
 {
     return pum_visible() && (c == K_PAGEUP || c == K_KPAGEUP || c == K_S_UP
 		     || c == K_PAGEDOWN || c == K_KPAGEDOWN || c == K_S_DOWN
@@ -5002,8 +4970,7 @@
  * Returns 1 for most keys, height of the popup menu for page-up/down keys.
  */
     static int
-ins_compl_key2count(c)
-    int		c;
+ins_compl_key2count(int c)
 {
     int		h;
 
@@ -5022,8 +4989,7 @@
  * to change the currently selected completion.
  */
     static int
-ins_compl_use_match(c)
-    int		c;
+ins_compl_use_match(int c)
 {
     switch (c)
     {
@@ -5046,8 +5012,7 @@
  * Returns OK if completion was done, FAIL if something failed (out of mem).
  */
     static int
-ins_complete(c)
-    int		c;
+ins_complete(int c)
 {
     char_u	*line;
     int		startcol = 0;	    /* column where searched text starts */
@@ -5668,10 +5633,7 @@
  * Returns the length (needed) of dest
  */
     static unsigned
-quote_meta(dest, src, len)
-    char_u	*dest;
-    char_u	*src;
-    int		len;
+quote_meta(char_u *dest, char_u *src, int len)
 {
     unsigned	m = (unsigned)len + 1;  /* one extra for the NUL */
 
@@ -5733,7 +5695,7 @@
  * For Unicode a character > 255 may be returned.
  */
     int
-get_literal()
+get_literal(void)
 {
     int		cc;
     int		nc;
@@ -5870,10 +5832,10 @@
  * Insert character, taking care of special keys and mod_mask
  */
     static void
-insert_special(c, allow_modmask, ctrlv)
-    int	    c;
-    int	    allow_modmask;
-    int	    ctrlv;	    /* c was typed after CTRL-V */
+insert_special(
+    int	    c,
+    int	    allow_modmask,
+    int	    ctrlv)	    /* c was typed after CTRL-V */
 {
     char_u  *p;
     int	    len;
@@ -5941,10 +5903,10 @@
  *	    INSCHAR_COM_LIST - format comments with num list or 2nd line indent
  */
     void
-insertchar(c, flags, second_indent)
-    int		c;			/* character to insert or NUL */
-    int		flags;			/* INSCHAR_FORMAT, etc. */
-    int		second_indent;		/* indent for second line if >= 0 */
+insertchar(
+    int		c,			/* character to insert or NUL */
+    int		flags,			/* INSCHAR_FORMAT, etc. */
+    int		second_indent)		/* indent for second line if >= 0 */
 {
     int		textwidth;
 #ifdef FEAT_COMMENTS
@@ -6191,12 +6153,12 @@
  * will be the comment leader length sent to open_line().
  */
     static void
-internal_format(textwidth, second_indent, flags, format_only, c)
-    int		textwidth;
-    int		second_indent;
-    int		flags;
-    int		format_only;
-    int		c; /* character to be inserted (can be NUL) */
+internal_format(
+    int		textwidth,
+    int		second_indent,
+    int		flags,
+    int		format_only,
+    int		c) /* character to be inserted (can be NUL) */
 {
     int		cc;
     int		save_char = NUL;
@@ -6588,9 +6550,9 @@
  * saved here.
  */
     void
-auto_format(trailblank, prev_line)
-    int		trailblank;	/* when TRUE also format with trailing blank */
-    int		prev_line;	/* may start in previous line */
+auto_format(
+    int		trailblank,	/* when TRUE also format with trailing blank */
+    int		prev_line)	/* may start in previous line */
 {
     pos_T	pos;
     colnr_T	len;
@@ -6699,8 +6661,8 @@
  * position.
  */
     static void
-check_auto_format(end_insert)
-    int		end_insert;	    /* TRUE when ending Insert mode */
+check_auto_format(
+    int		end_insert)	    /* TRUE when ending Insert mode */
 {
     int		c = ' ';
     int		cc;
@@ -6737,8 +6699,8 @@
  *	Set default to window width (maximum 79) for "gq" operator.
  */
     int
-comp_textwidth(ff)
-    int		ff;	/* force formatting (for "gq" command) */
+comp_textwidth(
+    int		ff)	/* force formatting (for "gq" command) */
 {
     int		textwidth;
 
@@ -6781,8 +6743,7 @@
  * Put a character in the redo buffer, for when just after a CTRL-V.
  */
     static void
-redo_literal(c)
-    int	    c;
+redo_literal(int c)
 {
     char_u	buf[10];
 
@@ -6802,8 +6763,8 @@
  * For undo/redo it resembles hitting the <ESC> key.
  */
     static void
-start_arrow(end_insert_pos)
-    pos_T    *end_insert_pos;		/* can be NULL */
+start_arrow(
+    pos_T    *end_insert_pos)		/* can be NULL */
 {
     start_arrow_common(end_insert_pos, TRUE);
 }
@@ -6813,9 +6774,9 @@
  * Will prepare for redo of CTRL-G U if "end_change" is FALSE.
  */
     static void
-start_arrow_with_change(end_insert_pos, end_change)
-    pos_T    *end_insert_pos;		/* can be NULL */
-    int	      end_change;		/* end undoable change */
+start_arrow_with_change(
+    pos_T    *end_insert_pos,		/* can be NULL */
+    int	      end_change)		/* end undoable change */
 {
     start_arrow_common(end_insert_pos, end_change);
     if (!end_change)
@@ -6826,9 +6787,9 @@
 }
 
     static void
-start_arrow_common(end_insert_pos, end_change)
-    pos_T    *end_insert_pos;		/* can be NULL */
-    int	      end_change;		/* end undoable change */
+start_arrow_common(
+    pos_T    *end_insert_pos,		/* can be NULL */
+    int	      end_change)		/* end undoable change */
 {
     if (!arrow_used && end_change)	/* something has been inserted */
     {
@@ -6847,7 +6808,7 @@
  * It may be skipped again, thus reset spell_redraw_lnum first.
  */
     static void
-check_spell_redraw()
+check_spell_redraw(void)
 {
     if (spell_redraw_lnum != 0)
     {
@@ -6863,7 +6824,7 @@
  * spelled word, if there is one.
  */
     static void
-spell_back_to_badword()
+spell_back_to_badword(void)
 {
     pos_T	tpos = curwin->w_cursor;
 
@@ -6879,7 +6840,7 @@
  * Returns FAIL if undo is impossible, shouldn't insert then.
  */
     int
-stop_arrow()
+stop_arrow(void)
 {
     if (arrow_used)
     {
@@ -6928,10 +6889,10 @@
  * to another window/buffer.
  */
     static void
-stop_insert(end_insert_pos, esc, nomove)
-    pos_T	*end_insert_pos;
-    int		esc;			/* called by ins_esc() */
-    int		nomove;			/* <c-\><c-o>, don't move cursor */
+stop_insert(
+    pos_T	*end_insert_pos,
+    int		esc,			/* called by ins_esc() */
+    int		nomove)			/* <c-\><c-o>, don't move cursor */
 {
     int		cc;
     char_u	*ptr;
@@ -7069,8 +7030,7 @@
  * Used for the replace command.
  */
     void
-set_last_insert(c)
-    int		c;
+set_last_insert(int c)
 {
     char_u	*s;
 
@@ -7091,7 +7051,7 @@
 
 #if defined(EXITFREE) || defined(PROTO)
     void
-free_last_insert()
+free_last_insert(void)
 {
     vim_free(last_insert);
     last_insert = NULL;
@@ -7108,9 +7068,7 @@
  * Returns a pointer to after the added bytes.
  */
     char_u *
-add_char2buf(c, s)
-    int		c;
-    char_u	*s;
+add_char2buf(int c, char_u *s)
 {
 #ifdef FEAT_MBYTE
     char_u	temp[MB_MAXBYTES + 1];
@@ -7153,8 +7111,7 @@
  * if flags & BL_FIX	don't leave the cursor on a NUL.
  */
     void
-beginline(flags)
-    int		flags;
+beginline(int flags)
 {
     if ((flags & BL_SOL) && !p_sol)
 	coladvance(curwin->w_curswant);
@@ -7186,7 +7143,7 @@
  */
 
     int
-oneright()
+oneright(void)
 {
     char_u	*ptr;
     int		l;
@@ -7239,7 +7196,7 @@
 }
 
     int
-oneleft()
+oneleft(void)
 {
 #ifdef FEAT_VIRTUALEDIT
     if (virtual_active())
@@ -7308,9 +7265,9 @@
 }
 
     int
-cursor_up(n, upd_topline)
-    long	n;
-    int		upd_topline;	    /* When TRUE: update topline */
+cursor_up(
+    long	n,
+    int		upd_topline)	    /* When TRUE: update topline */
 {
     linenr_T	lnum;
 
@@ -7367,9 +7324,9 @@
  * Cursor down a number of logical lines.
  */
     int
-cursor_down(n, upd_topline)
-    long	n;
-    int		upd_topline;	    /* When TRUE: update topline */
+cursor_down(
+    long	n,
+    int		upd_topline)	    /* When TRUE: update topline */
 {
     linenr_T	lnum;
 
@@ -7428,10 +7385,10 @@
  * first have to remove the command.
  */
     int
-stuff_inserted(c, count, no_esc)
-    int	    c;		/* Command character to be inserted */
-    long    count;	/* Repeat this many times */
-    int	    no_esc;	/* Don't add an ESC at the end */
+stuff_inserted(
+    int	    c,		/* Command character to be inserted */
+    long    count,	/* Repeat this many times */
+    int	    no_esc)	/* Don't add an ESC at the end */
 {
     char_u	*esc_ptr;
     char_u	*ptr;
@@ -7488,7 +7445,7 @@
 }
 
     char_u *
-get_last_insert()
+get_last_insert(void)
 {
     if (last_insert == NULL)
 	return NULL;
@@ -7500,7 +7457,7 @@
  * Returns pointer to allocated memory (must be freed) or NULL.
  */
     char_u *
-get_last_insert_save()
+get_last_insert_save(void)
 {
     char_u	*s;
     int		len;
@@ -7524,8 +7481,7 @@
  * the replacement string is inserted in typebuf.tb_buf[], followed by "c".
  */
     static int
-echeck_abbr(c)
-    int c;
+echeck_abbr(int c)
 {
     /* Don't check for abbreviation in paste mode, when disabled and just
      * after moving around with cursor keys. */
@@ -7560,8 +7516,8 @@
 static long	replace_stack_len = 0;	    /* max. number of entries */
 
     void
-replace_push(c)
-    int	    c;	    /* character that is replaced (NUL is none) */
+replace_push(
+    int	    c)	    /* character that is replaced (NUL is none) */
 {
     char_u  *p;
 
@@ -7598,8 +7554,7 @@
  * Return the number of bytes done (includes composing characters).
  */
     int
-replace_push_mb(p)
-    char_u *p;
+replace_push_mb(char_u *p)
 {
     int l = (*mb_ptr2len)(p);
     int j;
@@ -7616,7 +7571,7 @@
  * return replaced character or NUL otherwise
  */
     static int
-replace_pop()
+replace_pop(void)
 {
     if (replace_stack_nr == 0)
 	return -1;
@@ -7628,8 +7583,8 @@
  * encountered.
  */
     static void
-replace_join(off)
-    int	    off;	/* offset for which NUL to remove */
+replace_join(
+    int	    off)	/* offset for which NUL to remove */
 {
     int	    i;
 
@@ -7648,7 +7603,7 @@
  * before the cursor.  Can only be used in REPLACE or VREPLACE mode.
  */
     static void
-replace_pop_ins()
+replace_pop_ins(void)
 {
     int	    cc;
     int	    oldState = State;
@@ -7672,8 +7627,7 @@
  * indicates a multi-byte char, pop the other bytes too.
  */
     static void
-mb_replace_pop_ins(cc)
-    int		cc;
+mb_replace_pop_ins(int cc)
 {
     int		n;
     char_u	buf[MB_MAXBYTES + 1];
@@ -7727,7 +7681,7 @@
  * (called when exiting replace mode)
  */
     static void
-replace_flush()
+replace_flush(void)
 {
     vim_free(replace_stack);
     replace_stack = NULL;
@@ -7745,8 +7699,7 @@
  * using composing characters, use del_char_after_col() instead of del_char().
  */
     static void
-replace_do_bs(limit_col)
-    int		limit_col;
+replace_do_bs(int limit_col)
 {
     int		cc;
 #ifdef FEAT_VREPLACE
@@ -7832,7 +7785,7 @@
  * Return TRUE if C-indenting is on.
  */
     static int
-cindent_on()
+cindent_on(void)
 {
     return (!p_paste && (curbuf->b_p_cin
 # ifdef FEAT_EVAL
@@ -7851,8 +7804,7 @@
  */
 
     void
-fixthisline(get_the_indent)
-    int (*get_the_indent)(void);
+fixthisline(int (*get_the_indent)(void))
 {
     int amount = get_the_indent();
 
@@ -7865,7 +7817,7 @@
 }
 
     void
-fix_indent()
+fix_indent(void)
 {
     if (p_paste)
 	return;
@@ -7899,10 +7851,10 @@
  * If line_is_empty is TRUE accept keys with '0' before them.
  */
     int
-in_cinkeys(keytyped, when, line_is_empty)
-    int		keytyped;
-    int		when;
-    int		line_is_empty;
+in_cinkeys(
+    int		keytyped,
+    int		when,
+    int		line_is_empty)
 {
     char_u	*look;
     int		try_match;
@@ -8161,8 +8113,7 @@
  * Map Hebrew keyboard when in hkmap mode.
  */
     int
-hkmap(c)
-    int c;
+hkmap(int c)
 {
     if (p_hkmapp)   /* phonetic mapping, by Ilya Dogolazky */
     {
@@ -8242,7 +8193,7 @@
 #endif
 
     static void
-ins_reg()
+ins_reg(void)
 {
     int		need_redraw = FALSE;
     int		regname;
@@ -8360,7 +8311,7 @@
  * CTRL-G commands in Insert mode.
  */
     static void
-ins_ctrl_g()
+ins_ctrl_g(void)
 {
     int		c;
 
@@ -8416,7 +8367,7 @@
  * CTRL-^ in Insert mode.
  */
     static void
-ins_ctrl_hat()
+ins_ctrl_hat(void)
 {
     if (map_to_exists_mode((char_u *)"", LANGMAP, FALSE))
     {
@@ -8471,10 +8422,10 @@
  * insert.
  */
     static int
-ins_esc(count, cmdchar, nomove)
-    long	*count;
-    int		cmdchar;
-    int		nomove;	    /* don't move cursor */
+ins_esc(
+    long	*count,
+    int		cmdchar,
+    int		nomove)	    /* don't move cursor */
 {
     int		temp;
     static int	disabled_redraw = FALSE;
@@ -8620,7 +8571,7 @@
  * Move to end of reverse inserted text.
  */
     static void
-ins_ctrl_()
+ins_ctrl_(void)
 {
     if (revins_on && revins_chars && revins_scol >= 0)
     {
@@ -8664,8 +8615,7 @@
  * Returns TRUE when a CTRL-O and other keys stuffed.
  */
     static int
-ins_start_select(c)
-    int		c;
+ins_start_select(int c)
 {
     if (km_startsel)
 	switch (c)
@@ -8719,8 +8669,7 @@
  * <Insert> key in Insert mode: toggle insert/replace mode.
  */
     static void
-ins_insert(replaceState)
-    int	    replaceState;
+ins_insert(int replaceState)
 {
 #ifdef FEAT_FKMAP
     if (p_fkmap && p_ri)
@@ -8757,7 +8706,7 @@
  * Pressed CTRL-O in Insert mode.
  */
     static void
-ins_ctrl_o()
+ins_ctrl_o(void)
 {
 #ifdef FEAT_VREPLACE
     if (State & VREPLACE_FLAG)
@@ -8784,9 +8733,7 @@
  * autoindent, we support it everywhere.
  */
     static void
-ins_shift(c, lastc)
-    int	    c;
-    int	    lastc;
+ins_shift(int c, int lastc)
 {
     if (stop_arrow() == FAIL)
 	return;
@@ -8823,7 +8770,7 @@
 }
 
     static void
-ins_del()
+ins_del(void)
 {
     int	    temp;
 
@@ -8855,8 +8802,7 @@
  * Delete one character for ins_bs().
  */
     static void
-ins_bs_one(vcolp)
-    colnr_T	*vcolp;
+ins_bs_one(colnr_T *vcolp)
 {
     dec_cursor();
     getvcol(curwin, &curwin->w_cursor, vcolp, NULL, NULL);
@@ -8877,10 +8823,10 @@
  * Return TRUE when backspace was actually used.
  */
     static int
-ins_bs(c, mode, inserted_space_p)
-    int		c;
-    int		mode;
-    int		*inserted_space_p;
+ins_bs(
+    int		c,
+    int		mode,
+    int		*inserted_space_p)
 {
     linenr_T	lnum;
     int		cc;
@@ -9287,8 +9233,7 @@
 
 #ifdef FEAT_MOUSE
     static void
-ins_mouse(c)
-    int	    c;
+ins_mouse(int c)
 {
     pos_T	tpos;
     win_T	*old_curwin = curwin;
@@ -9335,8 +9280,7 @@
 }
 
     static void
-ins_mousescroll(dir)
-    int		dir;
+ins_mousescroll(int dir)
 {
     pos_T	tpos;
 # if defined(FEAT_WINDOWS)
@@ -9429,8 +9373,7 @@
 
 #if defined(FEAT_GUI_TABLINE) || defined(PROTO)
     static void
-ins_tabline(c)
-    int		c;
+ins_tabline(int c)
 {
     /* We will be leaving the current window, unless closing another tab. */
     if (c != K_TABMENU || current_tabmenu != TABLINE_MENU_CLOSE
@@ -9455,7 +9398,7 @@
 
 #if defined(FEAT_GUI) || defined(PROTO)
     void
-ins_scroll()
+ins_scroll(void)
 {
     pos_T	tpos;
 
@@ -9471,7 +9414,7 @@
 }
 
     void
-ins_horscroll()
+ins_horscroll(void)
 {
     pos_T	tpos;
 
@@ -9488,8 +9431,8 @@
 #endif
 
     static void
-ins_left(end_change)
-    int	    end_change; /* end undoable change */
+ins_left(
+    int	    end_change) /* end undoable change */
 {
     pos_T	tpos;
 
@@ -9537,8 +9480,7 @@
 }
 
     static void
-ins_home(c)
-    int		c;
+ins_home(int c)
 {
     pos_T	tpos;
 
@@ -9559,8 +9501,7 @@
 }
 
     static void
-ins_end(c)
-    int		c;
+ins_end(int c)
 {
     pos_T	tpos;
 
@@ -9579,7 +9520,7 @@
 }
 
     static void
-ins_s_left()
+ins_s_left(void)
 {
 #ifdef FEAT_FOLDING
     if ((fdo_flags & FDO_HOR) && KeyTyped)
@@ -9597,8 +9538,8 @@
 }
 
     static void
-ins_right(end_change)
-    int	    end_change; /* end undoable change */
+ins_right(
+    int	    end_change) /* end undoable change */
 {
 #ifdef FEAT_FOLDING
     if ((fdo_flags & FDO_HOR) && KeyTyped)
@@ -9651,7 +9592,7 @@
 }
 
     static void
-ins_s_right()
+ins_s_right(void)
 {
 #ifdef FEAT_FOLDING
     if ((fdo_flags & FDO_HOR) && KeyTyped)
@@ -9670,8 +9611,8 @@
 }
 
     static void
-ins_up(startcol)
-    int		startcol;	/* when TRUE move to Insstart.col */
+ins_up(
+    int		startcol)	/* when TRUE move to Insstart.col */
 {
     pos_T	tpos;
     linenr_T	old_topline = curwin->w_topline;
@@ -9701,7 +9642,7 @@
 }
 
     static void
-ins_pageup()
+ins_pageup(void)
 {
     pos_T	tpos;
 
@@ -9733,8 +9674,8 @@
 }
 
     static void
-ins_down(startcol)
-    int		startcol;	/* when TRUE move to Insstart.col */
+ins_down(
+    int		startcol)	/* when TRUE move to Insstart.col */
 {
     pos_T	tpos;
     linenr_T	old_topline = curwin->w_topline;
@@ -9764,7 +9705,7 @@
 }
 
     static void
-ins_pagedown()
+ins_pagedown(void)
 {
     pos_T	tpos;
 
@@ -9797,7 +9738,7 @@
 
 #ifdef FEAT_DND
     static void
-ins_drop()
+ins_drop(void)
 {
     do_put('~', BACKWARD, 1L, PUT_CURSEND);
 }
@@ -9808,7 +9749,7 @@
  * Return TRUE when the TAB needs to be inserted like a normal character.
  */
     static int
-ins_tab()
+ins_tab(void)
 {
     int		ind;
     int		i;
@@ -10035,8 +9976,7 @@
  * Return TRUE when out of memory or can't undo.
  */
     static int
-ins_eol(c)
-    int		c;
+ins_eol(int c)
 {
     int	    i;
 
@@ -10108,7 +10048,7 @@
  * done.
  */
     static int
-ins_digraph()
+ins_digraph(void)
 {
     int	    c;
     int	    cc;
@@ -10200,8 +10140,7 @@
  * Returns the char to be inserted, or NUL if none found.
  */
     int
-ins_copychar(lnum)
-    linenr_T	lnum;
+ins_copychar(linenr_T lnum)
 {
     int	    c;
     int	    temp;
@@ -10241,8 +10180,7 @@
  * CTRL-Y or CTRL-E typed in Insert mode.
  */
     static int
-ins_ctrl_ey(tc)
-    int	    tc;
+ins_ctrl_ey(int tc)
 {
     int	    c = tc;
 
@@ -10290,8 +10228,7 @@
  * Used when inserting a "normal" character.
  */
     static void
-ins_try_si(c)
-    int	    c;
+ins_try_si(int c)
 {
     pos_T	*pos, old_pos;
     char_u	*ptr;
@@ -10383,7 +10320,7 @@
  * Unless 'cpo' contains the 'L' flag.
  */
     static colnr_T
-get_nolist_virtcol()
+get_nolist_virtcol(void)
 {
     if (curwin->w_p_list && vim_strchr(p_cpo, CPO_LISTWM) == NULL)
 	return getvcol_nolist(&curwin->w_cursor);
@@ -10399,8 +10336,7 @@
  * Return NULL to continue inserting "c".
  */
     static char_u *
-do_insert_char_pre(c)
-    int c;
+do_insert_char_pre(int c)
 {
     char_u	*res;
     char_u	buf[MB_MAXBYTES + 1];
diff --git a/src/eval.c b/src/eval.c
index 9a8201e..fc512ab 100644
--- a/src/eval.c
+++ b/src/eval.c
@@ -890,7 +890,7 @@
  * Initialize the global and v: variables.
  */
     void
-eval_init()
+eval_init(void)
 {
     int		    i;
     struct vimvar   *p;
@@ -941,7 +941,7 @@
 
 #if defined(EXITFREE) || defined(PROTO)
     void
-eval_clear()
+eval_clear(void)
 {
     int		    i;
     struct vimvar   *p;
@@ -1006,8 +1006,7 @@
  * Return the address holding the next breakpoint line for a funccall cookie.
  */
     linenr_T *
-func_breakpoint(cookie)
-    void *cookie;
+func_breakpoint(void *cookie)
 {
     return &((funccall_T *)cookie)->breakpoint;
 }
@@ -1041,7 +1040,7 @@
  * Return TRUE when a function was ended by a ":return" command.
  */
     int
-current_func_returned()
+current_func_returned(void)
 {
     return current_funccal->returned;
 }
@@ -1183,7 +1182,7 @@
  * Frees the allocated memory.
  */
     void
-var_redir_stop()
+var_redir_stop(void)
 {
     typval_T	tv;
 
@@ -1244,9 +1243,7 @@
 
 # if defined(FEAT_POSTSCRIPT) || defined(PROTO)
     int
-eval_printexpr(fname, args)
-    char_u	*fname;
-    char_u	*args;
+eval_printexpr(char_u *fname, char_u *args)
 {
     int		err = FALSE;
 
@@ -1268,10 +1265,10 @@
 
 # if defined(FEAT_DIFF) || defined(PROTO)
     void
-eval_diff(origfile, newfile, outfile)
-    char_u	*origfile;
-    char_u	*newfile;
-    char_u	*outfile;
+eval_diff(
+    char_u	*origfile,
+    char_u	*newfile,
+    char_u	*outfile)
 {
     int		err = FALSE;
 
@@ -1285,10 +1282,10 @@
 }
 
     void
-eval_patch(origfile, difffile, outfile)
-    char_u	*origfile;
-    char_u	*difffile;
-    char_u	*outfile;
+eval_patch(
+    char_u	*origfile,
+    char_u	*difffile,
+    char_u	*outfile)
 {
     int		err;
 
@@ -1308,11 +1305,11 @@
  * Return TRUE or FALSE.
  */
     int
-eval_to_bool(arg, error, nextcmd, skip)
-    char_u	*arg;
-    int		*error;
-    char_u	**nextcmd;
-    int		skip;	    /* only parse, don't execute */
+eval_to_bool(
+    char_u	*arg,
+    int		*error,
+    char_u	**nextcmd,
+    int		skip)	    /* only parse, don't execute */
 {
     typval_T	tv;
     int		retval = FALSE;
@@ -1342,10 +1339,10 @@
  * pointer to allocated memory, or NULL for failure or when "skip" is TRUE.
  */
     char_u *
-eval_to_string_skip(arg, nextcmd, skip)
-    char_u	*arg;
-    char_u	**nextcmd;
-    int		skip;	    /* only parse, don't execute */
+eval_to_string_skip(
+    char_u	*arg,
+    char_u	**nextcmd,
+    int		skip)	    /* only parse, don't execute */
 {
     typval_T	tv;
     char_u	*retval;
@@ -1370,8 +1367,7 @@
  * Return FAIL for an error, OK otherwise.
  */
     int
-skip_expr(pp)
-    char_u	**pp;
+skip_expr(char_u **pp)
 {
     typval_T	rettv;
 
@@ -1386,10 +1382,10 @@
  * Return pointer to allocated memory, or NULL for failure.
  */
     char_u *
-eval_to_string(arg, nextcmd, convert)
-    char_u	*arg;
-    char_u	**nextcmd;
-    int		convert;
+eval_to_string(
+    char_u	*arg,
+    char_u	**nextcmd,
+    int		convert)
 {
     typval_T	tv;
     char_u	*retval;
@@ -1434,10 +1430,10 @@
  * textlock.  When "use_sandbox" is TRUE use the sandbox.
  */
     char_u *
-eval_to_string_safe(arg, nextcmd, use_sandbox)
-    char_u	*arg;
-    char_u	**nextcmd;
-    int		use_sandbox;
+eval_to_string_safe(
+    char_u	*arg,
+    char_u	**nextcmd,
+    int		use_sandbox)
 {
     char_u	*retval;
     void	*save_funccalp;
@@ -1460,8 +1456,7 @@
  * Returns -1 for an error.
  */
     int
-eval_to_number(expr)
-    char_u	*expr;
+eval_to_number(char_u *expr)
 {
     typval_T	rettv;
     int		retval;
@@ -1487,9 +1482,7 @@
  * When not used yet add the variable to the v: hashtable.
  */
     static void
-prepare_vimvar(idx, save_tv)
-    int		idx;
-    typval_T	*save_tv;
+prepare_vimvar(int idx, typval_T *save_tv)
 {
     *save_tv = vimvars[idx].vv_tv;
     if (vimvars[idx].vv_type == VAR_UNKNOWN)
@@ -1501,9 +1494,7 @@
  * When no longer defined, remove the variable from the v: hashtable.
  */
     static void
-restore_vimvar(idx, save_tv)
-    int		idx;
-    typval_T	*save_tv;
+restore_vimvar(int idx, typval_T *save_tv)
 {
     hashitem_T	*hi;
 
@@ -1525,9 +1516,7 @@
  * Returns NULL when there is an error.
  */
     list_T *
-eval_spell_expr(badword, expr)
-    char_u	*badword;
-    char_u	*expr;
+eval_spell_expr(char_u *badword, char_u *expr)
 {
     typval_T	save_val;
     typval_T	rettv;
@@ -1563,9 +1552,7 @@
  * Used to get the good word and score from the eval_spell_expr() result.
  */
     int
-get_spellword(list, pp)
-    list_T	*list;
-    char_u	**pp;
+get_spellword(list_T *list, char_u **pp)
 {
     listitem_T	*li;
 
@@ -1587,9 +1574,7 @@
  * Returns NULL when there is an error.
  */
     typval_T *
-eval_expr(arg, nextcmd)
-    char_u	*arg;
-    char_u	**nextcmd;
+eval_expr(char_u *arg, char_u **nextcmd)
 {
     typval_T	*tv;
 
@@ -1611,13 +1596,13 @@
  * Returns OK or FAIL.
  */
     int
-call_vim_function(func, argc, argv, safe, str_arg_only, rettv)
-    char_u      *func;
-    int		argc;
-    char_u      **argv;
-    int		safe;		/* use the sandbox */
-    int		str_arg_only;	/* all arguments are strings */
-    typval_T	*rettv;
+call_vim_function(
+    char_u      *func,
+    int		argc,
+    char_u      **argv,
+    int		safe,		/* use the sandbox */
+    int		str_arg_only,	/* all arguments are strings */
+    typval_T	*rettv)
 {
     typval_T	*argvars;
     long	n;
@@ -1687,11 +1672,11 @@
  * Uses argv[argc] for the function arguments.
  */
     long
-call_func_retnr(func, argc, argv, safe)
-    char_u      *func;
-    int		argc;
-    char_u      **argv;
-    int		safe;		/* use the sandbox */
+call_func_retnr(
+    char_u      *func,
+    int		argc,
+    char_u      **argv,
+    int		safe)		/* use the sandbox */
 {
     typval_T	rettv;
     long	retval;
@@ -1715,11 +1700,11 @@
  * Uses argv[argc] for the function arguments.
  */
     void *
-call_func_retstr(func, argc, argv, safe)
-    char_u      *func;
-    int		argc;
-    char_u      **argv;
-    int		safe;		/* use the sandbox */
+call_func_retstr(
+    char_u      *func,
+    int		argc,
+    char_u      **argv,
+    int		safe)		/* use the sandbox */
 {
     typval_T	rettv;
     char_u	*retval;
@@ -1740,11 +1725,11 @@
  * Returns NULL when there is something wrong.
  */
     void *
-call_func_retlist(func, argc, argv, safe)
-    char_u      *func;
-    int		argc;
-    char_u      **argv;
-    int		safe;		/* use the sandbox */
+call_func_retlist(
+    char_u      *func,
+    int		argc,
+    char_u      **argv,
+    int		safe)		/* use the sandbox */
 {
     typval_T	rettv;
 
@@ -1767,7 +1752,7 @@
  * Used when executing autocommands and for ":source".
  */
     void *
-save_funccal()
+save_funccal(void)
 {
     funccall_T *fc = current_funccal;
 
@@ -1776,8 +1761,7 @@
 }
 
     void
-restore_funccal(vfc)
-    void *vfc;
+restore_funccal(void *vfc)
 {
     funccall_T *fc = (funccall_T *)vfc;
 
@@ -1791,8 +1775,8 @@
  * Should always be called in pair with prof_child_exit().
  */
     void
-prof_child_enter(tm)
-    proftime_T *tm;	/* place to store waittime */
+prof_child_enter(
+    proftime_T *tm)	/* place to store waittime */
 {
     funccall_T *fc = current_funccal;
 
@@ -1806,8 +1790,8 @@
  * Should always be called after prof_child_enter().
  */
     void
-prof_child_exit(tm)
-    proftime_T *tm;	/* where waittime was stored */
+prof_child_exit(
+    proftime_T *tm)	/* where waittime was stored */
 {
     funccall_T *fc = current_funccal;
 
@@ -1829,9 +1813,7 @@
  * it in "*cp".  Doesn't give error messages.
  */
     int
-eval_foldexpr(arg, cp)
-    char_u	*arg;
-    int		*cp;
+eval_foldexpr(char_u *arg, int *cp)
 {
     typval_T	tv;
     int		retval;
@@ -1883,8 +1865,7 @@
  * ":let [var1, var2] = expr"	unpack list.
  */
     void
-ex_let(eap)
-    exarg_T	*eap;
+ex_let(exarg_T *eap)
 {
     char_u	*arg = eap->arg;
     char_u	*expr = NULL;
@@ -1968,13 +1949,13 @@
  * Returns OK or FAIL;
  */
     static int
-ex_let_vars(arg_start, tv, copy, semicolon, var_count, nextchars)
-    char_u	*arg_start;
-    typval_T	*tv;
-    int		copy;		/* copy values from "tv", don't move */
-    int		semicolon;	/* from skip_var_list() */
-    int		var_count;	/* from skip_var_list() */
-    char_u	*nextchars;
+ex_let_vars(
+    char_u	*arg_start,
+    typval_T	*tv,
+    int		copy,		/* copy values from "tv", don't move */
+    int		semicolon,	/* from skip_var_list() */
+    int		var_count,	/* from skip_var_list() */
+    char_u	*nextchars)
 {
     char_u	*arg = arg_start;
     list_T	*l;
@@ -2066,10 +2047,10 @@
  * Return NULL for an error.
  */
     static char_u *
-skip_var_list(arg, var_count, semicolon)
-    char_u	*arg;
-    int		*var_count;
-    int		*semicolon;
+skip_var_list(
+    char_u	*arg,
+    int		*var_count,
+    int		*semicolon)
 {
     char_u	*p, *s;
 
@@ -2117,8 +2098,7 @@
  * l[idx].
  */
     static char_u *
-skip_var_one(arg)
-    char_u	*arg;
+skip_var_one(char_u *arg)
 {
     if (*arg == '@' && arg[1] != NUL)
 	return arg + 2;
@@ -2131,11 +2111,11 @@
  * If "empty" is TRUE also list NULL strings as empty strings.
  */
     static void
-list_hashtable_vars(ht, prefix, empty, first)
-    hashtab_T	*ht;
-    char_u	*prefix;
-    int		empty;
-    int		*first;
+list_hashtable_vars(
+    hashtab_T	*ht,
+    char_u	*prefix,
+    int		empty,
+    int		*first)
 {
     hashitem_T	*hi;
     dictitem_T	*di;
@@ -2159,8 +2139,7 @@
  * List global variables.
  */
     static void
-list_glob_vars(first)
-    int *first;
+list_glob_vars(int *first)
 {
     list_hashtable_vars(&globvarht, (char_u *)"", TRUE, first);
 }
@@ -2169,8 +2148,7 @@
  * List buffer variables.
  */
     static void
-list_buf_vars(first)
-    int *first;
+list_buf_vars(int *first)
 {
     char_u	numbuf[NUMBUFLEN];
 
@@ -2186,8 +2164,7 @@
  * List window variables.
  */
     static void
-list_win_vars(first)
-    int *first;
+list_win_vars(int *first)
 {
     list_hashtable_vars(&curwin->w_vars->dv_hashtab,
 						 (char_u *)"w:", TRUE, first);
@@ -2198,8 +2175,7 @@
  * List tab page variables.
  */
     static void
-list_tab_vars(first)
-    int *first;
+list_tab_vars(int *first)
 {
     list_hashtable_vars(&curtab->tp_vars->dv_hashtab,
 						 (char_u *)"t:", TRUE, first);
@@ -2210,8 +2186,7 @@
  * List Vim variables.
  */
     static void
-list_vim_vars(first)
-    int *first;
+list_vim_vars(int *first)
 {
     list_hashtable_vars(&vimvarht, (char_u *)"v:", FALSE, first);
 }
@@ -2220,8 +2195,7 @@
  * List script-local variables, if there is a script.
  */
     static void
-list_script_vars(first)
-    int *first;
+list_script_vars(int *first)
 {
     if (current_SID > 0 && current_SID <= ga_scripts.ga_len)
 	list_hashtable_vars(&SCRIPT_VARS(current_SID),
@@ -2232,8 +2206,7 @@
  * List function variables, if there is a function.
  */
     static void
-list_func_vars(first)
-    int *first;
+list_func_vars(int *first)
 {
     if (current_funccal != NULL)
 	list_hashtable_vars(&current_funccal->l_vars.dv_hashtab,
@@ -2244,10 +2217,7 @@
  * List variables in "arg".
  */
     static char_u *
-list_arg_vars(eap, arg, first)
-    exarg_T	*eap;
-    char_u	*arg;
-    int		*first;
+list_arg_vars(exarg_T *eap, char_u *arg, int *first)
 {
     int		error = FALSE;
     int		len;
@@ -2355,12 +2325,12 @@
  * Returns NULL if there is an error.
  */
     static char_u *
-ex_let_one(arg, tv, copy, endchars, op)
-    char_u	*arg;		/* points to variable name */
-    typval_T	*tv;		/* value to assign to variable */
-    int		copy;		/* copy value from "tv" */
-    char_u	*endchars;	/* valid chars after variable name  or NULL */
-    char_u	*op;		/* "+", "-", "."  or NULL*/
+ex_let_one(
+    char_u	*arg,		/* points to variable name */
+    typval_T	*tv,		/* value to assign to variable */
+    int		copy,		/* copy value from "tv" */
+    char_u	*endchars,	/* valid chars after variable name  or NULL */
+    char_u	*op)		/* "+", "-", "."  or NULL*/
 {
     int		c1;
     char_u	*name;
@@ -2549,8 +2519,7 @@
  * If "arg" is equal to "b:changedtick" give an error and return TRUE.
  */
     static int
-check_changedtick(arg)
-    char_u	*arg;
+check_changedtick(char_u *arg)
 {
     if (STRNCMP(arg, "b:changedtick", 13) == 0 && !eval_isnamec(arg[13]))
     {
@@ -2579,14 +2548,14 @@
  * Returns NULL for a parsing error.  Still need to free items in "lp"!
  */
     static char_u *
-get_lval(name, rettv, lp, unlet, skip, flags, fne_flags)
-    char_u	*name;
-    typval_T	*rettv;
-    lval_T	*lp;
-    int		unlet;
-    int		skip;
-    int		flags;	    /* GLV_ values */
-    int		fne_flags;  /* flags for find_name_end() */
+get_lval(
+    char_u	*name,
+    typval_T	*rettv,
+    lval_T	*lp,
+    int		unlet,
+    int		skip,
+    int		flags,	    /* GLV_ values */
+    int		fne_flags)  /* flags for find_name_end() */
 {
     char_u	*p;
     char_u	*expr_start, *expr_end;
@@ -2924,8 +2893,7 @@
  * Clear lval "lp" that was filled by get_lval().
  */
     static void
-clear_lval(lp)
-    lval_T	*lp;
+clear_lval(lval_T *lp)
 {
     vim_free(lp->ll_exp_name);
     vim_free(lp->ll_newkey);
@@ -2937,12 +2905,12 @@
  * "op" is NULL, "+" for "+=", "-" for "-=", "." for ".=" or "=" for "=".
  */
     static void
-set_var_lval(lp, endp, rettv, copy, op)
-    lval_T	*lp;
-    char_u	*endp;
-    typval_T	*rettv;
-    int		copy;
-    char_u	*op;
+set_var_lval(
+    lval_T	*lp,
+    char_u	*endp,
+    typval_T	*rettv,
+    int		copy,
+    char_u	*op)
 {
     int		cc;
     listitem_T	*ri;
@@ -3085,10 +3053,7 @@
  * Returns OK or FAIL.
  */
     static int
-tv_op(tv1, tv2, op)
-    typval_T *tv1;
-    typval_T *tv2;
-    char_u  *op;
+tv_op(typval_T *tv1, typval_T *tv2, char_u *op)
 {
     long	n;
     char_u	numbuf[NUMBUFLEN];
@@ -3191,9 +3156,7 @@
  * Add a watcher to a list.
  */
     void
-list_add_watch(l, lw)
-    list_T	*l;
-    listwatch_T	*lw;
+list_add_watch(list_T *l, listwatch_T *lw)
 {
     lw->lw_next = l->lv_watch;
     l->lv_watch = lw;
@@ -3204,9 +3167,7 @@
  * No warning when it isn't found...
  */
     void
-list_rem_watch(l, lwrem)
-    list_T	*l;
-    listwatch_T	*lwrem;
+list_rem_watch(list_T *l, listwatch_T *lwrem)
 {
     listwatch_T	*lw, **lwp;
 
@@ -3227,9 +3188,7 @@
  * item.
  */
     static void
-list_fix_watch(l, item)
-    list_T	*l;
-    listitem_T	*item;
+list_fix_watch(list_T *l, listitem_T *item)
 {
     listwatch_T	*lw;
 
@@ -3245,11 +3204,11 @@
  * Return a pointer that holds the info.  Null when there is an error.
  */
     void *
-eval_for_line(arg, errp, nextcmdp, skip)
-    char_u	*arg;
-    int		*errp;
-    char_u	**nextcmdp;
-    int		skip;
+eval_for_line(
+    char_u	*arg,
+    int		*errp,
+    char_u	**nextcmdp,
+    int		skip)
 {
     forinfo_T	*fi;
     char_u	*expr;
@@ -3309,9 +3268,7 @@
  * something wrong.
  */
     int
-next_for_item(fi_void, arg)
-    void	*fi_void;
-    char_u	*arg;
+next_for_item(void *fi_void, char_u *arg)
 {
     forinfo_T	*fi = (forinfo_T *)fi_void;
     int		result;
@@ -3333,8 +3290,7 @@
  * Free the structure used to store info used by ":for".
  */
     void
-free_for_info(fi_void)
-    void *fi_void;
+free_for_info(void *fi_void)
 {
     forinfo_T    *fi = (forinfo_T *)fi_void;
 
@@ -3349,10 +3305,10 @@
 #if defined(FEAT_CMDL_COMPL) || defined(PROTO)
 
     void
-set_context_for_expression(xp, arg, cmdidx)
-    expand_T	*xp;
-    char_u	*arg;
-    cmdidx_T	cmdidx;
+set_context_for_expression(
+    expand_T	*xp,
+    char_u	*arg,
+    cmdidx_T	cmdidx)
 {
     int		got_eq = FALSE;
     int		c;
@@ -3462,8 +3418,7 @@
  * ":1,25call func(arg1, arg2)"	function call.
  */
     void
-ex_call(eap)
-    exarg_T	*eap;
+ex_call(exarg_T *eap)
 {
     char_u	*arg = eap->arg;
     char_u	*startarg;
@@ -3592,8 +3547,7 @@
  * ":unlet[!] var1 ... " command.
  */
     void
-ex_unlet(eap)
-    exarg_T	*eap;
+ex_unlet(exarg_T *eap)
 {
     ex_unletlock(eap, eap->arg, 0);
 }
@@ -3602,8 +3556,7 @@
  * ":lockvar" and ":unlockvar" commands
  */
     void
-ex_lockvar(eap)
-    exarg_T	*eap;
+ex_lockvar(exarg_T *eap)
 {
     char_u	*arg = eap->arg;
     int		deep = 2;
@@ -3623,10 +3576,10 @@
  * ":unlet", ":lockvar" and ":unlockvar" are quite similar.
  */
     static void
-ex_unletlock(eap, argstart, deep)
-    exarg_T	*eap;
-    char_u	*argstart;
-    int		deep;
+ex_unletlock(
+    exarg_T	*eap,
+    char_u	*argstart,
+    int		deep)
 {
     char_u	*arg = argstart;
     char_u	*name_end;
@@ -3678,10 +3631,10 @@
 }
 
     static int
-do_unlet_var(lp, name_end, forceit)
-    lval_T	*lp;
-    char_u	*name_end;
-    int		forceit;
+do_unlet_var(
+    lval_T	*lp,
+    char_u	*name_end,
+    int		forceit)
 {
     int		ret = OK;
     int		cc;
@@ -3745,9 +3698,7 @@
  * When "forceit" is TRUE don't complain if the variable doesn't exist.
  */
     int
-do_unlet(name, forceit)
-    char_u	*name;
-    int		forceit;
+do_unlet(char_u *name, int forceit)
 {
     hashtab_T	*ht;
     hashitem_T	*hi;
@@ -3800,11 +3751,11 @@
  * "lock" is TRUE for ":lockvar", FALSE for ":unlockvar".
  */
     static int
-do_lock_var(lp, name_end, deep, lock)
-    lval_T	*lp;
-    char_u	*name_end;
-    int		deep;
-    int		lock;
+do_lock_var(
+    lval_T	*lp,
+    char_u	*name_end,
+    int		deep,
+    int		lock)
 {
     int		ret = OK;
     int		cc;
@@ -3863,10 +3814,7 @@
  * Lock or unlock an item.  "deep" is nr of levels to go.
  */
     static void
-item_lock(tv, deep, lock)
-    typval_T	*tv;
-    int		deep;
-    int		lock;
+item_lock(typval_T *tv, int deep, int lock)
 {
     static int	recurse = 0;
     list_T	*l;
@@ -3935,8 +3883,7 @@
  * or it refers to a List or Dictionary that is locked.
  */
     static int
-tv_islocked(tv)
-    typval_T	*tv;
+tv_islocked(typval_T *tv)
 {
     return (tv->v_lock & VAR_LOCKED)
 	|| (tv->v_type == VAR_LIST
@@ -3952,7 +3899,7 @@
  * Delete all "menutrans_" variables.
  */
     void
-del_menutrans_vars()
+del_menutrans_vars(void)
 {
     hashitem_T	*hi;
     int		todo;
@@ -3989,9 +3936,7 @@
  * Function to concatenate a prefix and a variable name.
  */
     static char_u *
-cat_prefix_varname(prefix, name)
-    int		prefix;
-    char_u	*name;
+cat_prefix_varname(int prefix, char_u *name)
 {
     int		len;
 
@@ -4019,9 +3964,7 @@
  * (global/buffer/window/built-in) variable names.
  */
     char_u *
-get_user_var_name(xp, idx)
-    expand_T	*xp;
-    int		idx;
+get_user_var_name(expand_T *xp, int idx)
 {
     static long_u	gdone;
     static long_u	bdone;
@@ -4143,11 +4086,11 @@
  * Return OK or FAIL.
  */
     static int
-eval0(arg, rettv, nextcmd, evaluate)
-    char_u	*arg;
-    typval_T	*rettv;
-    char_u	**nextcmd;
-    int		evaluate;
+eval0(
+    char_u	*arg,
+    typval_T	*rettv,
+    char_u	**nextcmd,
+    int		evaluate)
 {
     int		ret;
     char_u	*p;
@@ -4185,10 +4128,7 @@
  * Return OK or FAIL.
  */
     static int
-eval1(arg, rettv, evaluate)
-    char_u	**arg;
-    typval_T	*rettv;
-    int		evaluate;
+eval1(char_u **arg, typval_T *rettv, int evaluate)
 {
     int		result;
     typval_T	var2;
@@ -4258,10 +4198,7 @@
  * Return OK or FAIL.
  */
     static int
-eval2(arg, rettv, evaluate)
-    char_u	**arg;
-    typval_T	*rettv;
-    int		evaluate;
+eval2(char_u **arg, typval_T *rettv, int evaluate)
 {
     typval_T	var2;
     long	result;
@@ -4329,10 +4266,7 @@
  * Return OK or FAIL.
  */
     static int
-eval3(arg, rettv, evaluate)
-    char_u	**arg;
-    typval_T	*rettv;
-    int		evaluate;
+eval3(char_u **arg, typval_T *rettv, int evaluate)
 {
     typval_T	var2;
     long	result;
@@ -4409,10 +4343,7 @@
  * Return OK or FAIL.
  */
     static int
-eval4(arg, rettv, evaluate)
-    char_u	**arg;
-    typval_T	*rettv;
-    int		evaluate;
+eval4(char_u **arg, typval_T *rettv, int evaluate)
 {
     typval_T	var2;
     char_u	*p;
@@ -4719,10 +4650,7 @@
  * Return OK or FAIL.
  */
     static int
-eval5(arg, rettv, evaluate)
-    char_u	**arg;
-    typval_T	*rettv;
-    int		evaluate;
+eval5(char_u **arg, typval_T *rettv, int evaluate)
 {
     typval_T	var2;
     typval_T	var3;
@@ -4904,11 +4832,11 @@
  * Return OK or FAIL.
  */
     static int
-eval6(arg, rettv, evaluate, want_string)
-    char_u	**arg;
-    typval_T	*rettv;
-    int		evaluate;
-    int		want_string;  /* after "." operator */
+eval6(
+    char_u	**arg,
+    typval_T	*rettv,
+    int		evaluate,
+    int		want_string)  /* after "." operator */
 {
     typval_T	var2;
     int		op;
@@ -5086,11 +5014,11 @@
  * Return OK or FAIL.
  */
     static int
-eval7(arg, rettv, evaluate, want_string)
-    char_u	**arg;
-    typval_T	*rettv;
-    int		evaluate;
-    int		want_string UNUSED;	/* after "." operator */
+eval7(
+    char_u	**arg,
+    typval_T	*rettv,
+    int		evaluate,
+    int		want_string UNUSED)	/* after "." operator */
 {
     long	n;
     int		len;
@@ -5378,11 +5306,11 @@
  * Returns FAIL or OK. "*arg" is advanced to after the ']'.
  */
     static int
-eval_index(arg, rettv, evaluate, verbose)
-    char_u	**arg;
-    typval_T	*rettv;
-    int		evaluate;
-    int		verbose;	/* give error messages */
+eval_index(
+    char_u	**arg,
+    typval_T	*rettv,
+    int		evaluate,
+    int		verbose)	/* give error messages */
 {
     int		empty1 = FALSE, empty2 = FALSE;
     typval_T	var1, var2;
@@ -5645,10 +5573,10 @@
  * Return OK or FAIL.
  */
     static int
-get_option_tv(arg, rettv, evaluate)
-    char_u	**arg;
-    typval_T	*rettv;	/* when NULL, only check if option exists */
-    int		evaluate;
+get_option_tv(
+    char_u	**arg,
+    typval_T	*rettv,	/* when NULL, only check if option exists */
+    int		evaluate)
 {
     char_u	*option_end;
     long	numval;
@@ -5724,10 +5652,7 @@
  * Return OK or FAIL.
  */
     static int
-get_string_tv(arg, rettv, evaluate)
-    char_u	**arg;
-    typval_T	*rettv;
-    int		evaluate;
+get_string_tv(char_u **arg, typval_T *rettv, int evaluate)
 {
     char_u	*p;
     char_u	*name;
@@ -5863,10 +5788,7 @@
  * Return OK or FAIL.
  */
     static int
-get_lit_string_tv(arg, rettv, evaluate)
-    char_u	**arg;
-    typval_T	*rettv;
-    int		evaluate;
+get_lit_string_tv(char_u **arg, typval_T *rettv, int evaluate)
 {
     char_u	*p;
     char_u	*str;
@@ -5929,10 +5851,7 @@
  * Return OK or FAIL.
  */
     static int
-get_list_tv(arg, rettv, evaluate)
-    char_u	**arg;
-    typval_T	*rettv;
-    int		evaluate;
+get_list_tv(char_u **arg, typval_T *rettv, int evaluate)
 {
     list_T	*l = NULL;
     typval_T	tv;
@@ -5998,7 +5917,7 @@
  * Caller should take care of the reference count.
  */
     list_T *
-list_alloc()
+list_alloc(void)
 {
     list_T  *l;
 
@@ -6020,8 +5939,7 @@
  * Returns OK or FAIL.
  */
     int
-rettv_list_alloc(rettv)
-    typval_T	*rettv;
+rettv_list_alloc(typval_T *rettv)
 {
     list_T	*l = list_alloc();
 
@@ -6039,8 +5957,7 @@
  * becomes zero.
  */
     void
-list_unref(l)
-    list_T *l;
+list_unref(list_T *l)
 {
     if (l != NULL && --l->lv_refcount <= 0)
 	list_free(l, TRUE);
@@ -6051,9 +5968,9 @@
  * Ignores the reference count.
  */
     void
-list_free(l, recurse)
-    list_T  *l;
-    int	    recurse;	/* Free Lists and Dictionaries recursively. */
+list_free(
+    list_T  *l,
+    int	    recurse)	/* Free Lists and Dictionaries recursively. */
 {
     listitem_T *item;
 
@@ -6091,8 +6008,7 @@
  * Free a list item.  Also clears the value.  Does not notify watchers.
  */
     void
-listitem_free(item)
-    listitem_T *item;
+listitem_free(listitem_T *item)
 {
     clear_tv(&item->li_tv);
     vim_free(item);
@@ -6102,9 +6018,7 @@
  * Remove a list item from a List and free it.  Also clears the value.
  */
     void
-listitem_remove(l, item)
-    list_T  *l;
-    listitem_T *item;
+listitem_remove(list_T *l, listitem_T *item)
 {
     vimlist_remove(l, item, item);
     listitem_free(item);
@@ -6114,8 +6028,7 @@
  * Get the number of items in a list.
  */
     static long
-list_len(l)
-    list_T	*l;
+list_len(list_T *l)
 {
     if (l == NULL)
 	return 0L;
@@ -6126,11 +6039,11 @@
  * Return TRUE when two lists have exactly the same values.
  */
     static int
-list_equal(l1, l2, ic, recursive)
-    list_T	*l1;
-    list_T	*l2;
-    int		ic;	/* ignore case for strings */
-    int		recursive;  /* TRUE when used recursively */
+list_equal(
+    list_T	*l1,
+    list_T	*l2,
+    int		ic,	/* ignore case for strings */
+    int		recursive)  /* TRUE when used recursively */
 {
     listitem_T	*item1, *item2;
 
@@ -6153,8 +6066,7 @@
  * Return the dictitem that an entry in a hashtable points to.
  */
     dictitem_T *
-dict_lookup(hi)
-    hashitem_T *hi;
+dict_lookup(hashitem_T *hi)
 {
     return HI2DI(hi);
 }
@@ -6163,11 +6075,11 @@
  * Return TRUE when two dictionaries have exactly the same key/values.
  */
     static int
-dict_equal(d1, d2, ic, recursive)
-    dict_T	*d1;
-    dict_T	*d2;
-    int		ic;	/* ignore case for strings */
-    int		recursive; /* TRUE when used recursively */
+dict_equal(
+    dict_T	*d1,
+    dict_T	*d2,
+    int		ic,	/* ignore case for strings */
+    int		recursive) /* TRUE when used recursively */
 {
     hashitem_T	*hi;
     dictitem_T	*item2;
@@ -6204,11 +6116,11 @@
  * numbers are different.  Floats and numbers are also different.
  */
     static int
-tv_equal(tv1, tv2, ic, recursive)
-    typval_T *tv1;
-    typval_T *tv2;
-    int	     ic;	    /* ignore case */
-    int	     recursive;	    /* TRUE when used recursively */
+tv_equal(
+    typval_T *tv1,
+    typval_T *tv2,
+    int	     ic,	    /* ignore case */
+    int	     recursive)	    /* TRUE when used recursively */
 {
     char_u	buf1[NUMBUFLEN], buf2[NUMBUFLEN];
     char_u	*s1, *s2;
@@ -6278,9 +6190,7 @@
  * Returns NULL when "n" is out of range.
  */
     listitem_T *
-list_find(l, n)
-    list_T	*l;
-    long	n;
+list_find(list_T *l, long n)
 {
     listitem_T	*item;
     long	idx;
@@ -6358,10 +6268,10 @@
  * Get list item "l[idx]" as a number.
  */
     static long
-list_find_nr(l, idx, errorp)
-    list_T	*l;
-    long	idx;
-    int		*errorp;	/* set to TRUE when something wrong */
+list_find_nr(
+    list_T	*l,
+    long	idx,
+    int		*errorp)	/* set to TRUE when something wrong */
 {
     listitem_T	*li;
 
@@ -6379,9 +6289,7 @@
  * Get list item "l[idx - 1]" as a string.  Returns NULL for failure.
  */
     char_u *
-list_find_str(l, idx)
-    list_T	*l;
-    long	idx;
+list_find_str(list_T *l, long idx)
 {
     listitem_T	*li;
 
@@ -6399,9 +6307,7 @@
  * Returns -1 when "item" is not in the list.
  */
     static long
-list_idx_of_item(l, item)
-    list_T	*l;
-    listitem_T	*item;
+list_idx_of_item(list_T *l, listitem_T *item)
 {
     long	idx = 0;
     listitem_T	*li;
@@ -6420,9 +6326,7 @@
  * Append item "item" to the end of list "l".
  */
     void
-list_append(l, item)
-    list_T	*l;
-    listitem_T	*item;
+list_append(list_T *l, listitem_T *item)
 {
     if (l->lv_last == NULL)
     {
@@ -6446,9 +6350,7 @@
  * Return FAIL when out of memory.
  */
     int
-list_append_tv(l, tv)
-    list_T	*l;
-    typval_T	*tv;
+list_append_tv(list_T *l, typval_T *tv)
 {
     listitem_T	*li = listitem_alloc();
 
@@ -6464,9 +6366,7 @@
  * Return FAIL when out of memory.
  */
     int
-list_append_dict(list, dict)
-    list_T	*list;
-    dict_T	*dict;
+list_append_dict(list_T *list, dict_T *dict)
 {
     listitem_T	*li = listitem_alloc();
 
@@ -6486,10 +6386,7 @@
  * Returns FAIL when out of memory.
  */
     int
-list_append_string(l, str, len)
-    list_T	*l;
-    char_u	*str;
-    int		len;
+list_append_string(list_T *l, char_u *str, int len)
 {
     listitem_T *li = listitem_alloc();
 
@@ -6511,9 +6408,7 @@
  * Returns FAIL when out of memory.
  */
     static int
-list_append_number(l, n)
-    list_T	*l;
-    varnumber_T	n;
+list_append_number(list_T *l, varnumber_T n)
 {
     listitem_T	*li;
 
@@ -6533,10 +6428,7 @@
  * Return FAIL when out of memory.
  */
     int
-list_insert_tv(l, tv, item)
-    list_T	*l;
-    typval_T	*tv;
-    listitem_T	*item;
+list_insert_tv(list_T *l, typval_T *tv, listitem_T *item)
 {
     listitem_T	*ni = listitem_alloc();
 
@@ -6548,10 +6440,7 @@
 }
 
     void
-list_insert(l, ni, item)
-    list_T	*l;
-    listitem_T	*ni;
-    listitem_T	*item;
+list_insert(list_T *l, listitem_T *ni, listitem_T *item)
 {
     if (item == NULL)
 	/* Append new item at end of list. */
@@ -6582,10 +6471,7 @@
  * Returns FAIL when out of memory.
  */
     static int
-list_extend(l1, l2, bef)
-    list_T	*l1;
-    list_T	*l2;
-    listitem_T	*bef;
+list_extend(list_T *l1, list_T *l2, listitem_T *bef)
 {
     listitem_T	*item;
     int		todo = l2->lv_len;
@@ -6603,10 +6489,7 @@
  * Return FAIL when out of memory.
  */
     static int
-list_concat(l1, l2, tv)
-    list_T	*l1;
-    list_T	*l2;
-    typval_T	*tv;
+list_concat(list_T *l1, list_T *l2, typval_T *tv)
 {
     list_T	*l;
 
@@ -6631,10 +6514,7 @@
  * Returns NULL when out of memory.
  */
     static list_T *
-list_copy(orig, deep, copyID)
-    list_T	*orig;
-    int		deep;
-    int		copyID;
+list_copy(list_T *orig, int deep, int copyID)
 {
     list_T	*copy;
     listitem_T	*item;
@@ -6689,10 +6569,7 @@
  * file.
  */
     void
-vimlist_remove(l, item, item2)
-    list_T	*l;
-    listitem_T	*item;
-    listitem_T	*item2;
+vimlist_remove(list_T *l, listitem_T *item, listitem_T *item2)
 {
     listitem_T	*ip;
 
@@ -6721,9 +6598,7 @@
  * May return NULL.
  */
     static char_u *
-list2string(tv, copyID)
-    typval_T	*tv;
-    int		copyID;
+list2string(typval_T *tv, int copyID)
 {
     garray_T	ga;
 
@@ -6747,13 +6622,13 @@
 } join_T;
 
     static int
-list_join_inner(gap, l, sep, echo_style, copyID, join_gap)
-    garray_T	*gap;		/* to store the result in */
-    list_T	*l;
-    char_u	*sep;
-    int		echo_style;
-    int		copyID;
-    garray_T	*join_gap;	/* to keep each list item string */
+list_join_inner(
+    garray_T	*gap,		/* to store the result in */
+    list_T	*l,
+    char_u	*sep,
+    int		echo_style,
+    int		copyID,
+    garray_T	*join_gap)	/* to keep each list item string */
 {
     int		i;
     join_T	*p;
@@ -6825,12 +6700,12 @@
  * Return FAIL or OK.
  */
     static int
-list_join(gap, l, sep, echo_style, copyID)
-    garray_T	*gap;
-    list_T	*l;
-    char_u	*sep;
-    int		echo_style;
-    int		copyID;
+list_join(
+    garray_T	*gap,
+    list_T	*l,
+    char_u	*sep,
+    int		echo_style,
+    int		copyID)
 {
     garray_T	join_ga;
     int		retval;
@@ -6862,7 +6737,7 @@
  * Used for serializing nested structures.
  */
     int
-get_copyID()
+get_copyID(void)
 {
     current_copyID += COPYID_INC;
     return current_copyID;
@@ -6893,7 +6768,7 @@
  * Return TRUE if some memory was freed.
  */
     int
-garbage_collect()
+garbage_collect(void)
 {
     int		copyID;
     int		abort = FALSE;
@@ -7023,8 +6898,7 @@
  * Free lists and dictionaries that are no longer referenced.
  */
     static int
-free_unref_items(copyID)
-    int copyID;
+free_unref_items(int copyID)
 {
     dict_T	*dd, *dd_next;
     list_T	*ll, *ll_next;
@@ -7076,10 +6950,7 @@
  * Returns TRUE if setting references failed somehow.
  */
     int
-set_ref_in_ht(ht, copyID, list_stack)
-    hashtab_T	    *ht;
-    int		    copyID;
-    list_stack_T    **list_stack;
+set_ref_in_ht(hashtab_T *ht, int copyID, list_stack_T **list_stack)
 {
     int		todo;
     int		abort = FALSE;
@@ -7126,10 +6997,7 @@
  * Returns TRUE if setting references failed somehow.
  */
     int
-set_ref_in_list(l, copyID, ht_stack)
-    list_T	*l;
-    int		copyID;
-    ht_stack_T	**ht_stack;
+set_ref_in_list(list_T *l, int copyID, ht_stack_T **ht_stack)
 {
     listitem_T	 *li;
     int		 abort = FALSE;
@@ -7168,11 +7036,11 @@
  * Returns TRUE if setting references failed somehow.
  */
     int
-set_ref_in_item(tv, copyID, ht_stack, list_stack)
-    typval_T	    *tv;
-    int		    copyID;
-    ht_stack_T	    **ht_stack;
-    list_stack_T    **list_stack;
+set_ref_in_item(
+    typval_T	    *tv,
+    int		    copyID,
+    ht_stack_T	    **ht_stack,
+    list_stack_T    **list_stack)
 {
     dict_T	*dd;
     list_T	*ll;
@@ -7239,7 +7107,7 @@
  * Allocate an empty header for a dictionary.
  */
     dict_T *
-dict_alloc()
+dict_alloc(void)
 {
     dict_T *d;
 
@@ -7267,8 +7135,7 @@
  * Returns OK or FAIL.
  */
     int
-rettv_dict_alloc(rettv)
-    typval_T	*rettv;
+rettv_dict_alloc(typval_T *rettv)
 {
     dict_T	*d = dict_alloc();
 
@@ -7287,8 +7154,7 @@
  * becomes zero.
  */
     void
-dict_unref(d)
-    dict_T *d;
+dict_unref(dict_T *d)
 {
     if (d != NULL && --d->dv_refcount <= 0)
 	dict_free(d, TRUE);
@@ -7299,9 +7165,9 @@
  * Ignores the reference count.
  */
     void
-dict_free(d, recurse)
-    dict_T  *d;
-    int	    recurse;	/* Free Lists and Dictionaries recursively. */
+dict_free(
+    dict_T  *d,
+    int	    recurse)	/* Free Lists and Dictionaries recursively. */
 {
     int		todo;
     hashitem_T	*hi;
@@ -7344,8 +7210,7 @@
  * Returns NULL when out of memory.
  */
     dictitem_T *
-dictitem_alloc(key)
-    char_u	*key;
+dictitem_alloc(char_u *key)
 {
     dictitem_T *di;
 
@@ -7362,8 +7227,7 @@
  * Make a copy of a Dictionary item.
  */
     static dictitem_T *
-dictitem_copy(org)
-    dictitem_T *org;
+dictitem_copy(dictitem_T *org)
 {
     dictitem_T *di;
 
@@ -7382,9 +7246,7 @@
  * Remove item "item" from Dictionary "dict" and free it.
  */
     static void
-dictitem_remove(dict, item)
-    dict_T	*dict;
-    dictitem_T	*item;
+dictitem_remove(dict_T *dict, dictitem_T *item)
 {
     hashitem_T	*hi;
 
@@ -7400,8 +7262,7 @@
  * Free a dict item.  Also clears the value.
  */
     void
-dictitem_free(item)
-    dictitem_T *item;
+dictitem_free(dictitem_T *item)
 {
     clear_tv(&item->di_tv);
     if (item->di_flags & DI_FLAGS_ALLOC)
@@ -7415,10 +7276,7 @@
  * Returns NULL when out of memory.
  */
     static dict_T *
-dict_copy(orig, deep, copyID)
-    dict_T	*orig;
-    int		deep;
-    int		copyID;
+dict_copy(dict_T *orig, int deep, int copyID)
 {
     dict_T	*copy;
     dictitem_T	*di;
@@ -7481,9 +7339,7 @@
  * Returns FAIL when out of memory and when key already exists.
  */
     int
-dict_add(d, item)
-    dict_T	*d;
-    dictitem_T	*item;
+dict_add(dict_T *d, dictitem_T *item)
 {
     return hash_add(&d->dv_hashtab, item->di_key);
 }
@@ -7494,11 +7350,11 @@
  * Returns FAIL when out of memory and when key already exists.
  */
     int
-dict_add_nr_str(d, key, nr, str)
-    dict_T	*d;
-    char	*key;
-    long	nr;
-    char_u	*str;
+dict_add_nr_str(
+    dict_T	*d,
+    char	*key,
+    long	nr,
+    char_u	*str)
 {
     dictitem_T	*item;
 
@@ -7529,10 +7385,7 @@
  * Returns FAIL when out of memory and when key already exists.
  */
     int
-dict_add_list(d, key, list)
-    dict_T	*d;
-    char	*key;
-    list_T	*list;
+dict_add_list(dict_T *d, char *key, list_T *list)
 {
     dictitem_T	*item;
 
@@ -7555,8 +7408,7 @@
  * Get the number of items in a Dictionary.
  */
     static long
-dict_len(d)
-    dict_T	*d;
+dict_len(dict_T *d)
 {
     if (d == NULL)
 	return 0L;
@@ -7569,10 +7421,7 @@
  * Returns NULL when not found.
  */
     dictitem_T *
-dict_find(d, key, len)
-    dict_T	*d;
-    char_u	*key;
-    int		len;
+dict_find(dict_T *d, char_u *key, int len)
 {
 #define AKEYLEN 200
     char_u	buf[AKEYLEN];
@@ -7608,10 +7457,7 @@
  * Returns NULL if the entry doesn't exist or out of memory.
  */
     char_u *
-get_dict_string(d, key, save)
-    dict_T	*d;
-    char_u	*key;
-    int		save;
+get_dict_string(dict_T *d, char_u *key, int save)
 {
     dictitem_T	*di;
     char_u	*s;
@@ -7630,9 +7476,7 @@
  * Returns 0 if the entry doesn't exist or out of memory.
  */
     long
-get_dict_number(d, key)
-    dict_T	*d;
-    char_u	*key;
+get_dict_number(dict_T *d, char_u *key)
 {
     dictitem_T	*di;
 
@@ -7647,9 +7491,7 @@
  * May return NULL.
  */
     static char_u *
-dict2string(tv, copyID)
-    typval_T	*tv;
-    int		copyID;
+dict2string(typval_T *tv, int copyID)
 {
     garray_T	ga;
     int		first = TRUE;
@@ -7710,10 +7552,7 @@
  * Return OK or FAIL.  Returns NOTDONE for {expr}.
  */
     static int
-get_dict_tv(arg, rettv, evaluate)
-    char_u	**arg;
-    typval_T	*rettv;
-    int		evaluate;
+get_dict_tv(char_u **arg, typval_T *rettv, int evaluate)
 {
     dict_T	*d = NULL;
     typval_T	tvkey;
@@ -7852,11 +7691,11 @@
  * May return NULL.
  */
     static char_u *
-echo_string(tv, tofree, numbuf, copyID)
-    typval_T	*tv;
-    char_u	**tofree;
-    char_u	*numbuf;
-    int		copyID;
+echo_string(
+    typval_T	*tv,
+    char_u	**tofree,
+    char_u	*numbuf,
+    int		copyID)
 {
     static int	recurse = 0;
     char_u	*r = NULL;
@@ -7958,11 +7797,11 @@
  * May return NULL.
  */
     static char_u *
-tv2string(tv, tofree, numbuf, copyID)
-    typval_T	*tv;
-    char_u	**tofree;
-    char_u	*numbuf;
-    int		copyID;
+tv2string(
+    typval_T	*tv,
+    char_u	**tofree,
+    char_u	*numbuf,
+    int		copyID)
 {
     switch (tv->v_type)
     {
@@ -7995,9 +7834,7 @@
  * If "function" is TRUE make it function('string').
  */
     static char_u *
-string_quote(str, function)
-    char_u	*str;
-    int		function;
+string_quote(char_u *str, int function)
 {
     unsigned	len;
     char_u	*p, *r, *s;
@@ -8043,9 +7880,9 @@
  * Returns the length of the text that was consumed.
  */
     int
-string2float(text, value)
-    char_u	*text;
-    float_T	*value;	    /* result stored here */
+string2float(
+    char_u	*text,
+    float_T	*value)	    /* result stored here */
 {
     char	*s = (char *)text;
     float_T	f;
@@ -8063,10 +7900,7 @@
  * Return FAIL if the name is invalid.
  */
     static int
-get_env_tv(arg, rettv, evaluate)
-    char_u	**arg;
-    typval_T	*rettv;
-    int		evaluate;
+get_env_tv(char_u **arg, typval_T *rettv, int evaluate)
 {
     char_u	*string = NULL;
     int		len;
@@ -8481,9 +8315,7 @@
  * or user defined function names.
  */
     char_u *
-get_function_name(xp, idx)
-    expand_T	*xp;
-    int		idx;
+get_function_name(expand_T *xp, int idx)
 {
     static int	intidx = -1;
     char_u	*name;
@@ -8513,9 +8345,7 @@
  * user defined variable or function names.
  */
     char_u *
-get_expr_name(xp, idx)
-    expand_T	*xp;
-    int		idx;
+get_expr_name(expand_T *xp, int idx)
 {
     static int	intidx = -1;
     char_u	*name;
@@ -8538,9 +8368,7 @@
  * Compare struct fst by function name.
  */
     static int
-compare_func_name(s1, s2)
-    const void *s1;
-    const void *s2;
+compare_func_name(const void *s1, const void *s2)
 {
     struct fst *p1 = (struct fst *)s1;
     struct fst *p2 = (struct fst *)s2;
@@ -8554,7 +8382,7 @@
  * On machines using EBCDIC we have to sort it.
  */
     static void
-sortFunctions()
+sortFunctions(void)
 {
     int		funcCnt = (int)(sizeof(functions) / sizeof(struct fst)) - 1;
 
@@ -8568,8 +8396,8 @@
  * Return index, or -1 if not found
  */
     static int
-find_internal_func(name)
-    char_u	*name;		/* name of the function */
+find_internal_func(
+    char_u	*name)		/* name of the function */
 {
     int		first = 0;
     int		last = (int)(sizeof(functions) / sizeof(struct fst)) - 1;
@@ -8598,10 +8426,7 @@
  * name it contains, otherwise return "name".
  */
     static char_u *
-deref_func_name(name, lenp, no_autoload)
-    char_u	*name;
-    int		*lenp;
-    int		no_autoload;
+deref_func_name(char_u *name, int *lenp, int no_autoload)
 {
     dictitem_T	*v;
     int		cc;
@@ -8629,17 +8454,16 @@
  * Return OK or FAIL.
  */
     static int
-get_func_tv(name, len, rettv, arg, firstline, lastline, doesrange,
-							   evaluate, selfdict)
-    char_u	*name;		/* name of the function */
-    int		len;		/* length of "name" */
-    typval_T	*rettv;
-    char_u	**arg;		/* argument, pointing to the '(' */
-    linenr_T	firstline;	/* first line of range */
-    linenr_T	lastline;	/* last line of range */
-    int		*doesrange;	/* return: function handled range */
-    int		evaluate;
-    dict_T	*selfdict;	/* Dictionary for "self" */
+get_func_tv(
+    char_u	*name,		/* name of the function */
+    int		len,		/* length of "name" */
+    typval_T	*rettv,
+    char_u	**arg,		/* argument, pointing to the '(' */
+    linenr_T	firstline,	/* first line of range */
+    linenr_T	lastline,	/* last line of range */
+    int		*doesrange,	/* return: function handled range */
+    int		evaluate,
+    dict_T	*selfdict)	/* Dictionary for "self" */
 {
     char_u	*argp;
     int		ret = OK;
@@ -8694,19 +8518,18 @@
  * Also returns OK when an error was encountered while executing the function.
  */
     int
-call_func(funcname, len, rettv, argcount, argvars, firstline, lastline,
-						doesrange, evaluate, selfdict)
-    char_u	*funcname;	/* name of the function */
-    int		len;		/* length of "name" */
-    typval_T	*rettv;		/* return value goes here */
-    int		argcount;	/* number of "argvars" */
-    typval_T	*argvars;	/* vars for arguments, must have "argcount"
+call_func(
+    char_u	*funcname,	/* name of the function */
+    int		len,		/* length of "name" */
+    typval_T	*rettv,		/* return value goes here */
+    int		argcount,	/* number of "argvars" */
+    typval_T	*argvars,	/* vars for arguments, must have "argcount"
 				   PLUS ONE elements! */
-    linenr_T	firstline;	/* first line of range */
-    linenr_T	lastline;	/* last line of range */
-    int		*doesrange;	/* return: function handled range */
-    int		evaluate;
-    dict_T	*selfdict;	/* Dictionary for "self" */
+    linenr_T	firstline,	/* first line of range */
+    linenr_T	lastline,	/* last line of range */
+    int		*doesrange,	/* return: function handled range */
+    int		evaluate,
+    dict_T	*selfdict)	/* Dictionary for "self" */
 {
     int		ret = FAIL;
 #define ERROR_UNKNOWN	0
@@ -8933,9 +8756,7 @@
  * "ermsg" is to be passed without translation, use N_() instead of _().
  */
     static void
-emsg_funcname(ermsg, name)
-    char	*ermsg;
-    char_u	*name;
+emsg_funcname(char *ermsg, char_u *name)
 {
     char_u	*p;
 
@@ -8952,8 +8773,7 @@
  * Return TRUE for a non-zero Number and a non-empty String.
  */
     static int
-non_zero_arg(argvars)
-    typval_T	*argvars;
+non_zero_arg(typval_T *argvars)
 {
     return ((argvars[0].v_type == VAR_NUMBER
 		&& argvars[0].vval.v_number != 0)
@@ -8974,9 +8794,7 @@
  * Returns FAIL when the argument is not a Number or Float.
  */
     static int
-get_float_arg(argvars, f)
-    typval_T	*argvars;
-    float_T	*f;
+get_float_arg(typval_T *argvars, float_T *f)
 {
     if (argvars[0].v_type == VAR_FLOAT)
     {
@@ -8996,9 +8814,7 @@
  * "abs(expr)" function
  */
     static void
-f_abs(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv;
+f_abs(typval_T *argvars, typval_T *rettv)
 {
     if (argvars[0].v_type == VAR_FLOAT)
     {
@@ -9024,9 +8840,7 @@
  * "acos()" function
  */
     static void
-f_acos(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv;
+f_acos(typval_T *argvars, typval_T *rettv)
 {
     float_T	f;
 
@@ -9042,9 +8856,7 @@
  * "add(list, item)" function
  */
     static void
-f_add(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv;
+f_add(typval_T *argvars, typval_T *rettv)
 {
     list_T	*l;
 
@@ -9065,9 +8877,7 @@
  * "alloc_fail(id, countdown, repeat)" function
  */
     static void
-f_alloc_fail(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv UNUSED;
+f_alloc_fail(typval_T *argvars, typval_T *rettv UNUSED)
 {
     if (argvars[0].v_type != VAR_NUMBER
 	    || argvars[0].vval.v_number <= 0
@@ -9090,9 +8900,7 @@
  * "and(expr, expr)" function
  */
     static void
-f_and(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv;
+f_and(typval_T *argvars, typval_T *rettv)
 {
     rettv->vval.v_number = get_tv_number_chk(&argvars[0], NULL)
 					& get_tv_number_chk(&argvars[1], NULL);
@@ -9102,9 +8910,7 @@
  * "append(lnum, string/list)" function
  */
     static void
-f_append(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv;
+f_append(typval_T *argvars, typval_T *rettv)
 {
     long	lnum;
     char_u	*line;
@@ -9166,9 +8972,7 @@
  * "argc()" function
  */
     static void
-f_argc(argvars, rettv)
-    typval_T	*argvars UNUSED;
-    typval_T	*rettv;
+f_argc(typval_T *argvars UNUSED, typval_T *rettv)
 {
     rettv->vval.v_number = ARGCOUNT;
 }
@@ -9177,9 +8981,7 @@
  * "argidx()" function
  */
     static void
-f_argidx(argvars, rettv)
-    typval_T	*argvars UNUSED;
-    typval_T	*rettv;
+f_argidx(typval_T *argvars UNUSED, typval_T *rettv)
 {
     rettv->vval.v_number = curwin->w_arg_idx;
 }
@@ -9188,9 +8990,7 @@
  * "arglistid()" function
  */
     static void
-f_arglistid(argvars, rettv)
-    typval_T	*argvars UNUSED;
-    typval_T	*rettv;
+f_arglistid(typval_T *argvars UNUSED, typval_T *rettv)
 {
     win_T	*wp;
 
@@ -9204,9 +9004,7 @@
  * "argv(nr)" function
  */
     static void
-f_argv(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv;
+f_argv(typval_T *argvars, typval_T *rettv)
 {
     int		idx;
 
@@ -9234,8 +9032,7 @@
  * Prepare "gap" for an assert error and add the sourcing position.
  */
     static void
-prepare_assert_error(gap)
-    garray_T	*gap;
+prepare_assert_error(garray_T *gap)
 {
     char buf[NUMBUFLEN];
 
@@ -9259,12 +9056,12 @@
  * Fill "gap" with information about an assert error.
  */
     static void
-fill_assert_error(gap, opt_msg_tv, exp_str, exp_tv, got_tv)
-    garray_T	*gap;
-    typval_T	*opt_msg_tv;
-    char_u      *exp_str;
-    typval_T	*exp_tv;
-    typval_T	*got_tv;
+fill_assert_error(
+    garray_T	*gap,
+    typval_T	*opt_msg_tv,
+    char_u      *exp_str,
+    typval_T	*exp_tv,
+    typval_T	*got_tv)
 {
     char_u	numbuf[NUMBUFLEN];
     char_u	*tofree;
@@ -9294,8 +9091,7 @@
  * Add an assert error to v:errors.
  */
     static void
-assert_error(gap)
-    garray_T	*gap;
+assert_error(garray_T *gap)
 {
     struct vimvar   *vp = &vimvars[VV_ERRORS];
 
@@ -9309,9 +9105,7 @@
  * "assert_equal(expected, actual[, msg])" function
  */
     static void
-f_assert_equal(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv UNUSED;
+f_assert_equal(typval_T *argvars, typval_T *rettv UNUSED)
 {
     garray_T	ga;
 
@@ -9328,9 +9122,7 @@
  * "assert_exception(string[, msg])" function
  */
     static void
-f_assert_exception(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv UNUSED;
+f_assert_exception(typval_T *argvars, typval_T *rettv UNUSED)
 {
     garray_T	ga;
     char	*error;
@@ -9358,9 +9150,7 @@
  * "assert_fails(cmd [, error])" function
  */
     static void
-f_assert_fails(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv UNUSED;
+f_assert_fails(typval_T *argvars, typval_T *rettv UNUSED)
 {
     char_u	*cmd = get_tv_string_chk(&argvars[0]);
     garray_T	ga;
@@ -9403,9 +9193,7 @@
  * Common for assert_true() and assert_false().
  */
     static void
-assert_bool(argvars, isTrue)
-    typval_T	*argvars;
-    int		isTrue;
+assert_bool(typval_T *argvars, int isTrue)
 {
     int		error = FALSE;
     garray_T	ga;
@@ -9427,9 +9215,7 @@
  * "assert_false(actual[, msg])" function
  */
     static void
-f_assert_false(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv UNUSED;
+f_assert_false(typval_T *argvars, typval_T *rettv UNUSED)
 {
     assert_bool(argvars, FALSE);
 }
@@ -9438,9 +9224,7 @@
  * "assert_true(actual[, msg])" function
  */
     static void
-f_assert_true(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv UNUSED;
+f_assert_true(typval_T *argvars, typval_T *rettv UNUSED)
 {
     assert_bool(argvars, TRUE);
 }
@@ -9450,9 +9234,7 @@
  * "asin()" function
  */
     static void
-f_asin(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv;
+f_asin(typval_T *argvars, typval_T *rettv)
 {
     float_T	f;
 
@@ -9467,9 +9249,7 @@
  * "atan()" function
  */
     static void
-f_atan(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv;
+f_atan(typval_T *argvars, typval_T *rettv)
 {
     float_T	f;
 
@@ -9484,9 +9264,7 @@
  * "atan2()" function
  */
     static void
-f_atan2(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv;
+f_atan2(typval_T *argvars, typval_T *rettv)
 {
     float_T	fx, fy;
 
@@ -9503,9 +9281,7 @@
  * "browse(save, title, initdir, default)" function
  */
     static void
-f_browse(argvars, rettv)
-    typval_T	*argvars UNUSED;
-    typval_T	*rettv;
+f_browse(typval_T *argvars UNUSED, typval_T *rettv)
 {
 #ifdef FEAT_BROWSE
     int		save;
@@ -9537,9 +9313,7 @@
  * "browsedir(title, initdir)" function
  */
     static void
-f_browsedir(argvars, rettv)
-    typval_T	*argvars UNUSED;
-    typval_T	*rettv;
+f_browsedir(typval_T *argvars UNUSED, typval_T *rettv)
 {
 #ifdef FEAT_BROWSE
     char_u	*title;
@@ -9566,8 +9340,7 @@
  * Find a buffer by number or exact name.
  */
     static buf_T *
-find_buffer(avar)
-    typval_T	*avar;
+find_buffer(typval_T *avar)
 {
     buf_T	*buf = NULL;
 
@@ -9598,9 +9371,7 @@
  * "bufexists(expr)" function
  */
     static void
-f_bufexists(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv;
+f_bufexists(typval_T *argvars, typval_T *rettv)
 {
     rettv->vval.v_number = (find_buffer(&argvars[0]) != NULL);
 }
@@ -9609,9 +9380,7 @@
  * "buflisted(expr)" function
  */
     static void
-f_buflisted(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv;
+f_buflisted(typval_T *argvars, typval_T *rettv)
 {
     buf_T	*buf;
 
@@ -9623,9 +9392,7 @@
  * "bufloaded(expr)" function
  */
     static void
-f_bufloaded(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv;
+f_bufloaded(typval_T *argvars, typval_T *rettv)
 {
     buf_T	*buf;
 
@@ -9639,9 +9406,7 @@
  * Get buffer by number or pattern.
  */
     static buf_T *
-get_buf_tv(tv, curtab_only)
-    typval_T	*tv;
-    int		curtab_only;
+get_buf_tv(typval_T *tv, int curtab_only)
 {
     char_u	*name = tv->vval.v_string;
     int		save_magic;
@@ -9680,9 +9445,7 @@
  * "bufname(expr)" function
  */
     static void
-f_bufname(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv;
+f_bufname(typval_T *argvars, typval_T *rettv)
 {
     buf_T	*buf;
 
@@ -9701,9 +9464,7 @@
  * "bufnr(expr)" function
  */
     static void
-f_bufnr(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv;
+f_bufnr(typval_T *argvars, typval_T *rettv)
 {
     buf_T	*buf;
     int		error = FALSE;
@@ -9734,9 +9495,7 @@
  * "bufwinnr(nr)" function
  */
     static void
-f_bufwinnr(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv;
+f_bufwinnr(typval_T *argvars, typval_T *rettv)
 {
 #ifdef FEAT_WINDOWS
     win_T	*wp;
@@ -9765,9 +9524,7 @@
  * "byte2line(byte)" function
  */
     static void
-f_byte2line(argvars, rettv)
-    typval_T	*argvars UNUSED;
-    typval_T	*rettv;
+f_byte2line(typval_T *argvars UNUSED, typval_T *rettv)
 {
 #ifndef FEAT_BYTEOFF
     rettv->vval.v_number = -1;
@@ -9784,10 +9541,7 @@
 }
 
     static void
-byteidx(argvars, rettv, comp)
-    typval_T	*argvars;
-    typval_T	*rettv;
-    int		comp UNUSED;
+byteidx(typval_T *argvars, typval_T *rettv, int comp UNUSED)
 {
 #ifdef FEAT_MBYTE
     char_u	*t;
@@ -9823,9 +9577,7 @@
  * "byteidx()" function
  */
     static void
-f_byteidx(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv;
+f_byteidx(typval_T *argvars, typval_T *rettv)
 {
     byteidx(argvars, rettv, FALSE);
 }
@@ -9834,19 +9586,17 @@
  * "byteidxcomp()" function
  */
     static void
-f_byteidxcomp(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv;
+f_byteidxcomp(typval_T *argvars, typval_T *rettv)
 {
     byteidx(argvars, rettv, TRUE);
 }
 
     int
-func_call(name, args, selfdict, rettv)
-    char_u	*name;
-    typval_T	*args;
-    dict_T	*selfdict;
-    typval_T	*rettv;
+func_call(
+    char_u	*name,
+    typval_T	*args,
+    dict_T	*selfdict,
+    typval_T	*rettv)
 {
     listitem_T	*item;
     typval_T	argv[MAX_FUNC_ARGS + 1];
@@ -9884,9 +9634,7 @@
  * "call(func, arglist)" function
  */
     static void
-f_call(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv;
+f_call(typval_T *argvars, typval_T *rettv)
 {
     char_u	*func;
     dict_T	*selfdict = NULL;
@@ -9924,9 +9672,7 @@
  * "ceil({float})" function
  */
     static void
-f_ceil(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv;
+f_ceil(typval_T *argvars, typval_T *rettv)
 {
     float_T	f;
 
@@ -9942,9 +9688,7 @@
  * "changenr()" function
  */
     static void
-f_changenr(argvars, rettv)
-    typval_T	*argvars UNUSED;
-    typval_T	*rettv;
+f_changenr(typval_T *argvars UNUSED, typval_T *rettv)
 {
     rettv->vval.v_number = curbuf->b_u_seq_cur;
 }
@@ -9953,9 +9697,7 @@
  * "char2nr(string)" function
  */
     static void
-f_char2nr(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv;
+f_char2nr(typval_T *argvars, typval_T *rettv)
 {
 #ifdef FEAT_MBYTE
     if (has_mbyte)
@@ -9979,9 +9721,7 @@
  * "cindent(lnum)" function
  */
     static void
-f_cindent(argvars, rettv)
-    typval_T	*argvars UNUSED;
-    typval_T	*rettv;
+f_cindent(typval_T *argvars UNUSED, typval_T *rettv)
 {
 #ifdef FEAT_CINDENT
     pos_T	pos;
@@ -10004,9 +9744,7 @@
  * "clearmatches()" function
  */
     static void
-f_clearmatches(argvars, rettv)
-    typval_T	*argvars UNUSED;
-    typval_T	*rettv UNUSED;
+f_clearmatches(typval_T *argvars UNUSED, typval_T *rettv UNUSED)
 {
 #ifdef FEAT_SEARCH_EXTRA
     clear_matches(curwin);
@@ -10017,9 +9755,7 @@
  * "col(string)" function
  */
     static void
-f_col(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv;
+f_col(typval_T *argvars, typval_T *rettv)
 {
     colnr_T	col = 0;
     pos_T	*fp;
@@ -10071,9 +9807,7 @@
  * "complete()" function
  */
     static void
-f_complete(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv UNUSED;
+f_complete(typval_T *argvars, typval_T *rettv UNUSED)
 {
     int	    startcol;
 
@@ -10105,9 +9839,7 @@
  * "complete_add()" function
  */
     static void
-f_complete_add(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv;
+f_complete_add(typval_T *argvars, typval_T *rettv)
 {
     rettv->vval.v_number = ins_compl_add_tv(&argvars[0], 0);
 }
@@ -10116,9 +9848,7 @@
  * "complete_check()" function
  */
     static void
-f_complete_check(argvars, rettv)
-    typval_T	*argvars UNUSED;
-    typval_T	*rettv;
+f_complete_check(typval_T *argvars UNUSED, typval_T *rettv)
 {
     int		saved = RedrawingDisabled;
 
@@ -10133,9 +9863,7 @@
  * "confirm(message, buttons[, default [, type]])" function
  */
     static void
-f_confirm(argvars, rettv)
-    typval_T	*argvars UNUSED;
-    typval_T	*rettv UNUSED;
+f_confirm(typval_T *argvars UNUSED, typval_T *rettv UNUSED)
 {
 #if defined(FEAT_GUI_DIALOG) || defined(FEAT_CON_DIALOG)
     char_u	*message;
@@ -10191,9 +9919,7 @@
  * "copy()" function
  */
     static void
-f_copy(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv;
+f_copy(typval_T *argvars, typval_T *rettv)
 {
     item_copy(&argvars[0], rettv, FALSE, 0);
 }
@@ -10203,9 +9929,7 @@
  * "cos()" function
  */
     static void
-f_cos(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv;
+f_cos(typval_T *argvars, typval_T *rettv)
 {
     float_T	f;
 
@@ -10220,9 +9944,7 @@
  * "cosh()" function
  */
     static void
-f_cosh(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv;
+f_cosh(typval_T *argvars, typval_T *rettv)
 {
     float_T	f;
 
@@ -10238,9 +9960,7 @@
  * "count()" function
  */
     static void
-f_count(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv;
+f_count(typval_T *argvars, typval_T *rettv)
 {
     long	n = 0;
     int		ic = FALSE;
@@ -10333,9 +10053,7 @@
  * "connect()" function
  */
     static void
-f_connect(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv;
+f_connect(typval_T *argvars, typval_T *rettv)
 {
     char_u	*address;
     char_u	*mode;
@@ -10395,9 +10113,7 @@
  * Checks the existence of a cscope connection.
  */
     static void
-f_cscope_connection(argvars, rettv)
-    typval_T	*argvars UNUSED;
-    typval_T	*rettv UNUSED;
+f_cscope_connection(typval_T *argvars UNUSED, typval_T *rettv UNUSED)
 {
 #ifdef FEAT_CSCOPE
     int		num = 0;
@@ -10426,9 +10142,7 @@
  * Returns 0 when the position could be set, -1 otherwise.
  */
     static void
-f_cursor(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv;
+f_cursor(typval_T *argvars, typval_T *rettv)
 {
     long	line, col;
 #ifdef FEAT_VIRTUALEDIT
@@ -10497,9 +10211,7 @@
  * "deepcopy()" function
  */
     static void
-f_deepcopy(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv;
+f_deepcopy(typval_T *argvars, typval_T *rettv)
 {
     int		noref = 0;
 
@@ -10518,9 +10230,7 @@
  * "delete()" function
  */
     static void
-f_delete(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv;
+f_delete(typval_T *argvars, typval_T *rettv)
 {
     char_u	nbuf[NUMBUFLEN];
     char_u	*name;
@@ -10559,9 +10269,7 @@
  * "did_filetype()" function
  */
     static void
-f_did_filetype(argvars, rettv)
-    typval_T	*argvars UNUSED;
-    typval_T	*rettv UNUSED;
+f_did_filetype(typval_T *argvars UNUSED, typval_T *rettv UNUSED)
 {
 #ifdef FEAT_AUTOCMD
     rettv->vval.v_number = did_filetype;
@@ -10572,9 +10280,7 @@
  * "diff_filler()" function
  */
     static void
-f_diff_filler(argvars, rettv)
-    typval_T	*argvars UNUSED;
-    typval_T	*rettv UNUSED;
+f_diff_filler(typval_T *argvars UNUSED, typval_T *rettv UNUSED)
 {
 #ifdef FEAT_DIFF
     rettv->vval.v_number = diff_check_fill(curwin, get_tv_lnum(argvars));
@@ -10585,9 +10291,7 @@
  * "diff_hlID()" function
  */
     static void
-f_diff_hlID(argvars, rettv)
-    typval_T	*argvars UNUSED;
-    typval_T	*rettv UNUSED;
+f_diff_hlID(typval_T *argvars UNUSED, typval_T *rettv UNUSED)
 {
 #ifdef FEAT_DIFF
     linenr_T		lnum = get_tv_lnum(argvars);
@@ -10670,9 +10374,7 @@
  * "disconnect()" function
  */
     static void
-f_disconnect(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv UNUSED;
+f_disconnect(typval_T *argvars, typval_T *rettv UNUSED)
 {
     int ch_idx = get_channel_arg(&argvars[0]);
 
@@ -10685,9 +10387,7 @@
  * "empty({expr})" function
  */
     static void
-f_empty(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv;
+f_empty(typval_T *argvars, typval_T *rettv)
 {
     int		n;
 
@@ -10730,9 +10430,7 @@
  * "escape({string}, {chars})" function
  */
     static void
-f_escape(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv;
+f_escape(typval_T *argvars, typval_T *rettv)
 {
     char_u	buf[NUMBUFLEN];
 
@@ -10745,9 +10443,7 @@
  * "eval()" function
  */
     static void
-f_eval(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv;
+f_eval(typval_T *argvars, typval_T *rettv)
 {
     char_u	*s, *p;
 
@@ -10772,9 +10468,7 @@
  * "eventhandler()" function
  */
     static void
-f_eventhandler(argvars, rettv)
-    typval_T	*argvars UNUSED;
-    typval_T	*rettv;
+f_eventhandler(typval_T *argvars UNUSED, typval_T *rettv)
 {
     rettv->vval.v_number = vgetc_busy;
 }
@@ -10783,9 +10477,7 @@
  * "executable()" function
  */
     static void
-f_executable(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv;
+f_executable(typval_T *argvars, typval_T *rettv)
 {
     char_u *name = get_tv_string(&argvars[0]);
 
@@ -10798,9 +10490,7 @@
  * "exepath()" function
  */
     static void
-f_exepath(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv;
+f_exepath(typval_T *argvars, typval_T *rettv)
 {
     char_u *p = NULL;
 
@@ -10813,9 +10503,7 @@
  * "exists()" function
  */
     static void
-f_exists(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv;
+f_exists(typval_T *argvars, typval_T *rettv)
 {
     char_u	*p;
     char_u	*name;
@@ -10895,9 +10583,7 @@
  * "exp()" function
  */
     static void
-f_exp(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv;
+f_exp(typval_T *argvars, typval_T *rettv)
 {
     float_T	f;
 
@@ -10913,9 +10599,7 @@
  * "expand()" function
  */
     static void
-f_expand(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv;
+f_expand(typval_T *argvars, typval_T *rettv)
 {
     char_u	*s;
     int		len;
@@ -10989,10 +10673,7 @@
  * Otherwise duplicate keys are ignored ("action" is "keep").
  */
     void
-dict_extend(d1, d2, action)
-    dict_T	*d1;
-    dict_T	*d2;
-    char_u	*action;
+dict_extend(dict_T *d1, dict_T *d2, char_u *action)
 {
     dictitem_T	*di1;
     hashitem_T	*hi2;
@@ -11047,9 +10728,7 @@
  * "extend(dict, dict [, action])" function
  */
     static void
-f_extend(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv;
+f_extend(typval_T *argvars, typval_T *rettv)
 {
     char_u      *arg_errmsg = (char_u *)N_("extend() argument");
 
@@ -11134,9 +10813,7 @@
  * "feedkeys()" function
  */
     static void
-f_feedkeys(argvars, rettv)
-    typval_T    *argvars;
-    typval_T    *rettv UNUSED;
+f_feedkeys(typval_T *argvars, typval_T *rettv UNUSED)
 {
     int		remap = TRUE;
     int		insert = FALSE;
@@ -11191,9 +10868,7 @@
  * "filereadable()" function
  */
     static void
-f_filereadable(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv;
+f_filereadable(typval_T *argvars, typval_T *rettv)
 {
     int		fd;
     char_u	*p;
@@ -11220,9 +10895,7 @@
  * rights to write into.
  */
     static void
-f_filewritable(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv;
+f_filewritable(typval_T *argvars, typval_T *rettv)
 {
     rettv->vval.v_number = filewritable(get_tv_string(&argvars[0]));
 }
@@ -11303,10 +10976,7 @@
  * Implementation of map() and filter().
  */
     static void
-filter_map(argvars, rettv, map)
-    typval_T	*argvars;
-    typval_T	*rettv;
-    int		map;
+filter_map(typval_T *argvars, typval_T *rettv, int map)
 {
     char_u	buf[NUMBUFLEN];
     char_u	*expr;
@@ -11423,11 +11093,7 @@
 }
 
     static int
-filter_map_one(tv, expr, map, remp)
-    typval_T	*tv;
-    char_u	*expr;
-    int		map;
-    int		*remp;
+filter_map_one(typval_T *tv, char_u *expr, int map, int *remp)
 {
     typval_T	rettv;
     char_u	*s;
@@ -11472,9 +11138,7 @@
  * "filter()" function
  */
     static void
-f_filter(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv;
+f_filter(typval_T *argvars, typval_T *rettv)
 {
     filter_map(argvars, rettv, FALSE);
 }
@@ -11483,9 +11147,7 @@
  * "finddir({fname}[, {path}[, {count}]])" function
  */
     static void
-f_finddir(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv;
+f_finddir(typval_T *argvars, typval_T *rettv)
 {
     findfilendir(argvars, rettv, FINDFILE_DIR);
 }
@@ -11494,9 +11156,7 @@
  * "findfile({fname}[, {path}[, {count}]])" function
  */
     static void
-f_findfile(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv;
+f_findfile(typval_T *argvars, typval_T *rettv)
 {
     findfilendir(argvars, rettv, FINDFILE_FILE);
 }
@@ -11506,9 +11166,7 @@
  * "float2nr({float})" function
  */
     static void
-f_float2nr(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv;
+f_float2nr(typval_T *argvars, typval_T *rettv)
 {
     float_T	f;
 
@@ -11527,9 +11185,7 @@
  * "floor({float})" function
  */
     static void
-f_floor(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv;
+f_floor(typval_T *argvars, typval_T *rettv)
 {
     float_T	f;
 
@@ -11544,9 +11200,7 @@
  * "fmod()" function
  */
     static void
-f_fmod(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv;
+f_fmod(typval_T *argvars, typval_T *rettv)
 {
     float_T	fx, fy;
 
@@ -11563,9 +11217,7 @@
  * "fnameescape({string})" function
  */
     static void
-f_fnameescape(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv;
+f_fnameescape(typval_T *argvars, typval_T *rettv)
 {
     rettv->vval.v_string = vim_strsave_fnameescape(
 					   get_tv_string(&argvars[0]), FALSE);
@@ -11576,9 +11228,7 @@
  * "fnamemodify({fname}, {mods})" function
  */
     static void
-f_fnamemodify(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv;
+f_fnamemodify(typval_T *argvars, typval_T *rettv)
 {
     char_u	*fname;
     char_u	*mods;
@@ -11611,10 +11261,10 @@
  * "foldclosed()" function
  */
     static void
-foldclosed_both(argvars, rettv, end)
-    typval_T	*argvars UNUSED;
-    typval_T	*rettv;
-    int		end UNUSED;
+foldclosed_both(
+    typval_T	*argvars UNUSED,
+    typval_T	*rettv,
+    int		end UNUSED)
 {
 #ifdef FEAT_FOLDING
     linenr_T	lnum;
@@ -11640,9 +11290,7 @@
  * "foldclosed()" function
  */
     static void
-f_foldclosed(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv;
+f_foldclosed(typval_T *argvars, typval_T *rettv)
 {
     foldclosed_both(argvars, rettv, FALSE);
 }
@@ -11651,9 +11299,7 @@
  * "foldclosedend()" function
  */
     static void
-f_foldclosedend(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv;
+f_foldclosedend(typval_T *argvars, typval_T *rettv)
 {
     foldclosed_both(argvars, rettv, TRUE);
 }
@@ -11662,9 +11308,7 @@
  * "foldlevel()" function
  */
     static void
-f_foldlevel(argvars, rettv)
-    typval_T	*argvars UNUSED;
-    typval_T	*rettv UNUSED;
+f_foldlevel(typval_T *argvars UNUSED, typval_T *rettv UNUSED)
 {
 #ifdef FEAT_FOLDING
     linenr_T	lnum;
@@ -11679,9 +11323,7 @@
  * "foldtext()" function
  */
     static void
-f_foldtext(argvars, rettv)
-    typval_T	*argvars UNUSED;
-    typval_T	*rettv;
+f_foldtext(typval_T *argvars UNUSED, typval_T *rettv)
 {
 #ifdef FEAT_FOLDING
     linenr_T	lnum;
@@ -11746,9 +11388,7 @@
  * "foldtextresult(lnum)" function
  */
     static void
-f_foldtextresult(argvars, rettv)
-    typval_T	*argvars UNUSED;
-    typval_T	*rettv;
+f_foldtextresult(typval_T *argvars UNUSED, typval_T *rettv)
 {
 #ifdef FEAT_FOLDING
     linenr_T	lnum;
@@ -11781,9 +11421,7 @@
  * "foreground()" function
  */
     static void
-f_foreground(argvars, rettv)
-    typval_T	*argvars UNUSED;
-    typval_T	*rettv UNUSED;
+f_foreground(typval_T *argvars UNUSED, typval_T *rettv UNUSED)
 {
 #ifdef FEAT_GUI
     if (gui.in_use)
@@ -11799,9 +11437,7 @@
  * "function()" function
  */
     static void
-f_function(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv;
+f_function(typval_T *argvars, typval_T *rettv)
 {
     char_u	*s;
 
@@ -11841,9 +11477,7 @@
  * "garbagecollect()" function
  */
     static void
-f_garbagecollect(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv UNUSED;
+f_garbagecollect(typval_T *argvars, typval_T *rettv UNUSED)
 {
     /* This is postponed until we are back at the toplevel, because we may be
      * using Lists and Dicts internally.  E.g.: ":echo [garbagecollect()]". */
@@ -11857,9 +11491,7 @@
  * "get()" function
  */
     static void
-f_get(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv;
+f_get(typval_T *argvars, typval_T *rettv)
 {
     listitem_T	*li;
     list_T	*l;
@@ -11908,12 +11540,12 @@
  * If 'retlist' is TRUE, then the lines are returned as a Vim List.
  */
     static void
-get_buffer_lines(buf, start, end, retlist, rettv)
-    buf_T	*buf;
-    linenr_T	start;
-    linenr_T	end;
-    int		retlist;
-    typval_T	*rettv;
+get_buffer_lines(
+    buf_T	*buf,
+    linenr_T	start,
+    linenr_T	end,
+    int		retlist,
+    typval_T	*rettv)
 {
     char_u	*p;
 
@@ -11953,9 +11585,7 @@
  * "getbufline()" function
  */
     static void
-f_getbufline(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv;
+f_getbufline(typval_T *argvars, typval_T *rettv)
 {
     linenr_T	lnum;
     linenr_T	end;
@@ -11979,9 +11609,7 @@
  * "getbufvar()" function
  */
     static void
-f_getbufvar(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv;
+f_getbufvar(typval_T *argvars, typval_T *rettv)
 {
     buf_T	*buf;
     buf_T	*save_curbuf;
@@ -12042,9 +11670,7 @@
  * "getchar()" function
  */
     static void
-f_getchar(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv;
+f_getchar(typval_T *argvars, typval_T *rettv)
 {
     varnumber_T		n;
     int			error = FALSE;
@@ -12144,9 +11770,7 @@
  * "getcharmod()" function
  */
     static void
-f_getcharmod(argvars, rettv)
-    typval_T	*argvars UNUSED;
-    typval_T	*rettv;
+f_getcharmod(typval_T *argvars UNUSED, typval_T *rettv)
 {
     rettv->vval.v_number = mod_mask;
 }
@@ -12155,9 +11779,7 @@
  * "getcharsearch()" function
  */
     static void
-f_getcharsearch(argvars, rettv)
-    typval_T	*argvars UNUSED;
-    typval_T	*rettv;
+f_getcharsearch(typval_T *argvars UNUSED, typval_T *rettv)
 {
     if (rettv_dict_alloc(rettv) != FAIL)
     {
@@ -12173,9 +11795,7 @@
  * "getcmdline()" function
  */
     static void
-f_getcmdline(argvars, rettv)
-    typval_T	*argvars UNUSED;
-    typval_T	*rettv;
+f_getcmdline(typval_T *argvars UNUSED, typval_T *rettv)
 {
     rettv->v_type = VAR_STRING;
     rettv->vval.v_string = get_cmdline_str();
@@ -12185,9 +11805,7 @@
  * "getcmdpos()" function
  */
     static void
-f_getcmdpos(argvars, rettv)
-    typval_T	*argvars UNUSED;
-    typval_T	*rettv;
+f_getcmdpos(typval_T *argvars UNUSED, typval_T *rettv)
 {
     rettv->vval.v_number = get_cmdline_pos() + 1;
 }
@@ -12196,9 +11814,7 @@
  * "getcmdtype()" function
  */
     static void
-f_getcmdtype(argvars, rettv)
-    typval_T	*argvars UNUSED;
-    typval_T	*rettv;
+f_getcmdtype(typval_T *argvars UNUSED, typval_T *rettv)
 {
     rettv->v_type = VAR_STRING;
     rettv->vval.v_string = alloc(2);
@@ -12213,9 +11829,7 @@
  * "getcmdwintype()" function
  */
     static void
-f_getcmdwintype(argvars, rettv)
-    typval_T	*argvars UNUSED;
-    typval_T	*rettv;
+f_getcmdwintype(typval_T *argvars UNUSED, typval_T *rettv)
 {
     rettv->v_type = VAR_STRING;
     rettv->vval.v_string = NULL;
@@ -12233,9 +11847,7 @@
  * "getcwd()" function
  */
     static void
-f_getcwd(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv;
+f_getcwd(typval_T *argvars, typval_T *rettv)
 {
     win_T	*wp = NULL;
     char_u	*cwd;
@@ -12271,9 +11883,7 @@
  * "getfontname()" function
  */
     static void
-f_getfontname(argvars, rettv)
-    typval_T	*argvars UNUSED;
-    typval_T	*rettv;
+f_getfontname(typval_T *argvars UNUSED, typval_T *rettv)
 {
     rettv->v_type = VAR_STRING;
     rettv->vval.v_string = NULL;
@@ -12310,9 +11920,7 @@
  * "getfperm({fname})" function
  */
     static void
-f_getfperm(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv;
+f_getfperm(typval_T *argvars, typval_T *rettv)
 {
     char_u	*fname;
     struct stat st;
@@ -12342,9 +11950,7 @@
  * "getfsize({fname})" function
  */
     static void
-f_getfsize(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv;
+f_getfsize(typval_T *argvars, typval_T *rettv)
 {
     char_u	*fname;
     struct stat	st;
@@ -12374,9 +11980,7 @@
  * "getftime({fname})" function
  */
     static void
-f_getftime(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv;
+f_getftime(typval_T *argvars, typval_T *rettv)
 {
     char_u	*fname;
     struct stat	st;
@@ -12393,9 +11997,7 @@
  * "getftype({fname})" function
  */
     static void
-f_getftype(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv;
+f_getftype(typval_T *argvars, typval_T *rettv)
 {
     char_u	*fname;
     struct stat st;
@@ -12473,9 +12075,7 @@
  * "getline(lnum, [end])" function
  */
     static void
-f_getline(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv;
+f_getline(typval_T *argvars, typval_T *rettv)
 {
     linenr_T	lnum;
     linenr_T	end;
@@ -12500,9 +12100,7 @@
  * "getmatches()" function
  */
     static void
-f_getmatches(argvars, rettv)
-    typval_T	*argvars UNUSED;
-    typval_T	*rettv UNUSED;
+f_getmatches(typval_T *argvars UNUSED, typval_T *rettv UNUSED)
 {
 #ifdef FEAT_SEARCH_EXTRA
     dict_T	*dict;
@@ -12568,9 +12166,7 @@
  * "getpid()" function
  */
     static void
-f_getpid(argvars, rettv)
-    typval_T	*argvars UNUSED;
-    typval_T	*rettv;
+f_getpid(typval_T *argvars UNUSED, typval_T *rettv)
 {
     rettv->vval.v_number = mch_get_pid();
 }
@@ -12581,9 +12177,7 @@
  * "getcurpos()" function
  */
     static void
-f_getcurpos(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv;
+f_getcurpos(typval_T *argvars, typval_T *rettv)
 {
     getpos_both(argvars, rettv, TRUE);
 }
@@ -12592,18 +12186,16 @@
  * "getpos(string)" function
  */
     static void
-f_getpos(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv;
+f_getpos(typval_T *argvars, typval_T *rettv)
 {
     getpos_both(argvars, rettv, FALSE);
 }
 
     static void
-getpos_both(argvars, rettv, getcurpos)
-    typval_T	*argvars;
-    typval_T	*rettv;
-    int		getcurpos;
+getpos_both(
+    typval_T	*argvars,
+    typval_T	*rettv,
+    int		getcurpos)
 {
     pos_T	*fp;
     list_T	*l;
@@ -12642,9 +12234,7 @@
  * "getqflist()" and "getloclist()" functions
  */
     static void
-f_getqflist(argvars, rettv)
-    typval_T	*argvars UNUSED;
-    typval_T	*rettv UNUSED;
+f_getqflist(typval_T *argvars UNUSED, typval_T *rettv UNUSED)
 {
 #ifdef FEAT_QUICKFIX
     win_T	*wp;
@@ -12670,9 +12260,7 @@
  * "getreg()" function
  */
     static void
-f_getreg(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv;
+f_getreg(typval_T *argvars, typval_T *rettv)
 {
     char_u	*strregname;
     int		regname;
@@ -12721,9 +12309,7 @@
  * "getregtype()" function
  */
     static void
-f_getregtype(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv;
+f_getregtype(typval_T *argvars, typval_T *rettv)
 {
     char_u	*strregname;
     int		regname;
@@ -12767,9 +12353,7 @@
  * "gettabvar()" function
  */
     static void
-f_gettabvar(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv;
+f_gettabvar(typval_T *argvars, typval_T *rettv)
 {
     win_T	*oldcurwin;
     tabpage_T	*tp, *oldtabpage;
@@ -12812,9 +12396,7 @@
  * "gettabwinvar()" function
  */
     static void
-f_gettabwinvar(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv;
+f_gettabwinvar(typval_T *argvars, typval_T *rettv)
 {
     getwinvar(argvars, rettv, 1);
 }
@@ -12823,9 +12405,7 @@
  * "getwinposx()" function
  */
     static void
-f_getwinposx(argvars, rettv)
-    typval_T	*argvars UNUSED;
-    typval_T	*rettv;
+f_getwinposx(typval_T *argvars UNUSED, typval_T *rettv)
 {
     rettv->vval.v_number = -1;
 #ifdef FEAT_GUI
@@ -12843,9 +12423,7 @@
  * "getwinposy()" function
  */
     static void
-f_getwinposy(argvars, rettv)
-    typval_T	*argvars UNUSED;
-    typval_T	*rettv;
+f_getwinposy(typval_T *argvars UNUSED, typval_T *rettv)
 {
     rettv->vval.v_number = -1;
 #ifdef FEAT_GUI
@@ -12863,9 +12441,9 @@
  * Find window specified by "vp" in tabpage "tp".
  */
     static win_T *
-find_win_by_nr(vp, tp)
-    typval_T	*vp;
-    tabpage_T	*tp UNUSED;	/* NULL for current tab page */
+find_win_by_nr(
+    typval_T	*vp,
+    tabpage_T	*tp UNUSED)	/* NULL for current tab page */
 {
 #ifdef FEAT_WINDOWS
     win_T	*wp;
@@ -12896,9 +12474,9 @@
  * Find window specified by "wvp" in tabpage "tvp".
  */
     static win_T *
-find_tabwin(wvp, tvp)
-    typval_T	*wvp;	/* VAR_UNKNOWN for current window */
-    typval_T	*tvp;	/* VAR_UNKNOWN for current tab page */
+find_tabwin(
+    typval_T	*wvp,	/* VAR_UNKNOWN for current window */
+    typval_T	*tvp)	/* VAR_UNKNOWN for current tab page */
 {
     win_T	*wp = NULL;
     tabpage_T	*tp = NULL;
@@ -12928,9 +12506,7 @@
  * "getwinvar()" function
  */
     static void
-f_getwinvar(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv;
+f_getwinvar(typval_T *argvars, typval_T *rettv)
 {
     getwinvar(argvars, rettv, 0);
 }
@@ -12939,10 +12515,10 @@
  * getwinvar() and gettabwinvar()
  */
     static void
-getwinvar(argvars, rettv, off)
-    typval_T	*argvars;
-    typval_T	*rettv;
-    int		off;	    /* 1 for gettabwinvar() */
+getwinvar(
+    typval_T	*argvars,
+    typval_T	*rettv,
+    int		off)	    /* 1 for gettabwinvar() */
 {
     win_T	*win;
     char_u	*varname;
@@ -13016,9 +12592,7 @@
  * "glob()" function
  */
     static void
-f_glob(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv;
+f_glob(typval_T *argvars, typval_T *rettv)
 {
     int		options = WILD_SILENT|WILD_USE_NL;
     expand_T	xpc;
@@ -13072,9 +12646,7 @@
  * "globpath()" function
  */
     static void
-f_globpath(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv;
+f_globpath(typval_T *argvars, typval_T *rettv)
 {
     int		flags = 0;
     char_u	buf1[NUMBUFLEN];
@@ -13122,9 +12694,7 @@
  * "glob2regpat()" function
  */
     static void
-f_glob2regpat(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv;
+f_glob2regpat(typval_T *argvars, typval_T *rettv)
 {
     char_u	*pat = get_tv_string_chk(&argvars[0]);
 
@@ -13137,9 +12707,7 @@
  * "has()" function
  */
     static void
-f_has(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv;
+f_has(typval_T *argvars, typval_T *rettv)
 {
     int		i;
     char_u	*name;
@@ -13742,9 +13310,7 @@
  * "has_key()" function
  */
     static void
-f_has_key(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv;
+f_has_key(typval_T *argvars, typval_T *rettv)
 {
     if (argvars[0].v_type != VAR_DICT)
     {
@@ -13762,9 +13328,7 @@
  * "haslocaldir()" function
  */
     static void
-f_haslocaldir(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv;
+f_haslocaldir(typval_T *argvars, typval_T *rettv)
 {
     win_T	*wp = NULL;
 
@@ -13776,9 +13340,7 @@
  * "hasmapto()" function
  */
     static void
-f_hasmapto(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv;
+f_hasmapto(typval_T *argvars, typval_T *rettv)
 {
     char_u	*name;
     char_u	*mode;
@@ -13805,9 +13367,7 @@
  * "histadd()" function
  */
     static void
-f_histadd(argvars, rettv)
-    typval_T	*argvars UNUSED;
-    typval_T	*rettv;
+f_histadd(typval_T *argvars UNUSED, typval_T *rettv)
 {
 #ifdef FEAT_CMDHIST
     int		histype;
@@ -13839,9 +13399,7 @@
  * "histdel()" function
  */
     static void
-f_histdel(argvars, rettv)
-    typval_T	*argvars UNUSED;
-    typval_T	*rettv UNUSED;
+f_histdel(typval_T *argvars UNUSED, typval_T *rettv UNUSED)
 {
 #ifdef FEAT_CMDHIST
     int		n;
@@ -13870,9 +13428,7 @@
  * "histget()" function
  */
     static void
-f_histget(argvars, rettv)
-    typval_T	*argvars UNUSED;
-    typval_T	*rettv;
+f_histget(typval_T *argvars UNUSED, typval_T *rettv)
 {
 #ifdef FEAT_CMDHIST
     int		type;
@@ -13902,9 +13458,7 @@
  * "histnr()" function
  */
     static void
-f_histnr(argvars, rettv)
-    typval_T	*argvars UNUSED;
-    typval_T	*rettv;
+f_histnr(typval_T *argvars UNUSED, typval_T *rettv)
 {
     int		i;
 
@@ -13924,9 +13478,7 @@
  * "highlightID(name)" function
  */
     static void
-f_hlID(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv;
+f_hlID(typval_T *argvars, typval_T *rettv)
 {
     rettv->vval.v_number = syn_name2id(get_tv_string(&argvars[0]));
 }
@@ -13935,9 +13487,7 @@
  * "highlight_exists()" function
  */
     static void
-f_hlexists(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv;
+f_hlexists(typval_T *argvars, typval_T *rettv)
 {
     rettv->vval.v_number = highlight_exists(get_tv_string(&argvars[0]));
 }
@@ -13946,9 +13496,7 @@
  * "hostname()" function
  */
     static void
-f_hostname(argvars, rettv)
-    typval_T	*argvars UNUSED;
-    typval_T	*rettv;
+f_hostname(typval_T *argvars UNUSED, typval_T *rettv)
 {
     char_u hostname[256];
 
@@ -13961,9 +13509,7 @@
  * iconv() function
  */
     static void
-f_iconv(argvars, rettv)
-    typval_T	*argvars UNUSED;
-    typval_T	*rettv;
+f_iconv(typval_T *argvars UNUSED, typval_T *rettv)
 {
 #ifdef FEAT_MBYTE
     char_u	buf1[NUMBUFLEN];
@@ -13998,9 +13544,7 @@
  * "indent()" function
  */
     static void
-f_indent(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv;
+f_indent(typval_T *argvars, typval_T *rettv)
 {
     linenr_T	lnum;
 
@@ -14015,9 +13559,7 @@
  * "index()" function
  */
     static void
-f_index(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv;
+f_index(typval_T *argvars, typval_T *rettv)
 {
     list_T	*l;
     listitem_T	*item;
@@ -14068,10 +13610,10 @@
  * when the user cancels the prompt.
  */
     static void
-get_user_input(argvars, rettv, inputdialog)
-    typval_T	*argvars;
-    typval_T	*rettv;
-    int		inputdialog;
+get_user_input(
+    typval_T	*argvars,
+    typval_T	*rettv,
+    int		inputdialog)
 {
     char_u	*prompt = get_tv_string_chk(&argvars[0]);
     char_u	*p = NULL;
@@ -14173,9 +13715,7 @@
  *     Also handles inputsecret() when inputsecret is set.
  */
     static void
-f_input(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv;
+f_input(typval_T *argvars, typval_T *rettv)
 {
     get_user_input(argvars, rettv, FALSE);
 }
@@ -14184,9 +13724,7 @@
  * "inputdialog()" function
  */
     static void
-f_inputdialog(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv;
+f_inputdialog(typval_T *argvars, typval_T *rettv)
 {
 #if defined(FEAT_GUI_TEXTDIALOG)
     /* Use a GUI dialog if the GUI is running and 'c' is not in 'guioptions' */
@@ -14227,9 +13765,7 @@
  * "inputlist()" function
  */
     static void
-f_inputlist(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv;
+f_inputlist(typval_T *argvars, typval_T *rettv)
 {
     listitem_T	*li;
     int		selected;
@@ -14273,9 +13809,7 @@
  * "inputrestore()" function
  */
     static void
-f_inputrestore(argvars, rettv)
-    typval_T	*argvars UNUSED;
-    typval_T	*rettv;
+f_inputrestore(typval_T *argvars UNUSED, typval_T *rettv)
 {
     if (ga_userinput.ga_len > 0)
     {
@@ -14295,9 +13829,7 @@
  * "inputsave()" function
  */
     static void
-f_inputsave(argvars, rettv)
-    typval_T	*argvars UNUSED;
-    typval_T	*rettv;
+f_inputsave(typval_T *argvars UNUSED, typval_T *rettv)
 {
     /* Add an entry to the stack of typeahead storage. */
     if (ga_grow(&ga_userinput, 1) == OK)
@@ -14315,9 +13847,7 @@
  * "inputsecret()" function
  */
     static void
-f_inputsecret(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv;
+f_inputsecret(typval_T *argvars, typval_T *rettv)
 {
     ++cmdline_star;
     ++inputsecret_flag;
@@ -14330,9 +13860,7 @@
  * "insert()" function
  */
     static void
-f_insert(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv;
+f_insert(typval_T *argvars, typval_T *rettv)
 {
     long	before = 0;
     listitem_T	*item;
@@ -14372,9 +13900,7 @@
  * "invert(expr)" function
  */
     static void
-f_invert(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv;
+f_invert(typval_T *argvars, typval_T *rettv)
 {
     rettv->vval.v_number = ~get_tv_number_chk(&argvars[0], NULL);
 }
@@ -14383,9 +13909,7 @@
  * "isdirectory()" function
  */
     static void
-f_isdirectory(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv;
+f_isdirectory(typval_T *argvars, typval_T *rettv)
 {
     rettv->vval.v_number = mch_isdir(get_tv_string(&argvars[0]));
 }
@@ -14394,9 +13918,7 @@
  * "islocked()" function
  */
     static void
-f_islocked(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv;
+f_islocked(typval_T *argvars, typval_T *rettv)
 {
     lval_T	lv;
     char_u	*end;
@@ -14455,10 +13977,7 @@
  * "what" == 2: list of items
  */
     static void
-dict_list(argvars, rettv, what)
-    typval_T	*argvars;
-    typval_T	*rettv;
-    int		what;
+dict_list(typval_T *argvars, typval_T *rettv, int what)
 {
     list_T	*l2;
     dictitem_T	*di;
@@ -14537,9 +14056,7 @@
  * "items(dict)" function
  */
     static void
-f_items(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv;
+f_items(typval_T *argvars, typval_T *rettv)
 {
     dict_list(argvars, rettv, 2);
 }
@@ -14548,9 +14065,7 @@
  * "join()" function
  */
     static void
-f_join(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv;
+f_join(typval_T *argvars, typval_T *rettv)
 {
     garray_T	ga;
     char_u	*sep;
@@ -14584,9 +14099,7 @@
  * "jsondecode()" function
  */
     static void
-f_jsondecode(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv;
+f_jsondecode(typval_T *argvars, typval_T *rettv)
 {
     js_read_T	reader;
 
@@ -14600,9 +14113,7 @@
  * "jsonencode()" function
  */
     static void
-f_jsonencode(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv;
+f_jsonencode(typval_T *argvars, typval_T *rettv)
 {
     rettv->v_type = VAR_STRING;
     rettv->vval.v_string = json_encode(&argvars[0]);
@@ -14612,9 +14123,7 @@
  * "keys()" function
  */
     static void
-f_keys(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv;
+f_keys(typval_T *argvars, typval_T *rettv)
 {
     dict_list(argvars, rettv, 0);
 }
@@ -14623,9 +14132,7 @@
  * "last_buffer_nr()" function.
  */
     static void
-f_last_buffer_nr(argvars, rettv)
-    typval_T	*argvars UNUSED;
-    typval_T	*rettv;
+f_last_buffer_nr(typval_T *argvars UNUSED, typval_T *rettv)
 {
     int		n = 0;
     buf_T	*buf;
@@ -14641,9 +14148,7 @@
  * "len()" function
  */
     static void
-f_len(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv;
+f_len(typval_T *argvars, typval_T *rettv)
 {
     switch (argvars[0].v_type)
     {
@@ -14667,10 +14172,7 @@
 static void libcall_common(typval_T *argvars, typval_T *rettv, int type);
 
     static void
-libcall_common(argvars, rettv, type)
-    typval_T	*argvars;
-    typval_T	*rettv;
-    int		type;
+libcall_common(typval_T *argvars, typval_T *rettv, int type)
 {
 #ifdef FEAT_LIBCALL
     char_u		*string_in;
@@ -14712,9 +14214,7 @@
  * "libcall()" function
  */
     static void
-f_libcall(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv;
+f_libcall(typval_T *argvars, typval_T *rettv)
 {
     libcall_common(argvars, rettv, VAR_STRING);
 }
@@ -14723,9 +14223,7 @@
  * "libcallnr()" function
  */
     static void
-f_libcallnr(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv;
+f_libcallnr(typval_T *argvars, typval_T *rettv)
 {
     libcall_common(argvars, rettv, VAR_NUMBER);
 }
@@ -14734,9 +14232,7 @@
  * "line(string)" function
  */
     static void
-f_line(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv;
+f_line(typval_T *argvars, typval_T *rettv)
 {
     linenr_T	lnum = 0;
     pos_T	*fp;
@@ -14752,9 +14248,7 @@
  * "line2byte(lnum)" function
  */
     static void
-f_line2byte(argvars, rettv)
-    typval_T	*argvars UNUSED;
-    typval_T	*rettv;
+f_line2byte(typval_T *argvars UNUSED, typval_T *rettv)
 {
 #ifndef FEAT_BYTEOFF
     rettv->vval.v_number = -1;
@@ -14775,9 +14269,7 @@
  * "lispindent(lnum)" function
  */
     static void
-f_lispindent(argvars, rettv)
-    typval_T	*argvars UNUSED;
-    typval_T	*rettv;
+f_lispindent(typval_T *argvars UNUSED, typval_T *rettv)
 {
 #ifdef FEAT_LISP
     pos_T	pos;
@@ -14800,9 +14292,7 @@
  * "localtime()" function
  */
     static void
-f_localtime(argvars, rettv)
-    typval_T	*argvars UNUSED;
-    typval_T	*rettv;
+f_localtime(typval_T *argvars UNUSED, typval_T *rettv)
 {
     rettv->vval.v_number = (varnumber_T)time(NULL);
 }
@@ -14810,10 +14300,7 @@
 static void get_maparg(typval_T *argvars, typval_T *rettv, int exact);
 
     static void
-get_maparg(argvars, rettv, exact)
-    typval_T	*argvars;
-    typval_T	*rettv;
-    int		exact;
+get_maparg(typval_T *argvars, typval_T *rettv, int exact)
 {
     char_u	*keys;
     char_u	*which;
@@ -14889,9 +14376,7 @@
  * "log()" function
  */
     static void
-f_log(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv;
+f_log(typval_T *argvars, typval_T *rettv)
 {
     float_T	f;
 
@@ -14906,9 +14391,7 @@
  * "log10()" function
  */
     static void
-f_log10(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv;
+f_log10(typval_T *argvars, typval_T *rettv)
 {
     float_T	f;
 
@@ -14925,9 +14408,7 @@
  * "luaeval()" function
  */
     static void
-f_luaeval(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv;
+f_luaeval(typval_T *argvars, typval_T *rettv)
 {
     char_u	*str;
     char_u	buf[NUMBUFLEN];
@@ -14941,9 +14422,7 @@
  * "map()" function
  */
     static void
-f_map(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv;
+f_map(typval_T *argvars, typval_T *rettv)
 {
     filter_map(argvars, rettv, TRUE);
 }
@@ -14952,9 +14431,7 @@
  * "maparg()" function
  */
     static void
-f_maparg(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv;
+f_maparg(typval_T *argvars, typval_T *rettv)
 {
     get_maparg(argvars, rettv, TRUE);
 }
@@ -14963,9 +14440,7 @@
  * "mapcheck()" function
  */
     static void
-f_mapcheck(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv;
+f_mapcheck(typval_T *argvars, typval_T *rettv)
 {
     get_maparg(argvars, rettv, FALSE);
 }
@@ -14973,10 +14448,7 @@
 static void find_some_match(typval_T *argvars, typval_T *rettv, int start);
 
     static void
-find_some_match(argvars, rettv, type)
-    typval_T	*argvars;
-    typval_T	*rettv;
-    int		type;
+find_some_match(typval_T *argvars, typval_T *rettv, int type)
 {
     char_u	*str = NULL;
     long	len = 0;
@@ -15172,9 +14644,7 @@
  * "match()" function
  */
     static void
-f_match(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv;
+f_match(typval_T *argvars, typval_T *rettv)
 {
     find_some_match(argvars, rettv, 1);
 }
@@ -15183,9 +14653,7 @@
  * "matchadd()" function
  */
     static void
-f_matchadd(argvars, rettv)
-    typval_T	*argvars UNUSED;
-    typval_T	*rettv UNUSED;
+f_matchadd(typval_T *argvars UNUSED, typval_T *rettv UNUSED)
 {
 #ifdef FEAT_SEARCH_EXTRA
     char_u	buf[NUMBUFLEN];
@@ -15237,9 +14705,7 @@
  * "matchaddpos()" function
  */
     static void
-f_matchaddpos(argvars, rettv)
-    typval_T	*argvars UNUSED;
-    typval_T	*rettv UNUSED;
+f_matchaddpos(typval_T *argvars UNUSED, typval_T *rettv UNUSED)
 {
 #ifdef FEAT_SEARCH_EXTRA
     char_u	buf[NUMBUFLEN];
@@ -15304,9 +14770,7 @@
  * "matcharg()" function
  */
     static void
-f_matcharg(argvars, rettv)
-    typval_T	*argvars UNUSED;
-    typval_T	*rettv;
+f_matcharg(typval_T *argvars UNUSED, typval_T *rettv)
 {
     if (rettv_list_alloc(rettv) == OK)
     {
@@ -15336,9 +14800,7 @@
  * "matchdelete()" function
  */
     static void
-f_matchdelete(argvars, rettv)
-    typval_T	*argvars UNUSED;
-    typval_T	*rettv UNUSED;
+f_matchdelete(typval_T *argvars UNUSED, typval_T *rettv UNUSED)
 {
 #ifdef FEAT_SEARCH_EXTRA
     rettv->vval.v_number = match_delete(curwin,
@@ -15350,9 +14812,7 @@
  * "matchend()" function
  */
     static void
-f_matchend(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv;
+f_matchend(typval_T *argvars, typval_T *rettv)
 {
     find_some_match(argvars, rettv, 0);
 }
@@ -15361,9 +14821,7 @@
  * "matchlist()" function
  */
     static void
-f_matchlist(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv;
+f_matchlist(typval_T *argvars, typval_T *rettv)
 {
     find_some_match(argvars, rettv, 3);
 }
@@ -15372,9 +14830,7 @@
  * "matchstr()" function
  */
     static void
-f_matchstr(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv;
+f_matchstr(typval_T *argvars, typval_T *rettv)
 {
     find_some_match(argvars, rettv, 2);
 }
@@ -15382,10 +14838,7 @@
 static void max_min(typval_T *argvars, typval_T *rettv, int domax);
 
     static void
-max_min(argvars, rettv, domax)
-    typval_T	*argvars;
-    typval_T	*rettv;
-    int		domax;
+max_min(typval_T *argvars, typval_T *rettv, int domax)
 {
     long	n = 0;
     long	i;
@@ -15452,9 +14905,7 @@
  * "max()" function
  */
     static void
-f_max(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv;
+f_max(typval_T *argvars, typval_T *rettv)
 {
     max_min(argvars, rettv, TRUE);
 }
@@ -15463,9 +14914,7 @@
  * "min()" function
  */
     static void
-f_min(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv;
+f_min(typval_T *argvars, typval_T *rettv)
 {
     max_min(argvars, rettv, FALSE);
 }
@@ -15477,9 +14926,7 @@
  * needed.
  */
     static int
-mkdir_recurse(dir, prot)
-    char_u	*dir;
-    int		prot;
+mkdir_recurse(char_u *dir, int prot)
 {
     char_u	*p;
     char_u	*updir;
@@ -15508,9 +14955,7 @@
  * "mkdir()" function
  */
     static void
-f_mkdir(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv;
+f_mkdir(typval_T *argvars, typval_T *rettv)
 {
     char_u	*dir;
     char_u	buf[NUMBUFLEN];
@@ -15545,9 +14990,7 @@
  * "mode()" function
  */
     static void
-f_mode(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv;
+f_mode(typval_T *argvars, typval_T *rettv)
 {
     char_u	buf[3];
 
@@ -15619,9 +15062,7 @@
  * "mzeval()" function
  */
     static void
-f_mzeval(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv;
+f_mzeval(typval_T *argvars, typval_T *rettv)
 {
     char_u	*str;
     char_u	buf[NUMBUFLEN];
@@ -15631,10 +15072,7 @@
 }
 
     void
-mzscheme_call_vim(name, args, rettv)
-    char_u	*name;
-    typval_T	*args;
-    typval_T	*rettv;
+mzscheme_call_vim(char_u *name, typval_T *args, typval_T *rettv)
 {
     typval_T argvars[3];
 
@@ -15651,9 +15089,7 @@
  * "nextnonblank()" function
  */
     static void
-f_nextnonblank(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv;
+f_nextnonblank(typval_T *argvars, typval_T *rettv)
 {
     linenr_T	lnum;
 
@@ -15674,9 +15110,7 @@
  * "nr2char()" function
  */
     static void
-f_nr2char(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv;
+f_nr2char(typval_T *argvars, typval_T *rettv)
 {
     char_u	buf[NUMBUFLEN];
 
@@ -15706,9 +15140,7 @@
  * "or(expr, expr)" function
  */
     static void
-f_or(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv;
+f_or(typval_T *argvars, typval_T *rettv)
 {
     rettv->vval.v_number = get_tv_number_chk(&argvars[0], NULL)
 					| get_tv_number_chk(&argvars[1], NULL);
@@ -15718,9 +15150,7 @@
  * "pathshorten()" function
  */
     static void
-f_pathshorten(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv;
+f_pathshorten(typval_T *argvars, typval_T *rettv)
 {
     char_u	*p;
 
@@ -15742,9 +15172,7 @@
  * "perleval()" function
  */
     static void
-f_perleval(argvars, rettv)
-    typval_T *argvars;
-    typval_T *rettv;
+f_perleval(typval_T *argvars, typval_T *rettv)
 {
     char_u	*str;
     char_u	buf[NUMBUFLEN];
@@ -15759,9 +15187,7 @@
  * "pow()" function
  */
     static void
-f_pow(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv;
+f_pow(typval_T *argvars, typval_T *rettv)
 {
     float_T	fx, fy;
 
@@ -15778,9 +15204,7 @@
  * "prevnonblank()" function
  */
     static void
-f_prevnonblank(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv;
+f_prevnonblank(typval_T *argvars, typval_T *rettv)
 {
     linenr_T	lnum;
 
@@ -15805,9 +15229,7 @@
  * "printf()" function
  */
     static void
-f_printf(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv;
+f_printf(typval_T *argvars, typval_T *rettv)
 {
     rettv->v_type = VAR_STRING;
     rettv->vval.v_string = NULL;
@@ -15841,9 +15263,7 @@
  * "pumvisible()" function
  */
     static void
-f_pumvisible(argvars, rettv)
-    typval_T	*argvars UNUSED;
-    typval_T	*rettv UNUSED;
+f_pumvisible(typval_T *argvars UNUSED, typval_T *rettv UNUSED)
 {
 #ifdef FEAT_INS_EXPAND
     if (pum_visible())
@@ -15856,9 +15276,7 @@
  * "py3eval()" function
  */
     static void
-f_py3eval(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv;
+f_py3eval(typval_T *argvars, typval_T *rettv)
 {
     char_u	*str;
     char_u	buf[NUMBUFLEN];
@@ -15873,9 +15291,7 @@
  * "pyeval()" function
  */
     static void
-f_pyeval(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv;
+f_pyeval(typval_T *argvars, typval_T *rettv)
 {
     char_u	*str;
     char_u	buf[NUMBUFLEN];
@@ -15889,9 +15305,7 @@
  * "range()" function
  */
     static void
-f_range(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv;
+f_range(typval_T *argvars, typval_T *rettv)
 {
     long	start;
     long	end;
@@ -15932,9 +15346,7 @@
  * "readfile()" function
  */
     static void
-f_readfile(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv;
+f_readfile(typval_T *argvars, typval_T *rettv)
 {
     int		binary = FALSE;
     int		failed = FALSE;
@@ -16150,9 +15562,7 @@
  * Return FAIL when there is something wrong.
  */
     static int
-list2proftime(arg, tm)
-    typval_T	*arg;
-    proftime_T  *tm;
+list2proftime(typval_T *arg, proftime_T *tm)
 {
     long	n1, n2;
     int	error = FALSE;
@@ -16177,9 +15587,7 @@
  * "reltime()" function
  */
     static void
-f_reltime(argvars, rettv)
-    typval_T	*argvars UNUSED;
-    typval_T	*rettv UNUSED;
+f_reltime(typval_T *argvars UNUSED, typval_T *rettv UNUSED)
 {
 #ifdef FEAT_RELTIME
     proftime_T	res;
@@ -16226,9 +15634,7 @@
  * "reltimestr()" function
  */
     static void
-f_reltimestr(argvars, rettv)
-    typval_T	*argvars UNUSED;
-    typval_T	*rettv;
+f_reltimestr(typval_T *argvars UNUSED, typval_T *rettv)
 {
 #ifdef FEAT_RELTIME
     proftime_T	tm;
@@ -16247,7 +15653,7 @@
 static int check_connection(void);
 
     static void
-make_connection()
+make_connection(void)
 {
     if (X_DISPLAY == NULL
 # ifdef FEAT_GUI
@@ -16262,7 +15668,7 @@
 }
 
     static int
-check_connection()
+check_connection(void)
 {
     make_connection();
     if (X_DISPLAY == NULL)
@@ -16278,10 +15684,7 @@
 static void remote_common(typval_T *argvars, typval_T *rettv, int expr);
 
     static void
-remote_common(argvars, rettv, expr)
-    typval_T	*argvars;
-    typval_T	*rettv;
-    int		expr;
+remote_common(typval_T *argvars, typval_T *rettv, int expr)
 {
     char_u	*server_name;
     char_u	*keys;
@@ -16342,9 +15745,7 @@
  * "remote_expr()" function
  */
     static void
-f_remote_expr(argvars, rettv)
-    typval_T	*argvars UNUSED;
-    typval_T	*rettv;
+f_remote_expr(typval_T *argvars UNUSED, typval_T *rettv)
 {
     rettv->v_type = VAR_STRING;
     rettv->vval.v_string = NULL;
@@ -16357,9 +15758,7 @@
  * "remote_foreground()" function
  */
     static void
-f_remote_foreground(argvars, rettv)
-    typval_T	*argvars UNUSED;
-    typval_T	*rettv UNUSED;
+f_remote_foreground(typval_T *argvars UNUSED, typval_T *rettv UNUSED)
 {
 #ifdef FEAT_CLIENTSERVER
 # ifdef WIN32
@@ -16382,9 +15781,7 @@
 }
 
     static void
-f_remote_peek(argvars, rettv)
-    typval_T	*argvars UNUSED;
-    typval_T	*rettv;
+f_remote_peek(typval_T *argvars UNUSED, typval_T *rettv)
 {
 #ifdef FEAT_CLIENTSERVER
     dictitem_T	v;
@@ -16439,9 +15836,7 @@
 }
 
     static void
-f_remote_read(argvars, rettv)
-    typval_T	*argvars UNUSED;
-    typval_T	*rettv;
+f_remote_read(typval_T *argvars UNUSED, typval_T *rettv)
 {
     char_u	*r = NULL;
 
@@ -16473,9 +15868,7 @@
  * "remote_send()" function
  */
     static void
-f_remote_send(argvars, rettv)
-    typval_T	*argvars UNUSED;
-    typval_T	*rettv;
+f_remote_send(typval_T *argvars UNUSED, typval_T *rettv)
 {
     rettv->v_type = VAR_STRING;
     rettv->vval.v_string = NULL;
@@ -16488,9 +15881,7 @@
  * "remove()" function
  */
     static void
-f_remove(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv;
+f_remove(typval_T *argvars, typval_T *rettv)
 {
     list_T	*l;
     listitem_T	*item, *item2;
@@ -16589,9 +15980,7 @@
  * "rename({from}, {to})" function
  */
     static void
-f_rename(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv;
+f_rename(typval_T *argvars, typval_T *rettv)
 {
     char_u	buf[NUMBUFLEN];
 
@@ -16606,9 +15995,7 @@
  * "repeat()" function
  */
     static void
-f_repeat(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv;
+f_repeat(typval_T *argvars, typval_T *rettv)
 {
     char_u	*p;
     int		n;
@@ -16653,9 +16040,7 @@
  * "resolve()" function
  */
     static void
-f_resolve(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv;
+f_resolve(typval_T *argvars, typval_T *rettv)
 {
     char_u	*p;
 #ifdef HAVE_READLINK
@@ -16862,9 +16247,7 @@
  * "reverse({list})" function
  */
     static void
-f_reverse(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv;
+f_reverse(typval_T *argvars, typval_T *rettv)
 {
     list_T	*l;
     listitem_T	*li, *ni;
@@ -16908,9 +16291,7 @@
  * Returns BACKWARD, FORWARD or zero (for an error).
  */
     static int
-get_search_arg(varp, flagsp)
-    typval_T	*varp;
-    int		*flagsp;
+get_search_arg(typval_T *varp, int *flagsp)
 {
     int		dir = FORWARD;
     char_u	*flags;
@@ -16962,10 +16343,7 @@
  * Shared by search() and searchpos() functions.
  */
     static int
-search_cmn(argvars, match_pos, flagsp)
-    typval_T	*argvars;
-    pos_T	*match_pos;
-    int		*flagsp;
+search_cmn(typval_T *argvars, pos_T *match_pos, int *flagsp)
 {
     int		flags;
     char_u	*pat;
@@ -17068,8 +16446,7 @@
  * round() is not in C90, use ceil() or floor() instead.
  */
     float_T
-vim_round(f)
-    float_T f;
+vim_round(float_T f)
 {
     return f > 0 ? floor(f + 0.5) : ceil(f - 0.5);
 }
@@ -17078,9 +16455,7 @@
  * "round({float})" function
  */
     static void
-f_round(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv;
+f_round(typval_T *argvars, typval_T *rettv)
 {
     float_T	f;
 
@@ -17096,9 +16471,7 @@
  * "screenattr()" function
  */
     static void
-f_screenattr(argvars, rettv)
-    typval_T	*argvars UNUSED;
-    typval_T	*rettv;
+f_screenattr(typval_T *argvars UNUSED, typval_T *rettv)
 {
     int		row;
     int		col;
@@ -17118,9 +16491,7 @@
  * "screenchar()" function
  */
     static void
-f_screenchar(argvars, rettv)
-    typval_T	*argvars UNUSED;
-    typval_T	*rettv;
+f_screenchar(typval_T *argvars UNUSED, typval_T *rettv)
 {
     int		row;
     int		col;
@@ -17151,9 +16522,7 @@
  * First column is 1 to be consistent with virtcol().
  */
     static void
-f_screencol(argvars, rettv)
-    typval_T	*argvars UNUSED;
-    typval_T	*rettv;
+f_screencol(typval_T *argvars UNUSED, typval_T *rettv)
 {
     rettv->vval.v_number = screen_screencol() + 1;
 }
@@ -17162,9 +16531,7 @@
  * "screenrow()" function
  */
     static void
-f_screenrow(argvars, rettv)
-    typval_T	*argvars UNUSED;
-    typval_T	*rettv;
+f_screenrow(typval_T *argvars UNUSED, typval_T *rettv)
 {
     rettv->vval.v_number = screen_screenrow() + 1;
 }
@@ -17173,9 +16540,7 @@
  * "search()" function
  */
     static void
-f_search(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv;
+f_search(typval_T *argvars, typval_T *rettv)
 {
     int		flags = 0;
 
@@ -17186,9 +16551,7 @@
  * "searchdecl()" function
  */
     static void
-f_searchdecl(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv;
+f_searchdecl(typval_T *argvars, typval_T *rettv)
 {
     int		locally = 1;
     int		thisblock = 0;
@@ -17213,9 +16576,7 @@
  * Used by searchpair() and searchpairpos()
  */
     static int
-searchpair_cmn(argvars, match_pos)
-    typval_T	*argvars;
-    pos_T	*match_pos;
+searchpair_cmn(typval_T *argvars, pos_T *match_pos)
 {
     char_u	*spat, *mpat, *epat;
     char_u	*skip;
@@ -17293,9 +16654,7 @@
  * "searchpair()" function
  */
     static void
-f_searchpair(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv;
+f_searchpair(typval_T *argvars, typval_T *rettv)
 {
     rettv->vval.v_number = searchpair_cmn(argvars, NULL);
 }
@@ -17304,9 +16663,7 @@
  * "searchpairpos()" function
  */
     static void
-f_searchpairpos(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv;
+f_searchpairpos(typval_T *argvars, typval_T *rettv)
 {
     pos_T	match_pos;
     int		lnum = 0;
@@ -17331,17 +16688,16 @@
  * Returns 0 or -1 for no match,
  */
     long
-do_searchpair(spat, mpat, epat, dir, skip, flags, match_pos,
-							lnum_stop, time_limit)
-    char_u	*spat;	    /* start pattern */
-    char_u	*mpat;	    /* middle pattern */
-    char_u	*epat;	    /* end pattern */
-    int		dir;	    /* BACKWARD or FORWARD */
-    char_u	*skip;	    /* skip expression */
-    int		flags;	    /* SP_SETPCMARK and other SP_ values */
-    pos_T	*match_pos;
-    linenr_T	lnum_stop;  /* stop at this line if not zero */
-    long	time_limit UNUSED; /* stop after this many msec */
+do_searchpair(
+    char_u	*spat,	    /* start pattern */
+    char_u	*mpat,	    /* middle pattern */
+    char_u	*epat,	    /* end pattern */
+    int		dir,	    /* BACKWARD or FORWARD */
+    char_u	*skip,	    /* skip expression */
+    int		flags,	    /* SP_SETPCMARK and other SP_ values */
+    pos_T	*match_pos,
+    linenr_T	lnum_stop,  /* stop at this line if not zero */
+    long	time_limit UNUSED) /* stop after this many msec */
 {
     char_u	*save_cpo;
     char_u	*pat, *pat2 = NULL, *pat3 = NULL;
@@ -17488,9 +16844,7 @@
  * "searchpos()" function
  */
     static void
-f_searchpos(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv;
+f_searchpos(typval_T *argvars, typval_T *rettv)
 {
     pos_T	match_pos;
     int		lnum = 0;
@@ -17552,9 +16906,7 @@
  * "sendexpr()" function
  */
     static void
-f_sendexpr(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv;
+f_sendexpr(typval_T *argvars, typval_T *rettv)
 {
     char_u	*text;
     char_u	*resp;
@@ -17598,9 +16950,7 @@
  * "sendraw()" function
  */
     static void
-f_sendraw(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv;
+f_sendraw(typval_T *argvars, typval_T *rettv)
 {
     char_u	buf[NUMBUFLEN];
     char_u	*text;
@@ -17619,9 +16969,7 @@
 
 
     static void
-f_server2client(argvars, rettv)
-    typval_T	*argvars UNUSED;
-    typval_T	*rettv;
+f_server2client(typval_T *argvars UNUSED, typval_T *rettv)
 {
 #ifdef FEAT_CLIENTSERVER
     char_u	buf[NUMBUFLEN];
@@ -17650,9 +16998,7 @@
 }
 
     static void
-f_serverlist(argvars, rettv)
-    typval_T	*argvars UNUSED;
-    typval_T	*rettv;
+f_serverlist(typval_T *argvars UNUSED, typval_T *rettv)
 {
     char_u	*r = NULL;
 
@@ -17673,9 +17019,7 @@
  * "setbufvar()" function
  */
     static void
-f_setbufvar(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv UNUSED;
+f_setbufvar(typval_T *argvars, typval_T *rettv UNUSED)
 {
     buf_T	*buf;
     aco_save_T	aco;
@@ -17725,9 +17069,7 @@
 }
 
     static void
-f_setcharsearch(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv UNUSED;
+f_setcharsearch(typval_T *argvars, typval_T *rettv UNUSED)
 {
     dict_T	*d;
     dictitem_T	*di;
@@ -17773,9 +17115,7 @@
  * "setcmdpos()" function
  */
     static void
-f_setcmdpos(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv;
+f_setcmdpos(typval_T *argvars, typval_T *rettv)
 {
     int		pos = (int)get_tv_number(&argvars[0]) - 1;
 
@@ -17787,9 +17127,7 @@
  * "setline()" function
  */
     static void
-f_setline(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv;
+f_setline(typval_T *argvars, typval_T *rettv)
 {
     linenr_T	lnum;
     char_u	*line = NULL;
@@ -17865,11 +17203,11 @@
  * Used by "setqflist()" and "setloclist()" functions
  */
     static void
-set_qf_ll_list(wp, list_arg, action_arg, rettv)
-    win_T	*wp UNUSED;
-    typval_T	*list_arg UNUSED;
-    typval_T	*action_arg UNUSED;
-    typval_T	*rettv;
+set_qf_ll_list(
+    win_T	*wp UNUSED,
+    typval_T	*list_arg UNUSED,
+    typval_T	*action_arg UNUSED,
+    typval_T	*rettv)
 {
 #ifdef FEAT_QUICKFIX
     char_u	*act;
@@ -17905,9 +17243,7 @@
  * "setloclist()" function
  */
     static void
-f_setloclist(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv;
+f_setloclist(typval_T *argvars, typval_T *rettv)
 {
     win_T	*win;
 
@@ -17922,9 +17258,7 @@
  * "setmatches()" function
  */
     static void
-f_setmatches(argvars, rettv)
-    typval_T	*argvars UNUSED;
-    typval_T	*rettv UNUSED;
+f_setmatches(typval_T *argvars UNUSED, typval_T *rettv UNUSED)
 {
 #ifdef FEAT_SEARCH_EXTRA
     list_T	*l;
@@ -18033,9 +17367,7 @@
  * "setpos()" function
  */
     static void
-f_setpos(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv;
+f_setpos(typval_T *argvars, typval_T *rettv)
 {
     pos_T	pos;
     int		fnum;
@@ -18083,9 +17415,7 @@
  * "setqflist()" function
  */
     static void
-f_setqflist(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv;
+f_setqflist(typval_T *argvars, typval_T *rettv)
 {
     set_qf_ll_list(NULL, &argvars[0], &argvars[1], rettv);
 }
@@ -18094,9 +17424,7 @@
  * "setreg()" function
  */
     static void
-f_setreg(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv;
+f_setreg(typval_T *argvars, typval_T *rettv)
 {
     int		regname;
     char_u	*strregname;
@@ -18208,9 +17536,7 @@
  * "settabvar()" function
  */
     static void
-f_settabvar(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv;
+f_settabvar(typval_T *argvars, typval_T *rettv)
 {
 #ifdef FEAT_WINDOWS
     tabpage_T	*save_curtab;
@@ -18262,9 +17588,7 @@
  * "settabwinvar()" function
  */
     static void
-f_settabwinvar(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv;
+f_settabwinvar(typval_T *argvars, typval_T *rettv)
 {
     setwinvar(argvars, rettv, 1);
 }
@@ -18273,9 +17597,7 @@
  * "setwinvar()" function
  */
     static void
-f_setwinvar(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv;
+f_setwinvar(typval_T *argvars, typval_T *rettv)
 {
     setwinvar(argvars, rettv, 0);
 }
@@ -18285,10 +17607,7 @@
  */
 
     static void
-setwinvar(argvars, rettv, off)
-    typval_T	*argvars;
-    typval_T	*rettv UNUSED;
-    int		off;
+setwinvar(typval_T *argvars, typval_T *rettv UNUSED, int off)
 {
     win_T	*win;
 #ifdef FEAT_WINDOWS
@@ -18358,9 +17677,7 @@
  * "sha256({string})" function
  */
     static void
-f_sha256(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv;
+f_sha256(typval_T *argvars, typval_T *rettv)
 {
     char_u	*p;
 
@@ -18375,9 +17692,7 @@
  * "shellescape({string})" function
  */
     static void
-f_shellescape(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv;
+f_shellescape(typval_T *argvars, typval_T *rettv)
 {
     rettv->vval.v_string = vim_strsave_shellescape(
 		get_tv_string(&argvars[0]), non_zero_arg(&argvars[1]), TRUE);
@@ -18388,9 +17703,7 @@
  * shiftwidth() function
  */
     static void
-f_shiftwidth(argvars, rettv)
-    typval_T	*argvars UNUSED;
-    typval_T	*rettv;
+f_shiftwidth(typval_T *argvars UNUSED, typval_T *rettv)
 {
     rettv->vval.v_number = get_sw_value(curbuf);
 }
@@ -18399,9 +17712,7 @@
  * "simplify()" function
  */
     static void
-f_simplify(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv;
+f_simplify(typval_T *argvars, typval_T *rettv)
 {
     char_u	*p;
 
@@ -18416,9 +17727,7 @@
  * "sin()" function
  */
     static void
-f_sin(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv;
+f_sin(typval_T *argvars, typval_T *rettv)
 {
     float_T	f;
 
@@ -18433,9 +17742,7 @@
  * "sinh()" function
  */
     static void
-f_sinh(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv;
+f_sinh(typval_T *argvars, typval_T *rettv)
 {
     float_T	f;
 
@@ -18485,9 +17792,7 @@
 #ifdef __BORLANDC__
 _RTLENTRYF
 #endif
-item_compare(s1, s2)
-    const void	*s1;
-    const void	*s2;
+item_compare(const void *s1, const void *s2)
 {
     sortItem_T  *si1, *si2;
     typval_T	*tv1, *tv2;
@@ -18574,9 +17879,7 @@
 #ifdef __BORLANDC__
 _RTLENTRYF
 #endif
-item_compare2(s1, s2)
-    const void	*s1;
-    const void	*s2;
+item_compare2(const void *s1, const void *s2)
 {
     sortItem_T  *si1, *si2;
     int		res;
@@ -18623,10 +17926,7 @@
  * "sort({list})" function
  */
     static void
-do_sort_uniq(argvars, rettv, sort)
-    typval_T	*argvars;
-    typval_T	*rettv;
-    int		sort;
+do_sort_uniq(typval_T *argvars, typval_T *rettv, int sort)
 {
     list_T	*l;
     listitem_T	*li;
@@ -18801,9 +18101,7 @@
  * "sort({list})" function
  */
     static void
-f_sort(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv;
+f_sort(typval_T *argvars, typval_T *rettv)
 {
     do_sort_uniq(argvars, rettv, TRUE);
 }
@@ -18812,9 +18110,7 @@
  * "uniq({list})" function
  */
     static void
-f_uniq(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv;
+f_uniq(typval_T *argvars, typval_T *rettv)
 {
     do_sort_uniq(argvars, rettv, FALSE);
 }
@@ -18823,9 +18119,7 @@
  * "soundfold({word})" function
  */
     static void
-f_soundfold(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv;
+f_soundfold(typval_T *argvars, typval_T *rettv)
 {
     char_u	*s;
 
@@ -18842,9 +18136,7 @@
  * "spellbadword()" function
  */
     static void
-f_spellbadword(argvars, rettv)
-    typval_T	*argvars UNUSED;
-    typval_T	*rettv;
+f_spellbadword(typval_T *argvars UNUSED, typval_T *rettv)
 {
     char_u	*word = (char_u *)"";
     hlf_T	attr = HLF_COUNT;
@@ -18896,9 +18188,7 @@
  * "spellsuggest()" function
  */
     static void
-f_spellsuggest(argvars, rettv)
-    typval_T	*argvars UNUSED;
-    typval_T	*rettv;
+f_spellsuggest(typval_T *argvars UNUSED, typval_T *rettv)
 {
 #ifdef FEAT_SPELL
     char_u	*str;
@@ -18955,9 +18245,7 @@
 }
 
     static void
-f_split(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv;
+f_split(typval_T *argvars, typval_T *rettv)
 {
     char_u	*str;
     char_u	*end;
@@ -19040,9 +18328,7 @@
  * "sqrt()" function
  */
     static void
-f_sqrt(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv;
+f_sqrt(typval_T *argvars, typval_T *rettv)
 {
     float_T	f;
 
@@ -19057,9 +18343,7 @@
  * "str2float()" function
  */
     static void
-f_str2float(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv;
+f_str2float(typval_T *argvars, typval_T *rettv)
 {
     char_u *p = skipwhite(get_tv_string(&argvars[0]));
 
@@ -19074,9 +18358,7 @@
  * "str2nr()" function
  */
     static void
-f_str2nr(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv;
+f_str2nr(typval_T *argvars, typval_T *rettv)
 {
     int		base = 10;
     char_u	*p;
@@ -19112,9 +18394,7 @@
  * "strftime({format}[, {time}])" function
  */
     static void
-f_strftime(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv;
+f_strftime(typval_T *argvars, typval_T *rettv)
 {
     char_u	result_buf[256];
     struct tm	*curtime;
@@ -19173,9 +18453,7 @@
  * "stridx()" function
  */
     static void
-f_stridx(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv;
+f_stridx(typval_T *argvars, typval_T *rettv)
 {
     char_u	buf[NUMBUFLEN];
     char_u	*needle;
@@ -19210,9 +18488,7 @@
  * "string()" function
  */
     static void
-f_string(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv;
+f_string(typval_T *argvars, typval_T *rettv)
 {
     char_u	*tofree;
     char_u	numbuf[NUMBUFLEN];
@@ -19228,9 +18504,7 @@
  * "strlen()" function
  */
     static void
-f_strlen(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv;
+f_strlen(typval_T *argvars, typval_T *rettv)
 {
     rettv->vval.v_number = (varnumber_T)(STRLEN(
 					      get_tv_string(&argvars[0])));
@@ -19240,9 +18514,7 @@
  * "strchars()" function
  */
     static void
-f_strchars(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv;
+f_strchars(typval_T *argvars, typval_T *rettv)
 {
     char_u		*s = get_tv_string(&argvars[0]);
     int			skipcc = 0;
@@ -19275,9 +18547,7 @@
  * "strdisplaywidth()" function
  */
     static void
-f_strdisplaywidth(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv;
+f_strdisplaywidth(typval_T *argvars, typval_T *rettv)
 {
     char_u	*s = get_tv_string(&argvars[0]);
     int		col = 0;
@@ -19292,9 +18562,7 @@
  * "strwidth()" function
  */
     static void
-f_strwidth(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv;
+f_strwidth(typval_T *argvars, typval_T *rettv)
 {
     char_u	*s = get_tv_string(&argvars[0]);
 
@@ -19311,9 +18579,7 @@
  * "strpart()" function
  */
     static void
-f_strpart(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv;
+f_strpart(typval_T *argvars, typval_T *rettv)
 {
     char_u	*p;
     int		n;
@@ -19356,9 +18622,7 @@
  * "strridx()" function
  */
     static void
-f_strridx(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv;
+f_strridx(typval_T *argvars, typval_T *rettv)
 {
     char_u	buf[NUMBUFLEN];
     char_u	*needle;
@@ -19411,9 +18675,7 @@
  * "strtrans()" function
  */
     static void
-f_strtrans(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv;
+f_strtrans(typval_T *argvars, typval_T *rettv)
 {
     rettv->v_type = VAR_STRING;
     rettv->vval.v_string = transstr(get_tv_string(&argvars[0]));
@@ -19423,9 +18685,7 @@
  * "submatch()" function
  */
     static void
-f_submatch(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv;
+f_submatch(typval_T *argvars, typval_T *rettv)
 {
     int		error = FALSE;
     int		no;
@@ -19456,9 +18716,7 @@
  * "substitute()" function
  */
     static void
-f_substitute(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv;
+f_substitute(typval_T *argvars, typval_T *rettv)
 {
     char_u	patbuf[NUMBUFLEN];
     char_u	subbuf[NUMBUFLEN];
@@ -19480,9 +18738,7 @@
  * "synID(lnum, col, trans)" function
  */
     static void
-f_synID(argvars, rettv)
-    typval_T	*argvars UNUSED;
-    typval_T	*rettv;
+f_synID(typval_T *argvars UNUSED, typval_T *rettv)
 {
     int		id = 0;
 #ifdef FEAT_SYN_HL
@@ -19507,9 +18763,7 @@
  * "synIDattr(id, what [, mode])" function
  */
     static void
-f_synIDattr(argvars, rettv)
-    typval_T	*argvars UNUSED;
-    typval_T	*rettv;
+f_synIDattr(typval_T *argvars UNUSED, typval_T *rettv)
 {
     char_u	*p = NULL;
 #ifdef FEAT_SYN_HL
@@ -19598,9 +18852,7 @@
  * "synIDtrans(id)" function
  */
     static void
-f_synIDtrans(argvars, rettv)
-    typval_T	*argvars UNUSED;
-    typval_T	*rettv;
+f_synIDtrans(typval_T *argvars UNUSED, typval_T *rettv)
 {
     int		id;
 
@@ -19620,9 +18872,7 @@
  * "synconcealed(lnum, col)" function
  */
     static void
-f_synconcealed(argvars, rettv)
-    typval_T	*argvars UNUSED;
-    typval_T	*rettv;
+f_synconcealed(typval_T *argvars UNUSED, typval_T *rettv)
 {
 #if defined(FEAT_SYN_HL) && defined(FEAT_CONCEAL)
     long	lnum;
@@ -19682,9 +18932,7 @@
  * "synstack(lnum, col)" function
  */
     static void
-f_synstack(argvars, rettv)
-    typval_T	*argvars UNUSED;
-    typval_T	*rettv;
+f_synstack(typval_T *argvars UNUSED, typval_T *rettv)
 {
 #ifdef FEAT_SYN_HL
     long	lnum;
@@ -19718,10 +18966,10 @@
 }
 
     static void
-get_cmd_output_as_rettv(argvars, rettv, retlist)
-    typval_T	*argvars;
-    typval_T	*rettv;
-    int		retlist;
+get_cmd_output_as_rettv(
+    typval_T	*argvars,
+    typval_T	*rettv,
+    int		retlist)
 {
     char_u	*res = NULL;
     char_u	*p;
@@ -19890,9 +19138,7 @@
  * "system()" function
  */
     static void
-f_system(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv;
+f_system(typval_T *argvars, typval_T *rettv)
 {
     get_cmd_output_as_rettv(argvars, rettv, FALSE);
 }
@@ -19901,9 +19147,7 @@
  * "systemlist()" function
  */
     static void
-f_systemlist(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv;
+f_systemlist(typval_T *argvars, typval_T *rettv)
 {
     get_cmd_output_as_rettv(argvars, rettv, TRUE);
 }
@@ -19912,9 +19156,7 @@
  * "tabpagebuflist()" function
  */
     static void
-f_tabpagebuflist(argvars, rettv)
-    typval_T	*argvars UNUSED;
-    typval_T	*rettv UNUSED;
+f_tabpagebuflist(typval_T *argvars UNUSED, typval_T *rettv UNUSED)
 {
 #ifdef FEAT_WINDOWS
     tabpage_T	*tp;
@@ -19943,9 +19185,7 @@
  * "tabpagenr()" function
  */
     static void
-f_tabpagenr(argvars, rettv)
-    typval_T	*argvars UNUSED;
-    typval_T	*rettv;
+f_tabpagenr(typval_T *argvars UNUSED, typval_T *rettv)
 {
     int		nr = 1;
 #ifdef FEAT_WINDOWS
@@ -19977,9 +19217,7 @@
  * Common code for tabpagewinnr() and winnr().
  */
     static int
-get_winnr(tp, argvar)
-    tabpage_T	*tp;
-    typval_T	*argvar;
+get_winnr(tabpage_T *tp, typval_T *argvar)
 {
     win_T	*twin;
     int		nr = 1;
@@ -20027,9 +19265,7 @@
  * "tabpagewinnr()" function
  */
     static void
-f_tabpagewinnr(argvars, rettv)
-    typval_T	*argvars UNUSED;
-    typval_T	*rettv;
+f_tabpagewinnr(typval_T *argvars UNUSED, typval_T *rettv)
 {
     int		nr = 1;
 #ifdef FEAT_WINDOWS
@@ -20049,9 +19285,7 @@
  * "tagfiles()" function
  */
     static void
-f_tagfiles(argvars, rettv)
-    typval_T	*argvars UNUSED;
-    typval_T	*rettv;
+f_tagfiles(typval_T *argvars UNUSED, typval_T *rettv)
 {
     char_u	*fname;
     tagname_T	tn;
@@ -20075,9 +19309,7 @@
  * "taglist()" function
  */
     static void
-f_taglist(argvars, rettv)
-    typval_T  *argvars;
-    typval_T  *rettv;
+f_taglist(typval_T *argvars, typval_T *rettv)
 {
     char_u  *tag_pattern;
 
@@ -20095,9 +19327,7 @@
  * "tempname()" function
  */
     static void
-f_tempname(argvars, rettv)
-    typval_T	*argvars UNUSED;
-    typval_T	*rettv;
+f_tempname(typval_T *argvars UNUSED, typval_T *rettv)
 {
     static int	x = 'A';
 
@@ -20130,9 +19360,7 @@
  * "test(list)" function: Just checking the walls...
  */
     static void
-f_test(argvars, rettv)
-    typval_T	*argvars UNUSED;
-    typval_T	*rettv UNUSED;
+f_test(typval_T *argvars UNUSED, typval_T *rettv UNUSED)
 {
     /* Used for unit testing.  Change the code below to your liking. */
 #if 0
@@ -20162,9 +19390,7 @@
  * "tan()" function
  */
     static void
-f_tan(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv;
+f_tan(typval_T *argvars, typval_T *rettv)
 {
     float_T	f;
 
@@ -20179,9 +19405,7 @@
  * "tanh()" function
  */
     static void
-f_tanh(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv;
+f_tanh(typval_T *argvars, typval_T *rettv)
 {
     float_T	f;
 
@@ -20197,9 +19421,7 @@
  * "tolower(string)" function
  */
     static void
-f_tolower(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv;
+f_tolower(typval_T *argvars, typval_T *rettv)
 {
     char_u	*p;
 
@@ -20240,9 +19462,7 @@
  * "toupper(string)" function
  */
     static void
-f_toupper(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv;
+f_toupper(typval_T *argvars, typval_T *rettv)
 {
     rettv->v_type = VAR_STRING;
     rettv->vval.v_string = strup_save(get_tv_string(&argvars[0]));
@@ -20252,9 +19472,7 @@
  * "tr(string, fromstr, tostr)" function
  */
     static void
-f_tr(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv;
+f_tr(typval_T *argvars, typval_T *rettv)
 {
     char_u	*in_str;
     char_u	*fromstr;
@@ -20376,9 +19594,7 @@
  * "trunc({float})" function
  */
     static void
-f_trunc(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv;
+f_trunc(typval_T *argvars, typval_T *rettv)
 {
     float_T	f;
 
@@ -20395,9 +19611,7 @@
  * "type(expr)" function
  */
     static void
-f_type(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv;
+f_type(typval_T *argvars, typval_T *rettv)
 {
     int n;
 
@@ -20427,9 +19641,7 @@
  * "undofile(name)" function
  */
     static void
-f_undofile(argvars, rettv)
-    typval_T	*argvars UNUSED;
-    typval_T	*rettv;
+f_undofile(typval_T *argvars UNUSED, typval_T *rettv)
 {
     rettv->v_type = VAR_STRING;
 #ifdef FEAT_PERSISTENT_UNDO
@@ -20459,9 +19671,7 @@
  * "undotree()" function
  */
     static void
-f_undotree(argvars, rettv)
-    typval_T	*argvars UNUSED;
-    typval_T	*rettv;
+f_undotree(typval_T *argvars UNUSED, typval_T *rettv)
 {
     if (rettv_dict_alloc(rettv) == OK)
     {
@@ -20489,9 +19699,7 @@
  * "values(dict)" function
  */
     static void
-f_values(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv;
+f_values(typval_T *argvars, typval_T *rettv)
 {
     dict_list(argvars, rettv, 1);
 }
@@ -20500,9 +19708,7 @@
  * "virtcol(string)" function
  */
     static void
-f_virtcol(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv;
+f_virtcol(typval_T *argvars, typval_T *rettv)
 {
     colnr_T	vcol = 0;
     pos_T	*fp;
@@ -20523,9 +19729,7 @@
  * "visualmode()" function
  */
     static void
-f_visualmode(argvars, rettv)
-    typval_T	*argvars UNUSED;
-    typval_T	*rettv UNUSED;
+f_visualmode(typval_T *argvars UNUSED, typval_T *rettv UNUSED)
 {
     char_u	str[2];
 
@@ -20543,9 +19747,7 @@
  * "wildmenumode()" function
  */
     static void
-f_wildmenumode(argvars, rettv)
-    typval_T	*argvars UNUSED;
-    typval_T	*rettv UNUSED;
+f_wildmenumode(typval_T *argvars UNUSED, typval_T *rettv UNUSED)
 {
 #ifdef FEAT_WILDMENU
     if (wild_menu_showing)
@@ -20557,9 +19759,7 @@
  * "winbufnr(nr)" function
  */
     static void
-f_winbufnr(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv;
+f_winbufnr(typval_T *argvars, typval_T *rettv)
 {
     win_T	*wp;
 
@@ -20574,9 +19774,7 @@
  * "wincol()" function
  */
     static void
-f_wincol(argvars, rettv)
-    typval_T	*argvars UNUSED;
-    typval_T	*rettv;
+f_wincol(typval_T *argvars UNUSED, typval_T *rettv)
 {
     validate_cursor();
     rettv->vval.v_number = curwin->w_wcol + 1;
@@ -20586,9 +19784,7 @@
  * "winheight(nr)" function
  */
     static void
-f_winheight(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv;
+f_winheight(typval_T *argvars, typval_T *rettv)
 {
     win_T	*wp;
 
@@ -20603,9 +19799,7 @@
  * "winline()" function
  */
     static void
-f_winline(argvars, rettv)
-    typval_T	*argvars UNUSED;
-    typval_T	*rettv;
+f_winline(typval_T *argvars UNUSED, typval_T *rettv)
 {
     validate_cursor();
     rettv->vval.v_number = curwin->w_wrow + 1;
@@ -20615,9 +19809,7 @@
  * "winnr()" function
  */
     static void
-f_winnr(argvars, rettv)
-    typval_T	*argvars UNUSED;
-    typval_T	*rettv;
+f_winnr(typval_T *argvars UNUSED, typval_T *rettv)
 {
     int		nr = 1;
 
@@ -20631,9 +19823,7 @@
  * "winrestcmd()" function
  */
     static void
-f_winrestcmd(argvars, rettv)
-    typval_T	*argvars UNUSED;
-    typval_T	*rettv;
+f_winrestcmd(typval_T *argvars UNUSED, typval_T *rettv)
 {
 #ifdef FEAT_WINDOWS
     win_T	*wp;
@@ -20665,9 +19855,7 @@
  * "winrestview()" function
  */
     static void
-f_winrestview(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv UNUSED;
+f_winrestview(typval_T *argvars, typval_T *rettv UNUSED)
 {
     dict_T	*dict;
 
@@ -20722,9 +19910,7 @@
  * "winsaveview()" function
  */
     static void
-f_winsaveview(argvars, rettv)
-    typval_T	*argvars UNUSED;
-    typval_T	*rettv;
+f_winsaveview(typval_T *argvars UNUSED, typval_T *rettv)
 {
     dict_T	*dict;
 
@@ -20752,9 +19938,7 @@
  * "winwidth(nr)" function
  */
     static void
-f_winwidth(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv;
+f_winwidth(typval_T *argvars, typval_T *rettv)
 {
     win_T	*wp;
 
@@ -20773,9 +19957,7 @@
  * "wordcount()" function
  */
     static void
-f_wordcount(argvars, rettv)
-    typval_T	*argvars UNUSED;
-    typval_T	*rettv;
+f_wordcount(typval_T *argvars UNUSED, typval_T *rettv)
 {
     if (rettv_dict_alloc(rettv) == FAIL)
 	return;
@@ -20786,10 +19968,7 @@
  * Write list of strings to file
  */
     static int
-write_list(fd, list, binary)
-    FILE	*fd;
-    list_T	*list;
-    int		binary;
+write_list(FILE *fd, list_T *list, int binary)
 {
     listitem_T	*li;
     int		c;
@@ -20829,9 +20008,7 @@
  * "writefile()" function
  */
     static void
-f_writefile(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv;
+f_writefile(typval_T *argvars, typval_T *rettv)
 {
     int		binary = FALSE;
     int		append = FALSE;
@@ -20881,9 +20058,7 @@
  * "xor(expr, expr)" function
  */
     static void
-f_xor(argvars, rettv)
-    typval_T	*argvars;
-    typval_T	*rettv;
+f_xor(typval_T *argvars, typval_T *rettv)
 {
     rettv->vval.v_number = get_tv_number_chk(&argvars[0], NULL)
 					^ get_tv_number_chk(&argvars[1], NULL);
@@ -20895,10 +20070,10 @@
  * Returns NULL when there is an error.
  */
     static pos_T *
-var2fpos(varp, dollar_lnum, fnum)
-    typval_T	*varp;
-    int		dollar_lnum;	/* TRUE when $ is last line */
-    int		*fnum;		/* set to fnum for '0, 'A, etc. */
+var2fpos(
+    typval_T	*varp,
+    int		dollar_lnum,	/* TRUE when $ is last line */
+    int		*fnum)		/* set to fnum for '0, 'A, etc. */
 {
     char_u		*name;
     static pos_T	pos;
@@ -21014,11 +20189,11 @@
  * validity.
  */
     static int
-list2fpos(arg, posp, fnump, curswantp)
-    typval_T	*arg;
-    pos_T	*posp;
-    int		*fnump;
-    colnr_T	*curswantp;
+list2fpos(
+    typval_T	*arg,
+    pos_T	*posp,
+    int		*fnump,
+    colnr_T	*curswantp)
 {
     list_T	*l = arg->vval.v_list;
     long	i = 0;
@@ -21072,8 +20247,7 @@
  * Return 0 for error.
  */
     static int
-get_env_len(arg)
-    char_u	**arg;
+get_env_len(char_u **arg)
 {
     char_u	*p;
     int		len;
@@ -21094,8 +20268,7 @@
  * Return 0 if something is wrong.
  */
     static int
-get_id_len(arg)
-    char_u	**arg;
+get_id_len(char_u **arg)
 {
     char_u	*p;
     int		len;
@@ -21132,11 +20305,11 @@
  * expanded name in an allocated string via 'alias' - caller must free.
  */
     static int
-get_name_len(arg, alias, evaluate, verbose)
-    char_u	**arg;
-    char_u	**alias;
-    int		evaluate;
-    int		verbose;
+get_name_len(
+    char_u	**arg,
+    char_u	**alias,
+    int		evaluate,
+    int		verbose)
 {
     int		len;
     char_u	*p;
@@ -21203,11 +20376,11 @@
  * valid name.
  */
     static char_u *
-find_name_end(arg, expr_start, expr_end, flags)
-    char_u	*arg;
-    char_u	**expr_start;
-    char_u	**expr_end;
-    int		flags;
+find_name_end(
+    char_u	*arg,
+    char_u	**expr_start,
+    char_u	**expr_end,
+    int		flags)
 {
     int		mb_nest = 0;
     int		br_nest = 0;
@@ -21300,11 +20473,11 @@
  * Returns NULL for failure.
  */
     static char_u *
-make_expanded_name(in_start, expr_start, expr_end, in_end)
-    char_u	*in_start;
-    char_u	*expr_start;
-    char_u	*expr_end;
-    char_u	*in_end;
+make_expanded_name(
+    char_u	*in_start,
+    char_u	*expr_start,
+    char_u	*expr_end,
+    char_u	*in_end)
 {
     char_u	c1;
     char_u	*retval = NULL;
@@ -21357,8 +20530,7 @@
  * Does not include '{' or '}' for magic braces.
  */
     static int
-eval_isnamec(c)
-    int	    c;
+eval_isnamec(int c)
 {
     return (ASCII_ISALNUM(c) || c == '_' || c == ':' || c == AUTOLOAD_CHAR);
 }
@@ -21368,8 +20540,7 @@
  * variable or function name (excluding '{' and '}').
  */
     static int
-eval_isnamec1(c)
-    int	    c;
+eval_isnamec1(int c)
 {
     return (ASCII_ISALPHA(c) || c == '_');
 }
@@ -21378,9 +20549,7 @@
  * Set number v: variable to "val".
  */
     void
-set_vim_var_nr(idx, val)
-    int		idx;
-    long	val;
+set_vim_var_nr(int idx, long val)
 {
     vimvars[idx].vv_nr = val;
 }
@@ -21389,8 +20558,7 @@
  * Get number v: variable value.
  */
     long
-get_vim_var_nr(idx)
-    int		idx;
+get_vim_var_nr(int idx)
 {
     return vimvars[idx].vv_nr;
 }
@@ -21399,8 +20567,7 @@
  * Get string v: variable value.  Uses a static buffer, can only be used once.
  */
     char_u *
-get_vim_var_str(idx)
-    int		idx;
+get_vim_var_str(int idx)
 {
     return get_tv_string(&vimvars[idx].vv_tv);
 }
@@ -21410,8 +20577,7 @@
  * needed.
  */
     list_T *
-get_vim_var_list(idx)
-    int		idx;
+get_vim_var_list(int idx)
 {
     return vimvars[idx].vv_list;
 }
@@ -21420,8 +20586,7 @@
  * Set v:char to character "c".
  */
     void
-set_vim_var_char(c)
-    int c;
+set_vim_var_char(int c)
 {
     char_u	buf[MB_MAXBYTES + 1];
 
@@ -21442,10 +20607,10 @@
  * When "set_prevcount" is TRUE first set v:prevcount from v:count.
  */
     void
-set_vcount(count, count1, set_prevcount)
-    long	count;
-    long	count1;
-    int		set_prevcount;
+set_vcount(
+    long	count,
+    long	count1,
+    int		set_prevcount)
 {
     if (set_prevcount)
 	vimvars[VV_PREVCOUNT].vv_nr = vimvars[VV_COUNT].vv_nr;
@@ -21457,10 +20622,10 @@
  * Set string v: variable to a copy of "val".
  */
     void
-set_vim_var_string(idx, val, len)
-    int		idx;
-    char_u	*val;
-    int		len;	    /* length of "val" to use or -1 (whole string) */
+set_vim_var_string(
+    int		idx,
+    char_u	*val,
+    int		len)	    /* length of "val" to use or -1 (whole string) */
 {
     /* Need to do this (at least) once, since we can't initialize a union.
      * Will always be invoked when "v:progname" is set. */
@@ -21479,9 +20644,7 @@
  * Set List v: variable to "val".
  */
     void
-set_vim_var_list(idx, val)
-    int		idx;
-    list_T	*val;
+set_vim_var_list(int idx, list_T *val)
 {
     list_unref(vimvars[idx].vv_list);
     vimvars[idx].vv_list = val;
@@ -21493,9 +20656,7 @@
  * Set Dictionary v: variable to "val".
  */
     void
-set_vim_var_dict(idx, val)
-    int		idx;
-    dict_T	*val;
+set_vim_var_dict(int idx, dict_T *val)
 {
     int		todo;
     hashitem_T	*hi;
@@ -21522,8 +20683,7 @@
  * Set v:register if needed.
  */
     void
-set_reg_var(c)
-    int		c;
+set_reg_var(int c)
 {
     char_u	regname;
 
@@ -21543,8 +20703,7 @@
  * take care of memory allocations.
  */
     char_u *
-v_exception(oldval)
-    char_u	*oldval;
+v_exception(char_u *oldval)
 {
     if (oldval == NULL)
 	return vimvars[VV_EXCEPTION].vv_str;
@@ -21560,8 +20719,7 @@
  * take care of memory allocations.
  */
     char_u *
-v_throwpoint(oldval)
-    char_u	*oldval;
+v_throwpoint(char_u *oldval)
 {
     if (oldval == NULL)
 	return vimvars[VV_THROWPOINT].vv_str;
@@ -21578,9 +20736,7 @@
  * Must always be called in pairs!
  */
     char_u *
-set_cmdarg(eap, oldarg)
-    exarg_T	*eap;
-    char_u	*oldarg;
+set_cmdarg(exarg_T *eap, char_u *oldarg)
 {
     char_u	*oldval;
     char_u	*newval;
@@ -21651,13 +20807,13 @@
  * Return OK or FAIL.
  */
     static int
-get_var_tv(name, len, rettv, dip, verbose, no_autoload)
-    char_u	*name;
-    int		len;		/* length of "name" */
-    typval_T	*rettv;		/* NULL when only checking existence */
-    dictitem_T	**dip;		/* non-NULL when typval's dict item is needed */
-    int		verbose;	/* may give error message */
-    int		no_autoload;	/* do not use script autoloading */
+get_var_tv(
+    char_u	*name,
+    int		len,		/* length of "name" */
+    typval_T	*rettv,		/* NULL when only checking existence */
+    dictitem_T	**dip,		/* non-NULL when typval's dict item is needed */
+    int		verbose,	/* may give error message */
+    int		no_autoload)	/* do not use script autoloading */
 {
     int		ret = OK;
     typval_T	*tv = NULL;
@@ -21713,11 +20869,11 @@
  * Can all be combined: dict.func(expr)[idx]['func'](expr)
  */
     static int
-handle_subscript(arg, rettv, evaluate, verbose)
-    char_u	**arg;
-    typval_T	*rettv;
-    int		evaluate;	/* do more than finding the end */
-    int		verbose;	/* give error messages */
+handle_subscript(
+    char_u	**arg,
+    typval_T	*rettv,
+    int		evaluate,	/* do more than finding the end */
+    int		verbose)	/* give error messages */
 {
     int		ret = OK;
     dict_T	*selfdict = NULL;
@@ -21792,7 +20948,7 @@
  * value).
  */
     static typval_T *
-alloc_tv()
+alloc_tv(void)
 {
     return (typval_T *)alloc_clear((unsigned)sizeof(typval_T));
 }
@@ -21803,8 +20959,7 @@
  * Return NULL for out of memory, the variable otherwise.
  */
     static typval_T *
-alloc_string_tv(s)
-    char_u	*s;
+alloc_string_tv(char_u *s)
 {
     typval_T	*rettv;
 
@@ -21823,8 +20978,7 @@
  * Free the memory for a variable type-value.
  */
     void
-free_tv(varp)
-    typval_T *varp;
+free_tv(typval_T *varp)
 {
     if (varp != NULL)
     {
@@ -21861,8 +21015,7 @@
  * Free the memory for a variable value and set the value to NULL or 0.
  */
     void
-clear_tv(varp)
-    typval_T *varp;
+clear_tv(typval_T *varp)
 {
     if (varp != NULL)
     {
@@ -21905,8 +21058,7 @@
  * Set the value of a variable to NULL without freeing items.
  */
     static void
-init_tv(varp)
-    typval_T *varp;
+init_tv(typval_T *varp)
 {
     if (varp != NULL)
 	vim_memset(varp, 0, sizeof(typval_T));
@@ -21921,8 +21073,7 @@
  * is not NULL or returns -1 otherwise.
  */
     static long
-get_tv_number(varp)
-    typval_T	*varp;
+get_tv_number(typval_T *varp)
 {
     int		error = FALSE;
 
@@ -21930,9 +21081,7 @@
 }
 
     long
-get_tv_number_chk(varp, denote)
-    typval_T	*varp;
-    int		*denote;
+get_tv_number_chk(typval_T *varp, int *denote)
 {
     long	n = 0L;
 
@@ -21975,8 +21124,7 @@
 
 #ifdef FEAT_FLOAT
     static float_T
-get_tv_float(varp)
-    typval_T	*varp;
+get_tv_float(typval_T *varp)
 {
     switch (varp->v_type)
     {
@@ -22013,8 +21161,7 @@
  * Returns -1 on error.
  */
     static linenr_T
-get_tv_lnum(argvars)
-    typval_T	*argvars;
+get_tv_lnum(typval_T *argvars)
 {
     typval_T	rettv;
     linenr_T	lnum;
@@ -22036,9 +21183,7 @@
  * Returns 0 on error.
  */
     static linenr_T
-get_tv_lnum_buf(argvars, buf)
-    typval_T	*argvars;
-    buf_T	*buf;
+get_tv_lnum_buf(typval_T *argvars, buf_T *buf)
 {
     if (argvars[0].v_type == VAR_STRING
 	    && argvars[0].vval.v_string != NULL
@@ -22059,8 +21204,7 @@
  * NULL on error.
  */
     static char_u *
-get_tv_string(varp)
-    typval_T	*varp;
+get_tv_string(typval_T *varp)
 {
     static char_u   mybuf[NUMBUFLEN];
 
@@ -22068,9 +21212,7 @@
 }
 
     static char_u *
-get_tv_string_buf(varp, buf)
-    typval_T	*varp;
-    char_u	*buf;
+get_tv_string_buf(typval_T *varp, char_u *buf)
 {
     char_u	*res =  get_tv_string_buf_chk(varp, buf);
 
@@ -22081,8 +21223,7 @@
  * Careful: This uses a single, static buffer.  YOU CAN ONLY USE IT ONCE!
  */
     char_u *
-get_tv_string_chk(varp)
-    typval_T	*varp;
+get_tv_string_chk(typval_T *varp)
 {
     static char_u   mybuf[NUMBUFLEN];
 
@@ -22090,9 +21231,7 @@
 }
 
     char_u *
-get_tv_string_buf_chk(varp, buf)
-    typval_T	*varp;
-    char_u	*buf;
+get_tv_string_buf_chk(typval_T *varp, char_u *buf)
 {
     switch (varp->v_type)
     {
@@ -22136,10 +21275,7 @@
  * hashtab_T used.
  */
     static dictitem_T *
-find_var(name, htp, no_autoload)
-    char_u	*name;
-    hashtab_T	**htp;
-    int		no_autoload;
+find_var(char_u *name, hashtab_T **htp, int no_autoload)
 {
     char_u	*varname;
     hashtab_T	*ht;
@@ -22157,11 +21293,11 @@
  * Returns NULL if not found.
  */
     static dictitem_T *
-find_var_in_ht(ht, htname, varname, no_autoload)
-    hashtab_T	*ht;
-    int		htname;
-    char_u	*varname;
-    int		no_autoload;
+find_var_in_ht(
+    hashtab_T	*ht,
+    int		htname,
+    char_u	*varname,
+    int		no_autoload)
 {
     hashitem_T	*hi;
 
@@ -22213,9 +21349,7 @@
  * Set "varname" to the start of name without ':'.
  */
     static hashtab_T *
-find_var_ht(name, varname)
-    char_u  *name;
-    char_u  **varname;
+find_var_ht(char_u *name, char_u **varname)
 {
     hashitem_T	*hi;
 
@@ -22269,7 +21403,7 @@
  * Get function call environment based on bactrace debug level
  */
     static funccall_T *
-get_funccal()
+get_funccal(void)
 {
     int		i;
     funccall_T	*funccal;
@@ -22297,8 +21431,7 @@
  * Returns NULL when it doesn't exist.
  */
     char_u *
-get_var_value(name)
-    char_u	*name;
+get_var_value(char_u *name)
 {
     dictitem_T	*v;
 
@@ -22313,8 +21446,7 @@
  * sourcing this script and when executing functions defined in the script.
  */
     void
-new_script_vars(id)
-    scid_T id;
+new_script_vars(scid_T id)
 {
     int		i;
     hashtab_T	*ht;
@@ -22349,10 +21481,7 @@
  * point to it.
  */
     void
-init_var_dict(dict, dict_var, scope)
-    dict_T	*dict;
-    dictitem_T	*dict_var;
-    int		scope;
+init_var_dict(dict_T *dict, dictitem_T *dict_var, int scope)
 {
     hash_init(&dict->dv_hashtab);
     dict->dv_lock = 0;
@@ -22370,8 +21499,7 @@
  * Unreference a dictionary initialized by init_var_dict().
  */
     void
-unref_var_dict(dict)
-    dict_T	*dict;
+unref_var_dict(dict_T *dict)
 {
     /* Now the dict needs to be freed if no one else is using it, go back to
      * normal reference counting. */
@@ -22385,8 +21513,7 @@
  * Clears hashtab "ht", does not free it.
  */
     void
-vars_clear(ht)
-    hashtab_T *ht;
+vars_clear(hashtab_T *ht)
 {
     vars_clear_ext(ht, TRUE);
 }
@@ -22395,9 +21522,7 @@
  * Like vars_clear(), but only free the value if "free_val" is TRUE.
  */
     static void
-vars_clear_ext(ht, free_val)
-    hashtab_T	*ht;
-    int		free_val;
+vars_clear_ext(hashtab_T *ht, int free_val)
 {
     int		todo;
     hashitem_T	*hi;
@@ -22430,9 +21555,7 @@
  * Clear the variable value and free the dictitem.
  */
     static void
-delete_var(ht, hi)
-    hashtab_T	*ht;
-    hashitem_T	*hi;
+delete_var(hashtab_T *ht, hashitem_T *hi)
 {
     dictitem_T	*di = HI2DI(hi);
 
@@ -22445,10 +21568,7 @@
  * List the value of one internal variable.
  */
     static void
-list_one_var(v, prefix, first)
-    dictitem_T	*v;
-    char_u	*prefix;
-    int		*first;
+list_one_var(dictitem_T *v, char_u *prefix, int *first)
 {
     char_u	*tofree;
     char_u	*s;
@@ -22461,12 +21581,12 @@
 }
 
     static void
-list_one_var_a(prefix, name, type, string, first)
-    char_u	*prefix;
-    char_u	*name;
-    int		type;
-    char_u	*string;
-    int		*first;  /* when TRUE clear rest of screen and set to FALSE */
+list_one_var_a(
+    char_u	*prefix,
+    char_u	*name,
+    int		type,
+    char_u	*string,
+    int		*first)  /* when TRUE clear rest of screen and set to FALSE */
 {
     /* don't use msg() or msg_attr() to avoid overwriting "v:statusmsg" */
     msg_start();
@@ -22511,10 +21631,10 @@
  * Otherwise the variable is created.
  */
     static void
-set_var(name, tv, copy)
-    char_u	*name;
-    typval_T	*tv;
-    int		copy;	    /* make copy of value in "tv" */
+set_var(
+    char_u	*name,
+    typval_T	*tv,
+    int		copy)	    /* make copy of value in "tv" */
 {
     dictitem_T	*v;
     char_u	*varname;
@@ -22634,10 +21754,7 @@
  * Also give an error message.
  */
     static int
-var_check_ro(flags, name, use_gettext)
-    int		flags;
-    char_u	*name;
-    int		use_gettext;
+var_check_ro(int flags, char_u *name, int use_gettext)
 {
     if (flags & DI_FLAGS_RO)
     {
@@ -22657,10 +21774,7 @@
  * Also give an error message.
  */
     static int
-var_check_fixed(flags, name, use_gettext)
-    int		flags;
-    char_u	*name;
-    int		use_gettext;
+var_check_fixed(int flags, char_u *name, int use_gettext)
 {
     if (flags & DI_FLAGS_FIX)
     {
@@ -22676,9 +21790,9 @@
  * Return TRUE and give an error if not.
  */
     static int
-var_check_func_name(name, new_var)
-    char_u *name;    /* points to start of variable name */
-    int    new_var;  /* TRUE when creating the variable */
+var_check_func_name(
+    char_u *name,    /* points to start of variable name */
+    int    new_var)  /* TRUE when creating the variable */
 {
     /* Allow for w: b: s: and t:. */
     if (!(vim_strchr((char_u *)"wbst", name[0]) != NULL && name[1] == ':')
@@ -22706,8 +21820,7 @@
  * Return FALSE and give an error if not.
  */
     static int
-valid_varname(varname)
-    char_u *varname;
+valid_varname(char_u *varname)
 {
     char_u *p;
 
@@ -22727,10 +21840,7 @@
  * TRUE.
  */
     static int
-tv_check_lock(lock, name, use_gettext)
-    int		lock;
-    char_u	*name;
-    int		use_gettext;
+tv_check_lock(int lock, char_u *name, int use_gettext)
 {
     if (lock & VAR_LOCKED)
     {
@@ -22759,9 +21869,7 @@
  * make a copy later.
  */
     void
-copy_tv(from, to)
-    typval_T *from;
-    typval_T *to;
+copy_tv(typval_T *from, typval_T *to)
 {
     to->v_type = from->v_type;
     to->v_lock = 0;
@@ -22819,11 +21927,11 @@
  * Returns FAIL or OK.
  */
     static int
-item_copy(from, to, deep, copyID)
-    typval_T	*from;
-    typval_T	*to;
-    int		deep;
-    int		copyID;
+item_copy(
+    typval_T	*from,
+    typval_T	*to,
+    int		deep,
+    int		copyID)
 {
     static int	recurse = 0;
     int		ret = OK;
@@ -22891,8 +21999,7 @@
  * ":echon expr1 ..."	print each argument plain.
  */
     void
-ex_echo(eap)
-    exarg_T	*eap;
+ex_echo(exarg_T *eap)
 {
     char_u	*arg = eap->arg;
     typval_T	rettv;
@@ -22995,8 +22102,7 @@
  * ":echohl {name}".
  */
     void
-ex_echohl(eap)
-    exarg_T	*eap;
+ex_echohl(exarg_T *eap)
 {
     int		id;
 
@@ -23015,8 +22121,7 @@
  * echo commands
  */
     void
-ex_execute(eap)
-    exarg_T	*eap;
+ex_execute(exarg_T *eap)
 {
     char_u	*arg = eap->arg;
     typval_T	rettv;
@@ -23101,9 +22206,7 @@
  * after the option name.
  */
     static char_u *
-find_option_end(arg, opt_flags)
-    char_u	**arg;
-    int		*opt_flags;
+find_option_end(char_u **arg, int *opt_flags)
 {
     char_u	*p = *arg;
 
@@ -23137,8 +22240,7 @@
  * ":function"
  */
     void
-ex_function(eap)
-    exarg_T	*eap;
+ex_function(exarg_T *eap)
 {
     char_u	*theline;
     int		i;
@@ -23811,11 +22913,11 @@
  * Advances "pp" to just after the function name (if no error).
  */
     static char_u *
-trans_function_name(pp, skip, flags, fdp)
-    char_u	**pp;
-    int		skip;		/* only find the end, don't evaluate */
-    int		flags;
-    funcdict_T	*fdp;		/* return: info about dictionary used */
+trans_function_name(
+    char_u	**pp,
+    int		skip,		/* only find the end, don't evaluate */
+    int		flags,
+    funcdict_T	*fdp)		/* return: info about dictionary used */
 {
     char_u	*name = NULL;
     char_u	*start;
@@ -24022,8 +23124,7 @@
  * Return 0 otherwise.
  */
     static int
-eval_fname_script(p)
-    char_u	*p;
+eval_fname_script(char_u *p)
 {
     /* Use MB_STRICMP() because in Turkish comparing the "I" may not work with
      * the standard library function. */
@@ -24040,8 +23141,7 @@
  * Only works if eval_fname_script() returned non-zero for "p"!
  */
     static int
-eval_fname_sid(p)
-    char_u	*p;
+eval_fname_sid(char_u *p)
 {
     return (*p == 's' || TOUPPER_ASC(p[2]) == 'I');
 }
@@ -24050,9 +23150,7 @@
  * List the head of the function: "name(arg1, arg2)".
  */
     static void
-list_func_head(fp, indent)
-    ufunc_T	*fp;
-    int		indent;
+list_func_head(ufunc_T *fp, int indent)
 {
     int		j;
 
@@ -24097,8 +23195,7 @@
  * Return NULL for unknown function.
  */
     static ufunc_T *
-find_func(name)
-    char_u	*name;
+find_func(char_u *name)
 {
     hashitem_T	*hi;
 
@@ -24110,7 +23207,7 @@
 
 #if defined(EXITFREE) || defined(PROTO)
     void
-free_all_functions()
+free_all_functions(void)
 {
     hashitem_T	*hi;
 
@@ -24127,8 +23224,7 @@
 #endif
 
     int
-translated_function_exists(name)
-    char_u	*name;
+translated_function_exists(char_u *name)
 {
     if (builtin_function(name, -1))
 	return find_internal_func(name) >= 0;
@@ -24139,8 +23235,7 @@
  * Return TRUE if a function "name" exists.
  */
     static int
-function_exists(name)
-    char_u *name;
+function_exists(char_u *name)
 {
     char_u  *nm = name;
     char_u  *p;
@@ -24159,9 +23254,7 @@
 }
 
     char_u *
-get_expanded_name(name, check)
-    char_u	*name;
-    int		check;
+get_expanded_name(char_u *name, int check)
 {
     char_u	*nm = name;
     char_u	*p;
@@ -24182,9 +23275,7 @@
  * "len" is the length of "name", or -1 for NUL terminated.
  */
     static int
-builtin_function(name, len)
-    char_u *name;
-    int len;
+builtin_function(char_u *name, int len)
 {
     char_u *p;
 
@@ -24199,8 +23290,7 @@
  * Start profiling function "fp".
  */
     static void
-func_do_profile(fp)
-    ufunc_T	*fp;
+func_do_profile(ufunc_T *fp)
 {
     int		len = fp->uf_lines.ga_len;
 
@@ -24229,8 +23319,7 @@
  * Dump the profiling results for all functions in file "fd".
  */
     void
-func_dump_profile(fd)
-    FILE    *fd;
+func_dump_profile(FILE *fd)
 {
     hashitem_T	*hi;
     int		todo;
@@ -24296,12 +23385,12 @@
 }
 
     static void
-prof_sort_list(fd, sorttab, st_len, title, prefer_self)
-    FILE	*fd;
-    ufunc_T	**sorttab;
-    int		st_len;
-    char	*title;
-    int		prefer_self;	/* when equal print only self time */
+prof_sort_list(
+    FILE	*fd,
+    ufunc_T	**sorttab,
+    int		st_len,
+    char	*title,
+    int		prefer_self)	/* when equal print only self time */
 {
     int		i;
     ufunc_T	*fp;
@@ -24325,12 +23414,12 @@
  * Print the count and times for one function or function line.
  */
     static void
-prof_func_line(fd, count, total, self, prefer_self)
-    FILE	*fd;
-    int		count;
-    proftime_T	*total;
-    proftime_T	*self;
-    int		prefer_self;	/* when equal print only self time */
+prof_func_line(
+    FILE	*fd,
+    int		count,
+    proftime_T	*total,
+    proftime_T	*self,
+    int		prefer_self)	/* when equal print only self time */
 {
     if (count > 0)
     {
@@ -24355,9 +23444,7 @@
 #ifdef __BORLANDC__
 _RTLENTRYF
 #endif
-prof_total_cmp(s1, s2)
-    const void	*s1;
-    const void	*s2;
+prof_total_cmp(const void *s1, const void *s2)
 {
     ufunc_T	*p1, *p2;
 
@@ -24373,9 +23460,7 @@
 #ifdef __BORLANDC__
 _RTLENTRYF
 #endif
-prof_self_cmp(s1, s2)
-    const void	*s1;
-    const void	*s2;
+prof_self_cmp(const void *s1, const void *s2)
 {
     ufunc_T	*p1, *p2;
 
@@ -24391,9 +23476,9 @@
  * Return TRUE if a package was loaded.
  */
     static int
-script_autoload(name, reload)
-    char_u	*name;
-    int		reload;	    /* load script again when already loaded */
+script_autoload(
+    char_u	*name,
+    int		reload)	    /* load script again when already loaded */
 {
     char_u	*p;
     char_u	*scriptname, *tofree;
@@ -24437,8 +23522,7 @@
  * Returns NULL when out of memory.
  */
     static char_u *
-autoload_name(name)
-    char_u	*name;
+autoload_name(char_u *name)
 {
     char_u	*p;
     char_u	*scriptname;
@@ -24463,9 +23547,7 @@
  * function names.
  */
     char_u *
-get_user_func_name(xp, idx)
-    expand_T	*xp;
-    int		idx;
+get_user_func_name(expand_T *xp, int idx)
 {
     static long_u	done;
     static hashitem_T	*hi;
@@ -24510,9 +23592,7 @@
  * Takes care of script-local function names.
  */
     static void
-cat_func_name(buf, fp)
-    char_u	*buf;
-    ufunc_T	*fp;
+cat_func_name(char_u *buf, ufunc_T *fp)
 {
     if (fp->uf_name[0] == K_SPECIAL)
     {
@@ -24527,8 +23607,7 @@
  * ":delfunction {name}"
  */
     void
-ex_delfunction(eap)
-    exarg_T	*eap;
+ex_delfunction(exarg_T *eap)
 {
     ufunc_T	*fp = NULL;
     char_u	*p;
@@ -24586,8 +23665,7 @@
  * Free a function and remove it from the list of functions.
  */
     static void
-func_free(fp)
-    ufunc_T *fp;
+func_free(ufunc_T *fp)
 {
     hashitem_T	*hi;
 
@@ -24615,8 +23693,7 @@
  * becomes zero.  Only for numbered functions.
  */
     void
-func_unref(name)
-    char_u	*name;
+func_unref(char_u *name)
 {
     ufunc_T *fp;
 
@@ -24639,8 +23716,7 @@
  * Count a reference to a Function.
  */
     void
-func_ref(name)
-    char_u	*name;
+func_ref(char_u *name)
 {
     ufunc_T *fp;
 
@@ -24658,14 +23734,14 @@
  * Call a user function.
  */
     static void
-call_user_func(fp, argcount, argvars, rettv, firstline, lastline, selfdict)
-    ufunc_T	*fp;		/* pointer to function */
-    int		argcount;	/* nr of args */
-    typval_T	*argvars;	/* arguments */
-    typval_T	*rettv;		/* return value */
-    linenr_T	firstline;	/* first line of range */
-    linenr_T	lastline;	/* last line of range */
-    dict_T	*selfdict;	/* Dictionary for "self" */
+call_user_func(
+    ufunc_T	*fp,		/* pointer to function */
+    int		argcount,	/* nr of args */
+    typval_T	*argvars,	/* arguments */
+    typval_T	*rettv,		/* return value */
+    linenr_T	firstline,	/* first line of range */
+    linenr_T	lastline,	/* last line of range */
+    dict_T	*selfdict)	/* Dictionary for "self" */
 {
     char_u	*save_sourcing_name;
     linenr_T	save_sourcing_lnum;
@@ -25031,9 +24107,7 @@
  * referenced from anywhere that is in use.
  */
     static int
-can_free_funccal(fc, copyID)
-    funccall_T	*fc;
-    int		copyID;
+can_free_funccal(funccall_T *fc, int copyID)
 {
     return (fc->l_varlist.lv_copyID != copyID
 	    && fc->l_vars.dv_copyID != copyID
@@ -25044,9 +24118,9 @@
  * Free "fc" and what it contains.
  */
    static void
-free_funccal(fc, free_val)
-    funccall_T	*fc;
-    int		free_val;  /* a: vars were allocated */
+free_funccal(
+    funccall_T	*fc,
+    int		free_val)  /* a: vars were allocated */
 {
     listitem_T	*li;
 
@@ -25069,11 +24143,11 @@
  * Add a number variable "name" to dict "dp" with value "nr".
  */
     static void
-add_nr_var(dp, v, name, nr)
-    dict_T	*dp;
-    dictitem_T	*v;
-    char	*name;
-    varnumber_T nr;
+add_nr_var(
+    dict_T	*dp,
+    dictitem_T	*v,
+    char	*name,
+    varnumber_T nr)
 {
     STRCPY(v->di_key, name);
     v->di_flags = DI_FLAGS_RO | DI_FLAGS_FIX;
@@ -25087,8 +24161,7 @@
  * ":return [expr]"
  */
     void
-ex_return(eap)
-    exarg_T	*eap;
+ex_return(exarg_T *eap)
 {
     char_u	*arg = eap->arg;
     typval_T	rettv;
@@ -25144,11 +24217,11 @@
  * FALSE when the return gets pending.
  */
     int
-do_return(eap, reanimate, is_cmd, rettv)
-    exarg_T	*eap;
-    int		reanimate;
-    int		is_cmd;
-    void	*rettv;
+do_return(
+    exarg_T	*eap,
+    int		reanimate,
+    int		is_cmd,
+    void	*rettv)
 {
     int		idx;
     struct condstack *cstack = eap->cstack;
@@ -25225,8 +24298,7 @@
  * Free the variable with a pending return value.
  */
     void
-discard_pending_return(rettv)
-    void	*rettv;
+discard_pending_return(void *rettv)
 {
     free_tv((typval_T *)rettv);
 }
@@ -25236,8 +24308,7 @@
  * is an allocated string.  Used by report_pending() for verbose messages.
  */
     char_u *
-get_return_cmd(rettv)
-    void	*rettv;
+get_return_cmd(void *rettv)
 {
     char_u	*s = NULL;
     char_u	*tofree = NULL;
@@ -25262,10 +24333,10 @@
  * Returns allocated string, or NULL for end of function.
  */
     char_u *
-get_func_line(c, cookie, indent)
-    int	    c UNUSED;
-    void    *cookie;
-    int	    indent UNUSED;
+get_func_line(
+    int	    c UNUSED,
+    void    *cookie,
+    int	    indent UNUSED)
 {
     funccall_T	*fcp = (funccall_T *)cookie;
     ufunc_T	*fp = fcp->func;
@@ -25328,8 +24399,7 @@
  * until later and we need to store the time now.
  */
     void
-func_line_start(cookie)
-    void    *cookie;
+func_line_start(void *cookie)
 {
     funccall_T	*fcp = (funccall_T *)cookie;
     ufunc_T	*fp = fcp->func;
@@ -25352,8 +24422,7 @@
  * Called when actually executing a function line.
  */
     void
-func_line_exec(cookie)
-    void    *cookie;
+func_line_exec(void *cookie)
 {
     funccall_T	*fcp = (funccall_T *)cookie;
     ufunc_T	*fp = fcp->func;
@@ -25366,8 +24435,7 @@
  * Called when done with a function line.
  */
     void
-func_line_end(cookie)
-    void    *cookie;
+func_line_end(void *cookie)
 {
     funccall_T	*fcp = (funccall_T *)cookie;
     ufunc_T	*fp = fcp->func;
@@ -25393,8 +24461,7 @@
  * return was encountered or an error occurred.  Used inside a ":while".
  */
     int
-func_has_ended(cookie)
-    void    *cookie;
+func_has_ended(void *cookie)
 {
     funccall_T  *fcp = (funccall_T *)cookie;
 
@@ -25408,8 +24475,8 @@
  * return TRUE if cookie indicates a function which "abort"s on errors.
  */
     int
-func_has_abort(cookie)
-    void    *cookie;
+func_has_abort(
+    void    *cookie)
 {
     return ((funccall_T *)cookie)->func->uf_flags & FC_ABORT;
 }
@@ -25425,8 +24492,7 @@
 static var_flavour_T var_flavour(char_u *varname);
 
     static var_flavour_T
-var_flavour(varname)
-    char_u *varname;
+var_flavour(char_u *varname)
 {
     char_u *p = varname;
 
@@ -25447,9 +24513,7 @@
  * Restore global vars that start with a capital from the viminfo file
  */
     int
-read_viminfo_varlist(virp, writing)
-    vir_T	*virp;
-    int		writing;
+read_viminfo_varlist(vir_T *virp, int writing)
 {
     char_u	*tab;
     int		type = VAR_NUMBER;
@@ -25522,8 +24586,7 @@
  * Write global vars that start with a capital to the viminfo file
  */
     void
-write_viminfo_varlist(fp)
-    FILE    *fp;
+write_viminfo_varlist(FILE *fp)
 {
     hashitem_T	*hi;
     dictitem_T	*this_var;
@@ -25571,8 +24634,7 @@
 
 #if defined(FEAT_SESSION) || defined(PROTO)
     int
-store_session_globals(fd)
-    FILE	*fd;
+store_session_globals(FILE *fd)
 {
     hashitem_T	*hi;
     dictitem_T	*this_var;
@@ -25644,8 +24706,7 @@
  * Should only be invoked when 'verbose' is non-zero.
  */
     void
-last_set_msg(scriptID)
-    scid_T scriptID;
+last_set_msg(scid_T scriptID)
 {
     char_u *p;
 
@@ -25667,8 +24728,7 @@
  * List v:oldfiles in a nice way.
  */
     void
-ex_oldfiles(eap)
-    exarg_T	*eap UNUSED;
+ex_oldfiles(exarg_T *eap UNUSED)
 {
     list_T	*l = vimvars[VV_OLDFILES].vv_list;
     listitem_T	*li;
@@ -25720,7 +24780,7 @@
 
 /* reset v:option_new, v:option_old and v:option_type */
     void
-reset_v_option_vars()
+reset_v_option_vars(void)
 {
     set_vim_var_string(VV_OPTION_NEW,  NULL, -1);
     set_vim_var_string(VV_OPTION_OLD,  NULL, -1);
@@ -25750,10 +24810,7 @@
  * Returns OK on success, FAIL on failure.
  */
     static int
-get_short_pathname(fnamep, bufp, fnamelen)
-    char_u	**fnamep;
-    char_u	**bufp;
-    int		*fnamelen;
+get_short_pathname(char_u **fnamep, char_u **bufp, int *fnamelen)
 {
     int		l, len;
     char_u	*newbuf;
@@ -25795,10 +24852,10 @@
  * Returns OK on success (or nothing done) and FAIL on failure (out of memory).
  */
     static int
-shortpath_for_invalid_fname(fname, bufp, fnamelen)
-    char_u	**fname;
-    char_u	**bufp;
-    int		*fnamelen;
+shortpath_for_invalid_fname(
+    char_u	**fname,
+    char_u	**bufp,
+    int		*fnamelen)
 {
     char_u	*short_fname, *save_fname, *pbuf_unused;
     char_u	*endp, *save_endp;
@@ -25902,10 +24959,10 @@
  * Returns OK for success, FAIL for failure.
  */
     static int
-shortpath_for_partial(fnamep, bufp, fnamelen)
-    char_u	**fnamep;
-    char_u	**bufp;
-    int		*fnamelen;
+shortpath_for_partial(
+    char_u	**fnamep,
+    char_u	**bufp,
+    int		*fnamelen)
 {
     int		sepcount, len, tflen;
     char_u	*p;
@@ -25986,12 +25043,12 @@
  * When there is an error, *fnamep is set to NULL.
  */
     int
-modify_fname(src, usedlen, fnamep, bufp, fnamelen)
-    char_u	*src;		/* string with modifiers */
-    int		*usedlen;	/* characters after src that are used */
-    char_u	**fnamep;	/* file name so far */
-    char_u	**bufp;		/* buffer for allocated file name or NULL */
-    int		*fnamelen;	/* length of fnamep */
+modify_fname(
+    char_u	*src,		/* string with modifiers */
+    int		*usedlen,	/* characters after src that are used */
+    char_u	**fnamep,	/* file name so far */
+    char_u	**bufp,		/* buffer for allocated file name or NULL */
+    int		*fnamelen)	/* length of fnamep */
 {
     int		valid = 0;
     char_u	*tail;
@@ -26375,11 +25432,11 @@
  * Returns an allocated string, NULL for error.
  */
     char_u *
-do_string_sub(str, pat, sub, flags)
-    char_u	*str;
-    char_u	*pat;
-    char_u	*sub;
-    char_u	*flags;
+do_string_sub(
+    char_u	*str,
+    char_u	*pat,
+    char_u	*sub,
+    char_u	*flags)
 {
     int		sublen;
     regmatch_T	regmatch;
diff --git a/src/version.c b/src/version.c
index 1d533d4..f08e4d6 100644
--- a/src/version.c
+++ b/src/version.c
@@ -747,6 +747,8 @@
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    1205,
+/**/
     1204,
 /**/
     1203,
