summaryrefslogtreecommitdiff
path: root/xmlregexp.c
diff options
context:
space:
mode:
authorDaniel Veillard <veillard@src.gnome.org>2002-04-20 07:24:11 +0000
committerDaniel Veillard <veillard@src.gnome.org>2002-04-20 07:24:11 +0000
commit8a001f62c195f956c7655df7464ff753b28bc957 (patch)
tree9a4d77ea4dc1abf8b528e81e4bdd15dc8a43eda7 /xmlregexp.c
parent7646b18d64b6c739d04ca453493070e88c4aab13 (diff)
downloadlibxml2-8a001f62c195f956c7655df7464ff753b28bc957.tar.gz
first implementation of the all particle, this may need to be revisited
* xmlregexp.c: first implementation of the all particle, this may need to be revisited for case where not all transitions must be crossed. Daniel
Diffstat (limited to 'xmlregexp.c')
-rw-r--r--xmlregexp.c35
1 files changed, 32 insertions, 3 deletions
diff --git a/xmlregexp.c b/xmlregexp.c
index 5d63c90b..c4a34e1d 100644
--- a/xmlregexp.c
+++ b/xmlregexp.c
@@ -690,7 +690,9 @@ xmlRegPrintTrans(FILE *output, xmlRegTransPtr trans) {
if (trans->counter >= 0) {
fprintf(output, "counted %d, ", trans->counter);
}
- if (trans->count >= 0) {
+ if (trans->count == REGEXP_ALL_COUNTER) {
+ fprintf(output, "all transition, ");
+ } else if (trans->count >= 0) {
fprintf(output, "count based %d, ", trans->count);
}
if (trans->atom == NULL) {
@@ -907,7 +909,9 @@ xmlRegStateAddTrans(xmlRegParserCtxtPtr ctxt, xmlRegStatePtr state,
}
#ifdef DEBUG_REGEXP_GRAPH
printf("Add trans from %d to %d ", state->no, target->no);
- if (count >= 0)
+ if (count == REGEXP_ALL_COUNTER)
+ printf("all transition");
+ else (count >= 0)
printf("count based %d", count);
else if (counter >= 0)
printf("counted %d", counter);
@@ -2023,7 +2027,32 @@ xmlRegExecPushString(xmlRegExecCtxtPtr exec, const xmlChar *value,
continue;
atom = trans->atom;
ret = 0;
- if (trans->count >= 0) {
+ if (trans->count == REGEXP_ALL_COUNTER) {
+ int i;
+ int count;
+ xmlRegTransPtr t;
+ xmlRegCounterPtr counter;
+
+ ret = 1;
+
+#ifdef DEBUG_PUSH
+ printf("testing all %d\n", trans->count);
+#endif
+ /*
+ * Check all counted transitions from the current state
+ */
+ for (i = 0;i < exec->state->nbTrans;i++) {
+ t = &exec->state->trans[i];
+ if ((t->counter < 0) || (t == trans))
+ continue;
+ counter = &exec->comp->counters[t->counter];
+ count = exec->counts[t->counter];
+ if ((count < counter->min) || (count > counter->max)) {
+ ret = 0;
+ break;
+ }
+ }
+ } else if (trans->count >= 0) {
int count;
xmlRegCounterPtr counter;