diff --git a/src/po/sjiscorr.c b/src/po/sjiscorr.c
index b8f7e63..a0b09f0 100644
--- a/src/po/sjiscorr.c
+++ b/src/po/sjiscorr.c
@@ -7,9 +7,7 @@
 #include <string.h>
 
 	int
-main(argc, argv)
-	int	argc;
-	char	**argv;
+main(int argc, char **argv);
 {
 	char buffer[BUFSIZ];
 	char *p;
diff --git a/src/version.c b/src/version.c
index 43837f5..5c21b6a 100644
--- a/src/version.c
+++ b/src/version.c
@@ -36,7 +36,7 @@
 						      + sizeof(__TIME__) + 3];
 
     void
-make_version()
+make_version(void)
 {
     /*
      * Construct the long version string.  Necessary because
@@ -747,6 +747,8 @@
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    1215,
+/**/
     1214,
 /**/
     1213,
@@ -3192,7 +3194,7 @@
 };
 
     int
-highest_patch()
+highest_patch(void)
 {
     int		i;
     int		h = 0;
@@ -3208,8 +3210,7 @@
  * Return TRUE if patch "n" has been included.
  */
     int
-has_patch(n)
-    int		n;
+has_patch(int n)
 {
     int		i;
 
@@ -3221,8 +3222,7 @@
 #endif
 
     void
-ex_version(eap)
-    exarg_T	*eap;
+ex_version(exarg_T *eap)
 {
     /*
      * Ignore a ":version 9.99" command.
@@ -3238,7 +3238,7 @@
  * List all features aligned in columns, dictionary style.
  */
     static void
-list_features()
+list_features(void)
 {
     int		i;
     int		ncol;
@@ -3305,7 +3305,7 @@
 }
 
     void
-list_version()
+list_version(void)
 {
     int		i;
     int		first;
@@ -3598,8 +3598,7 @@
  * newline, unless the message is too long to fit on the screen anyway.
  */
     static void
-version_msg(s)
-    char	*s;
+version_msg(char *s)
 {
     int		len = (int)STRLEN(s);
 
@@ -3616,7 +3615,7 @@
  * Show the intro message when not editing a file.
  */
     void
-maybe_intro_message()
+maybe_intro_message(void)
 {
     if (bufempty()
 	    && curbuf->b_fname == NULL
@@ -3633,8 +3632,8 @@
  * Or with the ":intro" command (for Sven :-).
  */
     void
-intro_message(colon)
-    int		colon;		/* TRUE for ":intro" */
+intro_message(
+    int		colon)		/* TRUE for ":intro" */
 {
     int		i;
     int		row;
@@ -3765,11 +3764,11 @@
 }
 
     static void
-do_intro_line(row, mesg, add_version, attr)
-    int		row;
-    char_u	*mesg;
-    int		add_version;
-    int		attr;
+do_intro_line(
+    int		row,
+    char_u	*mesg,
+    int		add_version,
+    int		attr)
 {
     char_u	vers[20];
     int		col;
@@ -3842,8 +3841,7 @@
  * ":intro": clear screen, display intro screen and wait for return.
  */
     void
-ex_intro(eap)
-    exarg_T	*eap UNUSED;
+ex_intro(exarg_T *eap UNUSED)
 {
     screenclear();
     intro_message(TRUE);
diff --git a/src/winclip.c b/src/winclip.c
index f34c7d9..8ab723f 100644
--- a/src/winclip.c
+++ b/src/winclip.c
@@ -779,11 +779,11 @@
  * The result is in allocated memory: "out[outlen]".  With terminating NUL.
  */
     void
-acp_to_enc(str, str_size, out, outlen)
-    char_u	*str;
-    int		str_size;
-    char_u	**out;
-    int		*outlen;
+acp_to_enc(
+    char_u	*str,
+    int		str_size,
+    char_u	**out,
+    int		*outlen)
 
 {
     LPWSTR	widestr;
@@ -804,11 +804,11 @@
  * The result is in allocated memory: "out[outlen]".  With terminating NUL.
  */
     void
-enc_to_acp(str, str_size, out, outlen)
-    char_u	*str;
-    int		str_size;
-    char_u	**out;
-    int		*outlen;
+enc_to_acp(
+    char_u	*str,
+    int		str_size,
+    char_u	**out,
+    int		*outlen)
 
 {
     LPWSTR	widestr;
diff --git a/src/window.c b/src/window.c
index a8f5fb4..ae17660 100644
--- a/src/window.c
+++ b/src/window.c
@@ -95,10 +95,10 @@
  * all CTRL-W window commands are handled here, called from normal_cmd().
  */
     void
-do_window(nchar, Prenum, xchar)
-    int		nchar;
-    long	Prenum;
-    int		xchar;	    /* extra char from ":wincmd gx" or NUL */
+do_window(
+    int		nchar,
+    long	Prenum,
+    int		xchar)	    /* extra char from ":wincmd gx" or NUL */
 {
     long	Prenum1;
     win_T	*wp;
@@ -627,9 +627,7 @@
  * Figure out the address type for ":wnncmd".
  */
     void
-get_wincmd_addr_type(arg, eap)
-    char_u	*arg;
-    exarg_T	*eap;
+get_wincmd_addr_type(char_u *arg, exarg_T *eap)
 {
     switch (*arg)
     {
@@ -728,11 +726,11 @@
 }
 
     static void
-cmd_with_count(cmd, bufp, bufsize, Prenum)
-    char	*cmd;
-    char_u	*bufp;
-    size_t	bufsize;
-    long	Prenum;
+cmd_with_count(
+    char	*cmd,
+    char_u	*bufp,
+    size_t	bufsize,
+    long	Prenum)
 {
     size_t	len = STRLEN(cmd);
 
@@ -757,9 +755,7 @@
  * return FAIL for failure, OK otherwise
  */
     int
-win_split(size, flags)
-    int		size;
-    int		flags;
+win_split(int size, int flags)
 {
     /* When the ":tab" modifier was used open a new tab page instead. */
     if (may_open_tabpage() == OK)
@@ -790,11 +786,11 @@
  * return FAIL for failure, OK otherwise
  */
     int
-win_split_ins(size, flags, new_wp, dir)
-    int		size;
-    int		flags;
-    win_T	*new_wp;
-    int		dir;
+win_split_ins(
+    int		size,
+    int		flags,
+    win_T	*new_wp,
+    int		dir)
 {
     win_T	*wp = new_wp;
     win_T	*oldwin;
@@ -1334,10 +1330,7 @@
  * being copied.
  */
     static void
-win_init(newp, oldp, flags)
-    win_T	*newp;
-    win_T	*oldp;
-    int		 flags UNUSED;
+win_init(win_T *newp, win_T *oldp, int flags UNUSED)
 {
     int		i;
 
@@ -1403,9 +1396,7 @@
  * Only the essential things are copied.
  */
     static void
-win_init_some(newp, oldp)
-    win_T	*newp;
-    win_T	*oldp;
+win_init_some(win_T *newp, win_T *oldp)
 {
     /* Use the same argument list. */
     newp->w_alist = oldp->w_alist;
@@ -1423,8 +1414,7 @@
  * Check if "win" is a pointer to an existing window.
  */
     int
-win_valid(win)
-    win_T	*win;
+win_valid(win_T *win)
 {
     win_T	*wp;
 
@@ -1440,7 +1430,7 @@
  * Return the number of windows.
  */
     int
-win_count()
+win_count(void)
 {
     win_T	*wp;
     int		count = 0;
@@ -1457,9 +1447,9 @@
  * (excluding the command line).
  */
     int
-make_windows(count, vertical)
-    int		count;
-    int		vertical UNUSED;  /* split windows vertically if TRUE */
+make_windows(
+    int		count,
+    int		vertical UNUSED)  /* split windows vertically if TRUE */
 {
     int		maxcount;
     int		todo;
@@ -1529,8 +1519,7 @@
  * Exchange current and next window
  */
     static void
-win_exchange(Prenum)
-    long	Prenum;
+win_exchange(long Prenum)
 {
     frame_T	*frp;
     frame_T	*frp2;
@@ -1634,9 +1623,7 @@
  *		   if upwards FALSE the first window becomes the second one
  */
     static void
-win_rotate(upwards, count)
-    int		upwards;
-    int		count;
+win_rotate(int upwards, int count)
 {
     win_T	*wp1;
     win_T	*wp2;
@@ -1723,9 +1710,7 @@
  * Move the current window to the very top/bottom/left/right of the screen.
  */
     static void
-win_totop(size, flags)
-    int		size;
-    int		flags;
+win_totop(int size, int flags)
 {
     int		dir;
     int		height = curwin->w_height;
@@ -1763,8 +1748,7 @@
  * window.  Only works within the same frame!
  */
     void
-win_move_after(win1, win2)
-    win_T	*win1, *win2;
+win_move_after(win_T *win1, win_T *win2)
 {
     int		height;
 
@@ -1828,10 +1812,10 @@
  * rows.
  */
     void
-win_equal(next_curwin, current, dir)
-    win_T	*next_curwin;	/* pointer to current window to be or NULL */
-    int		current;	/* do only frame with current window */
-    int		dir;		/* 'v' for vertically, 'h' for horizontally,
+win_equal(
+    win_T	*next_curwin,	/* pointer to current window to be or NULL */
+    int		current,	/* do only frame with current window */
+    int		dir)		/* 'v' for vertically, 'h' for horizontally,
 				   'b' for both, 0 for using p_ead */
 {
     if (dir == 0)
@@ -1852,15 +1836,15 @@
  * 'winheight' and 'winwidth' if possible.
  */
     static void
-win_equal_rec(next_curwin, current, topfr, dir, col, row, width, height)
-    win_T	*next_curwin;	/* pointer to current window to be or NULL */
-    int		current;	/* do only frame with current window */
-    frame_T	*topfr;		/* frame to set size off */
-    int		dir;		/* 'v', 'h' or 'b', see win_equal() */
-    int		col;		/* horizontal position for frame */
-    int		row;		/* vertical position for frame */
-    int		width;		/* new width of frame */
-    int		height;		/* new height of frame */
+win_equal_rec(
+    win_T	*next_curwin,	/* pointer to current window to be or NULL */
+    int		current,	/* do only frame with current window */
+    frame_T	*topfr,		/* frame to set size off */
+    int		dir,		/* 'v', 'h' or 'b', see win_equal() */
+    int		col,		/* horizontal position for frame */
+    int		row,		/* vertical position for frame */
+    int		width,		/* new width of frame */
+    int		height)		/* new height of frame */
 {
     int		n, m;
     int		extra_sep = 0;
@@ -2183,9 +2167,9 @@
  * close all windows for buffer 'buf'
  */
     void
-close_windows(buf, keep_curwin)
-    buf_T	*buf;
-    int		keep_curwin;	    /* don't close "curwin" */
+close_windows(
+    buf_T	*buf,
+    int		keep_curwin)	    /* don't close "curwin" */
 {
     win_T	*wp;
     tabpage_T   *tp, *nexttp;
@@ -2244,7 +2228,7 @@
  * Returns FALSE if there is a window, possibly in another tab page.
  */
     static int
-last_window()
+last_window(void)
 {
     return (one_window() && first_tabpage->tp_next == NULL);
 }
@@ -2254,7 +2238,7 @@
  * current tab page.
  */
     int
-one_window()
+one_window(void)
 {
 #ifdef FEAT_AUTOCMD
     win_T	*wp;
@@ -2280,10 +2264,10 @@
  * Returns TRUE when the window was closed already.
  */
     static int
-close_last_window_tabpage(win, free_buf, prev_curtab)
-    win_T	*win;
-    int		free_buf;
-    tabpage_T   *prev_curtab;
+close_last_window_tabpage(
+    win_T	*win,
+    int		free_buf,
+    tabpage_T   *prev_curtab)
 {
     if (firstwin == lastwin)
     {
@@ -2333,9 +2317,7 @@
  * Returns FAIL when the window was not closed.
  */
     int
-win_close(win, free_buf)
-    win_T	*win;
-    int		free_buf;
+win_close(win_T *win, int free_buf)
 {
     win_T	*wp;
 #ifdef FEAT_AUTOCMD
@@ -2557,10 +2539,7 @@
  * updated.
  */
     void
-win_close_othertab(win, free_buf, tp)
-    win_T	*win;
-    int		free_buf;
-    tabpage_T	*tp;
+win_close_othertab(win_T *win, int free_buf, tabpage_T *tp)
 {
     win_T	*wp;
     int		dir;
@@ -2620,10 +2599,10 @@
  * Returns a pointer to the window that got the freed up space.
  */
     static win_T *
-win_free_mem(win, dirp, tp)
-    win_T	*win;
-    int		*dirp;		/* set to 'v' or 'h' for direction if 'ea' */
-    tabpage_T	*tp;		/* tab page "win" is in, NULL for current */
+win_free_mem(
+    win_T	*win,
+    int		*dirp,		/* set to 'v' or 'h' for direction if 'ea' */
+    tabpage_T	*tp)		/* tab page "win" is in, NULL for current */
 {
     frame_T	*frp;
     win_T	*wp;
@@ -2644,7 +2623,7 @@
 
 #if defined(EXITFREE) || defined(PROTO)
     void
-win_free_all()
+win_free_all(void)
 {
     int		dummy;
 
@@ -2675,10 +2654,10 @@
  * Returns a pointer to the window that got the freed up space.
  */
     win_T *
-winframe_remove(win, dirp, tp)
-    win_T	*win;
-    int		*dirp UNUSED;	/* set to 'v' or 'h' for direction if 'ea' */
-    tabpage_T	*tp;		/* tab page "win" is in, NULL for current */
+winframe_remove(
+    win_T	*win,
+    int		*dirp UNUSED,	/* set to 'v' or 'h' for direction if 'ea' */
+    tabpage_T	*tp)		/* tab page "win" is in, NULL for current */
 {
     frame_T	*frp, *frp2, *frp3;
     frame_T	*frp_close = win->w_frame;
@@ -2839,9 +2818,9 @@
  * layout.
  */
     static frame_T *
-win_altframe(win, tp)
-    win_T	*win;
-    tabpage_T	*tp;		/* tab page "win" is in, NULL for current */
+win_altframe(
+    win_T	*win,
+    tabpage_T	*tp)		/* tab page "win" is in, NULL for current */
 {
     frame_T	*frp;
     int		b;
@@ -2866,7 +2845,7 @@
  * Return the tabpage that will be used if the current one is closed.
  */
     static tabpage_T *
-alt_tabpage()
+alt_tabpage(void)
 {
     tabpage_T	*tp;
 
@@ -2884,8 +2863,7 @@
  * Find the left-upper window in frame "frp".
  */
     static win_T *
-frame2win(frp)
-    frame_T	*frp;
+frame2win(frame_T *frp)
 {
     while (frp->fr_win == NULL)
 	frp = frp->fr_child;
@@ -2896,9 +2874,7 @@
  * Return TRUE if frame "frp" contains window "wp".
  */
     static int
-frame_has_win(frp, wp)
-    frame_T	*frp;
-    win_T	*wp;
+frame_has_win(frame_T *frp, win_T *wp)
 {
     frame_T	*p;
 
@@ -2916,11 +2892,11 @@
  * frames and windows.  Caller must take care of positions.
  */
     static void
-frame_new_height(topfrp, height, topfirst, wfh)
-    frame_T	*topfrp;
-    int		height;
-    int		topfirst;	/* resize topmost contained frame first */
-    int		wfh;		/* obey 'winfixheight' when there is a choice;
+frame_new_height(
+    frame_T	*topfrp,
+    int		height,
+    int		topfirst,	/* resize topmost contained frame first */
+    int		wfh)		/* obey 'winfixheight' when there is a choice;
 				   may cause the height not to be set */
 {
     frame_T	*frp;
@@ -3027,8 +3003,7 @@
  * the 'winfixheight' option.
  */
     static int
-frame_fixed_height(frp)
-    frame_T	*frp;
+frame_fixed_height(frame_T *frp)
 {
     /* frame with one window: fixed height if 'winfixheight' set. */
     if (frp->fr_win != NULL)
@@ -3058,8 +3033,7 @@
  * the 'winfixwidth' option.
  */
     static int
-frame_fixed_width(frp)
-    frame_T	*frp;
+frame_fixed_width(frame_T *frp)
 {
     /* frame with one window: fixed width if 'winfixwidth' set. */
     if (frp->fr_win != NULL)
@@ -3088,8 +3062,7 @@
  * Note: Does not check if there is room!
  */
     static void
-frame_add_statusline(frp)
-    frame_T	*frp;
+frame_add_statusline(frame_T *frp)
 {
     win_T	*wp;
 
@@ -3123,11 +3096,11 @@
  * May remove separator line for windows at the right side (for win_close()).
  */
     static void
-frame_new_width(topfrp, width, leftfirst, wfw)
-    frame_T	*topfrp;
-    int		width;
-    int		leftfirst;	/* resize leftmost contained frame first */
-    int		wfw;		/* obey 'winfixwidth' when there is a choice;
+frame_new_width(
+    frame_T	*topfrp,
+    int		width,
+    int		leftfirst,	/* resize leftmost contained frame first */
+    int		wfw)		/* obey 'winfixwidth' when there is a choice;
 				   may cause the width not to be set */
 {
     frame_T	*frp;
@@ -3238,8 +3211,7 @@
  * Note: Does not check if there is room!
  */
     static void
-frame_add_vsep(frp)
-    frame_T	*frp;
+frame_add_vsep(frame_T *frp)
 {
     win_T	*wp;
 
@@ -3273,8 +3245,7 @@
  * Set frame width from the window it contains.
  */
     static void
-frame_fix_width(wp)
-    win_T	*wp;
+frame_fix_width(win_T *wp)
 {
     wp->w_frame->fr_width = wp->w_width + wp->w_vsep_width;
 }
@@ -3284,8 +3255,7 @@
  * Set frame height from the window it contains.
  */
     static void
-frame_fix_height(wp)
-    win_T	*wp;
+frame_fix_height(win_T *wp)
 {
     wp->w_frame->fr_height = wp->w_height + wp->w_status_height;
 }
@@ -3298,9 +3268,7 @@
  * window.
  */
     static int
-frame_minheight(topfrp, next_curwin)
-    frame_T	*topfrp;
-    win_T	*next_curwin;
+frame_minheight(frame_T *topfrp, win_T *next_curwin)
 {
     frame_T	*frp;
     int		m;
@@ -3353,9 +3321,9 @@
  * window.
  */
     static int
-frame_minwidth(topfrp, next_curwin)
-    frame_T	*topfrp;
-    win_T	*next_curwin;	/* use p_wh and p_wiw for next_curwin */
+frame_minwidth(
+    frame_T	*topfrp,
+    win_T	*next_curwin)	/* use p_wh and p_wiw for next_curwin */
 {
     frame_T	*frp;
     int		m, n;
@@ -3405,9 +3373,9 @@
  * Used by ":bdel" and ":only".
  */
     void
-close_others(message, forceit)
-    int		message;
-    int		forceit;	    /* always hide all other windows */
+close_others(
+    int		message,
+    int		forceit)	    /* always hide all other windows */
 {
     win_T	*wp;
     win_T	*nextwp;
@@ -3473,14 +3441,13 @@
  * Called when a new file is being edited.
  */
     void
-curwin_init()
+curwin_init(void)
 {
     win_init_empty(curwin);
 }
 
     void
-win_init_empty(wp)
-    win_T *wp;
+win_init_empty(win_T *wp)
 {
     redraw_win_later(wp, NOT_VALID);
     wp->w_lines_valid = 0;
@@ -3515,7 +3482,7 @@
  * Return FAIL when something goes wrong (out of memory).
  */
     int
-win_alloc_first()
+win_alloc_first(void)
 {
     if (win_alloc_firstwin(NULL) == FAIL)
 	return FAIL;
@@ -3537,7 +3504,7 @@
  * window is fully initialized, thus it can't be in win_alloc_first().
  */
     void
-win_alloc_aucmd_win()
+win_alloc_aucmd_win(void)
 {
     aucmd_win = win_alloc(NULL, TRUE);
     if (aucmd_win != NULL)
@@ -3557,8 +3524,7 @@
  * Return FAIL when something goes wrong (out of memory).
  */
     static int
-win_alloc_firstwin(oldwin)
-    win_T	*oldwin;
+win_alloc_firstwin(win_T *oldwin)
 {
     curwin = win_alloc(NULL, FALSE);
     if (oldwin == NULL)
@@ -3622,7 +3588,7 @@
  * Initialize the window and frame size to the maximum.
  */
     void
-win_init_size()
+win_init_size(void)
 {
     firstwin->w_height = ROWS_AVAIL;
     topframe->fr_height = ROWS_AVAIL;
@@ -3639,7 +3605,7 @@
  * Returns NULL when out of memory.
  */
     static tabpage_T *
-alloc_tabpage()
+alloc_tabpage(void)
 {
     tabpage_T	*tp;
 # ifdef FEAT_GUI
@@ -3675,8 +3641,7 @@
 }
 
     void
-free_tabpage(tp)
-    tabpage_T	*tp;
+free_tabpage(tabpage_T *tp)
 {
     int idx;
 
@@ -3710,8 +3675,7 @@
  * Return FAIL or OK.
  */
     int
-win_new_tabpage(after)
-    int		after;
+win_new_tabpage(int after)
 {
     tabpage_T	*tp = curtab;
     tabpage_T	*newtp;
@@ -3784,7 +3748,7 @@
  * Returns OK if a new tab page was created, FAIL otherwise.
  */
     int
-may_open_tabpage()
+may_open_tabpage(void)
 {
     int		n = (cmdmod.tab == 0) ? postponed_split_tab : cmdmod.tab;
 
@@ -3802,8 +3766,7 @@
  * Returns the number of resulting tab pages.
  */
     int
-make_tabpages(maxcount)
-    int		maxcount;
+make_tabpages(int maxcount)
 {
     int		count = maxcount;
     int		todo;
@@ -3836,8 +3799,7 @@
  * Return TRUE when "tpc" points to a valid tab page.
  */
     int
-valid_tabpage(tpc)
-    tabpage_T	*tpc;
+valid_tabpage(tabpage_T *tpc)
 {
     tabpage_T	*tp;
 
@@ -3851,8 +3813,7 @@
  * Find tab page "n" (first one is 1).  Returns NULL when not found.
  */
     tabpage_T *
-find_tabpage(n)
-    int		n;
+find_tabpage(int n)
 {
     tabpage_T	*tp;
     int		i = 1;
@@ -3867,8 +3828,7 @@
  * When not found returns number of tab pages plus one.
  */
     int
-tabpage_index(ftp)
-    tabpage_T	*ftp;
+tabpage_index(tabpage_T *ftp)
 {
     int		i = 1;
     tabpage_T	*tp;
@@ -3885,10 +3845,10 @@
  * Careful: When OK is returned need to get a new tab page very very soon!
  */
     static int
-leave_tabpage(new_curbuf, trigger_leave_autocmds)
-    buf_T	*new_curbuf UNUSED;    /* what is going to be the new curbuf,
+leave_tabpage(
+    buf_T	*new_curbuf UNUSED,    /* what is going to be the new curbuf,
 				       NULL if unknown */
-    int		trigger_leave_autocmds UNUSED;
+    int		trigger_leave_autocmds UNUSED)
 {
     tabpage_T	*tp = curtab;
 
@@ -3933,11 +3893,11 @@
  * Only trigger *Leave autocommands when trigger_leave_autocmds is TRUE.
  */
     static void
-enter_tabpage(tp, old_curbuf, trigger_enter_autocmds, trigger_leave_autocmds)
-    tabpage_T	*tp;
-    buf_T	*old_curbuf UNUSED;
-    int		trigger_enter_autocmds UNUSED;
-    int		trigger_leave_autocmds UNUSED;
+enter_tabpage(
+    tabpage_T	*tp,
+    buf_T	*old_curbuf UNUSED,
+    int		trigger_enter_autocmds UNUSED,
+    int		trigger_leave_autocmds UNUSED)
 {
     int		old_off = tp->tp_firstwin->w_winrow;
     win_T	*next_prevwin = tp->tp_prevwin;
@@ -4002,8 +3962,7 @@
  * When "n" is 9999 go to the last tab page.
  */
     void
-goto_tabpage(n)
-    int	    n;
+goto_tabpage(int n)
 {
     tabpage_T	*tp;
     tabpage_T	*ttp;
@@ -4082,10 +4041,10 @@
  * Note: doesn't update the GUI tab.
  */
     void
-goto_tabpage_tp(tp, trigger_enter_autocmds, trigger_leave_autocmds)
-    tabpage_T	*tp;
-    int		trigger_enter_autocmds;
-    int		trigger_leave_autocmds;
+goto_tabpage_tp(
+    tabpage_T	*tp,
+    int		trigger_enter_autocmds,
+    int		trigger_leave_autocmds)
 {
     /* Don't repeat a message in another tab page. */
     set_keep_msg(NULL, 0);
@@ -4107,9 +4066,7 @@
  * Also updates the GUI tab.
  */
     void
-goto_tabpage_win(tp, wp)
-    tabpage_T	*tp;
-    win_T	*wp;
+goto_tabpage_win(tabpage_T *tp, win_T *wp)
 {
     goto_tabpage_tp(tp, TRUE, TRUE);
     if (curtab == tp && win_valid(wp))
@@ -4126,8 +4083,7 @@
  * Move the current tab page to after tab page "nr".
  */
     void
-tabpage_move(nr)
-    int		nr;
+tabpage_move(int nr)
 {
     int		n = 1;
     tabpage_T	*tp, *tp_dst;
@@ -4182,8 +4138,7 @@
  * position to keep the same Visual area.
  */
     void
-win_goto(wp)
-    win_T	*wp;
+win_goto(win_T *wp)
 {
 #ifdef FEAT_CONCEAL
     win_T	*owp = curwin;
@@ -4224,8 +4179,7 @@
  * Find window number "winnr" (counting top to bottom).
  */
     win_T *
-win_find_nr(winnr)
-    int		winnr;
+win_find_nr(int winnr)
 {
     win_T	*wp;
 
@@ -4246,8 +4200,7 @@
  * Find the tabpage for window "win".
  */
     tabpage_T *
-win_find_tabpage(win)
-    win_T	*win;
+win_find_tabpage(win_T *win)
 {
     win_T	*wp;
     tabpage_T	*tp;
@@ -4266,9 +4219,9 @@
  * Move to window above or below "count" times.
  */
     static void
-win_goto_ver(up, count)
-    int		up;		/* TRUE to go to win above */
-    long	count;
+win_goto_ver(
+    int		up,		/* TRUE to go to win above */
+    long	count)
 {
     frame_T	*fr;
     frame_T	*nfr;
@@ -4329,9 +4282,9 @@
  * Move to left or right window.
  */
     static void
-win_goto_hor(left, count)
-    int		left;		/* TRUE to go to left win */
-    long	count;
+win_goto_hor(
+    int		left,		/* TRUE to go to left win */
+    long	count)
 {
     frame_T	*fr;
     frame_T	*nfr;
@@ -4393,9 +4346,7 @@
  * Make window "wp" the current window.
  */
     void
-win_enter(wp, undo_sync)
-    win_T	*wp;
-    int		undo_sync;
+win_enter(win_T *wp, int undo_sync)
 {
     win_enter_ext(wp, undo_sync, FALSE, TRUE, TRUE);
 }
@@ -4406,12 +4357,12 @@
  * been closed and isn't valid.
  */
     static void
-win_enter_ext(wp, undo_sync, curwin_invalid, trigger_enter_autocmds, trigger_leave_autocmds)
-    win_T	*wp;
-    int		undo_sync;
-    int		curwin_invalid;
-    int		trigger_enter_autocmds UNUSED;
-    int		trigger_leave_autocmds UNUSED;
+win_enter_ext(
+    win_T	*wp,
+    int		undo_sync,
+    int		curwin_invalid,
+    int		trigger_enter_autocmds UNUSED,
+    int		trigger_leave_autocmds UNUSED)
 {
 #ifdef FEAT_AUTOCMD
     int		other_buffer = FALSE;
@@ -4539,8 +4490,7 @@
  * Returns a pointer to the window found, otherwise NULL.
  */
     win_T *
-buf_jump_open_win(buf)
-    buf_T	*buf;
+buf_jump_open_win(buf_T *buf)
 {
     win_T	*wp = NULL;
 
@@ -4563,8 +4513,7 @@
  * Returns a pointer to the window found, otherwise NULL.
  */
     win_T *
-buf_jump_open_tab(buf)
-    buf_T	*buf;
+buf_jump_open_tab(buf_T *buf)
 {
     win_T	*wp = buf_jump_open_win(buf);
 # ifdef FEAT_WINDOWS
@@ -4597,9 +4546,7 @@
  * FALSE.
  */
     static win_T *
-win_alloc(after, hidden)
-    win_T	*after UNUSED;
-    int		hidden UNUSED;
+win_alloc(win_T *after UNUSED, int hidden UNUSED)
 {
     win_T	*new_wp;
 
@@ -4689,9 +4636,9 @@
  * Remove window 'wp' from the window list and free the structure.
  */
     static void
-win_free(wp, tp)
-    win_T	*wp;
-    tabpage_T	*tp;		/* tab page "win" is in, NULL for current */
+win_free(
+    win_T	*wp,
+    tabpage_T	*tp)		/* tab page "win" is in, NULL for current */
 {
     int		i;
     buf_T	*buf;
@@ -4810,8 +4757,7 @@
  * Append window "wp" in the window list after window "after".
  */
     void
-win_append(after, wp)
-    win_T	*after, *wp;
+win_append(win_T *after, win_T *wp)
 {
     win_T	*before;
 
@@ -4836,9 +4782,9 @@
  * Remove a window from the window list.
  */
     void
-win_remove(wp, tp)
-    win_T	*wp;
-    tabpage_T	*tp;		/* tab page "win" is in, NULL for current */
+win_remove(
+    win_T	*wp,
+    tabpage_T	*tp)		/* tab page "win" is in, NULL for current */
 {
     if (wp->w_prev != NULL)
 	wp->w_prev->w_next = wp->w_next;
@@ -4858,8 +4804,7 @@
  * Append frame "frp" in a frame list after frame "after".
  */
     static void
-frame_append(after, frp)
-    frame_T	*after, *frp;
+frame_append(frame_T *after, frame_T *frp)
 {
     frp->fr_next = after->fr_next;
     after->fr_next = frp;
@@ -4872,8 +4817,7 @@
  * Insert frame "frp" in a frame list before frame "before".
  */
     static void
-frame_insert(before, frp)
-    frame_T	*before, *frp;
+frame_insert(frame_T *before, frame_T *frp)
 {
     frp->fr_next = before;
     frp->fr_prev = before->fr_prev;
@@ -4888,8 +4832,7 @@
  * Remove a frame from a frame list.
  */
     static void
-frame_remove(frp)
-    frame_T	*frp;
+frame_remove(frame_T *frp)
 {
     if (frp->fr_prev != NULL)
 	frp->fr_prev->fr_next = frp->fr_next;
@@ -4906,8 +4849,7 @@
  * Return FAIL for failure, OK for success.
  */
     int
-win_alloc_lines(wp)
-    win_T	*wp;
+win_alloc_lines(win_T *wp)
 {
     wp->w_lines_valid = 0;
     wp->w_lines = (wline_T *)alloc_clear((unsigned)(Rows * sizeof(wline_T)));
@@ -4920,8 +4862,7 @@
  * free lsize arrays for a window
  */
     void
-win_free_lsize(wp)
-    win_T	*wp;
+win_free_lsize(win_T *wp)
 {
     /* TODO: why would wp be NULL here? */
     if (wp != NULL)
@@ -4936,7 +4877,7 @@
  * This only does the current tab page, others must be done when made active.
  */
     void
-shell_new_rows()
+shell_new_rows(void)
 {
     int		h = (int)ROWS_AVAIL;
 
@@ -4975,7 +4916,7 @@
  * Called from win_new_shellsize() after Columns changed.
  */
     void
-shell_new_columns()
+shell_new_columns(void)
 {
     if (firstwin == NULL)	/* not initialized yet */
 	return;
@@ -5000,8 +4941,7 @@
  * Save the size of all windows in "gap".
  */
     void
-win_size_save(gap)
-    garray_T	*gap;
+win_size_save(garray_T *gap)
 
 {
     win_T	*wp;
@@ -5021,8 +4961,7 @@
  * Does not free the growarray.
  */
     void
-win_size_restore(gap)
-    garray_T	*gap;
+win_size_restore(garray_T *gap)
 {
     win_T	*wp;
     int		i, j;
@@ -5053,7 +4992,7 @@
  * Returns the row just after the last window.
  */
     int
-win_comp_pos()
+win_comp_pos(void)
 {
     int		row = tabline_height();
     int		col = 0;
@@ -5069,10 +5008,7 @@
  * to the bottom-right position plus one.
  */
     static void
-frame_comp_pos(topfrp, row, col)
-    frame_T	*topfrp;
-    int		*row;
-    int		*col;
+frame_comp_pos(frame_T *topfrp, int *row, int *col)
 {
     win_T	*wp;
     frame_T	*frp;
@@ -5129,8 +5065,7 @@
  * fit around it.
  */
     void
-win_setheight(height)
-    int		height;
+win_setheight(int height)
 {
     win_setheight_win(height, curwin);
 }
@@ -5140,9 +5075,7 @@
  * windows to fit around it.
  */
     void
-win_setheight_win(height, win)
-    int		height;
-    win_T	*win;
+win_setheight_win(int height, win_T *win)
 {
     int		row;
 
@@ -5199,9 +5132,7 @@
  * At the top level we can also use change the command line height.
  */
     static void
-frame_setheight(curfrp, height)
-    frame_T	*curfrp;
-    int		height;
+frame_setheight(frame_T *curfrp, int height)
 {
     int		room;		/* total number of lines available */
     int		take;		/* number of lines taken from other windows */
@@ -5379,16 +5310,13 @@
  * fit around it.
  */
     void
-win_setwidth(width)
-    int		width;
+win_setwidth(int width)
 {
     win_setwidth_win(width, curwin);
 }
 
     void
-win_setwidth_win(width, wp)
-    int		width;
-    win_T	*wp;
+win_setwidth_win(int width, win_T *wp)
 {
     /* Always keep current window at least one column wide, even when
      * 'winminwidth' is zero. */
@@ -5416,9 +5344,7 @@
  * Strategy is similar to frame_setheight().
  */
     static void
-frame_setwidth(curfrp, width)
-    frame_T	*curfrp;
-    int		width;
+frame_setwidth(frame_T *curfrp, int width)
 {
     int		room;		/* total number of lines available */
     int		take;		/* number of lines taken from other windows */
@@ -5559,7 +5485,7 @@
  * Check 'winminheight' for a valid value.
  */
     void
-win_setminheight()
+win_setminheight(void)
 {
     int		room;
     int		first = TRUE;
@@ -5589,9 +5515,7 @@
  * Status line of dragwin is dragged "offset" lines down (negative is up).
  */
     void
-win_drag_status_line(dragwin, offset)
-    win_T	*dragwin;
-    int		offset;
+win_drag_status_line(win_T *dragwin, int offset)
 {
     frame_T	*curfr;
     frame_T	*fr;
@@ -5721,9 +5645,7 @@
  * Separator line of dragwin is dragged "offset" lines right (negative is left).
  */
     void
-win_drag_vsep_line(dragwin, offset)
-    win_T	*dragwin;
-    int		offset;
+win_drag_vsep_line(win_T *dragwin, int offset)
 {
     frame_T	*curfr;
     frame_T	*fr;
@@ -5832,8 +5754,7 @@
  * Set wp->w_fraction for the current w_wrow and w_height.
  */
     void
-set_fraction(wp)
-    win_T	*wp;
+set_fraction(win_T *wp)
 {
     wp->w_fraction = ((long)wp->w_wrow * FRACTION_MULT
 				    + wp->w_height / 2) / (long)wp->w_height;
@@ -5845,9 +5766,7 @@
  * window position, the frame or to other windows.
  */
     void
-win_new_height(wp, height)
-    win_T	*wp;
-    int		height;
+win_new_height(win_T *wp, int height)
 {
     linenr_T	lnum;
     int		sline, line_size;
@@ -6000,9 +5919,7 @@
  * Set the width of a window.
  */
     void
-win_new_width(wp, width)
-    win_T	*wp;
-    int		width;
+win_new_width(win_T *wp, int width)
 {
     wp->w_width = width;
     wp->w_lines_valid = 0;
@@ -6019,8 +5936,7 @@
 #endif
 
     void
-win_comp_scroll(wp)
-    win_T	*wp;
+win_comp_scroll(win_T *wp)
 {
     wp->w_p_scr = ((unsigned)wp->w_height >> 1);
     if (wp->w_p_scr == 0)
@@ -6031,7 +5947,7 @@
  * command_height: called whenever p_ch has been changed
  */
     void
-command_height()
+command_height(void)
 {
 #ifdef FEAT_WINDOWS
     int		h;
@@ -6112,9 +6028,7 @@
  * Also resize the frames it is contained in.
  */
     static void
-frame_add_height(frp, n)
-    frame_T	*frp;
-    int		n;
+frame_add_height(frame_T *frp, int n)
 {
     frame_new_height(frp, frp->fr_height + n, FALSE, FALSE);
     for (;;)
@@ -6131,8 +6045,8 @@
  * value of 'laststatus'.
  */
     void
-last_status(morewin)
-    int		morewin;	/* pretend there are two or more windows */
+last_status(
+    int		morewin)	/* pretend there are two or more windows */
 {
     /* Don't make a difference between horizontal or vertical split. */
     last_status_rec(topframe, (p_ls == 2
@@ -6140,9 +6054,7 @@
 }
 
     static void
-last_status_rec(fr, statusline)
-    frame_T	*fr;
-    int		statusline;
+last_status_rec(frame_T *fr, int statusline)
 {
     frame_T	*fp;
     win_T	*wp;
@@ -6209,7 +6121,7 @@
  * Return the number of lines used by the tab page line.
  */
     int
-tabline_height()
+tabline_height(void)
 {
 #ifdef FEAT_GUI_TABLINE
     /* When the GUI has the tabline then this always returns zero. */
@@ -6233,9 +6145,7 @@
  * Returns the name in allocated memory, NULL for failure.
  */
     char_u *
-grab_file_name(count, file_lnum)
-    long	count;
-    linenr_T	*file_lnum;
+grab_file_name(long count, linenr_T *file_lnum)
 {
     int options = FNAME_MESS|FNAME_EXP|FNAME_REL|FNAME_UNESC;
 
@@ -6267,10 +6177,7 @@
  * FNAME_INCL	    apply "includeexpr"
  */
     char_u *
-file_name_at_cursor(options, count, file_lnum)
-    int		options;
-    long	count;
-    linenr_T	*file_lnum;
+file_name_at_cursor(int options, long count, linenr_T *file_lnum)
 {
     return file_name_in_line(ml_get_curline(),
 		      curwin->w_cursor.col, options, count, curbuf->b_ffname,
@@ -6282,13 +6189,13 @@
  * Otherwise like file_name_at_cursor().
  */
     char_u *
-file_name_in_line(line, col, options, count, rel_fname, file_lnum)
-    char_u	*line;
-    int		col;
-    int		options;
-    long	count;
-    char_u	*rel_fname;	/* file we are searching relative to */
-    linenr_T	*file_lnum;	/* line number after the file name */
+file_name_in_line(
+    char_u	*line,
+    int		col,
+    int		options,
+    long	count,
+    char_u	*rel_fname,	/* file we are searching relative to */
+    linenr_T	*file_lnum)	/* line number after the file name */
 {
     char_u	*ptr;
     int		len;
@@ -6375,9 +6282,7 @@
 static char_u *eval_includeexpr(char_u *ptr, int len);
 
     static char_u *
-eval_includeexpr(ptr, len)
-    char_u	*ptr;
-    int		len;
+eval_includeexpr(char_u *ptr, int len)
 {
     char_u	*res;
 
@@ -6394,12 +6299,12 @@
  * Otherwise like file_name_at_cursor().
  */
     char_u *
-find_file_name_in_path(ptr, len, options, count, rel_fname)
-    char_u	*ptr;
-    int		len;
-    int		options;
-    long	count;
-    char_u	*rel_fname;	/* file we are searching relative to */
+find_file_name_in_path(
+    char_u	*ptr,
+    int		len,
+    int		options,
+    long	count,
+    char_u	*rel_fname)	/* file we are searching relative to */
 {
     char_u	*file_name;
     int		c;
@@ -6473,8 +6378,7 @@
  * URL_BACKSLASH.
  */
     static int
-path_is_url(p)
-    char_u  *p;
+path_is_url(char_u *p)
 {
     if (STRNCMP(p, "://", (size_t)3) == 0)
 	return URL_SLASH;
@@ -6489,8 +6393,7 @@
  * Return zero otherwise.
  */
     int
-path_with_url(fname)
-    char_u *fname;
+path_with_url(char_u *fname)
 {
     char_u *p;
 
@@ -6503,8 +6406,7 @@
  * Return TRUE if "name" is a full (absolute) path name or URL.
  */
     int
-vim_isAbsName(name)
-    char_u	*name;
+vim_isAbsName(char_u *name)
 {
     return (path_with_url(name) != 0 || mch_isFullName(name));
 }
@@ -6515,10 +6417,11 @@
  * return FAIL for failure, OK otherwise
  */
     int
-vim_FullName(fname, buf, len, force)
-    char_u	*fname, *buf;
-    int		len;
-    int		force;	    /* force expansion even when already absolute */
+vim_FullName(
+    char_u	*fname,
+    char_u	*buf,
+    int		len,
+    int		force)	    /* force expansion even when already absolute */
 {
     int		retval = OK;
     int		url;
@@ -6546,7 +6449,7 @@
  * the current number of windows.
  */
     int
-min_rows()
+min_rows(void)
 {
     int		total;
 #ifdef FEAT_WINDOWS
@@ -6579,7 +6482,7 @@
  * Does not count "aucmd_win".
  */
     int
-only_one_window()
+only_one_window(void)
 {
 #ifdef FEAT_WINDOWS
     int		count = 0;
@@ -6614,8 +6517,7 @@
  * When "do_curwin" is TRUE, also check current window.
  */
     void
-check_lnums(do_curwin)
-    int		do_curwin;
+check_lnums(int do_curwin)
 {
     win_T	*wp;
 
@@ -6655,17 +6557,14 @@
  * Create a snapshot of the current frame sizes.
  */
     void
-make_snapshot(idx)
-    int idx;
+make_snapshot(int idx)
 {
     clear_snapshot(curtab, idx);
     make_snapshot_rec(topframe, &curtab->tp_snapshot[idx]);
 }
 
     static void
-make_snapshot_rec(fr, frp)
-    frame_T	*fr;
-    frame_T	**frp;
+make_snapshot_rec(frame_T *fr, frame_T **frp)
 {
     *frp = (frame_T *)alloc_clear((unsigned)sizeof(frame_T));
     if (*frp == NULL)
@@ -6687,17 +6586,14 @@
  * Remove any existing snapshot.
  */
     static void
-clear_snapshot(tp, idx)
-    tabpage_T	*tp;
-    int		idx;
+clear_snapshot(tabpage_T *tp, int idx)
 {
     clear_snapshot_rec(tp->tp_snapshot[idx]);
     tp->tp_snapshot[idx] = NULL;
 }
 
     static void
-clear_snapshot_rec(fr)
-    frame_T	*fr;
+clear_snapshot_rec(frame_T *fr)
 {
     if (fr != NULL)
     {
@@ -6713,9 +6609,9 @@
  * still the same.
  */
     void
-restore_snapshot(idx, close_curwin)
-    int		idx;
-    int		close_curwin;	    /* closing current window */
+restore_snapshot(
+    int		idx,
+    int		close_curwin)	    /* closing current window */
 {
     win_T	*wp;
 
@@ -6740,9 +6636,7 @@
  * and same children.
  */
     static int
-check_snapshot_rec(sn, fr)
-    frame_T	*sn;
-    frame_T	*fr;
+check_snapshot_rec(frame_T *sn, frame_T *fr)
 {
     if (sn->fr_layout != fr->fr_layout
 	    || (sn->fr_next == NULL) != (fr->fr_next == NULL)
@@ -6761,9 +6655,7 @@
  * Returns a pointer to the old current window, or NULL.
  */
     static win_T *
-restore_snapshot_rec(sn, fr)
-    frame_T	*sn;
-    frame_T	*fr;
+restore_snapshot_rec(frame_T *sn, frame_T *fr)
 {
     win_T	*wp = NULL;
     win_T	*wp2;
@@ -6808,12 +6700,12 @@
  * Returns FAIL if switching to "win" failed.
  */
     int
-switch_win(save_curwin, save_curtab, win, tp, no_display)
-    win_T	**save_curwin UNUSED;
-    tabpage_T	**save_curtab UNUSED;
-    win_T	*win UNUSED;
-    tabpage_T	*tp UNUSED;
-    int		no_display UNUSED;
+switch_win(
+    win_T	**save_curwin UNUSED,
+    tabpage_T	**save_curtab UNUSED,
+    win_T	*win UNUSED,
+    tabpage_T	*tp UNUSED,
+    int		no_display UNUSED)
 {
 # ifdef FEAT_AUTOCMD
     block_autocmds();
@@ -6848,10 +6740,10 @@
  * triggered.
  */
     void
-restore_win(save_curwin, save_curtab, no_display)
-    win_T	*save_curwin UNUSED;
-    tabpage_T	*save_curtab UNUSED;
-    int		no_display UNUSED;
+restore_win(
+    win_T	*save_curwin UNUSED,
+    tabpage_T	*save_curtab UNUSED,
+    int		no_display UNUSED)
 {
 # ifdef FEAT_WINDOWS
     if (save_curtab != NULL && valid_tabpage(save_curtab))
@@ -6883,9 +6775,7 @@
  * No autocommands will be executed.  Use aucmd_prepbuf() if there are any.
  */
     void
-switch_buffer(save_curbuf, buf)
-    buf_T *buf;
-    buf_T **save_curbuf;
+switch_buffer(buf_T **save_curbuf, buf_T *buf)
 {
 # ifdef FEAT_AUTOCMD
     block_autocmds();
@@ -6901,8 +6791,7 @@
  * Restore the current buffer after using switch_buffer().
  */
     void
-restore_buffer(save_curbuf)
-    buf_T *save_curbuf;
+restore_buffer(buf_T *save_curbuf)
 {
 # ifdef FEAT_AUTOCMD
     unblock_autocmds();
@@ -6923,7 +6812,7 @@
  * Return TRUE if there is any vertically split window.
  */
     int
-win_hasvertsplit()
+win_hasvertsplit(void)
 {
     frame_T	*fr;
 
@@ -6948,14 +6837,14 @@
  * Return ID of added match, -1 on failure.
  */
     int
-match_add(wp, grp, pat, prio, id, pos_list, conceal_char)
-    win_T	*wp;
-    char_u	*grp;
-    char_u	*pat;
-    int		prio;
-    int		id;
-    list_T	*pos_list;
-    char_u      *conceal_char UNUSED; /* pointer to conceal replacement char */
+match_add(
+    win_T	*wp,
+    char_u	*grp,
+    char_u	*pat,
+    int		prio,
+    int		id,
+    list_T	*pos_list,
+    char_u      *conceal_char UNUSED) /* pointer to conceal replacement char */
 {
     matchitem_T	*cur;
     matchitem_T	*prev;
@@ -7146,10 +7035,7 @@
  * Print error messages if 'perr' is TRUE.
  */
     int
-match_delete(wp, id, perr)
-    win_T	*wp;
-    int		id;
-    int		perr;
+match_delete(win_T *wp, int id, int perr)
 {
     matchitem_T	*cur = wp->w_match_head;
     matchitem_T	*prev = cur;
@@ -7206,8 +7092,7 @@
  * Delete all matches in the match list of window 'wp'.
  */
     void
-clear_matches(wp)
-    win_T	*wp;
+clear_matches(win_T *wp)
 {
     matchitem_T *m;
 
@@ -7227,9 +7112,7 @@
  * Return NULL if match not found.
  */
     matchitem_T *
-get_match(wp, id)
-    win_T	*wp;
-    int		id;
+get_match(win_T *wp, int id)
 {
     matchitem_T *cur = wp->w_match_head;
 
@@ -7278,9 +7161,7 @@
  * Return TRUE if "topfrp" and its children are at the right height.
  */
     static int
-frame_check_height(topfrp, height)
-    frame_T *topfrp;
-    int	    height;
+frame_check_height(frame_T *topfrp, int height)
 {
     frame_T *frp;
 
@@ -7301,9 +7182,7 @@
  * Return TRUE if "topfrp" and its children are at the right width.
  */
     static int
-frame_check_width(topfrp, width)
-    frame_T *topfrp;
-    int	    width;
+frame_check_width(frame_T *topfrp, int width)
 {
     frame_T *frp;
 
diff --git a/src/workshop.c b/src/workshop.c
index e0db10e..cf7b46b 100644
--- a/src/workshop.c
+++ b/src/workshop.c
@@ -98,7 +98,7 @@
 
 
     void
-workshop_init()
+workshop_init(void)
 {
     char_u	 buf[64];
     int		 is_dirty = FALSE;
@@ -148,7 +148,7 @@
 }
 
     void
-workshop_postinit()
+workshop_postinit(void)
 {
     do_cmdline_cmd((char_u *)initialFileCmd);
     ALT_INPUT_LOCK_OFF;
@@ -170,7 +170,7 @@
  * of NEdit, for example, when the connection is initiated from the editor.
  */
     char *
-workshop_get_editor_name()
+workshop_get_editor_name(void)
 {
     return "gvim";
 }
@@ -181,7 +181,7 @@
  * version to the application.
  */
     char *
-workshop_get_editor_version()
+workshop_get_editor_version(void)
 {
     return Version;
 }
@@ -288,7 +288,7 @@
 }
 
     void
-workshop_save_files()
+workshop_save_files(void)
 {
     /* Save the given file */
 #ifdef WSDEBUG_TRACE
@@ -300,7 +300,7 @@
 }
 
     void
-workshop_quit()
+workshop_quit(void)
 {
 #ifdef WSDEBUG_TRACE
     if (WSDLEVEL(WS_TRACE_VERBOSE | WS_TRACE))
@@ -311,7 +311,7 @@
 }
 
     void
-workshop_minimize()
+workshop_minimize(void)
 {
 #ifdef WSDEBUG_TRACE
     if (WSDLEVEL(WS_TRACE_VERBOSE | WS_TRACE))
@@ -320,7 +320,7 @@
     workshop_minimize_shell(vimShell);
 }
     void
-workshop_maximize()
+workshop_maximize(void)
 {
 #ifdef WSDEBUG_TRACE
     if (WSDLEVEL(WS_TRACE_VERBOSE | WS_TRACE))
@@ -510,7 +510,7 @@
 }
 
     int
-workshop_get_font_height()
+workshop_get_font_height(void)
 {
     XmFontList	 fontList;	/* fontList made from gui.norm_font */
     XmString	 str;
@@ -623,7 +623,7 @@
  */
 
     void
-workshop_submenu_end()
+workshop_submenu_end(void)
 {
     char		*p;
 
@@ -720,7 +720,7 @@
  */
 
     void
-workshop_menu_end()
+workshop_menu_end(void)
 {
     Boolean		 using_tearoff;	/* set per current option setting */
 
@@ -734,7 +734,7 @@
 }
 
     void
-workshop_toolbar_begin()
+workshop_toolbar_begin(void)
 {
 #ifdef WSDEBUG_TRACE
     if (WSDLEVEL(WS_TRACE_VERBOSE | WS_TRACE))
@@ -746,7 +746,7 @@
 }
 
     void
-workshop_toolbar_end()
+workshop_toolbar_end(void)
 {
     char_u	buf[64];
 
@@ -1405,7 +1405,7 @@
 /* For the NoHands test suite */
 
     char *
-workshop_test_getcurrentfile()
+workshop_test_getcurrentfile(void)
 {
     char	*filename, *selection;
     int		curLine, curCol, selStartLine, selStartCol, selEndLine;
@@ -1421,13 +1421,13 @@
 }
 
     int
-workshop_test_getcursorrow()
+workshop_test_getcursorrow(void)
 {
     return 0;
 }
 
     int
-workshop_test_getcursorcol()
+workshop_test_getcursorcol(void)
 {
     char	*filename, *selection;
     int		curLine, curCol, selStartLine, selStartCol, selEndLine;
@@ -1443,13 +1443,13 @@
 }
 
     char *
-workshop_test_getcursorrowtext()
+workshop_test_getcursorrowtext(void)
 {
     return NULL;
 }
 
     char *
-workshop_test_getselectedtext()
+workshop_test_getselectedtext(void)
 {
     char	*filename, *selection;
     int		curLine, curCol, selStartLine, selStartCol, selEndLine;
diff --git a/src/xpm_w32.c b/src/xpm_w32.c
index 945ab7d..cc296fc 100644
--- a/src/xpm_w32.c
+++ b/src/xpm_w32.c
@@ -28,10 +28,10 @@
  * "hShape".
  */
     int
-LoadXpmImage(filename, hImage, hShape)
-    char    *filename;
-    HBITMAP *hImage;
-    HBITMAP *hShape;
+LoadXpmImage(
+    char    *filename,
+    HBITMAP *hImage,
+    HBITMAP *hShape)
 {
     XImage	    *img;  /* loaded image */
     XImage	    *shp;  /* shapeimage */
diff --git a/src/xxd/xxd.c b/src/xxd/xxd.c
index c18ad31..8cd760b 100644
--- a/src/xxd/xxd.c
+++ b/src/xxd/xxd.c
@@ -234,7 +234,7 @@
 static char *pname;
 
   static void
-exit_with_usage()
+exit_with_usage(void)
 {
   fprintf(stderr, "Usage:\n       %s [options] [infile [outfile]]\n", pname);
   fprintf(stderr, "    or\n       %s -r [-s [-]offset] [-c cols] [-ps] [infile [outfile]]\n", pname);
@@ -264,8 +264,7 @@
 }
 
   static void
-die(ret)
-  int ret;
+die(int ret)
 {
   fprintf(stderr, "%s: ", pname);
   perror(NULL);
@@ -280,10 +279,13 @@
  * The name is historic and came from 'undo type opt h'.
  */
   static int
-huntype(fpi, fpo, fperr, cols, hextype, base_off)
-  FILE *fpi, *fpo, *fperr;
-  int cols, hextype;
-  long base_off;
+huntype(
+  FILE *fpi,
+  FILE *fpo,
+  FILE *fperr,
+  int cols,
+  int hextype,
+  long base_off)
 {
   int c, ign_garb = 1, n1 = -1, n2 = 0, n3, p = cols;
   long have_off = 0, want_off = 0;
@@ -409,10 +411,7 @@
  * If nz is always positive, lines are never suppressed.
  */
   static void
-xxdline(fp, l, nz)
-  FILE *fp;
-  char *l;
-  int nz;
+xxdline(FILE *fp, char *l, int nz)
 {
   static char z[LLEN+1];
   static int zero_seen = 0;
@@ -472,9 +471,7 @@
 };
 
   int
-main(argc, argv)
-  int argc;
-  char *argv[];
+main(int argc, char *argv[])
 {
   FILE *fp, *fpo;
   int c, e, p = 0, relseek = 1, negseek = 0, revert = 0;
