summaryrefslogtreecommitdiffstats
path: root/regex.c
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2015-09-15 00:41:17 -0700
committerKaz Kylheku <kaz@kylheku.com>2015-09-15 00:41:17 -0700
commit815f1dcda70f161b09813fc4fddc24c522ea71bf (patch)
tree5e51e4e0d8365cef1d4fc6f3a5f4f60cc7064ee0 /regex.c
parent943b5baa2d54fc1cc90758429c8a69c288f70868 (diff)
downloadtxr-815f1dcda70f161b09813fc4fddc24c522ea71bf.tar.gz
txr-815f1dcda70f161b09813fc4fddc24c522ea71bf.tar.bz2
txr-815f1dcda70f161b09813fc4fddc24c522ea71bf.zip
Use alloca for some temporary arrays in regex module.
* regex.c (nfa_free): Use alloca for array of all states. (nfa_run): Use alloca for move, closure and stack arrays.
Diffstat (limited to 'regex.c')
-rw-r--r--regex.c16
1 files changed, 5 insertions, 11 deletions
diff --git a/regex.c b/regex.c
index 24d66a42..65f14843 100644
--- a/regex.c
+++ b/regex.c
@@ -36,6 +36,7 @@
#include <signal.h>
#include <stdarg.h>
#include "config.h"
+#include ALLOCA_H
#include "lib.h"
#include "parser.h"
#include "signal.h"
@@ -1096,7 +1097,7 @@ static void nfa_collect_one(nfa_state_t *s, mem_t *ctx)
static void nfa_free(nfa_t nfa, int nstates)
{
- nfa_state_t **all = coerce(nfa_state_t **, chk_malloc(nstates * sizeof *all));
+ nfa_state_t **all = coerce(nfa_state_t **, alloca(nstates * sizeof *all));
nfa_state_t **pelem = all, *s = nfa.start;
unsigned visited = s->a.visited + 1;
int i;
@@ -1107,8 +1108,6 @@ static void nfa_free(nfa_t nfa, int nstates)
for (i = 0; i < nstates; i++)
nfa_state_free(all[i]);
-
- free(all);
}
/*
@@ -1242,9 +1241,9 @@ static cnum nfa_run(nfa_t nfa, int nstates, const wchar_t *str)
{
const wchar_t *last_accept_pos = 0, *ptr = str;
unsigned visited = nfa.start->a.visited + 1;
- nfa_state_t **move = coerce(nfa_state_t **, chk_malloc(nstates * sizeof *move));
- nfa_state_t **clos = coerce(nfa_state_t **, chk_malloc(nstates * sizeof *clos));
- nfa_state_t **stack = coerce(nfa_state_t **, chk_malloc(nstates * sizeof *stack));
+ nfa_state_t **move = coerce(nfa_state_t **, alloca(nstates * sizeof *move));
+ nfa_state_t **clos = coerce(nfa_state_t **, alloca(nstates * sizeof *clos));
+ nfa_state_t **stack = coerce(nfa_state_t **, alloca(nstates * sizeof *stack));
int nmove = 1, nclos;
int accept = 0;
@@ -1273,11 +1272,6 @@ static cnum nfa_run(nfa_t nfa, int nstates, const wchar_t *str)
}
nfa.start->a.visited = visited;
-
- free(stack);
- free(clos);
- free(move);
-
return last_accept_pos ? last_accept_pos - str : -1;
}