You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
61 lines
2.0 KiB
61 lines
2.0 KiB
/*===========================================================================
|
|
isrcmem.h
|
|
Provides helper macros and typedefs for parsing memory buffers
|
|
see parsifal.h for copyright info
|
|
|
|
USAGE
|
|
declare inputsource handler function (note param names
|
|
must be exactly buf, cBytes etc.):
|
|
|
|
int MemInputsrc(BYTE *buf, int cBytes, int *cBytesActual, void *inputData);
|
|
int MemInputsrc(BYTE *buf, int cBytes, int *cBytesActual, void *inputData)
|
|
{
|
|
XMLMEMINPUTSRC_HANDLE
|
|
}
|
|
|
|
.....
|
|
|
|
LPXMLPARSER parser;
|
|
XMLMEMINPUTSRC meminput;
|
|
char *xml = "<root><child1/><child2>text</child2></root>";
|
|
|
|
XMLMEMINPUTSRC_INIT(&meminput, xml, strlen(xml));
|
|
XMLParser_Create(&parser);
|
|
XMLParser_Parse(parser, MemInputsrc, &meminput, NULL);
|
|
|
|
.....
|
|
===========================================================================*/
|
|
|
|
#ifndef ISRCMEM__H
|
|
#define ISRCMEM__H
|
|
|
|
typedef struct tagXMLMEMINPUTSRC
|
|
{
|
|
BYTE *pBuf;
|
|
unsigned long cTotal;
|
|
unsigned long cBytes;
|
|
} XMLMEMINPUTSRC, *LPXMLMEMINPUTSRC;
|
|
|
|
#define XMLMEMINPUTSRC_INIT(lpMemISrc,buf,size) \
|
|
(((LPXMLMEMINPUTSRC)lpMemISrc)->cTotal=(size), \
|
|
((LPXMLMEMINPUTSRC)lpMemISrc)->cBytes=0, \
|
|
((LPXMLMEMINPUTSRC)lpMemISrc)->pBuf=(buf))
|
|
|
|
#define XMLMEMINPUTSRC_HANDLE \
|
|
if ((((LPXMLMEMINPUTSRC)inputData)->cBytes + cBytes) < ((LPXMLMEMINPUTSRC)inputData)->cTotal) { \
|
|
memcpy(buf, ((LPXMLMEMINPUTSRC)inputData)->pBuf+((LPXMLMEMINPUTSRC)inputData)->cBytes, cBytes); \
|
|
*cBytesActual = cBytes; \
|
|
((LPXMLMEMINPUTSRC)inputData)->cBytes += cBytes; \
|
|
return 0; \
|
|
} \
|
|
else { \
|
|
*cBytesActual = ((LPXMLMEMINPUTSRC)inputData)->cTotal - ((LPXMLMEMINPUTSRC)inputData)->cBytes; \
|
|
if (*cBytesActual) { \
|
|
memcpy(buf, ((LPXMLMEMINPUTSRC)inputData)->pBuf+((LPXMLMEMINPUTSRC)inputData)->cBytes, *cBytesActual); \
|
|
((LPXMLMEMINPUTSRC)inputData)->cBytes += *cBytesActual; } \
|
|
return 1; \
|
|
}
|
|
|
|
#endif /* ISRCMEM__H */
|
|
|
|
|