Index: third_party/libxml/src/xmlregexp.c |
diff --git a/third_party/libxml/src/xmlregexp.c b/third_party/libxml/src/xmlregexp.c |
index feae87460ed5b58923b78c9dd76ed3deb98a4999..3e912ab92e803abc3e48215f1479b97a296256b1 100644 |
--- a/third_party/libxml/src/xmlregexp.c |
+++ b/third_party/libxml/src/xmlregexp.c |
@@ -1,7 +1,7 @@ |
/* |
* regexp.c: generic and extensible Regular Expression engine |
* |
- * Basically designed with the purpose of compiling regexps for |
+ * Basically designed with the purpose of compiling regexps for |
* the variety of validation/shemas mechanisms now available in |
* XML related specifications these include: |
* - XML-1.0 DTD validation |
@@ -44,6 +44,9 @@ |
#define MAX_PUSH 10000000 |
+#ifdef ERROR |
+#undef ERROR |
+#endif |
#define ERROR(str) \ |
ctxt->error = XML_REGEXP_COMPILE_ERROR; \ |
xmlRegexpErrCompile(ctxt, str); |
@@ -65,15 +68,15 @@ |
* |
* macro to flag unimplemented blocks |
*/ |
-#define TODO \ |
+#define TODO \ |
xmlGenericError(xmlGenericErrorContext, \ |
"Unimplemented block at %s:%d\n", \ |
__FILE__, __LINE__); |
/************************************************************************ |
- * * |
- * Datatypes and structures * |
- * * |
+ * * |
+ * Datatypes and structures * |
+ * * |
************************************************************************/ |
/* |
@@ -219,6 +222,7 @@ struct _xmlRegTrans { |
struct _xmlAutomataState { |
xmlRegStateType type; |
xmlRegMarkedType mark; |
+ xmlRegMarkedType markd; |
xmlRegMarkedType reached; |
int no; |
int maxTrans; |
@@ -361,7 +365,7 @@ void xmlAutomataSetFlags(xmlAutomataPtr am, int flags); |
/************************************************************************ |
* * |
- * Regexp memory error handler * |
+ * Regexp memory error handler * |
* * |
************************************************************************/ |
/** |
@@ -408,9 +412,9 @@ xmlRegexpErrCompile(xmlRegParserCtxtPtr ctxt, const char *extra) |
} |
/************************************************************************ |
- * * |
- * Allocation/Deallocation * |
- * * |
+ * * |
+ * Allocation/Deallocation * |
+ * * |
************************************************************************/ |
static int xmlFAComputesDeterminism(xmlRegParserCtxtPtr ctxt); |
@@ -931,9 +935,9 @@ xmlRegFreeParserCtxt(xmlRegParserCtxtPtr ctxt) { |
} |
/************************************************************************ |
- * * |
- * Display of Data structures * |
- * * |
+ * * |
+ * Display of Data structures * |
+ * * |
************************************************************************/ |
static void |
@@ -1140,7 +1144,7 @@ xmlRegPrintTrans(FILE *output, xmlRegTransPtr trans) { |
fprintf(output, "char %c ", trans->atom->codepoint); |
fprintf(output, "atom %d, to %d\n", trans->atom->no, trans->to); |
} |
- |
+ |
static void |
xmlRegPrintState(FILE *output, xmlRegStatePtr state) { |
int i; |
@@ -1154,7 +1158,7 @@ xmlRegPrintState(FILE *output, xmlRegStatePtr state) { |
fprintf(output, "START "); |
if (state->type == XML_REGEXP_FINAL_STATE) |
fprintf(output, "FINAL "); |
- |
+ |
fprintf(output, "%d, %d transitions:\n", state->no, state->nbTrans); |
for (i = 0;i < state->nbTrans; i++) { |
xmlRegPrintTrans(output, &(state->trans[i])); |
@@ -1204,12 +1208,12 @@ xmlRegPrintCtxt(FILE *output, xmlRegParserCtxtPtr ctxt) { |
#endif |
/************************************************************************ |
- * * |
+ * * |
* Finite Automata structures manipulations * |
- * * |
+ * * |
************************************************************************/ |
-static void |
+static void |
xmlRegAtomAddRange(xmlRegParserCtxtPtr ctxt, xmlRegAtomPtr atom, |
int neg, xmlRegAtomType type, int start, int end, |
xmlChar *blockName) { |
@@ -1249,7 +1253,7 @@ xmlRegAtomAddRange(xmlRegParserCtxtPtr ctxt, xmlRegAtomPtr atom, |
return; |
range->blockName = blockName; |
atom->ranges[atom->nbRanges++] = range; |
- |
+ |
} |
static int |
@@ -1280,7 +1284,7 @@ xmlRegGetCounter(xmlRegParserCtxtPtr ctxt) { |
return(ctxt->nbCounters++); |
} |
-static int |
+static int |
xmlRegAtomPush(xmlRegParserCtxtPtr ctxt, xmlRegAtomPtr atom) { |
if (atom == NULL) { |
ERROR("atom push: atom is NULL"); |
@@ -1312,7 +1316,7 @@ xmlRegAtomPush(xmlRegParserCtxtPtr ctxt, xmlRegAtomPtr atom) { |
return(0); |
} |
-static void |
+static void |
xmlRegStateAddTransTo(xmlRegParserCtxtPtr ctxt, xmlRegStatePtr target, |
int from) { |
if (target->maxTransTo == 0) { |
@@ -1340,7 +1344,7 @@ xmlRegStateAddTransTo(xmlRegParserCtxtPtr ctxt, xmlRegStatePtr target, |
target->nbTransTo++; |
} |
-static void |
+static void |
xmlRegStateAddTrans(xmlRegParserCtxtPtr ctxt, xmlRegStatePtr state, |
xmlRegAtomPtr atom, xmlRegStatePtr target, |
int counter, int count) { |
@@ -1406,7 +1410,7 @@ xmlRegStateAddTrans(xmlRegParserCtxtPtr ctxt, xmlRegStatePtr state, |
printf("counted %d\n", counter); |
else if (atom == NULL) |
printf("epsilon transition\n"); |
- else if (atom != NULL) |
+ else if (atom != NULL) |
xmlRegPrintAtom(stdout, atom); |
#endif |
@@ -1560,7 +1564,7 @@ xmlFAGenerateTransitions(xmlRegParserCtxtPtr ctxt, xmlRegStatePtr from, |
*/ |
xmlFAGenerateEpsilonTransition(ctxt, atom->stop, to); |
#ifdef DV |
- } else if ((to == NULL) && (atom->quant != XML_REGEXP_QUANT_RANGE) && |
+ } else if ((to == NULL) && (atom->quant != XML_REGEXP_QUANT_RANGE) && |
(atom->quant != XML_REGEXP_QUANT_ONCE)) { |
to = xmlRegNewState(ctxt); |
xmlRegStatePush(ctxt, to); |
@@ -1574,7 +1578,7 @@ xmlFAGenerateTransitions(xmlRegParserCtxtPtr ctxt, xmlRegStatePtr from, |
/* |
* transition done to the state after end of atom. |
* 1. set transition from atom start to new state |
- * 2. set transition from atom end to this state. |
+ * 2. set transition from atom end to this state. |
*/ |
if (to == NULL) { |
xmlFAGenerateEpsilonTransition(ctxt, atom->start, 0); |
@@ -1618,7 +1622,7 @@ xmlFAGenerateTransitions(xmlRegParserCtxtPtr ctxt, xmlRegStatePtr from, |
/* |
* duplicate a transition based on atom to count next |
* occurences after 1. We cannot loop to atom->start |
- * directly because we need an epsilon transition to |
+ * directly because we need an epsilon transition to |
* newstate. |
*/ |
/* ???? For some reason it seems we never reach that |
@@ -1677,7 +1681,7 @@ xmlFAGenerateTransitions(xmlRegParserCtxtPtr ctxt, xmlRegStatePtr from, |
break; |
} |
return(0); |
- } |
+ } |
if ((atom->min == 0) && (atom->max == 0) && |
(atom->quant == XML_REGEXP_QUANT_RANGE)) { |
/* |
@@ -1703,9 +1707,9 @@ xmlFAGenerateTransitions(xmlRegParserCtxtPtr ctxt, xmlRegStatePtr from, |
else { |
return(-1); |
} |
- } |
+ } |
end = to; |
- if ((atom->quant == XML_REGEXP_QUANT_MULT) || |
+ if ((atom->quant == XML_REGEXP_QUANT_MULT) || |
(atom->quant == XML_REGEXP_QUANT_PLUS)) { |
/* |
* Do not pollute the target state by adding transitions from |
@@ -1713,7 +1717,7 @@ xmlFAGenerateTransitions(xmlRegParserCtxtPtr ctxt, xmlRegStatePtr from, |
* So isolate with an epsilon transition. |
*/ |
xmlRegStatePtr tmp; |
- |
+ |
tmp = xmlRegNewState(ctxt); |
if (tmp != NULL) |
xmlRegStatePush(ctxt, tmp); |
@@ -1742,7 +1746,7 @@ xmlFAGenerateTransitions(xmlRegParserCtxtPtr ctxt, xmlRegStatePtr from, |
atom->quant = XML_REGEXP_QUANT_ONCE; |
xmlRegStateAddTrans(ctxt, to, atom, to, -1, -1); |
break; |
- case XML_REGEXP_QUANT_RANGE: |
+ case XML_REGEXP_QUANT_RANGE: |
#if DV_test |
if (atom->min == 0) { |
xmlFAGenerateEpsilonTransition(ctxt, from, to); |
@@ -1759,7 +1763,7 @@ xmlFAGenerateTransitions(xmlRegParserCtxtPtr ctxt, xmlRegStatePtr from, |
* xmlFAReduceEpsilonTransitions: |
* @ctxt: a regexp parser context |
* @fromnr: the from state |
- * @tonr: the to state |
+ * @tonr: the to state |
* @counter: should that transition be associated to a counted |
* |
*/ |
@@ -1803,7 +1807,7 @@ xmlFAReduceEpsilonTransitions(xmlRegParserCtxtPtr ctxt, int fromnr, |
int newto = to->trans[transnr].to; |
xmlRegStateAddTrans(ctxt, from, NULL, |
- ctxt->states[newto], |
+ ctxt->states[newto], |
-1, to->trans[transnr].count); |
} else { |
#ifdef DEBUG_REGEXP_GRAPH |
@@ -1825,11 +1829,11 @@ xmlFAReduceEpsilonTransitions(xmlRegParserCtxtPtr ctxt, int fromnr, |
int newto = to->trans[transnr].to; |
if (to->trans[transnr].counter >= 0) { |
- xmlRegStateAddTrans(ctxt, from, to->trans[transnr].atom, |
- ctxt->states[newto], |
+ xmlRegStateAddTrans(ctxt, from, to->trans[transnr].atom, |
+ ctxt->states[newto], |
to->trans[transnr].counter, -1); |
} else { |
- xmlRegStateAddTrans(ctxt, from, to->trans[transnr].atom, |
+ xmlRegStateAddTrans(ctxt, from, to->trans[transnr].atom, |
ctxt->states[newto], counter, -1); |
} |
} |
@@ -1841,7 +1845,7 @@ xmlFAReduceEpsilonTransitions(xmlRegParserCtxtPtr ctxt, int fromnr, |
* xmlFAEliminateSimpleEpsilonTransitions: |
* @ctxt: a regexp parser context |
* |
- * Eliminating general epsilon transitions can get costly in the general |
+ * Eliminating general epsilon transitions can get costly in the general |
* algorithm due to the large amount of generated new transitions and |
* associated comparisons. However for simple epsilon transition used just |
* to separate building blocks when generating the automata this can be |
@@ -1877,12 +1881,12 @@ xmlFAEliminateSimpleEpsilonTransitions(xmlRegParserCtxtPtr ctxt) { |
#ifdef DEBUG_REGEXP_GRAPH |
printf("Found simple epsilon trans from start %d to %d\n", |
statenr, newto); |
-#endif |
+#endif |
} else { |
#ifdef DEBUG_REGEXP_GRAPH |
printf("Found simple epsilon trans from %d to %d\n", |
statenr, newto); |
-#endif |
+#endif |
for (i = 0;i < state->nbTransTo;i++) { |
tmp = ctxt->states[state->transTo[i]]; |
for (j = 0;j < tmp->nbTrans;j++) { |
@@ -1890,10 +1894,10 @@ xmlFAEliminateSimpleEpsilonTransitions(xmlRegParserCtxtPtr ctxt) { |
#ifdef DEBUG_REGEXP_GRAPH |
printf("Changed transition %d on %d to go to %d\n", |
j, tmp->no, newto); |
-#endif |
+#endif |
tmp->trans[j].to = -1; |
xmlRegStateAddTrans(ctxt, tmp, tmp->trans[j].atom, |
- ctxt->states[newto], |
+ ctxt->states[newto], |
tmp->trans[j].counter, |
tmp->trans[j].count); |
} |
@@ -1907,7 +1911,7 @@ xmlFAEliminateSimpleEpsilonTransitions(xmlRegParserCtxtPtr ctxt) { |
state->type = XML_REGEXP_UNREACH_STATE; |
} |
- |
+ |
} |
} |
} |
@@ -2109,7 +2113,7 @@ xmlFACompareRanges(xmlRegRangePtr range1, xmlRegRangePtr range2) { |
/* |
* just check all codepoints in the range for acceptance, |
* this is usually way cheaper since done only once at |
- * compilation than testing over and over at runtime or |
+ * compilation than testing over and over at runtime or |
* pushing too many states when evaluating. |
*/ |
if (((range1->neg == 0) && (range2->neg != 0)) || |
@@ -2586,6 +2590,8 @@ xmlFARecurseDeterminism(xmlRegParserCtxtPtr ctxt, xmlRegStatePtr state, |
if (state == NULL) |
return(ret); |
+ if (state->markd == XML_REGEXP_MARK_VISITED) |
+ return(ret); |
if (ctxt->flags & AM_AUTOMATA_RNG) |
deep = 0; |
@@ -2603,8 +2609,10 @@ xmlFARecurseDeterminism(xmlRegParserCtxtPtr ctxt, xmlRegStatePtr state, |
if (t1->atom == NULL) { |
if (t1->to < 0) |
continue; |
+ state->markd = XML_REGEXP_MARK_VISITED; |
res = xmlFARecurseDeterminism(ctxt, ctxt->states[t1->to], |
to, atom); |
+ state->markd = 0; |
if (res == 0) { |
ret = 0; |
/* t1->nd = 1; */ |
@@ -2773,9 +2781,9 @@ xmlFAComputesDeterminism(xmlRegParserCtxtPtr ctxt) { |
} |
/************************************************************************ |
- * * |
+ * * |
* Routines to check input against transition atoms * |
- * * |
+ * * |
************************************************************************/ |
static int |
@@ -2804,7 +2812,7 @@ xmlRegCheckCharacterRange(xmlRegAtomType type, int codepoint, int neg, |
case XML_REGEXP_NOTINITNAME: |
neg = !neg; |
case XML_REGEXP_INITNAME: |
- ret = (IS_LETTER(codepoint) || |
+ ret = (IS_LETTER(codepoint) || |
(codepoint == '_') || (codepoint == ':')); |
break; |
case XML_REGEXP_NOTNAMECHAR: |
@@ -3052,9 +3060,9 @@ xmlRegCheckCharacter(xmlRegAtomPtr atom, int codepoint) { |
} |
/************************************************************************ |
- * * |
+ * * |
* Saving and restoring state of an execution context * |
- * * |
+ * * |
************************************************************************/ |
#ifdef DEBUG_REGEXP_EXEC |
@@ -3154,8 +3162,10 @@ xmlFARegExecRollBack(xmlRegExecCtxtPtr exec) { |
exec->status = -6; |
return; |
} |
- memcpy(exec->counts, exec->rollbacks[exec->nbRollbacks].counts, |
+ if (exec->counts) { |
+ memcpy(exec->counts, exec->rollbacks[exec->nbRollbacks].counts, |
exec->comp->nbCounters * sizeof(int)); |
+ } |
} |
#ifdef DEBUG_REGEXP_EXEC |
@@ -3165,9 +3175,9 @@ xmlFARegExecRollBack(xmlRegExecCtxtPtr exec) { |
} |
/************************************************************************ |
- * * |
+ * * |
* Verifier, running an input against a compiled regexp * |
- * * |
+ * * |
************************************************************************/ |
static int |
@@ -3199,7 +3209,7 @@ xmlFARegExec(xmlRegexpPtr comp, const xmlChar *content) { |
memset(exec->counts, 0, comp->nbCounters * sizeof(int)); |
} else |
exec->counts = NULL; |
- while ((exec->status == 0) && |
+ while ((exec->status == 0) && (exec->state != NULL) && |
((exec->inputString[exec->index] != 0) || |
((exec->state != NULL) && |
(exec->state->type != XML_REGEXP_FINAL_STATE)))) { |
@@ -3453,6 +3463,8 @@ error: |
} |
xmlFree(exec->rollbacks); |
} |
+ if (exec->state == NULL) |
+ return(-1); |
if (exec->counts != NULL) |
xmlFree(exec->counts); |
if (exec->status == 0) |
@@ -3466,9 +3478,9 @@ error: |
} |
/************************************************************************ |
- * * |
+ * * |
* Progressive interface to the verifier one atom at a time * |
- * * |
+ * * |
************************************************************************/ |
#ifdef DEBUG_ERR |
static void testerr(xmlRegExecCtxtPtr exec); |
@@ -3585,7 +3597,7 @@ xmlFARegExecSaveInputString(xmlRegExecCtxtPtr exec, const xmlChar *value, |
#endif |
if (exec->inputStackMax == 0) { |
exec->inputStackMax = 4; |
- exec->inputStack = (xmlRegInputTokenPtr) |
+ exec->inputStack = (xmlRegInputTokenPtr) |
xmlMalloc(exec->inputStackMax * sizeof(xmlRegInputToken)); |
if (exec->inputStack == NULL) { |
xmlRegexpErrMemory(NULL, "pushing input string"); |
@@ -3614,11 +3626,11 @@ xmlFARegExecSaveInputString(xmlRegExecCtxtPtr exec, const xmlChar *value, |
/** |
* xmlRegStrEqualWildcard: |
- * @expStr: the string to be evaluated |
+ * @expStr: the string to be evaluated |
* @valStr: the validation string |
* |
* Checks if both strings are equal or have the same content. "*" |
- * can be used as a wildcard in @valStr; "|" is used as a seperator of |
+ * can be used as a wildcard in @valStr; "|" is used as a seperator of |
* substrings in both @expStr and @valStr. |
* |
* Returns 1 if the comparison is satisfied and the number of substrings |
@@ -3684,7 +3696,7 @@ xmlRegCompactPushString(xmlRegExecCtxtPtr exec, |
if ((comp == NULL) || (comp->compact == NULL) || (comp->stringMap == NULL)) |
return(-1); |
- |
+ |
if (value == NULL) { |
/* |
* are we at a final state ? |
@@ -3705,9 +3717,9 @@ xmlRegCompactPushString(xmlRegExecCtxtPtr exec, |
for (i = 0;i < comp->nbstrings;i++) { |
target = comp->compact[state * (comp->nbstrings + 1) + i + 1]; |
if ((target > 0) && (target <= comp->nbstates)) { |
- target--; /* to avoid 0 */ |
+ target--; /* to avoid 0 */ |
if (xmlRegStrEqualWildcard(comp->stringMap[i], value)) { |
- exec->index = target; |
+ exec->index = target; |
if ((exec->callback != NULL) && (comp->transdata != NULL)) { |
exec->callback(exec->data, value, |
comp->transdata[state * comp->nbstrings + i], data); |
@@ -3841,7 +3853,7 @@ xmlRegExecPushStringInternal(xmlRegExecCtxtPtr exec, const xmlChar *value, |
continue; |
counter = &exec->comp->counters[t->counter]; |
count = exec->counts[t->counter]; |
- if ((count < counter->max) && |
+ if ((count < counter->max) && |
(t->atom != NULL) && |
(xmlStrEqual(value, t->atom->valuep))) { |
ret = 0; |
@@ -4081,7 +4093,7 @@ rollback: |
*/ |
exec->determinist = 0; |
xmlFARegExecRollBack(exec); |
- if (exec->status == 0) { |
+ if ((exec->inputStack != NULL ) && (exec->status == 0)) { |
value = exec->inputStack[exec->index].value; |
data = exec->inputStack[exec->index].data; |
#ifdef DEBUG_PUSH |
@@ -4199,7 +4211,7 @@ xmlRegExecGetValues(xmlRegExecCtxtPtr exec, int err, |
int maxval; |
int nb = 0; |
- if ((exec == NULL) || (nbval == NULL) || (nbneg == NULL) || |
+ if ((exec == NULL) || (nbval == NULL) || (nbneg == NULL) || |
(values == NULL) || (*nbval <= 0)) |
return(-1); |
@@ -4296,7 +4308,7 @@ xmlRegExecGetValues(xmlRegExecCtxtPtr exec, int err, |
(*nbval)++; |
} |
} else { |
- if ((exec->comp->states[trans->to] != NULL) && |
+ if ((exec->comp != NULL) && (exec->comp->states[trans->to] != NULL) && |
(exec->comp->states[trans->to]->type != |
XML_REGEXP_SINK_STATE)) { |
if (atom->neg) |
@@ -4305,7 +4317,7 @@ xmlRegExecGetValues(xmlRegExecCtxtPtr exec, int err, |
values[nb++] = (xmlChar *) atom->valuep; |
(*nbval)++; |
} |
- } |
+ } |
} |
for (transno = 0; |
(transno < state->nbTrans) && (nb < maxval); |
@@ -4332,7 +4344,7 @@ xmlRegExecGetValues(xmlRegExecCtxtPtr exec, int err, |
values[nb++] = (xmlChar *) atom->valuep; |
(*nbneg)++; |
} |
- } |
+ } |
} |
} |
return(0); |
@@ -4563,10 +4575,10 @@ progress: |
} |
#endif |
/************************************************************************ |
- * * |
+ * * |
* Parser for the Schemas Datatype Regular Expressions * |
* http://www.w3.org/TR/2001/REC-xmlschema-2-20010502/#regexs * |
- * * |
+ * * |
************************************************************************/ |
/** |
@@ -4595,7 +4607,7 @@ xmlFAIsChar(xmlRegParserCtxtPtr ctxt) { |
* |
* [27] charProp ::= IsCategory | IsBlock |
* [28] IsCategory ::= Letters | Marks | Numbers | Punctuation | |
- * Separators | Symbols | Others |
+ * Separators | Symbols | Others |
* [29] Letters ::= 'L' [ultmo]? |
* [30] Marks ::= 'M' [nce]? |
* [31] Numbers ::= 'N' [dlo]? |
@@ -4610,7 +4622,7 @@ xmlFAParseCharProp(xmlRegParserCtxtPtr ctxt) { |
int cur; |
xmlRegAtomType type = (xmlRegAtomType) 0; |
xmlChar *blockName = NULL; |
- |
+ |
cur = CUR; |
if (cur == 'L') { |
NEXT; |
@@ -4782,15 +4794,15 @@ xmlFAParseCharProp(xmlRegParserCtxtPtr ctxt) { |
NEXT; |
start = ctxt->cur; |
cur = CUR; |
- if (((cur >= 'a') && (cur <= 'z')) || |
- ((cur >= 'A') && (cur <= 'Z')) || |
- ((cur >= '0') && (cur <= '9')) || |
+ if (((cur >= 'a') && (cur <= 'z')) || |
+ ((cur >= 'A') && (cur <= 'Z')) || |
+ ((cur >= '0') && (cur <= '9')) || |
(cur == 0x2D)) { |
NEXT; |
cur = CUR; |
- while (((cur >= 'a') && (cur <= 'z')) || |
- ((cur >= 'A') && (cur <= 'Z')) || |
- ((cur >= '0') && (cur <= '9')) || |
+ while (((cur >= 'a') && (cur <= 'z')) || |
+ ((cur >= 'A') && (cur <= 'Z')) || |
+ ((cur >= '0') && (cur <= '9')) || |
(cur == 0x2D)) { |
NEXT; |
cur = CUR; |
@@ -4816,7 +4828,7 @@ xmlFAParseCharProp(xmlRegParserCtxtPtr ctxt) { |
* xmlFAParseCharClassEsc: |
* @ctxt: a regexp parser context |
* |
- * [23] charClassEsc ::= ( SingleCharEsc | MultiCharEsc | catEsc | complEsc ) |
+ * [23] charClassEsc ::= ( SingleCharEsc | MultiCharEsc | catEsc | complEsc ) |
* [24] SingleCharEsc ::= '\' [nrt\|.?*+(){}#x2D#x5B#x5D#x5E] |
* [25] catEsc ::= '\p{' charProp '}' |
* [26] complEsc ::= '\P{' charProp '}' |
@@ -4913,34 +4925,34 @@ xmlFAParseCharClassEsc(xmlRegParserCtxtPtr ctxt) { |
xmlRegAtomType type = XML_REGEXP_ANYSPACE; |
switch (cur) { |
- case 's': |
+ case 's': |
type = XML_REGEXP_ANYSPACE; |
break; |
- case 'S': |
+ case 'S': |
type = XML_REGEXP_NOTSPACE; |
break; |
- case 'i': |
+ case 'i': |
type = XML_REGEXP_INITNAME; |
break; |
- case 'I': |
+ case 'I': |
type = XML_REGEXP_NOTINITNAME; |
break; |
- case 'c': |
+ case 'c': |
type = XML_REGEXP_NAMECHAR; |
break; |
- case 'C': |
+ case 'C': |
type = XML_REGEXP_NOTNAMECHAR; |
break; |
- case 'd': |
+ case 'd': |
type = XML_REGEXP_DECIMAL; |
break; |
- case 'D': |
+ case 'D': |
type = XML_REGEXP_NOTDECIMAL; |
break; |
- case 'w': |
+ case 'w': |
type = XML_REGEXP_REALCHAR; |
break; |
- case 'W': |
+ case 'W': |
type = XML_REGEXP_NOTREALCHAR; |
break; |
} |
@@ -4960,7 +4972,7 @@ xmlFAParseCharClassEsc(xmlRegParserCtxtPtr ctxt) { |
* xmlFAParseCharRange: |
* @ctxt: a regexp parser context |
* |
- * [17] charRange ::= seRange | XmlCharRef | XmlCharIncDash |
+ * [17] charRange ::= seRange | XmlCharRef | XmlCharIncDash |
* [18] seRange ::= charOrEsc '-' charOrEsc |
* [20] charOrEsc ::= XmlChar | SingleCharEsc |
* [21] XmlChar ::= [^\#x2D#x5B#x5D] |
@@ -5075,7 +5087,7 @@ xmlFAParsePosCharGroup(xmlRegParserCtxtPtr ctxt) { |
* |
* [13] charGroup ::= posCharGroup | negCharGroup | charClassSub |
* [15] negCharGroup ::= '^' posCharGroup |
- * [16] charClassSub ::= ( posCharGroup | negCharGroup ) '-' charClassExpr |
+ * [16] charClassSub ::= ( posCharGroup | negCharGroup ) '-' charClassExpr |
* [12] charClassExpr ::= '[' charGroup ']' |
*/ |
static void |
@@ -5323,7 +5335,7 @@ xmlFAParseBranch(xmlRegParserCtxtPtr ctxt, xmlRegStatePtr to) { |
previous = ctxt->state; |
ret = xmlFAParsePiece(ctxt); |
if (ret != 0) { |
- if (xmlFAGenerateTransitions(ctxt, previous, |
+ if (xmlFAGenerateTransitions(ctxt, previous, |
(CUR=='|' || CUR==')') ? to : NULL, ctxt->atom) < 0) |
return(-1); |
previous = ctxt->state; |
@@ -5332,7 +5344,7 @@ xmlFAParseBranch(xmlRegParserCtxtPtr ctxt, xmlRegStatePtr to) { |
while ((ret != 0) && (ctxt->error == 0)) { |
ret = xmlFAParsePiece(ctxt); |
if (ret != 0) { |
- if (xmlFAGenerateTransitions(ctxt, previous, |
+ if (xmlFAGenerateTransitions(ctxt, previous, |
(CUR=='|' || CUR==')') ? to : NULL, ctxt->atom) < 0) |
return(-1); |
previous = ctxt->state; |
@@ -5370,6 +5382,10 @@ xmlFAParseRegExp(xmlRegParserCtxtPtr ctxt, int top) { |
end = ctxt->state; |
while ((CUR == '|') && (ctxt->error == 0)) { |
NEXT; |
+ if (CUR == 0) { |
+ ERROR("expecting a branch after |") |
+ return; |
+ } |
ctxt->state = start; |
ctxt->end = NULL; |
xmlFAParseBranch(ctxt, end); |
@@ -5381,9 +5397,9 @@ xmlFAParseRegExp(xmlRegParserCtxtPtr ctxt, int top) { |
} |
/************************************************************************ |
- * * |
- * The basic API * |
- * * |
+ * * |
+ * The basic API * |
+ * * |
************************************************************************/ |
/** |
@@ -5570,9 +5586,9 @@ xmlRegFreeRegexp(xmlRegexpPtr regexp) { |
#ifdef LIBXML_AUTOMATA_ENABLED |
/************************************************************************ |
- * * |
- * The Automata interface * |
- * * |
+ * * |
+ * The Automata interface * |
+ * * |
************************************************************************/ |
/** |
@@ -5693,8 +5709,6 @@ xmlAutomataNewTransition(xmlAutomataPtr am, xmlAutomataStatePtr from, |
if (atom == NULL) |
return(NULL); |
atom->data = data; |
- if (atom == NULL) |
- return(NULL); |
atom->valuep = xmlStrdup(token); |
if (xmlFAGenerateTransitions(am, from, to, atom) < 0) { |
@@ -5843,7 +5857,7 @@ xmlAutomataNewNegTrans(xmlAutomataPtr am, xmlAutomataStatePtr from, |
* |
* If @to is NULL, this creates first a new target state in the automata |
* and then adds a transition from the @from state to the target state |
- * activated by a succession of input of value @token and @token2 and |
+ * activated by a succession of input of value @token and @token2 and |
* whose number is between @min and @max |
* |
* Returns the target state or NULL in case of error |
@@ -5997,8 +6011,8 @@ xmlAutomataNewCountTrans(xmlAutomataPtr am, xmlAutomataStatePtr from, |
* |
* If @to is NULL, this creates first a new target state in the automata |
* and then adds a transition from the @from state to the target state |
- * activated by a succession of input of value @token and @token2 and whose |
- * number is between @min and @max, moreover that transition can only be |
+ * activated by a succession of input of value @token and @token2 and whose |
+ * number is between @min and @max, moreover that transition can only be |
* crossed once. |
* |
* Returns the target state or NULL in case of error |
@@ -6040,7 +6054,7 @@ xmlAutomataNewOnceTrans2(xmlAutomataPtr am, xmlAutomataStatePtr from, |
str[lenn + lenp + 1] = 0; |
atom->valuep = str; |
- } |
+ } |
atom->data = data; |
atom->quant = XML_REGEXP_QUANT_ONCEONLY; |
atom->min = min; |
@@ -6063,7 +6077,7 @@ xmlAutomataNewOnceTrans2(xmlAutomataPtr am, xmlAutomataStatePtr from, |
return(to); |
} |
- |
+ |
/** |
* xmlAutomataNewOnceTrans: |
@@ -6132,7 +6146,7 @@ xmlAutomataNewOnceTrans(xmlAutomataPtr am, xmlAutomataStatePtr from, |
*/ |
xmlAutomataStatePtr |
xmlAutomataNewState(xmlAutomataPtr am) { |
- xmlAutomataStatePtr to; |
+ xmlAutomataStatePtr to; |
if (am == NULL) |
return(NULL); |
@@ -6199,7 +6213,7 @@ xmlAutomataNewAllTrans(xmlAutomataPtr am, xmlAutomataStatePtr from, |
* |
* Returns the counter number or -1 in case of error |
*/ |
-int |
+int |
xmlAutomataNewCounter(xmlAutomataPtr am, int min, int max) { |
int ret; |
@@ -6271,7 +6285,7 @@ xmlAutomataNewCounterTrans(xmlAutomataPtr am, xmlAutomataStatePtr from, |
* |
* Returns the compiled regexp or NULL in case of error |
*/ |
-xmlRegexpPtr |
+xmlRegexpPtr |
xmlAutomataCompile(xmlAutomataPtr am) { |
xmlRegexpPtr ret; |
@@ -6291,7 +6305,7 @@ xmlAutomataCompile(xmlAutomataPtr am) { |
* |
* Returns 1 if true, 0 if not, and -1 in case of error |
*/ |
-int |
+int |
xmlAutomataIsDeterminist(xmlAutomataPtr am) { |
int ret; |
@@ -6344,7 +6358,7 @@ xmlExpNewCtxt(int maxNodes, xmlDictPtr dict) { |
if (maxNodes <= 4096) |
maxNodes = 4096; |
- |
+ |
ret = (xmlExpCtxtPtr) xmlMalloc(sizeof(xmlExpCtxt)); |
if (ret == NULL) |
return(NULL); |
@@ -6398,7 +6412,7 @@ xmlExpFreeCtxt(xmlExpCtxtPtr ctxt) { |
/* #define DEBUG_DERIV */ |
/* |
- * TODO: |
+ * TODO: |
* - Wildcards |
* - public API for creation |
* |
@@ -6466,11 +6480,11 @@ static unsigned short |
xmlExpHashNameComputeKey(const xmlChar *name) { |
unsigned short value = 0L; |
char ch; |
- |
+ |
if (name != NULL) { |
value += 30 * (*name); |
while ((ch = *name++) != 0) { |
- value = value ^ ((value << 5) + (value >> 3) + (unsigned short)ch); |
+ value = value ^ ((value << 5) + (value >> 3) + (unsigned long)ch); |
} |
} |
return (value); |
@@ -6485,7 +6499,7 @@ xmlExpHashComputeKey(xmlExpNodeType type, xmlExpNodePtr left, |
xmlExpNodePtr right) { |
unsigned long value; |
unsigned short ret; |
- |
+ |
switch (type) { |
case XML_EXP_SEQ: |
value = left->key; |
@@ -6626,7 +6640,7 @@ xmlExpHashGetEntry(xmlExpCtxtPtr ctxt, xmlExpNodeType type, |
left->exp_left->ref++; |
tmp = xmlExpHashGetEntry(ctxt, XML_EXP_OR, left->exp_left, tmp, |
NULL, 0, 0); |
- |
+ |
xmlExpFree(ctxt, left); |
return(tmp); |
} |
@@ -6683,7 +6697,7 @@ xmlExpHashGetEntry(xmlExpCtxtPtr ctxt, xmlExpNodeType type, |
return(right); |
} |
kbase = xmlExpHashComputeKey(type, left, right); |
- } else |
+ } else |
return(NULL); |
key = kbase % ctxt->size; |
@@ -6824,7 +6838,7 @@ xmlExpRef(xmlExpNodePtr exp) { |
* xmlExpNewAtom: |
* @ctxt: the expression context |
* @name: the atom name |
- * @len: the atom name lenght in byte (or -1); |
+ * @len: the atom name length in byte (or -1); |
* |
* Get the atom associated to this name from that context |
* |
@@ -6924,7 +6938,7 @@ xmlExpNewRange(xmlExpCtxtPtr ctxt, xmlExpNodePtr subset, int min, int max) { |
************************************************************************/ |
static int |
-xmlExpGetLanguageInt(xmlExpCtxtPtr ctxt, xmlExpNodePtr exp, |
+xmlExpGetLanguageInt(xmlExpCtxtPtr ctxt, xmlExpNodePtr exp, |
const xmlChar**list, int len, int nb) { |
int tmp, tmp2; |
tail: |
@@ -6961,7 +6975,7 @@ tail: |
* @ctxt: the expression context |
* @exp: the expression |
* @langList: where to store the tokens |
- * @len: the allocated lenght of @list |
+ * @len: the allocated length of @list |
* |
* Find all the strings used in @exp and store them in @list |
* |
@@ -6969,7 +6983,7 @@ tail: |
* -2 if there is more than @len strings |
*/ |
int |
-xmlExpGetLanguage(xmlExpCtxtPtr ctxt, xmlExpNodePtr exp, |
+xmlExpGetLanguage(xmlExpCtxtPtr ctxt, xmlExpNodePtr exp, |
const xmlChar**langList, int len) { |
if ((ctxt == NULL) || (exp == NULL) || (langList == NULL) || (len <= 0)) |
return(-1); |
@@ -6977,7 +6991,7 @@ xmlExpGetLanguage(xmlExpCtxtPtr ctxt, xmlExpNodePtr exp, |
} |
static int |
-xmlExpGetStartInt(xmlExpCtxtPtr ctxt, xmlExpNodePtr exp, |
+xmlExpGetStartInt(xmlExpCtxtPtr ctxt, xmlExpNodePtr exp, |
const xmlChar**list, int len, int nb) { |
int tmp, tmp2; |
tail: |
@@ -7027,7 +7041,7 @@ tail: |
* @ctxt: the expression context |
* @exp: the expression |
* @tokList: where to store the tokens |
- * @len: the allocated lenght of @list |
+ * @len: the allocated length of @list |
* |
* Find all the strings that appears at the start of the languages |
* accepted by @exp and store them in @list. E.g. for (a, b) | c |
@@ -7037,7 +7051,7 @@ tail: |
* -2 if there is more than @len strings |
*/ |
int |
-xmlExpGetStart(xmlExpCtxtPtr ctxt, xmlExpNodePtr exp, |
+xmlExpGetStart(xmlExpCtxtPtr ctxt, xmlExpNodePtr exp, |
const xmlChar**tokList, int len) { |
if ((ctxt == NULL) || (exp == NULL) || (tokList == NULL) || (len <= 0)) |
return(-1); |
@@ -7734,7 +7748,7 @@ xmlExpExpDeriveInt(xmlExpCtxtPtr ctxt, xmlExpNodePtr exp, xmlExpNodePtr sub) { |
xmlFree((xmlChar **) tab); |
return(ret); |
} |
- |
+ |
/** |
* xmlExpExpDerive: |
* @ctxt: the expressions context |
@@ -7786,7 +7800,7 @@ xmlExpExpDerive(xmlExpCtxtPtr ctxt, xmlExpNodePtr exp, xmlExpNodePtr sub) { |
int |
xmlExpSubsume(xmlExpCtxtPtr ctxt, xmlExpNodePtr exp, xmlExpNodePtr sub) { |
xmlExpNodePtr tmp; |
- |
+ |
if ((exp == NULL) || (ctxt == NULL) || (sub == NULL)) |
return(-1); |
@@ -7830,7 +7844,7 @@ xmlExpSubsume(xmlExpCtxtPtr ctxt, xmlExpNodePtr exp, xmlExpNodePtr sub) { |
/************************************************************************ |
* * |
- * Parsing expression * |
+ * Parsing expression * |
* * |
************************************************************************/ |
@@ -7934,7 +7948,7 @@ parse_quantifier: |
ret = xmlExpHashGetEntry(ctxt, XML_EXP_COUNT, ret, NULL, NULL, |
0, -1); |
SKIP_BLANKS |
- } |
+ } |
return(ret); |
} |
@@ -8056,7 +8070,7 @@ xmlExpDumpInt(xmlBufferPtr buf, xmlExpNodePtr expr, int glob) { |
break; |
case XML_EXP_COUNT: { |
char rep[40]; |
- |
+ |
c = expr->exp_left; |
if ((c->type == XML_EXP_SEQ) || (c->type == XML_EXP_OR)) |
xmlExpDumpInt(buf, c, 1); |