try to provide file and line informations, not all messages are covered,

* valid.c: try to provide file and line informations, not all
  messages are covered, but it's a (good) start
Daniel
diff --git a/valid.c b/valid.c
index 331f9fe..1e836d9 100644
--- a/valid.c
+++ b/valid.c
@@ -309,6 +309,28 @@
 
 /* TODO: use hash table for accesses to elem and attribute definitions */
 
+#define VECTXT(ctxt, node)					\
+   if ((ctxt != NULL) && (ctxt->error != NULL) &&		\
+       (node != NULL) && (node->type == XML_ELEMENT_NODE)) {	\
+       if ((node->doc != NULL) && (node->doc->URL != NULL))	\
+	   ctxt->error(ctxt->userData, "%s:%d:", node->doc->URL,\
+		       (int) node->content);			\
+       else							\
+	   ctxt->error(ctxt->userData, ":%d:", 			\
+		       (int) node->content);			\
+   }
+
+#define VWCTXT(ctxt, node)					\
+   if ((ctxt != NULL) && (ctxt->warning != NULL) &&		\
+       (node != NULL) && (node->type == XML_ELEMENT_NODE)) {	\
+       if ((node->doc != NULL) && (node->doc->URL != NULL))	\
+	   ctxt->warning(ctxt->userData, "%s:%d:", node->doc->URL,\
+		       (int) node->content);			\
+       else							\
+	   ctxt->warning(ctxt->userData, ":%d:", 		\
+		       (int) node->content);			\
+   }
+
 #define VERROR							\
    if ((ctxt != NULL) && (ctxt->error != NULL)) ctxt->error
 
@@ -3444,6 +3466,7 @@
 
     /* Validity Constraint: Attribute Value Type */
     if (attrDecl == NULL) {
+	VECTXT(ctxt, elem);
 	VERROR(ctxt->userData,
 	       "No declaration for attribute %s of element %s\n",
 	       attr->name, elem->name);
@@ -3453,6 +3476,7 @@
 
     val = xmlValidateAttributeValue(attrDecl->atype, value);
     if (val == 0) {
+	VECTXT(ctxt, elem);
 	VERROR(ctxt->userData, 
 	   "Syntax of value for attribute %s of %s is not valid\n",
 	       attr->name, elem->name);
@@ -3462,6 +3486,7 @@
     /* Validity constraint: Fixed Attribute Default */
     if (attrDecl->def == XML_ATTRIBUTE_FIXED) {
 	if (!xmlStrEqual(value, attrDecl->defaultValue)) {
+	    VECTXT(ctxt, elem);
 	    VERROR(ctxt->userData, 
 	   "Value for attribute %s of %s is different from default \"%s\"\n",
 		   attr->name, elem->name, attrDecl->defaultValue);
@@ -3492,6 +3517,7 @@
 	    nota = xmlGetDtdNotationDesc(doc->extSubset, value);
 	
 	if (nota == NULL) {
+	    VECTXT(ctxt, elem);
 	    VERROR(ctxt->userData, 
        "Value \"%s\" for attribute %s of %s is not a declared Notation\n",
 		   value, attr->name, elem->name);
@@ -3504,6 +3530,7 @@
 	    tree = tree->next;
 	}
 	if (tree == NULL) {
+	    VECTXT(ctxt, elem);
 	    VERROR(ctxt->userData, 
 "Value \"%s\" for attribute %s of %s is not among the enumerated notations\n",
 		   value, attr->name, elem->name);
@@ -3519,6 +3546,7 @@
 	    tree = tree->next;
 	}
 	if (tree == NULL) {
+	    VECTXT(ctxt, elem);
 	    VERROR(ctxt->userData, 
        "Value \"%s\" for attribute %s of %s is not among the enumerated set\n",
 		   value, attr->name, elem->name);
@@ -3529,6 +3557,7 @@
     /* Fixed Attribute Default */
     if ((attrDecl->def == XML_ATTRIBUTE_FIXED) &&
         (!xmlStrEqual(attrDecl->defaultValue, value))) {
+	VECTXT(ctxt, elem);
 	VERROR(ctxt->userData, 
 	   "Value for attribute %s of %s must be \"%s\"\n",
 	       attr->name, elem->name, attrDecl->defaultValue);
@@ -4036,6 +4065,7 @@
  * @child:  the child list
  * @elemDecl:  pointer to the element declaration
  * @warn:  emit the error message
+ * @parent: the parent element (for error reporting)
  *
  * Try to validate the content model of an element
  *
@@ -4044,7 +4074,7 @@
 
 static int
 xmlValidateElementContent(xmlValidCtxtPtr ctxt, xmlNodePtr child,
-       xmlElementPtr elemDecl, int warn) {
+       xmlElementPtr elemDecl, int warn, xmlNodePtr parent) {
     int ret;
     xmlNodePtr repl = NULL, last = NULL, cur, tmp;
     xmlElementContentPtr cont;
@@ -4184,20 +4214,24 @@
 		xmlSnprintfElements(list, 5000, child, 1);
 
 	    if (name != NULL) {
+		if (parent != NULL) VECTXT(ctxt, parent);
 		VERROR(ctxt->userData,
 	   "Element %s content does not follow the DTD\nExpecting %s, got %s\n",
 		       name, expr, list);
 	    } else {
+		if (parent != NULL) VECTXT(ctxt, parent);
 		VERROR(ctxt->userData,
 	   "Element content does not follow the DTD\nExpecting %s, got %s\n",
 		       expr, list);
 	    }
 	} else {
 	    if (name != NULL) {
+		if (parent != NULL) VECTXT(ctxt, parent);
 		VERROR(ctxt->userData,
 		       "Element %s content does not follow the DTD\n",
 		       name);
 	    } else {
+		if (parent != NULL) VECTXT(ctxt, parent);
 		VERROR(ctxt->userData,
 		       "Element content does not follow the DTD\n");
 	    }
@@ -4333,28 +4367,34 @@
     if (elem == NULL) return(0);
     switch (elem->type) {
         case XML_ATTRIBUTE_NODE:
+	    VECTXT(ctxt, elem);
 	    VERROR(ctxt->userData, 
 		   "Attribute element not expected here\n");
 	    return(0);
         case XML_TEXT_NODE:
 	    if (elem->children != NULL) {
+		VECTXT(ctxt, elem);
 		VERROR(ctxt->userData, "Text element has childs !\n");
 		return(0);
 	    }
 	    if (elem->properties != NULL) {
+		VECTXT(ctxt, elem);
 		VERROR(ctxt->userData, "Text element has attributes !\n");
 		return(0);
 	    }
 	    if (elem->ns != NULL) {
+		VECTXT(ctxt, elem);
 		VERROR(ctxt->userData, "Text element has namespace !\n");
 		return(0);
 	    }
 	    if (elem->nsDef != NULL) {
+		VECTXT(ctxt, elem);
 		VERROR(ctxt->userData, 
 		       "Text element carries namespace definitions !\n");
 		return(0);
 	    }
 	    if (elem->content == NULL) {
+		VECTXT(ctxt, elem);
 		VERROR(ctxt->userData, 
 		       "Text element has no content !\n");
 		return(0);
@@ -4369,26 +4409,31 @@
         case XML_COMMENT_NODE:
 	    return(1);
         case XML_ENTITY_NODE:
+	    VECTXT(ctxt, elem);
 	    VERROR(ctxt->userData, 
 		   "Entity element not expected here\n");
 	    return(0);
         case XML_NOTATION_NODE:
+	    VECTXT(ctxt, elem);
 	    VERROR(ctxt->userData, 
 		   "Notation element not expected here\n");
 	    return(0);
         case XML_DOCUMENT_NODE:
         case XML_DOCUMENT_TYPE_NODE:
         case XML_DOCUMENT_FRAG_NODE:
+	    VECTXT(ctxt, elem);
 	    VERROR(ctxt->userData, 
 		   "Document element not expected here\n");
 	    return(0);
         case XML_HTML_DOCUMENT_NODE:
+	    VECTXT(ctxt, elem);
 	    VERROR(ctxt->userData, 
 		   "\n");
 	    return(0);
         case XML_ELEMENT_NODE:
 	    break;
 	default:
+	    VECTXT(ctxt, elem);
 	    VERROR(ctxt->userData, 
 		   "unknown element type %d\n", elem->type);
 	    return(0);
@@ -4426,6 +4471,7 @@
 	}
     }
     if (elemDecl == NULL) {
+	VECTXT(ctxt, elem);
 	VERROR(ctxt->userData, "No declaration for element %s\n",
 	       elem->name);
 	return(0);
@@ -4434,11 +4480,13 @@
     /* Check that the element content matches the definition */
     switch (elemDecl->etype) {
         case XML_ELEMENT_TYPE_UNDEFINED:
+	    VECTXT(ctxt, elem);
 	    VERROR(ctxt->userData, "No declaration for element %s\n",
 		   elem->name);
 	    return(0);
         case XML_ELEMENT_TYPE_EMPTY:
 	    if (elem->children != NULL) {
+		VECTXT(ctxt, elem);
 		VERROR(ctxt->userData,
 	       "Element %s was declared EMPTY this one has content\n",
 	               elem->name);
@@ -4455,6 +4503,7 @@
 		(elemDecl->content->type == XML_ELEMENT_CONTENT_PCDATA)) {
 		ret = xmlValidateOneCdataElement(ctxt, doc, elem);
 		if (!ret) {
+		    VECTXT(ctxt, elem);
 		    VERROR(ctxt->userData,
 	       "Element %s was declared #PCDATA but contains non text nodes\n",
 			   elem->name);
@@ -4511,6 +4560,7 @@
 			cont = cont->c2;
 		    }
 		    if (cont == NULL) {
+			VECTXT(ctxt, elem);
 			VERROR(ctxt->userData,
 	       "Element %s is not declared in %s list of possible children\n",
 			       name, elem->name);
@@ -4536,6 +4586,7 @@
 			while (IS_BLANK(*content))
 			    content++;
 			if (*content == 0) {
+			    VECTXT(ctxt, elem);
 			    VERROR(ctxt->userData,
 "standalone: %s declared in the external subset contains white spaces nodes\n",
 				   elem->name);
@@ -4548,7 +4599,7 @@
 	    }
 	    child = elem->children;
 	    cont = elemDecl->content;
-	    tmp = xmlValidateElementContent(ctxt, child, elemDecl, 1);
+	    tmp = xmlValidateElementContent(ctxt, child, elemDecl, 1, elem);
 	    if (tmp <= 0)
 		ret = tmp;
 	    break;
@@ -4619,11 +4670,13 @@
 	    }
 	    if (qualified == -1) {
 		if (attr->prefix == NULL) {
+		    VECTXT(ctxt, elem);
 		    VERROR(ctxt->userData,
 		       "Element %s does not carry attribute %s\n",
 			   elem->name, attr->name);
 		    ret = 0;
 	        } else {
+		    VECTXT(ctxt, elem);
 		    VERROR(ctxt->userData,
 		       "Element %s does not carry attribute %s:%s\n",
 			   elem->name, attr->prefix,attr->name);
@@ -4652,6 +4705,7 @@
 		while (ns != NULL) {
 		    if (ns->prefix == NULL) {
 			if (!xmlStrEqual(attr->defaultValue, ns->href)) {
+			    VECTXT(ctxt, elem);
 			    VERROR(ctxt->userData,
    "Element %s namespace name for default namespace does not match the DTD\n",
 				   elem->name);
@@ -4668,6 +4722,7 @@
 		while (ns != NULL) {
 		    if (xmlStrEqual(attr->name, ns->prefix)) {
 			if (!xmlStrEqual(attr->defaultValue, ns->href)) {
+			    VECTXT(ctxt, elem);
 			    VERROR(ctxt->userData,
 		   "Element %s namespace name for %s does not match the DTD\n",
 				   elem->name, ns->prefix);