[Expat-bugs] [ expat-Bugs-644334 ] (expat 1.95.5) Compiling by aCC on HP

noreply@sourceforge.net noreply@sourceforge.net
Wed Nov 27 17:34:11 2002


Bugs item #644334, was opened at 2002-11-26 16:03
You can respond by visiting: 
https://sourceforge.net/tracker/?func=detail&atid=110127&aid=644334&group_id=10127

>Category: Documentation
Group: Platform Specific
Status: Open
Resolution: Fixed
Priority: 5
Submitted By: Artyom Bolgar (artyom17)
Assigned to: Fred L. Drake, Jr. (fdrake)
Summary: (expat 1.95.5) Compiling by aCC on HP

Initial Comment:
I found out that EXPAT can't be compiled by aCC 
compiler on HP and SUN. It happens because this 
compiler tries to compile C-files as C++ ones. That is 
why some lines can't be compiled, for example:

   parser = memsuite->malloc_fcn(sizeof(struct 
XML_ParserStruct));

it should be changed to:

   parser = (struct XML_ParserStruct*)memsuite-
>malloc_fcn(sizeof(struct XML_ParserStruct));

In this case it is compatible with both C and C++ 
languages. There are a lot of such lines in xmlparse.c 
and one in xmltok.c. I fixed all such places and I 
attached the .diff-files for 1.95.5 version. 
This problem could be easyly reproduced by compiling 
by VC6 or VC7 with '-TP' option ("compile all files as 
C++").


----------------------------------------------------------------------

Comment By: Karl Waclawek (kwaclaw)
Date: 2002-11-27 12:08

Message:
Logged In: YES 
user_id=290026

There were more things to fix, some cosmetic changes,
and I uncovered a problem with the API - the 
externalEntityRefHandler type definition:

This is how the externalEntityRefHandler is called:

if (!externalEntityRefHandler(
                                        externalEntityRefHandlerArg,
                                        0,
                                        entity->base,
                                        entity->systemId,
                                        entity->publicId))

and this is how one sets externalEntityRefHandlerArg:

void
XML_SetExternalEntityRefHandlerArg(
                                      XML_Parser parser, void *arg)
{
  if (arg)
    externalEntityRefHandlerArg = arg;
  else
    externalEntityRefHandlerArg = parser;
}

So, externalEntityRefHandlerArg is a void pointer, but 
can contain a user defined pointer or a parser pointer.
Unfortunately the externalEntityRefHandler is defined 
like this:

typedef int (*XML_ExternalEntityRefHandler)(
                                            XML_Parser parser,
                                            const XML_Char *context,
                                            const XML_Char *base,
                                            const XML_Char *systemId,
                                            const XML_Char *publicId);

In order to fix that I changed the type of
externalEntityRefHandlerArg  from void * to
XML_Parser (= struct struct XML_ParserStruct *)
and added a type cast in 
XML_SetExternalEntityRefHandlerArg.
However, this is not a real fix, since ideally
the API should be changed. Needs documentation.

Attached as xmlparse.diff.

Leave open for Fred to document the API issue.






----------------------------------------------------------------------

Comment By: Fred L. Drake, Jr. (fdrake)
Date: 2002-11-26 23:05

Message:
Logged In: YES 
user_id=3066

Committed changes based on the supplied patch as 
lib/xmlparse.c 1.96 and lib/xmltok.c 1.27.

----------------------------------------------------------------------

You can respond by visiting: 
https://sourceforge.net/tracker/?func=detail&atid=110127&aid=644334&group_id=10127



More information about the Expat-bugs mailing list