Annotation of embedaddon/libxml2/doc/examples/io1.c, revision 1.1.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>