Blame gentest.py

Packit Service a31ea6
#!/usr/bin/python -u
Packit Service a31ea6
#
Packit Service a31ea6
# generate a tester program for the API
Packit Service a31ea6
#
Packit Service a31ea6
import sys
Packit Service a31ea6
import os
Packit Service a31ea6
import string
Packit Service a31ea6
try:
Packit Service a31ea6
    import libxml2
Packit Service a31ea6
except:
Packit Service a31ea6
    print "libxml2 python bindings not available, skipping testapi.c generation"
Packit Service a31ea6
    sys.exit(0)
Packit Service a31ea6
Packit Service a31ea6
if len(sys.argv) > 1:
Packit Service a31ea6
    srcPref = sys.argv[1] + '/'
Packit Service a31ea6
else:
Packit Service a31ea6
    srcPref = ''
Packit Service a31ea6
Packit Service a31ea6
#
Packit Service a31ea6
# Modules we want to skip in API test
Packit Service a31ea6
#
Packit Service a31ea6
skipped_modules = [ "SAX", "xlink", "threads", "globals",
Packit Service a31ea6
  "xmlmemory", "xmlversion", "xmlexports",
Packit Service a31ea6
  #deprecated
Packit Service a31ea6
  "DOCBparser",
Packit Service a31ea6
]
Packit Service a31ea6
Packit Service a31ea6
#
Packit Service a31ea6
# defines for each module
Packit Service a31ea6
#
Packit Service a31ea6
modules_defines = {
Packit Service a31ea6
    "HTMLparser": "LIBXML_HTML_ENABLED",
Packit Service a31ea6
    "catalog": "LIBXML_CATALOG_ENABLED",
Packit Service a31ea6
    "xmlreader": "LIBXML_READER_ENABLED",
Packit Service a31ea6
    "relaxng": "LIBXML_SCHEMAS_ENABLED",
Packit Service a31ea6
    "schemasInternals": "LIBXML_SCHEMAS_ENABLED",
Packit Service a31ea6
    "xmlschemas": "LIBXML_SCHEMAS_ENABLED",
Packit Service a31ea6
    "xmlschemastypes": "LIBXML_SCHEMAS_ENABLED",
Packit Service a31ea6
    "xpath": "LIBXML_XPATH_ENABLED",
Packit Service a31ea6
    "xpathInternals": "LIBXML_XPATH_ENABLED",
Packit Service a31ea6
    "xinclude": "LIBXML_XINCLUDE_ENABLED",
Packit Service a31ea6
    "xpointer": "LIBXML_XPTR_ENABLED",
Packit Service a31ea6
    "xmlregexp" : "LIBXML_REGEXP_ENABLED",
Packit Service a31ea6
    "xmlautomata" : "LIBXML_AUTOMATA_ENABLED",
Packit Service a31ea6
    "xmlsave" : "LIBXML_OUTPUT_ENABLED",
Packit Service a31ea6
    "DOCBparser" : "LIBXML_DOCB_ENABLED",
Packit Service a31ea6
    "xmlmodule" : "LIBXML_MODULES_ENABLED",
Packit Service a31ea6
    "pattern" : "LIBXML_PATTERN_ENABLED",
Packit Service a31ea6
    "schematron" : "LIBXML_SCHEMATRON_ENABLED",
Packit Service a31ea6
}
Packit Service a31ea6
Packit Service a31ea6
#
Packit Service a31ea6
# defines for specific functions
Packit Service a31ea6
#
Packit Service a31ea6
function_defines = {
Packit Service a31ea6
    "htmlDefaultSAXHandlerInit": "LIBXML_HTML_ENABLED",
Packit Service a31ea6
    "xmlSAX2EndElement" : "LIBXML_SAX1_ENABLED",
Packit Service a31ea6
    "xmlSAX2StartElement" : "LIBXML_SAX1_ENABLED",
Packit Service a31ea6
    "xmlSAXDefaultVersion" : "LIBXML_SAX1_ENABLED",
Packit Service a31ea6
    "UTF8Toisolat1" : "LIBXML_OUTPUT_ENABLED",
Packit Service a31ea6
    "xmlCleanupPredefinedEntities": "LIBXML_LEGACY_ENABLED",
Packit Service a31ea6
    "xmlInitializePredefinedEntities": "LIBXML_LEGACY_ENABLED",
Packit Service a31ea6
    "xmlSetFeature": "LIBXML_LEGACY_ENABLED",
Packit Service a31ea6
    "xmlGetFeature": "LIBXML_LEGACY_ENABLED",
Packit Service a31ea6
    "xmlGetFeaturesList": "LIBXML_LEGACY_ENABLED",
Packit Service a31ea6
    "xmlIOParseDTD": "LIBXML_VALID_ENABLED",
Packit Service a31ea6
    "xmlParseDTD": "LIBXML_VALID_ENABLED",
Packit Service a31ea6
    "xmlParseDoc": "LIBXML_SAX1_ENABLED",
Packit Service a31ea6
    "xmlParseMemory": "LIBXML_SAX1_ENABLED",
Packit Service a31ea6
    "xmlRecoverDoc": "LIBXML_SAX1_ENABLED",
Packit Service a31ea6
    "xmlParseFile": "LIBXML_SAX1_ENABLED",
Packit Service a31ea6
    "xmlRecoverFile": "LIBXML_SAX1_ENABLED",
Packit Service a31ea6
    "xmlRecoverMemory": "LIBXML_SAX1_ENABLED",
Packit Service a31ea6
    "xmlSAXParseFileWithData": "LIBXML_SAX1_ENABLED",
Packit Service a31ea6
    "xmlSAXParseMemory": "LIBXML_SAX1_ENABLED",
Packit Service a31ea6
    "xmlSAXUserParseMemory": "LIBXML_SAX1_ENABLED",
Packit Service a31ea6
    "xmlSAXParseDoc": "LIBXML_SAX1_ENABLED",
Packit Service a31ea6
    "xmlSAXParseDTD": "LIBXML_SAX1_ENABLED",
Packit Service a31ea6
    "xmlSAXUserParseFile": "LIBXML_SAX1_ENABLED",
Packit Service a31ea6
    "xmlParseEntity": "LIBXML_SAX1_ENABLED",
Packit Service a31ea6
    "xmlParseExternalEntity": "LIBXML_SAX1_ENABLED",
Packit Service a31ea6
    "xmlSAXParseMemoryWithData": "LIBXML_SAX1_ENABLED",
Packit Service a31ea6
    "xmlParseBalancedChunkMemory": "LIBXML_SAX1_ENABLED",
Packit Service a31ea6
    "xmlParseBalancedChunkMemoryRecover": "LIBXML_SAX1_ENABLED",
Packit Service a31ea6
    "xmlSetupParserForBuffer": "LIBXML_SAX1_ENABLED",
Packit Service a31ea6
    "xmlStopParser": "LIBXML_PUSH_ENABLED",
Packit Service a31ea6
    "xmlAttrSerializeTxtContent": "LIBXML_OUTPUT_ENABLED",
Packit Service a31ea6
    "xmlSAXParseFile": "LIBXML_SAX1_ENABLED",
Packit Service a31ea6
    "xmlSAXParseEntity": "LIBXML_SAX1_ENABLED",
Packit Service a31ea6
    "xmlNewTextChild": "LIBXML_TREE_ENABLED",
Packit Service a31ea6
    "xmlNewDocRawNode": "LIBXML_TREE_ENABLED",
Packit Service a31ea6
    "xmlNewProp": "LIBXML_TREE_ENABLED",
Packit Service a31ea6
    "xmlReconciliateNs": "LIBXML_TREE_ENABLED",
Packit Service a31ea6
    "xmlValidateNCName": "LIBXML_TREE_ENABLED",
Packit Service a31ea6
    "xmlValidateNMToken": "LIBXML_TREE_ENABLED",
Packit Service a31ea6
    "xmlValidateName": "LIBXML_TREE_ENABLED",
Packit Service a31ea6
    "xmlNewChild": "LIBXML_TREE_ENABLED",
Packit Service a31ea6
    "xmlValidateQName": "LIBXML_TREE_ENABLED",
Packit Service a31ea6
    "xmlSprintfElementContent": "LIBXML_OUTPUT_ENABLED",
Packit Service a31ea6
    "xmlValidGetPotentialChildren" : "LIBXML_VALID_ENABLED",
Packit Service a31ea6
    "xmlValidGetValidElements" : "LIBXML_VALID_ENABLED",
Packit Service a31ea6
    "docbDefaultSAXHandlerInit" : "LIBXML_DOCB_ENABLED",
Packit Service a31ea6
    "xmlTextReaderPreservePattern" : "LIBXML_PATTERN_ENABLED",
Packit Service a31ea6
}
Packit Service a31ea6
Packit Service a31ea6
#
Packit Service a31ea6
# Some functions really need to be skipped for the tests.
Packit Service a31ea6
#
Packit Service a31ea6
skipped_functions = [
Packit Service a31ea6
# block on I/O
Packit Service a31ea6
"xmlFdRead", "xmlReadFd", "xmlCtxtReadFd",
Packit Service a31ea6
"htmlFdRead", "htmlReadFd", "htmlCtxtReadFd",
Packit Service a31ea6
"xmlReaderNewFd", "xmlReaderForFd",
Packit Service a31ea6
"xmlIORead", "xmlReadIO", "xmlCtxtReadIO",
Packit Service a31ea6
"htmlIORead", "htmlReadIO", "htmlCtxtReadIO",
Packit Service a31ea6
"xmlReaderNewIO", "xmlBufferDump", "xmlNanoFTPConnect",
Packit Service a31ea6
"xmlNanoFTPConnectTo", "xmlNanoHTTPMethod", "xmlNanoHTTPMethodRedir",
Packit Service a31ea6
# Complex I/O APIs
Packit Service a31ea6
"xmlCreateIOParserCtxt", "xmlParserInputBufferCreateIO",
Packit Service a31ea6
"xmlRegisterInputCallbacks", "xmlReaderForIO",
Packit Service a31ea6
"xmlOutputBufferCreateIO", "xmlRegisterOutputCallbacks",
Packit Service a31ea6
"xmlSaveToIO", "xmlIOHTTPOpenW",
Packit Service a31ea6
# library state cleanup, generate false leak informations and other
Packit Service a31ea6
# troubles, heavillyb tested otherwise.
Packit Service a31ea6
"xmlCleanupParser", "xmlRelaxNGCleanupTypes", "xmlSetListDoc",
Packit Service a31ea6
"xmlSetTreeDoc", "xmlUnlinkNode",
Packit Service a31ea6
# hard to avoid leaks in the tests
Packit Service a31ea6
"xmlStrcat", "xmlStrncat", "xmlCatalogAddLocal", "xmlNewTextWriterDoc",
Packit Service a31ea6
"xmlXPathNewValueTree", "xmlXPathWrapString",
Packit Service a31ea6
# unimplemented
Packit Service a31ea6
"xmlTextReaderReadInnerXml", "xmlTextReaderReadOuterXml",
Packit Service a31ea6
"xmlTextReaderReadString",
Packit Service a31ea6
# destructor
Packit Service a31ea6
"xmlListDelete", "xmlOutputBufferClose", "xmlNanoFTPClose", "xmlNanoHTTPClose",
Packit Service a31ea6
# deprecated
Packit Service a31ea6
"xmlCatalogGetPublic", "xmlCatalogGetSystem", "xmlEncodeEntities",
Packit Service a31ea6
"xmlNewGlobalNs", "xmlHandleEntity", "xmlNamespaceParseNCName",
Packit Service a31ea6
"xmlNamespaceParseNSDef", "xmlNamespaceParseQName",
Packit Service a31ea6
"xmlParseNamespace", "xmlParseQuotedString", "xmlParserHandleReference",
Packit Service a31ea6
"xmlScanName",
Packit Service a31ea6
"xmlDecodeEntities", 
Packit Service a31ea6
# allocators
Packit Service a31ea6
"xmlMemFree",
Packit Service a31ea6
# verbosity
Packit Service a31ea6
"xmlCatalogSetDebug", "xmlShellPrintXPathError", "xmlShellPrintNode",
Packit Service a31ea6
# Internal functions, no user space should really call them
Packit Service a31ea6
"xmlParseAttribute", "xmlParseAttributeListDecl", "xmlParseName",
Packit Service a31ea6
"xmlParseNmtoken", "xmlParseEntityValue", "xmlParseAttValue",
Packit Service a31ea6
"xmlParseSystemLiteral", "xmlParsePubidLiteral", "xmlParseCharData",
Packit Service a31ea6
"xmlParseExternalID", "xmlParseComment", "xmlParsePITarget", "xmlParsePI",
Packit Service a31ea6
"xmlParseNotationDecl", "xmlParseEntityDecl", "xmlParseDefaultDecl",
Packit Service a31ea6
"xmlParseNotationType", "xmlParseEnumerationType", "xmlParseEnumeratedType",
Packit Service a31ea6
"xmlParseAttributeType", "xmlParseAttributeListDecl",
Packit Service a31ea6
"xmlParseElementMixedContentDecl", "xmlParseElementChildrenContentDecl",
Packit Service a31ea6
"xmlParseElementContentDecl", "xmlParseElementDecl", "xmlParseMarkupDecl",
Packit Service a31ea6
"xmlParseCharRef", "xmlParseEntityRef", "xmlParseReference",
Packit Service a31ea6
"xmlParsePEReference", "xmlParseDocTypeDecl", "xmlParseAttribute",
Packit Service a31ea6
"xmlParseStartTag", "xmlParseEndTag", "xmlParseCDSect", "xmlParseContent",
Packit Service a31ea6
"xmlParseElement", "xmlParseVersionNum", "xmlParseVersionInfo",
Packit Service a31ea6
"xmlParseEncName", "xmlParseEncodingDecl", "xmlParseSDDecl",
Packit Service a31ea6
"xmlParseXMLDecl", "xmlParseTextDecl", "xmlParseMisc",
Packit Service a31ea6
"xmlParseExternalSubset", "xmlParserHandlePEReference",
Packit Service a31ea6
"xmlSkipBlankChars",
Packit Service a31ea6
]
Packit Service a31ea6
Packit Service a31ea6
#
Packit Service a31ea6
# These functions have side effects on the global state
Packit Service a31ea6
# and hence generate errors on memory allocation tests
Packit Service a31ea6
#
Packit Service a31ea6
skipped_memcheck = [ "xmlLoadCatalog", "xmlAddEncodingAlias",
Packit Service a31ea6
   "xmlSchemaInitTypes", "xmlNanoFTPProxy", "xmlNanoFTPScanProxy",
Packit Service a31ea6
   "xmlNanoHTTPScanProxy", "xmlResetLastError", "xmlCatalogConvert",
Packit Service a31ea6
   "xmlCatalogRemove", "xmlLoadCatalogs", "xmlCleanupCharEncodingHandlers",
Packit Service a31ea6
   "xmlInitCharEncodingHandlers", "xmlCatalogCleanup",
Packit Service a31ea6
   "xmlSchemaGetBuiltInType",
Packit Service a31ea6
   "htmlParseFile", "htmlCtxtReadFile", # loads the catalogs
Packit Service a31ea6
   "xmlTextReaderSchemaValidate", "xmlSchemaCleanupTypes", # initialize the schemas type system
Packit Service a31ea6
   "xmlCatalogResolve", "xmlIOParseDTD" # loads the catalogs
Packit Service a31ea6
]
Packit Service a31ea6
Packit Service a31ea6
#
Packit Service a31ea6
# Extra code needed for some test cases
Packit Service a31ea6
#
Packit Service a31ea6
extra_pre_call = {
Packit Service a31ea6
   "xmlSAXUserParseFile": """
Packit Service a31ea6
#ifdef LIBXML_SAX1_ENABLED
Packit Service a31ea6
        if (sax == (xmlSAXHandlerPtr)&xmlDefaultSAXHandler) user_data = NULL;
Packit Service a31ea6
#endif
Packit Service a31ea6
""",
Packit Service a31ea6
   "xmlSAXUserParseMemory": """
Packit Service a31ea6
#ifdef LIBXML_SAX1_ENABLED
Packit Service a31ea6
        if (sax == (xmlSAXHandlerPtr)&xmlDefaultSAXHandler) user_data = NULL;
Packit Service a31ea6
#endif
Packit Service a31ea6
""",
Packit Service a31ea6
   "xmlParseBalancedChunkMemory": """
Packit Service a31ea6
#ifdef LIBXML_SAX1_ENABLED
Packit Service a31ea6
        if (sax == (xmlSAXHandlerPtr)&xmlDefaultSAXHandler) user_data = NULL;
Packit Service a31ea6
#endif
Packit Service a31ea6
""",
Packit Service a31ea6
   "xmlParseBalancedChunkMemoryRecover": """
Packit Service a31ea6
#ifdef LIBXML_SAX1_ENABLED
Packit Service a31ea6
        if (sax == (xmlSAXHandlerPtr)&xmlDefaultSAXHandler) user_data = NULL;
Packit Service a31ea6
#endif
Packit Service a31ea6
""",
Packit Service a31ea6
   "xmlParserInputBufferCreateFd":
Packit Service a31ea6
       "if (fd >= 0) fd = -1;",
Packit Service a31ea6
}
Packit Service a31ea6
extra_post_call = {
Packit Service a31ea6
   "xmlAddChild": 
Packit Service a31ea6
       "if (ret_val == NULL) { xmlFreeNode(cur) ; cur = NULL ; }",
Packit Service a31ea6
   "xmlAddEntity":
Packit Service a31ea6
       "if (ret_val != NULL) { xmlFreeNode(ret_val) ; ret_val = NULL; }",
Packit Service a31ea6
   "xmlAddChildList": 
Packit Service a31ea6
       "if (ret_val == NULL) { xmlFreeNodeList(cur) ; cur = NULL ; }",
Packit Service a31ea6
   "xmlAddSibling":
Packit Service a31ea6
       "if (ret_val == NULL) { xmlFreeNode(elem) ; elem = NULL ; }",
Packit Service a31ea6
   "xmlAddNextSibling":
Packit Service a31ea6
       "if (ret_val == NULL) { xmlFreeNode(elem) ; elem = NULL ; }",
Packit Service a31ea6
   "xmlAddPrevSibling": 
Packit Service a31ea6
       "if (ret_val == NULL) { xmlFreeNode(elem) ; elem = NULL ; }",
Packit Service a31ea6
   "xmlDocSetRootElement": 
Packit Service a31ea6
       "if (doc == NULL) { xmlFreeNode(root) ; root = NULL ; }",
Packit Service a31ea6
   "xmlReplaceNode": 
Packit Service a31ea6
       """if (cur != NULL) {
Packit Service a31ea6
              xmlUnlinkNode(cur);
Packit Service a31ea6
              xmlFreeNode(cur) ; cur = NULL ; }
Packit Service a31ea6
          if (old != NULL) {
Packit Service a31ea6
              xmlUnlinkNode(old);
Packit Service a31ea6
              xmlFreeNode(old) ; old = NULL ; }
Packit Service a31ea6
	  ret_val = NULL;""",
Packit Service a31ea6
   "xmlTextMerge": 
Packit Service a31ea6
       """if ((first != NULL) && (first->type != XML_TEXT_NODE)) {
Packit Service a31ea6
              xmlUnlinkNode(second);
Packit Service a31ea6
              xmlFreeNode(second) ; second = NULL ; }""",
Packit Service a31ea6
   "xmlBuildQName": 
Packit Service a31ea6
       """if ((ret_val != NULL) && (ret_val != ncname) &&
Packit Service a31ea6
              (ret_val != prefix) && (ret_val != memory))
Packit Service a31ea6
              xmlFree(ret_val);
Packit Service a31ea6
	  ret_val = NULL;""",
Packit Service a31ea6
   "xmlNewDocElementContent":
Packit Service a31ea6
       """xmlFreeDocElementContent(doc, ret_val); ret_val = NULL;""",
Packit Service a31ea6
   "xmlDictReference": "xmlDictFree(dict);",
Packit Service a31ea6
   # Functions which deallocates one of their parameters
Packit Service a31ea6
   "xmlXPathConvertBoolean": """val = NULL;""",
Packit Service a31ea6
   "xmlXPathConvertNumber": """val = NULL;""",
Packit Service a31ea6
   "xmlXPathConvertString": """val = NULL;""",
Packit Service a31ea6
   "xmlSaveFileTo": """buf = NULL;""",
Packit Service a31ea6
   "xmlSaveFormatFileTo": """buf = NULL;""",
Packit Service a31ea6
   "xmlIOParseDTD": "input = NULL;",
Packit Service a31ea6
   "xmlRemoveProp": "cur = NULL;",
Packit Service a31ea6
   "xmlNewNs": "if ((node == NULL) && (ret_val != NULL)) xmlFreeNs(ret_val);",
Packit Service a31ea6
   "xmlCopyNamespace": "if (ret_val != NULL) xmlFreeNs(ret_val);",
Packit Service a31ea6
   "xmlCopyNamespaceList": "if (ret_val != NULL) xmlFreeNsList(ret_val);",
Packit Service a31ea6
   "xmlNewTextWriter": "if (ret_val != NULL) out = NULL;",
Packit Service a31ea6
   "xmlNewTextWriterPushParser": "if (ctxt != NULL) {xmlFreeDoc(ctxt->myDoc); ctxt->myDoc = NULL;} if (ret_val != NULL) ctxt = NULL;",
Packit Service a31ea6
   "xmlNewIOInputStream": "if (ret_val != NULL) input = NULL;",
Packit Service a31ea6
   "htmlParseChunk": "if (ctxt != NULL) {xmlFreeDoc(ctxt->myDoc); ctxt->myDoc = NULL;}",
Packit Service a31ea6
   "htmlParseDocument": "if (ctxt != NULL) {xmlFreeDoc(ctxt->myDoc); ctxt->myDoc = NULL;}",
Packit Service a31ea6
   "xmlParseDocument": "if (ctxt != NULL) {xmlFreeDoc(ctxt->myDoc); ctxt->myDoc = NULL;}",
Packit Service a31ea6
   "xmlParseChunk": "if (ctxt != NULL) {xmlFreeDoc(ctxt->myDoc); ctxt->myDoc = NULL;}",
Packit Service a31ea6
   "xmlParseExtParsedEnt": "if (ctxt != NULL) {xmlFreeDoc(ctxt->myDoc); ctxt->myDoc = NULL;}",
Packit Service a31ea6
   "xmlDOMWrapAdoptNode": "if ((node != NULL) && (node->parent == NULL)) {xmlUnlinkNode(node);xmlFreeNode(node);node = NULL;}",
Packit Service a31ea6
   "xmlBufferSetAllocationScheme": "if ((buf != NULL) && (scheme == XML_BUFFER_ALLOC_IMMUTABLE) && (buf->content != NULL) && (buf->content != static_buf_content)) { xmlFree(buf->content); buf->content = NULL;}"
Packit Service a31ea6
}
Packit Service a31ea6
Packit Service a31ea6
modules = []
Packit Service a31ea6
Packit Service a31ea6
def is_skipped_module(name):
Packit Service a31ea6
    for mod in skipped_modules:
Packit Service a31ea6
        if mod == name:
Packit Service a31ea6
	    return 1
Packit Service a31ea6
    return 0
Packit Service a31ea6
Packit Service a31ea6
def is_skipped_function(name):
Packit Service a31ea6
    for fun in skipped_functions:
Packit Service a31ea6
        if fun == name:
Packit Service a31ea6
	    return 1
Packit Service a31ea6
    # Do not test destructors
Packit Service a31ea6
    if string.find(name, 'Free') != -1:
Packit Service a31ea6
        return 1
Packit Service a31ea6
    return 0
Packit Service a31ea6
Packit Service a31ea6
def is_skipped_memcheck(name):
Packit Service a31ea6
    for fun in skipped_memcheck:
Packit Service a31ea6
        if fun == name:
Packit Service a31ea6
	    return 1
Packit Service a31ea6
    return 0
Packit Service a31ea6
Packit Service a31ea6
missing_types = {}
Packit Service a31ea6
def add_missing_type(name, func):
Packit Service a31ea6
    try:
Packit Service a31ea6
        list = missing_types[name]
Packit Service a31ea6
	list.append(func)
Packit Service a31ea6
    except:
Packit Service a31ea6
        missing_types[name] = [func]
Packit Service a31ea6
Packit Service a31ea6
generated_param_types = []
Packit Service a31ea6
def add_generated_param_type(name):
Packit Service a31ea6
    generated_param_types.append(name)
Packit Service a31ea6
Packit Service a31ea6
generated_return_types = []
Packit Service a31ea6
def add_generated_return_type(name):
Packit Service a31ea6
    generated_return_types.append(name)
Packit Service a31ea6
Packit Service a31ea6
missing_functions = {}
Packit Service a31ea6
missing_functions_nr = 0
Packit Service a31ea6
def add_missing_functions(name, module):
Packit Service a31ea6
    global missing_functions_nr
Packit Service a31ea6
Packit Service a31ea6
    missing_functions_nr = missing_functions_nr + 1
Packit Service a31ea6
    try:
Packit Service a31ea6
        list = missing_functions[module]
Packit Service a31ea6
	list.append(name)
Packit Service a31ea6
    except:
Packit Service a31ea6
        missing_functions[module] = [name]
Packit Service a31ea6
Packit Service a31ea6
#
Packit Service a31ea6
# Provide the type generators and destructors for the parameters
Packit Service a31ea6
#
Packit Service a31ea6
Packit Service a31ea6
def type_convert(str, name, info, module, function, pos):
Packit Service a31ea6
#    res = string.replace(str, "    ", " ")
Packit Service a31ea6
#    res = string.replace(str, "   ", " ")
Packit Service a31ea6
#    res = string.replace(str, "  ", " ")
Packit Service a31ea6
    res = string.replace(str, " *", "_ptr")
Packit Service a31ea6
#    res = string.replace(str, "*", "_ptr")
Packit Service a31ea6
    res = string.replace(res, " ", "_")
Packit Service a31ea6
    if res == 'const_char_ptr':
Packit Service a31ea6
        if string.find(name, "file") != -1 or \
Packit Service a31ea6
           string.find(name, "uri") != -1 or \
Packit Service a31ea6
           string.find(name, "URI") != -1 or \
Packit Service a31ea6
           string.find(info, "filename") != -1 or \
Packit Service a31ea6
           string.find(info, "URI") != -1 or \
Packit Service a31ea6
           string.find(info, "URL") != -1:
Packit Service a31ea6
	    if string.find(function, "Save") != -1 or \
Packit Service a31ea6
	       string.find(function, "Create") != -1 or \
Packit Service a31ea6
	       string.find(function, "Write") != -1 or \
Packit Service a31ea6
	       string.find(function, "Fetch") != -1:
Packit Service a31ea6
	        return('fileoutput')
Packit Service a31ea6
	    return('filepath')
Packit Service a31ea6
    if res == 'void_ptr':
Packit Service a31ea6
        if module == 'nanoftp' and name == 'ctx':
Packit Service a31ea6
	    return('xmlNanoFTPCtxtPtr')
Packit Service a31ea6
        if function == 'xmlNanoFTPNewCtxt' or \
Packit Service a31ea6
	   function == 'xmlNanoFTPConnectTo' or \
Packit Service a31ea6
	   function == 'xmlNanoFTPOpen':
Packit Service a31ea6
	    return('xmlNanoFTPCtxtPtr')
Packit Service a31ea6
        if module == 'nanohttp' and name == 'ctx':
Packit Service a31ea6
	    return('xmlNanoHTTPCtxtPtr')
Packit Service a31ea6
	if function == 'xmlNanoHTTPMethod' or \
Packit Service a31ea6
	   function == 'xmlNanoHTTPMethodRedir' or \
Packit Service a31ea6
	   function == 'xmlNanoHTTPOpen' or \
Packit Service a31ea6
	   function == 'xmlNanoHTTPOpenRedir':
Packit Service a31ea6
	    return('xmlNanoHTTPCtxtPtr');
Packit Service a31ea6
        if function == 'xmlIOHTTPOpen':
Packit Service a31ea6
	    return('xmlNanoHTTPCtxtPtr')
Packit Service a31ea6
	if string.find(name, "data") != -1:
Packit Service a31ea6
	    return('userdata')
Packit Service a31ea6
	if string.find(name, "user") != -1:
Packit Service a31ea6
	    return('userdata')
Packit Service a31ea6
    if res == 'xmlDoc_ptr':
Packit Service a31ea6
        res = 'xmlDocPtr'
Packit Service a31ea6
    if res == 'xmlNode_ptr':
Packit Service a31ea6
        res = 'xmlNodePtr'
Packit Service a31ea6
    if res == 'xmlDict_ptr':
Packit Service a31ea6
        res = 'xmlDictPtr'
Packit Service a31ea6
    if res == 'xmlNodePtr' and pos != 0:
Packit Service a31ea6
        if (function == 'xmlAddChild' and pos == 2) or \
Packit Service a31ea6
	   (function == 'xmlAddChildList' and pos == 2) or \
Packit Service a31ea6
           (function == 'xmlAddNextSibling' and pos == 2) or \
Packit Service a31ea6
           (function == 'xmlAddSibling' and pos == 2) or \
Packit Service a31ea6
           (function == 'xmlDocSetRootElement' and pos == 2) or \
Packit Service a31ea6
           (function == 'xmlReplaceNode' and pos == 2) or \
Packit Service a31ea6
           (function == 'xmlTextMerge') or \
Packit Service a31ea6
	   (function == 'xmlAddPrevSibling' and pos == 2):
Packit Service a31ea6
	    return('xmlNodePtr_in');
Packit Service a31ea6
    if res == 'const xmlBufferPtr':
Packit Service a31ea6
        res = 'xmlBufferPtr'
Packit Service a31ea6
    if res == 'xmlChar_ptr' and name == 'name' and \
Packit Service a31ea6
       string.find(function, "EatName") != -1:
Packit Service a31ea6
        return('eaten_name')
Packit Service a31ea6
    if res == 'void_ptr*':
Packit Service a31ea6
        res = 'void_ptr_ptr'
Packit Service a31ea6
    if res == 'char_ptr*':
Packit Service a31ea6
        res = 'char_ptr_ptr'
Packit Service a31ea6
    if res == 'xmlChar_ptr*':
Packit Service a31ea6
        res = 'xmlChar_ptr_ptr'
Packit Service a31ea6
    if res == 'const_xmlChar_ptr*':
Packit Service a31ea6
        res = 'const_xmlChar_ptr_ptr'
Packit Service a31ea6
    if res == 'const_char_ptr*':
Packit Service a31ea6
        res = 'const_char_ptr_ptr'
Packit Service a31ea6
    if res == 'FILE_ptr' and module == 'debugXML':
Packit Service a31ea6
        res = 'debug_FILE_ptr';
Packit Service a31ea6
    if res == 'int' and name == 'options':
Packit Service a31ea6
        if module == 'parser' or module == 'xmlreader':
Packit Service a31ea6
	    res = 'parseroptions'
Packit Service a31ea6
Packit Service a31ea6
    return res
Packit Service a31ea6
Packit Service a31ea6
known_param_types = []
Packit Service a31ea6
Packit Service a31ea6
def is_known_param_type(name, rtype):
Packit Service a31ea6
    global test
Packit Service a31ea6
    for type in known_param_types:
Packit Service a31ea6
        if type == name:
Packit Service a31ea6
	    return 1
Packit Service a31ea6
    for type in generated_param_types:
Packit Service a31ea6
        if type == name:
Packit Service a31ea6
	    return 1
Packit Service a31ea6
Packit Service a31ea6
    if name[-3:] == 'Ptr' or name[-4:] == '_ptr':
Packit Service a31ea6
        if rtype[0:6] == 'const ':
Packit Service a31ea6
	    crtype = rtype[6:]
Packit Service a31ea6
	else:
Packit Service a31ea6
	    crtype = rtype
Packit Service a31ea6
Packit Service a31ea6
        define = 0
Packit Service a31ea6
	if modules_defines.has_key(module):
Packit Service a31ea6
	    test.write("#ifdef %s\n" % (modules_defines[module]))
Packit Service a31ea6
	    define = 1
Packit Service a31ea6
        test.write("""
Packit Service a31ea6
#define gen_nb_%s 1
Packit Service a31ea6
static %s gen_%s(int no ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
Packit Service a31ea6
    return(NULL);
Packit Service a31ea6
}
Packit Service a31ea6
static void des_%s(int no ATTRIBUTE_UNUSED, %s val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
Packit Service a31ea6
}
Packit Service a31ea6
""" % (name, crtype, name, name, rtype))
Packit Service a31ea6
        if define == 1:
Packit Service a31ea6
	    test.write("#endif\n\n")
Packit Service a31ea6
        add_generated_param_type(name)
Packit Service a31ea6
        return 1
Packit Service a31ea6
Packit Service a31ea6
    return 0
Packit Service a31ea6
Packit Service a31ea6
#
Packit Service a31ea6
# Provide the type destructors for the return values
Packit Service a31ea6
#
Packit Service a31ea6
Packit Service a31ea6
known_return_types = []
Packit Service a31ea6
Packit Service a31ea6
def is_known_return_type(name):
Packit Service a31ea6
    for type in known_return_types:
Packit Service a31ea6
        if type == name:
Packit Service a31ea6
	    return 1
Packit Service a31ea6
    return 0
Packit Service a31ea6
Packit Service a31ea6
#
Packit Service a31ea6
# Copy the beginning of the C test program result
Packit Service a31ea6
#
Packit Service a31ea6
Packit Service a31ea6
try:
Packit Service a31ea6
    input = open("testapi.c", "r")
Packit Service a31ea6
except:
Packit Service a31ea6
    input = open(srcPref + "testapi.c", "r")
Packit Service a31ea6
test = open('testapi.c.new', 'w')
Packit Service a31ea6
Packit Service a31ea6
def compare_and_save():
Packit Service a31ea6
    global test
Packit Service a31ea6
Packit Service a31ea6
    test.close()
Packit Service a31ea6
    try:
Packit Service a31ea6
        input = open("testapi.c", "r").read()
Packit Service a31ea6
    except:
Packit Service a31ea6
        input = ''
Packit Service a31ea6
    test = open('testapi.c.new', "r").read()
Packit Service a31ea6
    if input != test:
Packit Service a31ea6
        try:
Packit Service a31ea6
            os.system("rm testapi.c; mv testapi.c.new testapi.c")
Packit Service a31ea6
        except:
Packit Service a31ea6
	    os.system("mv testapi.c.new testapi.c")
Packit Service a31ea6
        print("Updated testapi.c")
Packit Service a31ea6
    else:
Packit Service a31ea6
        print("Generated testapi.c is identical")
Packit Service a31ea6
Packit Service a31ea6
line = input.readline()
Packit Service a31ea6
while line != "":
Packit Service a31ea6
    if line == "/* CUT HERE: everything below that line is generated */\n":
Packit Service a31ea6
        break;
Packit Service a31ea6
    if line[0:15] == "#define gen_nb_":
Packit Service a31ea6
        type = string.split(line[15:])[0]
Packit Service a31ea6
	known_param_types.append(type)
Packit Service a31ea6
    if line[0:19] == "static void desret_":
Packit Service a31ea6
        type = string.split(line[19:], '(')[0]
Packit Service a31ea6
	known_return_types.append(type)
Packit Service a31ea6
    test.write(line)
Packit Service a31ea6
    line = input.readline()
Packit Service a31ea6
input.close()
Packit Service a31ea6
Packit Service a31ea6
if line == "":
Packit Service a31ea6
    print "Could not find the CUT marker in testapi.c skipping generation"
Packit Service a31ea6
    test.close()
Packit Service a31ea6
    sys.exit(0)
Packit Service a31ea6
Packit Service a31ea6
print("Scanned testapi.c: found %d parameters types and %d return types\n" % (
Packit Service a31ea6
      len(known_param_types), len(known_return_types)))
Packit Service a31ea6
test.write("/* CUT HERE: everything below that line is generated */\n")
Packit Service a31ea6
Packit Service a31ea6
Packit Service a31ea6
#
Packit Service a31ea6
# Open the input API description
Packit Service a31ea6
#
Packit Service a31ea6
doc = libxml2.readFile(srcPref + 'doc/libxml2-api.xml', None, 0)
Packit Service a31ea6
if doc == None:
Packit Service a31ea6
    print "Failed to load doc/libxml2-api.xml"
Packit Service a31ea6
    sys.exit(1)
Packit Service a31ea6
ctxt = doc.xpathNewContext()
Packit Service a31ea6
Packit Service a31ea6
#
Packit Service a31ea6
# Generate a list of all function parameters and select only
Packit Service a31ea6
# those used in the api tests
Packit Service a31ea6
#
Packit Service a31ea6
argtypes = {}
Packit Service a31ea6
args = ctxt.xpathEval("/api/symbols/function/arg")
Packit Service a31ea6
for arg in args:
Packit Service a31ea6
    mod = arg.xpathEval('string(../@file)')
Packit Service a31ea6
    func = arg.xpathEval('string(../@name)')
Packit Service a31ea6
    if (mod not in skipped_modules) and (func not in skipped_functions):
Packit Service a31ea6
	type = arg.xpathEval('string(@type)')
Packit Service a31ea6
	if not argtypes.has_key(type):
Packit Service a31ea6
	    argtypes[type] = func
Packit Service a31ea6
Packit Service a31ea6
# similarly for return types
Packit Service a31ea6
rettypes = {}
Packit Service a31ea6
rets = ctxt.xpathEval("/api/symbols/function/return")
Packit Service a31ea6
for ret in rets:
Packit Service a31ea6
    mod = ret.xpathEval('string(../@file)')
Packit Service a31ea6
    func = ret.xpathEval('string(../@name)')
Packit Service a31ea6
    if (mod not in skipped_modules) and (func not in skipped_functions):
Packit Service a31ea6
        type = ret.xpathEval('string(@type)')
Packit Service a31ea6
	if not rettypes.has_key(type):
Packit Service a31ea6
	    rettypes[type] = func
Packit Service a31ea6
Packit Service a31ea6
#
Packit Service a31ea6
# Generate constructors and return type handling for all enums
Packit Service a31ea6
# which are used as function parameters
Packit Service a31ea6
#
Packit Service a31ea6
enums = ctxt.xpathEval("/api/symbols/typedef[@type='enum']")
Packit Service a31ea6
for enum in enums:
Packit Service a31ea6
    module = enum.xpathEval('string(@file)')
Packit Service a31ea6
    name = enum.xpathEval('string(@name)')
Packit Service a31ea6
    #
Packit Service a31ea6
    # Skip any enums which are not in our filtered lists
Packit Service a31ea6
    #
Packit Service a31ea6
    if (name == None) or ((name not in argtypes) and (name not in rettypes)):
Packit Service a31ea6
        continue;
Packit Service a31ea6
    define = 0
Packit Service a31ea6
Packit Service a31ea6
    if argtypes.has_key(name) and is_known_param_type(name, name) == 0:
Packit Service a31ea6
	values = ctxt.xpathEval("/api/symbols/enum[@type='%s']" % name)
Packit Service a31ea6
	i = 0
Packit Service a31ea6
	vals = []
Packit Service a31ea6
	for value in values:
Packit Service a31ea6
	    vname = value.xpathEval('string(@name)')
Packit Service a31ea6
	    if vname == None:
Packit Service a31ea6
		continue;
Packit Service a31ea6
	    i = i + 1
Packit Service a31ea6
	    if i >= 5:
Packit Service a31ea6
		break;
Packit Service a31ea6
	    vals.append(vname)
Packit Service a31ea6
	if vals == []:
Packit Service a31ea6
	    print "Didn't find any value for enum %s" % (name)
Packit Service a31ea6
	    continue
Packit Service a31ea6
	if modules_defines.has_key(module):
Packit Service a31ea6
	    test.write("#ifdef %s\n" % (modules_defines[module]))
Packit Service a31ea6
	    define = 1
Packit Service a31ea6
	test.write("#define gen_nb_%s %d\n" % (name, len(vals)))
Packit Service a31ea6
	test.write("""static %s gen_%s(int no, int nr ATTRIBUTE_UNUSED) {\n""" %
Packit Service a31ea6
	           (name, name))
Packit Service a31ea6
	i = 1
Packit Service a31ea6
	for value in vals:
Packit Service a31ea6
	    test.write("    if (no == %d) return(%s);\n" % (i, value))
Packit Service a31ea6
	    i = i + 1
Packit Service a31ea6
	test.write("""    return(0);
Packit Service a31ea6
}
Packit Service a31ea6
Packit Service a31ea6
static void des_%s(int no ATTRIBUTE_UNUSED, %s val ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED) {
Packit Service a31ea6
}
Packit Service a31ea6
Packit Service a31ea6
""" % (name, name));
Packit Service a31ea6
	known_param_types.append(name)
Packit Service a31ea6
Packit Service a31ea6
    if (is_known_return_type(name) == 0) and (name in rettypes):
Packit Service a31ea6
	if define == 0 and modules_defines.has_key(module):
Packit Service a31ea6
	    test.write("#ifdef %s\n" % (modules_defines[module]))
Packit Service a31ea6
	    define = 1
Packit Service a31ea6
        test.write("""static void desret_%s(%s val ATTRIBUTE_UNUSED) {
Packit Service a31ea6
}
Packit Service a31ea6
Packit Service a31ea6
""" % (name, name))
Packit Service a31ea6
	known_return_types.append(name)
Packit Service a31ea6
    if define == 1:
Packit Service a31ea6
        test.write("#endif\n\n")
Packit Service a31ea6
Packit Service a31ea6
#
Packit Service a31ea6
# Load the interfaces
Packit Service a31ea6
# 
Packit Service a31ea6
headers = ctxt.xpathEval("/api/files/file")
Packit Service a31ea6
for file in headers:
Packit Service a31ea6
    name = file.xpathEval('string(@name)')
Packit Service a31ea6
    if (name == None) or (name == ''):
Packit Service a31ea6
        continue
Packit Service a31ea6
Packit Service a31ea6
    #
Packit Service a31ea6
    # Some module may be skipped because they don't really consists
Packit Service a31ea6
    # of user callable APIs
Packit Service a31ea6
    #
Packit Service a31ea6
    if is_skipped_module(name):
Packit Service a31ea6
        continue
Packit Service a31ea6
Packit Service a31ea6
    #
Packit Service a31ea6
    # do not test deprecated APIs
Packit Service a31ea6
    #
Packit Service a31ea6
    desc = file.xpathEval('string(description)')
Packit Service a31ea6
    if string.find(desc, 'DEPRECATED') != -1:
Packit Service a31ea6
        print "Skipping deprecated interface %s" % name
Packit Service a31ea6
	continue;
Packit Service a31ea6
Packit Service a31ea6
    test.write("#include <libxml/%s.h>\n" % name)
Packit Service a31ea6
    modules.append(name)
Packit Service a31ea6
        
Packit Service a31ea6
#
Packit Service a31ea6
# Generate the callers signatures
Packit Service a31ea6
# 
Packit Service a31ea6
for module in modules:
Packit Service a31ea6
    test.write("static int test_%s(void);\n" % module);
Packit Service a31ea6
Packit Service a31ea6
#
Packit Service a31ea6
# Generate the top caller
Packit Service a31ea6
# 
Packit Service a31ea6
Packit Service a31ea6
test.write("""
Packit Service a31ea6
/**
Packit Service a31ea6
 * testlibxml2:
Packit Service a31ea6
 *
Packit Service a31ea6
 * Main entry point of the tester for the full libxml2 module,
Packit Service a31ea6
 * it calls all the tester entry point for each module.
Packit Service a31ea6
 *
Packit Service a31ea6
 * Returns the number of error found
Packit Service a31ea6
 */
Packit Service a31ea6
static int
Packit Service a31ea6
testlibxml2(void)
Packit Service a31ea6
{
Packit Service a31ea6
    int test_ret = 0;
Packit Service a31ea6
Packit Service a31ea6
""")
Packit Service a31ea6
Packit Service a31ea6
for module in modules:
Packit Service a31ea6
    test.write("    test_ret += test_%s();\n" % module)
Packit Service a31ea6
Packit Service a31ea6
test.write("""
Packit Service a31ea6
    printf("Total: %d functions, %d tests, %d errors\\n",
Packit Service a31ea6
           function_tests, call_tests, test_ret);
Packit Service a31ea6
    return(test_ret);
Packit Service a31ea6
}
Packit Service a31ea6
Packit Service a31ea6
""")
Packit Service a31ea6
Packit Service a31ea6
#
Packit Service a31ea6
# How to handle a function
Packit Service a31ea6
# 
Packit Service a31ea6
nb_tests = 0
Packit Service a31ea6
Packit Service a31ea6
def generate_test(module, node):
Packit Service a31ea6
    global test
Packit Service a31ea6
    global nb_tests
Packit Service a31ea6
    nb_cond = 0
Packit Service a31ea6
    no_gen = 0
Packit Service a31ea6
Packit Service a31ea6
    name = node.xpathEval('string(@name)')
Packit Service a31ea6
    if is_skipped_function(name):
Packit Service a31ea6
        return
Packit Service a31ea6
Packit Service a31ea6
    #
Packit Service a31ea6
    # check we know how to handle the args and return values
Packit Service a31ea6
    # and store the informations for the generation
Packit Service a31ea6
    #
Packit Service a31ea6
    try:
Packit Service a31ea6
	args = node.xpathEval("arg")
Packit Service a31ea6
    except:
Packit Service a31ea6
        args = []
Packit Service a31ea6
    t_args = []
Packit Service a31ea6
    n = 0
Packit Service a31ea6
    for arg in args:
Packit Service a31ea6
        n = n + 1
Packit Service a31ea6
        rtype = arg.xpathEval("string(@type)")
Packit Service a31ea6
	if rtype == 'void':
Packit Service a31ea6
	    break;
Packit Service a31ea6
	info = arg.xpathEval("string(@info)")
Packit Service a31ea6
	nam = arg.xpathEval("string(@name)")
Packit Service a31ea6
        type = type_convert(rtype, nam, info, module, name, n)
Packit Service a31ea6
	if is_known_param_type(type, rtype) == 0:
Packit Service a31ea6
	    add_missing_type(type, name);
Packit Service a31ea6
	    no_gen = 1
Packit Service a31ea6
        if (type[-3:] == 'Ptr' or type[-4:] == '_ptr') and \
Packit Service a31ea6
	    rtype[0:6] == 'const ':
Packit Service a31ea6
	    crtype = rtype[6:]
Packit Service a31ea6
	else:
Packit Service a31ea6
	    crtype = rtype
Packit Service a31ea6
	t_args.append((nam, type, rtype, crtype, info))
Packit Service a31ea6
    
Packit Service a31ea6
    try:
Packit Service a31ea6
	rets = node.xpathEval("return")
Packit Service a31ea6
    except:
Packit Service a31ea6
        rets = []
Packit Service a31ea6
    t_ret = None
Packit Service a31ea6
    for ret in rets:
Packit Service a31ea6
        rtype = ret.xpathEval("string(@type)")
Packit Service a31ea6
	info = ret.xpathEval("string(@info)")
Packit Service a31ea6
        type = type_convert(rtype, 'return', info, module, name, 0)
Packit Service a31ea6
	if rtype == 'void':
Packit Service a31ea6
	    break
Packit Service a31ea6
	if is_known_return_type(type) == 0:
Packit Service a31ea6
	    add_missing_type(type, name);
Packit Service a31ea6
	    no_gen = 1
Packit Service a31ea6
	t_ret = (type, rtype, info)
Packit Service a31ea6
	break
Packit Service a31ea6
Packit Service a31ea6
    test.write("""
Packit Service a31ea6
static int
Packit Service a31ea6
test_%s(void) {
Packit Service a31ea6
    int test_ret = 0;
Packit Service a31ea6
Packit Service a31ea6
""" % (name))
Packit Service a31ea6
Packit Service a31ea6
    if no_gen == 1:
Packit Service a31ea6
        add_missing_functions(name, module)
Packit Service a31ea6
	test.write("""
Packit Service a31ea6
    /* missing type support */
Packit Service a31ea6
    return(test_ret);
Packit Service a31ea6
}
Packit Service a31ea6
Packit Service a31ea6
""")
Packit Service a31ea6
        return
Packit Service a31ea6
Packit Service a31ea6
    try:
Packit Service a31ea6
	conds = node.xpathEval("cond")
Packit Service a31ea6
	for cond in conds:
Packit Service a31ea6
	    test.write("#if %s\n" % (cond.get_content()))
Packit Service a31ea6
	    nb_cond = nb_cond + 1
Packit Service a31ea6
    except:
Packit Service a31ea6
        pass
Packit Service a31ea6
Packit Service a31ea6
    define = 0
Packit Service a31ea6
    if function_defines.has_key(name):
Packit Service a31ea6
        test.write("#ifdef %s\n" % (function_defines[name]))
Packit Service a31ea6
	define = 1
Packit Service a31ea6
    
Packit Service a31ea6
    # Declare the memory usage counter
Packit Service a31ea6
    no_mem = is_skipped_memcheck(name)
Packit Service a31ea6
    if no_mem == 0:
Packit Service a31ea6
	test.write("    int mem_base;\n");
Packit Service a31ea6
Packit Service a31ea6
    # Declare the return value
Packit Service a31ea6
    if t_ret != None:
Packit Service a31ea6
        test.write("    %s ret_val;\n" % (t_ret[1]))
Packit Service a31ea6
Packit Service a31ea6
    # Declare the arguments
Packit Service a31ea6
    for arg in t_args:
Packit Service a31ea6
        (nam, type, rtype, crtype, info) = arg;
Packit Service a31ea6
	# add declaration
Packit Service a31ea6
	test.write("    %s %s; /* %s */\n" % (crtype, nam, info))
Packit Service a31ea6
	test.write("    int n_%s;\n" % (nam))
Packit Service a31ea6
    test.write("\n")
Packit Service a31ea6
Packit Service a31ea6
    # Cascade loop on of each argument list of values
Packit Service a31ea6
    for arg in t_args:
Packit Service a31ea6
        (nam, type, rtype, crtype, info) = arg;
Packit Service a31ea6
	#
Packit Service a31ea6
	test.write("    for (n_%s = 0;n_%s < gen_nb_%s;n_%s++) {\n" % (
Packit Service a31ea6
	           nam, nam, type, nam))
Packit Service a31ea6
    
Packit Service a31ea6
    # log the memory usage
Packit Service a31ea6
    if no_mem == 0:
Packit Service a31ea6
	test.write("        mem_base = xmlMemBlocks();\n");
Packit Service a31ea6
Packit Service a31ea6
    # prepare the call
Packit Service a31ea6
    i = 0;
Packit Service a31ea6
    for arg in t_args:
Packit Service a31ea6
        (nam, type, rtype, crtype, info) = arg;
Packit Service a31ea6
	#
Packit Service a31ea6
	test.write("        %s = gen_%s(n_%s, %d);\n" % (nam, type, nam, i))
Packit Service a31ea6
	i = i + 1;
Packit Service a31ea6
Packit Service a31ea6
    # add checks to avoid out-of-bounds array access
Packit Service a31ea6
    i = 0;
Packit Service a31ea6
    for arg in t_args:
Packit Service a31ea6
        (nam, type, rtype, crtype, info) = arg;
Packit Service a31ea6
        # assume that "size", "len", and "start" parameters apply to either
Packit Service a31ea6
        # the nearest preceding or following char pointer
Packit Service a31ea6
        if type == "int" and (nam == "size" or nam == "len" or nam == "start"):
Packit Service a31ea6
            for j in range(i - 1, -1, -1) + range(i + 1, len(t_args)):
Packit Service a31ea6
                (bnam, btype) = t_args[j][:2]
Packit Service a31ea6
                if btype == "const_char_ptr" or btype == "const_xmlChar_ptr":
Packit Service a31ea6
                    test.write(
Packit Service a31ea6
                        "        if ((%s != NULL) &&\n"
Packit Service a31ea6
                        "            (%s > (int) strlen((const char *) %s) + 1))\n"
Packit Service a31ea6
                        "            continue;\n"
Packit Service a31ea6
                        % (bnam, nam, bnam))
Packit Service a31ea6
                    break
Packit Service a31ea6
	i = i + 1;
Packit Service a31ea6
Packit Service a31ea6
    # do the call, and clanup the result
Packit Service a31ea6
    if extra_pre_call.has_key(name):
Packit Service a31ea6
	test.write("        %s\n"% (extra_pre_call[name]))
Packit Service a31ea6
    if t_ret != None:
Packit Service a31ea6
	test.write("\n        ret_val = %s(" % (name))
Packit Service a31ea6
	need = 0
Packit Service a31ea6
	for arg in t_args:
Packit Service a31ea6
	    (nam, type, rtype, crtype, info) = arg
Packit Service a31ea6
	    if need:
Packit Service a31ea6
	        test.write(", ")
Packit Service a31ea6
	    else:
Packit Service a31ea6
	        need = 1
Packit Service a31ea6
	    if rtype != crtype:
Packit Service a31ea6
	        test.write("(%s)" % rtype)
Packit Service a31ea6
	    test.write("%s" % nam);
Packit Service a31ea6
	test.write(");\n")
Packit Service a31ea6
	if extra_post_call.has_key(name):
Packit Service a31ea6
	    test.write("        %s\n"% (extra_post_call[name]))
Packit Service a31ea6
	test.write("        desret_%s(ret_val);\n" % t_ret[0])
Packit Service a31ea6
    else:
Packit Service a31ea6
	test.write("\n        %s(" % (name));
Packit Service a31ea6
	need = 0;
Packit Service a31ea6
	for arg in t_args:
Packit Service a31ea6
	    (nam, type, rtype, crtype, info) = arg;
Packit Service a31ea6
	    if need:
Packit Service a31ea6
	        test.write(", ")
Packit Service a31ea6
	    else:
Packit Service a31ea6
	        need = 1
Packit Service a31ea6
	    if rtype != crtype:
Packit Service a31ea6
	        test.write("(%s)" % rtype)
Packit Service a31ea6
	    test.write("%s" % nam)
Packit Service a31ea6
	test.write(");\n")
Packit Service a31ea6
	if extra_post_call.has_key(name):
Packit Service a31ea6
	    test.write("        %s\n"% (extra_post_call[name]))
Packit Service a31ea6
Packit Service a31ea6
    test.write("        call_tests++;\n");
Packit Service a31ea6
Packit Service a31ea6
    # Free the arguments
Packit Service a31ea6
    i = 0;
Packit Service a31ea6
    for arg in t_args:
Packit Service a31ea6
        (nam, type, rtype, crtype, info) = arg;
Packit Service a31ea6
	# This is a hack to prevent generating a destructor for the
Packit Service a31ea6
	# 'input' argument in xmlTextReaderSetup.  There should be
Packit Service a31ea6
	# a better, more generic way to do this!
Packit Service a31ea6
	if string.find(info, 'destroy') == -1:
Packit Service a31ea6
	    test.write("        des_%s(n_%s, " % (type, nam))
Packit Service a31ea6
	    if rtype != crtype:
Packit Service a31ea6
	        test.write("(%s)" % rtype)
Packit Service a31ea6
	    test.write("%s, %d);\n" % (nam, i))
Packit Service a31ea6
	i = i + 1;
Packit Service a31ea6
Packit Service a31ea6
    test.write("        xmlResetLastError();\n");
Packit Service a31ea6
    # Check the memory usage
Packit Service a31ea6
    if no_mem == 0:
Packit Service a31ea6
	test.write("""        if (mem_base != xmlMemBlocks()) {
Packit Service a31ea6
            printf("Leak of %%d blocks found in %s",
Packit Service a31ea6
	           xmlMemBlocks() - mem_base);
Packit Service a31ea6
	    test_ret++;
Packit Service a31ea6
""" % (name));
Packit Service a31ea6
	for arg in t_args:
Packit Service a31ea6
	    (nam, type, rtype, crtype, info) = arg;
Packit Service a31ea6
	    test.write("""            printf(" %%d", n_%s);\n""" % (nam))
Packit Service a31ea6
	test.write("""            printf("\\n");\n""")
Packit Service a31ea6
	test.write("        }\n")
Packit Service a31ea6
Packit Service a31ea6
    for arg in t_args:
Packit Service a31ea6
	test.write("    }\n")
Packit Service a31ea6
Packit Service a31ea6
    test.write("    function_tests++;\n")
Packit Service a31ea6
    #
Packit Service a31ea6
    # end of conditional
Packit Service a31ea6
    #
Packit Service a31ea6
    while nb_cond > 0:
Packit Service a31ea6
        test.write("#endif\n")
Packit Service a31ea6
	nb_cond = nb_cond -1
Packit Service a31ea6
    if define == 1:
Packit Service a31ea6
        test.write("#endif\n")
Packit Service a31ea6
Packit Service a31ea6
    nb_tests = nb_tests + 1;
Packit Service a31ea6
Packit Service a31ea6
    test.write("""
Packit Service a31ea6
    return(test_ret);
Packit Service a31ea6
}
Packit Service a31ea6
Packit Service a31ea6
""")
Packit Service a31ea6
    
Packit Service a31ea6
#
Packit Service a31ea6
# Generate all module callers
Packit Service a31ea6
#
Packit Service a31ea6
for module in modules:
Packit Service a31ea6
    # gather all the functions exported by that module
Packit Service a31ea6
    try:
Packit Service a31ea6
	functions = ctxt.xpathEval("/api/symbols/function[@file='%s']" % (module))
Packit Service a31ea6
    except:
Packit Service a31ea6
        print "Failed to gather functions from module %s" % (module)
Packit Service a31ea6
	continue;
Packit Service a31ea6
Packit Service a31ea6
    # iterate over all functions in the module generating the test
Packit Service a31ea6
    i = 0
Packit Service a31ea6
    nb_tests_old = nb_tests
Packit Service a31ea6
    for function in functions:
Packit Service a31ea6
        i = i + 1
Packit Service a31ea6
        generate_test(module, function);
Packit Service a31ea6
Packit Service a31ea6
    # header
Packit Service a31ea6
    test.write("""static int
Packit Service a31ea6
test_%s(void) {
Packit Service a31ea6
    int test_ret = 0;
Packit Service a31ea6
Packit Service a31ea6
    if (quiet == 0) printf("Testing %s : %d of %d functions ...\\n");
Packit Service a31ea6
""" % (module, module, nb_tests - nb_tests_old, i))
Packit Service a31ea6
Packit Service a31ea6
    # iterate over all functions in the module generating the call
Packit Service a31ea6
    for function in functions:
Packit Service a31ea6
        name = function.xpathEval('string(@name)')
Packit Service a31ea6
	if is_skipped_function(name):
Packit Service a31ea6
	    continue
Packit Service a31ea6
	test.write("    test_ret += test_%s();\n" % (name))
Packit Service a31ea6
Packit Service a31ea6
    # footer
Packit Service a31ea6
    test.write("""
Packit Service a31ea6
    if (test_ret != 0)
Packit Service a31ea6
	printf("Module %s: %%d errors\\n", test_ret);
Packit Service a31ea6
    return(test_ret);
Packit Service a31ea6
}
Packit Service a31ea6
""" % (module))
Packit Service a31ea6
Packit Service a31ea6
#
Packit Service a31ea6
# Generate direct module caller
Packit Service a31ea6
#
Packit Service a31ea6
test.write("""static int
Packit Service a31ea6
test_module(const char *module) {
Packit Service a31ea6
""");
Packit Service a31ea6
for module in modules:
Packit Service a31ea6
    test.write("""    if (!strcmp(module, "%s")) return(test_%s());\n""" % (
Packit Service a31ea6
        module, module))
Packit Service a31ea6
test.write("""    return(0);
Packit Service a31ea6
}
Packit Service a31ea6
""");
Packit Service a31ea6
Packit Service a31ea6
print "Generated test for %d modules and %d functions" %(len(modules), nb_tests)
Packit Service a31ea6
Packit Service a31ea6
compare_and_save()
Packit Service a31ea6
Packit Service a31ea6
missing_list = []
Packit Service a31ea6
for missing in missing_types.keys():
Packit Service a31ea6
    if missing == 'va_list' or missing == '...':
Packit Service a31ea6
        continue;
Packit Service a31ea6
Packit Service a31ea6
    n = len(missing_types[missing])
Packit Service a31ea6
    missing_list.append((n, missing))
Packit Service a31ea6
Packit Service a31ea6
def compare_missing(a, b):
Packit Service a31ea6
    return b[0] - a[0]
Packit Service a31ea6
Packit Service a31ea6
missing_list.sort(compare_missing)
Packit Service a31ea6
print "Missing support for %d functions and %d types see missing.lst" % (missing_functions_nr, len(missing_list))
Packit Service a31ea6
lst = open("missing.lst", "w")
Packit Service a31ea6
lst.write("Missing support for %d types" % (len(missing_list)))
Packit Service a31ea6
lst.write("\n")
Packit Service a31ea6
for miss in missing_list:
Packit Service a31ea6
    lst.write("%s: %d :" % (miss[1], miss[0]))
Packit Service a31ea6
    i = 0
Packit Service a31ea6
    for n in missing_types[miss[1]]:
Packit Service a31ea6
        i = i + 1
Packit Service a31ea6
        if i > 5:
Packit Service a31ea6
	    lst.write(" ...")
Packit Service a31ea6
	    break
Packit Service a31ea6
	lst.write(" %s" % (n))
Packit Service a31ea6
    lst.write("\n")
Packit Service a31ea6
lst.write("\n")
Packit Service a31ea6
lst.write("\n")
Packit Service a31ea6
lst.write("Missing support per module");
Packit Service a31ea6
for module in missing_functions.keys():
Packit Service a31ea6
    lst.write("module %s:\n   %s\n" % (module, missing_functions[module]))
Packit Service a31ea6
Packit Service a31ea6
lst.close()
Packit Service a31ea6
Packit Service a31ea6