Annotation of embedaddon/libxml2/doc/examples/index.py, revision 1.1

1.1     ! misho       1: #!/usr/bin/python -u
        !             2: #
        !             3: # Indexes the examples and build an XML description
        !             4: #
        !             5: import string
        !             6: import glob
        !             7: import sys
        !             8: try:
        !             9:     import libxml2
        !            10: except:
        !            11:     sys.exit(1)
        !            12: sys.path.insert(0, "..")
        !            13: from apibuild import CParser, escape
        !            14: 
        !            15: examples = []
        !            16: extras = ['examples.xsl', 'index.py']
        !            17: tests = []
        !            18: sections = {}
        !            19: symbols = {}
        !            20: api_dict = None
        !            21: api_doc = None
        !            22: 
        !            23: def load_api():
        !            24:     global api_dict
        !            25:     global api_doc
        !            26: 
        !            27:     if api_dict != None:
        !            28:         return
        !            29:     api_dict = {}
        !            30:     try:
        !            31:         print "loading ../libxml2-api.xml"
        !            32:         api_doc = libxml2.parseFile("../libxml2-api.xml")
        !            33:     except:
        !            34:         print "failed to parse ../libxml2-api.xml"
        !            35:        sys.exit(1)
        !            36: 
        !            37: def find_symbol(name):
        !            38:     global api_dict
        !            39:     global api_doc
        !            40: 
        !            41:     if api_doc == None:
        !            42:         load_api()
        !            43: 
        !            44:     if name == None:
        !            45:         return
        !            46:     if api_dict.has_key(name):
        !            47:         return api_dict[name]
        !            48:     ctxt = api_doc.xpathNewContext()
        !            49:     res = ctxt.xpathEval("/api/symbols/*[@name = '%s']" % (name))
        !            50:     if type(res) == type([]) and len(res) >= 1:
        !            51:         if len(res) > 1:
        !            52:            print "Found %d references to %s in the API" % (len(res), name)
        !            53:        node = res[0]
        !            54:        typ = node.name
        !            55:        file = node.xpathEval("string(@file)")
        !            56:        info = node.xpathEval("string(info)")
        !            57:     else:
        !            58:         print "Reference %s not found in the API" % (name)
        !            59:        return None
        !            60:     ret = (typ, file, info)
        !            61:     api_dict[name] = ret
        !            62:     return ret
        !            63: 
        !            64: def parse_top_comment(filename, comment):
        !            65:     res = {}
        !            66:     lines = string.split(comment, "\n")
        !            67:     item = None
        !            68:     for line in lines:
        !            69:         while line != "" and (line[0] == ' ' or line[0] == '\t'):
        !            70:            line = line[1:]
        !            71:         while line != "" and line[0] == '*':
        !            72:            line = line[1:]
        !            73:         while line != "" and (line[0] == ' ' or line[0] == '\t'):
        !            74:            line = line[1:]
        !            75:        try:
        !            76:            (it, line) = string.split(line, ":", 1)
        !            77:            item = it
        !            78:            while line != "" and (line[0] == ' ' or line[0] == '\t'):
        !            79:                line = line[1:]
        !            80:            if res.has_key(item):
        !            81:                res[item] = res[item] + " " + line
        !            82:            else:
        !            83:                res[item] = line
        !            84:        except:
        !            85:            if item != None:
        !            86:                if res.has_key(item):
        !            87:                    res[item] = res[item] + " " + line
        !            88:                else:
        !            89:                    res[item] = line
        !            90:     return res
        !            91: 
        !            92: def parse(filename, output):
        !            93:     global symbols
        !            94:     global sections
        !            95: 
        !            96:     parser = CParser(filename)
        !            97:     parser.collect_references()
        !            98:     idx = parser.parse()
        !            99:     info = parse_top_comment(filename, parser.top_comment)
        !           100:     output.write("  <example filename='%s'>\n" % filename)
        !           101:     try:
        !           102:         synopsis = info['synopsis']
        !           103:        output.write("    <synopsis>%s</synopsis>\n" % escape(synopsis));
        !           104:     except:
        !           105:         print "Example %s lacks a synopsis description" % (filename)
        !           106:     try:
        !           107:         purpose = info['purpose']
        !           108:        output.write("    <purpose>%s</purpose>\n" % escape(purpose));
        !           109:     except:
        !           110:         print "Example %s lacks a purpose description" % (filename)
        !           111:     try:
        !           112:         usage = info['usage']
        !           113:        output.write("    <usage>%s</usage>\n" % escape(usage));
        !           114:     except:
        !           115:         print "Example %s lacks an usage description" % (filename)
        !           116:     try:
        !           117:         test = info['test']
        !           118:        output.write("    <test>%s</test>\n" % escape(test));
        !           119:        progname=filename[0:-2]
        !           120:        command=string.replace(test, progname, './' + progname, 1)
        !           121:        tests.append(command)
        !           122:     except:
        !           123:         pass
        !           124:     try:
        !           125:         author = info['author']
        !           126:        output.write("    <author>%s</author>\n" % escape(author));
        !           127:     except:
        !           128:         print "Example %s lacks an author description" % (filename)
        !           129:     try:
        !           130:         copy = info['copy']
        !           131:        output.write("    <copy>%s</copy>\n" % escape(copy));
        !           132:     except:
        !           133:         print "Example %s lacks a copyright description" % (filename)
        !           134:     try:
        !           135:         section = info['section']
        !           136:        output.write("    <section>%s</section>\n" % escape(section));
        !           137:        if sections.has_key(section):
        !           138:            sections[section].append(filename)
        !           139:        else:
        !           140:            sections[section] = [filename]
        !           141:     except:
        !           142:         print "Example %s lacks a section description" % (filename)
        !           143:     for topic in info.keys():
        !           144:         if topic != "purpose" and topic != "usage" and \
        !           145:           topic != "author" and topic != "copy" and \
        !           146:           topic != "section" and topic != "synopsis" and topic != "test":
        !           147:            str = info[topic]
        !           148:            output.write("    <extra topic='%s'>%s</extra>\n" % (
        !           149:                         escape(topic), escape(str)))
        !           150:     output.write("    <includes>\n")
        !           151:     for include in idx.includes.keys():
        !           152:         if include.find("libxml") != -1:
        !           153:            output.write("      <include>%s</include>\n" % (escape(include)))
        !           154:     output.write("    </includes>\n")
        !           155:     output.write("    <uses>\n")
        !           156:     for ref in idx.references.keys():
        !           157:         id = idx.references[ref]
        !           158:        name = id.get_name()
        !           159:        line = id.get_lineno()
        !           160:        if symbols.has_key(name):
        !           161:            sinfo = symbols[name]
        !           162:            refs = sinfo[0]
        !           163:            # gather at most 5 references per symbols
        !           164:            if refs > 5:
        !           165:                continue
        !           166:            sinfo.append(filename)
        !           167:            sinfo[0] = refs + 1
        !           168:        else:
        !           169:            symbols[name] = [1, filename]
        !           170:        info = find_symbol(name)
        !           171:        if info != None:
        !           172:            type = info[0]
        !           173:            file = info[1]
        !           174:            output.write("      <%s line='%d' file='%s' name='%s'/>\n" % (type,
        !           175:                         line, file, name))
        !           176:        else:
        !           177:            type = id.get_type()
        !           178:            output.write("      <%s line='%d' name='%s'/>\n" % (type,
        !           179:                         line, name))
        !           180:            
        !           181:     output.write("    </uses>\n")
        !           182:     output.write("  </example>\n")
        !           183:     
        !           184:     return idx
        !           185: 
        !           186: def dump_symbols(output):
        !           187:     global symbols
        !           188: 
        !           189:     output.write("  <symbols>\n")
        !           190:     keys = symbols.keys()
        !           191:     keys.sort()
        !           192:     for symbol in keys:
        !           193:         output.write("    <symbol name='%s'>\n" % (symbol))
        !           194:        info = symbols[symbol]
        !           195:        i = 1
        !           196:        while i < len(info):
        !           197:            output.write("      <ref filename='%s'/>\n" % (info[i]))
        !           198:            i = i + 1
        !           199:         output.write("    </symbol>\n")
        !           200:     output.write("  </symbols>\n")
        !           201: 
        !           202: def dump_sections(output):
        !           203:     global sections
        !           204: 
        !           205:     output.write("  <sections>\n")
        !           206:     keys = sections.keys()
        !           207:     keys.sort()
        !           208:     for section in keys:
        !           209:         output.write("    <section name='%s'>\n" % (section))
        !           210:        info = sections[section]
        !           211:        i = 0
        !           212:        while i < len(info):
        !           213:            output.write("      <example filename='%s'/>\n" % (info[i]))
        !           214:            i = i + 1
        !           215:         output.write("    </section>\n")
        !           216:     output.write("  </sections>\n")
        !           217: 
        !           218: def dump_Makefile():
        !           219:     for file in glob.glob('*.xml'):
        !           220:         extras.append(file)
        !           221:     for file in glob.glob('*.res'):
        !           222:         extras.append(file)
        !           223:     Makefile="""# Beware this is autogenerated by index.py
        !           224: INCLUDES = -I$(top_builddir)/include -I$(top_srcdir)/include -I@srcdir@/include @THREAD_CFLAGS@ @Z_CFLAGS@
        !           225: DEPS = $(top_builddir)/libxml2.la
        !           226: LDADDS = @STATIC_BINARIES@ $(top_builddir)/libxml2.la @THREAD_LIBS@ @Z_LIBS@ $(ICONV_LIBS) -lm @WIN32_EXTRA_LIBADD@
        !           227: 
        !           228: rebuild: examples.xml index.html
        !           229: 
        !           230: examples.xml: index.py *.c
        !           231:        -@($(srcdir)/index.py)
        !           232: 
        !           233: index.html: examples.xml examples.xsl
        !           234:        -@(xsltproc examples.xsl examples.xml && echo "Rebuilt web page" && xmllint --valid --noout index.html)
        !           235: 
        !           236: install-data-local: 
        !           237:        $(mkinstalldirs) $(DESTDIR)$(HTML_DIR)
        !           238:        -@INSTALL@ -m 0644 $(srcdir)/*.html $(srcdir)/*.c $(srcdir)/*.xml $(srcdir)/*.xsl $(srcdir)/*.res $(DESTDIR)$(HTML_DIR)
        !           239: 
        !           240: """
        !           241:     EXTRA_DIST=""
        !           242:     for extra in extras:
        !           243:         EXTRA_DIST = EXTRA_DIST + extra + " "
        !           244:     Makefile = Makefile + "EXTRA_DIST=%s\n\n" % (EXTRA_DIST)
        !           245:     noinst_PROGRAMS=""
        !           246:     for example in examples:
        !           247:         noinst_PROGRAMS = noinst_PROGRAMS + example + " "
        !           248:     Makefile = Makefile + "noinst_PROGRAMS=%s\n\n" % (noinst_PROGRAMS)
        !           249:     for example in examples:
        !           250:         Makefile = Makefile + "%s_SOURCES=%s.c\n%s_LDFLAGS=\n%s_DEPENDENCIES= $(DEPS)\n%s_LDADD= @RDL_LIBS@ $(LDADDS)\n\n" % (example, example, example,
        !           251:               example, example)
        !           252:     Makefile = Makefile + "valgrind: \n\t$(MAKE) CHECKER='valgrind' tests\n\n"
        !           253:     Makefile = Makefile + "tests: $(noinst_PROGRAMS)\n"
        !           254:     Makefile = Makefile + "\t@(echo '## examples regression tests')\n"
        !           255:     Makefile = Makefile + "\t@(echo > .memdump)\n"
        !           256:     for test in tests:
        !           257:         Makefile = Makefile + "\t@($(CHECKER) %s)\n" % (test)
        !           258:         Makefile = Makefile + '\t@(grep "MORY ALLO" .memdump  | grep -v "MEMORY ALLOCATED : 0" ; exit 0)\n'
        !           259:     Makefile = Makefile + "\n\n"
        !           260:     try:
        !           261:        old = open("Makefile.am", "r").read()
        !           262:        if old != Makefile:
        !           263:            n = open("Makefile.am", "w").write(Makefile)
        !           264:            print "Updated Makefile.am"
        !           265:     except:
        !           266:         print "Failed to read or save Makefile.am"
        !           267:     #
        !           268:     # Autogenerate the .cvsignore too ...
        !           269:     #
        !           270:     ignore = """.memdump
        !           271: Makefile.in
        !           272: Makefile
        !           273: """
        !           274:     for example in examples:
        !           275:         ignore = ignore + "%s\n" % (example)
        !           276:     try:
        !           277:        old = open(".cvsignore", "r").read()
        !           278:        if old != ignore:
        !           279:            n = open(".cvsignore", "w").write(ignore)
        !           280:            print "Updated .cvsignore"
        !           281:     except:
        !           282:         print "Failed to read or save .cvsignore"
        !           283:     
        !           284: if __name__ == "__main__":
        !           285:     load_api()
        !           286:     output = open("examples.xml", "w")
        !           287:     output.write("<examples>\n")
        !           288: 
        !           289:     for file in glob.glob('*.c'):
        !           290:        parse(file, output)
        !           291:        examples.append(file[:-2])
        !           292: 
        !           293:     dump_symbols(output)
        !           294:     dump_sections(output)
        !           295:     output.write("</examples>\n")
        !           296:     output.close()
        !           297:     dump_Makefile()
        !           298: 

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>