diff --git a/ChangeLog b/ChangeLog
index 6ec9d9e..31fc99b 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+Thu Oct  9 13:44:57 CEST 2003 Daniel Veillard <daniel@veillard.com>
+
+	* xinclude.c: comment fix
+	* catalog.c include/libxml/xmlerror.h: migrating the catalog code
+	  to the new infrastructure
+
 Thu Oct  9 00:36:03 CEST 2003 Daniel Veillard <daniel@veillard.com>
 
 	* xmlIO.c: final error handling cleanup
diff --git a/catalog.c b/catalog.c
index 6ff22a1..c013c97 100644
--- a/catalog.c
+++ b/catalog.c
@@ -182,6 +182,48 @@
  */
 static int xmlCatalogInitialized = 0;
 
+/************************************************************************
+ *									*
+ * 			Catalog error handlers				*
+ *									*
+ ************************************************************************/
+
+/**
+ * xmlCatalogErrMemory:
+ * @extra:  extra informations
+ *
+ * Handle an out of memory condition
+ */
+static void
+xmlCatalogErrMemory(const char *extra)
+{
+    __xmlRaiseError(NULL, NULL, NULL, NULL, XML_FROM_CATALOG,
+                    XML_ERR_NO_MEMORY, XML_ERR_ERROR, NULL, 0,
+		    extra, NULL, NULL, 0, 0,
+		    "Memory allocation failed : %s\n", extra);
+}
+
+/**
+ * xmlCatalogErr:
+ * @catal: the Catalog entry
+ * @node: the context node
+ * @msg:  the error message
+ * @extra:  extra informations
+ *
+ * Handle a catalog error
+ */
+static void
+xmlCatalogErr(xmlCatalogEntryPtr catal, xmlNodePtr node, int error,
+               const char *msg, const xmlChar *str1, const xmlChar *str2,
+	       const xmlChar *str3)
+{
+    __xmlRaiseError(NULL, NULL, catal, node, XML_FROM_CATALOG,
+                    error, XML_ERR_ERROR, NULL, 0,
+		    (const char *) str1, (const char *) str2,
+		    (const char *) str3, 0, 0,
+		    msg, str1, str2, str3);
+}
+
 
 /************************************************************************
  *									*
@@ -208,8 +250,7 @@
 
     ret = (xmlCatalogEntryPtr) xmlMalloc(sizeof(xmlCatalogEntry));
     if (ret == NULL) {
-	xmlGenericError(xmlGenericErrorContext,
-		"malloc of %d byte failed\n", sizeof(xmlCatalogEntry));
+        xmlCatalogErrMemory("allocating catalog entry");
 	return(NULL);
     }
     ret->next = NULL;
@@ -336,8 +377,7 @@
 
     ret = (xmlCatalogPtr) xmlMalloc(sizeof(xmlCatalog));
     if (ret == NULL) {
-	xmlGenericError(xmlGenericErrorContext,
-		"malloc of %d byte failed\n", sizeof(xmlCatalog));
+        xmlCatalogErrMemory("allocating catalog");
 	return(NULL);
     }
     memset(ret, 0, sizeof(xmlCatalog));
@@ -874,8 +914,7 @@
 #endif
     content = xmlMallocAtomic(size + 10);
     if (content == NULL) {
-        xmlGenericError(xmlGenericErrorContext,
-                        "malloc of %d byte failed\n", size + 10);
+        xmlCatalogErrMemory("allocating catalog data");
         return (NULL);
     }
 #ifdef HAVE_STAT
@@ -977,15 +1016,15 @@
     if (attrName != NULL) {
 	nameValue = xmlGetProp(cur, attrName);
 	if (nameValue == NULL) {
-	    xmlGenericError(xmlGenericErrorContext,
-		    "%s entry lacks '%s'\n", name, attrName);
+	    xmlCatalogErr(ret, cur, XML_CATALOG_MISSING_ATTR,
+			  "%s entry lacks '%s'\n", name, attrName, NULL);
 	    ok = 0;
 	}
     }
     uriValue = xmlGetProp(cur, uriAttrName);
     if (uriValue == NULL) {
-	xmlGenericError(xmlGenericErrorContext,
-		"%s entry lacks '%s'\n", name, uriAttrName);
+	xmlCatalogErr(ret, cur, XML_CATALOG_MISSING_ATTR,
+		"%s entry lacks '%s'\n", name, uriAttrName, NULL);
 	ok = 0;
     }
     if (!ok) {
@@ -1009,7 +1048,7 @@
 	}
 	ret = xmlNewCatalogEntry(type, nameValue, uriValue, URL, prefer);
     } else {
-	xmlGenericError(xmlGenericErrorContext,
+	xmlCatalogErr(ret, cur, XML_CATALOG_ENTRY_BROKEN,
 		"%s entry '%s' broken ?: %s\n", name, uriAttrName, uriValue);
     }
     if (nameValue != NULL)
@@ -1054,8 +1093,9 @@
             } else if (xmlStrEqual(prop, BAD_CAST "public")) {
                 prefer = XML_CATA_PREFER_PUBLIC;
             } else {
-                xmlGenericError(xmlGenericErrorContext,
-                                "Invalid value for prefer: '%s'\n", prop);
+		xmlCatalogErr(parent, cur, XML_CATALOG_PREFER_VALUE,
+                              "Invalid value for prefer: '%s'\n",
+			      prop, NULL, NULL);
             }
             xmlFree(prop);
         }
@@ -1194,17 +1234,18 @@
 	    } else if (xmlStrEqual(prop, BAD_CAST "public")) {
 		prefer = XML_CATA_PREFER_PUBLIC;
 	    } else {
-		xmlGenericError(xmlGenericErrorContext,
-			"Invalid value for prefer: '%s'\n",
-			        prop);
+		xmlCatalogErr(NULL, cur, XML_CATALOG_PREFER_VALUE,
+			      "Invalid value for prefer: '%s'\n",
+			      prop, NULL, NULL);
 	    }
 	    xmlFree(prop);
 	}
 	cur = cur->children;
 	xmlParseXMLCatalogNodeList(cur, prefer, parent);
     } else {
-	xmlGenericError(xmlGenericErrorContext,
-			"File %s is not an XML Catalog\n", filename);
+	xmlCatalogErr(NULL, (xmlNodePtr) doc, XML_CATALOG_NOT_CATALOG,
+		      "File %s is not an XML Catalog\n",
+		      filename, NULL, NULL);
 	xmlFreeDoc(doc);
 	return(NULL);
     }
@@ -1451,12 +1492,9 @@
      * protection against loops
      */
     if (catal->depth > MAX_CATAL_DEPTH) {
-        if (catal->name != NULL)
-	    xmlGenericError(xmlGenericErrorContext,
-		    "Detected recursion in catalog %s\n", catal->name);
-	else
-	    xmlGenericError(xmlGenericErrorContext,
-		    "Detected recursion in catalog\n");
+	xmlCatalogErr(catal, NULL, XML_CATALOG_RECURSION,
+		      "Detected recursion in catalog %s\n",
+		      catal->name, NULL, NULL);
 	return(NULL);
     }
     catal->depth++;
@@ -1969,7 +2007,7 @@
  */
 static const xmlChar *
 xmlParseSGMLCatalogPubid(const xmlChar *cur, xmlChar **id) {
-    xmlChar *buf = NULL;
+    xmlChar *buf = NULL, *tmp;
     int len = 0;
     int size = 50;
     xmlChar stop;
@@ -1988,8 +2026,7 @@
     }
     buf = (xmlChar *) xmlMallocAtomic(size * sizeof(xmlChar));
     if (buf == NULL) {
-	xmlGenericError(xmlGenericErrorContext,
-		"malloc of %d byte failed\n", size);
+        xmlCatalogErrMemory("allocating public ID");
 	return(NULL);
     }
     while (xmlIsPubidChar(*cur) || (*cur == '?')) {
@@ -1999,12 +2036,13 @@
 	    break;
 	if (len + 1 >= size) {
 	    size *= 2;
-	    buf = (xmlChar *) xmlRealloc(buf, size * sizeof(xmlChar));
-	    if (buf == NULL) {
-		xmlGenericError(xmlGenericErrorContext,
-			"realloc of %d byte failed\n", size);
+	    tmp = (xmlChar *) xmlRealloc(buf, size * sizeof(xmlChar));
+	    if (tmp == NULL) {
+		xmlCatalogErrMemory("allocating public ID");
+		xmlFree(buf);
 		return(NULL);
 	    }
+	    buf = tmp;
 	}
 	buf[len++] = *cur;
 	count++;
diff --git a/include/libxml/xmlerror.h b/include/libxml/xmlerror.h
index b3ba285..fcfc877 100644
--- a/include/libxml/xmlerror.h
+++ b/include/libxml/xmlerror.h
@@ -472,7 +472,12 @@
     XML_XINCLUDE_XPTR_RESULT,
     XML_XINCLUDE_INCLUDE_IN_INCLUDE,
     XML_XINCLUDE_FALLBACKS_IN_INCLUDE,
-    XML_XINCLUDE_FALLBACK_NOT_IN_INCLUDE
+    XML_XINCLUDE_FALLBACK_NOT_IN_INCLUDE,
+    XML_CATALOG_MISSING_ATTR = 1650,
+    XML_CATALOG_ENTRY_BROKEN,
+    XML_CATALOG_PREFER_VALUE,
+    XML_CATALOG_NOT_CATALOG,
+    XML_CATALOG_RECURSION
 } xmlParserErrors;
 
 /**
diff --git a/xinclude.c b/xinclude.c
index 8a336dc..04d827f 100644
--- a/xinclude.c
+++ b/xinclude.c
@@ -96,7 +96,7 @@
 
 /************************************************************************
  *									*
- * 		Tree memory error handler				*
+ * 			XInclude error handler				*
  *									*
  ************************************************************************/
 
