| | |
| | |
| | |
| | |
| |
|
| | import xml.etree.ElementTree as etree |
| | import os |
| | import re |
| | import sys |
| |
|
| | import xmlmod |
| |
|
| | |
| |
|
| | dtors = { |
| | 'htmlDoc *': 'xmlFreeDoc', |
| | 'htmlParserCtxt *': 'htmlFreeParserCtxt', |
| | 'xmlAutomata *': 'xmlFreeAutomata', |
| | 'xmlBuffer *': 'xmlBufferFree', |
| | 'xmlCatalog *': 'xmlFreeCatalog', |
| | 'xmlChar *': 'xmlFree', |
| | 'xmlDOMWrapCtxt *': 'xmlDOMWrapFreeCtxt', |
| | 'xmlDict *': 'xmlDictFree', |
| | 'xmlDoc *': 'xmlFreeDoc', |
| | 'xmlDtd *': 'xmlFreeDtd', |
| | 'xmlEntitiesTable *': 'xmlFreeEntitiesTable', |
| | 'xmlElementContent *': 'xmlFreeElementContent', |
| | 'xmlEnumeration *': 'xmlFreeEnumeration', |
| | 'xmlList *': 'xmlListDelete', |
| | 'xmlModule *': 'xmlModuleFree', |
| | 'xmlMutex *': 'xmlFreeMutex', |
| | 'xmlNode *': 'xmlFreeNode', |
| | 'xmlNodeSet *': 'xmlXPathFreeNodeSet', |
| | 'xmlNs *': 'xmlFreeNs', |
| | 'xmlOutputBuffer *': 'xmlOutputBufferClose', |
| | 'xmlParserCtxt *': 'xmlFreeParserCtxt', |
| | 'xmlParserInputBuffer *': 'xmlFreeParserInputBuffer', |
| | 'xmlParserInput *': 'xmlFreeInputStream', |
| | 'xmlRMutex *': 'xmlFreeRMutex', |
| | 'xmlRelaxNGValidCtxt *': 'xmlRelaxNGFreeValidCtxt', |
| | 'xmlSaveCtxt *': 'xmlSaveClose', |
| | 'xmlSchemaFacet *': 'xmlSchemaFreeFacet', |
| | 'xmlSchemaVal *': 'xmlSchemaFreeValue', |
| | 'xmlSchemaValidCtxt *': 'xmlSchemaFreeValidCtxt', |
| | 'xmlTextWriter *': 'xmlFreeTextWriter', |
| | 'xmlURI *': 'xmlFreeURI', |
| | 'xmlValidCtxt *': 'xmlFreeValidCtxt', |
| | 'xmlXPathContext *': 'xmlXPathFreeContext', |
| | 'xmlXPathParserContext *': 'xmlXPathFreeParserContext', |
| | 'xmlXPathObject *': 'xmlXPathFreeObject', |
| | } |
| |
|
| | blockList = { |
| | |
| | 'xmlCleanupParser': True, |
| | 'xmlInitParser': True, |
| |
|
| | |
| | 'xmlMemStrdupLoc': True, |
| | 'xmlMemoryStrdup': True, |
| |
|
| | |
| | 'xmlMallocAtomicLoc': True, |
| | 'xmlMallocLoc': True, |
| | 'xmlMemMalloc': True, |
| | 'xmlMemRealloc': True, |
| | 'xmlReallocLoc': True, |
| |
|
| | |
| | 'xmlSetStructuredErrorFunc': True, |
| |
|
| | |
| | 'xmlCatalogGetPublic': True, |
| | 'xmlCatalogGetSystem': True, |
| | 'xmlDebugDumpDTD': True, |
| | 'xmlDebugDumpDocument': True, |
| | 'xmlDebugDumpNode': True, |
| | 'xmlDebugDumpString': True, |
| | 'xmlParserError': True, |
| | 'xmlParserWarning': True, |
| | 'xmlParserValidityError': True, |
| | 'xmlParserValidityWarning': True, |
| |
|
| | |
| | 'xmlParseAttribute': True, |
| | 'xmlParseAttributeListDecl': True, |
| | 'xmlParseAttributeType': True, |
| | 'xmlParseCDSect': True, |
| | 'xmlParseCharData': True, |
| | 'xmlParseCharRef': True, |
| | 'xmlParseComment': True, |
| | 'xmlParseDefaultDecl': True, |
| | 'xmlParseDocTypeDecl': True, |
| | 'xmlParseEndTag': True, |
| | 'xmlParseElement': True, |
| | 'xmlParseElementChildrenContentDecl': True, |
| | 'xmlParseElementContentDecl': True, |
| | 'xmlParseElementDecl': True, |
| | 'xmlParseElementMixedContentDecl': True, |
| | 'xmlParseEncName': True, |
| | 'xmlParseEncodingDecl': True, |
| | 'xmlParseEntityDecl': True, |
| | 'xmlParseEntityValue': True, |
| | 'xmlParseEnumeratedType': True, |
| | 'xmlParseEnumerationType': True, |
| | 'xmlParseExternalID': True, |
| | 'xmlParseExternalSubset': True, |
| | 'xmlParseMarkupDecl': True, |
| | 'xmlParseMisc': True, |
| | 'xmlParseName': True, |
| | 'xmlParseNmtoken': True, |
| | 'xmlParseNotationDecl': True, |
| | 'xmlParseNotationType': True, |
| | 'xmlParsePEReference': True, |
| | 'xmlParsePI': True, |
| | 'xmlParsePITarget': True, |
| | 'xmlParsePubidLiteral': True, |
| | 'xmlParseReference': True, |
| | 'xmlParseSDDecl': True, |
| | 'xmlParseStartTag': True, |
| | 'xmlParseSystemLiteral': True, |
| | 'xmlParseTextDecl': True, |
| | 'xmlParseVersionInfo': True, |
| | 'xmlParseVersionNum': True, |
| | 'xmlParseXMLDecl': True, |
| | 'xmlParserHandlePEReference': True, |
| | 'xmlSkipBlankChars': True, |
| |
|
| | |
| | 'htmlReadFd': True, |
| | 'xmlReadFd': True, |
| | 'xmlReaderForFd': True, |
| | } |
| |
|
| | |
| |
|
| | if len(sys.argv) > 1: |
| | buildDir = sys.argv[1] |
| | else: |
| | buildDir = '.' |
| |
|
| | xmlDocDir = buildDir + '/doc/xml' |
| |
|
| | filenames = {} |
| | functions = {} |
| |
|
| | for file in os.listdir(xmlDocDir): |
| | if not file.endswith('_8h.xml'): |
| | continue |
| |
|
| | doc = etree.parse(xmlDocDir + '/' + file) |
| |
|
| | compound = doc.find('compounddef') |
| | module = compound.find('compoundname').text |
| | if not module.endswith('.h'): |
| | continue |
| | module = module[:-2] |
| |
|
| | for section in compound.findall('sectiondef'): |
| | if section.get('kind') != 'func': |
| | continue |
| |
|
| | for func in section.findall('memberdef'): |
| | name = func.find('name').text |
| | if name in blockList: |
| | continue |
| |
|
| | module1, module2 = xmlmod.findModules(module, name) |
| |
|
| | cargs = [] |
| | skip = False |
| | for arg in func.findall('param'): |
| | atype = etree.tostring(arg.find('type'), |
| | method='text', encoding='unicode').rstrip() |
| | if atype == 'void': |
| | continue |
| | if atype == 'va_list': |
| | skip = True |
| | break |
| | if re.search(r'(Ptr|\*)$', atype): |
| | cargs.append('NULL') |
| | else: |
| | cargs.append('0') |
| |
|
| | if skip: |
| | continue |
| |
|
| | mfunc = functions.get(module1) |
| | if mfunc is None: |
| | mfunc = {} |
| | functions[module1] = mfunc |
| |
|
| | mmfunc = mfunc.get(module2) |
| | if mmfunc is None: |
| | mmfunc = {} |
| | mfunc[module2] = mmfunc |
| |
|
| | code = f'{name}({', '.join(cargs)})' |
| |
|
| | rtype = etree.tostring(func.find('type'), |
| | method='text', encoding='unicode').rstrip() |
| | dtor = dtors.get(rtype) |
| | if dtor is not None: |
| | code = f'{dtor}({code})' |
| | elif rtype == 'xmlHashTable *': |
| | code = f'xmlHashFree({code}, NULL)' |
| |
|
| | mmfunc[name] = f' {code};\n' |
| |
|
| | |
| |
|
| | test = open('testapi.c', 'w') |
| |
|
| | test.write("""/* |
| | * testapi.c: libxml2 API tester program. |
| | * |
| | * Automatically generated by gentest.py |
| | * |
| | * See Copyright for the status of this software. |
| | */ |
| | |
| | /* Disable deprecation warnings */ |
| | #define XML_DEPRECATED |
| | |
| | #include "libxml.h" |
| | #include <libxml/HTMLparser.h> |
| | #include <libxml/HTMLtree.h> |
| | #include <libxml/c14n.h> |
| | #include <libxml/catalog.h> |
| | #include <libxml/debugXML.h> |
| | #include <libxml/parserInternals.h> |
| | #include <libxml/pattern.h> |
| | #include <libxml/relaxng.h> |
| | #include <libxml/schematron.h> |
| | #include <libxml/uri.h> |
| | #include <libxml/xinclude.h> |
| | #include <libxml/xlink.h> |
| | #include <libxml/xmlmodule.h> |
| | #include <libxml/xmlreader.h> |
| | #include <libxml/xmlsave.h> |
| | #include <libxml/xmlschemas.h> |
| | #include <libxml/xmlschemastypes.h> |
| | #include <libxml/xmlwriter.h> |
| | #include <libxml/xpathInternals.h> |
| | #include <libxml/xpointer.h> |
| | |
| | static void |
| | ignoreError(void *userData ATTRIBUTE_UNUSED, |
| | const xmlError *error ATTRIBUTE_UNUSED) { |
| | } |
| | |
| | int |
| | main(int argc ATTRIBUTE_UNUSED, char **argv ATTRIBUTE_UNUSED) { |
| | xmlInitParser(); |
| | xmlSetStructuredErrorFunc(NULL, ignoreError); |
| | |
| | """) |
| |
|
| | for module1 in sorted(functions.keys()): |
| | mfunc = functions[module1] |
| |
|
| | if module1 != '': |
| | test.write(f'#ifdef LIBXML_{module1}_ENABLED\n') |
| |
|
| | for module2 in sorted(mfunc.keys()): |
| | mmfunc = mfunc[module2] |
| |
|
| | if module2 != '': |
| | test.write(f'#ifdef LIBXML_{module2}_ENABLED\n') |
| |
|
| | for name in sorted(mmfunc.keys()): |
| | test.write(mmfunc[name]) |
| |
|
| | if module2 != '': |
| | test.write(f'#endif /* LIBXML_{module2}_ENABLED */\n') |
| |
|
| | if module1 != '': |
| | test.write(f'#endif /* LIBXML_{module1}_ENABLED */\n') |
| |
|
| | test.write('\n') |
| |
|
| | test.write(""" xmlCleanupParser(); |
| | return 0; |
| | } |
| | """) |
| |
|