diff src/regexp.c @ 189:504c627f7474

updated for version 7.0057
author vimboss
date Mon, 07 Mar 2005 23:16:51 +0000
parents 7e70fc748752
children 49748afd794b
line wrap: on
line diff
--- a/src/regexp.c
+++ b/src/regexp.c
@@ -3184,49 +3184,21 @@ vim_regexec_multi(rmp, win, buf, lnum, c
     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 @@ vim_regexec_both(line, col)
 	    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 @@ vim_regexec_both(line, col)
 	}
     }
 
-#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 @@ regtry(prog, col)
 	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;
-
-	if (prog->reghasz == REX_SET)
+    /* Package any found \z(...\) matches for export. Default is none. */
+    unref_extmatch(re_extmatch_out);
+    re_extmatch_out = NULL;
+
+    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;
+    return 1 + reglnum;
 }
 
 #ifdef FEAT_MBYTE
@@ -4601,7 +4522,12 @@ regmatch(scan)
 		    /* 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 @@ regmatch(scan)
 	  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 @@ regmatch(scan)
 	    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 @@ regmatch(scan)
 	    printf("Premature EOL\n");
 #endif
 	}
+	if (status == RA_FAIL)
+	    got_int = TRUE;
 	return (status == RA_MATCH);
     }
 
@@ -5071,6 +5004,11 @@ regstack_push(regstack, state, scan, sta
 {
     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;