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