Enabled IDC parsing and validation. Added xmlSchemaCopyValue to the API;

* xmlschemas.c: Enabled IDC parsing and validation.
* xmlschemastypes.c include/libxml/xmlschemastypes.h:
  Added xmlSchemaCopyValue to the API; this was done due to
  validation of default attributes against IDCs: since IDC keys
  consume the precomputed value, one needs a copy.
* pattern.c: Enabled IDC support; this is currently done
  via calling xmlPatterncompile with a flag arg of 1.
diff --git a/pattern.c b/pattern.c
index 22d5c31..041039e 100644
--- a/pattern.c
+++ b/pattern.c
@@ -38,7 +38,7 @@
 #ifdef LIBXML_PATTERN_ENABLED
 
 /* #define DEBUG_STREAMING */
-/* #define SUPPORT_IDC */
+#define SUPPORT_IDC
 
 #define ERROR(a, b, c, d)
 #define ERROR5(a, b, c, d, e)
@@ -48,6 +48,8 @@
 #define XML_STREAM_STEP_ROOT	4
 #define XML_STREAM_STEP_ATTR	8
 
+#define XML_PATTERN_NOTPATTERN 1
+
 typedef struct _xmlStreamStep xmlStreamStep;
 typedef xmlStreamStep *xmlStreamStepPtr;
 struct _xmlStreamStep {
@@ -72,6 +74,7 @@
     int maxState;		/* allocated number of state */
     int level;			/* how deep are we ? */
     int *states;		/* the array of step indexes */
+    int flags;			/* validation options */
 };
 
 static void xmlFreeStreamComp(xmlStreamCompPtr comp);
@@ -1660,23 +1663,34 @@
 		
 	/*
 	* Check the start only if this is a "desc" evaluation
-	* of if we are at the first level of evaluation.
+	* or if we are at the first level of evaluation.
 	*/
-#ifdef SUPPORT_IDC
 	desc = comp->steps[0].flags & XML_STREAM_STEP_DESC;
+	if ( ((comp->steps[0].flags & XML_STREAM_STEP_ROOT) == 0) &&
+	     ( ((stream->flags & XML_PATTERN_NOTPATTERN) == 0) ||
+	       ( (desc || (stream->level == 1)) )
+	     )
+	   ) {
+
+/*
+#ifdef SUPPORT_IDC
+
+	
 	if ((desc || (stream->level == 1)) &&
 	    (!(comp->steps[0].flags & XML_STREAM_STEP_ROOT))) {
 
-	    /* 
+	    * 
 	    * Workaround for missing "self::node()" on "@foo".
-	    */
+	    *
 	    if (comp->steps[0].flags & XML_STREAM_STEP_ATTR) {
 		xmlStreamCtxtAddState(stream, 0, stream->level);
 		goto stream_next;
 	    }
 #else
+	    
 	if (!(comp->steps[0].flags & XML_STREAM_STEP_ROOT)) {
 #endif
+	*/
 	    match = 0;
 	    if (comp->dict) {
 		if (comp->steps[0].name == NULL) {
@@ -1685,21 +1699,21 @@
 		    else
 			match = (comp->steps[0].ns == ns);
 		} else {
-#ifdef SUPPORT_IDC
-		    /* 
-		    * Workaround for missing "self::node() on "foo".
-		    */
-		    if (!desc) {
-			xmlStreamCtxtAddState(stream, 0, stream->level);
-			goto stream_next;
+		    if (stream->flags & XML_PATTERN_NOTPATTERN) {
+			/* 
+			* Workaround for missing "self::node() on "foo".
+			*/
+			if (!desc) {
+			    xmlStreamCtxtAddState(stream, 0, stream->level);
+			    goto stream_next;
+			} else {
+			    match = ((comp->steps[0].name == name) &&
+				 (comp->steps[0].ns == ns));
+			}
 		    } else {
 			match = ((comp->steps[0].name == name) &&
 			     (comp->steps[0].ns == ns));
 		    }
-#else
-		    match = ((comp->steps[0].name == name) &&
-			     (comp->steps[0].ns == ns));
-#endif
 		}
 	    } else {
 		if (comp->steps[0].name == NULL) {
@@ -1708,21 +1722,21 @@
 		    else
 			match = xmlStrEqual(comp->steps[0].ns, ns);
 		} else {
-#ifdef SUPPORT_IDC
-		    /* 
-		    * Workaround for missing "self::node() on "foo".
-		    */
-		    if (!desc) {
-			xmlStreamCtxtAddState(stream, 0, stream->level);
-			goto stream_next;
+		    if (stream->flags & XML_PATTERN_NOTPATTERN) {
+			/* 
+			* Workaround for missing "self::node() on "foo".
+			*/
+			if (!desc) {
+			    xmlStreamCtxtAddState(stream, 0, stream->level);
+			    goto stream_next;
+			} else {
+			    match = ((xmlStrEqual(comp->steps[0].name, name)) &&
+				 (xmlStrEqual(comp->steps[0].ns, ns)));
+			}
 		    } else {
 			match = ((xmlStrEqual(comp->steps[0].name, name)) &&
 			     (xmlStrEqual(comp->steps[0].ns, ns)));
 		    }
-#else
-		    match = ((xmlStrEqual(comp->steps[0].name, name)) &&
-			     (xmlStrEqual(comp->steps[0].ns, ns)));
-#endif
 		}
 	    }
 	    if (match) {
@@ -1876,6 +1890,7 @@
 	    cur->next = ret->next;
 	    ret->next = cur;
 	}
+	cur->flags = flags;
 	ctxt->comp = cur;
 
 	xmlCompilePathPattern(ctxt);
@@ -1915,6 +1930,7 @@
 	    cur = cur->next;
 	}
     }
+
     return(ret);
 error:
     if (ctxt != NULL) xmlFreePatParserContext(ctxt);
@@ -1978,6 +1994,7 @@
 	    cur->next = ret->next;
 	    ret->next = cur;
 	}
+	cur->flags = comp->flags;
 	comp = comp->next;
     }
     return(ret);