updated for version 7.0057
diff --git a/src/auto/configure b/src/auto/configure
index 1a0a5a7..f22fee3 100755
--- a/src/auto/configure
+++ b/src/auto/configure
@@ -4629,7 +4629,7 @@
   if test "X$vi_cv_path_ruby" != "X"; then
     echo "$as_me:$LINENO: checking Ruby version" >&5
 echo $ECHO_N "checking Ruby version... $ECHO_C" >&6
-    if $vi_cv_path_ruby -e 'VERSION >= "1.6.0" or exit 1' >/dev/null 2>/dev/null; then
+    if $vi_cv_path_ruby -e 'RUBY_VERSION >= "1.6.0" or exit 1' >/dev/null 2>/dev/null; then
       echo "$as_me:$LINENO: result: OK" >&5
 echo "${ECHO_T}OK" >&6
       echo "$as_me:$LINENO: checking Ruby header files" >&5
diff --git a/src/configure.in b/src/configure.in
index cc8d00e..fb8e330 100644
--- a/src/configure.in
+++ b/src/configure.in
@@ -807,7 +807,7 @@
   AC_PATH_PROG(vi_cv_path_ruby, ruby)
   if test "X$vi_cv_path_ruby" != "X"; then
     AC_MSG_CHECKING(Ruby version)
-    if $vi_cv_path_ruby -e 'VERSION >= "1.6.0" or exit 1' >/dev/null 2>/dev/null; then
+    if $vi_cv_path_ruby -e '(VERSION rescue RUBY_VERSION) >= "1.6.0" or exit 1' >/dev/null 2>/dev/null; then
       AC_MSG_RESULT(OK)
       AC_MSG_CHECKING(Ruby header files)
       rubyhdrdir=`$vi_cv_path_ruby -r mkmf -e 'print Config::CONFIG[["archdir"]] || $hdrdir' 2>/dev/null`
diff --git a/src/gui_mac.c b/src/gui_mac.c
index bbf329d..03dc326 100644
--- a/src/gui_mac.c
+++ b/src/gui_mac.c
@@ -3879,6 +3879,12 @@
     TextSize(font >> 16);
     TextFont(font & 0xFFFF);
 
+    GetFontInfo(&font_info);
+
+    gui.char_ascent = font_info.ascent;
+    gui.char_width  = CharWidth('_');
+    gui.char_height = font_info.ascent + font_info.descent + p_linespace;
+
 #ifdef USE_ATSUI_DRAWING
     ATSUFontID			fontID;
     Fixed			fontSize;
@@ -3927,12 +3933,6 @@
     }
 #endif
 
-    GetFontInfo(&font_info);
-
-    gui.char_ascent = font_info.ascent;
-    gui.char_width  = CharWidth('_');
-    gui.char_height = font_info.ascent + font_info.descent + p_linespace;
-
     return OK;
 
 }
@@ -4313,11 +4313,6 @@
     int		len;
     int		flags;
 {
-#if defined(FEAT_GUI) && defined(MACOS_X)
-#ifndef USE_ATSUI_DRAWING
-    SInt32	sys_version;
-#endif
-#endif
 #ifdef FEAT_MBYTE
 #ifdef USE_ATSUI_DRAWING
     /* ATSUI requires utf-16 strings */
@@ -4342,10 +4337,7 @@
     /*
      * On OS X, try using Quartz-style text antialiasing.
      */
-    sys_version = 0;
-
-    Gestalt(gestaltSystemVersion, &sys_version);
-    if (sys_version >= 0x1020)
+    if (gMacSystemVersion >= 0x1020)
     {
 	/* Quartz antialiasing is available only in OS 10.2 and later. */
 	UInt32 qd_flags = (p_antialias ?
@@ -4366,7 +4358,7 @@
 #ifdef USE_ATSUI_DRAWING
     if ((flags & DRAW_TRANSP) == 0)
 #else
-    if (((sys_version >= 0x1020 && p_antialias) || p_linespace != 0)
+    if (((gMacSystemVersion >= 0x1020 && p_antialias) || p_linespace != 0)
 	    && !(flags & DRAW_TRANSP))
 #endif
     {
@@ -4394,7 +4386,7 @@
     }
 
 #ifndef USE_ATSUI_DRAWING
-    if (sys_version >= 0x1020 && p_antialias)
+    if (gMacSystemVersion >= 0x1020 && p_antialias)
     {
 	StyleParameter face;
 
diff --git a/src/gui_w32.c b/src/gui_w32.c
index 2308362..8bcec1d 100644
--- a/src/gui_w32.c
+++ b/src/gui_w32.c
@@ -3947,7 +3947,7 @@
 /* BALLOON-EVAL IMPLEMENTATION FOR WINDOWS.
  *  Added by Sergey Khorev <sergey.khorev@gmail.com>
  *
- * The only reused thing is gui_beval.h and gui_mch_get_beval_info()
+ * The only reused thing is gui_beval.h and get_beval_info()
  * from gui_beval.c (note it uses x and y of the BalloonEval struct
  * to get current mouse position).
  *
diff --git a/src/proto/gui_gtk.pro b/src/proto/gui_gtk.pro
index 882587e..afe38dc 100644
--- a/src/proto/gui_gtk.pro
+++ b/src/proto/gui_gtk.pro
@@ -14,7 +14,6 @@
 char_u *gui_mch_browse __ARGS((int saving, char_u *title, char_u *dflt, char_u *ext, char_u *initdir, char_u *filter));
 char_u *gui_mch_browsedir __ARGS((char_u *title, char_u *initdir));
 int gui_mch_dialog __ARGS((int type, char_u *title, char_u *message, char_u *buttons, int def_but, char_u *textfield));
-int gui_mch_dialog __ARGS((int type, char_u *title, char_u *message, char_u *buttons, int def_but, char_u *textfield));
 void gui_mch_show_popupmenu __ARGS((vimmenu_T *menu));
 void gui_make_popup __ARGS((char_u *path_name));
 void gui_mch_find_dialog __ARGS((exarg_T *eap));
diff --git a/src/proto/netbeans.pro b/src/proto/netbeans.pro
index 31b7ef3..f6b7d7d 100644
--- a/src/proto/netbeans.pro
+++ b/src/proto/netbeans.pro
@@ -1,9 +1,11 @@
 /* netbeans.c */
+void netbeans_w32_connect __ARGS((void));
 void messageFromNetbeansW32 __ARGS((void));
 int isNetbeansBuffer __ARGS((buf_T *bufp));
 int isNetbeansModified __ARGS((buf_T *bufp));
 void netbeans_end __ARGS((void));
 void ex_nbkey __ARGS((exarg_T *eap));
+void netbeans_beval_cb __ARGS((BalloonEval *beval, int state));
 void netbeans_startup_done __ARGS((void));
 void netbeans_send_disconnect __ARGS((void));
 void netbeans_frame_moved __ARGS((int new_x, int new_y));
diff --git a/src/proto/workshop.pro b/src/proto/workshop.pro
index 13a1050..426fded 100644
--- a/src/proto/workshop.pro
+++ b/src/proto/workshop.pro
@@ -44,5 +44,6 @@
 char *workshop_test_getcursorrowtext __ARGS((void));
 char *workshop_test_getselectedtext __ARGS((void));
 void workshop_save_sensitivity __ARGS((char *filename));
+void workshop_beval_cb __ARGS((BalloonEval *beval, int state));
 void findYourself __ARGS((char *argv0));
 /* vim: set ft=c : */
diff --git a/src/quickfix.c b/src/quickfix.c
index d9ce186..c34f47f 100644
--- a/src/quickfix.c
+++ b/src/quickfix.c
@@ -2418,27 +2418,6 @@
 	else
 	{
 	    found_match = FALSE;
-#if 0
-#ifdef HAVE_SETJMP_H
-	    /*
-	     * Matching with a regexp may cause a very deep recursive call of
-	     * regmatch().  Vim will crash when running out of stack space.
-	     * Catch this here if the system supports it.
-	     * It's a bit slow, thus do it outside of the loop.
-	     */
-	    mch_startjmp();
-	    if (SETJMP(lc_jump_env) != 0)
-	    {
-		mch_didjmp();
-# ifdef SIGHASARG
-		if (lc_signal != SIGINT)
-# endif
-		    EMSG(_(e_complex));
-		got_int = TRUE;
-		goto jumpend;
-	    }
-#endif
-#endif
 	    /* Try for a match in all lines of the buffer. */
 	    for (lnum = 1; lnum <= buf->b_ml.ml_line_count; ++lnum)
 	    {
@@ -2477,12 +2456,6 @@
 		if (got_int)
 		    break;
 	    }
-#if 0
-#ifdef HAVE_SETJMP_H
-jumpend:
-	    mch_endjmp();
-#endif
-#endif
 
 	    if (using_dummy)
 	    {
diff --git a/src/regexp.c b/src/regexp.c
index 79d3e2a..9ad719c 100644
--- a/src/regexp.c
+++ b/src/regexp.c
@@ -3184,49 +3184,21 @@
     return r;
 }
 
-#if 0	/* disabled, no longer needed now that regmatch() is not recursive */
-# ifdef HAVE_SETJMP_H
-#  define USE_SETJMP
-# endif
-# ifdef HAVE_TRY_EXCEPT
-#  define USE_TRY_EXCEPT
-# endif
-#endif
-
 /*
  * Match a regexp against a string ("line" points to the string) or multiple
  * lines ("line" is NULL, use reg_getline()).
  */
-#ifdef USE_SETJMP
-    static long
-vim_regexec_both(line_arg, col_arg)
-    char_u	*line_arg;
-    colnr_T	col_arg;	/* column to start looking for match */
-#else
     static long
 vim_regexec_both(line, col)
     char_u	*line;
     colnr_T	col;		/* column to start looking for match */
-#endif
 {
     regprog_T	*prog;
     char_u	*s;
-    long	retval;
-#ifdef USE_SETJMP
-    char_u	*line;
-    colnr_T	col;
-    int		did_mch_startjmp = FALSE;
-#endif
+    long	retval = 0L;
 
     reg_tofree = NULL;
 
-#ifdef USE_SETJMP
-    /* Trick to avoid "might be clobbered by `longjmp'" warning from gcc. */
-    line = line_arg;
-    col = col_arg;
-#endif
-    retval = 0L;
-
     if (REG_MULTI)
     {
 	prog = reg_mmatch->regprog;
@@ -3312,36 +3284,6 @@
 	    goto theend;
     }
 
-#ifdef USE_TRY_EXCEPT
-    __try
-    {
-#endif
-
-#ifdef USE_SETJMP
-    /*
-     * Matching with a regexp may cause a very deep recursive call of
-     * regmatch().  Vim will crash when running out of stack space.  Catch
-     * this here if the system supports it.
-     * It's a bit slow, do it after the check for "regmust".
-     * Don't do it if the caller already set it up.
-     */
-    if (!lc_active)
-    {
-	did_mch_startjmp = TRUE;
-	mch_startjmp();
-	if (SETJMP(lc_jump_env) != 0)
-	{
-	    mch_didjmp();
-# ifdef SIGHASARG
-	    if (lc_signal != SIGINT)
-# endif
-		EMSG(_(e_complex));
-	    retval = 0L;
-	    goto inner_end;
-	}
-    }
-#endif
-
     regline = line;
     reglnum = 0;
 
@@ -3414,26 +3356,6 @@
 	}
     }
 
-#ifdef USE_SETJMP
-inner_end:
-    if (did_mch_startjmp)
-	mch_endjmp();
-#endif
-#ifdef USE_TRY_EXCEPT
-    }
-    __except(EXCEPTION_EXECUTE_HANDLER)
-    {
-	if (GetExceptionCode() == EXCEPTION_STACK_OVERFLOW)
-	{
-	    RESETSTKOFLW();
-	    EMSG(_(e_outofstack));
-	}
-	else
-	    EMSG(_(e_complex));
-	retval = 0L;
-    }
-#endif
-
 theend:
     /* Didn't find a match. */
     vim_free(reg_tofree);
@@ -3505,68 +3427,67 @@
 	need_clear_zsubexpr = TRUE;
 #endif
 
-    if (regmatch(prog->program + 1))
+    if (regmatch(prog->program + 1) == 0)
+	return 0;
+
+    cleanup_subexpr();
+    if (REG_MULTI)
     {
-	cleanup_subexpr();
-	if (REG_MULTI)
+	if (reg_startpos[0].lnum < 0)
 	{
-	    if (reg_startpos[0].lnum < 0)
-	    {
-		reg_startpos[0].lnum = 0;
-		reg_startpos[0].col = col;
-	    }
-	    if (reg_endpos[0].lnum < 0)
-	    {
-		reg_endpos[0].lnum = reglnum;
-		reg_endpos[0].col = (int)(reginput - regline);
-	    }
-	    else
-		/* Use line number of "\ze". */
-		reglnum = reg_endpos[0].lnum;
+	    reg_startpos[0].lnum = 0;
+	    reg_startpos[0].col = col;
+	}
+	if (reg_endpos[0].lnum < 0)
+	{
+	    reg_endpos[0].lnum = reglnum;
+	    reg_endpos[0].col = (int)(reginput - regline);
 	}
 	else
-	{
-	    if (reg_startp[0] == NULL)
-		reg_startp[0] = regline + col;
-	    if (reg_endp[0] == NULL)
-		reg_endp[0] = reginput;
-	}
+	    /* Use line number of "\ze". */
+	    reglnum = reg_endpos[0].lnum;
+    }
+    else
+    {
+	if (reg_startp[0] == NULL)
+	    reg_startp[0] = regline + col;
+	if (reg_endp[0] == NULL)
+	    reg_endp[0] = reginput;
+    }
 #ifdef FEAT_SYN_HL
-	/* Package any found \z(...\) matches for export. Default is none. */
-	unref_extmatch(re_extmatch_out);
-	re_extmatch_out = NULL;
+    /* Package any found \z(...\) matches for export. Default is none. */
+    unref_extmatch(re_extmatch_out);
+    re_extmatch_out = NULL;
 
-	if (prog->reghasz == REX_SET)
+    if (prog->reghasz == REX_SET)
+    {
+	int		i;
+
+	cleanup_zsubexpr();
+	re_extmatch_out = make_extmatch();
+	for (i = 0; i < NSUBEXP; i++)
 	{
-	    int		i;
-
-	    cleanup_zsubexpr();
-	    re_extmatch_out = make_extmatch();
-	    for (i = 0; i < NSUBEXP; i++)
+	    if (REG_MULTI)
 	    {
-		if (REG_MULTI)
-		{
-		    /* Only accept single line matches. */
-		    if (reg_startzpos[i].lnum >= 0
-			    && reg_endzpos[i].lnum == reg_startzpos[i].lnum)
-			re_extmatch_out->matches[i] =
-			    vim_strnsave(reg_getline(reg_startzpos[i].lnum)
+		/* Only accept single line matches. */
+		if (reg_startzpos[i].lnum >= 0
+			&& reg_endzpos[i].lnum == reg_startzpos[i].lnum)
+		    re_extmatch_out->matches[i] =
+			vim_strnsave(reg_getline(reg_startzpos[i].lnum)
 						       + reg_startzpos[i].col,
-				    reg_endzpos[i].col - reg_startzpos[i].col);
-		}
-		else
-		{
-		    if (reg_startzp[i] != NULL && reg_endzp[i] != NULL)
-			re_extmatch_out->matches[i] =
+				   reg_endzpos[i].col - reg_startzpos[i].col);
+	    }
+	    else
+	    {
+		if (reg_startzp[i] != NULL && reg_endzp[i] != NULL)
+		    re_extmatch_out->matches[i] =
 			    vim_strnsave(reg_startzp[i],
-				    (int)(reg_endzp[i] - reg_startzp[i]));
-		}
+					(int)(reg_endzp[i] - reg_startzp[i]));
 	    }
 	}
-#endif
-	return 1 + reglnum;
     }
-    return 0;
+#endif
+    return 1 + reglnum;
 }
 
 #ifdef FEAT_MBYTE
@@ -4601,7 +4522,12 @@
 		    /* It could match.  Prepare for trying to match what
 		     * follows.  The code is below.  Parameters are stored in
 		     * a regstar_T on the regstack. */
-		    if (ga_grow(&regstack, sizeof(regstar_T)) == FAIL)
+		    if (((unsigned)regstack.ga_len >> 10) >= p_mmp)
+		    {
+			EMSG(_(e_maxmempat));
+			status = RA_FAIL;
+		    }
+		    else if (ga_grow(&regstack, sizeof(regstar_T)) == FAIL)
 			status = RA_FAIL;
 		    else
 		    {
@@ -4641,7 +4567,12 @@
 	  case BEHIND:
 	  case NOBEHIND:
 	    /* Need a bit of room to store extra positions. */
-	    if (ga_grow(&regstack, sizeof(regbehind_T)) == FAIL)
+	    if (((unsigned)regstack.ga_len >> 10) >= p_mmp)
+	    {
+		EMSG(_(e_maxmempat));
+		status = RA_FAIL;
+	    }
+	    else if (ga_grow(&regstack, sizeof(regbehind_T)) == FAIL)
 		status = RA_FAIL;
 	    else
 	    {
@@ -5029,7 +4960,7 @@
 	    break;
     }
 
-    /* May want to continue with the inner loop. */
+    /* May need to continue with the inner loop, starting at "scan". */
     if (status == RA_CONT)
 	continue;
 
@@ -5050,6 +4981,8 @@
 	    printf("Premature EOL\n");
 #endif
 	}
+	if (status == RA_FAIL)
+	    got_int = TRUE;
 	return (status == RA_MATCH);
     }
 
@@ -5071,6 +5004,11 @@
 {
     regitem_T	*rp;
 
+    if (((unsigned)regstack->ga_len >> 10) >= p_mmp)
+    {
+	EMSG(_(e_maxmempat));
+	return NULL;
+    }
     if (ga_grow(regstack, sizeof(regitem_T)) == FAIL)
 	return NULL;
 
diff --git a/src/workshop.c b/src/workshop.c
index a80575f..e17f0e6 100644
--- a/src/workshop.c
+++ b/src/workshop.c
@@ -58,7 +58,7 @@
 static void	 load_window(char *, int lnum);
 static void	 warp_to_pc(int);
 #ifdef FEAT_BEVAL
-static void	 bevalCB(BalloonEval *, int);
+void		workshop_beval_cb(BalloonEval *, int);
 #endif
 static char	*fixAccelText(char *);
 static void	 addMenu(char *, char *, char *);
@@ -74,7 +74,6 @@
 int		 usingSunWorkShop = 0;	/* set if -ws flag is used */
 char		 curMenuName[BUFSIZ];
 char		 curMenuPriority[BUFSIZ];
-BalloonEval	*balloonEval;
 
 static Boolean	 workshopInitDone = False;
 static Boolean	 workshopHotKeysEnabled = False;
@@ -220,21 +219,7 @@
 #endif
 
 #ifdef FEAT_BEVAL
-    if (balloonEval == NULL)
-    {
-	/*
-	 * Set up the Balloon Expression Evaluation area.
-	 * It's enabled by default.  Disable it when 'ballooneval' is off.
-	 */
-# ifdef FEAT_GUI_GTK
-	balloonEval = gui_mch_create_beval_area(gui.drawarea, NULL,
-							      &bevalCB, NULL);
-# else
-	balloonEval = gui_mch_create_beval_area(textArea, NULL, bevalCB, NULL);
-# endif
-	if (!p_beval)
-	    gui_mch_disable_beval_area(balloonEval);
-    }
+    bevalServers |= BEVAL_WORKSHOP;
 #endif
 
     load_window(filename, line);
@@ -1566,15 +1551,15 @@
 }
 
 #ifdef FEAT_BEVAL
-    static void
-bevalCB(
+    void
+workshop_beval_cb(
 	BalloonEval	*beval,
 	int		 state)
 {
-    char_u	*filename;
+    win_T	*wp;
     char_u	*text;
     int		 type;
-    int		 line;
+    linenr_T	 lnum;
     int		 col;
     int		 idx;
     char	 buf[MAXPATHLEN * 2];
@@ -1583,7 +1568,7 @@
     if (!p_beval)
 	return;
 
-    if (gui_mch_get_beval_info(beval, &filename, &line, &text, &col) == OK)
+    if (get_beval_info(beval, FALSE, &wp, &lnum, &text, &col) == OK)
     {
 	if (text && text[0])
 	{
@@ -1606,7 +1591,7 @@
 	    idx = computeIndex(col, text, beval->ts);
 	    if (idx > 0)
 	    {
-		line = 0;
+		lnum = 0;
 
 		/*
 		 * If successful, it will respond with a balloon cmd.
@@ -1623,9 +1608,10 @@
 
 		/* Send request to dbx */
 		sprintf(buf, "toolVerb debug.balloonEval "
-			"%s %d,0 %d,0 %d,%d %d %s\n", (char *) filename,
-			line, idx, type, serialNo++,
-			strlen((char *) text), (char *) text);
+			"%s %ld,0 %d,0 %d,%d %ld %s\n",
+			(char *)wp->w_buffer->b_ffname,
+			(long)lnum, idx, type, serialNo++,
+			(long)strlen((char *)text), (char *)text);
 		balloonEval = beval;
 		workshop_send_message(buf);
 	    }