xref: /aosp_15_r20/external/cronet/third_party/libxml/src/gentest.py (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1*6777b538SAndroid Build Coastguard Worker#!/usr/bin/env python3
2*6777b538SAndroid Build Coastguard Worker#
3*6777b538SAndroid Build Coastguard Worker# generate a tester program for the API
4*6777b538SAndroid Build Coastguard Worker#
5*6777b538SAndroid Build Coastguard Workerimport sys
6*6777b538SAndroid Build Coastguard Workerimport os
7*6777b538SAndroid Build Coastguard Workerimport string
8*6777b538SAndroid Build Coastguard Workertry:
9*6777b538SAndroid Build Coastguard Worker    import libxml2
10*6777b538SAndroid Build Coastguard Workerexcept:
11*6777b538SAndroid Build Coastguard Worker    print("libxml2 python bindings not available, skipping testapi.c generation")
12*6777b538SAndroid Build Coastguard Worker    sys.exit(0)
13*6777b538SAndroid Build Coastguard Worker
14*6777b538SAndroid Build Coastguard Workerif len(sys.argv) > 1:
15*6777b538SAndroid Build Coastguard Worker    srcPref = sys.argv[1] + '/'
16*6777b538SAndroid Build Coastguard Workerelse:
17*6777b538SAndroid Build Coastguard Worker    srcPref = ''
18*6777b538SAndroid Build Coastguard Worker
19*6777b538SAndroid Build Coastguard Worker#
20*6777b538SAndroid Build Coastguard Worker# Modules we want to skip in API test
21*6777b538SAndroid Build Coastguard Worker#
22*6777b538SAndroid Build Coastguard Workerskipped_modules = [ "SAX", "xlink", "threads", "globals",
23*6777b538SAndroid Build Coastguard Worker  "xmlmemory", "xmlversion", "xmlexports",
24*6777b538SAndroid Build Coastguard Worker]
25*6777b538SAndroid Build Coastguard Worker
26*6777b538SAndroid Build Coastguard Worker#
27*6777b538SAndroid Build Coastguard Worker# defines for each module
28*6777b538SAndroid Build Coastguard Worker#
29*6777b538SAndroid Build Coastguard Workermodules_defines = {
30*6777b538SAndroid Build Coastguard Worker    "HTMLparser": "LIBXML_HTML_ENABLED",
31*6777b538SAndroid Build Coastguard Worker    "catalog": "LIBXML_CATALOG_ENABLED",
32*6777b538SAndroid Build Coastguard Worker    "xmlreader": "LIBXML_READER_ENABLED",
33*6777b538SAndroid Build Coastguard Worker    "relaxng": "LIBXML_SCHEMAS_ENABLED",
34*6777b538SAndroid Build Coastguard Worker    "schemasInternals": "LIBXML_SCHEMAS_ENABLED",
35*6777b538SAndroid Build Coastguard Worker    "xmlschemas": "LIBXML_SCHEMAS_ENABLED",
36*6777b538SAndroid Build Coastguard Worker    "xmlschemastypes": "LIBXML_SCHEMAS_ENABLED",
37*6777b538SAndroid Build Coastguard Worker    "xpath": "LIBXML_XPATH_ENABLED",
38*6777b538SAndroid Build Coastguard Worker    "xpathInternals": "LIBXML_XPATH_ENABLED",
39*6777b538SAndroid Build Coastguard Worker    "xinclude": "LIBXML_XINCLUDE_ENABLED",
40*6777b538SAndroid Build Coastguard Worker    "xpointer": "LIBXML_XPTR_ENABLED",
41*6777b538SAndroid Build Coastguard Worker    "xmlregexp" : "LIBXML_REGEXP_ENABLED",
42*6777b538SAndroid Build Coastguard Worker    "xmlautomata" : "LIBXML_AUTOMATA_ENABLED",
43*6777b538SAndroid Build Coastguard Worker    "xmlsave" : "LIBXML_OUTPUT_ENABLED",
44*6777b538SAndroid Build Coastguard Worker    "xmlmodule" : "LIBXML_MODULES_ENABLED",
45*6777b538SAndroid Build Coastguard Worker    "pattern" : "LIBXML_PATTERN_ENABLED",
46*6777b538SAndroid Build Coastguard Worker    "schematron" : "LIBXML_SCHEMATRON_ENABLED",
47*6777b538SAndroid Build Coastguard Worker}
48*6777b538SAndroid Build Coastguard Worker
49*6777b538SAndroid Build Coastguard Worker#
50*6777b538SAndroid Build Coastguard Worker# defines for specific functions
51*6777b538SAndroid Build Coastguard Worker#
52*6777b538SAndroid Build Coastguard Workerfunction_defines = {
53*6777b538SAndroid Build Coastguard Worker    "htmlDefaultSAXHandlerInit": "LIBXML_HTML_ENABLED",
54*6777b538SAndroid Build Coastguard Worker    "xmlSAX2EndElement" : "LIBXML_SAX1_ENABLED",
55*6777b538SAndroid Build Coastguard Worker    "xmlSAX2StartElement" : "LIBXML_SAX1_ENABLED",
56*6777b538SAndroid Build Coastguard Worker    "xmlSAXDefaultVersion" : "LIBXML_SAX1_ENABLED",
57*6777b538SAndroid Build Coastguard Worker    "UTF8Toisolat1" : "LIBXML_OUTPUT_ENABLED",
58*6777b538SAndroid Build Coastguard Worker    "xmlIOParseDTD": "LIBXML_VALID_ENABLED",
59*6777b538SAndroid Build Coastguard Worker    "xmlParseDTD": "LIBXML_VALID_ENABLED",
60*6777b538SAndroid Build Coastguard Worker    "xmlParseDoc": "LIBXML_SAX1_ENABLED",
61*6777b538SAndroid Build Coastguard Worker    "xmlParseMemory": "LIBXML_SAX1_ENABLED",
62*6777b538SAndroid Build Coastguard Worker    "xmlRecoverDoc": "LIBXML_SAX1_ENABLED",
63*6777b538SAndroid Build Coastguard Worker    "xmlParseFile": "LIBXML_SAX1_ENABLED",
64*6777b538SAndroid Build Coastguard Worker    "xmlRecoverFile": "LIBXML_SAX1_ENABLED",
65*6777b538SAndroid Build Coastguard Worker    "xmlRecoverMemory": "LIBXML_SAX1_ENABLED",
66*6777b538SAndroid Build Coastguard Worker    "xmlSAXParseFileWithData": "LIBXML_SAX1_ENABLED",
67*6777b538SAndroid Build Coastguard Worker    "xmlSAXParseMemory": "LIBXML_SAX1_ENABLED",
68*6777b538SAndroid Build Coastguard Worker    "xmlSAXUserParseMemory": "LIBXML_SAX1_ENABLED",
69*6777b538SAndroid Build Coastguard Worker    "xmlSAXParseDoc": "LIBXML_SAX1_ENABLED",
70*6777b538SAndroid Build Coastguard Worker    "xmlSAXParseDTD": "LIBXML_SAX1_ENABLED",
71*6777b538SAndroid Build Coastguard Worker    "xmlSAXUserParseFile": "LIBXML_SAX1_ENABLED",
72*6777b538SAndroid Build Coastguard Worker    "xmlParseEntity": "LIBXML_SAX1_ENABLED",
73*6777b538SAndroid Build Coastguard Worker    "xmlParseExternalEntity": "LIBXML_SAX1_ENABLED",
74*6777b538SAndroid Build Coastguard Worker    "xmlSAXParseMemoryWithData": "LIBXML_SAX1_ENABLED",
75*6777b538SAndroid Build Coastguard Worker    "xmlParseBalancedChunkMemory": "LIBXML_SAX1_ENABLED",
76*6777b538SAndroid Build Coastguard Worker    "xmlParseBalancedChunkMemoryRecover": "LIBXML_SAX1_ENABLED",
77*6777b538SAndroid Build Coastguard Worker    "xmlSetupParserForBuffer": "LIBXML_SAX1_ENABLED",
78*6777b538SAndroid Build Coastguard Worker    "xmlStopParser": "LIBXML_PUSH_ENABLED",
79*6777b538SAndroid Build Coastguard Worker    "xmlAttrSerializeTxtContent": "LIBXML_OUTPUT_ENABLED",
80*6777b538SAndroid Build Coastguard Worker    "xmlSAXParseFile": "LIBXML_SAX1_ENABLED",
81*6777b538SAndroid Build Coastguard Worker    "xmlSAXParseEntity": "LIBXML_SAX1_ENABLED",
82*6777b538SAndroid Build Coastguard Worker    "xmlNewTextChild": "LIBXML_TREE_ENABLED",
83*6777b538SAndroid Build Coastguard Worker    "xmlNewDocRawNode": "LIBXML_TREE_ENABLED",
84*6777b538SAndroid Build Coastguard Worker    "xmlNewProp": "LIBXML_TREE_ENABLED",
85*6777b538SAndroid Build Coastguard Worker    "xmlReconciliateNs": "LIBXML_TREE_ENABLED",
86*6777b538SAndroid Build Coastguard Worker    "xmlValidateNCName": "LIBXML_TREE_ENABLED",
87*6777b538SAndroid Build Coastguard Worker    "xmlValidateNMToken": "LIBXML_TREE_ENABLED",
88*6777b538SAndroid Build Coastguard Worker    "xmlValidateName": "LIBXML_TREE_ENABLED",
89*6777b538SAndroid Build Coastguard Worker    "xmlNewChild": "LIBXML_TREE_ENABLED",
90*6777b538SAndroid Build Coastguard Worker    "xmlValidateQName": "LIBXML_TREE_ENABLED",
91*6777b538SAndroid Build Coastguard Worker    "xmlSprintfElementContent": "LIBXML_OUTPUT_ENABLED",
92*6777b538SAndroid Build Coastguard Worker    "xmlValidGetPotentialChildren" : "LIBXML_VALID_ENABLED",
93*6777b538SAndroid Build Coastguard Worker    "xmlValidGetValidElements" : "LIBXML_VALID_ENABLED",
94*6777b538SAndroid Build Coastguard Worker    "xmlTextReaderPreservePattern" : "LIBXML_PATTERN_ENABLED",
95*6777b538SAndroid Build Coastguard Worker}
96*6777b538SAndroid Build Coastguard Worker
97*6777b538SAndroid Build Coastguard Worker#
98*6777b538SAndroid Build Coastguard Worker# Some functions really need to be skipped for the tests.
99*6777b538SAndroid Build Coastguard Worker#
100*6777b538SAndroid Build Coastguard Workerskipped_functions = [
101*6777b538SAndroid Build Coastguard Worker# block on I/O
102*6777b538SAndroid Build Coastguard Worker"xmlFdRead", "xmlReadFd", "xmlCtxtReadFd",
103*6777b538SAndroid Build Coastguard Worker"htmlFdRead", "htmlReadFd", "htmlCtxtReadFd",
104*6777b538SAndroid Build Coastguard Worker"xmlReaderNewFd", "xmlReaderForFd",
105*6777b538SAndroid Build Coastguard Worker"xmlIORead", "xmlReadIO", "xmlCtxtReadIO",
106*6777b538SAndroid Build Coastguard Worker"htmlIORead", "htmlReadIO", "htmlCtxtReadIO",
107*6777b538SAndroid Build Coastguard Worker"xmlReaderNewIO", "xmlBufferDump", "xmlNanoFTPConnect",
108*6777b538SAndroid Build Coastguard Worker"xmlNanoFTPConnectTo", "xmlNanoHTTPMethod", "xmlNanoHTTPMethodRedir",
109*6777b538SAndroid Build Coastguard Worker# Complex I/O APIs
110*6777b538SAndroid Build Coastguard Worker"xmlCreateIOParserCtxt", "xmlParserInputBufferCreateIO",
111*6777b538SAndroid Build Coastguard Worker"xmlRegisterInputCallbacks", "xmlReaderForIO",
112*6777b538SAndroid Build Coastguard Worker"xmlOutputBufferCreateIO", "xmlRegisterOutputCallbacks",
113*6777b538SAndroid Build Coastguard Worker"xmlSaveToIO", "xmlIOHTTPOpenW",
114*6777b538SAndroid Build Coastguard Worker# library state cleanup, generate false leak information and other
115*6777b538SAndroid Build Coastguard Worker# troubles, heavillyb tested otherwise.
116*6777b538SAndroid Build Coastguard Worker"xmlCleanupParser", "xmlRelaxNGCleanupTypes", "xmlSetListDoc",
117*6777b538SAndroid Build Coastguard Worker"xmlSetTreeDoc", "xmlUnlinkNode",
118*6777b538SAndroid Build Coastguard Worker# hard to avoid leaks in the tests
119*6777b538SAndroid Build Coastguard Worker"xmlStrcat", "xmlStrncat", "xmlCatalogAddLocal", "xmlNewTextWriterDoc",
120*6777b538SAndroid Build Coastguard Worker"xmlXPathNewValueTree", "xmlXPathWrapString",
121*6777b538SAndroid Build Coastguard Worker# unimplemented
122*6777b538SAndroid Build Coastguard Worker"xmlTextReaderReadInnerXml", "xmlTextReaderReadOuterXml",
123*6777b538SAndroid Build Coastguard Worker"xmlTextReaderReadString",
124*6777b538SAndroid Build Coastguard Worker# destructor
125*6777b538SAndroid Build Coastguard Worker"xmlListDelete", "xmlOutputBufferClose", "xmlNanoFTPClose", "xmlNanoHTTPClose",
126*6777b538SAndroid Build Coastguard Worker# deprecated
127*6777b538SAndroid Build Coastguard Worker"xmlCatalogGetPublic", "xmlCatalogGetSystem", "xmlEncodeEntities",
128*6777b538SAndroid Build Coastguard Worker"xmlNewGlobalNs", "xmlHandleEntity", "xmlNamespaceParseNCName",
129*6777b538SAndroid Build Coastguard Worker"xmlNamespaceParseNSDef", "xmlNamespaceParseQName",
130*6777b538SAndroid Build Coastguard Worker"xmlParseNamespace", "xmlParseQuotedString", "xmlParserHandleReference",
131*6777b538SAndroid Build Coastguard Worker"xmlScanName",
132*6777b538SAndroid Build Coastguard Worker"xmlDecodeEntities",
133*6777b538SAndroid Build Coastguard Worker# allocators
134*6777b538SAndroid Build Coastguard Worker"xmlMemFree",
135*6777b538SAndroid Build Coastguard Worker# verbosity
136*6777b538SAndroid Build Coastguard Worker"xmlCatalogSetDebug", "xmlShellPrintXPathError", "xmlShellPrintNode",
137*6777b538SAndroid Build Coastguard Worker# Internal functions, no user space should really call them
138*6777b538SAndroid Build Coastguard Worker"xmlParseAttribute", "xmlParseAttributeListDecl", "xmlParseName",
139*6777b538SAndroid Build Coastguard Worker"xmlParseNmtoken", "xmlParseEntityValue", "xmlParseAttValue",
140*6777b538SAndroid Build Coastguard Worker"xmlParseSystemLiteral", "xmlParsePubidLiteral", "xmlParseCharData",
141*6777b538SAndroid Build Coastguard Worker"xmlParseExternalID", "xmlParseComment", "xmlParsePITarget", "xmlParsePI",
142*6777b538SAndroid Build Coastguard Worker"xmlParseNotationDecl", "xmlParseEntityDecl", "xmlParseDefaultDecl",
143*6777b538SAndroid Build Coastguard Worker"xmlParseNotationType", "xmlParseEnumerationType", "xmlParseEnumeratedType",
144*6777b538SAndroid Build Coastguard Worker"xmlParseAttributeType", "xmlParseAttributeListDecl",
145*6777b538SAndroid Build Coastguard Worker"xmlParseElementMixedContentDecl", "xmlParseElementChildrenContentDecl",
146*6777b538SAndroid Build Coastguard Worker"xmlParseElementContentDecl", "xmlParseElementDecl", "xmlParseMarkupDecl",
147*6777b538SAndroid Build Coastguard Worker"xmlParseCharRef", "xmlParseEntityRef", "xmlParseReference",
148*6777b538SAndroid Build Coastguard Worker"xmlParsePEReference", "xmlParseDocTypeDecl", "xmlParseAttribute",
149*6777b538SAndroid Build Coastguard Worker"xmlParseStartTag", "xmlParseEndTag", "xmlParseCDSect", "xmlParseContent",
150*6777b538SAndroid Build Coastguard Worker"xmlParseElement", "xmlParseVersionNum", "xmlParseVersionInfo",
151*6777b538SAndroid Build Coastguard Worker"xmlParseEncName", "xmlParseEncodingDecl", "xmlParseSDDecl",
152*6777b538SAndroid Build Coastguard Worker"xmlParseXMLDecl", "xmlParseTextDecl", "xmlParseMisc",
153*6777b538SAndroid Build Coastguard Worker"xmlParseExternalSubset", "xmlParserHandlePEReference",
154*6777b538SAndroid Build Coastguard Worker"xmlSkipBlankChars",
155*6777b538SAndroid Build Coastguard Worker# Legacy
156*6777b538SAndroid Build Coastguard Worker"xmlCleanupPredefinedEntities", "xmlInitializePredefinedEntities",
157*6777b538SAndroid Build Coastguard Worker"xmlSetFeature", "xmlGetFeature", "xmlGetFeaturesList",
158*6777b538SAndroid Build Coastguard Worker# location sets
159*6777b538SAndroid Build Coastguard Worker"xmlXPtrLocationSetAdd",
160*6777b538SAndroid Build Coastguard Worker"xmlXPtrLocationSetCreate",
161*6777b538SAndroid Build Coastguard Worker"xmlXPtrLocationSetDel",
162*6777b538SAndroid Build Coastguard Worker"xmlXPtrLocationSetMerge",
163*6777b538SAndroid Build Coastguard Worker"xmlXPtrLocationSetRemove",
164*6777b538SAndroid Build Coastguard Worker"xmlXPtrWrapLocationSet",
165*6777b538SAndroid Build Coastguard Worker]
166*6777b538SAndroid Build Coastguard Worker
167*6777b538SAndroid Build Coastguard Worker#
168*6777b538SAndroid Build Coastguard Worker# These functions have side effects on the global state
169*6777b538SAndroid Build Coastguard Worker# and hence generate errors on memory allocation tests
170*6777b538SAndroid Build Coastguard Worker#
171*6777b538SAndroid Build Coastguard Workerskipped_memcheck = [ "xmlLoadCatalog", "xmlAddEncodingAlias",
172*6777b538SAndroid Build Coastguard Worker   "xmlSchemaInitTypes", "xmlNanoFTPProxy", "xmlNanoFTPScanProxy",
173*6777b538SAndroid Build Coastguard Worker   "xmlNanoHTTPScanProxy", "xmlResetLastError", "xmlCatalogConvert",
174*6777b538SAndroid Build Coastguard Worker   "xmlCatalogRemove", "xmlLoadCatalogs", "xmlCleanupCharEncodingHandlers",
175*6777b538SAndroid Build Coastguard Worker   "xmlInitCharEncodingHandlers", "xmlCatalogCleanup",
176*6777b538SAndroid Build Coastguard Worker   "xmlSchemaGetBuiltInType",
177*6777b538SAndroid Build Coastguard Worker   "htmlParseFile", "htmlCtxtReadFile", # loads the catalogs
178*6777b538SAndroid Build Coastguard Worker   "xmlTextReaderSchemaValidate", "xmlSchemaCleanupTypes", # initialize the schemas type system
179*6777b538SAndroid Build Coastguard Worker   "xmlCatalogResolve", "xmlIOParseDTD" # loads the catalogs
180*6777b538SAndroid Build Coastguard Worker]
181*6777b538SAndroid Build Coastguard Worker
182*6777b538SAndroid Build Coastguard Worker#
183*6777b538SAndroid Build Coastguard Worker# Extra code needed for some test cases
184*6777b538SAndroid Build Coastguard Worker#
185*6777b538SAndroid Build Coastguard Workerextra_pre_call = {
186*6777b538SAndroid Build Coastguard Worker   "xmlSAXUserParseFile": """
187*6777b538SAndroid Build Coastguard Worker#ifdef LIBXML_SAX1_ENABLED
188*6777b538SAndroid Build Coastguard Worker        if (sax == (xmlSAXHandlerPtr)&xmlDefaultSAXHandler) user_data = NULL;
189*6777b538SAndroid Build Coastguard Worker#endif
190*6777b538SAndroid Build Coastguard Worker""",
191*6777b538SAndroid Build Coastguard Worker   "xmlSAXUserParseMemory": """
192*6777b538SAndroid Build Coastguard Worker#ifdef LIBXML_SAX1_ENABLED
193*6777b538SAndroid Build Coastguard Worker        if (sax == (xmlSAXHandlerPtr)&xmlDefaultSAXHandler) user_data = NULL;
194*6777b538SAndroid Build Coastguard Worker#endif
195*6777b538SAndroid Build Coastguard Worker""",
196*6777b538SAndroid Build Coastguard Worker   "xmlParseBalancedChunkMemory": """
197*6777b538SAndroid Build Coastguard Worker#ifdef LIBXML_SAX1_ENABLED
198*6777b538SAndroid Build Coastguard Worker        if (sax == (xmlSAXHandlerPtr)&xmlDefaultSAXHandler) user_data = NULL;
199*6777b538SAndroid Build Coastguard Worker#endif
200*6777b538SAndroid Build Coastguard Worker""",
201*6777b538SAndroid Build Coastguard Worker   "xmlParseBalancedChunkMemoryRecover": """
202*6777b538SAndroid Build Coastguard Worker#ifdef LIBXML_SAX1_ENABLED
203*6777b538SAndroid Build Coastguard Worker        if (sax == (xmlSAXHandlerPtr)&xmlDefaultSAXHandler) user_data = NULL;
204*6777b538SAndroid Build Coastguard Worker#endif
205*6777b538SAndroid Build Coastguard Worker""",
206*6777b538SAndroid Build Coastguard Worker   "xmlParserInputBufferCreateFd":
207*6777b538SAndroid Build Coastguard Worker       "if (fd >= 0) fd = -1;",
208*6777b538SAndroid Build Coastguard Worker   "xmlSAXDefaultVersion": """
209*6777b538SAndroid Build Coastguard Worker        {
210*6777b538SAndroid Build Coastguard Worker            int original_version = xmlSAXDefaultVersion(2);
211*6777b538SAndroid Build Coastguard Worker""",
212*6777b538SAndroid Build Coastguard Worker}
213*6777b538SAndroid Build Coastguard Workerextra_post_call = {
214*6777b538SAndroid Build Coastguard Worker   "xmlAddChild":
215*6777b538SAndroid Build Coastguard Worker       "if (ret_val == NULL) { xmlFreeNode(cur) ; cur = NULL ; }",
216*6777b538SAndroid Build Coastguard Worker   "xmlAddEntity":
217*6777b538SAndroid Build Coastguard Worker       "if (ret_val != NULL) { xmlFreeNode(ret_val) ; ret_val = NULL; }",
218*6777b538SAndroid Build Coastguard Worker   "xmlAddChildList":
219*6777b538SAndroid Build Coastguard Worker       "if (ret_val == NULL) { xmlFreeNodeList(cur) ; cur = NULL ; }",
220*6777b538SAndroid Build Coastguard Worker   "xmlAddSibling":
221*6777b538SAndroid Build Coastguard Worker       "if (ret_val == NULL) { xmlFreeNode(elem) ; elem = NULL ; }",
222*6777b538SAndroid Build Coastguard Worker   "xmlAddNextSibling":
223*6777b538SAndroid Build Coastguard Worker       "if (ret_val == NULL) { xmlFreeNode(elem) ; elem = NULL ; }",
224*6777b538SAndroid Build Coastguard Worker   "xmlAddPrevSibling":
225*6777b538SAndroid Build Coastguard Worker       "if (ret_val == NULL) { xmlFreeNode(elem) ; elem = NULL ; }",
226*6777b538SAndroid Build Coastguard Worker   "xmlDocSetRootElement":
227*6777b538SAndroid Build Coastguard Worker       "if (doc == NULL) { xmlFreeNode(root) ; root = NULL ; }",
228*6777b538SAndroid Build Coastguard Worker   "xmlReplaceNode":
229*6777b538SAndroid Build Coastguard Worker       """if (cur != NULL) {
230*6777b538SAndroid Build Coastguard Worker              xmlUnlinkNode(cur);
231*6777b538SAndroid Build Coastguard Worker              xmlFreeNode(cur) ; cur = NULL ; }
232*6777b538SAndroid Build Coastguard Worker          if (old != NULL) {
233*6777b538SAndroid Build Coastguard Worker              xmlUnlinkNode(old);
234*6777b538SAndroid Build Coastguard Worker              xmlFreeNode(old) ; old = NULL ; }
235*6777b538SAndroid Build Coastguard Worker\t  ret_val = NULL;""",
236*6777b538SAndroid Build Coastguard Worker   "xmlTextMerge":
237*6777b538SAndroid Build Coastguard Worker       """if ((first != NULL) && (first->type != XML_TEXT_NODE)) {
238*6777b538SAndroid Build Coastguard Worker              xmlUnlinkNode(second);
239*6777b538SAndroid Build Coastguard Worker              xmlFreeNode(second) ; second = NULL ; }""",
240*6777b538SAndroid Build Coastguard Worker   "xmlBuildQName":
241*6777b538SAndroid Build Coastguard Worker       """if ((ret_val != NULL) && (ret_val != ncname) &&
242*6777b538SAndroid Build Coastguard Worker              (ret_val != prefix) && (ret_val != memory))
243*6777b538SAndroid Build Coastguard Worker              xmlFree(ret_val);
244*6777b538SAndroid Build Coastguard Worker\t  ret_val = NULL;""",
245*6777b538SAndroid Build Coastguard Worker   "xmlNewDocElementContent":
246*6777b538SAndroid Build Coastguard Worker       """xmlFreeDocElementContent(doc, ret_val); ret_val = NULL;""",
247*6777b538SAndroid Build Coastguard Worker   "xmlDictReference": "xmlDictFree(dict);",
248*6777b538SAndroid Build Coastguard Worker   # Functions which deallocates one of their parameters
249*6777b538SAndroid Build Coastguard Worker   "xmlXPathConvertBoolean": """val = NULL;""",
250*6777b538SAndroid Build Coastguard Worker   "xmlXPathConvertNumber": """val = NULL;""",
251*6777b538SAndroid Build Coastguard Worker   "xmlXPathConvertString": """val = NULL;""",
252*6777b538SAndroid Build Coastguard Worker   "xmlSaveFileTo": """buf = NULL;""",
253*6777b538SAndroid Build Coastguard Worker   "xmlSaveFormatFileTo": """buf = NULL;""",
254*6777b538SAndroid Build Coastguard Worker   "xmlIOParseDTD": "input = NULL;",
255*6777b538SAndroid Build Coastguard Worker   "xmlRemoveProp": "cur = NULL;",
256*6777b538SAndroid Build Coastguard Worker   "xmlNewNs": "if ((node == NULL) && (ret_val != NULL)) xmlFreeNs(ret_val);",
257*6777b538SAndroid Build Coastguard Worker   "xmlCopyNamespace": "if (ret_val != NULL) xmlFreeNs(ret_val);",
258*6777b538SAndroid Build Coastguard Worker   "xmlCopyNamespaceList": "if (ret_val != NULL) xmlFreeNsList(ret_val);",
259*6777b538SAndroid Build Coastguard Worker   "xmlNewTextWriter": "if (ret_val != NULL) out = NULL;",
260*6777b538SAndroid Build Coastguard Worker   "xmlNewTextWriterPushParser": "if (ctxt != NULL) {xmlFreeDoc(ctxt->myDoc); ctxt->myDoc = NULL;} if (ret_val != NULL) ctxt = NULL;",
261*6777b538SAndroid Build Coastguard Worker   "xmlNewIOInputStream": "if (ret_val != NULL) input = NULL;",
262*6777b538SAndroid Build Coastguard Worker   "htmlParseChunk": "if (ctxt != NULL) {xmlFreeDoc(ctxt->myDoc); ctxt->myDoc = NULL;}",
263*6777b538SAndroid Build Coastguard Worker   "htmlParseDocument": "if (ctxt != NULL) {xmlFreeDoc(ctxt->myDoc); ctxt->myDoc = NULL;}",
264*6777b538SAndroid Build Coastguard Worker   "xmlParseDocument": "if (ctxt != NULL) {xmlFreeDoc(ctxt->myDoc); ctxt->myDoc = NULL;}",
265*6777b538SAndroid Build Coastguard Worker   "xmlParseChunk": "if (ctxt != NULL) {xmlFreeDoc(ctxt->myDoc); ctxt->myDoc = NULL;}",
266*6777b538SAndroid Build Coastguard Worker   "xmlParseExtParsedEnt": "if (ctxt != NULL) {xmlFreeDoc(ctxt->myDoc); ctxt->myDoc = NULL;}",
267*6777b538SAndroid Build Coastguard Worker   "xmlDOMWrapAdoptNode": "if ((node != NULL) && (node->parent == NULL)) {xmlUnlinkNode(node);xmlFreeNode(node);node = NULL;}",
268*6777b538SAndroid Build Coastguard Worker   "xmlSAXDefaultVersion": """
269*6777b538SAndroid Build Coastguard Worker            (void)xmlSAXDefaultVersion(original_version);
270*6777b538SAndroid Build Coastguard Worker        }
271*6777b538SAndroid Build Coastguard Worker""",
272*6777b538SAndroid Build Coastguard Worker}
273*6777b538SAndroid Build Coastguard Worker
274*6777b538SAndroid Build Coastguard Workermodules = []
275*6777b538SAndroid Build Coastguard Worker
276*6777b538SAndroid Build Coastguard Workerdef is_skipped_module(name):
277*6777b538SAndroid Build Coastguard Worker    for mod in skipped_modules:
278*6777b538SAndroid Build Coastguard Worker        if mod == name:
279*6777b538SAndroid Build Coastguard Worker            return 1
280*6777b538SAndroid Build Coastguard Worker    return 0
281*6777b538SAndroid Build Coastguard Worker
282*6777b538SAndroid Build Coastguard Workerdef is_skipped_function(name):
283*6777b538SAndroid Build Coastguard Worker    for fun in skipped_functions:
284*6777b538SAndroid Build Coastguard Worker        if fun == name:
285*6777b538SAndroid Build Coastguard Worker            return 1
286*6777b538SAndroid Build Coastguard Worker    # Do not test destructors
287*6777b538SAndroid Build Coastguard Worker    if name.find('Free') != -1:
288*6777b538SAndroid Build Coastguard Worker        return 1
289*6777b538SAndroid Build Coastguard Worker    return 0
290*6777b538SAndroid Build Coastguard Worker
291*6777b538SAndroid Build Coastguard Workerdef is_skipped_memcheck(name):
292*6777b538SAndroid Build Coastguard Worker    for fun in skipped_memcheck:
293*6777b538SAndroid Build Coastguard Worker        if fun == name:
294*6777b538SAndroid Build Coastguard Worker            return 1
295*6777b538SAndroid Build Coastguard Worker    return 0
296*6777b538SAndroid Build Coastguard Worker
297*6777b538SAndroid Build Coastguard Workermissing_types = {}
298*6777b538SAndroid Build Coastguard Workerdef add_missing_type(name, func):
299*6777b538SAndroid Build Coastguard Worker    try:
300*6777b538SAndroid Build Coastguard Worker        list = missing_types[name]
301*6777b538SAndroid Build Coastguard Worker        list.append(func)
302*6777b538SAndroid Build Coastguard Worker    except:
303*6777b538SAndroid Build Coastguard Worker        missing_types[name] = [func]
304*6777b538SAndroid Build Coastguard Worker
305*6777b538SAndroid Build Coastguard Workergenerated_param_types = []
306*6777b538SAndroid Build Coastguard Workerdef add_generated_param_type(name):
307*6777b538SAndroid Build Coastguard Worker    generated_param_types.append(name)
308*6777b538SAndroid Build Coastguard Worker
309*6777b538SAndroid Build Coastguard Workergenerated_return_types = []
310*6777b538SAndroid Build Coastguard Workerdef add_generated_return_type(name):
311*6777b538SAndroid Build Coastguard Worker    generated_return_types.append(name)
312*6777b538SAndroid Build Coastguard Worker
313*6777b538SAndroid Build Coastguard Workermissing_functions = {}
314*6777b538SAndroid Build Coastguard Workermissing_functions_nr = 0
315*6777b538SAndroid Build Coastguard Workerdef add_missing_functions(name, module):
316*6777b538SAndroid Build Coastguard Worker    global missing_functions_nr
317*6777b538SAndroid Build Coastguard Worker
318*6777b538SAndroid Build Coastguard Worker    missing_functions_nr = missing_functions_nr + 1
319*6777b538SAndroid Build Coastguard Worker    try:
320*6777b538SAndroid Build Coastguard Worker        list = missing_functions[module]
321*6777b538SAndroid Build Coastguard Worker        list.append(name)
322*6777b538SAndroid Build Coastguard Worker    except:
323*6777b538SAndroid Build Coastguard Worker        missing_functions[module] = [name]
324*6777b538SAndroid Build Coastguard Worker
325*6777b538SAndroid Build Coastguard Worker#
326*6777b538SAndroid Build Coastguard Worker# Provide the type generators and destructors for the parameters
327*6777b538SAndroid Build Coastguard Worker#
328*6777b538SAndroid Build Coastguard Worker
329*6777b538SAndroid Build Coastguard Workerdef type_convert(str, name, info, module, function, pos):
330*6777b538SAndroid Build Coastguard Worker#    res = str.replace("    ", " ")
331*6777b538SAndroid Build Coastguard Worker#    res = str.replace("   ", " ")
332*6777b538SAndroid Build Coastguard Worker#    res = str.replace("  ", " ")
333*6777b538SAndroid Build Coastguard Worker    res = str.replace(" *", "_ptr")
334*6777b538SAndroid Build Coastguard Worker#    res = str.replace("*", "_ptr")
335*6777b538SAndroid Build Coastguard Worker    res = res.replace(" ", "_")
336*6777b538SAndroid Build Coastguard Worker    if res == 'const_char_ptr':
337*6777b538SAndroid Build Coastguard Worker        if name.find("file") != -1 or \
338*6777b538SAndroid Build Coastguard Worker           name.find("uri") != -1 or \
339*6777b538SAndroid Build Coastguard Worker           name.find("URI") != -1 or \
340*6777b538SAndroid Build Coastguard Worker           info.find("filename") != -1 or \
341*6777b538SAndroid Build Coastguard Worker           info.find("URI") != -1 or \
342*6777b538SAndroid Build Coastguard Worker           info.find("URL") != -1:
343*6777b538SAndroid Build Coastguard Worker            if function.find("Save") != -1 or \
344*6777b538SAndroid Build Coastguard Worker               function.find("Create") != -1 or \
345*6777b538SAndroid Build Coastguard Worker               function.find("Write") != -1 or \
346*6777b538SAndroid Build Coastguard Worker               function.find("Fetch") != -1:
347*6777b538SAndroid Build Coastguard Worker                return('fileoutput')
348*6777b538SAndroid Build Coastguard Worker            return('filepath')
349*6777b538SAndroid Build Coastguard Worker    if res == 'void_ptr':
350*6777b538SAndroid Build Coastguard Worker        if module == 'nanoftp' and name == 'ctx':
351*6777b538SAndroid Build Coastguard Worker            return('xmlNanoFTPCtxtPtr')
352*6777b538SAndroid Build Coastguard Worker        if function == 'xmlNanoFTPNewCtxt' or \
353*6777b538SAndroid Build Coastguard Worker           function == 'xmlNanoFTPConnectTo' or \
354*6777b538SAndroid Build Coastguard Worker           function == 'xmlNanoFTPOpen':
355*6777b538SAndroid Build Coastguard Worker            return('xmlNanoFTPCtxtPtr')
356*6777b538SAndroid Build Coastguard Worker        if module == 'nanohttp' and name == 'ctx':
357*6777b538SAndroid Build Coastguard Worker            return('xmlNanoHTTPCtxtPtr')
358*6777b538SAndroid Build Coastguard Worker        if function == 'xmlNanoHTTPMethod' or \
359*6777b538SAndroid Build Coastguard Worker           function == 'xmlNanoHTTPMethodRedir' or \
360*6777b538SAndroid Build Coastguard Worker           function == 'xmlNanoHTTPOpen' or \
361*6777b538SAndroid Build Coastguard Worker           function == 'xmlNanoHTTPOpenRedir':
362*6777b538SAndroid Build Coastguard Worker            return('xmlNanoHTTPCtxtPtr');
363*6777b538SAndroid Build Coastguard Worker        if function == 'xmlIOHTTPOpen':
364*6777b538SAndroid Build Coastguard Worker            return('xmlNanoHTTPCtxtPtr')
365*6777b538SAndroid Build Coastguard Worker        if name.find("data") != -1:
366*6777b538SAndroid Build Coastguard Worker            return('userdata')
367*6777b538SAndroid Build Coastguard Worker        if name.find("user") != -1:
368*6777b538SAndroid Build Coastguard Worker            return('userdata')
369*6777b538SAndroid Build Coastguard Worker    if res == 'xmlDoc_ptr':
370*6777b538SAndroid Build Coastguard Worker        res = 'xmlDocPtr'
371*6777b538SAndroid Build Coastguard Worker    if res == 'xmlNode_ptr':
372*6777b538SAndroid Build Coastguard Worker        res = 'xmlNodePtr'
373*6777b538SAndroid Build Coastguard Worker    if res == 'xmlDict_ptr':
374*6777b538SAndroid Build Coastguard Worker        res = 'xmlDictPtr'
375*6777b538SAndroid Build Coastguard Worker    if res == 'xmlNodePtr' and pos != 0:
376*6777b538SAndroid Build Coastguard Worker        if (function == 'xmlAddChild' and pos == 2) or \
377*6777b538SAndroid Build Coastguard Worker           (function == 'xmlAddChildList' and pos == 2) or \
378*6777b538SAndroid Build Coastguard Worker           (function == 'xmlAddNextSibling' and pos == 2) or \
379*6777b538SAndroid Build Coastguard Worker           (function == 'xmlAddSibling' and pos == 2) or \
380*6777b538SAndroid Build Coastguard Worker           (function == 'xmlDocSetRootElement' and pos == 2) or \
381*6777b538SAndroid Build Coastguard Worker           (function == 'xmlReplaceNode' and pos == 2) or \
382*6777b538SAndroid Build Coastguard Worker           (function == 'xmlTextMerge') or \
383*6777b538SAndroid Build Coastguard Worker           (function == 'xmlAddPrevSibling' and pos == 2):
384*6777b538SAndroid Build Coastguard Worker            return('xmlNodePtr_in');
385*6777b538SAndroid Build Coastguard Worker    if res == 'const xmlBufferPtr':
386*6777b538SAndroid Build Coastguard Worker        res = 'xmlBufferPtr'
387*6777b538SAndroid Build Coastguard Worker    if res == 'xmlChar_ptr' and name == 'name' and \
388*6777b538SAndroid Build Coastguard Worker       function.find("EatName") != -1:
389*6777b538SAndroid Build Coastguard Worker        return('eaten_name')
390*6777b538SAndroid Build Coastguard Worker    if res == 'void_ptr*':
391*6777b538SAndroid Build Coastguard Worker        res = 'void_ptr_ptr'
392*6777b538SAndroid Build Coastguard Worker    if res == 'char_ptr*':
393*6777b538SAndroid Build Coastguard Worker        res = 'char_ptr_ptr'
394*6777b538SAndroid Build Coastguard Worker    if res == 'xmlChar_ptr*':
395*6777b538SAndroid Build Coastguard Worker        res = 'xmlChar_ptr_ptr'
396*6777b538SAndroid Build Coastguard Worker    if res == 'const_xmlChar_ptr*':
397*6777b538SAndroid Build Coastguard Worker        res = 'const_xmlChar_ptr_ptr'
398*6777b538SAndroid Build Coastguard Worker    if res == 'const_char_ptr*':
399*6777b538SAndroid Build Coastguard Worker        res = 'const_char_ptr_ptr'
400*6777b538SAndroid Build Coastguard Worker    if res == 'FILE_ptr' and module == 'debugXML':
401*6777b538SAndroid Build Coastguard Worker        res = 'debug_FILE_ptr';
402*6777b538SAndroid Build Coastguard Worker    if res == 'int' and name == 'options':
403*6777b538SAndroid Build Coastguard Worker        if module == 'parser' or module == 'xmlreader':
404*6777b538SAndroid Build Coastguard Worker            res = 'parseroptions'
405*6777b538SAndroid Build Coastguard Worker
406*6777b538SAndroid Build Coastguard Worker    return res
407*6777b538SAndroid Build Coastguard Worker
408*6777b538SAndroid Build Coastguard Workerknown_param_types = []
409*6777b538SAndroid Build Coastguard Worker
410*6777b538SAndroid Build Coastguard Workerdef is_known_param_type(name):
411*6777b538SAndroid Build Coastguard Worker    for type in known_param_types:
412*6777b538SAndroid Build Coastguard Worker        if type == name:
413*6777b538SAndroid Build Coastguard Worker            return 1
414*6777b538SAndroid Build Coastguard Worker    return name[-3:] == 'Ptr' or name[-4:] == '_ptr'
415*6777b538SAndroid Build Coastguard Worker
416*6777b538SAndroid Build Coastguard Workerdef generate_param_type(name, rtype):
417*6777b538SAndroid Build Coastguard Worker    global test
418*6777b538SAndroid Build Coastguard Worker    for type in known_param_types:
419*6777b538SAndroid Build Coastguard Worker        if type == name:
420*6777b538SAndroid Build Coastguard Worker            return
421*6777b538SAndroid Build Coastguard Worker    for type in generated_param_types:
422*6777b538SAndroid Build Coastguard Worker        if type == name:
423*6777b538SAndroid Build Coastguard Worker            return
424*6777b538SAndroid Build Coastguard Worker
425*6777b538SAndroid Build Coastguard Worker    if name[-3:] == 'Ptr' or name[-4:] == '_ptr':
426*6777b538SAndroid Build Coastguard Worker        define = 0
427*6777b538SAndroid Build Coastguard Worker        if module in modules_defines:
428*6777b538SAndroid Build Coastguard Worker            test.write("#ifdef %s\n" % (modules_defines[module]))
429*6777b538SAndroid Build Coastguard Worker            define = 1
430*6777b538SAndroid Build Coastguard Worker        test.write("""
431*6777b538SAndroid Build Coastguard Worker#define gen_nb_%s 1
432*6777b538SAndroid Build Coastguard Worker#define gen_%s(no, nr) NULL
433*6777b538SAndroid Build Coastguard Worker#define des_%s(no, val, nr)
434*6777b538SAndroid Build Coastguard Worker""" % (name, name, name))
435*6777b538SAndroid Build Coastguard Worker        if define == 1:
436*6777b538SAndroid Build Coastguard Worker            test.write("#endif\n\n")
437*6777b538SAndroid Build Coastguard Worker        add_generated_param_type(name)
438*6777b538SAndroid Build Coastguard Worker
439*6777b538SAndroid Build Coastguard Worker#
440*6777b538SAndroid Build Coastguard Worker# Provide the type destructors for the return values
441*6777b538SAndroid Build Coastguard Worker#
442*6777b538SAndroid Build Coastguard Worker
443*6777b538SAndroid Build Coastguard Workerknown_return_types = []
444*6777b538SAndroid Build Coastguard Worker
445*6777b538SAndroid Build Coastguard Workerdef is_known_return_type(name):
446*6777b538SAndroid Build Coastguard Worker    for type in known_return_types:
447*6777b538SAndroid Build Coastguard Worker        if type == name:
448*6777b538SAndroid Build Coastguard Worker            return 1
449*6777b538SAndroid Build Coastguard Worker    return 0
450*6777b538SAndroid Build Coastguard Worker
451*6777b538SAndroid Build Coastguard Worker#
452*6777b538SAndroid Build Coastguard Worker# Copy the beginning of the C test program result
453*6777b538SAndroid Build Coastguard Worker#
454*6777b538SAndroid Build Coastguard Worker
455*6777b538SAndroid Build Coastguard Workertry:
456*6777b538SAndroid Build Coastguard Worker    input = open("testapi.c", "r")
457*6777b538SAndroid Build Coastguard Workerexcept:
458*6777b538SAndroid Build Coastguard Worker    input = open(srcPref + "testapi.c", "r")
459*6777b538SAndroid Build Coastguard Workertest = open('testapi.c.new', 'w')
460*6777b538SAndroid Build Coastguard Worker
461*6777b538SAndroid Build Coastguard Workerdef compare_and_save():
462*6777b538SAndroid Build Coastguard Worker    global test
463*6777b538SAndroid Build Coastguard Worker
464*6777b538SAndroid Build Coastguard Worker    test.close()
465*6777b538SAndroid Build Coastguard Worker    try:
466*6777b538SAndroid Build Coastguard Worker        input = open("testapi.c", "r").read()
467*6777b538SAndroid Build Coastguard Worker    except:
468*6777b538SAndroid Build Coastguard Worker        input = ''
469*6777b538SAndroid Build Coastguard Worker    test = open('testapi.c.new', "r").read()
470*6777b538SAndroid Build Coastguard Worker    if input != test:
471*6777b538SAndroid Build Coastguard Worker        try:
472*6777b538SAndroid Build Coastguard Worker            os.system("rm testapi.c; mv testapi.c.new testapi.c")
473*6777b538SAndroid Build Coastguard Worker        except:
474*6777b538SAndroid Build Coastguard Worker            os.system("mv testapi.c.new testapi.c")
475*6777b538SAndroid Build Coastguard Worker        print("Updated testapi.c")
476*6777b538SAndroid Build Coastguard Worker    else:
477*6777b538SAndroid Build Coastguard Worker        print("Generated testapi.c is identical")
478*6777b538SAndroid Build Coastguard Worker
479*6777b538SAndroid Build Coastguard Workerline = input.readline()
480*6777b538SAndroid Build Coastguard Workerwhile line != "":
481*6777b538SAndroid Build Coastguard Worker    if line == "/* CUT HERE: everything below that line is generated */\n":
482*6777b538SAndroid Build Coastguard Worker        break;
483*6777b538SAndroid Build Coastguard Worker    if line[0:15] == "#define gen_nb_":
484*6777b538SAndroid Build Coastguard Worker        type = line[15:].split()[0]
485*6777b538SAndroid Build Coastguard Worker        known_param_types.append(type)
486*6777b538SAndroid Build Coastguard Worker    if line[0:19] == "static void desret_":
487*6777b538SAndroid Build Coastguard Worker        type = line[19:].split('(')[0]
488*6777b538SAndroid Build Coastguard Worker        known_return_types.append(type)
489*6777b538SAndroid Build Coastguard Worker    test.write(line)
490*6777b538SAndroid Build Coastguard Worker    line = input.readline()
491*6777b538SAndroid Build Coastguard Workerinput.close()
492*6777b538SAndroid Build Coastguard Worker
493*6777b538SAndroid Build Coastguard Workerif line == "":
494*6777b538SAndroid Build Coastguard Worker    print("Could not find the CUT marker in testapi.c skipping generation")
495*6777b538SAndroid Build Coastguard Worker    test.close()
496*6777b538SAndroid Build Coastguard Worker    sys.exit(0)
497*6777b538SAndroid Build Coastguard Worker
498*6777b538SAndroid Build Coastguard Workerprint("Scanned testapi.c: found %d parameters types and %d return types\n" % (
499*6777b538SAndroid Build Coastguard Worker      len(known_param_types), len(known_return_types)))
500*6777b538SAndroid Build Coastguard Workertest.write("/* CUT HERE: everything below that line is generated */\n")
501*6777b538SAndroid Build Coastguard Worker
502*6777b538SAndroid Build Coastguard Worker
503*6777b538SAndroid Build Coastguard Worker#
504*6777b538SAndroid Build Coastguard Worker# Open the input API description
505*6777b538SAndroid Build Coastguard Worker#
506*6777b538SAndroid Build Coastguard Workerdoc = libxml2.readFile(srcPref + 'doc/libxml2-api.xml', None, 0)
507*6777b538SAndroid Build Coastguard Workerif doc == None:
508*6777b538SAndroid Build Coastguard Worker    print("Failed to load doc/libxml2-api.xml")
509*6777b538SAndroid Build Coastguard Worker    sys.exit(1)
510*6777b538SAndroid Build Coastguard Workerctxt = doc.xpathNewContext()
511*6777b538SAndroid Build Coastguard Worker
512*6777b538SAndroid Build Coastguard Worker#
513*6777b538SAndroid Build Coastguard Worker# Generate a list of all function parameters and select only
514*6777b538SAndroid Build Coastguard Worker# those used in the api tests
515*6777b538SAndroid Build Coastguard Worker#
516*6777b538SAndroid Build Coastguard Workerargtypes = {}
517*6777b538SAndroid Build Coastguard Workerargs = ctxt.xpathEval("/api/symbols/function/arg")
518*6777b538SAndroid Build Coastguard Workerfor arg in args:
519*6777b538SAndroid Build Coastguard Worker    mod = arg.xpathEval('string(../@file)')
520*6777b538SAndroid Build Coastguard Worker    func = arg.xpathEval('string(../@name)')
521*6777b538SAndroid Build Coastguard Worker    if (mod not in skipped_modules) and (func not in skipped_functions):
522*6777b538SAndroid Build Coastguard Worker        type = arg.xpathEval('string(@type)')
523*6777b538SAndroid Build Coastguard Worker        if type not in argtypes:
524*6777b538SAndroid Build Coastguard Worker            argtypes[type] = func
525*6777b538SAndroid Build Coastguard Worker
526*6777b538SAndroid Build Coastguard Worker# similarly for return types
527*6777b538SAndroid Build Coastguard Workerrettypes = {}
528*6777b538SAndroid Build Coastguard Workerrets = ctxt.xpathEval("/api/symbols/function/return")
529*6777b538SAndroid Build Coastguard Workerfor ret in rets:
530*6777b538SAndroid Build Coastguard Worker    mod = ret.xpathEval('string(../@file)')
531*6777b538SAndroid Build Coastguard Worker    func = ret.xpathEval('string(../@name)')
532*6777b538SAndroid Build Coastguard Worker    if (mod not in skipped_modules) and (func not in skipped_functions):
533*6777b538SAndroid Build Coastguard Worker        type = ret.xpathEval('string(@type)')
534*6777b538SAndroid Build Coastguard Worker        if type not in rettypes:
535*6777b538SAndroid Build Coastguard Worker            rettypes[type] = func
536*6777b538SAndroid Build Coastguard Worker
537*6777b538SAndroid Build Coastguard Worker#
538*6777b538SAndroid Build Coastguard Worker# Generate constructors and return type handling for all enums
539*6777b538SAndroid Build Coastguard Worker# which are used as function parameters
540*6777b538SAndroid Build Coastguard Worker#
541*6777b538SAndroid Build Coastguard Workerenums = ctxt.xpathEval("/api/symbols/typedef[@type='enum']")
542*6777b538SAndroid Build Coastguard Workerfor enum in enums:
543*6777b538SAndroid Build Coastguard Worker    module = enum.xpathEval('string(@file)')
544*6777b538SAndroid Build Coastguard Worker    name = enum.xpathEval('string(@name)')
545*6777b538SAndroid Build Coastguard Worker    #
546*6777b538SAndroid Build Coastguard Worker    # Skip any enums which are not in our filtered lists
547*6777b538SAndroid Build Coastguard Worker    #
548*6777b538SAndroid Build Coastguard Worker    if (name == None) or ((name not in argtypes) and (name not in rettypes)):
549*6777b538SAndroid Build Coastguard Worker        continue;
550*6777b538SAndroid Build Coastguard Worker    define = 0
551*6777b538SAndroid Build Coastguard Worker
552*6777b538SAndroid Build Coastguard Worker    if (name in argtypes) and is_known_param_type(name) == 0:
553*6777b538SAndroid Build Coastguard Worker        values = ctxt.xpathEval("/api/symbols/enum[@type='%s']" % name)
554*6777b538SAndroid Build Coastguard Worker        i = 0
555*6777b538SAndroid Build Coastguard Worker        vals = []
556*6777b538SAndroid Build Coastguard Worker        for value in values:
557*6777b538SAndroid Build Coastguard Worker            vname = value.xpathEval('string(@name)')
558*6777b538SAndroid Build Coastguard Worker            if vname == None:
559*6777b538SAndroid Build Coastguard Worker                continue;
560*6777b538SAndroid Build Coastguard Worker            i = i + 1
561*6777b538SAndroid Build Coastguard Worker            if i >= 5:
562*6777b538SAndroid Build Coastguard Worker                break;
563*6777b538SAndroid Build Coastguard Worker            vals.append(vname)
564*6777b538SAndroid Build Coastguard Worker        if vals == []:
565*6777b538SAndroid Build Coastguard Worker            print("Didn't find any value for enum %s" % (name))
566*6777b538SAndroid Build Coastguard Worker            continue
567*6777b538SAndroid Build Coastguard Worker        if module in modules_defines:
568*6777b538SAndroid Build Coastguard Worker            test.write("#ifdef %s\n" % (modules_defines[module]))
569*6777b538SAndroid Build Coastguard Worker            define = 1
570*6777b538SAndroid Build Coastguard Worker        test.write("#define gen_nb_%s %d\n" % (name, len(vals)))
571*6777b538SAndroid Build Coastguard Worker        test.write("""static %s gen_%s(int no, int nr ATTRIBUTE_UNUSED) {\n""" %
572*6777b538SAndroid Build Coastguard Worker                   (name, name))
573*6777b538SAndroid Build Coastguard Worker        i = 1
574*6777b538SAndroid Build Coastguard Worker        for value in vals:
575*6777b538SAndroid Build Coastguard Worker            test.write("    if (no == %d) return(%s);\n" % (i, value))
576*6777b538SAndroid Build Coastguard Worker            i = i + 1
577*6777b538SAndroid Build Coastguard Worker        test.write("""    return(0);
578*6777b538SAndroid Build Coastguard Worker}
579*6777b538SAndroid Build Coastguard Worker
580*6777b538SAndroid Build Coastguard Workerstatic void des_%s(int no ATTRIBUTE_UNUSED, %s val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
581*6777b538SAndroid Build Coastguard Worker}
582*6777b538SAndroid Build Coastguard Worker
583*6777b538SAndroid Build Coastguard Worker""" % (name, name));
584*6777b538SAndroid Build Coastguard Worker        known_param_types.append(name)
585*6777b538SAndroid Build Coastguard Worker
586*6777b538SAndroid Build Coastguard Worker    if (is_known_return_type(name) == 0) and (name in rettypes):
587*6777b538SAndroid Build Coastguard Worker        if define == 0 and (module in modules_defines):
588*6777b538SAndroid Build Coastguard Worker            test.write("#ifdef %s\n" % (modules_defines[module]))
589*6777b538SAndroid Build Coastguard Worker            define = 1
590*6777b538SAndroid Build Coastguard Worker        test.write("""static void desret_%s(%s val ATTRIBUTE_UNUSED) {
591*6777b538SAndroid Build Coastguard Worker}
592*6777b538SAndroid Build Coastguard Worker
593*6777b538SAndroid Build Coastguard Worker""" % (name, name))
594*6777b538SAndroid Build Coastguard Worker        known_return_types.append(name)
595*6777b538SAndroid Build Coastguard Worker    if define == 1:
596*6777b538SAndroid Build Coastguard Worker        test.write("#endif\n\n")
597*6777b538SAndroid Build Coastguard Worker
598*6777b538SAndroid Build Coastguard Worker#
599*6777b538SAndroid Build Coastguard Worker# Load the interfaces
600*6777b538SAndroid Build Coastguard Worker#
601*6777b538SAndroid Build Coastguard Workerheaders = ctxt.xpathEval("/api/files/file")
602*6777b538SAndroid Build Coastguard Workerfor file in headers:
603*6777b538SAndroid Build Coastguard Worker    name = file.xpathEval('string(@name)')
604*6777b538SAndroid Build Coastguard Worker    if (name == None) or (name == ''):
605*6777b538SAndroid Build Coastguard Worker        continue
606*6777b538SAndroid Build Coastguard Worker
607*6777b538SAndroid Build Coastguard Worker    #
608*6777b538SAndroid Build Coastguard Worker    # Some module may be skipped because they don't really consists
609*6777b538SAndroid Build Coastguard Worker    # of user callable APIs
610*6777b538SAndroid Build Coastguard Worker    #
611*6777b538SAndroid Build Coastguard Worker    if is_skipped_module(name):
612*6777b538SAndroid Build Coastguard Worker        continue
613*6777b538SAndroid Build Coastguard Worker
614*6777b538SAndroid Build Coastguard Worker    #
615*6777b538SAndroid Build Coastguard Worker    # do not test deprecated APIs
616*6777b538SAndroid Build Coastguard Worker    #
617*6777b538SAndroid Build Coastguard Worker    desc = file.xpathEval('string(description)')
618*6777b538SAndroid Build Coastguard Worker    if desc.find('DEPRECATED') != -1:
619*6777b538SAndroid Build Coastguard Worker        print("Skipping deprecated interface %s" % name)
620*6777b538SAndroid Build Coastguard Worker        continue;
621*6777b538SAndroid Build Coastguard Worker
622*6777b538SAndroid Build Coastguard Worker    test.write("#include <libxml/%s.h>\n" % name)
623*6777b538SAndroid Build Coastguard Worker    modules.append(name)
624*6777b538SAndroid Build Coastguard Worker
625*6777b538SAndroid Build Coastguard Worker#
626*6777b538SAndroid Build Coastguard Worker# Generate the callers signatures
627*6777b538SAndroid Build Coastguard Worker#
628*6777b538SAndroid Build Coastguard Workerfor module in modules:
629*6777b538SAndroid Build Coastguard Worker    test.write("static int test_%s(void);\n" % module);
630*6777b538SAndroid Build Coastguard Worker
631*6777b538SAndroid Build Coastguard Worker#
632*6777b538SAndroid Build Coastguard Worker# Generate the top caller
633*6777b538SAndroid Build Coastguard Worker#
634*6777b538SAndroid Build Coastguard Worker
635*6777b538SAndroid Build Coastguard Workertest.write("""
636*6777b538SAndroid Build Coastguard Worker/**
637*6777b538SAndroid Build Coastguard Worker * testlibxml2:
638*6777b538SAndroid Build Coastguard Worker *
639*6777b538SAndroid Build Coastguard Worker * Main entry point of the tester for the full libxml2 module,
640*6777b538SAndroid Build Coastguard Worker * it calls all the tester entry point for each module.
641*6777b538SAndroid Build Coastguard Worker *
642*6777b538SAndroid Build Coastguard Worker * Returns the number of error found
643*6777b538SAndroid Build Coastguard Worker */
644*6777b538SAndroid Build Coastguard Workerstatic int
645*6777b538SAndroid Build Coastguard Workertestlibxml2(void)
646*6777b538SAndroid Build Coastguard Worker{
647*6777b538SAndroid Build Coastguard Worker    int test_ret = 0;
648*6777b538SAndroid Build Coastguard Worker
649*6777b538SAndroid Build Coastguard Worker""")
650*6777b538SAndroid Build Coastguard Worker
651*6777b538SAndroid Build Coastguard Workerfor module in modules:
652*6777b538SAndroid Build Coastguard Worker    test.write("    test_ret += test_%s();\n" % module)
653*6777b538SAndroid Build Coastguard Worker
654*6777b538SAndroid Build Coastguard Workertest.write("""
655*6777b538SAndroid Build Coastguard Worker    printf("Total: %d functions, %d tests, %d errors\\n",
656*6777b538SAndroid Build Coastguard Worker           function_tests, call_tests, test_ret);
657*6777b538SAndroid Build Coastguard Worker    return(test_ret);
658*6777b538SAndroid Build Coastguard Worker}
659*6777b538SAndroid Build Coastguard Worker
660*6777b538SAndroid Build Coastguard Worker""")
661*6777b538SAndroid Build Coastguard Worker
662*6777b538SAndroid Build Coastguard Worker#
663*6777b538SAndroid Build Coastguard Worker# How to handle a function
664*6777b538SAndroid Build Coastguard Worker#
665*6777b538SAndroid Build Coastguard Workernb_tests = 0
666*6777b538SAndroid Build Coastguard Worker
667*6777b538SAndroid Build Coastguard Workerdef generate_test(module, node):
668*6777b538SAndroid Build Coastguard Worker    global test
669*6777b538SAndroid Build Coastguard Worker    global nb_tests
670*6777b538SAndroid Build Coastguard Worker    nb_cond = 0
671*6777b538SAndroid Build Coastguard Worker    no_gen = 0
672*6777b538SAndroid Build Coastguard Worker
673*6777b538SAndroid Build Coastguard Worker    name = node.xpathEval('string(@name)')
674*6777b538SAndroid Build Coastguard Worker    if is_skipped_function(name):
675*6777b538SAndroid Build Coastguard Worker        return
676*6777b538SAndroid Build Coastguard Worker
677*6777b538SAndroid Build Coastguard Worker    #
678*6777b538SAndroid Build Coastguard Worker    # check we know how to handle the args and return values
679*6777b538SAndroid Build Coastguard Worker    # and store the information for the generation
680*6777b538SAndroid Build Coastguard Worker    #
681*6777b538SAndroid Build Coastguard Worker    try:
682*6777b538SAndroid Build Coastguard Worker        args = node.xpathEval("arg")
683*6777b538SAndroid Build Coastguard Worker    except:
684*6777b538SAndroid Build Coastguard Worker        args = []
685*6777b538SAndroid Build Coastguard Worker    t_args = []
686*6777b538SAndroid Build Coastguard Worker    n = 0
687*6777b538SAndroid Build Coastguard Worker    for arg in args:
688*6777b538SAndroid Build Coastguard Worker        n = n + 1
689*6777b538SAndroid Build Coastguard Worker        rtype = arg.xpathEval("string(@type)")
690*6777b538SAndroid Build Coastguard Worker        if rtype == 'void':
691*6777b538SAndroid Build Coastguard Worker            break;
692*6777b538SAndroid Build Coastguard Worker        info = arg.xpathEval("string(@info)")
693*6777b538SAndroid Build Coastguard Worker        nam = arg.xpathEval("string(@name)")
694*6777b538SAndroid Build Coastguard Worker        type = type_convert(rtype, nam, info, module, name, n)
695*6777b538SAndroid Build Coastguard Worker        if is_known_param_type(type) == 0:
696*6777b538SAndroid Build Coastguard Worker            add_missing_type(type, name);
697*6777b538SAndroid Build Coastguard Worker            no_gen = 1
698*6777b538SAndroid Build Coastguard Worker        t_args.append((nam, type, rtype, info))
699*6777b538SAndroid Build Coastguard Worker
700*6777b538SAndroid Build Coastguard Worker    try:
701*6777b538SAndroid Build Coastguard Worker        rets = node.xpathEval("return")
702*6777b538SAndroid Build Coastguard Worker    except:
703*6777b538SAndroid Build Coastguard Worker        rets = []
704*6777b538SAndroid Build Coastguard Worker    t_ret = None
705*6777b538SAndroid Build Coastguard Worker    for ret in rets:
706*6777b538SAndroid Build Coastguard Worker        rtype = ret.xpathEval("string(@type)")
707*6777b538SAndroid Build Coastguard Worker        info = ret.xpathEval("string(@info)")
708*6777b538SAndroid Build Coastguard Worker        type = type_convert(rtype, 'return', info, module, name, 0)
709*6777b538SAndroid Build Coastguard Worker        if rtype == 'void':
710*6777b538SAndroid Build Coastguard Worker            break
711*6777b538SAndroid Build Coastguard Worker        if is_known_return_type(type) == 0:
712*6777b538SAndroid Build Coastguard Worker            add_missing_type(type, name);
713*6777b538SAndroid Build Coastguard Worker            no_gen = 1
714*6777b538SAndroid Build Coastguard Worker        t_ret = (type, rtype, info)
715*6777b538SAndroid Build Coastguard Worker        break
716*6777b538SAndroid Build Coastguard Worker
717*6777b538SAndroid Build Coastguard Worker    if no_gen == 0:
718*6777b538SAndroid Build Coastguard Worker        for t_arg in t_args:
719*6777b538SAndroid Build Coastguard Worker            (nam, type, rtype, info) = t_arg
720*6777b538SAndroid Build Coastguard Worker            generate_param_type(type, rtype)
721*6777b538SAndroid Build Coastguard Worker
722*6777b538SAndroid Build Coastguard Worker    test.write("""
723*6777b538SAndroid Build Coastguard Workerstatic int
724*6777b538SAndroid Build Coastguard Workertest_%s(void) {
725*6777b538SAndroid Build Coastguard Worker    int test_ret = 0;
726*6777b538SAndroid Build Coastguard Worker
727*6777b538SAndroid Build Coastguard Worker""" % (name))
728*6777b538SAndroid Build Coastguard Worker
729*6777b538SAndroid Build Coastguard Worker    if no_gen == 1:
730*6777b538SAndroid Build Coastguard Worker        add_missing_functions(name, module)
731*6777b538SAndroid Build Coastguard Worker        test.write("""
732*6777b538SAndroid Build Coastguard Worker    /* missing type support */
733*6777b538SAndroid Build Coastguard Worker    return(test_ret);
734*6777b538SAndroid Build Coastguard Worker}
735*6777b538SAndroid Build Coastguard Worker
736*6777b538SAndroid Build Coastguard Worker""")
737*6777b538SAndroid Build Coastguard Worker        return
738*6777b538SAndroid Build Coastguard Worker
739*6777b538SAndroid Build Coastguard Worker    try:
740*6777b538SAndroid Build Coastguard Worker        conds = node.xpathEval("cond")
741*6777b538SAndroid Build Coastguard Worker        for cond in conds:
742*6777b538SAndroid Build Coastguard Worker            test.write("#if %s\n" % (cond.get_content()))
743*6777b538SAndroid Build Coastguard Worker            nb_cond = nb_cond + 1
744*6777b538SAndroid Build Coastguard Worker    except:
745*6777b538SAndroid Build Coastguard Worker        pass
746*6777b538SAndroid Build Coastguard Worker
747*6777b538SAndroid Build Coastguard Worker    define = 0
748*6777b538SAndroid Build Coastguard Worker    if name in function_defines:
749*6777b538SAndroid Build Coastguard Worker        test.write("#ifdef %s\n" % (function_defines[name]))
750*6777b538SAndroid Build Coastguard Worker        define = 1
751*6777b538SAndroid Build Coastguard Worker
752*6777b538SAndroid Build Coastguard Worker    # Declare the memory usage counter
753*6777b538SAndroid Build Coastguard Worker    no_mem = is_skipped_memcheck(name)
754*6777b538SAndroid Build Coastguard Worker    if no_mem == 0:
755*6777b538SAndroid Build Coastguard Worker        test.write("    int mem_base;\n");
756*6777b538SAndroid Build Coastguard Worker
757*6777b538SAndroid Build Coastguard Worker    # Declare the return value
758*6777b538SAndroid Build Coastguard Worker    if t_ret != None:
759*6777b538SAndroid Build Coastguard Worker        test.write("    %s ret_val;\n" % (t_ret[1]))
760*6777b538SAndroid Build Coastguard Worker
761*6777b538SAndroid Build Coastguard Worker    # Declare the arguments
762*6777b538SAndroid Build Coastguard Worker    for arg in t_args:
763*6777b538SAndroid Build Coastguard Worker        (nam, type, rtype, info) = arg;
764*6777b538SAndroid Build Coastguard Worker        # add declaration
765*6777b538SAndroid Build Coastguard Worker        test.write("    %s %s; /* %s */\n" % (rtype, nam, info))
766*6777b538SAndroid Build Coastguard Worker        test.write("    int n_%s;\n" % (nam))
767*6777b538SAndroid Build Coastguard Worker    test.write("\n")
768*6777b538SAndroid Build Coastguard Worker
769*6777b538SAndroid Build Coastguard Worker    # Cascade loop on of each argument list of values
770*6777b538SAndroid Build Coastguard Worker    for arg in t_args:
771*6777b538SAndroid Build Coastguard Worker        (nam, type, rtype, info) = arg;
772*6777b538SAndroid Build Coastguard Worker        #
773*6777b538SAndroid Build Coastguard Worker        test.write("    for (n_%s = 0;n_%s < gen_nb_%s;n_%s++) {\n" % (
774*6777b538SAndroid Build Coastguard Worker                   nam, nam, type, nam))
775*6777b538SAndroid Build Coastguard Worker
776*6777b538SAndroid Build Coastguard Worker    # log the memory usage
777*6777b538SAndroid Build Coastguard Worker    if no_mem == 0:
778*6777b538SAndroid Build Coastguard Worker        test.write("        mem_base = xmlMemBlocks();\n");
779*6777b538SAndroid Build Coastguard Worker
780*6777b538SAndroid Build Coastguard Worker    # prepare the call
781*6777b538SAndroid Build Coastguard Worker    i = 0;
782*6777b538SAndroid Build Coastguard Worker    for arg in t_args:
783*6777b538SAndroid Build Coastguard Worker        (nam, type, rtype, info) = arg;
784*6777b538SAndroid Build Coastguard Worker        #
785*6777b538SAndroid Build Coastguard Worker        test.write("        %s = gen_%s(n_%s, %d);\n" % (nam, type, nam, i))
786*6777b538SAndroid Build Coastguard Worker        i = i + 1;
787*6777b538SAndroid Build Coastguard Worker
788*6777b538SAndroid Build Coastguard Worker    # add checks to avoid out-of-bounds array access
789*6777b538SAndroid Build Coastguard Worker    i = 0;
790*6777b538SAndroid Build Coastguard Worker    for arg in t_args:
791*6777b538SAndroid Build Coastguard Worker        (nam, type, rtype, info) = arg;
792*6777b538SAndroid Build Coastguard Worker        # assume that "size", "len", and "start" parameters apply to either
793*6777b538SAndroid Build Coastguard Worker        # the nearest preceding or following char pointer
794*6777b538SAndroid Build Coastguard Worker        if type == "int" and (nam == "size" or nam == "len" or nam == "start"):
795*6777b538SAndroid Build Coastguard Worker            for j in (list(range(i - 1, -1, -1)) + list(range(i + 1, len(t_args)))):
796*6777b538SAndroid Build Coastguard Worker                (bnam, btype) = t_args[j][:2]
797*6777b538SAndroid Build Coastguard Worker                if btype == "const_char_ptr" or btype == "const_xmlChar_ptr":
798*6777b538SAndroid Build Coastguard Worker                    test.write(
799*6777b538SAndroid Build Coastguard Worker                        "        if ((%s != NULL) &&\n"
800*6777b538SAndroid Build Coastguard Worker                        "            (%s > xmlStrlen(BAD_CAST %s)))\n"
801*6777b538SAndroid Build Coastguard Worker                        "            %s = 0;\n"
802*6777b538SAndroid Build Coastguard Worker                        % (bnam, nam, bnam, nam))
803*6777b538SAndroid Build Coastguard Worker                    break
804*6777b538SAndroid Build Coastguard Worker        i = i + 1;
805*6777b538SAndroid Build Coastguard Worker
806*6777b538SAndroid Build Coastguard Worker    # do the call, and clanup the result
807*6777b538SAndroid Build Coastguard Worker    if name in extra_pre_call:
808*6777b538SAndroid Build Coastguard Worker        test.write("        %s\n"% (extra_pre_call[name]))
809*6777b538SAndroid Build Coastguard Worker    if t_ret != None:
810*6777b538SAndroid Build Coastguard Worker        test.write("\n        ret_val = %s(" % (name))
811*6777b538SAndroid Build Coastguard Worker        need = 0
812*6777b538SAndroid Build Coastguard Worker        for arg in t_args:
813*6777b538SAndroid Build Coastguard Worker            (nam, type, rtype, info) = arg
814*6777b538SAndroid Build Coastguard Worker            if need:
815*6777b538SAndroid Build Coastguard Worker                test.write(", ")
816*6777b538SAndroid Build Coastguard Worker            else:
817*6777b538SAndroid Build Coastguard Worker                need = 1
818*6777b538SAndroid Build Coastguard Worker            test.write("%s" % nam);
819*6777b538SAndroid Build Coastguard Worker        test.write(");\n")
820*6777b538SAndroid Build Coastguard Worker        if name in extra_post_call:
821*6777b538SAndroid Build Coastguard Worker            test.write("        %s\n"% (extra_post_call[name]))
822*6777b538SAndroid Build Coastguard Worker        test.write("        desret_%s(ret_val);\n" % t_ret[0])
823*6777b538SAndroid Build Coastguard Worker    else:
824*6777b538SAndroid Build Coastguard Worker        test.write("\n        %s(" % (name));
825*6777b538SAndroid Build Coastguard Worker        need = 0;
826*6777b538SAndroid Build Coastguard Worker        for arg in t_args:
827*6777b538SAndroid Build Coastguard Worker            (nam, type, rtype, info) = arg;
828*6777b538SAndroid Build Coastguard Worker            if need:
829*6777b538SAndroid Build Coastguard Worker                test.write(", ")
830*6777b538SAndroid Build Coastguard Worker            else:
831*6777b538SAndroid Build Coastguard Worker                need = 1
832*6777b538SAndroid Build Coastguard Worker            test.write("%s" % nam)
833*6777b538SAndroid Build Coastguard Worker        test.write(");\n")
834*6777b538SAndroid Build Coastguard Worker        if name in extra_post_call:
835*6777b538SAndroid Build Coastguard Worker            test.write("        %s\n"% (extra_post_call[name]))
836*6777b538SAndroid Build Coastguard Worker
837*6777b538SAndroid Build Coastguard Worker    test.write("        call_tests++;\n");
838*6777b538SAndroid Build Coastguard Worker
839*6777b538SAndroid Build Coastguard Worker    # Free the arguments
840*6777b538SAndroid Build Coastguard Worker    i = 0;
841*6777b538SAndroid Build Coastguard Worker    for arg in t_args:
842*6777b538SAndroid Build Coastguard Worker        (nam, type, rtype, info) = arg;
843*6777b538SAndroid Build Coastguard Worker        # This is a hack to prevent generating a destructor for the
844*6777b538SAndroid Build Coastguard Worker        # 'input' argument in xmlTextReaderSetup.  There should be
845*6777b538SAndroid Build Coastguard Worker        # a better, more generic way to do this!
846*6777b538SAndroid Build Coastguard Worker        if info.find('destroy') == -1:
847*6777b538SAndroid Build Coastguard Worker            test.write("        des_%s(n_%s, " % (type, nam))
848*6777b538SAndroid Build Coastguard Worker            test.write("%s, %d);\n" % (nam, i))
849*6777b538SAndroid Build Coastguard Worker        i = i + 1;
850*6777b538SAndroid Build Coastguard Worker
851*6777b538SAndroid Build Coastguard Worker    test.write("        xmlResetLastError();\n");
852*6777b538SAndroid Build Coastguard Worker    # Check the memory usage
853*6777b538SAndroid Build Coastguard Worker    if no_mem == 0:
854*6777b538SAndroid Build Coastguard Worker        test.write("""        if (mem_base != xmlMemBlocks()) {
855*6777b538SAndroid Build Coastguard Worker            printf("Leak of %%d blocks found in %s",
856*6777b538SAndroid Build Coastguard Worker\t           xmlMemBlocks() - mem_base);
857*6777b538SAndroid Build Coastguard Worker\t    test_ret++;
858*6777b538SAndroid Build Coastguard Worker""" % (name));
859*6777b538SAndroid Build Coastguard Worker        for arg in t_args:
860*6777b538SAndroid Build Coastguard Worker            (nam, type, rtype, info) = arg;
861*6777b538SAndroid Build Coastguard Worker            test.write("""            printf(" %%d", n_%s);\n""" % (nam))
862*6777b538SAndroid Build Coastguard Worker        test.write("""            printf("\\n");\n""")
863*6777b538SAndroid Build Coastguard Worker        test.write("        }\n")
864*6777b538SAndroid Build Coastguard Worker
865*6777b538SAndroid Build Coastguard Worker    for arg in t_args:
866*6777b538SAndroid Build Coastguard Worker        test.write("    }\n")
867*6777b538SAndroid Build Coastguard Worker
868*6777b538SAndroid Build Coastguard Worker    test.write("    function_tests++;\n")
869*6777b538SAndroid Build Coastguard Worker    #
870*6777b538SAndroid Build Coastguard Worker    # end of conditional
871*6777b538SAndroid Build Coastguard Worker    #
872*6777b538SAndroid Build Coastguard Worker    while nb_cond > 0:
873*6777b538SAndroid Build Coastguard Worker        test.write("#endif\n")
874*6777b538SAndroid Build Coastguard Worker        nb_cond = nb_cond -1
875*6777b538SAndroid Build Coastguard Worker    if define == 1:
876*6777b538SAndroid Build Coastguard Worker        test.write("#endif\n")
877*6777b538SAndroid Build Coastguard Worker
878*6777b538SAndroid Build Coastguard Worker    nb_tests = nb_tests + 1;
879*6777b538SAndroid Build Coastguard Worker
880*6777b538SAndroid Build Coastguard Worker    test.write("""
881*6777b538SAndroid Build Coastguard Worker    return(test_ret);
882*6777b538SAndroid Build Coastguard Worker}
883*6777b538SAndroid Build Coastguard Worker
884*6777b538SAndroid Build Coastguard Worker""")
885*6777b538SAndroid Build Coastguard Worker
886*6777b538SAndroid Build Coastguard Worker#
887*6777b538SAndroid Build Coastguard Worker# Generate all module callers
888*6777b538SAndroid Build Coastguard Worker#
889*6777b538SAndroid Build Coastguard Workerfor module in modules:
890*6777b538SAndroid Build Coastguard Worker    # gather all the functions exported by that module
891*6777b538SAndroid Build Coastguard Worker    try:
892*6777b538SAndroid Build Coastguard Worker        functions = ctxt.xpathEval("/api/symbols/function[@file='%s']" % (module))
893*6777b538SAndroid Build Coastguard Worker    except:
894*6777b538SAndroid Build Coastguard Worker        print("Failed to gather functions from module %s" % (module))
895*6777b538SAndroid Build Coastguard Worker        continue;
896*6777b538SAndroid Build Coastguard Worker
897*6777b538SAndroid Build Coastguard Worker    # iterate over all functions in the module generating the test
898*6777b538SAndroid Build Coastguard Worker    i = 0
899*6777b538SAndroid Build Coastguard Worker    nb_tests_old = nb_tests
900*6777b538SAndroid Build Coastguard Worker    for function in functions:
901*6777b538SAndroid Build Coastguard Worker        i = i + 1
902*6777b538SAndroid Build Coastguard Worker        generate_test(module, function);
903*6777b538SAndroid Build Coastguard Worker
904*6777b538SAndroid Build Coastguard Worker    # header
905*6777b538SAndroid Build Coastguard Worker    test.write("""static int
906*6777b538SAndroid Build Coastguard Workertest_%s(void) {
907*6777b538SAndroid Build Coastguard Worker    int test_ret = 0;
908*6777b538SAndroid Build Coastguard Worker
909*6777b538SAndroid Build Coastguard Worker    if (quiet == 0) printf("Testing %s : %d of %d functions ...\\n");
910*6777b538SAndroid Build Coastguard Worker""" % (module, module, nb_tests - nb_tests_old, i))
911*6777b538SAndroid Build Coastguard Worker
912*6777b538SAndroid Build Coastguard Worker    # iterate over all functions in the module generating the call
913*6777b538SAndroid Build Coastguard Worker    for function in functions:
914*6777b538SAndroid Build Coastguard Worker        name = function.xpathEval('string(@name)')
915*6777b538SAndroid Build Coastguard Worker        if is_skipped_function(name):
916*6777b538SAndroid Build Coastguard Worker            continue
917*6777b538SAndroid Build Coastguard Worker        test.write("    test_ret += test_%s();\n" % (name))
918*6777b538SAndroid Build Coastguard Worker
919*6777b538SAndroid Build Coastguard Worker    # footer
920*6777b538SAndroid Build Coastguard Worker    test.write("""
921*6777b538SAndroid Build Coastguard Worker    if (test_ret != 0)
922*6777b538SAndroid Build Coastguard Worker\tprintf("Module %s: %%d errors\\n", test_ret);
923*6777b538SAndroid Build Coastguard Worker    return(test_ret);
924*6777b538SAndroid Build Coastguard Worker}
925*6777b538SAndroid Build Coastguard Worker""" % (module))
926*6777b538SAndroid Build Coastguard Worker
927*6777b538SAndroid Build Coastguard Worker#
928*6777b538SAndroid Build Coastguard Worker# Generate direct module caller
929*6777b538SAndroid Build Coastguard Worker#
930*6777b538SAndroid Build Coastguard Workertest.write("""static int
931*6777b538SAndroid Build Coastguard Workertest_module(const char *module) {
932*6777b538SAndroid Build Coastguard Worker""");
933*6777b538SAndroid Build Coastguard Workerfor module in modules:
934*6777b538SAndroid Build Coastguard Worker    test.write("""    if (!strcmp(module, "%s")) return(test_%s());\n""" % (
935*6777b538SAndroid Build Coastguard Worker        module, module))
936*6777b538SAndroid Build Coastguard Workertest.write("""    return(0);
937*6777b538SAndroid Build Coastguard Worker}
938*6777b538SAndroid Build Coastguard Worker""");
939*6777b538SAndroid Build Coastguard Worker
940*6777b538SAndroid Build Coastguard Workerprint("Generated test for %d modules and %d functions" %(len(modules), nb_tests))
941*6777b538SAndroid Build Coastguard Worker
942*6777b538SAndroid Build Coastguard Workercompare_and_save()
943*6777b538SAndroid Build Coastguard Worker
944*6777b538SAndroid Build Coastguard Workermissing_list = []
945*6777b538SAndroid Build Coastguard Workerfor missing in missing_types.keys():
946*6777b538SAndroid Build Coastguard Worker    if missing == 'va_list' or missing == '...':
947*6777b538SAndroid Build Coastguard Worker        continue;
948*6777b538SAndroid Build Coastguard Worker
949*6777b538SAndroid Build Coastguard Worker    n = len(missing_types[missing])
950*6777b538SAndroid Build Coastguard Worker    missing_list.append((n, missing))
951*6777b538SAndroid Build Coastguard Worker
952*6777b538SAndroid Build Coastguard Workermissing_list.sort(key=lambda a: a[0])
953*6777b538SAndroid Build Coastguard Workerprint("Missing support for %d functions and %d types see missing.lst" % (missing_functions_nr, len(missing_list)))
954*6777b538SAndroid Build Coastguard Workerlst = open("missing.lst", "w")
955*6777b538SAndroid Build Coastguard Workerlst.write("Missing support for %d types" % (len(missing_list)))
956*6777b538SAndroid Build Coastguard Workerlst.write("\n")
957*6777b538SAndroid Build Coastguard Workerfor miss in missing_list:
958*6777b538SAndroid Build Coastguard Worker    lst.write("%s: %d :" % (miss[1], miss[0]))
959*6777b538SAndroid Build Coastguard Worker    i = 0
960*6777b538SAndroid Build Coastguard Worker    for n in missing_types[miss[1]]:
961*6777b538SAndroid Build Coastguard Worker        i = i + 1
962*6777b538SAndroid Build Coastguard Worker        if i > 5:
963*6777b538SAndroid Build Coastguard Worker            lst.write(" ...")
964*6777b538SAndroid Build Coastguard Worker            break
965*6777b538SAndroid Build Coastguard Worker        lst.write(" %s" % (n))
966*6777b538SAndroid Build Coastguard Worker    lst.write("\n")
967*6777b538SAndroid Build Coastguard Workerlst.write("\n")
968*6777b538SAndroid Build Coastguard Workerlst.write("\n")
969*6777b538SAndroid Build Coastguard Workerlst.write("Missing support per module");
970*6777b538SAndroid Build Coastguard Workerfor module in missing_functions.keys():
971*6777b538SAndroid Build Coastguard Worker    lst.write("module %s:\n   %s\n" % (module, missing_functions[module]))
972*6777b538SAndroid Build Coastguard Worker
973*6777b538SAndroid Build Coastguard Workerlst.close()
974*6777b538SAndroid Build Coastguard Worker
975*6777b538SAndroid Build Coastguard Worker
976