diff --git a/src/search.c b/src/search.c
index 3aa752a..23cb291 100644
--- a/src/search.c
+++ b/src/search.c
@@ -140,12 +140,12 @@
  * returns FAIL if failed, OK otherwise.
  */
     int
-search_regcomp(pat, pat_save, pat_use, options, regmatch)
-    char_u	*pat;
-    int		pat_save;
-    int		pat_use;
-    int		options;
-    regmmatch_T	*regmatch;	/* return: pattern and ignore-case flag */
+search_regcomp(
+    char_u	*pat,
+    int		pat_save,
+    int		pat_use,
+    int		options,
+    regmmatch_T	*regmatch)	/* return: pattern and ignore-case flag */
 {
     int		magic;
     int		i;
@@ -230,7 +230,7 @@
  * Get search pattern used by search_regcomp().
  */
     char_u *
-get_search_pat()
+get_search_pat(void)
 {
     return mr_pattern;
 }
@@ -241,8 +241,7 @@
  * Returns the allocated string, NULL when out of memory.
  */
     char_u *
-reverse_text(s)
-    char_u *s;
+reverse_text(char_u *s)
 {
     unsigned	len;
     unsigned	s_i, rev_i;
@@ -280,10 +279,7 @@
 #endif
 
     void
-save_re_pat(idx, pat, magic)
-    int		idx;
-    char_u	*pat;
-    int		magic;
+save_re_pat(int idx, char_u *pat, int magic)
 {
     if (spats[idx].pat != pat)
     {
@@ -309,7 +305,7 @@
 static int save_level = 0;
 
     void
-save_search_patterns()
+save_search_patterns(void)
 {
     if (save_level++ == 0)
     {
@@ -327,7 +323,7 @@
 }
 
     void
-restore_search_patterns()
+restore_search_patterns(void)
 {
     if (--save_level == 0)
     {
@@ -348,7 +344,7 @@
 
 #if defined(EXITFREE) || defined(PROTO)
     void
-free_search_patterns()
+free_search_patterns(void)
 {
     vim_free(spats[0].pat);
     vim_free(spats[1].pat);
@@ -369,8 +365,7 @@
  * Uses the 'ignorecase' and 'smartcase' options.
  */
     int
-ignorecase(pat)
-    char_u	*pat;
+ignorecase(char_u *pat)
 {
     int		ic = p_ic;
 
@@ -389,8 +384,7 @@
  * Return TRUE if pattern "pat" has an uppercase character.
  */
     int
-pat_has_uppercase(pat)
-    char_u	*pat;
+pat_has_uppercase(char_u *pat)
 {
     char_u *p = pat;
 
@@ -427,7 +421,7 @@
 }
 
     char_u *
-last_csearch()
+last_csearch(void)
 {
 #ifdef FEAT_MBYTE
     return lastc_bytes;
@@ -437,22 +431,19 @@
 }
 
     int
-last_csearch_forward()
+last_csearch_forward(void)
 {
     return lastcdir == FORWARD;
 }
 
     int
-last_csearch_until()
+last_csearch_until(void)
 {
     return last_t_cmd == TRUE;
 }
 
     void
-set_last_csearch(c, s, len)
-    int		c;
-    char_u	*s UNUSED;
-    int		len UNUSED;
+set_last_csearch(int c, char_u *s UNUSED, int len UNUSED)
 {
     *lastc = c;
 #ifdef FEAT_MBYTE
@@ -465,21 +456,19 @@
 }
 
     void
-set_csearch_direction(cdir)
-    int cdir;
+set_csearch_direction(int cdir)
 {
     lastcdir = cdir;
 }
 
     void
-set_csearch_until(t_cmd)
-    int t_cmd;
+set_csearch_until(int t_cmd)
 {
     last_t_cmd = t_cmd;
 }
 
     char_u *
-last_search_pat()
+last_search_pat(void)
 {
     return spats[last_idx].pat;
 }
@@ -488,7 +477,7 @@
  * Reset search direction to forward.  For "gd" and "gD" commands.
  */
     void
-reset_search_dir()
+reset_search_dir(void)
 {
     spats[0].off.dir = '/';
 #if defined(FEAT_EVAL)
@@ -502,11 +491,11 @@
  * Also set the saved search pattern, so that this works in an autocommand.
  */
     void
-set_last_search_pat(s, idx, magic, setlast)
-    char_u	*s;
-    int		idx;
-    int		magic;
-    int		setlast;
+set_last_search_pat(
+    char_u	*s,
+    int		idx,
+    int		magic,
+    int		setlast)
 {
     vim_free(spats[idx].pat);
     /* An empty string means that nothing should be matched. */
@@ -550,8 +539,7 @@
  * Values returned in regmatch->regprog and regmatch->rmm_ic.
  */
     void
-last_pat_prog(regmatch)
-    regmmatch_T	*regmatch;
+last_pat_prog(regmmatch_T *regmatch)
 {
     if (spats[last_idx].pat == NULL)
     {
@@ -585,18 +573,18 @@
  * subpattern plus one; one if there was none.
  */
     int
-searchit(win, buf, pos, dir, pat, count, options, pat_use, stop_lnum, tm)
-    win_T	*win;		/* window to search in; can be NULL for a
+searchit(
+    win_T	*win,		/* window to search in; can be NULL for a
 				   buffer without a window! */
-    buf_T	*buf;
-    pos_T	*pos;
-    int		dir;
-    char_u	*pat;
-    long	count;
-    int		options;
-    int		pat_use;	/* which pattern to use when "pat" is empty */
-    linenr_T	stop_lnum;	/* stop after this line number when != 0 */
-    proftime_T	*tm UNUSED;	/* timeout limit or NULL */
+    buf_T	*buf,
+    pos_T	*pos,
+    int		dir,
+    char_u	*pat,
+    long	count,
+    int		options,
+    int		pat_use,	/* which pattern to use when "pat" is empty */
+    linenr_T	stop_lnum,	/* stop after this line number when != 0 */
+    proftime_T	*tm UNUSED)	/* timeout limit or NULL */
 {
     int		found;
     linenr_T	lnum;		/* no init to shut up Apollo cc */
@@ -1088,14 +1076,13 @@
 
 #ifdef FEAT_EVAL
     void
-set_search_direction(cdir)
-    int		cdir;
+set_search_direction(int cdir)
 {
     spats[0].off.dir = cdir;
 }
 
     static void
-set_vv_searchforward()
+set_vv_searchforward(void)
 {
     set_vim_var_nr(VV_SEARCHFORWARD, (long)(spats[0].off.dir == '/'));
 }
@@ -1105,8 +1092,7 @@
  * Return zero if none of them matched.
  */
     static int
-first_submatch(rp)
-    regmmatch_T	*rp;
+first_submatch(regmmatch_T *rp)
 {
     int		submatch;
 
@@ -1146,13 +1132,13 @@
  * Return 0 for failure, 1 for found, 2 for found and line offset added.
  */
     int
-do_search(oap, dirc, pat, count, options, tm)
-    oparg_T	    *oap;	/* can be NULL */
-    int		    dirc;	/* '/' or '?' */
-    char_u	    *pat;
-    long	    count;
-    int		    options;
-    proftime_T	    *tm;	/* timeout limit or NULL */
+do_search(
+    oparg_T	    *oap,	/* can be NULL */
+    int		    dirc,	/* '/' or '?' */
+    char_u	    *pat,
+    long	    count,
+    int		    options,
+    proftime_T	    *tm)	/* timeout limit or NULL */
 {
     pos_T	    pos;	/* position of the last match */
     char_u	    *searchstr;
@@ -1536,11 +1522,11 @@
  * Return OK for success, or FAIL if no line found.
  */
     int
-search_for_exact_line(buf, pos, dir, pat)
-    buf_T	*buf;
-    pos_T	*pos;
-    int		dir;
-    char_u	*pat;
+search_for_exact_line(
+    buf_T	*buf,
+    pos_T	*pos,
+    int		dir,
+    char_u	*pat)
 {
     linenr_T	start = 0;
     char_u	*ptr;
@@ -1617,9 +1603,7 @@
  * Return FAIL or OK.
  */
     int
-searchc(cap, t_cmd)
-    cmdarg_T	*cap;
-    int		t_cmd;
+searchc(cmdarg_T *cap, int t_cmd)
 {
     int			c = cap->nchar;	/* char to search for */
     int			dir = cap->arg;	/* TRUE for searching forward */
@@ -1754,9 +1738,7 @@
  * Improvement over vi: Braces inside quotes are ignored.
  */
     pos_T *
-findmatch(oap, initc)
-    oparg_T   *oap;
-    int	    initc;
+findmatch(oparg_T *oap, int initc)
 {
     return findmatchlimit(oap, initc, 0, 0);
 }
@@ -1769,11 +1751,11 @@
  * Handles multibyte string correctly.
  */
     static int
-check_prevcol(linep, col, ch, prevcol)
-    char_u	*linep;
-    int		col;
-    int		ch;
-    int		*prevcol;
+check_prevcol(
+    char_u	*linep,
+    int		col,
+    int		ch,
+    int		*prevcol)
 {
     --col;
 #ifdef FEAT_MBYTE
@@ -1792,10 +1774,7 @@
  * Return TRUE if the matching end can be found between startpos and endpos.
  */
     static int
-find_rawstring_end(linep, startpos, endpos)
-    char_u  *linep;
-    pos_T   *startpos;
-    pos_T   *endpos;
+find_rawstring_end(char_u *linep, pos_T *startpos, pos_T *endpos)
 {
     char_u	*p;
     char_u	*delim_copy;
@@ -1854,11 +1833,11 @@
  */
 
     pos_T *
-findmatchlimit(oap, initc, flags, maxtravel)
-    oparg_T	*oap;
-    int		initc;
-    int		flags;
-    int		maxtravel;
+findmatchlimit(
+    oparg_T	*oap,
+    int		initc,
+    int		flags,
+    int		maxtravel)
 {
     static pos_T pos;			/* current search position */
     int		findc = 0;		/* matching brace */
@@ -2504,8 +2483,7 @@
  * TODO: skip strings.
  */
     static int
-check_linecomment(line)
-    char_u	*line;
+check_linecomment(char_u *line)
 {
     char_u  *p;
 
@@ -2565,8 +2543,8 @@
  * If there isn't a match, then beep.
  */
     void
-showmatch(c)
-    int		c;	    /* char to show match for */
+showmatch(
+    int		c)	    /* char to show match for */
 {
     pos_T	*lpos, save_cursor;
     pos_T	mpos;
@@ -2672,9 +2650,7 @@
  * Return OK if the next sentence was found.
  */
     int
-findsent(dir, count)
-    int		dir;
-    long	count;
+findsent(int dir, long count)
 {
     pos_T	pos, tpos;
     int		c;
@@ -2801,12 +2777,12 @@
  * Return TRUE if the next paragraph or section was found.
  */
     int
-findpar(pincl, dir, count, what, both)
-    int		*pincl;	    /* Return: TRUE if last char is to be included */
-    int		dir;
-    long	count;
-    int		what;
-    int		both;
+findpar(
+    int		*pincl,	    /* Return: TRUE if last char is to be included */
+    int		dir,
+    long	count,
+    int		what,
+    int		both)
 {
     linenr_T	curr;
     int		did_skip;   /* TRUE after separating lines have been skipped */
@@ -2880,9 +2856,7 @@
  * check if the string 's' is a nroff macro that is in option 'opt'
  */
     static int
-inmacro(opt, s)
-    char_u	*opt;
-    char_u	*s;
+inmacro(char_u *opt, char_u *s)
 {
     char_u	*macro;
 
@@ -2911,10 +2885,7 @@
  * If 'both' is TRUE also stop at '}'
  */
     int
-startPS(lnum, para, both)
-    linenr_T	lnum;
-    int		para;
-    int		both;
+startPS(linenr_T lnum, int para, int both)
 {
     char_u	*s;
 
@@ -2953,7 +2924,7 @@
  * boundaries are of interest.
  */
     static int
-cls()
+cls(void)
 {
     int	    c;
 
@@ -3000,10 +2971,10 @@
  * If eol is TRUE, last word stops at end of line (for operators).
  */
     int
-fwd_word(count, bigword, eol)
-    long	count;
-    int		bigword;    /* "W", "E" or "B" */
-    int		eol;
+fwd_word(
+    long	count,
+    int		bigword,    /* "W", "E" or "B" */
+    int		eol)
 {
     int		sclass;	    /* starting class */
     int		i;
@@ -3072,10 +3043,7 @@
  * Returns FAIL if top of the file was reached.
  */
     int
-bck_word(count, bigword, stop)
-    long	count;
-    int		bigword;
-    int		stop;
+bck_word(long count, int bigword, int stop)
 {
     int		sclass;	    /* starting class */
 
@@ -3140,11 +3108,11 @@
  * If empty is TRUE stop on an empty line.
  */
     int
-end_word(count, bigword, stop, empty)
-    long	count;
-    int		bigword;
-    int		stop;
-    int		empty;
+end_word(
+    long	count,
+    int		bigword,
+    int		stop,
+    int		empty)
 {
     int		sclass;	    /* starting class */
 
@@ -3210,10 +3178,10 @@
  * Returns FAIL if start of the file was reached.
  */
     int
-bckend_word(count, bigword, eol)
-    long	count;
-    int		bigword;    /* TRUE for "B" */
-    int		eol;	    /* TRUE: stop at end of line. */
+bckend_word(
+    long	count,
+    int		bigword,    /* TRUE for "B" */
+    int		eol)	    /* TRUE: stop at end of line. */
 {
     int		sclass;	    /* starting class */
     int		i;
@@ -3259,9 +3227,7 @@
  * Return TRUE when end-of-file reached, FALSE otherwise.
  */
     static int
-skip_chars(cclass, dir)
-    int		cclass;
-    int		dir;
+skip_chars(int cclass, int dir)
 {
     while (cls() == cclass)
 	if ((dir == FORWARD ? inc_cursor() : dec_cursor()) == -1)
@@ -3274,7 +3240,7 @@
  * Go back to the start of the word or the start of white space
  */
     static void
-back_in_line()
+back_in_line(void)
 {
     int		sclass;		    /* starting class */
 
@@ -3293,8 +3259,7 @@
 }
 
     static void
-find_first_blank(posp)
-    pos_T    *posp;
+find_first_blank(pos_T *posp)
 {
     int	    c;
 
@@ -3313,9 +3278,9 @@
  * Skip count/2 sentences and count/2 separating white spaces.
  */
     static void
-findsent_forward(count, at_start_sent)
-    long    count;
-    int	    at_start_sent;	/* cursor is at start of sentence */
+findsent_forward(
+    long    count,
+    int	    at_start_sent)	/* cursor is at start of sentence */
 {
     while (count--)
     {
@@ -3333,11 +3298,11 @@
  * Used while an operator is pending, and in Visual mode.
  */
     int
-current_word(oap, count, include, bigword)
-    oparg_T	*oap;
-    long	count;
-    int		include;	/* TRUE: include word and white space */
-    int		bigword;	/* FALSE == word, TRUE == WORD */
+current_word(
+    oparg_T	*oap,
+    long	count,
+    int		include,	/* TRUE: include word and white space */
+    int		bigword)	/* FALSE == word, TRUE == WORD */
 {
     pos_T	start_pos;
     pos_T	pos;
@@ -3507,10 +3472,7 @@
  * When Visual active, extend it by one or more sentences.
  */
     int
-current_sent(oap, count, include)
-    oparg_T	*oap;
-    long	count;
-    int		include;
+current_sent(oparg_T *oap, long count, int include)
 {
     pos_T	start_pos;
     pos_T	pos;
@@ -3687,12 +3649,12 @@
  * "what" and "other" are two matching parenthesis/brace/etc.
  */
     int
-current_block(oap, count, include, what, other)
-    oparg_T	*oap;
-    long	count;
-    int		include;	/* TRUE == include white space */
-    int		what;		/* '(', '{', etc. */
-    int		other;		/* ')', '}', etc. */
+current_block(
+    oparg_T	*oap,
+    long	count,
+    int		include,	/* TRUE == include white space */
+    int		what,		/* '(', '{', etc. */
+    int		other)		/* ')', '}', etc. */
 {
     pos_T	old_pos;
     pos_T	*pos = NULL;
@@ -3838,8 +3800,8 @@
  * When "end_tag" is TRUE return TRUE if the cursor is on "</aaa>".
  */
     static int
-in_html_tag(end_tag)
-    int		end_tag;
+in_html_tag(
+    int		end_tag)
 {
     char_u	*line = ml_get_curline();
     char_u	*p;
@@ -3911,10 +3873,10 @@
  * Find tag block under the cursor, cursor at end.
  */
     int
-current_tagblock(oap, count_arg, include)
-    oparg_T	*oap;
-    long	count_arg;
-    int		include;	/* TRUE == include white space */
+current_tagblock(
+    oparg_T	*oap,
+    long	count_arg,
+    int		include)	/* TRUE == include white space */
 {
     long	count = count_arg;
     long	n;
@@ -4117,11 +4079,11 @@
 }
 
     int
-current_par(oap, count, include, type)
-    oparg_T	*oap;
-    long	count;
-    int		include;	/* TRUE == include white space */
-    int		type;		/* 'p' for paragraph, 'S' for section */
+current_par(
+    oparg_T	*oap,
+    long	count,
+    int		include,	/* TRUE == include white space */
+    int		type)		/* 'p' for paragraph, 'S' for section */
 {
     linenr_T	start_lnum;
     linenr_T	end_lnum;
@@ -4296,11 +4258,11 @@
  * Returns column number of "quotechar" or -1 when not found.
  */
     static int
-find_next_quote(line, col, quotechar, escape)
-    char_u	*line;
-    int		col;
-    int		quotechar;
-    char_u	*escape;	/* escape characters, can be NULL */
+find_next_quote(
+    char_u	*line,
+    int		col,
+    int		quotechar,
+    char_u	*escape)	/* escape characters, can be NULL */
 {
     int		c;
 
@@ -4330,11 +4292,11 @@
  * Return the found column or zero.
  */
     static int
-find_prev_quote(line, col_start, quotechar, escape)
-    char_u	*line;
-    int		col_start;
-    int		quotechar;
-    char_u	*escape;	/* escape characters, can be NULL */
+find_prev_quote(
+    char_u	*line,
+    int		col_start,
+    int		quotechar,
+    char_u	*escape)	/* escape characters, can be NULL */
 {
     int		n;
 
@@ -4362,11 +4324,11 @@
  * Returns TRUE if found, else FALSE.
  */
     int
-current_quote(oap, count, include, quotechar)
-    oparg_T	*oap;
-    long	count;
-    int		include;	/* TRUE == include quote char */
-    int		quotechar;	/* Quote character */
+current_quote(
+    oparg_T	*oap,
+    long	count,
+    int		include,	/* TRUE == include quote char */
+    int		quotechar)	/* Quote character */
 {
     char_u	*line = ml_get_curline();
     int		col_end;
@@ -4605,9 +4567,9 @@
  * Used while an operator is pending, and in Visual mode.
  */
     int
-current_search(count, forward)
-    long	count;
-    int		forward;	/* move forward or backwards */
+current_search(
+    long	count,
+    int		forward)	/* move forward or backwards */
 {
     pos_T	start_pos;	/* position before the pattern */
     pos_T	orig_pos;	/* position of the cursor at beginning */
@@ -4764,9 +4726,7 @@
  * Returns TRUE, FALSE or -1 for failure.
  */
     static int
-is_one_char(pattern, move)
-    char_u	*pattern;
-    int		move;
+is_one_char(char_u *pattern, int move)
 {
     regmmatch_T	regmatch;
     int		nmatched = 0;
@@ -4818,8 +4778,7 @@
  * return TRUE if line 'lnum' is empty or has white chars only.
  */
     int
-linewhite(lnum)
-    linenr_T	lnum;
+linewhite(linenr_T lnum)
 {
     char_u  *p;
 
@@ -4834,19 +4793,18 @@
  * If p_ic && (compl_cont_status & CONT_SOL) then ptr must be in lowercase.
  */
     void
-find_pattern_in_path(ptr, dir, len, whole, skip_comments,
-				    type, count, action, start_lnum, end_lnum)
-    char_u	*ptr;		/* pointer to search pattern */
-    int		dir UNUSED;	/* direction of expansion */
-    int		len;		/* length of search pattern */
-    int		whole;		/* match whole words only */
-    int		skip_comments;	/* don't match inside comments */
-    int		type;		/* Type of search; are we looking for a type?
+find_pattern_in_path(
+    char_u	*ptr,		/* pointer to search pattern */
+    int		dir UNUSED,	/* direction of expansion */
+    int		len,		/* length of search pattern */
+    int		whole,		/* match whole words only */
+    int		skip_comments,	/* don't match inside comments */
+    int		type,		/* Type of search; are we looking for a type?
 				   a macro? */
-    long	count;
-    int		action;		/* What to do when we find it */
-    linenr_T	start_lnum;	/* first line to start searching */
-    linenr_T	end_lnum;	/* last line for searching */
+    long	count,
+    int		action,		/* What to do when we find it */
+    linenr_T	start_lnum,	/* first line to start searching */
+    linenr_T	end_lnum)	/* last line for searching */
 {
     SearchedFile *files;		/* Stack of included files */
     SearchedFile *bigger;		/* When we need more space */
@@ -5543,14 +5501,14 @@
 }
 
     static void
-show_pat_in_path(line, type, did_show, action, fp, lnum, count)
-    char_u  *line;
-    int	    type;
-    int	    did_show;
-    int	    action;
-    FILE    *fp;
-    linenr_T *lnum;
-    long    count;
+show_pat_in_path(
+    char_u  *line,
+    int	    type,
+    int	    did_show,
+    int	    action,
+    FILE    *fp,
+    linenr_T *lnum,
+    long    count)
 {
     char_u  *p;
 
@@ -5607,9 +5565,7 @@
 
 #ifdef FEAT_VIMINFO
     int
-read_viminfo_search_pattern(virp, force)
-    vir_T	*virp;
-    int		force;
+read_viminfo_search_pattern(vir_T *virp, int force)
 {
     char_u	*lp;
     int		idx = -1;
@@ -5695,8 +5651,7 @@
 }
 
     void
-write_viminfo_search_pattern(fp)
-    FILE	*fp;
+write_viminfo_search_pattern(FILE *fp)
 {
     if (get_viminfo_parameter('/') != 0)
     {
@@ -5710,11 +5665,11 @@
 }
 
     static void
-wvsp_one(fp, idx, s, sc)
-    FILE	*fp;	/* file to write to */
-    int		idx;	/* spats[] index */
-    char	*s;	/* search pat */
-    int		sc;	/* dir char */
+wvsp_one(
+    FILE	*fp,	/* file to write to */
+    int		idx,	/* spats[] index */
+    char	*s,	/* search pat */
+    int		sc)	/* dir char */
 {
     if (spats[idx].pat != NULL)
     {
diff --git a/src/sha256.c b/src/sha256.c
index d65b72c..db916a6 100644
--- a/src/sha256.c
+++ b/src/sha256.c
@@ -43,8 +43,7 @@
 }
 
      void
-sha256_start(ctx)
-    context_sha256_T *ctx;
+sha256_start(context_sha256_T *ctx)
 {
     ctx->total[0] = 0;
     ctx->total[1] = 0;
@@ -60,9 +59,7 @@
 }
 
     static void
-sha256_process(ctx, data)
-    context_sha256_T *ctx;
-    char_u	     data[64];
+sha256_process(context_sha256_T *ctx, char_u data[64])
 {
     UINT32_T temp1, temp2, W[64];
     UINT32_T A, B, C, D, E, F, G, H;
@@ -194,10 +191,7 @@
 }
 
     void
-sha256_update(ctx, input, length)
-    context_sha256_T *ctx;
-    char_u	     *input;
-    UINT32_T	     length;
+sha256_update(context_sha256_T *ctx, char_u *input, UINT32_T length)
 {
     UINT32_T left, fill;
 
@@ -241,9 +235,7 @@
 };
 
     void
-sha256_finish(ctx, digest)
-    context_sha256_T *ctx;
-    char_u	     digest[32];
+sha256_finish(context_sha256_T *ctx, char_u digest[32])
 {
     UINT32_T last, padn;
     UINT32_T high, low;
@@ -280,11 +272,11 @@
  * if "salt" is not NULL also do "salt[salt_len]".
  */
     char_u *
-sha256_bytes(buf, buf_len, salt, salt_len)
-    char_u *buf;
-    int    buf_len;
-    char_u *salt;
-    int    salt_len;
+sha256_bytes(
+    char_u *buf,
+    int    buf_len,
+    char_u *salt,
+    int    salt_len)
 {
     char_u	     sha256sum[32];
     static char_u    hexit[65];
@@ -308,10 +300,10 @@
  * Returns sha256(buf) as 64 hex chars in static array.
  */
     char_u *
-sha256_key(buf, salt, salt_len)
-    char_u *buf;
-    char_u *salt;
-    int    salt_len;
+sha256_key(
+    char_u *buf,
+    char_u *salt,
+    int    salt_len)
 {
     /* No passwd means don't encrypt */
     if (buf == NULL || *buf == NUL)
@@ -344,7 +336,7 @@
  * Return FAIL or OK.
  */
     int
-sha256_self_test()
+sha256_self_test(void)
 {
     int		     i, j;
     char	     output[65];
@@ -389,7 +381,7 @@
 }
 
     static unsigned int
-get_some_time()
+get_some_time(void)
 {
 # ifdef HAVE_GETTIMEOFDAY
     struct timeval tv;
@@ -407,11 +399,11 @@
  * Also "salt[salt_len]" when "salt" is not NULL.
  */
     void
-sha2_seed(header, header_len, salt, salt_len)
-    char_u *header;
-    int    header_len;
-    char_u *salt;
-    int    salt_len;
+sha2_seed(
+    char_u *header,
+    int    header_len,
+    char_u *salt,
+    int    salt_len)
 {
     int		     i;
     static char_u    random_data[1000];
diff --git a/src/spell.c b/src/spell.c
index e22d8c0..9220bc0 100644
--- a/src/spell.c
+++ b/src/spell.c
@@ -1026,12 +1026,12 @@
  * caller can skip over the word.
  */
     int
-spell_check(wp, ptr, attrp, capcol, docount)
-    win_T	*wp;		/* current window */
-    char_u	*ptr;
-    hlf_T	*attrp;
-    int		*capcol;	/* column to check for Capital */
-    int		docount;	/* count good words */
+spell_check(
+    win_T	*wp,		/* current window */
+    char_u	*ptr,
+    hlf_T	*attrp,
+    int		*capcol,	/* column to check for Capital */
+    int		docount)	/* count good words */
 {
     matchinf_T	mi;		/* Most things are put in "mi" so that it can
 				   be passed to functions quickly. */
@@ -1247,9 +1247,7 @@
  * For a match mip->mi_result is updated.
  */
     static void
-find_word(mip, mode)
-    matchinf_T	*mip;
-    int		mode;
+find_word(matchinf_T *mip, int mode)
 {
     idx_T	arridx = 0;
     int		endlen[MAXWLEN];    /* length at possible word endings */
@@ -1767,10 +1765,10 @@
  * end of ptr[wlen] and the second part matches after it.
  */
     static int
-match_checkcompoundpattern(ptr, wlen, gap)
-    char_u	*ptr;
-    int		wlen;
-    garray_T	*gap;  /* &sl_comppat */
+match_checkcompoundpattern(
+    char_u	*ptr,
+    int		wlen,
+    garray_T	*gap)  /* &sl_comppat */
 {
     int		i;
     char_u	*p;
@@ -1797,10 +1795,7 @@
  * does not have too many syllables.
  */
     static int
-can_compound(slang, word, flags)
-    slang_T	*slang;
-    char_u	*word;
-    char_u	*flags;
+can_compound(slang_T *slang, char_u *word, char_u *flags)
 {
 #ifdef FEAT_MBYTE
     char_u	uflags[MAXWLEN * 2];
@@ -1841,11 +1836,11 @@
  * lines if they don't contain wildcards.
  */
     static int
-can_be_compound(sp, slang, compflags, flag)
-    trystate_T	*sp;
-    slang_T	*slang;
-    char_u	*compflags;
-    int		flag;
+can_be_compound(
+    trystate_T	*sp,
+    slang_T	*slang,
+    char_u	*compflags,
+    int		flag)
 {
     /* If the flag doesn't appear in sl_compstartflags or sl_compallflags
      * then it can't possibly compound. */
@@ -1878,9 +1873,7 @@
  * Caller must check that slang->sl_comprules is not NULL.
  */
     static int
-match_compoundrule(slang, compflags)
-    slang_T	*slang;
-    char_u	*compflags;
+match_compoundrule(slang_T *slang, char_u *compflags)
 {
     char_u	*p;
     int		i;
@@ -1933,13 +1926,13 @@
  * The WF_RAREPFX flag is included in the return value for a rare prefix.
  */
     static int
-valid_word_prefix(totprefcnt, arridx, flags, word, slang, cond_req)
-    int		totprefcnt;	/* nr of prefix IDs */
-    int		arridx;		/* idx in sl_pidxs[] */
-    int		flags;
-    char_u	*word;
-    slang_T	*slang;
-    int		cond_req;	/* only use prefixes with a condition */
+valid_word_prefix(
+    int		totprefcnt,	/* nr of prefix IDs */
+    int		arridx,		/* idx in sl_pidxs[] */
+    int		flags,
+    char_u	*word,
+    slang_T	*slang,
+    int		cond_req)	/* only use prefixes with a condition */
 {
     int		prefcnt;
     int		pidx;
@@ -1987,9 +1980,7 @@
  * For a match mip->mi_result is updated.
  */
     static void
-find_prefix(mip, mode)
-    matchinf_T	*mip;
-    int		mode;
+find_prefix(matchinf_T *mip, int mode)
 {
     idx_T	arridx = 0;
     int		len;
@@ -2110,8 +2101,7 @@
  * Return the length of the folded chars in bytes.
  */
     static int
-fold_more(mip)
-    matchinf_T	*mip;
+fold_more(matchinf_T *mip)
 {
     int		flen;
     char_u	*p;
@@ -2139,9 +2129,9 @@
  * case.
  */
     static int
-spell_valid_case(wordflags, treeflags)
-    int	    wordflags;	    /* flags for the checked word. */
-    int	    treeflags;	    /* flags for the word in the spell tree */
+spell_valid_case(
+    int	    wordflags,	    /* flags for the checked word. */
+    int	    treeflags)	    /* flags for the word in the spell tree */
 {
     return ((wordflags == WF_ALLCAP && (treeflags & WF_FIXCAP) == 0)
 	    || ((treeflags & (WF_ALLCAP | WF_KEEPCAP)) == 0
@@ -2153,8 +2143,7 @@
  * Return TRUE if spell checking is not enabled.
  */
     static int
-no_spell_checking(wp)
-    win_T	*wp;
+no_spell_checking(win_T *wp)
 {
     if (!wp->w_p_spell || *wp->w_s->b_p_spl == NUL
 					 || wp->w_s->b_langp.ga_len == 0)
@@ -2174,12 +2163,12 @@
  * Return 0 if not found, length of the badly spelled word otherwise.
  */
     int
-spell_move_to(wp, dir, allwords, curline, attrp)
-    win_T	*wp;
-    int		dir;		/* FORWARD or BACKWARD */
-    int		allwords;	/* TRUE for "[s"/"]s", FALSE for "[S"/"]S" */
-    int		curline;
-    hlf_T	*attrp;		/* return: attributes of bad word or NULL
+spell_move_to(
+    win_T	*wp,
+    int		dir,		/* FORWARD or BACKWARD */
+    int		allwords,	/* TRUE for "[s"/"]s", FALSE for "[S"/"]S" */
+    int		curline,
+    hlf_T	*attrp)		/* return: attributes of bad word or NULL
 				   (only when "dir" is FORWARD) */
 {
     linenr_T	lnum;
@@ -2421,10 +2410,7 @@
  * to skip those bytes if the word was OK.
  */
     void
-spell_cat_line(buf, line, maxlen)
-    char_u	*buf;
-    char_u	*line;
-    int		maxlen;
+spell_cat_line(char_u *buf, char_u *line, int maxlen)
 {
     char_u	*p;
     int		n;
@@ -2461,8 +2447,7 @@
  * "lang" must be the language without the region: e.g., "en".
  */
     static void
-spell_load_lang(lang)
-    char_u	*lang;
+spell_load_lang(char_u *lang)
 {
     char_u	fname_enc[85];
     int		r;
@@ -2543,7 +2528,7 @@
  * use "latin1" for "latin9".  And limit to 60 characters (just in case).
  */
     static char_u *
-spell_enc()
+spell_enc(void)
 {
 
 #ifdef FEAT_MBYTE
@@ -2558,8 +2543,7 @@
  * "fname[MAXPATHL]".
  */
     static void
-int_wordlist_spl(fname)
-    char_u	    *fname;
+int_wordlist_spl(char_u *fname)
 {
     vim_snprintf((char *)fname, MAXPATHL, SPL_FNAME_TMPL,
 						  int_wordlist, spell_enc());
@@ -2570,8 +2554,7 @@
  * Caller must fill "sl_next".
  */
     static slang_T *
-slang_alloc(lang)
-    char_u	*lang;
+slang_alloc(char_u *lang)
 {
     slang_T *lp;
 
@@ -2594,8 +2577,7 @@
  * Free the contents of an slang_T and the structure itself.
  */
     static void
-slang_free(lp)
-    slang_T	*lp;
+slang_free(slang_T *lp)
 {
     vim_free(lp->sl_name);
     vim_free(lp->sl_fname);
@@ -2607,8 +2589,7 @@
  * Clear an slang_T so that the file can be reloaded.
  */
     static void
-slang_clear(lp)
-    slang_T	*lp;
+slang_clear(slang_T *lp)
 {
     garray_T	*gap;
     fromto_T	*ftp;
@@ -2714,8 +2695,7 @@
  * Clear the info from the .sug file in "lp".
  */
     static void
-slang_clear_sug(lp)
-    slang_T	*lp;
+slang_clear_sug(slang_T *lp)
 {
     vim_free(lp->sl_sbyts);
     lp->sl_sbyts = NULL;
@@ -2732,9 +2712,7 @@
  * Invoked through do_in_runtimepath().
  */
     static void
-spell_load_cb(fname, cookie)
-    char_u	*fname;
-    void	*cookie;
+spell_load_cb(char_u *fname, void *cookie)
 {
     spelload_T	*slp = (spelload_T *)cookie;
     slang_T	*slang;
@@ -2767,11 +2745,11 @@
  * Returns the slang_T the spell file was loaded into.  NULL for error.
  */
     static slang_T *
-spell_load_file(fname, lang, old_lp, silent)
-    char_u	*fname;
-    char_u	*lang;
-    slang_T	*old_lp;
-    int		silent;		/* no error if file doesn't exist */
+spell_load_file(
+    char_u	*fname,
+    char_u	*lang,
+    slang_T	*old_lp,
+    int		silent)		/* no error if file doesn't exist */
 {
     FILE	*fd;
     char_u	buf[VIMSPELLMAGICL];
@@ -3025,10 +3003,7 @@
  * otherwise.
  */
     static char_u *
-read_cnt_string(fd, cnt_bytes, cntp)
-    FILE	*fd;
-    int		cnt_bytes;
-    int		*cntp;
+read_cnt_string(FILE *fd, int cnt_bytes, int *cntp)
 {
     int		cnt = 0;
     int		i;
@@ -3057,10 +3032,7 @@
  * Return SP_*ERROR flags.
  */
     static int
-read_region_section(fd, lp, len)
-    FILE	*fd;
-    slang_T	*lp;
-    int		len;
+read_region_section(FILE *fd, slang_T *lp, int len)
 {
     int		i;
 
@@ -3078,8 +3050,7 @@
  * Return SP_*ERROR flags.
  */
     static int
-read_charflags_section(fd)
-    FILE	*fd;
+read_charflags_section(FILE *fd)
 {
     char_u	*flags;
     char_u	*fol;
@@ -3116,9 +3087,7 @@
  * Return SP_*ERROR flags.
  */
     static int
-read_prefcond_section(fd, lp)
-    FILE	*fd;
-    slang_T	*lp;
+read_prefcond_section(FILE *fd, slang_T *lp)
 {
     int		cnt;
     int		i;
@@ -3164,10 +3133,7 @@
  * Return SP_*ERROR flags.
  */
     static int
-read_rep_section(fd, gap, first)
-    FILE	*fd;
-    garray_T	*gap;
-    short	*first;
+read_rep_section(FILE *fd, garray_T *gap, short *first)
 {
     int		cnt;
     fromto_T	*ftp;
@@ -3216,9 +3182,7 @@
  * Return SP_*ERROR flags.
  */
     static int
-read_sal_section(fd, slang)
-    FILE	*fd;
-    slang_T	*slang;
+read_sal_section(FILE *fd, slang_T *slang)
 {
     int		i;
     int		cnt;
@@ -3369,10 +3333,7 @@
  * Return SP_*ERROR flags.
  */
     static int
-read_words_section(fd, lp, len)
-    FILE	*fd;
-    slang_T	*lp;
-    int		len;
+read_words_section(FILE *fd, slang_T *lp, int len)
 {
     int		done = 0;
     int		i;
@@ -3406,11 +3367,11 @@
  * If it's already there then the counter is increased.
  */
     static void
-count_common_word(lp, word, len, count)
-    slang_T	*lp;
-    char_u	*word;
-    int		len;	    /* word length, -1 for upto NUL */
-    int		count;	    /* 1 to count once, 10 to init */
+count_common_word(
+    slang_T	*lp,
+    char_u	*word,
+    int		len,	    /* word length, -1 for upto NUL */
+    int		count)	    /* 1 to count once, 10 to init */
 {
     hash_T	hash;
     hashitem_T	*hi;
@@ -3449,11 +3410,11 @@
  * Adjust the score of common words.
  */
     static int
-score_wordcount_adj(slang, score, word, split)
-    slang_T	*slang;
-    int		score;
-    char_u	*word;
-    int		split;	    /* word was split, less bonus */
+score_wordcount_adj(
+    slang_T	*slang,
+    int		score,
+    char_u	*word,
+    int		split)	    /* word was split, less bonus */
 {
     hashitem_T	*hi;
     wordcount_T	*wc;
@@ -3486,9 +3447,7 @@
  * Return SP_*ERROR flags.
  */
     static int
-read_sofo_section(fd, slang)
-    FILE	*fd;
-    slang_T	*slang;
+read_sofo_section(FILE *fd, slang_T *slang)
 {
     int		cnt;
     char_u	*from, *to;
@@ -3528,10 +3487,7 @@
  * Returns SP_*ERROR flags.
  */
     static int
-read_compound(fd, slang, len)
-    FILE	*fd;
-    slang_T	*slang;
-    int		len;
+read_compound(FILE *fd, slang_T *slang, int len)
 {
     int		todo = len;
     int		c;
@@ -3728,9 +3684,7 @@
  * Like strchr() but independent of locale.
  */
     static int
-byte_in_str(str, n)
-    char_u	*str;
-    int		n;
+byte_in_str(char_u *str, int n)
 {
     char_u	*p;
 
@@ -3752,8 +3706,7 @@
  * in "slang->sl_syl_items".
  */
     static int
-init_syl_tab(slang)
-    slang_T	*slang;
+init_syl_tab(slang_T *slang)
 {
     char_u	*p;
     char_u	*s;
@@ -3791,9 +3744,7 @@
  * Returns zero if syllables are not defines.
  */
     static int
-count_syllables(slang, word)
-    slang_T	*slang;
-    char_u	*word;
+count_syllables(slang_T *slang, char_u *word)
 {
     int		cnt = 0;
     int		skip = FALSE;
@@ -3857,10 +3808,7 @@
  * Returns SP_*ERROR flags when there is something wrong.
  */
     static int
-set_sofo(lp, from, to)
-    slang_T	*lp;
-    char_u	*from;
-    char_u	*to;
+set_sofo(slang_T *lp, char_u *from, char_u *to)
 {
     int		i;
 
@@ -3949,8 +3897,7 @@
  * Fill the first-index table for "lp".
  */
     static void
-set_sal_first(lp)
-    slang_T	*lp;
+set_sal_first(slang_T *lp)
 {
     salfirst_T	*sfirst;
     int		i;
@@ -4015,8 +3962,7 @@
  * Return it in allocated memory (NULL for out-of-memory)
  */
     static int *
-mb_str2wide(s)
-    char_u	*s;
+mb_str2wide(char_u *s)
 {
     int		*res;
     char_u	*p;
@@ -4040,12 +3986,12 @@
  * Returns zero when OK, SP_ value for an error.
  */
     static int
-spell_read_tree(fd, bytsp, idxsp, prefixtree, prefixcnt)
-    FILE	*fd;
-    char_u	**bytsp;
-    idx_T	**idxsp;
-    int		prefixtree;	/* TRUE for the prefix tree */
-    int		prefixcnt;	/* when "prefixtree" is TRUE: prefix count */
+spell_read_tree(
+    FILE	*fd,
+    char_u	**bytsp,
+    idx_T	**idxsp,
+    int		prefixtree,	/* TRUE for the prefix tree */
+    int		prefixcnt)	/* when "prefixtree" is TRUE: prefix count */
 {
     int		len;
     int		idx;
@@ -4090,14 +4036,14 @@
  * Returns SP_FORMERROR if there is a format error.
  */
     static idx_T
-read_tree_node(fd, byts, idxs, maxidx, startidx, prefixtree, maxprefcondnr)
-    FILE	*fd;
-    char_u	*byts;
-    idx_T	*idxs;
-    int		maxidx;		    /* size of arrays */
-    idx_T	startidx;	    /* current index in "byts" and "idxs" */
-    int		prefixtree;	    /* TRUE for reading PREFIXTREE */
-    int		maxprefcondnr;	    /* maximum for <prefcondnr> */
+read_tree_node(
+    FILE	*fd,
+    char_u	*byts,
+    idx_T	*idxs,
+    int		maxidx,		    /* size of arrays */
+    idx_T	startidx,	    /* current index in "byts" and "idxs" */
+    int		prefixtree,	    /* TRUE for reading PREFIXTREE */
+    int		maxprefcondnr)	    /* maximum for <prefcondnr> */
 {
     int		len;
     int		i;
@@ -4206,8 +4152,7 @@
  * Returns NULL if it's OK, an error message otherwise.
  */
     char_u *
-did_set_spelllang(wp)
-    win_T	*wp;
+did_set_spelllang(win_T *wp)
 {
     garray_T	ga;
     char_u	*splp;
@@ -4530,8 +4475,7 @@
  * Clear the midword characters for buffer "buf".
  */
     static void
-clear_midword(wp)
-    win_T	*wp;
+clear_midword(win_T *wp)
 {
     vim_memset(wp->w_s->b_spell_ismw, 0, 256);
 #ifdef FEAT_MBYTE
@@ -4545,9 +4489,7 @@
  * They add up to any currently used midword characters.
  */
     static void
-use_midword(lp, wp)
-    slang_T	*lp;
-    win_T	*wp;
+use_midword(slang_T *lp, win_T *wp)
 {
     char_u	*p;
 
@@ -4593,9 +4535,7 @@
  * Returns the index if found (first is 0), REGION_ALL if not found.
  */
     static int
-find_region(rp, region)
-    char_u	*rp;
-    char_u	*region;
+find_region(char_u *rp, char_u *region)
 {
     int		i;
 
@@ -4617,9 +4557,9 @@
  * WoRd	wOrd	WF_KEEPCAP
  */
     static int
-captype(word, end)
-    char_u	*word;
-    char_u	*end;	    /* When NULL use up to NUL byte. */
+captype(
+    char_u	*word,
+    char_u	*end)	    /* When NULL use up to NUL byte. */
 {
     char_u	*p;
     int		c;
@@ -4673,9 +4613,7 @@
  * Add ALLCAP for "WOrD".
  */
     static int
-badword_captype(word, end)
-    char_u	*word;
-    char_u	*end;
+badword_captype(char_u *word, char_u *end)
 {
     int		flags = captype(word, end);
     int		c;
@@ -4720,7 +4658,7 @@
  * Delete the internal wordlist and its .spl file.
  */
     void
-spell_delete_wordlist()
+spell_delete_wordlist(void)
 {
     char_u	fname[MAXPATHL];
 
@@ -4739,7 +4677,7 @@
  * Free all languages.
  */
     void
-spell_free_all()
+spell_free_all(void)
 {
     slang_T	*slang;
     buf_T	*buf;
@@ -4770,7 +4708,7 @@
  * Used after 'encoding' is set and when ":mkspell" was used.
  */
     void
-spell_reload()
+spell_reload(void)
 {
     win_T	*wp;
 
@@ -4803,9 +4741,9 @@
  * Reload the spell file "fname" if it's loaded.
  */
     static void
-spell_reload_one(fname, added_word)
-    char_u	*fname;
-    int		added_word;	/* invoked through "zg" */
+spell_reload_one(
+    char_u	*fname,
+    int		added_word)	/* invoked through "zg" */
 {
     slang_T	*slang;
     int		didit = FALSE;
@@ -5213,9 +5151,7 @@
  * Returns an afffile_T, NULL for complete failure.
  */
     static afffile_T *
-spell_read_aff(spin, fname)
-    spellinfo_T	*spin;
-    char_u	*fname;
+spell_read_aff(spellinfo_T *spin, char_u *fname)
 {
     FILE	*fd;
     afffile_T	*aff;
@@ -6163,11 +6099,11 @@
  * a comment is following after item "mincount".
  */
     static int
-is_aff_rule(items, itemcnt, rulename, mincount)
-    char_u	**items;
-    int		itemcnt;
-    char	*rulename;
-    int		mincount;
+is_aff_rule(
+    char_u	**items,
+    int		itemcnt,
+    char	*rulename,
+    int		mincount)
 {
     return (STRCMP(items[0], rulename) == 0
 	    && (itemcnt == mincount
@@ -6179,9 +6115,7 @@
  * ae_flags to ae_comppermit and ae_compforbid.
  */
     static void
-aff_process_flags(affile, entry)
-    afffile_T	*affile;
-    affentry_T	*entry;
+aff_process_flags(afffile_T *affile, affentry_T *entry)
 {
     char_u	*p;
     char_u	*prevp;
@@ -6215,8 +6149,7 @@
  * Return TRUE if "s" is the name of an info item in the affix file.
  */
     static int
-spell_info_item(s)
-    char_u	*s;
+spell_info_item(char_u *s)
 {
     return STRCMP(s, "NAME") == 0
 	|| STRCMP(s, "HOME") == 0
@@ -6231,11 +6164,11 @@
  * returns zero for failure.
  */
     static unsigned
-affitem2flag(flagtype, item, fname, lnum)
-    int		flagtype;
-    char_u	*item;
-    char_u	*fname;
-    int		lnum;
+affitem2flag(
+    int		flagtype,
+    char_u	*item,
+    char_u	*fname,
+    int		lnum)
 {
     unsigned	res;
     char_u	*p = item;
@@ -6264,9 +6197,7 @@
  * Returns zero for an error, still advances the pointer then.
  */
     static unsigned
-get_affitem(flagtype, pp)
-    int		flagtype;
-    char_u	**pp;
+get_affitem(int flagtype, char_u **pp)
 {
     int		res;
 
@@ -6308,10 +6239,10 @@
  * they fit in one byte.
  */
     static void
-process_compflags(spin, aff, compflags)
-    spellinfo_T	*spin;
-    afffile_T	*aff;
-    char_u	*compflags;
+process_compflags(
+    spellinfo_T	*spin,
+    afffile_T	*aff,
+    char_u	*compflags)
 {
     char_u	*p;
     char_u	*prevp;
@@ -6392,8 +6323,7 @@
  * When that is used up an error message is given.
  */
     static void
-check_renumber(spin)
-    spellinfo_T	*spin;
+check_renumber(spellinfo_T *spin)
 {
     if (spin->si_newprefID == spin->si_newcompID && spin->si_newcompID < 128)
     {
@@ -6406,10 +6336,7 @@
  * Return TRUE if flag "flag" appears in affix list "afflist".
  */
     static int
-flag_in_afflist(flagtype, afflist, flag)
-    int		flagtype;
-    char_u	*afflist;
-    unsigned	flag;
+flag_in_afflist(int flagtype, char_u *afflist, unsigned flag)
 {
     char_u	*p;
     unsigned	n;
@@ -6458,10 +6385,7 @@
  * Give a warning when "spinval" and "affval" numbers are set and not the same.
  */
     static void
-aff_check_number(spinval, affval, name)
-    int	    spinval;
-    int	    affval;
-    char    *name;
+aff_check_number(int spinval, int affval, char *name)
 {
     if (spinval != 0 && spinval != affval)
 	smsg((char_u *)_("%s value differs from what is used in another .aff file"), name);
@@ -6471,10 +6395,7 @@
  * Give a warning when "spinval" and "affval" strings are set and not the same.
  */
     static void
-aff_check_string(spinval, affval, name)
-    char_u	*spinval;
-    char_u	*affval;
-    char	*name;
+aff_check_string(char_u *spinval, char_u *affval, char *name)
 {
     if (spinval != NULL && STRCMP(spinval, affval) != 0)
 	smsg((char_u *)_("%s value differs from what is used in another .aff file"), name);
@@ -6485,9 +6406,7 @@
  * NULL as equal.
  */
     static int
-str_equal(s1, s2)
-    char_u	*s1;
-    char_u	*s2;
+str_equal(char_u *s1, char_u *s2)
 {
     if (s1 == NULL || s2 == NULL)
 	return s1 == s2;
@@ -6499,11 +6418,11 @@
  * They are stored case-folded.
  */
     static void
-add_fromto(spin, gap, from, to)
-    spellinfo_T	*spin;
-    garray_T	*gap;
-    char_u	*from;
-    char_u	*to;
+add_fromto(
+    spellinfo_T	*spin,
+    garray_T	*gap,
+    char_u	*from,
+    char_u	*to)
 {
     fromto_T	*ftp;
     char_u	word[MAXWLEN];
@@ -6523,8 +6442,7 @@
  * Convert a boolean argument in a SAL line to TRUE or FALSE;
  */
     static int
-sal_to_bool(s)
-    char_u	*s;
+sal_to_bool(char_u *s)
 {
     return STRCMP(s, "1") == 0 || STRCMP(s, "true") == 0;
 }
@@ -6533,8 +6451,7 @@
  * Free the structure filled by spell_read_aff().
  */
     static void
-spell_free_aff(aff)
-    afffile_T	*aff;
+spell_free_aff(afffile_T *aff)
 {
     hashtab_T	*ht;
     hashitem_T	*hi;
@@ -6572,10 +6489,7 @@
  * Returns OK or FAIL;
  */
     static int
-spell_read_dic(spin, fname, affile)
-    spellinfo_T	*spin;
-    char_u	*fname;
-    afffile_T	*affile;
+spell_read_dic(spellinfo_T *spin, char_u *fname, afffile_T *affile)
 {
     hashtab_T	ht;
     char_u	line[MAXLINELEN];
@@ -6789,9 +6703,7 @@
  * Return WF_ flags.
  */
     static int
-get_affix_flags(affile, afflist)
-    afffile_T	*affile;
-    char_u	*afflist;
+get_affix_flags(afffile_T *affile, char_u *afflist)
 {
     int		flags = 0;
 
@@ -6823,10 +6735,10 @@
  * and return the number of affixes.
  */
     static int
-get_pfxlist(affile, afflist, store_afflist)
-    afffile_T	*affile;
-    char_u	*afflist;
-    char_u	*store_afflist;
+get_pfxlist(
+    afffile_T	*affile,
+    char_u	*afflist,
+    char_u	*store_afflist)
 {
     char_u	*p;
     char_u	*prevp;
@@ -6865,10 +6777,10 @@
  * Puts the flags in "store_afflist[]".
  */
     static void
-get_compflags(affile, afflist, store_afflist)
-    afffile_T	*affile;
-    char_u	*afflist;
-    char_u	*store_afflist;
+get_compflags(
+    afffile_T	*affile,
+    char_u	*afflist,
+    char_u	*store_afflist)
 {
     char_u	*p;
     char_u	*prevp;
@@ -6904,18 +6816,17 @@
  * Returns FAIL when out of memory.
  */
     static int
-store_aff_word(spin, word, afflist, affile, ht, xht, condit, flags,
-							      pfxlist, pfxlen)
-    spellinfo_T	*spin;		/* spell info */
-    char_u	*word;		/* basic word start */
-    char_u	*afflist;	/* list of names of supported affixes */
-    afffile_T	*affile;
-    hashtab_T	*ht;
-    hashtab_T	*xht;
-    int		condit;		/* CONDIT_SUF et al. */
-    int		flags;		/* flags for the word */
-    char_u	*pfxlist;	/* list of prefix IDs */
-    int		pfxlen;		/* nr of flags in "pfxlist" for prefixes, rest
+store_aff_word(
+    spellinfo_T	*spin,		/* spell info */
+    char_u	*word,		/* basic word start */
+    char_u	*afflist,	/* list of names of supported affixes */
+    afffile_T	*affile,
+    hashtab_T	*ht,
+    hashtab_T	*xht,
+    int		condit,		/* CONDIT_SUF et al. */
+    int		flags,		/* flags for the word */
+    char_u	*pfxlist,	/* list of prefix IDs */
+    int		pfxlen)		/* nr of flags in "pfxlist" for prefixes, rest
 				 * is compound flags */
 {
     int		todo;
@@ -7170,9 +7081,7 @@
  * Read a file with a list of words.
  */
     static int
-spell_read_wordfile(spin, fname)
-    spellinfo_T	*spin;
-    char_u	*fname;
+spell_read_wordfile(spellinfo_T *spin, char_u *fname)
 {
     FILE	*fd;
     long	lnum = 0;
@@ -7380,10 +7289,10 @@
  * Returns NULL when out of memory.
  */
     static void *
-getroom(spin, len, align)
-    spellinfo_T *spin;
-    size_t	len;		/* length needed */
-    int		align;		/* align for pointer */
+getroom(
+    spellinfo_T *spin,
+    size_t	len,		/* length needed */
+    int		align)		/* align for pointer */
 {
     char_u	*p;
     sblock_T	*bl = spin->si_blocks;
@@ -7428,9 +7337,7 @@
  * Returns NULL when out of memory.
  */
     static char_u *
-getroom_save(spin, s)
-    spellinfo_T	*spin;
-    char_u	*s;
+getroom_save(spellinfo_T *spin, char_u *s)
 {
     char_u	*sc;
 
@@ -7445,8 +7352,7 @@
  * Free the list of allocated sblock_T.
  */
     static void
-free_blocks(bl)
-    sblock_T	*bl;
+free_blocks(sblock_T *bl)
 {
     sblock_T	*next;
 
@@ -7463,8 +7369,7 @@
  * Returns NULL when out of memory.
  */
     static wordnode_T *
-wordtree_alloc(spin)
-    spellinfo_T *spin;
+wordtree_alloc(spellinfo_T *spin)
 {
     return (wordnode_T *)getroom(spin, sizeof(wordnode_T), TRUE);
 }
@@ -7479,13 +7384,13 @@
  * compound flag.
  */
     static int
-store_word(spin, word, flags, region, pfxlist, need_affix)
-    spellinfo_T	*spin;
-    char_u	*word;
-    int		flags;		/* extra flags, WF_BANNED */
-    int		region;		/* supported region(s) */
-    char_u	*pfxlist;	/* list of prefix IDs or NULL */
-    int		need_affix;	/* only store word with affix ID */
+store_word(
+    spellinfo_T	*spin,
+    char_u	*word,
+    int		flags,		/* extra flags, WF_BANNED */
+    int		region,		/* supported region(s) */
+    char_u	*pfxlist,	/* list of prefix IDs or NULL */
+    int		need_affix)	/* only store word with affix ID */
 {
     int		len = (int)STRLEN(word);
     int		ct = captype(word, word + len);
@@ -7526,13 +7431,13 @@
  * Returns FAIL when out of memory.
  */
     static int
-tree_add_word(spin, word, root, flags, region, affixID)
-    spellinfo_T	*spin;
-    char_u	*word;
-    wordnode_T	*root;
-    int		flags;
-    int		region;
-    int		affixID;
+tree_add_word(
+    spellinfo_T	*spin,
+    char_u	*word,
+    wordnode_T	*root,
+    int		flags,
+    int		region,
+    int		affixID)
 {
     wordnode_T	*node = root;
     wordnode_T	*np;
@@ -7706,7 +7611,7 @@
  * Sets "sps_flags".
  */
     int
-spell_check_msm()
+spell_check_msm(void)
 {
     char_u	*p = p_msm;
     long	start = 0;
@@ -7748,8 +7653,7 @@
  * Returns NULL when out of memory.
  */
     static wordnode_T *
-get_wordnode(spin)
-    spellinfo_T	    *spin;
+get_wordnode(spellinfo_T *spin)
 {
     wordnode_T *n;
 
@@ -7776,9 +7680,7 @@
  * Returns the number of nodes actually freed.
  */
     static int
-deref_wordnode(spin, node)
-    spellinfo_T *spin;
-    wordnode_T  *node;
+deref_wordnode(spellinfo_T *spin, wordnode_T *node)
 {
     wordnode_T	*np;
     int		cnt = 0;
@@ -7802,9 +7704,7 @@
  * Only the "wn_child" field becomes invalid.
  */
     static void
-free_wordnode(spin, n)
-    spellinfo_T	*spin;
-    wordnode_T  *n;
+free_wordnode(spellinfo_T *spin, wordnode_T *n)
 {
     n->wn_child = spin->si_first_free;
     spin->si_first_free = n;
@@ -7815,9 +7715,7 @@
  * Compress a tree: find tails that are identical and can be shared.
  */
     static void
-wordtree_compress(spin, root)
-    spellinfo_T	    *spin;
-    wordnode_T	    *root;
+wordtree_compress(spellinfo_T *spin, wordnode_T *root)
 {
     hashtab_T	    ht;
     int		    n;
@@ -7858,11 +7756,11 @@
  * Returns the number of compressed nodes.
  */
     static int
-node_compress(spin, node, ht, tot)
-    spellinfo_T	*spin;
-    wordnode_T	*node;
-    hashtab_T	*ht;
-    int		*tot;	    /* total count of nodes before compressing,
+node_compress(
+    spellinfo_T	*spin,
+    wordnode_T	*node,
+    hashtab_T	*ht,
+    int		*tot)	    /* total count of nodes before compressing,
 			       incremented while going through the tree */
 {
     wordnode_T	*np;
@@ -7964,9 +7862,7 @@
  * Return TRUE when two nodes have identical siblings and children.
  */
     static int
-node_equal(n1, n2)
-    wordnode_T	*n1;
-    wordnode_T	*n2;
+node_equal(wordnode_T *n1, wordnode_T *n2)
 {
     wordnode_T	*p1;
     wordnode_T	*p2;
@@ -7997,9 +7893,7 @@
 #ifdef __BORLANDC__
 _RTLENTRYF
 #endif
-rep_compare(s1, s2)
-    const void	*s1;
-    const void	*s2;
+rep_compare(const void *s1, const void *s2)
 {
     fromto_T	*p1 = (fromto_T *)s1;
     fromto_T	*p2 = (fromto_T *)s2;
@@ -8012,9 +7906,7 @@
  * Return FAIL or OK;
  */
     static int
-write_vim_spell(spin, fname)
-    spellinfo_T	*spin;
-    char_u	*fname;
+write_vim_spell(spellinfo_T *spin, char_u *fname)
 {
     FILE	*fd;
     int		regionmask;
@@ -8434,8 +8326,7 @@
  * space.
  */
     static void
-clear_node(node)
-    wordnode_T	*node;
+clear_node(wordnode_T *node)
 {
     wordnode_T	*np;
 
@@ -8464,12 +8355,12 @@
  * Returns the number of nodes used.
  */
     static int
-put_node(fd, node, idx, regionmask, prefixtree)
-    FILE	*fd;		/* NULL when only counting */
-    wordnode_T	*node;
-    int		idx;
-    int		regionmask;
-    int		prefixtree;	/* TRUE for PREFIXTREE */
+put_node(
+    FILE	*fd,		/* NULL when only counting */
+    wordnode_T	*node,
+    int		idx,
+    int		regionmask,
+    int		prefixtree)	/* TRUE for PREFIXTREE */
 {
     int		newindex = idx;
     int		siblingcount = 0;
@@ -8594,8 +8485,7 @@
  * ":mkspell [-ascii] addfile"
  */
     void
-ex_mkspell(eap)
-    exarg_T *eap;
+ex_mkspell(exarg_T *eap)
 {
     int		fcount;
     char_u	**fnames;
@@ -8622,9 +8512,7 @@
  * Writes the file with the name "wfname", with ".spl" changed to ".sug".
  */
     static void
-spell_make_sugfile(spin, wfname)
-    spellinfo_T	*spin;
-    char_u	*wfname;
+spell_make_sugfile(spellinfo_T *spin, char_u *wfname)
 {
     char_u	*fname = NULL;
     int		len;
@@ -8711,9 +8599,7 @@
  * Build the soundfold trie for language "slang".
  */
     static int
-sug_filltree(spin, slang)
-    spellinfo_T	*spin;
-    slang_T	*slang;
+sug_filltree(spellinfo_T *spin, slang_T *slang)
 {
     char_u	*byts;
     idx_T	*idxs;
@@ -8819,8 +8705,7 @@
  * Returns FAIL when out of memory.
  */
     static int
-sug_maketable(spin)
-    spellinfo_T	*spin;
+sug_maketable(spellinfo_T *spin)
 {
     garray_T	ga;
     int		res = OK;
@@ -8849,11 +8734,11 @@
  * Returns -1 when out of memory.
  */
     static int
-sug_filltable(spin, node, startwordnr, gap)
-    spellinfo_T	*spin;
-    wordnode_T	*node;
-    int		startwordnr;
-    garray_T	*gap;	    /* place to store line of numbers */
+sug_filltable(
+    spellinfo_T	*spin,
+    wordnode_T	*node,
+    int		startwordnr,
+    garray_T	*gap)	    /* place to store line of numbers */
 {
     wordnode_T	*p, *np;
     int		wordnr = startwordnr;
@@ -8916,9 +8801,7 @@
  * bytes.
  */
     static int
-offset2bytes(nr, buf)
-    int	    nr;
-    char_u  *buf;
+offset2bytes(int nr, char_u *buf)
 {
     int	    rem;
     int	    b1, b2, b3, b4;
@@ -8963,8 +8846,7 @@
  * Returns the offset.
  */
     static int
-bytes2offset(pp)
-    char_u	**pp;
+bytes2offset(char_u **pp)
 {
     char_u	*p = *pp;
     int		nr;
@@ -9002,9 +8884,7 @@
  * Write the .sug file in "fname".
  */
     static void
-sug_write(spin, fname)
-    spellinfo_T	*spin;
-    char_u	*fname;
+sug_write(spellinfo_T *spin, char_u *fname)
 {
     FILE	*fd;
     wordnode_T	*tree;
@@ -9101,7 +8981,7 @@
  * Returns NULL when out of memory.
  */
     static buf_T *
-open_spellbuf()
+open_spellbuf(void)
 {
     buf_T	*buf;
 
@@ -9123,8 +9003,7 @@
  * Close the buffer used for spell info.
  */
     static void
-close_spellbuf(buf)
-    buf_T	*buf;
+close_spellbuf(buf_T *buf)
 {
     if (buf != NULL)
     {
@@ -9142,12 +9021,12 @@
  * and ".spl" is appended to make the output file name.
  */
     static void
-mkspell(fcount, fnames, ascii, over_write, added_word)
-    int		fcount;
-    char_u	**fnames;
-    int		ascii;		    /* -ascii argument given */
-    int		over_write;	    /* overwrite existing output file */
-    int		added_word;	    /* invoked through "zg" */
+mkspell(
+    int		fcount,
+    char_u	**fnames,
+    int		ascii,		    /* -ascii argument given */
+    int		over_write,	    /* overwrite existing output file */
+    int		added_word)	    /* invoked through "zg" */
 {
     char_u	*fname = NULL;
     char_u	*wfname;
@@ -9402,9 +9281,7 @@
  * ":mkspell".  "str" can be IObuff.
  */
     static void
-spell_message(spin, str)
-    spellinfo_T *spin;
-    char_u	*str;
+spell_message(spellinfo_T *spin, char_u *str)
 {
     if (spin->si_verbose || p_verbose > 2)
     {
@@ -9423,8 +9300,7 @@
  * ":[count]spellundo  {word}"
  */
     void
-ex_spell(eap)
-    exarg_T *eap;
+ex_spell(exarg_T *eap)
 {
     spell_add_word(eap->arg, (int)STRLEN(eap->arg), eap->cmdidx == CMD_spellwrong,
 				   eap->forceit ? 0 : (int)eap->line2,
@@ -9435,13 +9311,13 @@
  * Add "word[len]" to 'spellfile' as a good or bad word.
  */
     void
-spell_add_word(word, len, bad, idx, undo)
-    char_u	*word;
-    int		len;
-    int		bad;
-    int		idx;	    /* "zG" and "zW": zero, otherwise index in
+spell_add_word(
+    char_u	*word,
+    int		len,
+    int		bad,
+    int		idx,	    /* "zG" and "zW": zero, otherwise index in
 			       'spellfile' */
-    int		undo;	    /* TRUE for "zug", "zuG", "zuw" and "zuW" */
+    int		undo)	    /* TRUE for "zug", "zuG", "zuw" and "zuW" */
 {
     FILE	*fd = NULL;
     buf_T	*buf = NULL;
@@ -9604,7 +9480,7 @@
  * Initialize 'spellfile' for the current buffer.
  */
     static void
-init_spellfile()
+init_spellfile(void)
 {
     char_u	*buf;
     int		l;
@@ -9685,8 +9561,7 @@
  * EBCDIC is not supported!
  */
     static void
-clear_spell_chartab(sp)
-    spelltab_T	*sp;
+clear_spell_chartab(spelltab_T *sp)
 {
     int		i;
 
@@ -9724,7 +9599,7 @@
  * locale.  For utf-8 we don't use isalpha() but our own functions.
  */
     void
-init_spell_chartab()
+init_spell_chartab(void)
 {
     int	    i;
 
@@ -9779,10 +9654,7 @@
  * Set the spell character tables from strings in the affix file.
  */
     static int
-set_spell_chartab(fol, low, upp)
-    char_u	*fol;
-    char_u	*low;
-    char_u	*upp;
+set_spell_chartab(char_u *fol, char_u *low, char_u *upp)
 {
     /* We build the new tables here first, so that we can compare with the
      * previous one. */
@@ -9857,10 +9729,10 @@
  * Set the spell character tables from strings in the .spl file.
  */
     static void
-set_spell_charflags(flags, cnt, fol)
-    char_u	*flags;
-    int		cnt;	    /* length of "flags" */
-    char_u	*fol;
+set_spell_charflags(
+    char_u	*flags,
+    int		cnt,	    /* length of "flags" */
+    char_u	*fol)
 {
     /* We build the new tables here first, so that we can compare with the
      * previous one. */
@@ -9896,8 +9768,7 @@
 }
 
     static int
-set_spell_finish(new_st)
-    spelltab_T	*new_st;
+set_spell_finish(spelltab_T *new_st)
 {
     int		i;
 
@@ -9933,9 +9804,9 @@
  * Thus this only works properly when past the first character of the word.
  */
     static int
-spell_iswordp(p, wp)
-    char_u	*p;
-    win_T	*wp;	    /* buffer used */
+spell_iswordp(
+    char_u	*p,
+    win_T	*wp)	    /* buffer used */
 {
 #ifdef FEAT_MBYTE
     char_u	*s;
@@ -9976,9 +9847,7 @@
  * Unlike spell_iswordp() this doesn't check for "midword" characters.
  */
     static int
-spell_iswordp_nmw(p, wp)
-    char_u	*p;
-    win_T	*wp;
+spell_iswordp_nmw(char_u *p, win_T *wp)
 {
 #ifdef FEAT_MBYTE
     int		c;
@@ -10002,9 +9871,7 @@
  * See also dbcs_class() and utf_class() in mbyte.c.
  */
     static int
-spell_mb_isword_class(cl, wp)
-    int		cl;
-    win_T	*wp;
+spell_mb_isword_class(int cl, win_T *wp)
 {
     if (wp->w_s->b_cjk)
 	/* East Asian characters are not considered word characters. */
@@ -10017,9 +9884,7 @@
  * Wide version of spell_iswordp().
  */
     static int
-spell_iswordp_w(p, wp)
-    int		*p;
-    win_T	*wp;
+spell_iswordp_w(int *p, win_T *wp)
 {
     int		*s;
 
@@ -10048,9 +9913,7 @@
  * When "fd" is NULL only count the length of what is written.
  */
     static int
-write_spell_prefcond(fd, gap)
-    FILE	*fd;
-    garray_T	*gap;
+write_spell_prefcond(FILE *fd, garray_T *gap)
 {
     int		i;
     char_u	*p;
@@ -10091,11 +9954,11 @@
  * Returns FAIL when something wrong.
  */
     static int
-spell_casefold(str, len, buf, buflen)
-    char_u	*str;
-    int		len;
-    char_u	*buf;
-    int		buflen;
+spell_casefold(
+    char_u	*str,
+    int		len,
+    char_u	*buf,
+    int		buflen)
 {
     int		i;
 
@@ -10150,7 +10013,7 @@
  * Sets "sps_flags" and "sps_limit".
  */
     int
-spell_check_sps()
+spell_check_sps(void)
 {
     char_u	*p;
     char_u	*s;
@@ -10205,8 +10068,7 @@
  * When "count" is non-zero use that suggestion.
  */
     void
-spell_suggest(count)
-    int		count;
+spell_suggest(int count)
 {
     char_u	*line;
     pos_T	prev_cursor = curwin->w_cursor;
@@ -10448,9 +10310,7 @@
  * capital.  This uses 'spellcapcheck' of the current buffer.
  */
     static int
-check_need_cap(lnum, col)
-    linenr_T	lnum;
-    colnr_T	col;
+check_need_cap(linenr_T lnum, colnr_T col)
 {
     int		need_cap = FALSE;
     char_u	*line;
@@ -10518,8 +10378,7 @@
  * ":spellrepall"
  */
     void
-ex_spellrepall(eap)
-    exarg_T *eap UNUSED;
+ex_spellrepall(exarg_T *eap UNUSED)
 {
     pos_T	pos = curwin->w_cursor;
     char_u	*frompat;
@@ -10591,12 +10450,12 @@
  * a list of allocated strings.
  */
     void
-spell_suggest_list(gap, word, maxcount, need_cap, interactive)
-    garray_T	*gap;
-    char_u	*word;
-    int		maxcount;	/* maximum nr of suggestions */
-    int		need_cap;	/* 'spellcapcheck' matched */
-    int		interactive;
+spell_suggest_list(
+    garray_T	*gap,
+    char_u	*word,
+    int		maxcount,	/* maximum nr of suggestions */
+    int		need_cap,	/* 'spellcapcheck' matched */
+    int		interactive)
 {
     suginfo_T	sug;
     int		i;
@@ -10636,14 +10495,14 @@
  * This is based on the mechanisms of Aspell, but completely reimplemented.
  */
     static void
-spell_find_suggest(badptr, badlen, su, maxcount, banbadword, need_cap, interactive)
-    char_u	*badptr;
-    int		badlen;		/* length of bad word or 0 if unknown */
-    suginfo_T	*su;
-    int		maxcount;
-    int		banbadword;	/* don't include badword in suggestions */
-    int		need_cap;	/* word should start with capital */
-    int		interactive;
+spell_find_suggest(
+    char_u	*badptr,
+    int		badlen,		/* length of bad word or 0 if unknown */
+    suginfo_T	*su,
+    int		maxcount,
+    int		banbadword,	/* don't include badword in suggestions */
+    int		need_cap,	/* word should start with capital */
+    int		interactive)
 {
     hlf_T	attr = HLF_COUNT;
     char_u	buf[MAXPATHL];
@@ -10769,9 +10628,7 @@
  * Find suggestions by evaluating expression "expr".
  */
     static void
-spell_suggest_expr(su, expr)
-    suginfo_T	*su;
-    char_u	*expr;
+spell_suggest_expr(suginfo_T *su, char_u *expr)
 {
     list_T	*list;
     listitem_T	*li;
@@ -10807,9 +10664,7 @@
  * Find suggestions in file "fname".  Used for "file:" in 'spellsuggest'.
  */
     static void
-spell_suggest_file(su, fname)
-    suginfo_T	*su;
-    char_u	*fname;
+spell_suggest_file(suginfo_T *su, char_u *fname)
 {
     FILE	*fd;
     char_u	line[MAXWLEN * 2];
@@ -10865,9 +10720,7 @@
  * Find suggestions for the internal method indicated by "sps_flags".
  */
     static void
-spell_suggest_intern(su, interactive)
-    suginfo_T	*su;
-    int		interactive;
+spell_suggest_intern(suginfo_T *su, int interactive)
 {
     /*
      * Load the .sug file(s) that are available and not done yet.
@@ -10959,7 +10812,7 @@
  * Load the .sug files for languages that have one and weren't loaded yet.
  */
     static void
-suggest_load_files()
+suggest_load_files(void)
 {
     langp_T	*lp;
     int		lpi;
@@ -11100,9 +10953,7 @@
  * Returns the total number of words.
  */
     static void
-tree_count_words(byts, idxs)
-    char_u	*byts;
-    idx_T	*idxs;
+tree_count_words(char_u *byts, idx_T *idxs)
 {
     int		depth;
     idx_T	arridx[MAXWLEN];
@@ -11163,8 +11014,7 @@
  * Free the info put in "*su" by spell_find_suggest().
  */
     static void
-spell_find_cleanup(su)
-    suginfo_T	*su;
+spell_find_cleanup(suginfo_T *su)
 {
     int		i;
 
@@ -11186,10 +11036,10 @@
  * The result is NUL terminated.
  */
     static void
-onecap_copy(word, wcopy, upper)
-    char_u	*word;
-    char_u	*wcopy;
-    int		upper;	    /* TRUE: first letter made upper case */
+onecap_copy(
+    char_u	*word,
+    char_u	*wcopy,
+    int		upper)	    /* TRUE: first letter made upper case */
 {
     char_u	*p;
     int		c;
@@ -11223,9 +11073,7 @@
  * "wcopy[MAXWLEN]".  The result is NUL terminated.
  */
     static void
-allcap_copy(word, wcopy)
-    char_u	*word;
-    char_u	*wcopy;
+allcap_copy(char_u *word, char_u *wcopy)
 {
     char_u	*s;
     char_u	*d;
@@ -11277,8 +11125,7 @@
  * Try finding suggestions by recognizing specific situations.
  */
     static void
-suggest_try_special(su)
-    suginfo_T	*su;
+suggest_try_special(suginfo_T *su)
 {
     char_u	*p;
     size_t	len;
@@ -11361,8 +11208,7 @@
  * Try finding suggestions by adding/removing/swapping letters.
  */
     static void
-suggest_try_change(su)
-    suginfo_T	*su;
+suggest_try_change(suginfo_T *su)
 {
     char_u	fword[MAXWLEN];	    /* copy of the bad word, case-folded */
     int		n;
@@ -11434,11 +11280,11 @@
  *	use "slang->sl_repsal" instead of "lp->lp_replang->sl_rep"
  */
     static void
-suggest_trie_walk(su, lp, fword, soundfold)
-    suginfo_T	*su;
-    langp_T	*lp;
-    char_u	*fword;
-    int		soundfold;
+suggest_trie_walk(
+    suginfo_T	*su,
+    langp_T	*lp,
+    char_u	*fword,
+    int		soundfold)
 {
     char_u	tword[MAXWLEN];	    /* good word collected so far */
     trystate_T	stack[MAXWLEN];
@@ -12934,10 +12780,7 @@
  * Go one level deeper in the tree.
  */
     static void
-go_deeper(stack, depth, score_add)
-    trystate_T	*stack;
-    int		depth;
-    int		score_add;
+go_deeper(trystate_T *stack, int depth, int score_add)
 {
     stack[depth + 1] = stack[depth];
     stack[depth + 1].ts_state = STATE_START;
@@ -12952,10 +12795,7 @@
  * fword[flen] and return the byte length of that many chars in "word".
  */
     static int
-nofold_len(fword, flen, word)
-    char_u	*fword;
-    int		flen;
-    char_u	*word;
+nofold_len(char_u *fword, int flen, char_u *word)
 {
     char_u	*p;
     int		i = 0;
@@ -12975,10 +12815,7 @@
  * same case-folded word, but we only find one...
  */
     static void
-find_keepcap_word(slang, fword, kword)
-    slang_T	*slang;
-    char_u	*fword;
-    char_u	*kword;
+find_keepcap_word(slang_T *slang, char_u *fword, char_u *kword)
 {
     char_u	uword[MAXWLEN];		/* "fword" in upper-case */
     int		depth;
@@ -13134,8 +12971,7 @@
  * su->su_sga.
  */
     static void
-score_comp_sal(su)
-    suginfo_T	*su;
+score_comp_sal(suginfo_T *su)
 {
     langp_T	*lp;
     char_u	badsound[MAXWLEN];
@@ -13189,8 +13025,7 @@
  * They are entwined.
  */
     static void
-score_combine(su)
-    suginfo_T	*su;
+score_combine(suginfo_T *su)
 {
     int		i;
     int		j;
@@ -13302,11 +13137,11 @@
  * badword.
  */
     static int
-stp_sal_score(stp, su, slang, badsound)
-    suggest_T	*stp;
-    suginfo_T	*su;
-    slang_T	*slang;
-    char_u	*badsound;	/* sound-folded badword */
+stp_sal_score(
+    suggest_T	*stp,
+    suginfo_T	*su,
+    slang_T	*slang,
+    char_u	*badsound)	/* sound-folded badword */
 {
     char_u	*p;
     char_u	*pbad;
@@ -13372,7 +13207,7 @@
  * Prepare for calling suggest_try_soundalike().
  */
     static void
-suggest_try_soundalike_prep()
+suggest_try_soundalike_prep(void)
 {
     langp_T	*lp;
     int		lpi;
@@ -13395,8 +13230,7 @@
  * Note: This doesn't support postponed prefixes.
  */
     static void
-suggest_try_soundalike(su)
-    suginfo_T	*su;
+suggest_try_soundalike(suginfo_T *su)
 {
     char_u	salword[MAXWLEN];
     langp_T	*lp;
@@ -13432,7 +13266,7 @@
  * Finish up after calling suggest_try_soundalike().
  */
     static void
-suggest_try_soundalike_finish()
+suggest_try_soundalike_finish(void)
 {
     langp_T	*lp;
     int		lpi;
@@ -13469,11 +13303,11 @@
  * produce this soundfolded word.
  */
     static void
-add_sound_suggest(su, goodword, score, lp)
-    suginfo_T	*su;
-    char_u	*goodword;
-    int		score;		/* soundfold score  */
-    langp_T	*lp;
+add_sound_suggest(
+    suginfo_T	*su,
+    char_u	*goodword,
+    int		score,		/* soundfold score  */
+    langp_T	*lp)
 {
     slang_T	*slang = lp->lp_slang;	/* language for sound folding */
     int		sfwordnr;
@@ -13677,9 +13511,7 @@
  * Find word "word" in fold-case tree for "slang" and return the word number.
  */
     static int
-soundfold_find(slang, word)
-    slang_T	*slang;
-    char_u	*word;
+soundfold_find(slang_T *slang, char_u *word)
 {
     idx_T	arridx = 0;
     int		len;
@@ -13753,10 +13585,7 @@
  * Copy "fword" to "cword", fixing case according to "flags".
  */
     static void
-make_case_word(fword, cword, flags)
-    char_u	*fword;
-    char_u	*cword;
-    int		flags;
+make_case_word(char_u *fword, char_u *cword, int flags)
 {
     if (flags & WF_ALLCAP)
 	/* Make it all upper-case */
@@ -13773,9 +13602,7 @@
  * Use map string "map" for languages "lp".
  */
     static void
-set_map_str(lp, map)
-    slang_T	*lp;
-    char_u	*map;
+set_map_str(slang_T *lp, char_u *map)
 {
     char_u	*p;
     int		headc = 0;
@@ -13858,10 +13685,7 @@
  * lines in the .aff file.
  */
     static int
-similar_chars(slang, c1, c2)
-    slang_T	*slang;
-    int		c1;
-    int		c2;
+similar_chars(slang_T *slang, int c1, int c2)
 {
     int		m1, m2;
 #ifdef FEAT_MBYTE
@@ -13906,17 +13730,16 @@
  * For a suggestion that is already in the list the lowest score is remembered.
  */
     static void
-add_suggestion(su, gap, goodword, badlenarg, score, altscore, had_bonus,
-								 slang, maxsf)
-    suginfo_T	*su;
-    garray_T	*gap;		/* either su_ga or su_sga */
-    char_u	*goodword;
-    int		badlenarg;	/* len of bad word replaced with "goodword" */
-    int		score;
-    int		altscore;
-    int		had_bonus;	/* value for st_had_bonus */
-    slang_T	*slang;		/* language for sound folding */
-    int		maxsf;		/* su_maxscore applies to soundfold score,
+add_suggestion(
+    suginfo_T	*su,
+    garray_T	*gap,		/* either su_ga or su_sga */
+    char_u	*goodword,
+    int		badlenarg,	/* len of bad word replaced with "goodword" */
+    int		score,
+    int		altscore,
+    int		had_bonus,	/* value for st_had_bonus */
+    slang_T	*slang,		/* language for sound folding */
+    int		maxsf)		/* su_maxscore applies to soundfold score,
 				   su_sfmaxscore to the total score. */
 {
     int		goodlen;	/* len of goodword changed */
@@ -14043,9 +13866,9 @@
  * for split words, such as "the the".  Remove these from the list here.
  */
     static void
-check_suggestions(su, gap)
-    suginfo_T	*su;
-    garray_T	*gap;		    /* either su_ga or su_sga */
+check_suggestions(
+    suginfo_T	*su,
+    garray_T	*gap)		    /* either su_ga or su_sga */
 {
     suggest_T   *stp;
     int		i;
@@ -14080,9 +13903,9 @@
  * Add a word to be banned.
  */
     static void
-add_banned(su, word)
-    suginfo_T	*su;
-    char_u	*word;
+add_banned(
+    suginfo_T	*su,
+    char_u	*word)
 {
     char_u	*s;
     hash_T	hash;
@@ -14103,8 +13926,7 @@
  * is slow, thus only done for the final results.
  */
     static void
-rescore_suggestions(su)
-    suginfo_T	*su;
+rescore_suggestions(suginfo_T *su)
 {
     int		i;
 
@@ -14117,9 +13939,7 @@
  * Recompute the score for one suggestion if sound-folding is possible.
  */
     static void
-rescore_one(su, stp)
-    suginfo_T	*su;
-    suggest_T	*stp;
+rescore_one(suginfo_T *su, suggest_T *stp)
 {
     slang_T	*slang = stp->st_slang;
     char_u	sal_badword[MAXWLEN];
@@ -14159,9 +13979,7 @@
 #ifdef __BORLANDC__
 _RTLENTRYF
 #endif
-sug_compare(s1, s2)
-    const void	*s1;
-    const void	*s2;
+sug_compare(const void *s1, const void *s2)
 {
     suggest_T	*p1 = (suggest_T *)s1;
     suggest_T	*p2 = (suggest_T *)s2;
@@ -14183,10 +14001,10 @@
  * Returns the maximum score in the list or "maxscore" unmodified.
  */
     static int
-cleanup_suggestions(gap, maxscore, keep)
-    garray_T	*gap;
-    int		maxscore;
-    int		keep;		/* nr of suggestions to keep */
+cleanup_suggestions(
+    garray_T	*gap,
+    int		maxscore,
+    int		keep)		/* nr of suggestions to keep */
 {
     suggest_T   *stp = &SUG(*gap, 0);
     int		i;
@@ -14211,8 +14029,7 @@
  * Result is in allocated memory, NULL for an error.
  */
     char_u *
-eval_soundfold(word)
-    char_u	*word;
+eval_soundfold(char_u *word)
 {
     langp_T	*lp;
     char_u	sound[MAXWLEN];
@@ -14249,11 +14066,11 @@
  * 2. SAL items define a more advanced sound-folding (and much slower).
  */
     static void
-spell_soundfold(slang, inword, folded, res)
-    slang_T	*slang;
-    char_u	*inword;
-    int		folded;	    /* "inword" is already case-folded */
-    char_u	*res;
+spell_soundfold(
+    slang_T	*slang,
+    char_u	*inword,
+    int		folded,	    /* "inword" is already case-folded */
+    char_u	*res)
 {
     char_u	fword[MAXWLEN];
     char_u	*word;
@@ -14286,10 +14103,7 @@
  * SOFOTO lines.
  */
     static void
-spell_soundfold_sofo(slang, inword, res)
-    slang_T	*slang;
-    char_u	*inword;
-    char_u	*res;
+spell_soundfold_sofo(slang_T *slang, char_u *inword, char_u *res)
 {
     char_u	*s;
     int		ri = 0;
@@ -14360,10 +14174,7 @@
 }
 
     static void
-spell_soundfold_sal(slang, inword, res)
-    slang_T	*slang;
-    char_u	*inword;
-    char_u	*res;
+spell_soundfold_sal(slang_T *slang, char_u *inword, char_u *res)
 {
     salitem_T	*smp;
     char_u	word[MAXWLEN];
@@ -14641,10 +14452,7 @@
  * Multi-byte version of spell_soundfold().
  */
     static void
-spell_soundfold_wsal(slang, inword, res)
-    slang_T	*slang;
-    char_u	*inword;
-    char_u	*res;
+spell_soundfold_wsal(slang_T *slang, char_u *inword, char_u *res)
 {
     salitem_T	*smp = (salitem_T *)slang->sl_sal.ga_data;
     int		word[MAXWLEN];
@@ -14960,9 +14768,9 @@
  * avoiding checks that will not be possible.
  */
     static int
-soundalike_score(goodstart, badstart)
-    char_u	*goodstart;	/* sound-folded good word */
-    char_u	*badstart;	/* sound-folded bad word */
+soundalike_score(
+    char_u	*goodstart,	/* sound-folded good word */
+    char_u	*badstart)	/* sound-folded bad word */
 {
     char_u	*goodsound = goodstart;
     char_u	*badsound = badstart;
@@ -15195,10 +15003,10 @@
  * support multi-byte characters.
  */
     static int
-spell_edit_score(slang, badword, goodword)
-    slang_T	*slang;
-    char_u	*badword;
-    char_u	*goodword;
+spell_edit_score(
+    slang_T	*slang,
+    char_u	*badword,
+    char_u	*goodword)
 {
     int		*cnt;
     int		badlen, goodlen;	/* lengths including NUL */
@@ -15327,11 +15135,11 @@
  * for multi-byte characters.
  */
     static int
-spell_edit_score_limit(slang, badword, goodword, limit)
-    slang_T	*slang;
-    char_u	*badword;
-    char_u	*goodword;
-    int		limit;
+spell_edit_score_limit(
+    slang_T	*slang,
+    char_u	*badword,
+    char_u	*goodword,
+    int		limit)
 {
     limitscore_T    stack[10];		/* allow for over 3 * 2 edits */
     int		    stackidx;
@@ -15509,11 +15317,11 @@
  * Keep it in sync with the above!
  */
     static int
-spell_edit_score_limit_w(slang, badword, goodword, limit)
-    slang_T	*slang;
-    char_u	*badword;
-    char_u	*goodword;
-    int		limit;
+spell_edit_score_limit_w(
+    slang_T	*slang,
+    char_u	*badword,
+    char_u	*goodword,
+    int		limit)
 {
     limitscore_T    stack[10];		/* allow for over 3 * 2 edits */
     int		    stackidx;
@@ -15698,8 +15506,7 @@
  * ":spellinfo"
  */
     void
-ex_spellinfo(eap)
-    exarg_T *eap UNUSED;
+ex_spellinfo(exarg_T *eap UNUSED)
 {
     int		lpi;
     langp_T	*lp;
@@ -15735,8 +15542,7 @@
  * ":spelldump"
  */
     void
-ex_spelldump(eap)
-    exarg_T *eap;
+ex_spelldump(exarg_T *eap)
 {
     char_u  *spl;
     long    dummy;
@@ -15772,11 +15578,11 @@
  * 2. When "pat" is not NULL: add matching words to insert mode completion.
  */
     void
-spell_dump_compl(pat, ic, dir, dumpflags_arg)
-    char_u	*pat;	    /* leading part of the word */
-    int		ic;	    /* ignore case */
-    int		*dir;	    /* direction for adding matches */
-    int		dumpflags_arg;	/* DUMPFLAG_* */
+spell_dump_compl(
+    char_u	*pat,	    /* leading part of the word */
+    int		ic,	    /* ignore case */
+    int		*dir,	    /* direction for adding matches */
+    int		dumpflags_arg)	/* DUMPFLAG_* */
 {
     langp_T	*lp;
     slang_T	*slang;
@@ -15973,14 +15779,14 @@
  * When "lnum" is zero add insert mode completion.
  */
     static void
-dump_word(slang, word, pat, dir, dumpflags, wordflags, lnum)
-    slang_T	*slang;
-    char_u	*word;
-    char_u	*pat;
-    int		*dir;
-    int		dumpflags;
-    int		wordflags;
-    linenr_T	lnum;
+dump_word(
+    slang_T	*slang,
+    char_u	*word,
+    char_u	*pat,
+    int		*dir,
+    int		dumpflags,
+    int		wordflags,
+    linenr_T	lnum)
 {
     int		keepcap = FALSE;
     char_u	*p;
@@ -16063,14 +15869,14 @@
  * Return the updated line number.
  */
     static linenr_T
-dump_prefixes(slang, word, pat, dir, dumpflags, flags, startlnum)
-    slang_T	*slang;
-    char_u	*word;	    /* case-folded word */
-    char_u	*pat;
-    int		*dir;
-    int		dumpflags;
-    int		flags;	    /* flags with prefix ID */
-    linenr_T	startlnum;
+dump_prefixes(
+    slang_T	*slang,
+    char_u	*word,	    /* case-folded word */
+    char_u	*pat,
+    int		*dir,
+    int		dumpflags,
+    int		flags,	    /* flags with prefix ID */
+    linenr_T	startlnum)
 {
     idx_T	arridx[MAXWLEN];
     int		curi[MAXWLEN];
@@ -16179,9 +15985,7 @@
  * Uses the spell-checking word characters.
  */
     char_u *
-spell_to_word_end(start, win)
-    char_u  *start;
-    win_T   *win;
+spell_to_word_end(char_u *start, win_T *win)
 {
     char_u  *p = start;
 
@@ -16199,8 +16003,7 @@
  * Returns the column number of the word.
  */
     int
-spell_word_start(startcol)
-    int		startcol;
+spell_word_start(int startcol)
 {
     char_u	*line;
     char_u	*p;
@@ -16238,8 +16041,7 @@
 static int spell_expand_need_cap;
 
     void
-spell_expand_check_cap(col)
-    colnr_T col;
+spell_expand_check_cap(colnr_T col)
 {
     spell_expand_need_cap = check_need_cap(curwin->w_cursor.lnum, col);
 }
@@ -16251,10 +16053,10 @@
  * allocated strings.
  */
     int
-expand_spelling(lnum, pat, matchp)
-    linenr_T	lnum UNUSED;
-    char_u	*pat;
-    char_u	***matchp;
+expand_spelling(
+    linenr_T	lnum UNUSED,
+    char_u	*pat,
+    char_u	***matchp)
 {
     garray_T	ga;
 
diff --git a/src/syntax.c b/src/syntax.c
index 350539d..2dd5465 100644
--- a/src/syntax.c
+++ b/src/syntax.c
@@ -489,9 +489,7 @@
  * window.
  */
     void
-syntax_start(wp, lnum)
-    win_T	*wp;
-    linenr_T	lnum;
+syntax_start(win_T *wp, linenr_T lnum)
 {
     synstate_T	*p;
     synstate_T	*last_valid = NULL;
@@ -668,8 +666,7 @@
  * have to manually release their extmatch pointers first.
  */
     static void
-clear_syn_state(p)
-    synstate_T *p;
+clear_syn_state(synstate_T *p)
 {
     int		i;
     garray_T	*gap;
@@ -692,7 +689,7 @@
  * Cleanup the current_state stack.
  */
     static void
-clear_current_state()
+clear_current_state(void)
 {
     int		i;
     stateitem_T	*sip;
@@ -713,10 +710,10 @@
  * 3. Simply start on a given number of lines above "lnum".
  */
     static void
-syn_sync(wp, start_lnum, last_valid)
-    win_T	*wp;
-    linenr_T	start_lnum;
-    synstate_T	*last_valid;
+syn_sync(
+    win_T	*wp,
+    linenr_T	start_lnum,
+    synstate_T	*last_valid)
 {
     buf_T	*curbuf_save;
     win_T	*curwin_save;
@@ -1009,8 +1006,7 @@
  * Return TRUE if the line-continuation pattern matches in line "lnum".
  */
     static int
-syn_match_linecont(lnum)
-    linenr_T	lnum;
+syn_match_linecont(linenr_T lnum)
 {
     regmmatch_T regmatch;
     int r;
@@ -1035,7 +1031,7 @@
  * Prepare the current state for the start of a line.
  */
     static void
-syn_start_line()
+syn_start_line(void)
 {
     current_finished = FALSE;
     current_col = 0;
@@ -1060,8 +1056,7 @@
  * When "startofline" is FALSE the item with "keepend" is forcefully updated.
  */
     static void
-syn_update_ends(startofline)
-    int		startofline;
+syn_update_ends(int startofline)
 {
     stateitem_T	*cur_si;
     int		i;
@@ -1161,8 +1156,7 @@
  */
 
     static void
-syn_stack_free_block(block)
-    synblock_T	*block;
+syn_stack_free_block(synblock_T *block)
 {
     synstate_T	*p;
 
@@ -1180,8 +1174,7 @@
  * Used when syntax items changed to force resyncing everywhere.
  */
     void
-syn_stack_free_all(block)
-    synblock_T	*block;
+syn_stack_free_all(synblock_T *block)
 {
     win_T	*wp;
 
@@ -1205,7 +1198,7 @@
  * Also used to allocate b_sst_array[] for the first time.
  */
     static void
-syn_stack_alloc()
+syn_stack_alloc(void)
 {
     long	len;
     synstate_T	*to, *from;
@@ -1284,8 +1277,7 @@
  * displayed buffer.
  */
     void
-syn_stack_apply_changes(buf)
-    buf_T	*buf;
+syn_stack_apply_changes(buf_T *buf)
 {
     win_T	*wp;
 
@@ -1299,9 +1291,7 @@
 }
 
     static void
-syn_stack_apply_changes_block(block, buf)
-    synblock_T	*block;
-    buf_T	*buf;
+syn_stack_apply_changes_block(synblock_T *block, buf_T *buf)
 {
     synstate_T	*p, *prev, *np;
     linenr_T	n;
@@ -1353,7 +1343,7 @@
  * Returns TRUE if at least one entry was freed.
  */
     static int
-syn_stack_cleanup()
+syn_stack_cleanup(void)
 {
     synstate_T	*p, *prev;
     disptick_T	tick;
@@ -1417,9 +1407,7 @@
  * Move the entry into the free list.
  */
     static void
-syn_stack_free_entry(block, p)
-    synblock_T	*block;
-    synstate_T	*p;
+syn_stack_free_entry(synblock_T *block, synstate_T *p)
 {
     clear_syn_state(p);
     p->sst_next = block->b_sst_firstfree;
@@ -1432,8 +1420,7 @@
  * Returns NULL when there is no entry or the first entry is after "lnum".
  */
     static synstate_T *
-syn_stack_find_entry(lnum)
-    linenr_T	lnum;
+syn_stack_find_entry(linenr_T lnum)
 {
     synstate_T	*p, *prev;
 
@@ -1453,7 +1440,7 @@
  * The current state must be valid for the start of the current_lnum line!
  */
     static synstate_T *
-store_current_state()
+store_current_state(void)
 {
     int		i;
     synstate_T	*p;
@@ -1576,8 +1563,7 @@
  * Copy a state stack from "from" in b_sst_array[] to current_state;
  */
     static void
-load_current_state(from)
-    synstate_T	*from;
+load_current_state(synstate_T *from)
 {
     int		i;
     bufstate_T	*bp;
@@ -1624,8 +1610,7 @@
  * Return TRUE when they are equal.
  */
     static int
-syn_stack_equal(sp)
-    synstate_T *sp;
+syn_stack_equal(synstate_T *sp)
 {
     int		i, j;
     bufstate_T	*bp;
@@ -1697,8 +1682,7 @@
  * lnum ->  line below window
  */
     void
-syntax_end_parsing(lnum)
-    linenr_T	lnum;
+syntax_end_parsing(linenr_T lnum)
 {
     synstate_T	*sp;
 
@@ -1715,7 +1699,7 @@
  ****************************************/
 
     static void
-invalidate_current_state()
+invalidate_current_state(void)
 {
     clear_current_state();
     current_state.ga_itemsize = 0;	/* mark current_state invalid */
@@ -1724,7 +1708,7 @@
 }
 
     static void
-validate_current_state()
+validate_current_state(void)
 {
     current_state.ga_itemsize = sizeof(stateitem_T);
     current_state.ga_growsize = 3;
@@ -1736,8 +1720,7 @@
  * line, to check if the next line needs to be redrawn too.
  */
     int
-syntax_check_changed(lnum)
-    linenr_T	lnum;
+syntax_check_changed(linenr_T lnum)
 {
     int		retval = TRUE;
     synstate_T	*sp;
@@ -1785,8 +1768,8 @@
  * is valid.
  */
     static int
-syn_finish_line(syncing)
-    int	    syncing;		/* called for syncing */
+syn_finish_line(
+    int	    syncing)		/* called for syncing */
 {
     stateitem_T	*cur_si;
     colnr_T	prev_current_col;
@@ -1835,10 +1818,10 @@
  * done.
  */
     int
-get_syntax_attr(col, can_spell, keep_state)
-    colnr_T	col;
-    int		*can_spell;
-    int		keep_state;	/* keep state of char at "col" */
+get_syntax_attr(
+    colnr_T	col,
+    int		*can_spell,
+    int		keep_state)	/* keep state of char at "col" */
 {
     int	    attr = 0;
 
@@ -1888,11 +1871,11 @@
  * Get syntax attributes for current_lnum, current_col.
  */
     static int
-syn_current_attr(syncing, displaying, can_spell, keep_state)
-    int		syncing;		/* When 1: called for syncing */
-    int		displaying;		/* result will be displayed */
-    int		*can_spell;		/* return: do spell checking */
-    int		keep_state;		/* keep syntax stack afterwards */
+syn_current_attr(
+    int		syncing,		/* When 1: called for syncing */
+    int		displaying,		/* result will be displayed */
+    int		*can_spell,		/* return: do spell checking */
+    int		keep_state)		/* keep syntax stack afterwards */
 {
     int		syn_id;
     lpos_T	endpos;		/* was: char_u *endp; */
@@ -2481,9 +2464,7 @@
  * Check if we already matched pattern "idx" at the current column.
  */
     static int
-did_match_already(idx, gap)
-    int		idx;
-    garray_T	*gap;
+did_match_already(int idx, garray_T *gap)
 {
     int		i;
 
@@ -2506,8 +2487,7 @@
  * Push the next match onto the stack.
  */
     static stateitem_T *
-push_next_match(cur_si)
-    stateitem_T	*cur_si;
+push_next_match(stateitem_T *cur_si)
 {
     synpat_T	*spp;
 #ifdef FEAT_CONCEAL
@@ -2600,7 +2580,7 @@
  * Check for end of current state (and the states before it).
  */
     static void
-check_state_ends()
+check_state_ends(void)
 {
     stateitem_T	*cur_si;
     int		had_extend;
@@ -2705,8 +2685,7 @@
  * fills in si_attr, si_next_list and si_cont_list.
  */
     static void
-update_si_attr(idx)
-    int	    idx;
+update_si_attr(int idx)
 {
     stateitem_T	*sip = &CUR_STATE(idx);
     synpat_T	*spp;
@@ -2761,7 +2740,7 @@
  * Propagate the match-end to contained items, until a "skipend" item is found.
  */
     static void
-check_keepend()
+check_keepend(void)
 {
     int		i;
     lpos_T	maxpos;
@@ -2821,10 +2800,10 @@
  * Return the flags for the matched END.
  */
     static void
-update_si_end(sip, startcol, force)
-    stateitem_T	*sip;
-    int		startcol;   /* where to start searching for the end */
-    int		force;	    /* when TRUE overrule a previous end */
+update_si_end(
+    stateitem_T	*sip,
+    int		startcol,   /* where to start searching for the end */
+    int		force)	    /* when TRUE overrule a previous end */
 {
     lpos_T	startpos;
     lpos_T	endpos;
@@ -2887,8 +2866,7 @@
  * Return FAIL if it's not possible (out of memory).
  */
     static int
-push_current_state(idx)
-    int	    idx;
+push_current_state(int idx)
 {
     if (ga_grow(&current_state, 1) == FAIL)
 	return FAIL;
@@ -2902,7 +2880,7 @@
  * Remove a state from the current_state stack.
  */
     static void
-pop_current_state()
+pop_current_state(void)
 {
     if (current_state.ga_len)
     {
@@ -2927,16 +2905,15 @@
  * computed.
  */
     static void
-find_endpos(idx, startpos, m_endpos, hl_endpos, flagsp, end_endpos,
-							   end_idx, start_ext)
-    int		idx;		/* index of the pattern */
-    lpos_T	*startpos;	/* where to start looking for an END match */
-    lpos_T	*m_endpos;	/* return: end of match */
-    lpos_T	*hl_endpos;	/* return: end of highlighting */
-    long	*flagsp;	/* return: flags of matching END */
-    lpos_T	*end_endpos;	/* return: end of end pattern match */
-    int		*end_idx;	/* return: group ID for end pat. match, or 0 */
-    reg_extmatch_T *start_ext;	/* submatches from the start pattern */
+find_endpos(
+    int		idx,		/* index of the pattern */
+    lpos_T	*startpos,	/* where to start looking for an END match */
+    lpos_T	*m_endpos,	/* return: end of match */
+    lpos_T	*hl_endpos,	/* return: end of highlighting */
+    long	*flagsp,	/* return: flags of matching END */
+    lpos_T	*end_endpos,	/* return: end of end pattern match */
+    int		*end_idx,	/* return: group ID for end pat. match, or 0 */
+    reg_extmatch_T *start_ext)	/* submatches from the start pattern */
 {
     colnr_T	matchcol;
     synpat_T	*spp, *spp_skip;
@@ -3165,9 +3142,7 @@
  * Limit "pos" not to be after "limit".
  */
     static void
-limit_pos(pos, limit)
-    lpos_T	*pos;
-    lpos_T	*limit;
+limit_pos(lpos_T *pos, lpos_T *limit)
 {
     if (pos->lnum > limit->lnum)
 	*pos = *limit;
@@ -3179,9 +3154,9 @@
  * Limit "pos" not to be after "limit", unless pos->lnum is zero.
  */
     static void
-limit_pos_zero(pos, limit)
-    lpos_T	*pos;
-    lpos_T	*limit;
+limit_pos_zero(
+    lpos_T	*pos,
+    lpos_T	*limit)
 {
     if (pos->lnum == 0)
 	*pos = *limit;
@@ -3193,12 +3168,12 @@
  * Add offset to matched text for end of match or highlight.
  */
     static void
-syn_add_end_off(result, regmatch, spp, idx, extra)
-    lpos_T	*result;	/* returned position */
-    regmmatch_T	*regmatch;	/* start/end of match */
-    synpat_T	*spp;		/* matched pattern */
-    int		idx;		/* index of offset */
-    int		extra;		/* extra chars for offset to start */
+syn_add_end_off(
+    lpos_T	*result,	/* returned position */
+    regmmatch_T	*regmatch,	/* start/end of match */
+    synpat_T	*spp,		/* matched pattern */
+    int		idx,		/* index of offset */
+    int		extra)		/* extra chars for offset to start */
 {
     int		col;
     int		off;
@@ -3245,12 +3220,12 @@
  * Avoid resulting column to become negative.
  */
     static void
-syn_add_start_off(result, regmatch, spp, idx, extra)
-    lpos_T	*result;	/* returned position */
-    regmmatch_T	*regmatch;	/* start/end of match */
-    synpat_T	*spp;
-    int		idx;
-    int		extra;	    /* extra chars for offset to end */
+syn_add_start_off(
+    lpos_T	*result,	/* returned position */
+    regmmatch_T	*regmatch,	/* start/end of match */
+    synpat_T	*spp,
+    int		idx,
+    int		extra)	    /* extra chars for offset to end */
 {
     int		col;
     int		off;
@@ -3298,7 +3273,7 @@
  * Get current line in syntax buffer.
  */
     static char_u *
-syn_getcurline()
+syn_getcurline(void)
 {
     return ml_get_buf(syn_buf, current_lnum, FALSE);
 }
@@ -3308,11 +3283,11 @@
  * Returns TRUE when there is a match.
  */
     static int
-syn_regexec(rmp, lnum, col, st)
-    regmmatch_T	*rmp;
-    linenr_T	lnum;
-    colnr_T	col;
-    syn_time_T  *st UNUSED;
+syn_regexec(
+    regmmatch_T	*rmp,
+    linenr_T	lnum,
+    colnr_T	col,
+    syn_time_T  *st UNUSED)
 {
     int r;
 #ifdef FEAT_PROFILE
@@ -3353,14 +3328,14 @@
  * Return it's ID if found, 0 otherwise.
  */
     static int
-check_keyword_id(line, startcol, endcolp, flagsp, next_listp, cur_si, ccharp)
-    char_u	*line;
-    int		startcol;	/* position in line to check for keyword */
-    int		*endcolp;	/* return: character after found keyword */
-    long	*flagsp;	/* return: flags of matching keyword */
-    short	**next_listp;	/* return: next_list of matching keyword */
-    stateitem_T	*cur_si;	/* item at the top of the stack */
-    int		*ccharp UNUSED;	/* conceal substitution char */
+check_keyword_id(
+    char_u	*line,
+    int		startcol,	/* position in line to check for keyword */
+    int		*endcolp,	/* return: character after found keyword */
+    long	*flagsp,	/* return: flags of matching keyword */
+    short	**next_listp,	/* return: next_list of matching keyword */
+    stateitem_T	*cur_si,	/* item at the top of the stack */
+    int		*ccharp UNUSED)	/* conceal substitution char */
 {
     keyentry_T	*kp;
     char_u	*kwp;
@@ -3442,9 +3417,7 @@
  * Handle ":syntax conceal" command.
  */
     static void
-syn_cmd_conceal(eap, syncing)
-    exarg_T	*eap UNUSED;
-    int		syncing UNUSED;
+syn_cmd_conceal(exarg_T *eap UNUSED, int syncing UNUSED)
 {
 #ifdef FEAT_CONCEAL
     char_u	*arg = eap->arg;
@@ -3468,9 +3441,7 @@
  * Handle ":syntax case" command.
  */
     static void
-syn_cmd_case(eap, syncing)
-    exarg_T	*eap;
-    int		syncing UNUSED;
+syn_cmd_case(exarg_T *eap, int syncing UNUSED)
 {
     char_u	*arg = eap->arg;
     char_u	*next;
@@ -3492,9 +3463,7 @@
  * Handle ":syntax spell" command.
  */
     static void
-syn_cmd_spell(eap, syncing)
-    exarg_T	*eap;
-    int		syncing UNUSED;
+syn_cmd_spell(exarg_T *eap, int syncing UNUSED)
 {
     char_u	*arg = eap->arg;
     char_u	*next;
@@ -3524,9 +3493,7 @@
  * Handle ":syntax iskeyword" command.
  */
     static void
-syn_cmd_iskeyword(eap, syncing)
-    exarg_T	*eap;
-    int		syncing UNUSED;
+syn_cmd_iskeyword(exarg_T *eap, int syncing UNUSED)
 {
     char_u	*arg = eap->arg;
     char_u	save_chartab[32];
@@ -3575,8 +3542,7 @@
  * Clear all syntax info for one buffer.
  */
     void
-syntax_clear(block)
-    synblock_T	*block;
+syntax_clear(synblock_T *block)
 {
     int i;
 
@@ -3627,8 +3593,7 @@
  * Get rid of ownsyntax for window "wp".
  */
     void
-reset_synblock(wp)
-    win_T *wp;
+reset_synblock(win_T *wp)
 {
     if (wp->w_s != &wp->w_buffer->b_s)
     {
@@ -3642,7 +3607,7 @@
  * Clear syncing info for one buffer.
  */
     static void
-syntax_sync_clear()
+syntax_sync_clear(void)
 {
     int i;
 
@@ -3669,9 +3634,9 @@
  * Remove one pattern from the buffer's pattern list.
  */
     static void
-syn_remove_pattern(block, idx)
-    synblock_T	*block;
-    int		idx;
+syn_remove_pattern(
+    synblock_T	*block,
+    int		idx)
 {
     synpat_T	*spp;
 
@@ -3691,9 +3656,7 @@
  * last to first!
  */
     static void
-syn_clear_pattern(block, i)
-    synblock_T	*block;
-    int		i;
+syn_clear_pattern(synblock_T *block, int i)
 {
     vim_free(SYN_ITEMS(block)[i].sp_pattern);
     vim_regfree(SYN_ITEMS(block)[i].sp_prog);
@@ -3710,9 +3673,7 @@
  * Clear and free one syntax cluster.
  */
     static void
-syn_clear_cluster(block, i)
-    synblock_T	*block;
-    int		i;
+syn_clear_cluster(synblock_T *block, int i)
 {
     vim_free(SYN_CLSTR(block)[i].scl_name);
     vim_free(SYN_CLSTR(block)[i].scl_name_u);
@@ -3723,9 +3684,7 @@
  * Handle ":syntax clear" command.
  */
     static void
-syn_cmd_clear(eap, syncing)
-    exarg_T	*eap;
-    int		syncing;
+syn_cmd_clear(exarg_T *eap, int syncing)
 {
     char_u	*arg = eap->arg;
     char_u	*arg_end;
@@ -3810,9 +3769,7 @@
  * Clear one syntax group for the current buffer.
  */
     static void
-syn_clear_one(id, syncing)
-    int		id;
-    int		syncing;
+syn_clear_one(int id, int syncing)
 {
     synpat_T	*spp;
     int		idx;
@@ -3838,9 +3795,7 @@
  * Handle ":syntax on" command.
  */
     static void
-syn_cmd_on(eap, syncing)
-    exarg_T	*eap;
-    int		syncing UNUSED;
+syn_cmd_on(exarg_T *eap, int syncing UNUSED)
 {
     syn_cmd_onoff(eap, "syntax");
 }
@@ -3849,9 +3804,7 @@
  * Handle ":syntax enable" command.
  */
     static void
-syn_cmd_enable(eap, syncing)
-    exarg_T	*eap;
-    int		syncing UNUSED;
+syn_cmd_enable(exarg_T *eap, int syncing UNUSED)
 {
     set_internal_string_var((char_u *)"syntax_cmd", (char_u *)"enable");
     syn_cmd_onoff(eap, "syntax");
@@ -3862,9 +3815,7 @@
  * Handle ":syntax reset" command.
  */
     static void
-syn_cmd_reset(eap, syncing)
-    exarg_T	*eap;
-    int		syncing UNUSED;
+syn_cmd_reset(exarg_T *eap, int syncing UNUSED)
 {
     eap->nextcmd = check_nextcmd(eap->arg);
     if (!eap->skip)
@@ -3880,9 +3831,7 @@
  * Handle ":syntax manual" command.
  */
     static void
-syn_cmd_manual(eap, syncing)
-    exarg_T	*eap;
-    int		syncing UNUSED;
+syn_cmd_manual(exarg_T *eap, int syncing UNUSED)
 {
     syn_cmd_onoff(eap, "manual");
 }
@@ -3891,17 +3840,13 @@
  * Handle ":syntax off" command.
  */
     static void
-syn_cmd_off(eap, syncing)
-    exarg_T	*eap;
-    int		syncing UNUSED;
+syn_cmd_off(exarg_T *eap, int syncing UNUSED)
 {
     syn_cmd_onoff(eap, "nosyntax");
 }
 
     static void
-syn_cmd_onoff(eap, name)
-    exarg_T	*eap;
-    char	*name;
+syn_cmd_onoff(exarg_T *eap, char *name)
 {
     char_u	buf[100];
 
@@ -3918,9 +3863,9 @@
  * Handle ":syntax [list]" command: list current syntax words.
  */
     static void
-syn_cmd_list(eap, syncing)
-    exarg_T	*eap;
-    int		syncing;	    /* when TRUE: list syncing items */
+syn_cmd_list(
+    exarg_T	*eap,
+    int		syncing)	    /* when TRUE: list syncing items */
 {
     char_u	*arg = eap->arg;
     int		id;
@@ -4011,7 +3956,7 @@
 }
 
     static void
-syn_lines_msg()
+syn_lines_msg(void)
 {
     if (curwin->w_s->b_syn_sync_maxlines > 0
 				      || curwin->w_s->b_syn_sync_minlines > 0)
@@ -4034,7 +3979,7 @@
 }
 
     static void
-syn_match_msg()
+syn_match_msg(void)
 {
     if (curwin->w_s->b_syn_sync_linebreaks > 0)
     {
@@ -4058,10 +4003,10 @@
  * List one syntax item, for ":syntax" or "syntax list syntax_name".
  */
     static void
-syn_list_one(id, syncing, link_only)
-    int		id;
-    int		syncing;	    /* when TRUE: list syncing items */
-    int		link_only;	    /* when TRUE; list link-only too */
+syn_list_one(
+    int		id,
+    int		syncing,	    /* when TRUE: list syncing items */
+    int		link_only)	    /* when TRUE; list link-only too */
 {
     int		attr;
     int		idx;
@@ -4169,10 +4114,7 @@
 }
 
     static void
-syn_list_flags(nlist, flags, attr)
-    struct name_list	*nlist;
-    int			flags;
-    int			attr;
+syn_list_flags(struct name_list *nlist, int flags, int attr)
 {
     int		i;
 
@@ -4188,8 +4130,7 @@
  * List one syntax cluster, for ":syntax" or "syntax list syntax_name".
  */
     static void
-syn_list_cluster(id)
-    int id;
+syn_list_cluster(int id)
 {
     int	    endcol = 15;
 
@@ -4216,10 +4157,7 @@
 }
 
     static void
-put_id_list(name, list, attr)
-    char_u	*name;
-    short	*list;
-    int		attr;
+put_id_list(char_u *name, short *list, int attr)
 {
     short		*p;
 
@@ -4258,11 +4196,11 @@
 }
 
     static void
-put_pattern(s, c, spp, attr)
-    char	*s;
-    int		c;
-    synpat_T	*spp;
-    int		attr;
+put_pattern(
+    char	*s,
+    int		c,
+    synpat_T	*spp,
+    int		attr)
 {
     long	n;
     int		mask;
@@ -4331,11 +4269,11 @@
  * Return TRUE if the header has been printed.
  */
     static int
-syn_list_keywords(id, ht, did_header, attr)
-    int		id;
-    hashtab_T	*ht;
-    int		did_header;		/* header has already been printed */
-    int		attr;
+syn_list_keywords(
+    int		id,
+    hashtab_T	*ht,
+    int		did_header,		/* header has already been printed */
+    int		attr)
 {
     int		outlen;
     hashitem_T	*hi;
@@ -4429,9 +4367,7 @@
 }
 
     static void
-syn_clear_keyword(id, ht)
-    int		id;
-    hashtab_T	*ht;
+syn_clear_keyword(int id, hashtab_T *ht)
 {
     hashitem_T	*hi;
     keyentry_T	*kp;
@@ -4481,8 +4417,7 @@
  * Clear a whole keyword table.
  */
     static void
-clear_keywtab(ht)
-    hashtab_T	*ht;
+clear_keywtab(hashtab_T *ht)
 {
     hashitem_T	*hi;
     int		todo;
@@ -4512,13 +4447,13 @@
  * Add a keyword to the list of keywords.
  */
     static void
-add_keyword(name, id, flags, cont_in_list, next_list, conceal_char)
-    char_u	*name;	    /* name of keyword */
-    int		id;	    /* group ID for this keyword */
-    int		flags;	    /* flags for this keyword */
-    short	*cont_in_list; /* containedin for this keyword */
-    short	*next_list; /* nextgroup for this keyword */
-    int		conceal_char;
+add_keyword(
+    char_u	*name,	    /* name of keyword */
+    int		id,	    /* group ID for this keyword */
+    int		flags,	    /* flags for this keyword */
+    short	*cont_in_list, /* containedin for this keyword */
+    short	*next_list, /* nextgroup for this keyword */
+    int		conceal_char)
 {
     keyentry_T	*kp;
     hashtab_T	*ht;
@@ -4572,9 +4507,9 @@
  * Return NULL if the end of the command was found instead of further args.
  */
     static char_u *
-get_group_name(arg, name_end)
-    char_u	*arg;		/* start of the argument */
-    char_u	**name_end;	/* pointer to end of the name */
+get_group_name(
+    char_u	*arg,		/* start of the argument */
+    char_u	**name_end)	/* pointer to end of the name */
 {
     char_u	*rest;
 
@@ -4599,10 +4534,10 @@
  * Return NULL for any error;
  */
     static char_u *
-get_syn_options(arg, opt, conceal_char)
-    char_u	    *arg;		/* next argument to be checked */
-    syn_opt_arg_T   *opt;		/* various things */
-    int		    *conceal_char UNUSED;
+get_syn_options(
+    char_u	    *arg,		/* next argument to be checked */
+    syn_opt_arg_T   *opt,		/* various things */
+    int		    *conceal_char UNUSED)
 {
     char_u	*gname_start, *gname;
     int		syn_id;
@@ -4788,9 +4723,7 @@
  * to the specified top-level group, if any.
  */
     static void
-syn_incl_toplevel(id, flagsp)
-    int		id;
-    int		*flagsp;
+syn_incl_toplevel(int id, int *flagsp)
 {
     if ((*flagsp & HL_CONTAINED) || curwin->w_s->b_syn_topgrp == 0)
 	return;
@@ -4815,9 +4748,7 @@
  * Handle ":syntax include [@{group-name}] filename" command.
  */
     static void
-syn_cmd_include(eap, syncing)
-    exarg_T	*eap;
-    int		syncing UNUSED;
+syn_cmd_include(exarg_T *eap, int syncing UNUSED)
 {
     char_u	*arg = eap->arg;
     int		sgl_id = 1;
@@ -4892,9 +4823,7 @@
  * Handle ":syntax keyword {group-name} [{option}] keyword .." command.
  */
     static void
-syn_cmd_keyword(eap, syncing)
-    exarg_T	*eap;
-    int		syncing UNUSED;
+syn_cmd_keyword(exarg_T *eap, int syncing UNUSED)
 {
     char_u	*arg = eap->arg;
     char_u	*group_name_end;
@@ -5021,9 +4950,9 @@
  * Also ":syntax sync match {name} [[grouphere | groupthere] {group-name}] .."
  */
     static void
-syn_cmd_match(eap, syncing)
-    exarg_T	*eap;
-    int		syncing;	    /* TRUE for ":syntax sync match .. " */
+syn_cmd_match(
+    exarg_T	*eap,
+    int		syncing)	    /* TRUE for ":syntax sync match .. " */
 {
     char_u	*arg = eap->arg;
     char_u	*group_name_end;
@@ -5125,9 +5054,9 @@
  *		start {start} .. [skip {skip}] end {end} .. [{options}]".
  */
     static void
-syn_cmd_region(eap, syncing)
-    exarg_T	*eap;
-    int		syncing;	    /* TRUE for ":syntax sync region .." */
+syn_cmd_region(
+    exarg_T	*eap,
+    int		syncing)	    /* TRUE for ":syntax sync region .." */
 {
     char_u		*arg = eap->arg;
     char_u		*group_name_end;
@@ -5394,9 +5323,7 @@
 #ifdef __BORLANDC__
 _RTLENTRYF
 #endif
-syn_compare_stub(v1, v2)
-    const void	*v1;
-    const void	*v2;
+syn_compare_stub(const void *v1, const void *v2)
 {
     const short	*s1 = v1;
     const short	*s2 = v2;
@@ -5409,10 +5336,7 @@
  * *clstr1 and *clstr2 must both be allocated memory; they will be consumed.
  */
     static void
-syn_combine_list(clstr1, clstr2, list_op)
-    short	**clstr1;
-    short	**clstr2;
-    int		list_op;
+syn_combine_list(short **clstr1, short **clstr2, int list_op)
 {
     int		count1 = 0;
     int		count2 = 0;
@@ -5536,8 +5460,7 @@
  * If it is not found, 0 is returned.
  */
     static int
-syn_scl_name2id(name)
-    char_u	*name;
+syn_scl_name2id(char_u *name)
 {
     int		i;
     char_u	*name_u;
@@ -5558,9 +5481,7 @@
  * Like syn_scl_name2id(), but take a pointer + length argument.
  */
     static int
-syn_scl_namen2id(linep, len)
-    char_u  *linep;
-    int	    len;
+syn_scl_namen2id(char_u *linep, int len)
 {
     char_u  *name;
     int	    id = 0;
@@ -5581,9 +5502,7 @@
  * Return 0 for failure.
  */
     static int
-syn_check_cluster(pp, len)
-    char_u	*pp;
-    int		len;
+syn_check_cluster(char_u *pp, int len)
 {
     int		id;
     char_u	*name;
@@ -5606,8 +5525,7 @@
  * Return 0 for failure.
  */
     static int
-syn_add_cluster(name)
-    char_u	*name;
+syn_add_cluster(char_u *name)
 {
     int		len;
 
@@ -5656,9 +5574,7 @@
  *		[add={groupname},..] [remove={groupname},..]".
  */
     static void
-syn_cmd_cluster(eap, syncing)
-    exarg_T	*eap;
-    int		syncing UNUSED;
+syn_cmd_cluster(exarg_T *eap, int syncing UNUSED)
 {
     char_u	*arg = eap->arg;
     char_u	*group_name_end;
@@ -5733,7 +5649,7 @@
  * On first call for current buffer: Init growing array.
  */
     static void
-init_syn_patterns()
+init_syn_patterns(void)
 {
     curwin->w_s->b_syn_patterns.ga_itemsize = sizeof(synpat_T);
     curwin->w_s->b_syn_patterns.ga_growsize = 10;
@@ -5745,9 +5661,7 @@
  * Returns a pointer to the next argument, or NULL in case of an error.
  */
     static char_u *
-get_syn_pattern(arg, ci)
-    char_u	*arg;
-    synpat_T	*ci;
+get_syn_pattern(char_u *arg, synpat_T *ci)
 {
     char_u	*end;
     int		*p;
@@ -5849,9 +5763,7 @@
  * Handle ":syntax sync .." command.
  */
     static void
-syn_cmd_sync(eap, syncing)
-    exarg_T	*eap;
-    int		syncing UNUSED;
+syn_cmd_sync(exarg_T *eap, int syncing UNUSED)
 {
     char_u	*arg_start = eap->arg;
     char_u	*arg_end;
@@ -6010,10 +5922,10 @@
  * returns FAIL for some error, OK for success.
  */
     static int
-get_id_list(arg, keylen, list)
-    char_u	**arg;
-    int		keylen;		/* length of keyword */
-    short	**list;		/* where to store the resulting list, if not
+get_id_list(
+    char_u	**arg,
+    int		keylen,		/* length of keyword */
+    short	**list)		/* where to store the resulting list, if not
 				   NULL, the list is silently skipped! */
 {
     char_u	*p = NULL;
@@ -6207,8 +6119,7 @@
  * Make a copy of an ID list.
  */
     static short *
-copy_id_list(list)
-    short   *list;
+copy_id_list(short *list)
 {
     int	    len;
     int	    count;
@@ -6235,11 +6146,11 @@
  * This function is called very often, keep it fast!!
  */
     static int
-in_id_list(cur_si, list, ssp, contained)
-    stateitem_T	*cur_si;	/* current item or NULL */
-    short	*list;		/* id list */
-    struct sp_syn *ssp;		/* group id and ":syn include" tag of group */
-    int		contained;	/* group id is contained */
+in_id_list(
+    stateitem_T	*cur_si,	/* current item or NULL */
+    short	*list,		/* id list */
+    struct sp_syn *ssp,		/* group id and ":syn include" tag of group */
+    int		contained)	/* group id is contained */
 {
     int		retval;
     short	*scl_list;
@@ -6367,8 +6278,7 @@
  * syntax_subcommand() function to do the rest.
  */
     void
-ex_syntax(eap)
-    exarg_T	*eap;
+ex_syntax(exarg_T *eap)
 {
     char_u	*arg = eap->arg;
     char_u	*subcmd_end;
@@ -6406,8 +6316,7 @@
 }
 
     void
-ex_ownsyntax(eap)
-    exarg_T	*eap;
+ex_ownsyntax(exarg_T *eap)
 {
     char_u	*old_value;
     char_u	*new_value;
@@ -6453,8 +6362,7 @@
 }
 
     int
-syntax_present(win)
-    win_T	*win;
+syntax_present(win_T *win)
 {
     return (win->w_s->b_syn_patterns.ga_len != 0
 	    || win->w_s->b_syn_clusters.ga_len != 0
@@ -6475,7 +6383,7 @@
  * Called when we are done expanding.
  */
     void
-reset_expand_highlight()
+reset_expand_highlight(void)
 {
     include_link = include_default = include_none = 0;
 }
@@ -6485,9 +6393,7 @@
  * as highlight group.
  */
     void
-set_context_in_echohl_cmd(xp, arg)
-    expand_T	*xp;
-    char_u	*arg;
+set_context_in_echohl_cmd(expand_T *xp, char_u *arg)
 {
     xp->xp_context = EXPAND_HIGHLIGHT;
     xp->xp_pattern = arg;
@@ -6498,9 +6404,7 @@
  * Handle command line completion for :syntax command.
  */
     void
-set_context_in_syntax_cmd(xp, arg)
-    expand_T	*xp;
-    char_u	*arg;
+set_context_in_syntax_cmd(expand_T *xp, char_u *arg)
 {
     char_u	*p;
 
@@ -6540,9 +6444,7 @@
  * expansion.
  */
     char_u *
-get_syntax_name(xp, idx)
-    expand_T	*xp UNUSED;
-    int		idx;
+get_syntax_name(expand_T *xp UNUSED, int idx)
 {
     if (expand_what == EXP_SUBCMD)
 	return (char_u *)subcommands[idx].name;
@@ -6555,13 +6457,13 @@
  * Function called for expression evaluation: get syntax ID at file position.
  */
     int
-syn_get_id(wp, lnum, col, trans, spellp, keep_state)
-    win_T	*wp;
-    long	lnum;
-    colnr_T	col;
-    int		trans;	     /* remove transparency */
-    int		*spellp;     /* return: can do spell checking */
-    int		keep_state;  /* keep state of char at "col" */
+syn_get_id(
+    win_T	*wp,
+    long	lnum,
+    colnr_T	col,
+    int		trans,	     /* remove transparency */
+    int		*spellp,     /* return: can do spell checking */
+    int		keep_state)  /* keep state of char at "col" */
 {
     /* When the position is not after the current position and in the same
      * line of the same buffer, need to restart parsing. */
@@ -6589,8 +6491,7 @@
  * Returns the current flags.
  */
     int
-get_syntax_info(seqnrp)
-    int		*seqnrp;
+get_syntax_info(int *seqnrp)
 {
     *seqnrp = current_seqnr;
     return current_flags;
@@ -6600,7 +6501,7 @@
  * Return conceal substitution character
  */
     int
-syn_get_sub_char()
+syn_get_sub_char(void)
 {
     return current_sub_char;
 }
@@ -6613,8 +6514,7 @@
  * Returns -1 when "i" is out of range.
  */
     int
-syn_get_stack_item(i)
-    int i;
+syn_get_stack_item(int i)
 {
     if (i >= current_state.ga_len)
     {
@@ -6633,9 +6533,7 @@
  * Function called to get folding level for line "lnum" in window "wp".
  */
     int
-syn_get_foldlevel(wp, lnum)
-    win_T	*wp;
-    long	lnum;
+syn_get_foldlevel(win_T *wp, long lnum)
 {
     int		level = 0;
     int		i;
@@ -6664,8 +6562,7 @@
  * ":syntime".
  */
     void
-ex_syntime(eap)
-    exarg_T	*eap;
+ex_syntime(exarg_T *eap)
 {
     if (STRCMP(eap->arg, "on") == 0)
 	syn_time_on = TRUE;
@@ -6680,8 +6577,7 @@
 }
 
     static void
-syn_clear_time(st)
-    syn_time_T *st;
+syn_clear_time(syn_time_T *st)
 {
     profile_zero(&st->total);
     profile_zero(&st->slowest);
@@ -6693,7 +6589,7 @@
  * Clear the syntax timing for the current buffer.
  */
     static void
-syntime_clear()
+syntime_clear(void)
 {
     int		idx;
     synpat_T	*spp;
@@ -6716,9 +6612,7 @@
  * ":syntime {on,off,clear,report}" command.
  */
     char_u *
-get_syntime_arg(xp, idx)
-    expand_T	*xp UNUSED;
-    int		idx;
+get_syntime_arg(expand_T *xp UNUSED, int idx)
 {
     switch (idx)
     {
@@ -6746,9 +6640,7 @@
 #ifdef __BORLANDC__
 _RTLENTRYF
 #endif
-syn_compare_syntime(v1, v2)
-    const void	*v1;
-    const void	*v2;
+syn_compare_syntime(const void *v1, const void *v2)
 {
     const time_entry_T	*s1 = v1;
     const time_entry_T	*s2 = v2;
@@ -6760,7 +6652,7 @@
  * Clear the syntax timing for the current buffer.
  */
     static void
-syntime_report()
+syntime_report(void)
 {
     int		idx;
     synpat_T	*spp;
@@ -7095,9 +6987,9 @@
     };
 
     void
-init_highlight(both, reset)
-    int		both;	    /* include groups where 'bg' doesn't matter */
-    int		reset;	    /* clear group first */
+init_highlight(
+    int		both,	    /* include groups where 'bg' doesn't matter */
+    int		reset)	    /* clear group first */
 {
     int		i;
     char	**pp;
@@ -7193,8 +7085,7 @@
  * Return OK for success, FAIL for failure.
  */
     int
-load_colors(name)
-    char_u	*name;
+load_colors(char_u *name)
 {
     char_u	*buf;
     int		retval = FAIL;
@@ -7228,10 +7119,10 @@
  * "forceit" and "init" both TRUE.
  */
     void
-do_highlight(line, forceit, init)
-    char_u	*line;
-    int		forceit;
-    int		init;	    /* TRUE when called for initializing */
+do_highlight(
+    char_u	*line,
+    int		forceit,
+    int		init)	    /* TRUE when called for initializing */
 {
     char_u	*name_end;
     char_u	*p;
@@ -8143,7 +8034,7 @@
 
 #if defined(EXITFREE) || defined(PROTO)
     void
-free_highlight()
+free_highlight(void)
 {
     int	    i;
 
@@ -8162,7 +8053,7 @@
  * possible.  Otherwise reset them to zero.
  */
     void
-restore_cterm_colors()
+restore_cterm_colors(void)
 {
 #if defined(MSDOS) || (defined(WIN3264) && !defined(FEAT_GUI_W32))
     /* Since t_me has been set, this probably means that the user
@@ -8181,9 +8072,7 @@
  * When "check_link" is TRUE also check for an existing link.
  */
     static int
-hl_has_settings(idx, check_link)
-    int		idx;
-    int		check_link;
+hl_has_settings(int idx, int check_link)
 {
     return (   HL_TABLE()[idx].sg_term_attr != 0
 	    || HL_TABLE()[idx].sg_cterm_attr != 0
@@ -8203,8 +8092,7 @@
  * Clear highlighting for one group.
  */
     static void
-highlight_clear(idx)
-    int idx;
+highlight_clear(int idx)
 {
     HL_TABLE()[idx].sg_term = 0;
     vim_free(HL_TABLE()[idx].sg_start);
@@ -8255,7 +8143,7 @@
  * "Tooltip" colors.
  */
     void
-set_normal_colors()
+set_normal_colors(void)
 {
     if (set_group_colors((char_u *)"Normal",
 			     &gui.norm_pixel, &gui.back_pixel,
@@ -8299,13 +8187,13 @@
  * Set the colors for "Normal", "Menu", "Tooltip" or "Scrollbar".
  */
     static int
-set_group_colors(name, fgp, bgp, do_menu, use_norm, do_tooltip)
-    char_u	*name;
-    guicolor_T	*fgp;
-    guicolor_T	*bgp;
-    int		do_menu;
-    int		use_norm;
-    int		do_tooltip;
+set_group_colors(
+    char_u	*name,
+    guicolor_T	*fgp,
+    guicolor_T	*bgp,
+    int		do_menu,
+    int		use_norm,
+    int		do_tooltip)
 {
     int		idx;
 
@@ -8332,7 +8220,7 @@
  * Returns "" when it's not found or not set.
  */
     char_u *
-hl_get_font_name()
+hl_get_font_name(void)
 {
     int		id;
     char_u	*s;
@@ -8352,8 +8240,7 @@
  * actually chosen to be used.
  */
     void
-hl_set_font_name(font_name)
-    char_u	*font_name;
+hl_set_font_name(char_u *font_name)
 {
     int	    id;
 
@@ -8370,8 +8257,8 @@
  * when the color is known.
  */
     void
-hl_set_bg_color_name(name)
-    char_u  *name;	    /* must have been allocated */
+hl_set_bg_color_name(
+    char_u  *name)	    /* must have been allocated */
 {
     int	    id;
 
@@ -8391,8 +8278,8 @@
  * when the color is known.
  */
     void
-hl_set_fg_color_name(name)
-    char_u  *name;	    /* must have been allocated */
+hl_set_fg_color_name(
+    char_u  *name)	    /* must have been allocated */
 {
     int	    id;
 
@@ -8412,8 +8299,7 @@
  * Returns INVALCOLOR when failed.
  */
     static guicolor_T
-color_name2handle(name)
-    char_u  *name;
+color_name2handle(char_u *name)
 {
     if (STRCMP(name, "NONE") == 0)
 	return INVALCOLOR;
@@ -8431,8 +8317,7 @@
  * Returns NOFONT when failed.
  */
     static GuiFont
-font_name2handle(name)
-    char_u  *name;
+font_name2handle(char_u *name)
 {
     if (STRCMP(name, "NONE") == 0)
 	return NOFONT;
@@ -8446,9 +8331,7 @@
  * Returns NOFONTSET when failed.
  */
     static GuiFontset
-fontset_name2handle(name, fixed_width)
-    char_u	*name;
-    int		fixed_width;
+fontset_name2handle(char_u *name, int fixed_width)
 {
     if (STRCMP(name, "NONE") == 0)
 	return NOFONTSET;
@@ -8461,13 +8344,13 @@
  * Get the font or fontset for one highlight group.
  */
     static void
-hl_do_font(idx, arg, do_normal, do_menu, do_tooltip, free_font)
-    int		idx;
-    char_u	*arg;
-    int		do_normal;		/* set normal font */
-    int		do_menu UNUSED;		/* set menu font */
-    int		do_tooltip UNUSED;	/* set tooltip font */
-    int		free_font;		/* free current font/fontset */
+hl_do_font(
+    int		idx,
+    char_u	*arg,
+    int		do_normal,		/* set normal font */
+    int		do_menu UNUSED,		/* set menu font */
+    int		do_tooltip UNUSED,	/* set tooltip font */
+    int		free_font)		/* free current font/fontset */
 {
 # ifdef FEAT_XFONTSET
     /* If 'guifontset' is not empty, first try using the name as a
@@ -8578,9 +8461,7 @@
  * Return 0 for error (no more room).
  */
     static int
-get_attr_entry(table, aep)
-    garray_T	*table;
-    attrentry_T	*aep;
+get_attr_entry(garray_T *table, attrentry_T *aep)
 {
     int		i;
     attrentry_T	*taep;
@@ -8704,7 +8585,7 @@
  * Clear all highlight tables.
  */
     void
-clear_hl_tables()
+clear_hl_tables(void)
 {
     int		i;
     attrentry_T	*taep;
@@ -8733,9 +8614,7 @@
  * Return the resulting attributes.
  */
     int
-hl_combine_attr(char_attr, prim_attr)
-    int	    char_attr;
-    int	    prim_attr;
+hl_combine_attr(int char_attr, int prim_attr)
 {
     attrentry_T *char_aep = NULL;
     attrentry_T *spell_aep;
@@ -8851,8 +8730,7 @@
 #ifdef FEAT_GUI
 
     attrentry_T *
-syn_gui_attr2entry(attr)
-    int		    attr;
+syn_gui_attr2entry(int attr)
 {
     attr -= ATTR_OFF;
     if (attr >= gui_attr_table.ga_len)	    /* did ":syntax clear" */
@@ -8866,8 +8744,7 @@
  * Only to be used when "attr" > HL_ALL.
  */
     int
-syn_attr2attr(attr)
-    int	    attr;
+syn_attr2attr(int attr)
 {
     attrentry_T	*aep;
 
@@ -8888,8 +8765,7 @@
 
 
     attrentry_T *
-syn_term_attr2entry(attr)
-    int		    attr;
+syn_term_attr2entry(int attr)
 {
     attr -= ATTR_OFF;
     if (attr >= term_attr_table.ga_len)	    /* did ":syntax clear" */
@@ -8898,8 +8774,7 @@
 }
 
     attrentry_T *
-syn_cterm_attr2entry(attr)
-    int		    attr;
+syn_cterm_attr2entry(int attr)
 {
     attr -= ATTR_OFF;
     if (attr >= cterm_attr_table.ga_len)	/* did ":syntax clear" */
@@ -8912,8 +8787,7 @@
 #define LIST_INT    3
 
     static void
-highlight_list_one(id)
-    int		id;
+highlight_list_one(int id)
 {
     struct hl_group	*sgp;
     int			didh = FALSE;
@@ -8967,13 +8841,13 @@
 }
 
     static int
-highlight_list_arg(id, didh, type, iarg, sarg, name)
-    int		id;
-    int		didh;
-    int		type;
-    int		iarg;
-    char_u	*sarg;
-    char	*name;
+highlight_list_arg(
+    int		id,
+    int		didh,
+    int		type,
+    int		iarg,
+    char_u	*sarg,
+    char	*name)
 {
     char_u	buf[100];
     char_u	*ts;
@@ -9025,10 +8899,10 @@
  * Return NULL otherwise.
  */
     char_u *
-highlight_has_attr(id, flag, modec)
-    int		id;
-    int		flag;
-    int		modec;	/* 'g' for GUI, 'c' for cterm, 't' for term */
+highlight_has_attr(
+    int		id,
+    int		flag,
+    int		modec)	/* 'g' for GUI, 'c' for cterm, 't' for term */
 {
     int		attr;
 
@@ -9056,10 +8930,10 @@
  * Return color name of highlight group "id".
  */
     char_u *
-highlight_color(id, what, modec)
-    int		id;
-    char_u	*what;	/* "font", "fg", "bg", "sp", "fg#", "bg#" or "sp#" */
-    int		modec;	/* 'g' for GUI, 'c' for cterm, 't' for term */
+highlight_color(
+    int		id,
+    char_u	*what,	/* "font", "fg", "bg", "sp", "fg#", "bg#" or "sp#" */
+    int		modec)	/* 'g' for GUI, 'c' for cterm, 't' for term */
 {
     static char_u	name[20];
     int			n;
@@ -9137,9 +9011,9 @@
  * Return color name of highlight group "id" as RGB value.
  */
     long_u
-highlight_gui_color_rgb(id, fg)
-    int		id;
-    int		fg;	/* TRUE = fg, FALSE = bg */
+highlight_gui_color_rgb(
+    int		id,
+    int		fg)	/* TRUE = fg, FALSE = bg */
 {
     guicolor_T	color;
 
@@ -9163,10 +9037,10 @@
  * Return TRUE when started a new line.
  */
     static int
-syn_list_header(did_header, outlen, id)
-    int	    did_header;		/* did header already */
-    int	    outlen;		/* length of string that comes */
-    int	    id;			/* highlight group id */
+syn_list_header(
+    int	    did_header,		/* did header already */
+    int	    outlen,		/* length of string that comes */
+    int	    id)			/* highlight group id */
 {
     int	    endcol = 19;
     int	    newline = TRUE;
@@ -9213,8 +9087,8 @@
  * Called after one of the attributes has changed.
  */
     static void
-set_hl_attr(idx)
-    int		idx;	    /* index in array */
+set_hl_attr(
+    int		idx)	    /* index in array */
 {
     attrentry_T		at_en;
     struct hl_group	*sgp = HL_TABLE() + idx;
@@ -9286,8 +9160,7 @@
  * If it is not found, 0 is returned.
  */
     int
-syn_name2id(name)
-    char_u	*name;
+syn_name2id(char_u *name)
 {
     int		i;
     char_u	name_u[200];
@@ -9309,8 +9182,7 @@
  * Return TRUE if highlight group "name" exists.
  */
     int
-highlight_exists(name)
-    char_u	*name;
+highlight_exists(char_u *name)
 {
     return (syn_name2id(name) > 0);
 }
@@ -9321,8 +9193,7 @@
  * When not a valid ID return an empty string.
  */
     char_u *
-syn_id2name(id)
-    int		id;
+syn_id2name(int id)
 {
     if (id <= 0 || id > highlight_ga.ga_len)
 	return (char_u *)"";
@@ -9335,9 +9206,7 @@
  * Like syn_name2id(), but take a pointer + length argument.
  */
     int
-syn_namen2id(linep, len)
-    char_u  *linep;
-    int	    len;
+syn_namen2id(char_u *linep, int len)
 {
     char_u  *name;
     int	    id = 0;
@@ -9358,9 +9227,7 @@
  * Return 0 for failure.
  */
     int
-syn_check_group(pp, len)
-    char_u		*pp;
-    int			len;
+syn_check_group(char_u *pp, int len)
 {
     int	    id;
     char_u  *name;
@@ -9383,8 +9250,7 @@
  * Return 0 for failure.
  */
     static int
-syn_add_group(name)
-    char_u	*name;
+syn_add_group(char_u *name)
 {
     char_u	*p;
 
@@ -9450,7 +9316,7 @@
  * function deletes the new name.
  */
     static void
-syn_unadd_group()
+syn_unadd_group(void)
 {
     --highlight_ga.ga_len;
     vim_free(HL_TABLE()[highlight_ga.ga_len].sg_name);
@@ -9461,8 +9327,7 @@
  * Translate a group ID to highlight attributes.
  */
     int
-syn_id2attr(hl_id)
-    int			hl_id;
+syn_id2attr(int hl_id)
 {
     int			attr;
     struct hl_group	*sgp;
@@ -9492,10 +9357,7 @@
  * NOTE: the colors will be INVALCOLOR when not set, the color otherwise.
  */
     int
-syn_id2colors(hl_id, fgp, bgp)
-    int		hl_id;
-    guicolor_T	*fgp;
-    guicolor_T	*bgp;
+syn_id2colors(int hl_id, guicolor_T *fgp, guicolor_T *bgp)
 {
     struct hl_group	*sgp;
 
@@ -9512,8 +9374,7 @@
  * Translate a group ID to the final group ID (following links).
  */
     int
-syn_get_final_id(hl_id)
-    int			hl_id;
+syn_get_final_id(int hl_id)
 {
     int			count;
     struct hl_group	*sgp;
@@ -9542,7 +9403,7 @@
  * It finds the font and color handles for the highlighting groups.
  */
     void
-highlight_gui_started()
+highlight_gui_started(void)
 {
     int	    idx;
 
@@ -9556,10 +9417,10 @@
 }
 
     static void
-gui_do_one_color(idx, do_menu, do_tooltip)
-    int		idx;
-    int		do_menu;	/* TRUE: might set the menu font */
-    int		do_tooltip;	/* TRUE: might set the tooltip font */
+gui_do_one_color(
+    int		idx,
+    int		do_menu,	/* TRUE: might set the menu font */
+    int		do_tooltip)	/* TRUE: might set the tooltip font */
 {
     int		didit = FALSE;
 
@@ -9602,7 +9463,7 @@
  * Return FAIL when an invalid flag is found in 'highlight'.  OK otherwise.
  */
     int
-highlight_changed()
+highlight_changed(void)
 {
     int		hlf;
     int		i;
@@ -9813,9 +9674,7 @@
  * Handle command line completion for :highlight command.
  */
     void
-set_context_in_highlight_cmd(xp, arg)
-    expand_T	*xp;
-    char_u	*arg;
+set_context_in_highlight_cmd(expand_T *xp, char_u *arg)
 {
     char_u	*p;
 
@@ -9865,7 +9724,7 @@
  * List highlighting matches in a nice way.
  */
     static void
-highlight_list()
+highlight_list(void)
 {
     int		i;
 
@@ -9876,9 +9735,7 @@
 }
 
     static void
-highlight_list_two(cnt, attr)
-    int	    cnt;
-    int	    attr;
+highlight_list_two(int cnt, int attr)
 {
     msg_puts_attr((char_u *)&("N \bI \b!  \b"[cnt / 11]), attr);
     msg_clr_eos();
@@ -9895,9 +9752,7 @@
  * Also used for synIDattr() function.
  */
     char_u *
-get_highlight_name(xp, idx)
-    expand_T	*xp UNUSED;
-    int		idx;
+get_highlight_name(expand_T *xp UNUSED, int idx)
 {
 #ifdef FEAT_CMDL_COMPL
     if (idx == highlight_ga.ga_len && include_none != 0)
@@ -9923,7 +9778,7 @@
  * Used when quitting for systems which need it.
  */
     void
-free_highlight_fonts()
+free_highlight_fonts(void)
 {
     int	    idx;
 
diff --git a/src/tag.c b/src/tag.c
index c587242..d2fdee6 100644
--- a/src/tag.c
+++ b/src/tag.c
@@ -121,12 +121,12 @@
  * for cscope, returns TRUE if we jumped to tag or aborted, FALSE otherwise
  */
     int
-do_tag(tag, type, count, forceit, verbose)
-    char_u	*tag;		/* tag (pattern) to jump to */
-    int		type;
-    int		count;
-    int		forceit;	/* :ta with ! */
-    int		verbose;	/* print "tag not found" message */
+do_tag(
+    char_u	*tag,		/* tag (pattern) to jump to */
+    int		type,
+    int		count,
+    int		forceit,	/* :ta with ! */
+    int		verbose)	/* print "tag not found" message */
 {
     taggy_T	*tagstack = curwin->w_tagstack;
     int		tagstackidx = curwin->w_tagstackidx;
@@ -1092,15 +1092,14 @@
  * Free cached tags.
  */
     void
-tag_freematch()
+tag_freematch(void)
 {
     vim_free(tagmatchname);
     tagmatchname = NULL;
 }
 
     static void
-taglen_advance(l)
-    int		l;
+taglen_advance(int l)
 {
     if (l == MAXCOL)
     {
@@ -1115,8 +1114,7 @@
  * Print the tag stack
  */
     void
-do_tags(eap)
-    exarg_T	*eap UNUSED;
+do_tags(exarg_T *eap UNUSED)
 {
     int		i;
     char_u	*name;
@@ -1169,10 +1167,7 @@
  * Make sure case is folded to uppercase in comparison (like for 'sort -f')
  */
     static int
-tag_strnicmp(s1, s2, len)
-    char_u	*s1;
-    char_u	*s2;
-    size_t	len;
+tag_strnicmp(char_u *s1, char_u *s2, size_t len)
 {
     int		i;
 
@@ -1209,9 +1204,7 @@
  * Extract info from the tag search pattern "pats->pat".
  */
     static void
-prepare_pats(pats, has_re)
-    pat_T	*pats;
-    int		has_re;
+prepare_pats(pat_T *pats, int has_re)
 {
     pats->head = pats->pat;
     pats->headlen = pats->len;
@@ -1267,14 +1260,14 @@
  * TAG_KEEP_LANG  keep language
  */
     int
-find_tags(pat, num_matches, matchesp, flags, mincount, buf_ffname)
-    char_u	*pat;			/* pattern to search for */
-    int		*num_matches;		/* return: number of matches found */
-    char_u	***matchesp;		/* return: array of matches found */
-    int		flags;
-    int		mincount;		/*  MAXCOL: find all matches
+find_tags(
+    char_u	*pat,			/* pattern to search for */
+    int		*num_matches,		/* return: number of matches found */
+    char_u	***matchesp,		/* return: array of matches found */
+    int		flags,
+    int		mincount,		/*  MAXCOL: find all matches
 					     other: minimal number of matches */
-    char_u	*buf_ffname;		/* name of buffer for priority */
+    char_u	*buf_ffname)		/* name of buffer for priority */
 {
     FILE       *fp;
     char_u     *lbuf;			/* line buffer */
@@ -2577,9 +2570,7 @@
  * 'runtimepath' doc directories.
  */
     static void
-found_tagfile_cb(fname, cookie)
-    char_u	*fname;
-    void	*cookie UNUSED;
+found_tagfile_cb(char_u *fname, void *cookie UNUSED)
 {
     if (ga_grow(&tag_fnames, 1) == OK)
 	((char_u **)(tag_fnames.ga_data))[tag_fnames.ga_len++] =
@@ -2588,7 +2579,7 @@
 
 #if defined(EXITFREE) || defined(PROTO)
     void
-free_tag_stuff()
+free_tag_stuff(void)
 {
     ga_clear_strings(&tag_fnames);
     do_tag(NULL, DT_FREE, 0, 0, 0);
@@ -2611,10 +2602,10 @@
  * Return FAIL if no more tag file names, OK otherwise.
  */
     int
-get_tagfname(tnp, first, buf)
-    tagname_T	*tnp;	/* holds status info */
-    int		first;	/* TRUE when first file name is wanted */
-    char_u	*buf;	/* pointer to buffer of MAXPATHL chars */
+get_tagfname(
+    tagname_T	*tnp,	/* holds status info */
+    int		first,	/* TRUE when first file name is wanted */
+    char_u	*buf)	/* pointer to buffer of MAXPATHL chars */
 {
     char_u		*fname = NULL;
     char_u		*r_ptr;
@@ -2741,8 +2732,7 @@
  * Free the contents of a tagname_T that was filled by get_tagfname().
  */
     void
-tagname_free(tnp)
-    tagname_T	*tnp;
+tagname_free(tagname_T *tnp)
 {
     vim_free(tnp->tn_tags);
     vim_findfile_cleanup(tnp->tn_search_ctx);
@@ -2759,16 +2749,12 @@
  * Return FAIL if there is a format error in this line, OK otherwise.
  */
     static int
-parse_tag_line(lbuf,
+parse_tag_line(
+    char_u	*lbuf,		/* line to be parsed */
 #ifdef FEAT_EMACS_TAGS
-		    is_etag,
+    int		is_etag,
 #endif
-			      tagp)
-    char_u	*lbuf;		/* line to be parsed */
-#ifdef FEAT_EMACS_TAGS
-    int		is_etag;
-#endif
-    tagptrs_T	*tagp;
+    tagptrs_T	*tagp)
 {
     char_u	*p;
 
@@ -2895,8 +2881,7 @@
  * Return FALSE if it is not a static tag.
  */
     static int
-test_for_static(tagp)
-    tagptrs_T	*tagp;
+test_for_static(tagptrs_T *tagp)
 {
     char_u	*p;
 
@@ -2942,9 +2927,9 @@
  * Return OK or FAIL.
  */
     static int
-parse_match(lbuf, tagp)
-    char_u	*lbuf;	    /* input: matching line */
-    tagptrs_T	*tagp;	    /* output: pointers into the line */
+parse_match(
+    char_u	*lbuf,	    /* input: matching line */
+    tagptrs_T	*tagp)	    /* output: pointers into the line */
 {
     int		retval;
     char_u	*p;
@@ -3022,8 +3007,7 @@
  * Returns an allocated string or NULL (out of memory).
  */
     static char_u *
-tag_full_fname(tagp)
-    tagptrs_T	*tagp;
+tag_full_fname(tagptrs_T *tagp)
 {
     char_u	*fullname;
     int		c;
@@ -3053,10 +3037,10 @@
  * returns OK for success, NOTAGFILE when file not found, FAIL otherwise.
  */
     static int
-jumpto_tag(lbuf, forceit, keep_help)
-    char_u	*lbuf;		/* line from the tags file for this tag */
-    int		forceit;	/* :ta with ! */
-    int		keep_help;	/* keep help flag (FALSE for cscope) */
+jumpto_tag(
+    char_u	*lbuf,		/* line from the tags file for this tag */
+    int		forceit,	/* :ta with ! */
+    int		keep_help)	/* keep help flag (FALSE for cscope) */
 {
     int		save_secure;
     int		save_magic;
@@ -3417,10 +3401,7 @@
  * Returns a pointer to allocated memory (or NULL when out of memory).
  */
     static char_u *
-expand_tag_fname(fname, tag_fname, expand)
-    char_u	*fname;
-    char_u	*tag_fname;
-    int		expand;
+expand_tag_fname(char_u *fname, char_u *tag_fname, int expand)
 {
     char_u	*p;
     char_u	*retval;
@@ -3471,8 +3452,7 @@
  * length as that supplied, or shorter.
  */
     void
-simplify_filename(filename)
-    char_u	*filename;
+simplify_filename(char_u *filename)
 {
 #ifndef AMIGA	    /* Amiga doesn't have "..", it uses "/" */
     int		components = 0;
@@ -3684,16 +3664,14 @@
  * file.
  */
     static int
+test_for_current(
 #ifdef FEAT_EMACS_TAGS
-test_for_current(is_etag, fname, fname_end, tag_fname, buf_ffname)
-    int	    is_etag;
-#else
-test_for_current(fname, fname_end, tag_fname, buf_ffname)
+    int	    is_etag,
 #endif
-    char_u  *fname;
-    char_u  *fname_end;
-    char_u  *tag_fname;
-    char_u  *buf_ffname;
+    char_u  *fname,
+    char_u  *fname_end,
+    char_u  *tag_fname,
+    char_u  *buf_ffname)
 {
     int	    c;
     int	    retval = FALSE;
@@ -3730,8 +3708,7 @@
  * Return OK if ";\"" is following, FAIL otherwise.
  */
     static int
-find_extra(pp)
-    char_u	**pp;
+find_extra(char_u **pp)
 {
     char_u	*str = *pp;
 
@@ -3766,11 +3743,11 @@
 
 #if defined(FEAT_CMDL_COMPL) || defined(PROTO)
     int
-expand_tags(tagnames, pat, num_file, file)
-    int		tagnames;	/* expand tag names */
-    char_u	*pat;
-    int		*num_file;
-    char_u	***file;
+expand_tags(
+    int		tagnames,	/* expand tag names */
+    char_u	*pat,
+    int		*num_file,
+    char_u	***file)
 {
     int		i;
     int		c;
@@ -3822,11 +3799,11 @@
  * Return OK or FAIL.
  */
     static int
-add_tag_field(dict, field_name, start, end)
-    dict_T  *dict;
-    char    *field_name;
-    char_u  *start;		/* start of the value */
-    char_u  *end;		/* after the value; can be NULL */
+add_tag_field(
+    dict_T  *dict,
+    char    *field_name,
+    char_u  *start,		/* start of the value */
+    char_u  *end)		/* after the value; can be NULL */
 {
     char_u	*buf;
     int		len = 0;
@@ -3870,9 +3847,7 @@
  * as a dictionary
  */
     int
-get_tags(list, pat)
-    list_T *list;
-    char_u *pat;
+get_tags(list_T *list, char_u *pat)
 {
     int		num_matches, i, ret;
     char_u	**matches, *p;
diff --git a/src/term.c b/src/term.c
index 353c9a6..6a6ab78 100644
--- a/src/term.c
+++ b/src/term.c
@@ -1412,8 +1412,7 @@
 #endif
 
     static struct builtin_term *
-find_builtin_term(term)
-    char_u	*term;
+find_builtin_term(char_u *term)
 {
     struct builtin_term *p;
 
@@ -1448,8 +1447,7 @@
  * The terminal's name is not set, as this is already done in termcapinit().
  */
     static void
-parse_builtin_tcap(term)
-    char_u  *term;
+parse_builtin_tcap(char_u *term)
 {
     struct builtin_term	    *p;
     char_u		    name[2];
@@ -1510,8 +1508,7 @@
  * Store it as a string in T_CCO (using nr_colors[]).
  */
     static void
-set_color_count(nr)
-    int		nr;
+set_color_count(int nr)
 {
     char_u	nr_colors[20];		/* string for number of colors */
 
@@ -1548,8 +1545,7 @@
  * While doing this, until ttest(), some options may be NULL, be careful.
  */
     int
-set_termname(term)
-    char_u *term;
+set_termname(char_u *term)
 {
     struct builtin_term *termp;
 #ifdef HAVE_TGETENT
@@ -2031,9 +2027,9 @@
 
 # if (!defined(UNIX) || defined(FEAT_MOUSE_TTY)) || defined(PROTO)
     void
-set_mouse_termcode(n, s)
-    int		n;	/* KS_MOUSE, KS_NETTERM_MOUSE or KS_DEC_MOUSE */
-    char_u	*s;
+set_mouse_termcode(
+    int		n,	/* KS_MOUSE, KS_NETTERM_MOUSE or KS_DEC_MOUSE */
+    char_u	*s)
 {
     char_u	name[2];
 
@@ -2079,8 +2075,8 @@
 # if ((defined(UNIX) || defined(VMS)) \
 	&& defined(FEAT_MOUSE_TTY)) || defined(PROTO)
     void
-del_mouse_termcode(n)
-    int		n;	/* KS_MOUSE, KS_NETTERM_MOUSE or KS_DEC_MOUSE */
+del_mouse_termcode(
+    int		n)	/* KS_MOUSE, KS_NETTERM_MOUSE or KS_DEC_MOUSE */
 {
     char_u	name[2];
 
@@ -2130,9 +2126,7 @@
  * Return error message if it fails, NULL if it's OK.
  */
     static char_u *
-tgetent_error(tbuf, term)
-    char_u  *tbuf;
-    char_u  *term;
+tgetent_error(char_u *tbuf, char_u *term)
 {
     int	    i;
 
@@ -2167,9 +2161,7 @@
  * Fix that here.
  */
     static char_u *
-vim_tgetstr(s, pp)
-    char	*s;
-    char_u	**pp;
+vim_tgetstr(char *s, char_u **pp)
 {
     char	*p;
 
@@ -2188,9 +2180,9 @@
  * Errors while getting the entries are ignored.
  */
     void
-getlinecol(cp, rp)
-    long	*cp;	/* pointer to columns */
-    long	*rp;	/* pointer to rows */
+getlinecol(
+    long	*cp,	/* pointer to columns */
+    long	*rp)	/* pointer to rows */
 {
     char_u	tbuf[TBUFSZ];
 
@@ -2212,9 +2204,7 @@
  * Return FAIL if the entry was not found, OK if the entry was added.
  */
     int
-add_termcap_entry(name, force)
-    char_u  *name;
-    int	    force;
+add_termcap_entry(char_u *name, int force)
 {
     char_u  *term;
     int	    key;
@@ -2321,8 +2311,7 @@
 }
 
     static int
-term_is_builtin(name)
-    char_u  *name;
+term_is_builtin(char_u *name)
 {
     return (STRNCMP(name, "builtin_", (size_t)8) == 0);
 }
@@ -2333,8 +2322,7 @@
  * "8bit", like in "xterm-8bit".
  */
     int
-term_is_8bit(name)
-    char_u  *name;
+term_is_8bit(char_u *name)
 {
     return (detected_8bit || strstr((char *)name, "8bit") != NULL);
 }
@@ -2346,8 +2334,7 @@
  * <Esc>O -> <M-C-O>
  */
     static int
-term_7to8bit(p)
-    char_u  *p;
+term_7to8bit(char_u *p)
 {
     if (*p == ESC)
     {
@@ -2363,8 +2350,7 @@
 
 #ifdef FEAT_GUI
     int
-term_is_gui(name)
-    char_u  *name;
+term_is_gui(char_u *name)
 {
     return (STRCMP(name, "builtin_gui") == 0 || STRCMP(name, "gui") == 0);
 }
@@ -2373,8 +2359,7 @@
 #if !defined(HAVE_TGETENT) || defined(AMIGA) || defined(PROTO)
 
     char_u *
-tltoa(i)
-    unsigned long i;
+tltoa(unsigned long i)
 {
     static char_u buf[16];
     char_u	*p;
@@ -2401,9 +2386,7 @@
 static char *tgoto(char *, int, int);
 
     static char *
-tgoto(cm, x, y)
-    char *cm;
-    int x, y;
+tgoto(char *cm, int x, int y)
 {
     static char buf[30];
     char *p, *s, *e;
@@ -2453,8 +2436,7 @@
  * If that fails, use the default terminal name.
  */
     void
-termcapinit(name)
-    char_u *name;
+termcapinit(char_u *name)
 {
     char_u	*term;
 
@@ -2511,7 +2493,7 @@
  * out_flush(): flush the output buffer
  */
     void
-out_flush()
+out_flush(void)
 {
     int	    len;
 
@@ -2530,7 +2512,7 @@
  * To avoid flushing half of the character, call this function first.
  */
     void
-out_flush_check()
+out_flush_check(void)
 {
     if (enc_dbcs != 0 && out_pos >= OUT_SIZE - MB_MAXBYTES)
 	out_flush();
@@ -2542,7 +2524,7 @@
  * out_trash(): Throw away the contents of the output buffer
  */
     void
-out_trash()
+out_trash(void)
 {
     out_pos = 0;
 }
@@ -2555,8 +2537,7 @@
  * like msg_puts() and screen_putchar() for that).
  */
     void
-out_char(c)
-    unsigned	c;
+out_char(unsigned c)
 {
 #if defined(UNIX) || defined(VMS) || defined(AMIGA) || defined(MACOS_X_UNIX)
     if (c == '\n')	/* turn LF into CR-LF (CRMOD doesn't seem to do this) */
@@ -2576,8 +2557,7 @@
  * out_char_nf(c): like out_char(), but don't flush when p_wd is set
  */
     static void
-out_char_nf(c)
-    unsigned	c;
+out_char_nf(unsigned c)
 {
 #if defined(UNIX) || defined(VMS) || defined(AMIGA) || defined(MACOS_X_UNIX)
     if (c == '\n')	/* turn LF into CR-LF (CRMOD doesn't seem to do this) */
@@ -2602,8 +2582,7 @@
  * normal text (use functions like msg_puts() and screen_putchar() for that).
  */
     void
-out_str_nf(s)
-    char_u *s;
+out_str_nf(char_u *s)
 {
     if (out_pos > OUT_SIZE - 20)  /* avoid terminal strings being split up */
 	out_flush();
@@ -2623,8 +2602,7 @@
  * normal text (use functions like msg_puts() and screen_putchar() for that).
  */
     void
-out_str(s)
-    char_u	 *s;
+out_str(char_u *s)
 {
     if (s != NULL && *s)
     {
@@ -2656,39 +2634,32 @@
  * cursor positioning using termcap parser. (jw)
  */
     void
-term_windgoto(row, col)
-    int	    row;
-    int	    col;
+term_windgoto(int row, int col)
 {
     OUT_STR(tgoto((char *)T_CM, col, row));
 }
 
     void
-term_cursor_right(i)
-    int	    i;
+term_cursor_right(int i)
 {
     OUT_STR(tgoto((char *)T_CRI, 0, i));
 }
 
     void
-term_append_lines(line_count)
-    int	    line_count;
+term_append_lines(int line_count)
 {
     OUT_STR(tgoto((char *)T_CAL, 0, line_count));
 }
 
     void
-term_delete_lines(line_count)
-    int	    line_count;
+term_delete_lines(int line_count)
 {
     OUT_STR(tgoto((char *)T_CDL, 0, line_count));
 }
 
 #if defined(HAVE_TGETENT) || defined(PROTO)
     void
-term_set_winpos(x, y)
-    int	    x;
-    int	    y;
+term_set_winpos(int x, int y)
 {
     /* Can't handle a negative value here */
     if (x < 0)
@@ -2699,17 +2670,14 @@
 }
 
     void
-term_set_winsize(width, height)
-    int	    width;
-    int	    height;
+term_set_winsize(int width, int height)
 {
     OUT_STR(tgoto((char *)T_CWS, height, width));
 }
 #endif
 
     void
-term_fg_color(n)
-    int	    n;
+term_fg_color(int n)
 {
     /* Use "AF" termcap entry if present, "Sf" entry otherwise */
     if (*T_CAF)
@@ -2719,8 +2687,7 @@
 }
 
     void
-term_bg_color(n)
-    int	    n;
+term_bg_color(int n)
 {
     /* Use "AB" termcap entry if present, "Sb" entry otherwise */
     if (*T_CAB)
@@ -2730,9 +2697,7 @@
 }
 
     static void
-term_color(s, n)
-    char_u	*s;
-    int		n;
+term_color(char_u *s, int n)
 {
     char	buf[20];
     int i = 2;	/* index in s[] just after <Esc>[ or CSI */
@@ -2768,8 +2733,7 @@
  * Generic function to set window title, using t_ts and t_fs.
  */
     void
-term_settitle(title)
-    char_u	*title;
+term_settitle(char_u *title)
 {
     /* t_ts takes one argument: column in status line */
     OUT_STR(tgoto((char *)T_TS, 0, 0));	/* set title start */
@@ -2784,8 +2748,7 @@
  * Replace all entries that are NULL by empty_option
  */
     void
-ttest(pairs)
-    int	pairs;
+ttest(int pairs)
 {
     check_options();		    /* make sure no options are NULL */
 
@@ -2884,9 +2847,7 @@
  * byte first, and store them in dst.
  */
     void
-add_long_to_buf(val, dst)
-    long_u  val;
-    char_u  *dst;
+add_long_to_buf(long_u val, char_u *dst)
 {
     int	    i;
     int	    shift;
@@ -2909,9 +2870,7 @@
  * were present.
  */
     static int
-get_long_from_buf(buf, val)
-    char_u  *buf;
-    long_u  *val;
+get_long_from_buf(char_u *buf, long_u *val)
 {
     int	    len;
     char_u  bytes[sizeof(long_u)];
@@ -2942,10 +2901,7 @@
  * available.
  */
     static int
-get_bytes_from_buf(buf, bytes, num_bytes)
-    char_u  *buf;
-    char_u  *bytes;
-    int	    num_bytes;
+get_bytes_from_buf(char_u *buf, char_u *bytes, int num_bytes)
 {
     int	    len = 0;
     int	    i;
@@ -2982,7 +2938,7 @@
  * too big.
  */
     void
-check_shellsize()
+check_shellsize(void)
 {
     if (Rows < min_rows())	/* need room for one window and command line */
 	Rows = min_rows();
@@ -2993,7 +2949,7 @@
  * Limit Rows and Columns to avoid an overflow in Rows * Columns.
  */
     void
-limit_screen_size()
+limit_screen_size(void)
 {
     if (Columns < MIN_COLUMNS)
 	Columns = MIN_COLUMNS;
@@ -3007,7 +2963,7 @@
  * Invoked just before the screen structures are going to be (re)allocated.
  */
     void
-win_new_shellsize()
+win_new_shellsize(void)
 {
     static int	old_Rows = 0;
     static int	old_Columns = 0;
@@ -3036,7 +2992,7 @@
  * Will obtain the current size and redraw (also when size didn't change).
  */
     void
-shell_resized()
+shell_resized(void)
 {
     set_shellsize(0, 0, FALSE);
 }
@@ -3046,7 +3002,7 @@
  * When the size didn't change, nothing happens.
  */
     void
-shell_resized_check()
+shell_resized_check(void)
 {
     int		old_Rows = Rows;
     int		old_Columns = Columns;
@@ -3074,9 +3030,7 @@
  * it fails use 'width' and 'height'.
  */
     void
-set_shellsize(width, height, mustset)
-    int	    width, height;
-    int	    mustset;
+set_shellsize(int width, int height, int mustset)
 {
     static int		busy = FALSE;
 
@@ -3192,8 +3146,7 @@
  * commands and Ex mode).
  */
     void
-settmode(tmode)
-    int	 tmode;
+settmode(int tmode)
 {
 #ifdef FEAT_GUI
     /* don't set the term where gvim was started to any mode */
@@ -3248,7 +3201,7 @@
 }
 
     void
-starttermcap()
+starttermcap(void)
 {
     if (full_screen && !termcap_active)
     {
@@ -3273,7 +3226,7 @@
 }
 
     void
-stoptermcap()
+stoptermcap(void)
 {
     screen_stop_highlight();
     reset_cterm_colors();
@@ -3329,7 +3282,7 @@
  * The result is caught in check_termcode().
  */
     void
-may_req_termresponse()
+may_req_termresponse(void)
 {
     if (crv_status == CRV_GET
 	    && cur_tmode == TMODE_RAW
@@ -3363,7 +3316,7 @@
  * it must be called immediately after entering termcap mode.
  */
     void
-may_req_ambiguous_char_width()
+may_req_ambiguous_char_width(void)
 {
     if (u7_status == U7_GET
 	    && cur_tmode == TMODE_RAW
@@ -3404,7 +3357,7 @@
  * color when it is the right moment.
  */
     void
-may_req_bg_color()
+may_req_bg_color(void)
 {
     if (rbg_status == RBG_GET
 	    && cur_tmode == TMODE_RAW
@@ -3456,7 +3409,7 @@
  * Return TRUE when saving and restoring the screen.
  */
     int
-swapping_screen()
+swapping_screen(void)
 {
     return (full_screen && *T_TI != NUL);
 }
@@ -3466,7 +3419,7 @@
  * setmouse() - switch mouse on/off depending on current mode and 'mouse'
  */
     void
-setmouse()
+setmouse(void)
 {
 # ifdef FEAT_MOUSE_TTY
     int	    checkfor;
@@ -3521,8 +3474,7 @@
  *   normal editing mode (not at hit-return message).
  */
     int
-mouse_has(c)
-    int	    c;
+mouse_has(int c)
 {
     char_u	*p;
 
@@ -3544,7 +3496,7 @@
  * Return TRUE when 'mousemodel' is set to "popup" or "popup_setpos".
  */
     int
-mouse_model_popup()
+mouse_model_popup(void)
 {
     return (p_mousem[0] == 'p');
 }
@@ -3556,7 +3508,7 @@
  * Used when starting Vim or returning from a shell.
  */
     void
-scroll_start()
+scroll_start(void)
 {
     if (*T_VS != NUL)
     {
@@ -3572,7 +3524,7 @@
  * Enable the cursor.
  */
     void
-cursor_on()
+cursor_on(void)
 {
     if (cursor_is_off)
     {
@@ -3585,7 +3537,7 @@
  * Disable the cursor.
  */
     void
-cursor_off()
+cursor_off(void)
 {
     if (full_screen)
     {
@@ -3600,7 +3552,7 @@
  * Set cursor shape to match Insert or Replace mode.
  */
     void
-term_cursor_shape()
+term_cursor_shape(void)
 {
     static int showing_mode = NORMAL;
     char_u *p;
@@ -3648,9 +3600,7 @@
  * the full width of the window, excluding the vertical separator.
  */
     void
-scroll_region_set(wp, off)
-    win_T	*wp;
-    int		off;
+scroll_region_set(win_T *wp, int off)
 {
     OUT_STR(tgoto((char *)T_CS, W_WINROW(wp) + wp->w_height - 1,
 							 W_WINROW(wp) + off));
@@ -3666,7 +3616,7 @@
  * Reset scrolling region to the whole screen.
  */
     void
-scroll_region_reset()
+scroll_region_reset(void)
 {
     OUT_STR(tgoto((char *)T_CS, (int)Rows - 1, 0));
 #ifdef FEAT_VERTSPLIT
@@ -3695,7 +3645,7 @@
 static int termcode_star(char_u *code, int len);
 
     void
-clear_termcodes()
+clear_termcodes(void)
 {
     while (tc_len > 0)
 	vim_free(termcodes[--tc_len].code);
@@ -3722,10 +3672,7 @@
  * "flags" can also be ATC_FROM_TERM for got_code_from_term().
  */
     void
-add_termcode(name, string, flags)
-    char_u	*name;
-    char_u	*string;
-    int		flags;
+add_termcode(char_u *name, char_u *string, int flags)
 {
     struct termcode *new_tc;
     int		    i, j;
@@ -3854,9 +3801,7 @@
  * Return 0 if not found, 2 for ;*X and 1 for O*X and <M-O>*X.
  */
     static int
-termcode_star(code, len)
-    char_u	*code;
-    int		len;
+termcode_star(char_u *code, int len)
 {
     /* Shortest is <M-O>*X.  With ; shortest is <CSI>1;*X */
     if (len >= 3 && code[len - 2] == '*')
@@ -3870,8 +3815,7 @@
 }
 
     char_u  *
-find_termcode(name)
-    char_u  *name;
+find_termcode(char_u *name)
 {
     int	    i;
 
@@ -3883,8 +3827,7 @@
 
 #if defined(FEAT_CMDL_COMPL) || defined(PROTO)
     char_u *
-get_termcode(i)
-    int	    i;
+get_termcode(int i)
 {
     if (i >= tc_len)
 	return NULL;
@@ -3893,8 +3836,7 @@
 #endif
 
     void
-del_termcode(name)
-    char_u  *name;
+del_termcode(char_u *name)
 {
     int	    i;
 
@@ -3913,8 +3855,7 @@
 }
 
     static void
-del_termcode_idx(idx)
-    int		idx;
+del_termcode_idx(int idx)
 {
     int		i;
 
@@ -3930,7 +3871,7 @@
  * Convert all 7-bit codes to their 8-bit equivalent.
  */
     static void
-switch_to_8bit()
+switch_to_8bit(void)
 {
     int		i;
     int		c;
@@ -3971,8 +3912,7 @@
  * click still works.
  */
     void
-set_mouse_topline(wp)
-    win_T	*wp;
+set_mouse_topline(win_T *wp)
 {
     orig_topline = wp->w_topline;
 # ifdef FEAT_DIFF
@@ -3995,11 +3935,11 @@
  * inserts and deletes.
  */
     int
-check_termcode(max_offset, buf, bufsize, buflen)
-    int		max_offset;
-    char_u	*buf;
-    int		bufsize;
-    int		*buflen;
+check_termcode(
+    int		max_offset,
+    char_u	*buf,
+    int		bufsize,
+    int		*buflen)
 {
     char_u	*tp;
     char_u	*p;
@@ -5459,12 +5399,12 @@
  * instead of a CTRL-V.
  */
     char_u *
-replace_termcodes(from, bufp, from_part, do_lt, special)
-    char_u	*from;
-    char_u	**bufp;
-    int		from_part;
-    int		do_lt;		/* also translate <lt> */
-    int		special;	/* always accept <key> notation */
+replace_termcodes(
+    char_u	*from,
+    char_u	**bufp,
+    int		from_part,
+    int		do_lt,		/* also translate <lt> */
+    int		special)	/* always accept <key> notation */
 {
     int		i;
     int		slen;
@@ -5673,8 +5613,7 @@
  * Return the index in termcodes[], or -1 if not found.
  */
     int
-find_term_bykeys(src)
-    char_u	*src;
+find_term_bykeys(char_u *src)
 {
     int		i;
     int		slen = (int)STRLEN(src);
@@ -5693,7 +5632,7 @@
  * Used to speed up check_termcode().
  */
     static void
-gather_termleader()
+gather_termleader(void)
 {
     int	    i;
     int	    len = 0;
@@ -5724,7 +5663,7 @@
  * This code looks a lot like showoptions(), but is different.
  */
     void
-show_termcodes()
+show_termcodes(void)
 {
     int		col;
     int		*items;
@@ -5810,10 +5749,7 @@
  * Output goes into IObuff[]
  */
     int
-show_one_termcode(name, code, printit)
-    char_u  *name;
-    char_u  *code;
-    int	    printit;
+show_one_termcode(char_u *name, char_u *code, int printit)
 {
     char_u	*p;
     int		len;
@@ -5870,7 +5806,7 @@
 static int xt_index_out = 0;
 
     static void
-req_codes_from_term()
+req_codes_from_term(void)
 {
     xt_index_out = 0;
     xt_index_in = 0;
@@ -5878,7 +5814,7 @@
 }
 
     static void
-req_more_codes_from_term()
+req_more_codes_from_term(void)
 {
     char	buf[11];
     int		old_idx = xt_index_out;
@@ -5916,9 +5852,7 @@
  * "code" points to the "0" or "1".
  */
     static void
-got_code_from_term(code, len)
-    char_u	*code;
-    int		len;
+got_code_from_term(char_u *code, int len)
 {
 #define XT_LEN 100
     char_u	name[3];
@@ -6006,7 +5940,7 @@
  * handled as typed text.
  */
     static void
-check_for_codes_from_term()
+check_for_codes_from_term(void)
 {
     int		c;
 
@@ -6058,9 +5992,9 @@
  * Returns NULL when there is a problem.
  */
     char_u *
-translate_mapping(str, expmap)
-    char_u	*str;
-    int		expmap;  /* TRUE when expanding mappings on command-line */
+translate_mapping(
+    char_u	*str,
+    int		expmap)  /* TRUE when expanding mappings on command-line */
 {
     garray_T	ga;
     int		c;
@@ -6148,8 +6082,7 @@
  * For Win32 console: update termcap codes for existing console attributes.
  */
     void
-update_tcap(attr)
-    int attr;
+update_tcap(int attr)
 {
     struct builtin_term *p;
 
diff --git a/src/termlib.c b/src/termlib.c
index 97270e4..9488a32 100644
--- a/src/termlib.c
+++ b/src/termlib.c
@@ -66,9 +66,9 @@
 #endif
 
     int
-tgetent(tbuf, term)
-    char    *tbuf;		/* Buffer to hold termcap entry, TBUFSZ bytes max */
-    char    *term;		/* Name of terminal */
+tgetent(
+    char    *tbuf,		/* Buffer to hold termcap entry, TBUFSZ bytes max */
+    char    *term)		/* Name of terminal */
 {
     char    tcbuf[32];		/* Temp buffer to handle */
     char    *tcptr = tcbuf;	/* extended entries */
@@ -140,10 +140,7 @@
 }
 
     static int
-getent(tbuf, term, termcap, buflen)
-    char    *tbuf, *term;
-    FILE    *termcap;
-    int	    buflen;
+getent(char *tbuf, *term, FILE *termcap, int buflen)
 {
     char    *tptr;
     int	    tlen = strlen(term);
@@ -171,11 +168,11 @@
     return 0;
 }
 
+/*
+ * Read 1 entry from TERMCAP file.
+ */
     static int
-nextent(tbuf, termcap, buflen)		/* Read 1 entry from TERMCAP file */
-    char    *tbuf;
-    FILE    *termcap;
-    int	    buflen;
+nextent(char *tbuf, FILE *termcap, int buflen)
 {
     char *lbuf = tbuf;				/* lbuf=line buffer */
 				/* read lines straight into buffer */
@@ -218,8 +215,7 @@
  */
 
     int
-tgetflag(id)
-    char *id;
+tgetflag(char *id)
 {
     char    buf[256], *ptr = buf;
 
@@ -237,8 +233,7 @@
  */
 
     int
-tgetnum(id)
-    char *id;
+tgetnum(char *id)
 {
     char *ptr, buf[256];
     ptr = buf;
@@ -277,8 +272,7 @@
  */
 
     char *
-tgetstr(id, buf)
-    char	*id, **buf;
+tgetstr(char *id, char **buf)
 {
     int		len = strlen(id);
     char	*tmp=tent;
@@ -387,10 +381,10 @@
  */
 
     char *
-tgoto(cm, col, line)
-    char	*cm;				/* cm string, from termcap */
-    int col,					/* column, x position */
-    line;					/* line, y position */
+tgoto(
+    char    *cm,				/* cm string, from termcap */
+    int	    col,				/* column, x position */
+    int	    line)				/* line, y position */
 {
     char    gx, gy,				/* x, y */
 	*ptr,					/* pointer in 'cm' */
@@ -533,10 +527,10 @@
     4800,   9600,   19200,  19200 };
 
     int
-tputs(cp, affcnt, outc)
-    char *cp;				/* string to print */
-    int affcnt;				/* Number of lines affected */
-    void (*outc)(unsigned int);/* routine to output 1 character */
+tputs(
+    char *cp,				/* string to print */
+    int affcnt,				/* Number of lines affected */
+    void (*outc)(unsigned int))		/* routine to output 1 character */
 {
     long    frac,			/* 10^(#digits after decimal point) */
 	counter,			/* digits */
@@ -578,11 +572,10 @@
  * Module: tutil.c
  *
  * Purpose: Utility routines for TERMLIB functions.
- *
+ * Returns length of text common to s1 and s2.
  */
     static int
-_match(s1, s2)		/* returns length of text common to s1 and s2 */
-    char *s1, *s2;
+_match(char *s1, char *s2)
 {
     int i = 0;
 
@@ -596,8 +589,7 @@
  * finds next c in s that's a member of set, returns pointer
  */
     static char *
-_find(s, set)
-    char *s, *set;
+_find(char *s, char *set)
 {
     for(; *s; s++)
     {
@@ -617,9 +609,7 @@
  * add val to buf according to format fmt
  */
     static char *
-_addfmt(buf, fmt, val)
-    char *buf, *fmt;
-    int val;
+_addfmt(char *buf, char *fmt, int val)
 {
     sprintf(buf, fmt, val);
     while (*buf)
diff --git a/src/ui.c b/src/ui.c
index 4528ca3..4309248 100644
--- a/src/ui.c
+++ b/src/ui.c
@@ -25,9 +25,7 @@
 #endif
 
     void
-ui_write(s, len)
-    char_u  *s;
-    int	    len;
+ui_write(char_u *s, int len)
 {
 #ifdef FEAT_GUI
     if (gui.in_use && !gui.dying && !gui.starting)
@@ -75,9 +73,7 @@
 static int ta_len;	/* length of ta_str when it's not NULL*/
 
     void
-ui_inchar_undo(s, len)
-    char_u	*s;
-    int		len;
+ui_inchar_undo(char_u *s, int len)
 {
     char_u  *new;
     int	    newlen;
@@ -117,11 +113,11 @@
  * otherwise.
  */
     int
-ui_inchar(buf, maxlen, wtime, tb_change_cnt)
-    char_u	*buf;
-    int		maxlen;
-    long	wtime;	    /* don't use "time", MIPS cannot handle it */
-    int		tb_change_cnt;
+ui_inchar(
+    char_u	*buf,
+    int		maxlen,
+    long	wtime,	    /* don't use "time", MIPS cannot handle it */
+    int		tb_change_cnt)
 {
     int		retval = 0;
 
@@ -220,7 +216,7 @@
  * return non-zero if a character is available
  */
     int
-ui_char_avail()
+ui_char_avail(void)
 {
 #ifdef FEAT_GUI
     if (gui.in_use)
@@ -245,9 +241,7 @@
  * cancel the delay if a key is hit.
  */
     void
-ui_delay(msec, ignoreinput)
-    long	msec;
-    int		ignoreinput;
+ui_delay(long msec, int ignoreinput)
 {
 #ifdef FEAT_GUI
     if (gui.in_use && !ignoreinput)
@@ -263,7 +257,7 @@
  * When running the GUI iconify the window.
  */
     void
-ui_suspend()
+ui_suspend(void)
 {
 #ifdef FEAT_GUI
     if (gui.in_use)
@@ -281,7 +275,7 @@
  * This is never called in the GUI.
  */
     void
-suspend_shell()
+suspend_shell(void)
 {
     if (*p_sh == NUL)
 	EMSG(_(e_shellempty));
@@ -299,7 +293,7 @@
  * Return OK when size could be determined, FAIL otherwise.
  */
     int
-ui_get_shellsize()
+ui_get_shellsize(void)
 {
     int	    retval;
 
@@ -327,8 +321,8 @@
  * new size.  If this is not possible, it will adjust Rows and Columns.
  */
     void
-ui_set_shellsize(mustset)
-    int		mustset UNUSED;	/* set by the user */
+ui_set_shellsize(
+    int		mustset UNUSED)	/* set by the user */
 {
 #ifdef FEAT_GUI
     if (gui.in_use)
@@ -343,7 +337,7 @@
  * region.
  */
     void
-ui_new_shellsize()
+ui_new_shellsize(void)
 {
     if (full_screen && !exiting)
     {
@@ -357,7 +351,7 @@
 }
 
     void
-ui_breakcheck()
+ui_breakcheck(void)
 {
 #ifdef FEAT_GUI
     if (gui.in_use)
@@ -395,8 +389,7 @@
  * the GUI starts.
  */
     void
-clip_init(can_use)
-    int	    can_use;
+clip_init(int can_use)
 {
     VimClipboard *cb;
 
@@ -425,8 +418,7 @@
  * this is called whenever VIsual mode is ended.
  */
     void
-clip_update_selection(clip)
-    VimClipboard    *clip;
+clip_update_selection(VimClipboard *clip)
 {
     pos_T	    start, end;
 
@@ -463,8 +455,7 @@
 }
 
     void
-clip_own_selection(cbd)
-    VimClipboard	*cbd;
+clip_own_selection(VimClipboard *cbd)
 {
     /*
      * Also want to check somehow that we are reading from the keyboard rather
@@ -500,8 +491,7 @@
 }
 
     void
-clip_lose_selection(cbd)
-    VimClipboard	*cbd;
+clip_lose_selection(VimClipboard *cbd)
 {
 #ifdef FEAT_X11
     int	    was_owned = cbd->owned;
@@ -543,8 +533,7 @@
 }
 
     static void
-clip_copy_selection(clip)
-    VimClipboard	*clip;
+clip_copy_selection(VimClipboard *clip)
 {
     if (VIsual_active && (State & NORMAL) && clip->available)
     {
@@ -569,7 +558,7 @@
  * Save clip_unnamed and reset it.
  */
     void
-start_global_changes()
+start_global_changes(void)
 {
     if (++global_change_count > 1)
 	return;
@@ -587,7 +576,7 @@
  * Restore clip_unnamed and set the selection when needed.
  */
     void
-end_global_changes()
+end_global_changes(void)
 {
     if (--global_change_count > 0)
 	/* recursive */
@@ -619,7 +608,7 @@
  * Called when Visual mode is ended: update the selection.
  */
     void
-clip_auto_select()
+clip_auto_select(void)
 {
     if (clip_isautosel_star())
 	clip_copy_selection(&clip_star);
@@ -632,7 +621,7 @@
  * register.
  */
     int
-clip_isautosel_star()
+clip_isautosel_star(void)
 {
     return (
 #ifdef FEAT_GUI
@@ -646,7 +635,7 @@
  * register.
  */
     int
-clip_isautosel_plus()
+clip_isautosel_plus(void)
 {
     return (
 #ifdef FEAT_GUI
@@ -678,10 +667,7 @@
  * command-line and in the cmdline window.
  */
     void
-clip_modeless(button, is_click, is_drag)
-    int		button;
-    int		is_click;
-    int		is_drag;
+clip_modeless(int button, int is_click, int is_drag)
 {
     int		repeat;
 
@@ -715,11 +701,11 @@
  * Compare two screen positions ala strcmp()
  */
     static int
-clip_compare_pos(row1, col1, row2, col2)
-    int		row1;
-    int		col1;
-    int		row2;
-    int		col2;
+clip_compare_pos(
+    int		row1,
+    int		col1,
+    int		row2,
+    int		col2)
 {
     if (row1 > row2) return(1);
     if (row1 < row2) return(-1);
@@ -732,10 +718,7 @@
  * Start the selection
  */
     void
-clip_start_selection(col, row, repeated_click)
-    int		col;
-    int		row;
-    int		repeated_click;
+clip_start_selection(int col, int row, int repeated_click)
 {
     VimClipboard	*cb = &clip_star;
 
@@ -805,11 +788,11 @@
  * Continue processing the selection
  */
     void
-clip_process_selection(button, col, row, repeated_click)
-    int		button;
-    int		col;
-    int		row;
-    int_u	repeated_click;
+clip_process_selection(
+    int		button,
+    int		col,
+    int		row,
+    int_u	repeated_click)
 {
     VimClipboard	*cb = &clip_star;
     int			diff;
@@ -990,9 +973,7 @@
  * Only used for the GUI.
  */
     void
-clip_may_redraw_selection(row, col, len)
-    int		row, col;
-    int		len;
+clip_may_redraw_selection(int row, int col, int len)
 {
     int		start = col;
     int		end = col + len;
@@ -1015,8 +996,7 @@
  * Called from outside to clear selected region from the display
  */
     void
-clip_clear_selection(cbd)
-    VimClipboard    *cbd;
+clip_clear_selection(VimClipboard *cbd)
 {
 
     if (cbd->state == SELECT_CLEARED)
@@ -1031,8 +1011,7 @@
  * Clear the selection if any lines from "row1" to "row2" are inside of it.
  */
     void
-clip_may_clear_selection(row1, row2)
-    int	row1, row2;
+clip_may_clear_selection(int row1, int row2)
 {
     if (clip_star.state == SELECT_DONE
 	    && row2 >= clip_star.start.lnum
@@ -1045,8 +1024,8 @@
  * of the selection.  Call with big number when clearing the screen.
  */
     void
-clip_scroll_selection(rows)
-    int	    rows;		/* negative for scroll down */
+clip_scroll_selection(
+    int	    rows)		/* negative for scroll down */
 {
     int	    lnum;
 
@@ -1079,12 +1058,12 @@
  * 0: invert (GUI only).
  */
     static void
-clip_invert_area(row1, col1, row2, col2, how)
-    int		row1;
-    int		col1;
-    int		row2;
-    int		col2;
-    int		how;
+clip_invert_area(
+    int		row1,
+    int		col1,
+    int		row2,
+    int		col2,
+    int		how)
 {
     int		invert = FALSE;
 
@@ -1139,12 +1118,12 @@
  * "invert" is true if the result is inverted.
  */
     static void
-clip_invert_rectangle(row, col, height, width, invert)
-    int		row;
-    int		col;
-    int		height;
-    int		width;
-    int		invert;
+clip_invert_rectangle(
+    int		row,
+    int		col,
+    int		height,
+    int		width,
+    int		invert)
 {
 #ifdef FEAT_GUI
     if (gui.in_use)
@@ -1160,8 +1139,7 @@
  * When "both" is TRUE also copy to the '+' register.
  */
     void
-clip_copy_modeless_selection(both)
-    int		both UNUSED;
+clip_copy_modeless_selection(int both UNUSED)
 {
     char_u	*buffer;
     char_u	*bufp;
@@ -1344,10 +1322,7 @@
 #define CHAR_CLASS(c)	(c <= ' ' ? ' ' : vim_iswordc(c))
 
     static void
-clip_get_word_boundaries(cb, row, col)
-    VimClipboard	*cb;
-    int			row;
-    int			col;
+clip_get_word_boundaries(VimClipboard *cb, int row, int col)
 {
     int		start_class;
     int		temp_col;
@@ -1406,8 +1381,7 @@
  * line.
  */
     static int
-clip_get_line_end(row)
-    int		row;
+clip_get_line_end(int row)
 {
     int	    i;
 
@@ -1424,12 +1398,12 @@
  * beginning or end and inverting the changed area(s).
  */
     static void
-clip_update_modeless_selection(cb, row1, col1, row2, col2)
-    VimClipboard    *cb;
-    int		    row1;
-    int		    col1;
-    int		    row2;
-    int		    col2;
+clip_update_modeless_selection(
+    VimClipboard    *cb,
+    int		    row1,
+    int		    col1,
+    int		    row2,
+    int		    col2)
 {
     /* See if we changed at the beginning of the selection */
     if (row1 != cb->start.lnum || col1 != (int)cb->start.col)
@@ -1451,8 +1425,7 @@
 }
 
     int
-clip_gen_own_selection(cbd)
-    VimClipboard	*cbd;
+clip_gen_own_selection(VimClipboard *cbd)
 {
 #ifdef FEAT_XCLIPBOARD
 # ifdef FEAT_GUI
@@ -1467,8 +1440,7 @@
 }
 
     void
-clip_gen_lose_selection(cbd)
-    VimClipboard	*cbd;
+clip_gen_lose_selection(VimClipboard *cbd)
 {
 #ifdef FEAT_XCLIPBOARD
 # ifdef FEAT_GUI
@@ -1483,8 +1455,7 @@
 }
 
     void
-clip_gen_set_selection(cbd)
-    VimClipboard	*cbd;
+clip_gen_set_selection(VimClipboard *cbd)
 {
     if (!clip_did_set_selection)
     {
@@ -1510,8 +1481,7 @@
 }
 
     void
-clip_gen_request_selection(cbd)
-    VimClipboard	*cbd;
+clip_gen_request_selection(VimClipboard *cbd)
 {
 #ifdef FEAT_XCLIPBOARD
 # ifdef FEAT_GUI
@@ -1526,8 +1496,7 @@
 }
 
     int
-clip_gen_owner_exists(cbd)
-    VimClipboard	*cbd UNUSED;
+clip_gen_owner_exists(VimClipboard *cbd UNUSED)
 {
 #ifdef FEAT_XCLIPBOARD
 # ifdef FEAT_GUI_GTK
@@ -1584,20 +1553,20 @@
  */
 
     int
-vim_is_input_buf_full()
+vim_is_input_buf_full(void)
 {
     return (inbufcount >= INBUFLEN);
 }
 
     int
-vim_is_input_buf_empty()
+vim_is_input_buf_empty(void)
 {
     return (inbufcount == 0);
 }
 
 #if defined(FEAT_OLE) || defined(PROTO)
     int
-vim_free_in_input_buf()
+vim_free_in_input_buf(void)
 {
     return (INBUFLEN - inbufcount);
 }
@@ -1605,7 +1574,7 @@
 
 #if defined(FEAT_GUI_GTK) || defined(PROTO)
     int
-vim_used_in_input_buf()
+vim_used_in_input_buf(void)
 {
     return inbufcount;
 }
@@ -1617,7 +1586,7 @@
  * The returned pointer must be passed to set_input_buf() later.
  */
     char_u *
-get_input_buf()
+get_input_buf(void)
 {
     garray_T	*gap;
 
@@ -1640,8 +1609,7 @@
  * The allocated memory is freed, this only works once!
  */
     void
-set_input_buf(p)
-    char_u	*p;
+set_input_buf(char_u *p)
 {
     garray_T	*gap = (garray_T *)p;
 
@@ -1669,9 +1637,7 @@
  * CSI KS_EXTRA KE_CSI.  K_SPECIAL doesn't require translation.
  */
     void
-add_to_input_buf(s, len)
-    char_u  *s;
-    int	    len;
+add_to_input_buf(char_u *s, int len)
 {
     if (inbufcount + len > INBUFLEN + MAX_KEY_CODE_LEN)
 	return;	    /* Shouldn't ever happen! */
@@ -1719,9 +1685,7 @@
 
 #if defined(FEAT_HANGULIN) || defined(PROTO)
     void
-push_raw_key(s, len)
-    char_u  *s;
-    int	    len;
+push_raw_key(char_u *s, int len)
 {
     char_u *tmpbuf;
 
@@ -1741,7 +1705,7 @@
 	|| defined(PROTO)
 /* Remove everything from the input buffer.  Called when ^C is found */
     void
-trash_input_buf()
+trash_input_buf(void)
 {
     inbufcount = 0;
 }
@@ -1753,9 +1717,7 @@
  * Note: this function used to be Read() in unix.c
  */
     int
-read_from_input_buf(buf, maxlen)
-    char_u  *buf;
-    long    maxlen;
+read_from_input_buf(char_u *buf, long maxlen)
 {
     if (inbufcount == 0)	/* if the buffer is empty, fill it */
 	fill_input_buf(TRUE);
@@ -1769,8 +1731,7 @@
 }
 
     void
-fill_input_buf(exit_on_error)
-    int	exit_on_error UNUSED;
+fill_input_buf(int exit_on_error UNUSED)
 {
 #if defined(UNIX) || defined(VMS) || defined(MACOS_X_UNIX)
     int		len;
@@ -1948,7 +1909,7 @@
  * Exit because of an input read error.
  */
     void
-read_error_exit()
+read_error_exit(void)
 {
     if (silent_mode)	/* Normal way to exit for "ex -s" */
 	getout(0);
@@ -1961,7 +1922,7 @@
  * May update the shape of the cursor.
  */
     void
-ui_cursor_shape()
+ui_cursor_shape(void)
 {
 # ifdef FEAT_GUI
     if (gui.in_use)
@@ -1986,8 +1947,7 @@
  * Check bounds for column number
  */
     int
-check_col(col)
-    int	    col;
+check_col(int col)
 {
     if (col < 0)
 	return 0;
@@ -2000,8 +1960,7 @@
  * Check bounds for row number
  */
     int
-check_row(row)
-    int	    row;
+check_row(int row)
 {
     if (row < 0)
 	return 0;
@@ -2024,7 +1983,7 @@
  * Used for Motif and Athena GUI and the xterm clipboard.
  */
     void
-open_app_context()
+open_app_context(void)
 {
     if (app_context == NULL)
     {
@@ -2044,8 +2003,7 @@
 static Atom	timestamp_atom;	/* Used to get a timestamp */
 
     void
-x11_setup_atoms(dpy)
-    Display	*dpy;
+x11_setup_atoms(Display *dpy)
 {
     vim_atom	       = XInternAtom(dpy, VIM_ATOM_NAME,   False);
 #ifdef FEAT_MBYTE
@@ -2073,11 +2031,11 @@
  * Property callback to get a timestamp for XtOwnSelection.
  */
     static void
-clip_x11_timestamp_cb(w, n, event, cont)
-    Widget	w;
-    XtPointer	n UNUSED;
-    XEvent	*event;
-    Boolean	*cont UNUSED;
+clip_x11_timestamp_cb(
+    Widget	w,
+    XtPointer	n UNUSED,
+    XEvent	*event,
+    Boolean	*cont UNUSED)
 {
     Atom	    actual_type;
     int		    format;
@@ -2119,23 +2077,21 @@
 }
 
     void
-x11_setup_selection(w)
-    Widget	w;
+x11_setup_selection(Widget w)
 {
     XtAddEventHandler(w, PropertyChangeMask, False,
 	    /*(XtEventHandler)*/clip_x11_timestamp_cb, (XtPointer)NULL);
 }
 
     static void
-clip_x11_request_selection_cb(w, success, sel_atom, type, value, length,
-			      format)
-    Widget	w UNUSED;
-    XtPointer	success;
-    Atom	*sel_atom;
-    Atom	*type;
-    XtPointer	value;
-    long_u	*length;
-    int		*format;
+clip_x11_request_selection_cb(
+    Widget	w UNUSED,
+    XtPointer	success,
+    Atom	*sel_atom,
+    Atom	*type,
+    XtPointer	value,
+    long_u	*length,
+    int		*format)
 {
     int		motion_type = MAUTO;
     long_u	len;
@@ -2241,10 +2197,10 @@
 }
 
     void
-clip_x11_request_selection(myShell, dpy, cbd)
-    Widget	myShell;
-    Display	*dpy;
-    VimClipboard	*cbd;
+clip_x11_request_selection(
+    Widget	myShell,
+    Display	*dpy,
+    VimClipboard	*cbd)
 {
     XEvent	event;
     Atom	type;
@@ -2346,14 +2302,14 @@
 }
 
     static Boolean
-clip_x11_convert_selection_cb(w, sel_atom, target, type, value, length, format)
-    Widget	w UNUSED;
-    Atom	*sel_atom;
-    Atom	*target;
-    Atom	*type;
-    XtPointer	*value;
-    long_u	*length;
-    int		*format;
+clip_x11_convert_selection_cb(
+    Widget	w UNUSED,
+    Atom	*sel_atom,
+    Atom	*target,
+    Atom	*type,
+    XtPointer	*value,
+    long_u	*length,
+    int		*format)
 {
     char_u	*string;
     char_u	*result;
@@ -2488,9 +2444,7 @@
 }
 
     static void
-clip_x11_lose_ownership_cb(w, sel_atom)
-    Widget  w UNUSED;
-    Atom    *sel_atom;
+clip_x11_lose_ownership_cb(Widget w UNUSED, Atom *sel_atom)
 {
     if (*sel_atom == clip_plus.sel_atom)
 	clip_lose_selection(&clip_plus);
@@ -2499,18 +2453,14 @@
 }
 
     void
-clip_x11_lose_selection(myShell, cbd)
-    Widget		myShell;
-    VimClipboard	*cbd;
+clip_x11_lose_selection(Widget myShell, VimClipboard *cbd)
 {
     XtDisownSelection(myShell, cbd->sel_atom,
 				XtLastTimestampProcessed(XtDisplay(myShell)));
 }
 
     int
-clip_x11_own_selection(myShell, cbd)
-    Widget		myShell;
-    VimClipboard	*cbd;
+clip_x11_own_selection(Widget myShell, VimClipboard *cbd)
 {
     /* When using the GUI we have proper timestamps, use the one of the last
      * event.  When in the console we don't get events (the terminal gets
@@ -2542,14 +2492,12 @@
  * will fill in the selection only when requested by another app.
  */
     void
-clip_x11_set_selection(cbd)
-    VimClipboard *cbd UNUSED;
+clip_x11_set_selection(VimClipboard *cbd UNUSED)
 {
 }
 
     int
-clip_x11_owner_exists(cbd)
-    VimClipboard	*cbd;
+clip_x11_owner_exists(VimClipboard *cbd)
 {
     return XGetSelectionOwner(X_DISPLAY, cbd->sel_atom) != None;
 }
@@ -2561,9 +2509,7 @@
  * Get the contents of the X CUT_BUFFER0 and put it in "cbd".
  */
     void
-yank_cut_buffer0(dpy, cbd)
-    Display		*dpy;
-    VimClipboard	*cbd;
+yank_cut_buffer0(Display *dpy, VimClipboard *cbd)
 {
     int		nbytes = 0;
     char_u	*buffer = (char_u *)XFetchBuffer(dpy, &nbytes, 0);
@@ -2638,10 +2584,10 @@
  * remembered.
  */
     int
-jump_to_mouse(flags, inclusive, which_button)
-    int		flags;
-    int		*inclusive;	/* used for inclusive operator, can be NULL */
-    int		which_button;	/* MOUSE_LEFT, MOUSE_RIGHT, MOUSE_MIDDLE */
+jump_to_mouse(
+    int		flags,
+    int		*inclusive,	/* used for inclusive operator, can be NULL */
+    int		which_button)	/* MOUSE_LEFT, MOUSE_RIGHT, MOUSE_MIDDLE */
 {
     static int	on_status_line = 0;	/* #lines below bottom of window */
 #ifdef FEAT_VERTSPLIT
@@ -3051,11 +2997,11 @@
  * Returns TRUE if the position is below the last line.
  */
     int
-mouse_comp_pos(win, rowp, colp, lnump)
-    win_T	*win;
-    int		*rowp;
-    int		*colp;
-    linenr_T	*lnump;
+mouse_comp_pos(
+    win_T	*win,
+    int		*rowp,
+    int		*colp,
+    linenr_T	*lnump)
 {
     int		col = *colp;
     int		row = *rowp;
@@ -3140,9 +3086,7 @@
  * updated to become relative to the top-left of the window.
  */
     win_T *
-mouse_find_win(rowp, colp)
-    int		*rowp;
-    int		*colp UNUSED;
+mouse_find_win(int *rowp, int *colp UNUSED)
 {
     frame_T	*fp;
 
@@ -3184,8 +3128,7 @@
  * Translate window coordinates to buffer position without any side effects
  */
     int
-get_fpos_of_mouse(mpos)
-    pos_T	*mpos;
+get_fpos_of_mouse(pos_T *mpos)
 {
     win_T	*wp;
     int		row = mouse_row;
@@ -3232,10 +3175,7 @@
  * The first column is one.
  */
     int
-vcol2col(wp, lnum, vcol)
-    win_T	*wp;
-    linenr_T	lnum;
-    int		vcol;
+vcol2col(win_T *wp, linenr_T lnum, int vcol)
 {
     /* try to advance to the specified column */
     int		count = 0;
@@ -3260,8 +3200,8 @@
  * be done in the console (Win32).
  */
     void
-ui_focus_change(in_focus)
-    int		in_focus;	/* TRUE if focus gained. */
+ui_focus_change(
+    int		in_focus)	/* TRUE if focus gained. */
 {
     static time_t	last_time = (time_t)0;
     int			need_redraw = FALSE;
@@ -3329,8 +3269,7 @@
  * Save current Input Method status to specified place.
  */
     void
-im_save_status(psave)
-    long *psave;
+im_save_status(long *psave)
 {
     /* Don't save when 'imdisable' is set or "xic" is NULL, IM is always
      * disabled then (but might start later).
diff --git a/src/undo.c b/src/undo.c
index cf9e80c..7736f54 100644
--- a/src/undo.c
+++ b/src/undo.c
@@ -246,7 +246,7 @@
  * Returns OK or FAIL.
  */
     int
-u_save_cursor()
+u_save_cursor(void)
 {
     return (u_save((linenr_T)(curwin->w_cursor.lnum - 1),
 				      (linenr_T)(curwin->w_cursor.lnum + 1)));
@@ -259,8 +259,7 @@
  * Returns FAIL when lines could not be saved, OK otherwise.
  */
     int
-u_save(top, bot)
-    linenr_T top, bot;
+u_save(linenr_T top, linenr_T bot)
 {
     if (undo_off)
 	return OK;
@@ -283,8 +282,7 @@
  * Returns FAIL when lines could not be saved, OK otherwise.
  */
     int
-u_savesub(lnum)
-    linenr_T	lnum;
+u_savesub(linenr_T lnum)
 {
     if (undo_off)
 	return OK;
@@ -299,8 +297,7 @@
  * Returns FAIL when lines could not be saved, OK otherwise.
  */
     int
-u_inssub(lnum)
-    linenr_T	lnum;
+u_inssub(linenr_T lnum)
 {
     if (undo_off)
 	return OK;
@@ -316,9 +313,7 @@
  * Returns FAIL when lines could not be saved, OK otherwise.
  */
     int
-u_savedel(lnum, nlines)
-    linenr_T	lnum;
-    long	nlines;
+u_savedel(linenr_T lnum, long nlines)
 {
     if (undo_off)
 	return OK;
@@ -332,7 +327,7 @@
  * return FALSE.
  */
     int
-undo_allowed()
+undo_allowed(void)
 {
     /* Don't allow changes when 'modifiable' is off.  */
     if (!curbuf->b_p_ma)
@@ -365,7 +360,7 @@
  * Get the undolevle value for the current buffer.
  */
     static long
-get_undolevel()
+get_undolevel(void)
 {
     if (curbuf->b_p_ul == NO_LOCAL_UNDOLEVEL)
 	return p_ul;
@@ -382,10 +377,11 @@
  * Returns FAIL when lines could not be saved, OK otherwise.
  */
     int
-u_savecommon(top, bot, newbot, reload)
-    linenr_T	top, bot;
-    linenr_T	newbot;
-    int		reload;
+u_savecommon(
+    linenr_T	top,
+    linenr_T	bot,
+    linenr_T	newbot,
+    int		reload)
 {
     linenr_T	lnum;
     long	i;
@@ -749,8 +745,7 @@
  * Compute the hash for the current buffer text into hash[UNDO_HASH_SIZE].
  */
     void
-u_compute_hash(hash)
-    char_u *hash;
+u_compute_hash(char_u *hash)
 {
     context_sha256_T	ctx;
     linenr_T		lnum;
@@ -773,9 +768,7 @@
  * Returns NULL when there is no place to write or no file to read.
  */
     char_u *
-u_get_undo_file_name(buf_ffname, reading)
-    char_u	*buf_ffname;
-    int		reading;
+u_get_undo_file_name(char_u *buf_ffname, int reading)
 {
     char_u	*dirp;
     char_u	dir_name[IOSIZE + 1];
@@ -859,16 +852,13 @@
 }
 
     static void
-corruption_error(mesg, file_name)
-    char *mesg;
-    char_u *file_name;
+corruption_error(char *mesg, char_u *file_name)
 {
     EMSG3(_("E825: Corrupted undo file (%s): %s"), mesg, file_name);
 }
 
     static void
-u_free_uhp(uhp)
-    u_header_T	*uhp;
+u_free_uhp(u_header_T *uhp)
 {
     u_entry_T	*nuep;
     u_entry_T	*uep;
@@ -889,10 +879,7 @@
  * Returns OK or FAIL.
  */
     static int
-undo_write(bi, ptr, len)
-    bufinfo_T	*bi;
-    char_u	*ptr;
-    size_t	len;
+undo_write(bufinfo_T *bi, char_u *ptr, size_t len)
 {
 #ifdef FEAT_CRYPT
     if (bi->bi_buffer != NULL)
@@ -926,8 +913,7 @@
 
 #ifdef FEAT_CRYPT
     static int
-undo_flush(bi)
-    bufinfo_T	*bi;
+undo_flush(bufinfo_T *bi)
 {
     if (bi->bi_buffer != NULL && bi->bi_used > 0)
     {
@@ -945,10 +931,7 @@
  * Returns OK or FAIL.
  */
     static int
-fwrite_crypt(bi, ptr, len)
-    bufinfo_T	*bi;
-    char_u	*ptr;
-    size_t	len;
+fwrite_crypt(bufinfo_T *bi, char_u *ptr, size_t len)
 {
 #ifdef FEAT_CRYPT
     char_u  *copy;
@@ -982,10 +965,7 @@
  * Returns OK or FAIL.
  */
     static int
-undo_write_bytes(bi, nr, len)
-    bufinfo_T *bi;
-    long_u  nr;
-    int	    len;
+undo_write_bytes(bufinfo_T *bi, long_u nr, int len)
 {
     char_u  buf[8];
     int	    i;
@@ -1001,16 +981,13 @@
  * we use the sequence number of the header.  This is converted back to
  * pointers when reading. */
     static void
-put_header_ptr(bi, uhp)
-    bufinfo_T	*bi;
-    u_header_T	*uhp;
+put_header_ptr(bufinfo_T *bi, u_header_T *uhp)
 {
     undo_write_bytes(bi, (long_u)(uhp != NULL ? uhp->uh_seq : 0), 4);
 }
 
     static int
-undo_read_4c(bi)
-    bufinfo_T	*bi;
+undo_read_4c(bufinfo_T *bi)
 {
 #ifdef FEAT_CRYPT
     if (bi->bi_buffer != NULL)
@@ -1027,8 +1004,7 @@
 }
 
     static int
-undo_read_2c(bi)
-    bufinfo_T	*bi;
+undo_read_2c(bufinfo_T *bi)
 {
 #ifdef FEAT_CRYPT
     if (bi->bi_buffer != NULL)
@@ -1045,8 +1021,7 @@
 }
 
     static int
-undo_read_byte(bi)
-    bufinfo_T	*bi;
+undo_read_byte(bufinfo_T *bi)
 {
 #ifdef FEAT_CRYPT
     if (bi->bi_buffer != NULL)
@@ -1061,8 +1036,7 @@
 }
 
     static time_t
-undo_read_time(bi)
-    bufinfo_T	*bi;
+undo_read_time(bufinfo_T *bi)
 {
 #ifdef FEAT_CRYPT
     if (bi->bi_buffer != NULL)
@@ -1085,10 +1059,7 @@
  * Return OK or FAIL.
  */
     static int
-undo_read(bi, buffer, size)
-    bufinfo_T   *bi;
-    char_u	*buffer;
-    size_t	size;
+undo_read(bufinfo_T *bi, char_u *buffer, size_t size)
 {
 #ifdef FEAT_CRYPT
     if (bi->bi_buffer != NULL)
@@ -1138,9 +1109,7 @@
  * Returns a pointer to allocated memory or NULL for failure.
  */
     static char_u *
-read_string_decrypt(bi, len)
-    bufinfo_T	*bi;
-    int		len;
+read_string_decrypt(bufinfo_T *bi, int len)
 {
     char_u  *ptr = alloc((unsigned)len + 1);
 
@@ -1164,9 +1133,7 @@
  * Writes the (not encrypted) header and initializes encryption if needed.
  */
     static int
-serialize_header(bi, hash)
-    bufinfo_T	*bi;
-    char_u	*hash;
+serialize_header(bufinfo_T *bi, char_u *hash)
 {
     int		len;
     buf_T	*buf = bi->bi_buf;
@@ -1252,9 +1219,7 @@
 }
 
     static int
-serialize_uhp(bi, uhp)
-    bufinfo_T	*bi;
-    u_header_T	*uhp;
+serialize_uhp(bufinfo_T *bi, u_header_T *uhp)
 {
     int		i;
     u_entry_T	*uep;
@@ -1301,9 +1266,7 @@
 }
 
     static u_header_T *
-unserialize_uhp(bi, file_name)
-    bufinfo_T	*bi;
-    char_u	*file_name;
+unserialize_uhp(bufinfo_T *bi, char_u *file_name)
 {
     u_header_T	*uhp;
     int		i;
@@ -1393,9 +1356,9 @@
  * Serialize "uep".
  */
     static int
-serialize_uep(bi, uep)
-    bufinfo_T	*bi;
-    u_entry_T	*uep;
+serialize_uep(
+    bufinfo_T	*bi,
+    u_entry_T	*uep)
 {
     int		i;
     size_t	len;
@@ -1416,10 +1379,7 @@
 }
 
     static u_entry_T *
-unserialize_uep(bi, error, file_name)
-    bufinfo_T	*bi;
-    int		*error;
-    char_u	*file_name;
+unserialize_uep(bufinfo_T *bi, int *error, char_u *file_name)
 {
     int		i;
     u_entry_T	*uep;
@@ -1476,9 +1436,7 @@
  * Serialize "pos".
  */
     static void
-serialize_pos(bi, pos)
-    bufinfo_T *bi;
-    pos_T pos;
+serialize_pos(bufinfo_T *bi, pos_T pos)
 {
     undo_write_bytes(bi, (long_u)pos.lnum, 4);
     undo_write_bytes(bi, (long_u)pos.col, 4);
@@ -1493,9 +1451,7 @@
  * Unserialize the pos_T at the current position.
  */
     static void
-unserialize_pos(bi, pos)
-    bufinfo_T *bi;
-    pos_T *pos;
+unserialize_pos(bufinfo_T *bi, pos_T *pos)
 {
     pos->lnum = undo_read_4c(bi);
     if (pos->lnum < 0)
@@ -1516,9 +1472,7 @@
  * Serialize "info".
  */
     static void
-serialize_visualinfo(bi, info)
-    bufinfo_T	    *bi;
-    visualinfo_T    *info;
+serialize_visualinfo(bufinfo_T *bi, visualinfo_T *info)
 {
     serialize_pos(bi, info->vi_start);
     serialize_pos(bi, info->vi_end);
@@ -1530,9 +1484,7 @@
  * Unserialize the visualinfo_T at the current position.
  */
     static void
-unserialize_visualinfo(bi, info)
-    bufinfo_T	    *bi;
-    visualinfo_T    *info;
+unserialize_visualinfo(bufinfo_T *bi, visualinfo_T *info)
 {
     unserialize_pos(bi, &info->vi_start);
     unserialize_pos(bi, &info->vi_end);
@@ -1550,11 +1502,11 @@
  * "hash[UNDO_HASH_SIZE]" must be the hash value of the buffer text.
  */
     void
-u_write_undo(name, forceit, buf, hash)
-    char_u	*name;
-    int		forceit;
-    buf_T	*buf;
-    char_u	*hash;
+u_write_undo(
+    char_u	*name,
+    int		forceit,
+    buf_T	*buf,
+    char_u	*hash)
 {
     u_header_T	*uhp;
     char_u	*file_name;
@@ -1824,10 +1776,7 @@
  * "hash[UNDO_HASH_SIZE]" must be the hash value of the buffer text.
  */
     void
-u_read_undo(name, hash, orig_name)
-    char_u *name;
-    char_u *hash;
-    char_u *orig_name;
+u_read_undo(char_u *name, char_u *hash, char_u *orig_name)
 {
     char_u	*file_name;
     FILE	*fp;
@@ -2188,8 +2137,7 @@
  * If 'cpoptions' does not contain 'u': Always undo.
  */
     void
-u_undo(count)
-    int count;
+u_undo(int count)
 {
     /*
      * If we get an undo command while executing a macro, we behave like the
@@ -2214,8 +2162,7 @@
  * If 'cpoptions' does not contain 'u': Always redo.
  */
     void
-u_redo(count)
-    int count;
+u_redo(int count)
 {
     if (vim_strchr(p_cpo, CPO_UNDO) == NULL)
 	undo_undoes = FALSE;
@@ -2226,8 +2173,7 @@
  * Undo or redo, depending on 'undo_undoes', 'count' times.
  */
     static void
-u_doit(startcount)
-    int startcount;
+u_doit(int startcount)
 {
     int count = startcount;
 
@@ -2304,11 +2250,11 @@
  * "sec" must be FALSE then.
  */
     void
-undo_time(step, sec, file, absolute)
-    long	step;
-    int		sec;
-    int		file;
-    int		absolute;
+undo_time(
+    long	step,
+    int		sec,
+    int		file,
+    int		absolute)
 {
     long	    target;
     long	    closest;
@@ -2645,8 +2591,7 @@
  * When "undo" is TRUE we go up in the tree, when FALSE we go down.
  */
     static void
-u_undoredo(undo)
-    int		undo;
+u_undoredo(int undo)
 {
     char_u	**newarray = NULL;
     linenr_T	oldsize;
@@ -2933,9 +2878,9 @@
  * in some cases, but it's better than nothing).
  */
     static void
-u_undo_end(did_undo, absolute)
-    int		did_undo;	/* just did an undo */
-    int		absolute;	/* used ":undo N" */
+u_undo_end(
+    int		did_undo,	/* just did an undo */
+    int		absolute)	/* used ":undo N" */
 {
     char	*msgstr;
     u_header_T	*uhp;
@@ -3016,8 +2961,8 @@
  * u_sync: stop adding to the current entry list
  */
     void
-u_sync(force)
-    int	    force;	/* Also sync when no_u_sync is set. */
+u_sync(
+    int	    force)	/* Also sync when no_u_sync is set. */
 {
     /* Skip it when already synced or syncing is disabled. */
     if (curbuf->b_u_synced || (!force && no_u_sync > 0))
@@ -3039,8 +2984,7 @@
  * ":undolist": List the leafs of the undo tree
  */
     void
-ex_undolist(eap)
-    exarg_T *eap UNUSED;
+ex_undolist(exarg_T *eap UNUSED)
 {
     garray_T	ga;
     u_header_T	*uhp;
@@ -3146,10 +3090,7 @@
  * Put the timestamp of an undo header in "buf[buflen]" in a nice format.
  */
     static void
-u_add_time(buf, buflen, tt)
-    char_u	*buf;
-    size_t	buflen;
-    time_t	tt;
+u_add_time(char_u *buf, size_t buflen, time_t tt)
 {
 #ifdef HAVE_STRFTIME
     struct tm	*curtime;
@@ -3174,8 +3115,7 @@
  * ":undojoin": continue adding to the last entry list
  */
     void
-ex_undojoin(eap)
-    exarg_T *eap UNUSED;
+ex_undojoin(exarg_T *eap UNUSED)
 {
     if (curbuf->b_u_newhead == NULL)
 	return;		    /* nothing changed before */
@@ -3201,8 +3141,7 @@
  * Now an undo means that the buffer is modified.
  */
     void
-u_unchanged(buf)
-    buf_T	*buf;
+u_unchanged(buf_T *buf)
 {
     u_unch_branch(buf->b_u_oldhead);
     buf->b_did_warn = FALSE;
@@ -3213,7 +3152,7 @@
  * line that was changed and set the cursor there.
  */
     void
-u_find_first_changed()
+u_find_first_changed(void)
 {
     u_header_T	*uhp = curbuf->b_u_newhead;
     u_entry_T   *uep;
@@ -3249,8 +3188,7 @@
  * used for "u".
  */
     void
-u_update_save_nr(buf)
-    buf_T *buf;
+u_update_save_nr(buf_T *buf)
 {
     u_header_T	*uhp;
 
@@ -3266,8 +3204,7 @@
 }
 
     static void
-u_unch_branch(uhp)
-    u_header_T	*uhp;
+u_unch_branch(u_header_T *uhp)
 {
     u_header_T	*uh;
 
@@ -3284,7 +3221,7 @@
  * If it's not valid, give an error message and return NULL.
  */
     static u_entry_T *
-u_get_headentry()
+u_get_headentry(void)
 {
     if (curbuf->b_u_newhead == NULL || curbuf->b_u_newhead->uh_entry == NULL)
     {
@@ -3299,7 +3236,7 @@
  *		It is called only when b_u_synced is FALSE.
  */
     static void
-u_getbot()
+u_getbot(void)
 {
     u_entry_T	*uep;
     linenr_T	extra;
@@ -3337,10 +3274,10 @@
  * Free one header "uhp" and its entry list and adjust the pointers.
  */
     static void
-u_freeheader(buf, uhp, uhpp)
-    buf_T	    *buf;
-    u_header_T	    *uhp;
-    u_header_T	    **uhpp;	/* if not NULL reset when freeing this header */
+u_freeheader(
+    buf_T	    *buf,
+    u_header_T	    *uhp,
+    u_header_T	    **uhpp)	/* if not NULL reset when freeing this header */
 {
     u_header_T	    *uhap;
 
@@ -3372,10 +3309,10 @@
  * Free an alternate branch and any following alternate branches.
  */
     static void
-u_freebranch(buf, uhp, uhpp)
-    buf_T	    *buf;
-    u_header_T	    *uhp;
-    u_header_T	    **uhpp;	/* if not NULL reset when freeing this header */
+u_freebranch(
+    buf_T	    *buf,
+    u_header_T	    *uhp,
+    u_header_T	    **uhpp)	/* if not NULL reset when freeing this header */
 {
     u_header_T	    *tofree, *next;
 
@@ -3407,10 +3344,10 @@
  * This means that "uhp" is invalid when returning.
  */
     static void
-u_freeentries(buf, uhp, uhpp)
-    buf_T	    *buf;
-    u_header_T	    *uhp;
-    u_header_T	    **uhpp;	/* if not NULL reset when freeing this header */
+u_freeentries(
+    buf_T	    *buf,
+    u_header_T	    *uhp,
+    u_header_T	    **uhpp)	/* if not NULL reset when freeing this header */
 {
     u_entry_T	    *uep, *nuep;
 
@@ -3439,9 +3376,7 @@
  * free entry 'uep' and 'n' lines in uep->ue_array[]
  */
     static void
-u_freeentry(uep, n)
-    u_entry_T	*uep;
-    long	    n;
+u_freeentry(u_entry_T *uep, long n)
 {
     while (n > 0)
 	vim_free(uep->ue_array[--n]);
@@ -3456,8 +3391,7 @@
  * invalidate the undo buffer; called when storage has already been released
  */
     void
-u_clearall(buf)
-    buf_T	*buf;
+u_clearall(buf_T *buf)
 {
     buf->b_u_newhead = buf->b_u_oldhead = buf->b_u_curhead = NULL;
     buf->b_u_synced = TRUE;
@@ -3470,8 +3404,7 @@
  * save the line "lnum" for the "U" command
  */
     void
-u_saveline(lnum)
-    linenr_T lnum;
+u_saveline(linenr_T lnum)
 {
     if (lnum == curbuf->b_u_line_lnum)	    /* line is already saved */
 	return;
@@ -3492,7 +3425,7 @@
  * (this is used externally for crossing a line while in insert mode)
  */
     void
-u_clearline()
+u_clearline(void)
 {
     if (curbuf->b_u_line_ptr != NULL)
     {
@@ -3509,7 +3442,7 @@
  * Careful: may trigger autocommands that reload the buffer.
  */
     void
-u_undoline()
+u_undoline(void)
 {
     colnr_T t;
     char_u  *oldp;
@@ -3551,8 +3484,7 @@
  * Free all allocated memory blocks for the buffer 'buf'.
  */
     void
-u_blockfree(buf)
-    buf_T	*buf;
+u_blockfree(buf_T *buf)
 {
     while (buf->b_u_oldhead != NULL)
 	u_freeheader(buf, buf->b_u_oldhead, NULL);
@@ -3564,8 +3496,7 @@
  * Returns NULL when out of memory.
  */
     static char_u *
-u_save_line(lnum)
-    linenr_T	lnum;
+u_save_line(linenr_T lnum)
 {
     return vim_strsave(ml_get(lnum));
 }
@@ -3576,8 +3507,7 @@
  * "nofile" and "scratch" type buffers are considered to always be unchanged.
  */
     int
-bufIsChanged(buf)
-    buf_T	*buf;
+bufIsChanged(buf_T *buf)
 {
     return
 #ifdef FEAT_QUICKFIX
@@ -3587,7 +3517,7 @@
 }
 
     int
-curbufIsChanged()
+curbufIsChanged(void)
 {
     return
 #ifdef FEAT_QUICKFIX
@@ -3602,9 +3532,7 @@
  * Recursive.
  */
     void
-u_eval_tree(first_uhp, list)
-    u_header_T  *first_uhp;
-    list_T	*list;
+u_eval_tree(u_header_T *first_uhp, list_T *list)
 {
     u_header_T  *uhp = first_uhp;
     dict_T	*dict;
diff --git a/src/version.c b/src/version.c
index daa2469..43837f5 100644
--- a/src/version.c
+++ b/src/version.c
@@ -747,6 +747,8 @@
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    1214,
+/**/
     1213,
 /**/
     1212,
