diff --git a/src/charset.c b/src/charset.c
index 4df4e7f..538d821 100644
--- a/src/charset.c
+++ b/src/charset.c
@@ -68,15 +68,15 @@
  * error, OK otherwise.
  */
     int
-init_chartab()
+init_chartab(void)
 {
     return buf_init_chartab(curbuf, TRUE);
 }
 
     int
-buf_init_chartab(buf, global)
-    buf_T	*buf;
-    int		global;		/* FALSE: only set buf->b_chartab[] */
+buf_init_chartab(
+    buf_T	*buf,
+    int		global)		/* FALSE: only set buf->b_chartab[] */
 {
     int		c;
     int		c2;
@@ -313,9 +313,9 @@
  * enough room, not all characters will be translated.
  */
     void
-trans_characters(buf, bufsize)
-    char_u	*buf;
-    int		bufsize;
+trans_characters(
+    char_u	*buf,
+    int		bufsize)
 {
     int		len;		/* length of string needing translation */
     int		room;		/* room in buffer after string */
@@ -356,8 +356,7 @@
  * printable chars.  Returns NULL when out of memory.
  */
     char_u *
-transstr(s)
-    char_u	*s;
+transstr(char_u *s)
 {
     char_u	*res;
     char_u	*p;
@@ -434,11 +433,11 @@
  * Otherwise puts the result in "buf[buflen]".
  */
     char_u *
-str_foldcase(str, orglen, buf, buflen)
-    char_u	*str;
-    int		orglen;
-    char_u	*buf;
-    int		buflen;
+str_foldcase(
+    char_u	*str,
+    int		orglen,
+    char_u	*buf,
+    int		buflen)
 {
     garray_T	ga;
     int		i;
@@ -552,8 +551,7 @@
 static char_u	transchar_buf[7];
 
     char_u *
-transchar(c)
-    int		c;
+transchar(int c)
 {
     int			i;
 
@@ -592,8 +590,7 @@
  * for an illegal UTF-8 byte.
  */
     char_u *
-transchar_byte(c)
-    int		c;
+transchar_byte(int c)
 {
     if (enc_utf8 && c >= 0x80)
     {
@@ -610,9 +607,7 @@
  * Does NOT work for multi-byte characters, c must be <= 255.
  */
     void
-transchar_nonprint(buf, c)
-    char_u	*buf;
-    int		c;
+transchar_nonprint(char_u *buf, int c)
 {
     if (c == NL)
 	c = NUL;		/* we use newline in place of a NUL */
@@ -679,9 +674,7 @@
 }
 
     void
-transchar_hex(buf, c)
-    char_u	*buf;
-    int		c;
+transchar_hex(char_u *buf, int c)
 {
     int		i = 0;
 
@@ -705,8 +698,7 @@
  * function key 1.
  */
     static unsigned
-nr2hex(c)
-    unsigned	c;
+nr2hex(unsigned c)
 {
     if ((c & 0xf) <= 9)
 	return (c & 0xf) + '0';
@@ -722,8 +714,7 @@
  * cells depends on further bytes.
  */
     int
-byte2cells(b)
-    int		b;
+byte2cells(int b)
 {
 #ifdef FEAT_MBYTE
     if (enc_utf8 && b >= 0x80)
@@ -738,8 +729,7 @@
  * A TAB is counted as two cells: "^I" or four: "<09>".
  */
     int
-char2cells(c)
-    int		c;
+char2cells(int c)
 {
     if (IS_SPECIAL(c))
 	return char2cells(K_SECOND(c)) + 2;
@@ -767,8 +757,7 @@
  * A TAB is counted as two cells: "^I" or four: "<09>".
  */
     int
-ptr2cells(p)
-    char_u	*p;
+ptr2cells(char_u *p)
 {
 #ifdef FEAT_MBYTE
     /* For UTF-8 we need to look at more bytes if the first byte is >= 0x80. */
@@ -784,8 +773,7 @@
  * counting TABs as two characters: "^I".
  */
     int
-vim_strsize(s)
-    char_u	*s;
+vim_strsize(char_u *s)
 {
     return vim_strnsize(s, (int)MAXCOL);
 }
@@ -795,9 +783,7 @@
  * screen, counting TABs as two characters: "^I".
  */
     int
-vim_strnsize(s, len)
-    char_u	*s;
-    int		len;
+vim_strnsize(char_u *s, int len)
 {
     int		size = 0;
 
@@ -839,9 +825,7 @@
 #if defined(FEAT_VREPLACE) || defined(FEAT_EX_EXTRA) || defined(FEAT_GUI) \
 	|| defined(FEAT_VIRTUALEDIT) || defined(PROTO)
     int
-chartabsize(p, col)
-    char_u	*p;
-    colnr_T	col;
+chartabsize(char_u *p, colnr_T col)
 {
     RET_WIN_BUF_CHARTABSIZE(curwin, curbuf, p, col)
 }
@@ -849,10 +833,7 @@
 
 #ifdef FEAT_LINEBREAK
     static int
-win_chartabsize(wp, p, col)
-    win_T	*wp;
-    char_u	*p;
-    colnr_T	col;
+win_chartabsize(win_T *wp, char_u *p, colnr_T col)
 {
     RET_WIN_BUF_CHARTABSIZE(wp, wp->w_buffer, p, col)
 }
@@ -863,8 +844,7 @@
  * taking into account the size of a tab.
  */
     int
-linetabsize(s)
-    char_u	*s;
+linetabsize(char_u *s)
 {
     return linetabsize_col(0, s);
 }
@@ -873,9 +853,7 @@
  * Like linetabsize(), but starting at column "startcol".
  */
     int
-linetabsize_col(startcol, s)
-    int		startcol;
-    char_u	*s;
+linetabsize_col(int startcol, char_u *s)
 {
     colnr_T	col = startcol;
     char_u	*line = s; /* pointer to start of line, for breakindent */
@@ -889,10 +867,7 @@
  * Like linetabsize(), but for a given window instead of the current one.
  */
     int
-win_linetabsize(wp, line, len)
-    win_T	*wp;
-    char_u	*line;
-    colnr_T	len;
+win_linetabsize(win_T *wp, char_u *line, colnr_T len)
 {
     colnr_T	col = 0;
     char_u	*s;
@@ -908,8 +883,7 @@
  * Letters and characters from the 'isident' option.
  */
     int
-vim_isIDc(c)
-    int c;
+vim_isIDc(int c)
 {
     return (c > 0 && c < 0x100 && (g_chartab[c] & CT_ID_CHAR));
 }
@@ -920,16 +894,13 @@
  * For multi-byte characters mb_get_class() is used (builtin rules).
  */
     int
-vim_iswordc(c)
-    int c;
+vim_iswordc(int c)
 {
     return vim_iswordc_buf(c, curbuf);
 }
 
     int
-vim_iswordc_buf(c, buf)
-    int		c;
-    buf_T	*buf;
+vim_iswordc_buf(int c, buf_T *buf)
 {
 #ifdef FEAT_MBYTE
     if (c >= 0x100)
@@ -947,8 +918,7 @@
  * Just like vim_iswordc() but uses a pointer to the (multi-byte) character.
  */
     int
-vim_iswordp(p)
-    char_u *p;
+vim_iswordp(char_u *p)
 {
 #ifdef FEAT_MBYTE
     if (has_mbyte && MB_BYTE2LEN(*p) > 1)
@@ -958,9 +928,7 @@
 }
 
     int
-vim_iswordp_buf(p, buf)
-    char_u	*p;
-    buf_T	*buf;
+vim_iswordp_buf(char_u *p, buf_T *buf)
 {
 #ifdef FEAT_MBYTE
     if (has_mbyte && MB_BYTE2LEN(*p) > 1)
@@ -974,8 +942,7 @@
  * Assume characters above 0x100 are valid (multi-byte).
  */
     int
-vim_isfilec(c)
-    int	c;
+vim_isfilec(int c)
 {
     return (c >= 0x100 || (c > 0 && (g_chartab[c] & CT_FNAME_CHAR)));
 }
@@ -987,8 +954,7 @@
  * returns false.
  */
     int
-vim_isfilec_or_wc(c)
-    int c;
+vim_isfilec_or_wc(int c)
 {
     char_u buf[2];
 
@@ -1003,8 +969,7 @@
  * Unicode.
  */
     int
-vim_isprintc(c)
-    int c;
+vim_isprintc(int c)
 {
 #ifdef FEAT_MBYTE
     if (enc_utf8 && c >= 0x100)
@@ -1018,8 +983,7 @@
  * byte of a double-byte character.
  */
     int
-vim_isprintc_strict(c)
-    int	c;
+vim_isprintc_strict(int c)
 {
 #ifdef FEAT_MBYTE
     if (enc_dbcs != 0 && c < 0x100 && MB_BYTE2LEN(c) > 1)
@@ -1034,10 +998,10 @@
  * like chartabsize(), but also check for line breaks on the screen
  */
     int
-lbr_chartabsize(line, s, col)
-    char_u		*line UNUSED; /* start of the line */
-    unsigned char	*s;
-    colnr_T		col;
+lbr_chartabsize(
+    char_u		*line UNUSED, /* start of the line */
+    unsigned char	*s,
+    colnr_T		col)
 {
 #ifdef FEAT_LINEBREAK
     if (!curwin->w_p_lbr && *p_sbr == NUL && !curwin->w_p_bri)
@@ -1058,10 +1022,10 @@
  * Call lbr_chartabsize() and advance the pointer.
  */
     int
-lbr_chartabsize_adv(line, s, col)
-    char_u	*line; /* start of the line */
-    char_u	**s;
-    colnr_T	col;
+lbr_chartabsize_adv(
+    char_u	*line, /* start of the line */
+    char_u	**s,
+    colnr_T	col)
 {
     int		retval;
 
@@ -1078,12 +1042,12 @@
  * value, init to 0 before calling.
  */
     int
-win_lbr_chartabsize(wp, line, s, col, headp)
-    win_T	*wp;
-    char_u	*line UNUSED; /* start of the line */
-    char_u	*s;
-    colnr_T	col;
-    int		*headp UNUSED;
+win_lbr_chartabsize(
+    win_T	*wp,
+    char_u	*line UNUSED, /* start of the line */
+    char_u	*s,
+    colnr_T	col,
+    int		*headp UNUSED)
 {
 #ifdef FEAT_LINEBREAK
     int		c;
@@ -1254,11 +1218,11 @@
  * doesn't fit at the end of the screen line.
  */
     static int
-win_nolbr_chartabsize(wp, s, col, headp)
-    win_T	*wp;
-    char_u	*s;
-    colnr_T	col;
-    int		*headp;
+win_nolbr_chartabsize(
+    win_T	*wp,
+    char_u	*s,
+    colnr_T	col,
+    int		*headp)
 {
     int		n;
 
@@ -1284,9 +1248,7 @@
  * "wp".
  */
     int
-in_win_border(wp, vcol)
-    win_T	*wp;
-    colnr_T	vcol;
+in_win_border(win_T *wp, colnr_T vcol)
 {
     int		width1;		/* width of first line (after line number) */
     int		width2;		/* width of further lines */
@@ -1316,12 +1278,12 @@
  * This is used very often, keep it fast!
  */
     void
-getvcol(wp, pos, start, cursor, end)
-    win_T	*wp;
-    pos_T	*pos;
-    colnr_T	*start;
-    colnr_T	*cursor;
-    colnr_T	*end;
+getvcol(
+    win_T	*wp,
+    pos_T	*pos,
+    colnr_T	*start,
+    colnr_T	*cursor,
+    colnr_T	*end)
 {
     colnr_T	vcol;
     char_u	*ptr;		/* points to current char */
@@ -1446,8 +1408,7 @@
  * Get virtual cursor column in the current window, pretending 'list' is off.
  */
     colnr_T
-getvcol_nolist(posp)
-    pos_T	*posp;
+getvcol_nolist(pos_T *posp)
 {
     int		list_save = curwin->w_p_list;
     colnr_T	vcol;
@@ -1463,12 +1424,12 @@
  * Get virtual column in virtual mode.
  */
     void
-getvvcol(wp, pos, start, cursor, end)
-    win_T	*wp;
-    pos_T	*pos;
-    colnr_T	*start;
-    colnr_T	*cursor;
-    colnr_T	*end;
+getvvcol(
+    win_T	*wp,
+    pos_T	*pos,
+    colnr_T	*start,
+    colnr_T	*cursor,
+    colnr_T	*end)
 {
     colnr_T	col;
     colnr_T	coladd;
@@ -1519,10 +1480,12 @@
  * Used for Visual block mode.
  */
     void
-getvcols(wp, pos1, pos2, left, right)
-    win_T	*wp;
-    pos_T	*pos1, *pos2;
-    colnr_T	*left, *right;
+getvcols(
+    win_T	*wp,
+    pos_T	*pos1,
+    pos_T	*pos2,
+    colnr_T	*left,
+    colnr_T	*right)
 {
     colnr_T	from1, from2, to1, to2;
 
@@ -1555,8 +1518,7 @@
  * skipwhite: skip over ' ' and '\t'.
  */
     char_u *
-skipwhite(q)
-    char_u	*q;
+skipwhite(char_u *q)
 {
     char_u	*p = q;
 
@@ -1569,8 +1531,7 @@
  * skip over digits
  */
     char_u *
-skipdigits(q)
-    char_u	*q;
+skipdigits(char_u *q)
 {
     char_u	*p = q;
 
@@ -1584,8 +1545,7 @@
  * skip over binary digits
  */
     char_u *
-skipbin(q)
-    char_u	*q;
+skipbin(char_u *q)
 {
     char_u	*p = q;
 
@@ -1598,8 +1558,7 @@
  * skip over digits and hex characters
  */
     char_u *
-skiphex(q)
-    char_u	*q;
+skiphex(char_u *q)
 {
     char_u	*p = q;
 
@@ -1614,8 +1573,7 @@
  * skip to bin digit (or NUL after the string)
  */
     char_u *
-skiptobin(q)
-    char_u	*q;
+skiptobin(char_u *q)
 {
     char_u	*p = q;
 
@@ -1628,8 +1586,7 @@
  * skip to digit (or NUL after the string)
  */
     char_u *
-skiptodigit(q)
-    char_u	*q;
+skiptodigit(char_u *q)
 {
     char_u	*p = q;
 
@@ -1642,8 +1599,7 @@
  * skip to hex character (or NUL after the string)
  */
     char_u *
-skiptohex(q)
-    char_u	*q;
+skiptohex(char_u *q)
 {
     char_u	*p = q;
 
@@ -1660,8 +1616,7 @@
  * Use the VIM_ISDIGIT() macro for simple arguments.
  */
     int
-vim_isdigit(c)
-    int		c;
+vim_isdigit(int c)
 {
     return (c >= '0' && c <= '9');
 }
@@ -1672,8 +1627,7 @@
  * superscript 1 to be a digit.
  */
     int
-vim_isxdigit(c)
-    int		c;
+vim_isxdigit(int c)
 {
     return (c >= '0' && c <= '9')
 	|| (c >= 'a' && c <= 'f')
@@ -1685,8 +1639,7 @@
  * characters > 0x100.
  */
     int
-vim_isbdigit(c)
-    int		c;
+vim_isbdigit(int c)
 {
     return (c == '0' || c == '1');
 }
@@ -1706,8 +1659,7 @@
 static char_u latin1lower[257] = "                                 !\"#$%&'()*+,-./0123456789:;<=>?@abcdefghijklmnopqrstuvwxyz[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xd7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff";
 
     int
-vim_islower(c)
-    int	    c;
+vim_islower(int c)
 {
     if (c <= '@')
 	return FALSE;
@@ -1731,8 +1683,7 @@
 }
 
     int
-vim_isupper(c)
-    int	    c;
+vim_isupper(int c)
 {
     if (c <= '@')
 	return FALSE;
@@ -1756,8 +1707,7 @@
 }
 
     int
-vim_toupper(c)
-    int	    c;
+vim_toupper(int c)
 {
     if (c <= '@')
 	return c;
@@ -1781,8 +1731,7 @@
 }
 
     int
-vim_tolower(c)
-    int	    c;
+vim_tolower(int c)
 {
     if (c <= '@')
 	return c;
@@ -1810,8 +1759,7 @@
  * skiptowhite: skip over text until ' ' or '\t' or NUL.
  */
     char_u *
-skiptowhite(p)
-    char_u	*p;
+skiptowhite(char_u *p)
 {
     while (*p != ' ' && *p != '\t' && *p != NUL)
 	++p;
@@ -1824,8 +1772,7 @@
  * skiptowhite_esc: Like skiptowhite(), but also skip escaped chars
  */
     char_u *
-skiptowhite_esc(p)
-    char_u	*p;
+skiptowhite_esc(char_u *p)
 {
     while (*p != ' ' && *p != '\t' && *p != NUL)
     {
@@ -1842,8 +1789,7 @@
  * Note: the argument is a pointer to a char_u pointer!
  */
     long
-getdigits(pp)
-    char_u **pp;
+getdigits(char_u **pp)
 {
     char_u	*p;
     long	retval;
@@ -1861,8 +1807,7 @@
  * Return TRUE if "lbuf" is empty or only contains blanks.
  */
     int
-vim_isblankline(lbuf)
-    char_u	*lbuf;
+vim_isblankline(char_u *lbuf)
 {
     char_u	*p;
 
@@ -1890,16 +1835,16 @@
  * If maxlen > 0, check at a maximum maxlen chars
  */
     void
-vim_str2nr(start, prep, len, what, nptr, unptr, maxlen)
-    char_u		*start;
-    int			*prep;	    /* return: type of number 0 = decimal, 'x'
+vim_str2nr(
+    char_u		*start,
+    int			*prep,	    /* return: type of number 0 = decimal, 'x'
 				       or 'X' is hex, '0' = octal, 'b' or 'B'
 				       is bin */
-    int			*len;	    /* return: detected length of number */
-    int			what;	    /* what numbers to recognize */
-    long		*nptr;	    /* return: signed result */
-    unsigned long	*unptr;	    /* return: unsigned result */
-    int			maxlen;     /* max length of string to check */
+    int			*len,	    /* return: detected length of number */
+    int			what,	    /* what numbers to recognize */
+    long		*nptr,	    /* return: signed result */
+    unsigned long	*unptr,	    /* return: unsigned result */
+    int			maxlen)     /* max length of string to check */
 {
     char_u	    *ptr = start;
     int		    pre = 0;		/* default is decimal */
@@ -2024,8 +1969,7 @@
  * Only valid when the argument is '0' - '9', 'A' - 'F' or 'a' - 'f'.
  */
     int
-hex2nr(c)
-    int		c;
+hex2nr(int c)
 {
     if (c >= 'a' && c <= 'f')
 	return c - 'a' + 10;
@@ -2041,8 +1985,7 @@
  * Return -1 if one of the characters is not hex.
  */
     int
-hexhex2nr(p)
-    char_u	*p;
+hexhex2nr(char_u *p)
 {
     if (!vim_isxdigit(p[0]) || !vim_isxdigit(p[1]))
 	return -1;
@@ -2064,8 +2007,7 @@
  * characters.
  */
     int
-rem_backslash(str)
-    char_u  *str;
+rem_backslash(char_u *str)
 {
 #ifdef BACKSLASH_IN_FILENAME
     return (str[0] == '\\'
@@ -2088,8 +2030,7 @@
  * is not a normal file character.
  */
     void
-backslash_halve(p)
-    char_u	*p;
+backslash_halve(char_u *p)
 {
     for ( ; *p; ++p)
 	if (rem_backslash(p))
@@ -2100,8 +2041,7 @@
  * backslash_halve() plus save the result in allocated memory.
  */
     char_u *
-backslash_halve_save(p)
-    char_u	*p;
+backslash_halve_save(char_u *p)
 {
     char_u	*res;
 
@@ -2159,9 +2099,7 @@
  * wanting 7-bit ASCII characters out the other end.
  */
     void
-ebcdic2ascii(buffer, len)
-    char_u	*buffer;
-    int		len;
+ebcdic2ascii(char_u *buffer, int len)
 {
     int		i;
 
