[
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
|