OASIS Mailing List ArchivesView the OASIS mailing list archive below
or browse/search using MarkMail.

 


Help: OASIS Mailing Lists Help | MarkMail Help

 


 

   re: genx

[ Lists Home | Date Index | Thread Index ]

Comments I got by email I'm tossing in here so that everything I need 
to look at is in one place.   These are from Mark Lentczner

   I have some comments on your API for genx:

1. Libraries shouldn't ever call abort() or exit() - it limits greatly 
how a user of the library structures their own code.  A slightly 
different error handling strategy would make things a bit easier for 
users:  Once a genx call generates an error for a given genxWriter, 
then all future calls with the same genxWriter immediately return the 
same error.  This allows a caller to code several calls to genx in a 
row, and only check the final result.  While you may prefer that people 
check after every call, there seems no reason to impose this on users.

2. genxSetError() is fine, but you should allow the user's routine to 
return rather than call abort().  Many uses of genx may be unable to 
support calls to exit() or abort() (an interactive tool doesn't want to 
crash just because some sub-task didn't work.)  Just return the error 
as normal if the supplied error function returns.

3. There is no way to set a custom free operation to match the custom 
allocator.  Consider a single routine to set them both (since they 
always need to be set in pairs):
	genxSetAllocator(genxWriter w,
		void * (*alloc)(void * userdata, int bytes),
		void (*free)(void * userdata, void * ptr));

4. Throughout the genx library, calls that take text tend to return an 
error if the text contains something that isn't allowed at that point 
in the XML document.  For example, genxComment() fails if the string 
contains "--".  The essentially means that any user of genx has to 
check the strings before genx does, since genx will fail, aborting the 
whole document if the string doesn't pass.  For the intended audience 
of developers, I can see two alternatives that might be more friendly:

4a. Don't return a 'hard', non-recoverable error.  Instead, return a 
'soft' error that basically says, the string isn't usable in this 
context, nothing was done, and you can continue.  For example: An 
application could easily take the invoking command line and dump it 
into an XML comment.  In this case, the application probably doesn't 
want to do all the work to clear out '--' from the command line.  The 
solution of just not including the comment is certainly light weight, 
the application can check the error if it wants, and if the comment is 
omitted, so be it.

4b. Support escaping variants of all such calls.  In this case, the 
strings will be properly, or 'reasonably' escaped.  I realize that such 
escaping might alter the document semantics, but often it is okay.  
Certainly the comment example above, there is less harm if the users' 
command line with '--' is replaced with '- - '.

5. genxStartStartTag()'s prefix handling is unclear.  How do I set the 
default namespace?  By passing "" to prefix?  If I pass NULL, then 
"genx will create a prefix" - but how do I ever know what prefix it is?

6. The family of genxStartStartTag() calls might be refactored 
somewhat: I find that parallel arrays in C tend to give rise to errors, 
especially when statically created by hand in the code.  Perhaps these 
two forms would be better:

	int genxStartTag(genxWriter w, const utf8Byte * type, ...)
	    where ... is one or more sequences of:
	        GENX_NS_DECL, const utf8Byte * namespace, const utf8Byte * 
prefix
	        GENX_ATTR_DECL, const utf8Byte * name, const utf8Byte * value
	        GENX_NS_ATTRY_DECL, const utf8Byte * attrPrefix, const utf8 * 
name, const utf8Byte * value
	        GENX_DONE
	int genxStartTag(genxWriter w, const utf8Byte * type, const utf8Byte * 
* data)
	    where data points to an array like the above

	#define GENX_NS_DECL ((const utf8Byte *)1);
	#define GENX_ATTR_DECL ((const utf8Byte *)2);
	    ...etc...

7. It isn't clear if genxText() and genxCharacter() perform entity 
replacement for &, <, > and perhaps ".  If not, they should have 
variants or an options to do so (see 4. above)

8. You might consider adding genxContent(), that dumps content directly 
into the document at that point, no checks and no escaping.  This would 
be used when the calling application has a fragment of, say, XHTML, 
that they want to dump in at some point.  In a perfect world, genx 
would check the structure of such content for well-formedness, but I 
suspect you aren't going to put that in.

In general, it looks fine.  But I think the issues of escaping is the 
biggest problem right now.  For the audience this library is intended, 
writing out XML should be an almost thoughtless process - which means 
that they are going to want escaping to be done for them.

- Mark

Mark Lentczner
http://www.ozonehouse.com/mark/





 

News | XML in Industry | Calendar | XML Registry
Marketplace | Resources | MyXML.org | Sponsors | Privacy Statement

Copyright 2001 XML.org. This site is hosted by OASIS