William noticed I forgot to add special support for xmlmodules.c define

* gentest.py testapi.c: William noticed I forgot to add special
  support for xmlmodules.c define
* xmlregexp.c include/libxml/xmlregexp.h: added terminal to
  xmlRegExecErrInfo() API, adding new xmlRegExecNextValues()
  entry point and refactored to use both code.
Daniel
diff --git a/xmlregexp.c b/xmlregexp.c
index 6ef0d9e..099f68c 100644
--- a/xmlregexp.c
+++ b/xmlregexp.c
@@ -19,6 +19,8 @@
 
 #ifdef LIBXML_REGEXP_ENABLED
 
+#define DEBUG_ERR
+
 #include <stdio.h>
 #include <string.h>
 #ifdef HAVE_LIMITS_H
@@ -3107,37 +3109,26 @@
 }
 
 /**
- * xmlRegExecErrInfo:
- * @exec: a regexp execution context generating an error
- * @string: return value for the error string
+ * xmlRegExecGetalues:
+ * @exec: a regexp execution context
+ * @err: error extraction or normal one
  * @nbval: pointer to the number of accepted values IN/OUT
  * @values: pointer to the array of acceptable values
+ * @terminal: return value if this was a terminal state
  *
- * Extract error informations from the regexp execution, the parameter
- * @string will be updated with the value pushed and not accepted,
- * the parameter @values must point to an array of @nbval string pointers
- * on return nbval will contain the number of possible strings in that
- * state and the @values array will be updated with them. The string values
- * returned will be freed with the @exec context and don't need to be
- * deallocated.
+ * Extract informations from the regexp execution, internal routine to
+ * implement xmlRegExecNextValues() and xmlRegExecErrInfo()
  *
  * Returns: 0 in case of success or -1 in case of error.
  */
-int
-xmlRegExecErrInfo(xmlRegExecCtxtPtr exec, const xmlChar **string,
-                  int *nbval, xmlChar **values) {
+static int
+xmlRegExecGetValues(xmlRegExecCtxtPtr exec, int err,
+                    int *nbval, xmlChar **values, int *terminal) {
     int maxval;
 
-    if (exec == NULL)
+    if ((exec == NULL) || (nbval == NULL) || (values == NULL) || (*nbval <= 0))
         return(-1);
-    if (string != NULL) {
-        if (exec->status != 0)
-	    *string = exec->errString;
-	else
-	    *string = NULL;
-    }
-    if ((nbval == NULL) || (values == NULL) || (*nbval <= 0))
-        return(-1);
+
     maxval = *nbval;
     *nbval = 0;
     if ((exec->comp != NULL) && (exec->comp->compact != NULL)) {
@@ -3145,8 +3136,20 @@
 	int target, i, state;
 
         comp = exec->comp;
-        if (exec->errStateNo == -1) return(-1);
-	state = exec->errStateNo;
+
+	if (err) {
+	    if (exec->errStateNo == -1) return(-1);
+	    state = exec->errStateNo;
+	} else {
+	    state = exec->index;
+	}
+	if (terminal != NULL) {
+	    if (comp->compact[state * (comp->nbstrings + 1)] ==
+	        XML_REGEXP_FINAL_STATE)
+		*terminal = 1;
+	    else
+		*terminal = 0;
+	}
 	for (i = 0;(i < comp->nbstrings) && (*nbval < maxval);i++) {
 	    target = comp->compact[state * (comp->nbstrings + 1) + i + 1];
 	    if ((target > 0) && (target <= comp->nbstates)) {
@@ -3158,12 +3161,26 @@
         int transno;
 	xmlRegTransPtr trans;
 	xmlRegAtomPtr atom;
+	xmlRegStatePtr state;
 
-        if (exec->errState == NULL) return(-1);
+	if (terminal != NULL) {
+	    if (exec->state->type == XML_REGEXP_FINAL_STATE)
+		*terminal = 1;
+	    else
+		*terminal = 0;
+	}
+
+	if (err) {
+	    if (exec->errState == NULL) return(-1);
+	    state = exec->errState;
+	} else {
+	    if (exec->state == NULL) return(-1);
+	    state = exec->state;
+	}
 	for (transno = 0;
-	     (transno < exec->errState->nbTrans) && (*nbval < maxval);
+	     (transno < state->nbTrans) && (*nbval < maxval);
 	     transno++) {
-	    trans = &exec->errState->trans[transno];
+	    trans = &state->trans[transno];
 	    if (trans->to < 0)
 		continue;
 	    atom = trans->atom;
@@ -3177,14 +3194,17 @@
 		xmlRegCounterPtr counter;
 		int count;
 
-		count = exec->errCounts[trans->counter];
+		if (err)
+		    count = exec->errCounts[trans->counter];
+		else
+		    count = exec->counts[trans->counter];
 		counter = &exec->comp->counters[trans->counter];
 		if (count < counter->max) {
-		    values[*nbval] = (const xmlChar *) atom->valuep;
+		    values[*nbval] = (xmlChar *) atom->valuep;
 		    (*nbval)++;
 		}
 	    } else {
-		values[*nbval] = (const xmlChar *) atom->valuep;
+		values[*nbval] = (xmlChar *) atom->valuep;
 		(*nbval)++;
 	    } 
 	}
@@ -3192,12 +3212,67 @@
     return(0);
 }
 
+/**
+ * xmlRegExecNextValues:
+ * @exec: a regexp execution context
+ * @nbval: pointer to the number of accepted values IN/OUT
+ * @values: pointer to the array of acceptable values
+ * @terminal: return value if this was a terminal state
+ *
+ * Extract informations from the regexp execution,
+ * the parameter @values must point to an array of @nbval string pointers
+ * on return nbval will contain the number of possible strings in that
+ * state and the @values array will be updated with them. The string values
+ * returned will be freed with the @exec context and don't need to be
+ * deallocated.
+ *
+ * Returns: 0 in case of success or -1 in case of error.
+ */
+int
+xmlRegExecNextValues(xmlRegExecCtxtPtr exec, int *nbval, xmlChar **values,
+                     int *terminal) {
+    return(xmlRegExecGetValues(exec, 0, nbval, values, terminal));
+}
+
+/**
+ * xmlRegExecErrInfo:
+ * @exec: a regexp execution context generating an error
+ * @string: return value for the error string
+ * @nbval: pointer to the number of accepted values IN/OUT
+ * @values: pointer to the array of acceptable values
+ * @terminal: return value if this was a terminal state
+ *
+ * Extract error informations from the regexp execution, the parameter
+ * @string will be updated with the value pushed and not accepted,
+ * the parameter @values must point to an array of @nbval string pointers
+ * on return nbval will contain the number of possible strings in that
+ * state and the @values array will be updated with them. The string values
+ * returned will be freed with the @exec context and don't need to be
+ * deallocated.
+ *
+ * Returns: 0 in case of success or -1 in case of error.
+ */
+int
+xmlRegExecErrInfo(xmlRegExecCtxtPtr exec, const xmlChar **string,
+                  int *nbval, xmlChar **values, int *terminal) {
+    if (exec == NULL)
+        return(-1);
+    if (string != NULL) {
+        if (exec->status != 0)
+	    *string = exec->errString;
+	else
+	    *string = NULL;
+    }
+    return(xmlRegExecGetValues(exec, 1, nbval, values, terminal));
+}
+
 #ifdef DEBUG_ERR
 static void testerr(xmlRegExecCtxtPtr exec) {
     const xmlChar *string;
     const xmlChar *values[5];
     int nb = 5;
-    xmlRegExecErrInfo(exec, &string, &nb, &values[0]);
+    int terminal;
+    xmlRegExecErrInfo(exec, &string, &nb, &values[0], &terminal);
 }
 #endif