--- tclexpat.c	Sat Aug 22 03:35:44 1998
+++ tclexpat.c	Mon Aug 14 14:58:38 2006
@@ -18,8 +18,9 @@
  *
  */
 
+#include <string.h>
 #include <tcl.h>
-#include "xmlparse.h"
+#include <expat.h>
 
 /*
  * The structure below is used to refer to an expat parser object.
@@ -53,6 +54,8 @@
  * Prototypes for procedures defined later in this file:
  */
 
+int Tclexpat_Init (Tcl_Interp *);
+static void TclExpatHandlerResult(TclExpatInfo *, int result);
 static Tcl_ObjCmdProc TclExpatObjCmd;
 static Tcl_ObjCmdProc TclExpatInstanceCmd;
 static Tcl_CmdDeleteProc TclExpatDeleteCmd;
@@ -72,32 +75,32 @@
 				       int objc,
 				       Tcl_Obj *CONST objv[]));
 
-static void * (TclExpatElementStartHandler) _ANSI_ARGS_((void *userdata,
+static void (TclExpatElementStartHandler) _ANSI_ARGS_((void *userdata,
 							 const XML_Char *name,
 							 const XML_Char **atts));
-static void * (TclExpatElementEndHandler) _ANSI_ARGS_((void *userData,
+static void (TclExpatElementEndHandler) _ANSI_ARGS_((void *userData,
 						       const XML_Char *name));
-static void * (TclExpatCharacterDataHandler) _ANSI_ARGS_((void *userData,
+static void (TclExpatCharacterDataHandler) _ANSI_ARGS_((void *userData,
 							  const XML_Char *s,
 							  int len));
-static void * (TclExpatProcessingInstructionHandler) _ANSI_ARGS_((void *userData,
+static void (TclExpatProcessingInstructionHandler) _ANSI_ARGS_((void *userData,
 								  const XML_Char *target,
 								  const XML_Char *data));
-static void * (TclExpatExternalEntityRefHandler) _ANSI_ARGS_((XML_Parser parser,
+static int (TclExpatExternalEntityRefHandler) _ANSI_ARGS_((XML_Parser parser,
 							      const XML_Char *openEntityNames,
 							      const XML_Char *base,
 							      const XML_Char *systemId,
 							      const XML_Char *publicId));
-static void * (TclExpatDefaultHandler) _ANSI_ARGS_ ((void *userData,
+static void (TclExpatDefaultHandler) _ANSI_ARGS_ ((void *userData,
 						     const XML_Char *s,
 						     int len));
-static void * (TclExpatUnparsedDeclHandler) _ANSI_ARGS_ ((void *userData,
+static void (TclExpatUnparsedDeclHandler) _ANSI_ARGS_ ((void *userData,
 							  const XML_Char *entityname,
 							  const XML_Char *base,
 							  const XML_Char *systemId,
 							  const XML_Char *publicId,
 							  const XML_Char *notationName));
-static void * (TclExpatNotationDeclHandler) _ANSI_ARGS_ ((void *userData,
+static void (TclExpatNotationDeclHandler) _ANSI_ARGS_ ((void *userData,
 							  const XML_Char *notationName,
 							  const XML_Char *base,
 							  const XML_Char *systemId,
@@ -106,7 +109,7 @@
 							 const XML_Char *name,
 							 XML_Encoding *info));
 
-#if (TCL_MAJOR_VERSION == 8 && TCL_MINOR_VERSION == 0)
+#if (TCL_MAJOR_VERSION >= 8) && !defined(Tcl_GetString)
 
 /*
  *----------------------------------------------------------------------------
@@ -134,7 +137,7 @@
   s = Tcl_GetStringFromObj(obj, &i);
   return s;
 }
-#endif /* TCL_MAJOR_VERSION == 8 && TCL_MINOR_VERSION == 0 */
+#endif /* TCL_MAJOR_VERSION >= 8 */
 
 /*
  *----------------------------------------------------------------------------
@@ -267,7 +270,6 @@
      Tcl_Interp *interp;
      TclExpatInfo *expat;
 {
-  int len;
 
   if (!(expat->parser = XML_ParserCreate(NULL))) {
     Tcl_SetResult(interp, "unable to create expat parser", NULL);
@@ -284,22 +286,22 @@
    */
 
   XML_SetElementHandler(expat->parser,
-			(XML_StartElementHandler) TclExpatElementStartHandler,
-			(XML_EndElementHandler) TclExpatElementEndHandler);
+			TclExpatElementStartHandler,
+			TclExpatElementEndHandler);
   XML_SetCharacterDataHandler(expat->parser,
-			      (XML_CharacterDataHandler) TclExpatCharacterDataHandler);
+			      TclExpatCharacterDataHandler);
   XML_SetProcessingInstructionHandler(expat->parser,
-				      (XML_ProcessingInstructionHandler) TclExpatProcessingInstructionHandler);
+				      TclExpatProcessingInstructionHandler);
   XML_SetDefaultHandler(expat->parser,
-			(XML_DefaultHandler) TclExpatDefaultHandler);
+			TclExpatDefaultHandler);
   XML_SetUnparsedEntityDeclHandler(expat->parser,
-				   (XML_UnparsedEntityDeclHandler) TclExpatUnparsedDeclHandler);
+				   TclExpatUnparsedDeclHandler);
   XML_SetNotationDeclHandler(expat->parser,
-			     (XML_NotationDeclHandler) TclExpatNotationDeclHandler);
+			     TclExpatNotationDeclHandler);
   XML_SetExternalEntityRefHandler(expat->parser,
-				  (XML_ExternalEntityRefHandler) TclExpatExternalEntityRefHandler);
+				  TclExpatExternalEntityRefHandler);
   XML_SetUnknownEncodingHandler(expat->parser,
-				(XML_UnknownEncodingHandler) TclExpatUnknownEncodingHandler,
+				TclExpatUnknownEncodingHandler,
 				(void *) expat);
   XML_SetUserData(expat->parser,
 		  (void *) expat);
@@ -327,7 +329,6 @@
 TclExpatFreeParser(expat)
      TclExpatInfo *expat;
 {
-  int len;
 
   XML_ParserFree(expat->parser);
   expat->parser = NULL;
@@ -357,9 +358,9 @@
      Tcl_Obj *CONST objv[];
 {
   TclExpatInfo *expat = (TclExpatInfo *) clientData;
-  char *method, *data;
+  char *data;
   int len, index, result = TCL_OK;
-  static char *options[] = {
+  static CONST char * options[] = {
     "configure", "cget", "parse", "reset", NULL
   };
   enum options {
@@ -464,10 +465,10 @@
 
   if (!result) {
     Tcl_ResetResult(interp);
-    sprintf(s, "%d", XML_GetCurrentLineNumber(expat->parser));
+    sprintf(s, "%ld", (long)XML_GetCurrentLineNumber(expat->parser));
     Tcl_AppendResult(interp, "error \"", XML_ErrorString(XML_GetErrorCode(expat->parser)),
 		     "\" at line ", s, " character ", NULL);
-    sprintf(s, "%d", XML_GetCurrentColumnNumber(expat->parser));
+    sprintf(s, "%ld", (long)XML_GetCurrentColumnNumber(expat->parser));
     Tcl_AppendResult(interp, s, NULL);
 
     return TCL_ERROR;
@@ -514,7 +515,7 @@
      int objc;
      Tcl_Obj *CONST objv[];
 {
-  static char *switches[] = {
+  static CONST char *switches[] = {
     "-final",
     "-baseurl", 
     "-elementstartcommand",
@@ -688,7 +689,7 @@
   }
 
   if (doParse) {
-    return TclExpatParse(interp, expat->parser, "", 0);
+    return TclExpatParse(interp, expat, "", 0);
   } else {
     return TCL_OK;
   }
@@ -739,7 +740,7 @@
  *----------------------------------------------------------------------------
  */
 
-void
+static void
 TclExpatHandlerResult(expat, result)
      TclExpatInfo *expat;
      int result;
@@ -795,7 +796,7 @@
  *----------------------------------------------------------------------------
  */
 
-static void *
+static void
 TclExpatElementStartHandler(userData, name, atts)
      void *userData;
      const char *name;
@@ -828,8 +829,8 @@
 
   atList = Tcl_NewListObj(0, NULL);
   for (atPtr = atts; atPtr[0] && atPtr[1]; atPtr += 2) {
-    Tcl_ListObjAppendElement(expat->interp, atList, Tcl_NewStringObj((char *)atPtr[0], strlen(atPtr[0])));
-    Tcl_ListObjAppendElement(expat->interp, atList, Tcl_NewStringObj((char *)atPtr[1], strlen(atPtr[1])));
+    Tcl_ListObjAppendElement(expat->interp, atList, Tcl_NewStringObj(atPtr[0], -1));
+    Tcl_ListObjAppendElement(expat->interp, atList, Tcl_NewStringObj(atPtr[1], -1));
   }
 
   /*
@@ -840,14 +841,14 @@
   Tcl_IncrRefCount(cmdPtr);
   Tcl_Preserve((ClientData) expat->interp);
 
-  Tcl_ListObjAppendElement(expat->interp, cmdPtr, Tcl_NewStringObj((char *)name, strlen(name)));
+  Tcl_ListObjAppendElement(expat->interp, cmdPtr, Tcl_NewStringObj(name, -1));
   Tcl_ListObjAppendElement(expat->interp, cmdPtr, atList);
 
   /*
    * It would be desirable to be able to terminate parsing
    * if the return result is TCL_ERROR or TCL_BREAK.
    */
-#if (TCL_MAJOR_VERSION == 8 && TCL_MINOR_VERSION == 0)
+#if (TCL_MAJOR_VERSION >= 8)
   result = Tcl_GlobalEvalObj(expat->interp, cmdPtr);
 #else
   result = Tcl_EvalObj(expat->interp, cmdPtr, TCL_EVAL_GLOBAL);
@@ -877,7 +878,7 @@
  *----------------------------------------------------------------------------
  */
 
-static void *
+static void
 TclExpatElementEndHandler(userData, name)
      void *userData;
      CONST char *name;
@@ -911,13 +912,13 @@
   Tcl_IncrRefCount(cmdPtr);
   Tcl_Preserve((ClientData) expat->interp);
 
-  Tcl_ListObjAppendElement(expat->interp, cmdPtr, Tcl_NewStringObj((char *)name, strlen(name)));
+  Tcl_ListObjAppendElement(expat->interp, cmdPtr, Tcl_NewStringObj(name, -1));
 
   /*
    * It would be desirable to be able to terminate parsing
    * if the return result is TCL_ERROR or TCL_BREAK.
    */
-#if (TCL_MAJOR_VERSION == 8 && TCL_MINOR_VERSION == 0)
+#if (TCL_MAJOR_VERSION >= 8)
   result = Tcl_GlobalEvalObj(expat->interp, cmdPtr);
 #else
   result = Tcl_EvalObj(expat->interp, cmdPtr, TCL_EVAL_GLOBAL);
@@ -947,7 +948,7 @@
  *----------------------------------------------------------------------------
  */
 
-static void *
+static void
 TclExpatCharacterDataHandler(userData, s, len)
      void *userData;
      CONST char *s;
@@ -970,13 +971,13 @@
   Tcl_IncrRefCount(cmdPtr);
   Tcl_Preserve((ClientData) expat->interp);
 
-  Tcl_ListObjAppendElement(expat->interp, cmdPtr, Tcl_NewStringObj((char *)s, len));
+  Tcl_ListObjAppendElement(expat->interp, cmdPtr, Tcl_NewStringObj(s, len));
 
   /*
    * It would be desirable to be able to terminate parsing
    * if the return result is TCL_ERROR or TCL_BREAK.
    */
-#if (TCL_MAJOR_VERSION == 8 && TCL_MINOR_VERSION == 0)
+#if (TCL_MAJOR_VERSION >= 8)
   result = Tcl_GlobalEvalObj(expat->interp, cmdPtr);
 #else
   result = Tcl_EvalObj(expat->interp, cmdPtr, TCL_EVAL_GLOBAL);
@@ -1006,7 +1007,7 @@
  *----------------------------------------------------------------------------
  */
 
-static void *
+static void
 TclExpatProcessingInstructionHandler(userData, target, data)
      void *userData;
      CONST char *target;
@@ -1029,14 +1030,14 @@
   Tcl_IncrRefCount(cmdPtr);
   Tcl_Preserve((ClientData) expat->interp);
 
-  Tcl_ListObjAppendElement(expat->interp, cmdPtr, Tcl_NewStringObj((char *)target, strlen(target)));
-  Tcl_ListObjAppendElement(expat->interp, cmdPtr, Tcl_NewStringObj((char *)data, strlen(data)));
+  Tcl_ListObjAppendElement(expat->interp, cmdPtr, Tcl_NewStringObj(target, -1));
+  Tcl_ListObjAppendElement(expat->interp, cmdPtr, Tcl_NewStringObj(data, -1));
 
   /*
    * It would be desirable to be able to terminate parsing
    * if the return result is TCL_ERROR or TCL_BREAK.
    */
-#if (TCL_MAJOR_VERSION == 8 && TCL_MINOR_VERSION == 0)
+#if (TCL_MAJOR_VERSION >= 8)
   result = Tcl_GlobalEvalObj(expat->interp, cmdPtr);
 #else
   result = Tcl_EvalObj(expat->interp, cmdPtr, TCL_EVAL_GLOBAL);
@@ -1066,7 +1067,7 @@
  *----------------------------------------------------------------------------
  */
 
-static void *
+static void
 TclExpatDefaultHandler(userData, s, len)
      void *userData;
      CONST char *s;
@@ -1089,13 +1090,13 @@
   Tcl_IncrRefCount(cmdPtr);
   Tcl_Preserve((ClientData) expat->interp);
 
-  Tcl_ListObjAppendElement(expat->interp, cmdPtr, Tcl_NewStringObj((char *)s, len));
+  Tcl_ListObjAppendElement(expat->interp, cmdPtr, Tcl_NewStringObj(s, len));
 
   /*
    * It would be desirable to be able to terminate parsing
    * if the return result is TCL_ERROR or TCL_BREAK.
    */
-#if (TCL_MAJOR_VERSION == 8 && TCL_MINOR_VERSION == 0)
+#if (TCL_MAJOR_VERSION >= 8)
   result = Tcl_GlobalEvalObj(expat->interp, cmdPtr);
 #else
   result = Tcl_EvalObj(expat->interp, cmdPtr, TCL_EVAL_GLOBAL);
@@ -1125,7 +1126,7 @@
  *----------------------------------------------------------------------------
  */
 
-static void *
+static void
 TclExpatUnparsedDeclHandler(userData, entityname, base, systemId, publicId, notationName)
      void *userData;
      CONST char *entityname;
@@ -1151,25 +1152,25 @@
   Tcl_IncrRefCount(cmdPtr);
   Tcl_Preserve((ClientData) expat->interp);
 
-  Tcl_ListObjAppendElement(expat->interp, cmdPtr, Tcl_NewStringObj((char *)entityname, strlen(entityname)));
-  Tcl_ListObjAppendElement(expat->interp, cmdPtr, Tcl_NewStringObj((char *)base, strlen(base)));
-  Tcl_ListObjAppendElement(expat->interp, cmdPtr, Tcl_NewStringObj((char *)systemId, strlen(systemId)));
+  Tcl_ListObjAppendElement(expat->interp, cmdPtr, Tcl_NewStringObj(entityname, -1));
+  Tcl_ListObjAppendElement(expat->interp, cmdPtr, Tcl_NewStringObj(base, -1));
+  Tcl_ListObjAppendElement(expat->interp, cmdPtr, Tcl_NewStringObj(systemId, -1));
   if (publicId == NULL) {
     Tcl_ListObjAppendElement(expat->interp, cmdPtr, Tcl_NewListObj(0, NULL));
   } else {
-    Tcl_ListObjAppendElement(expat->interp, cmdPtr, Tcl_NewStringObj((char *)publicId, strlen(publicId)));
+    Tcl_ListObjAppendElement(expat->interp, cmdPtr, Tcl_NewStringObj(publicId, -1));
   }
   if (notationName == NULL) {
     Tcl_ListObjAppendElement(expat->interp, cmdPtr, Tcl_NewListObj(0, NULL));
   } else {
-    Tcl_ListObjAppendElement(expat->interp, cmdPtr, Tcl_NewStringObj((char *)notationName, strlen(notationName)));
+    Tcl_ListObjAppendElement(expat->interp, cmdPtr, Tcl_NewStringObj(notationName, -1));
   }
 
   /*
    * It would be desirable to be able to terminate parsing
    * if the return result is TCL_ERROR or TCL_BREAK.
    */
-#if (TCL_MAJOR_VERSION == 8 && TCL_MINOR_VERSION == 0)
+#if (TCL_MAJOR_VERSION >= 8)
   result = Tcl_GlobalEvalObj(expat->interp, cmdPtr);
 #else
   result = Tcl_EvalObj(expat->interp, cmdPtr, TCL_EVAL_GLOBAL);
@@ -1199,7 +1200,7 @@
  *----------------------------------------------------------------------------
  */
 
-static void *
+static void
 TclExpatNotationDeclHandler(userData, notationName, base, systemId, publicId)
      void *userData;
      CONST char *notationName;
@@ -1224,24 +1225,24 @@
   Tcl_IncrRefCount(cmdPtr);
   Tcl_Preserve((ClientData) expat->interp);
 
-  Tcl_ListObjAppendElement(expat->interp, cmdPtr, Tcl_NewStringObj((char *)notationName, strlen(notationName)));
-  Tcl_ListObjAppendElement(expat->interp, cmdPtr, Tcl_NewStringObj((char *)base, strlen(base)));
+  Tcl_ListObjAppendElement(expat->interp, cmdPtr, Tcl_NewStringObj(notationName, -1));
+  Tcl_ListObjAppendElement(expat->interp, cmdPtr, Tcl_NewStringObj(base, -1));
   if (systemId == NULL) {
     Tcl_ListObjAppendElement(expat->interp, cmdPtr, Tcl_NewListObj(0, NULL));
   } else {
-    Tcl_ListObjAppendElement(expat->interp, cmdPtr, Tcl_NewStringObj((char *)systemId, strlen(systemId)));
+    Tcl_ListObjAppendElement(expat->interp, cmdPtr, Tcl_NewStringObj(systemId, -1));
   }
   if (publicId == NULL) {
     Tcl_ListObjAppendElement(expat->interp, cmdPtr, Tcl_NewListObj(0, NULL));
   } else {
-    Tcl_ListObjAppendElement(expat->interp, cmdPtr, Tcl_NewStringObj((char *)publicId, strlen(publicId)));
+    Tcl_ListObjAppendElement(expat->interp, cmdPtr, Tcl_NewStringObj(publicId, -1));
   }
 
   /*
    * It would be desirable to be able to terminate parsing
    * if the return result is TCL_ERROR or TCL_BREAK.
    */
-#if (TCL_MAJOR_VERSION == 8 && TCL_MINOR_VERSION == 0)
+#if (TCL_MAJOR_VERSION >= 8)
   result = Tcl_GlobalEvalObj(expat->interp, cmdPtr);
 #else
   result = Tcl_EvalObj(expat->interp, cmdPtr, TCL_EVAL_GLOBAL);
@@ -1279,15 +1280,18 @@
      XML_Encoding *info;
 {
   TclExpatInfo *expat = (TclExpatInfo *) encodingHandlerData;
+#if 0
   Tcl_Obj *cmdPtr;
   int result;
+#endif
 
   Tcl_SetResult(expat->interp, "not implemented", NULL);
-  return 0;
+  return 1;
 
+#if 0
   if (expat->unknownencodingcommand == NULL ||
       expat->status != TCL_OK) {
-    return;
+    return 1;
   }
 
   /*
@@ -1306,7 +1310,7 @@
    * It would be desirable to be able to terminate parsing
    * if the return result is TCL_ERROR or TCL_BREAK.
    */
-#if (TCL_MAJOR_VERSION == 8 && TCL_MINOR_VERSION == 0)
+#if (TCL_MAJOR_VERSION >= 8)
   result = Tcl_GlobalEvalObj(expat->interp, cmdPtr);
 #else
   result = Tcl_EvalObj(expat->interp, cmdPtr, TCL_EVAL_GLOBAL);
@@ -1317,7 +1321,8 @@
 
   TclExpatHandlerResult(expat, result);
 
-  return;
+  return 0;
+#endif
 }
 
 /*
@@ -1336,7 +1341,7 @@
  *----------------------------------------------------------------------------
  */
 
-static void *
+static int
 TclExpatExternalEntityRefHandler(parser, openEntityNames, base, systemId, publicId)
      XML_Parser parser;
      CONST char *openEntityNames;
@@ -1350,7 +1355,7 @@
 
   if (expat->externalentitycommand == NULL ||
       expat->status != TCL_OK) {
-    return;
+    return 0;
   }
 
   /*
@@ -1361,16 +1366,16 @@
   Tcl_IncrRefCount(cmdPtr);
   Tcl_Preserve((ClientData) expat->interp);
 
-  Tcl_ListObjAppendElement(expat->interp, cmdPtr, Tcl_NewStringObj((char *)openEntityNames, strlen(openEntityNames)));
-  Tcl_ListObjAppendElement(expat->interp, cmdPtr, Tcl_NewStringObj((char *)base, strlen(base)));
-  Tcl_ListObjAppendElement(expat->interp, cmdPtr, Tcl_NewStringObj((char *)systemId, strlen(systemId)));
-  Tcl_ListObjAppendElement(expat->interp, cmdPtr, Tcl_NewStringObj((char *)publicId, strlen(publicId)));
+  Tcl_ListObjAppendElement(expat->interp, cmdPtr, Tcl_NewStringObj(openEntityNames, -1));
+  Tcl_ListObjAppendElement(expat->interp, cmdPtr, Tcl_NewStringObj(base, -1));
+  Tcl_ListObjAppendElement(expat->interp, cmdPtr, Tcl_NewStringObj(systemId, -1));
+  Tcl_ListObjAppendElement(expat->interp, cmdPtr, Tcl_NewStringObj(publicId, -1));
 
   /*
    * It would be desirable to be able to terminate parsing
    * if the return result is TCL_ERROR or TCL_BREAK.
    */
-#if (TCL_MAJOR_VERSION == 8 && TCL_MINOR_VERSION == 0)
+#if (TCL_MAJOR_VERSION >= 8)
   result = Tcl_GlobalEvalObj(expat->interp, cmdPtr);
 #else
   result = Tcl_EvalObj(expat->interp, cmdPtr, TCL_EVAL_GLOBAL);
@@ -1381,7 +1386,7 @@
 
   TclExpatHandlerResult(expat, result);
 
-  return;
+  return 1;
 }
 
 /*
