1
0
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:
William M. Brack
2004-05-10 07:52:15 +00:00
parent 6d38c750b7
commit f9b5fa2dec
2 changed files with 29 additions and 0 deletions

View File

@ -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 *