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

 


Help: OASIS Mailing Lists Help | MarkMail Help

 


 

   Re: [xml-dev] genx - abstract output

[ Lists Home | Date Index | Thread Index ]

At 05:54 22.1.2004, you wrote:
>Tim Bray scripsit:
>
> > 1. The sweet spot for XML is interchange, and FILE * is a nice general
> > basis for almost all kinds of interchange.
> > 2. If you're going to build an XML instance in memory, wouldn't it be
> > more natural to pull together a DOM or your own private data structure
> > and then serialize it in one fell swoop?
>
>Not necessarily.  For example, if I want to write to a non-UTF-8 file
>stream, then I could write via UTF-8 abstract output and use convert()
>to fix things up.
>
> > 3. This lowers the barrier-to-entry to implementers, who are going to
> > see genxStartDocument(genxWriter w, FILE * file) and say "oh yeah I
> > know what to do" as opposed to having to figure out another flavor of
> > I/O abstraction and write a stub of some kind.
>
>A simple implementation strategy would be to keep the FILE * argument,
>but also provide a call to set/get an output handler, to be invoked only
>if the FILE * argument is NULL.  That makes easy things easy and hard
>things possible.

+1

You can keep

  genxStartDocument(genxWriter w, FILE * file)

as it is and add another function like

void genxStartDocumentStream(genxWriter w,
   void * outputData,
   PFNOUTPUTCALLBACK outputCallback);

where PFNOUTPUTCALLBACK was something like:
typedef int (*PFNOUTPUTCALLBACK)(void *outputData,
   genxByte *buf,
   int cBytes,
   int *cBytesWritten);

and you can implement the genxStartDocument as:

w->outputData = (void*)file; /* example: genxStartDocument call sets 
outputData */
w->output = FileOutput; /* and sets output to internal FileOutput callback */

and implement internal PFNOUTPUTCALLBACK for FILE* as something like:

static int FileOutput(void *outputData, genxByte *buf, int cBytes, int 
*cBytesWritten)
{
   *cBytesWritten = fwrite(buf, 1, cBytes, (FILE*)outputData);
   return (*cBytesWritten < cBytes) ? GENX_IO_ERR : GENX_OK;
}

p.s. I didn't test the code, it might contain errors.

with respect,
Toni Uusitalo






 

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

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