Annotation of embedaddon/libxml2/doc/examples/io1.c, revision 1.1
1.1 ! misho 1: /**
! 2: * section: InputOutput
! 3: * synopsis: Example of custom Input/Output
! 4: * purpose: Demonstrate the use of xmlRegisterInputCallbacks
! 5: * to build a custom I/O layer, this is used in an
! 6: * XInclude method context to show how dynamic document can
! 7: * be built in a clean way.
! 8: * usage: io1
! 9: * test: io1 > io1.tmp ; diff io1.tmp io1.res ; rm -f io1.tmp
! 10: * author: Daniel Veillard
! 11: * copy: see Copyright for the status of this software.
! 12: */
! 13:
! 14: #include <stdio.h>
! 15: #include <string.h>
! 16: #include <libxml/parser.h>
! 17: #include <libxml/tree.h>
! 18: #include <libxml/xinclude.h>
! 19: #include <libxml/xmlIO.h>
! 20:
! 21: #ifdef LIBXML_XINCLUDE_ENABLED
! 22: static const char *result = "<list><people>a</people><people>b</people></list>";
! 23: static const char *cur = NULL;
! 24: static int rlen;
! 25:
! 26: /**
! 27: * sqlMatch:
! 28: * @URI: an URI to test
! 29: *
! 30: * Check for an sql: query
! 31: *
! 32: * Returns 1 if yes and 0 if another Input module should be used
! 33: */
! 34: static int
! 35: sqlMatch(const char * URI) {
! 36: if ((URI != NULL) && (!strncmp(URI, "sql:", 4)))
! 37: return(1);
! 38: return(0);
! 39: }
! 40:
! 41: /**
! 42: * sqlOpen:
! 43: * @URI: an URI to test
! 44: *
! 45: * Return a pointer to the sql: query handler, in this example simply
! 46: * the current pointer...
! 47: *
! 48: * Returns an Input context or NULL in case or error
! 49: */
! 50: static void *
! 51: sqlOpen(const char * URI) {
! 52: if ((URI == NULL) || (strncmp(URI, "sql:", 4)))
! 53: return(NULL);
! 54: cur = result;
! 55: rlen = strlen(result);
! 56: return((void *) cur);
! 57: }
! 58:
! 59: /**
! 60: * sqlClose:
! 61: * @context: the read context
! 62: *
! 63: * Close the sql: query handler
! 64: *
! 65: * Returns 0 or -1 in case of error
! 66: */
! 67: static int
! 68: sqlClose(void * context) {
! 69: if (context == NULL) return(-1);
! 70: cur = NULL;
! 71: rlen = 0;
! 72: return(0);
! 73: }
! 74:
! 75: /**
! 76: * sqlRead:
! 77: * @context: the read context
! 78: * @buffer: where to store data
! 79: * @len: number of bytes to read
! 80: *
! 81: * Implement an sql: query read.
! 82: *
! 83: * Returns the number of bytes read or -1 in case of error
! 84: */
! 85: static int
! 86: sqlRead(void * context, char * buffer, int len) {
! 87: const char *ptr = (const char *) context;
! 88:
! 89: if ((context == NULL) || (buffer == NULL) || (len < 0))
! 90: return(-1);
! 91:
! 92: if (len > rlen) len = rlen;
! 93: memcpy(buffer, ptr, len);
! 94: rlen -= len;
! 95: return(len);
! 96: }
! 97:
! 98: const char *include = "<?xml version='1.0'?>\n\
! 99: <document xmlns:xi=\"http://www.w3.org/2003/XInclude\">\n\
! 100: <p>List of people:</p>\n\
! 101: <xi:include href=\"sql:select_name_from_people\"/>\n\
! 102: </document>\n";
! 103:
! 104: int main(void) {
! 105: xmlDocPtr doc;
! 106:
! 107: /*
! 108: * this initialize the library and check potential ABI mismatches
! 109: * between the version it was compiled for and the actual shared
! 110: * library used.
! 111: */
! 112: LIBXML_TEST_VERSION
! 113:
! 114: /*
! 115: * register the new I/O handlers
! 116: */
! 117: if (xmlRegisterInputCallbacks(sqlMatch, sqlOpen, sqlRead, sqlClose) < 0) {
! 118: fprintf(stderr, "failed to register SQL handler\n");
! 119: exit(1);
! 120: }
! 121: /*
! 122: * parse include into a document
! 123: */
! 124: doc = xmlReadMemory(include, strlen(include), "include.xml", NULL, 0);
! 125: if (doc == NULL) {
! 126: fprintf(stderr, "failed to parse the including file\n");
! 127: exit(1);
! 128: }
! 129:
! 130: /*
! 131: * apply the XInclude process, this should trigger the I/O just
! 132: * registered.
! 133: */
! 134: if (xmlXIncludeProcess(doc) <= 0) {
! 135: fprintf(stderr, "XInclude processing failed\n");
! 136: exit(1);
! 137: }
! 138:
! 139: #ifdef LIBXML_OUTPUT_ENABLED
! 140: /*
! 141: * save the output for checking to stdout
! 142: */
! 143: xmlDocDump(stdout, doc);
! 144: #endif
! 145:
! 146: /*
! 147: * Free the document
! 148: */
! 149: xmlFreeDoc(doc);
! 150:
! 151: /*
! 152: * Cleanup function for the XML library.
! 153: */
! 154: xmlCleanupParser();
! 155: /*
! 156: * this is to debug memory for regression tests
! 157: */
! 158: xmlMemoryDump();
! 159: return(0);
! 160: }
! 161: #else
! 162: int main(void) {
! 163: fprintf(stderr, "XInclude support not compiled in\n");
! 164: exit(1);
! 165: }
! 166: #endif
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>