# HG changeset patch # User Karl Heuer # Date 766956370 0 # Node ID a8fe822b48dcfaa32977e824de45b6486ceed999 # Parent 34c91bb33ed043f83728cf74ef9ca8c8d3b8e0a2 *** empty log message *** diff -r 34c91bb33ed0 -r a8fe822b48dc src/regex.c --- a/src/regex.c Thu Apr 21 18:53:38 1994 +0000 +++ b/src/regex.c Thu Apr 21 19:26:10 1994 +0000 @@ -888,7 +888,7 @@ /* Avoiding alloca during matching, to placate r_alloc. */ -/* Define MATCH_MAY_ALLOCATE if we need to make sure that the +/* Define MATCH_MAY_ALLOCATE unless we need to make sure that the searching and matching functions should not call alloca. On some systems, alloca is implemented in terms of malloc, and if we're using the relocating allocator routines, then malloc could cause a @@ -1256,6 +1256,7 @@ We make the fail stack a global thing, and then grow it to re_max_failures when we compile. */ #ifndef MATCH_MAY_ALLOCATE +static int fail_stack_allocated; static fail_stack_type fail_stack; static const char ** regstart, ** regend; @@ -2493,10 +2494,19 @@ is strictly greater than re_max_failures, the largest possible stack is 2 * re_max_failures failure points. */ fail_stack.size = (2 * re_max_failures * MAX_FAILURE_ITEMS); - if (! fail_stack.stack) - fail_stack.stack = - (fail_stack_elt_t *) malloc (fail_stack.size - * sizeof (fail_stack_elt_t)); + if (fail_stack.size > fail_stack_allocated) + { + if (! fail_stack.stack) + fail_stack.stack = + (fail_stack_elt_t *) malloc (fail_stack.size + * sizeof (fail_stack_elt_t)); + else + fail_stack.stack = + (fail_stack_elt_t *) realloc (fail_stack.stack, + (fail_stack.size + * sizeof (fail_stack_elt_t))); + fail_stack_allocated = fail_stack.size; + } /* Initialize some other variables the matcher uses. */ RETALLOC_IF (regstart, num_regs, const char *);