mirror of
https://gitlab.gnome.org/GNOME/libxml2.git
synced 2025-07-14 20:01:04 +03:00
enhanced xmlRegStateAddTrans to check if transition is already present
* xmlregexp.c: enhanced xmlRegStateAddTrans to check if transition is already present and, if so, to ignore the request to add it. This has a very dramatic effect on memory requirements as well as efficiency. It also fixes bug 141762.
This commit is contained in:
22
xmlregexp.c
22
xmlregexp.c
@ -1182,6 +1182,9 @@ static void
|
||||
xmlRegStateAddTrans(xmlRegParserCtxtPtr ctxt, xmlRegStatePtr state,
|
||||
xmlRegAtomPtr atom, xmlRegStatePtr target,
|
||||
int counter, int count) {
|
||||
|
||||
int nrtrans;
|
||||
|
||||
if (state == NULL) {
|
||||
ERROR("add state: state is NULL");
|
||||
return;
|
||||
@ -1190,6 +1193,25 @@ xmlRegStateAddTrans(xmlRegParserCtxtPtr ctxt, xmlRegStatePtr state,
|
||||
ERROR("add state: target is NULL");
|
||||
return;
|
||||
}
|
||||
/*
|
||||
* Other routines follow the philosophy 'When in doubt, add a transition'
|
||||
* so we check here whether such a transition is already present and, if
|
||||
* so, silently ignore this request.
|
||||
*/
|
||||
|
||||
for (nrtrans=0; nrtrans<state->nbTrans; nrtrans++) {
|
||||
if ((state->trans[nrtrans].atom == atom) &&
|
||||
(state->trans[nrtrans].to == target->no) &&
|
||||
(state->trans[nrtrans].counter == counter) &&
|
||||
(state->trans[nrtrans].count == count)) {
|
||||
#ifdef DEBUG_REGEXP_GRAPH
|
||||
printf("Ignoring duplicate transition from %d to %d\n",
|
||||
state->no, target->no);
|
||||
#endif
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (state->maxTrans == 0) {
|
||||
state->maxTrans = 4;
|
||||
state->trans = (xmlRegTrans *) xmlMalloc(state->maxTrans *
|
||||
|
Reference in New Issue
Block a user