--- tclexpat.c Sat Aug 22 03:35:44 1998 +++ tclexpat.c Mon Aug 14 14:58:38 2006 @@ -18,8 +18,9 @@ * */ +#include #include -#include "xmlparse.h" +#include /* * 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; } /*