66 lines
2.3 KiB
Python
66 lines
2.3 KiB
Python
#! /usr/bin/env python
|
|
|
|
import os
|
|
import re
|
|
import sys
|
|
import optparse
|
|
import fnmatch
|
|
import filecmp
|
|
|
|
from mdp.docparser import Parser
|
|
from mdp.module import Module
|
|
import mdp.xmlwriter
|
|
|
|
def read_files(files, opts):
|
|
p = Parser()
|
|
p.read_files(files)
|
|
mod = Module('Moo' if not opts.module else opts.module)
|
|
mod.init_from_dox(p.classes + p.enums + p.functions + p.vmethods + p.signals)
|
|
return mod
|
|
|
|
def parse_args():
|
|
op = optparse.OptionParser()
|
|
op.add_option("--source-dir", dest="source_dirs", action="append",
|
|
help="parse source files from DIR", metavar="DIR")
|
|
op.add_option("--source-file", dest="source_files", action="append",
|
|
help="parse source file FILE", metavar="FILE")
|
|
op.add_option("--skip", dest="skip_globs", action="append",
|
|
help="skip files which match pattern PAT", metavar="PAT")
|
|
op.add_option("--output", dest="output", action="store",
|
|
help="write result to FILE", metavar="FILE")
|
|
op.add_option("--module", dest="module", action="store",
|
|
help="generate module MOD", metavar="MOD")
|
|
(opts, args) = op.parse_args()
|
|
if args:
|
|
op.error("too many arguments")
|
|
source_files = []
|
|
if opts.source_files:
|
|
source_files += [os.path.abspath(f) for f in opts.source_files]
|
|
skip_pat = None
|
|
if opts.skip_globs:
|
|
skip_pat = re.compile('|'.join([fnmatch.translate(g) for g in opts.skip_globs]))
|
|
if opts.source_dirs:
|
|
for source_dir in opts.source_dirs:
|
|
for root, dirs, files in os.walk(source_dir):
|
|
for f in files:
|
|
if f.endswith('.c') or f.endswith('.cpp') or f.endswith('.h'):
|
|
if skip_pat is None or not skip_pat.match(f):
|
|
source_files.append(os.path.join(root, f))
|
|
if not source_files:
|
|
op.error("no input files")
|
|
return opts, source_files
|
|
|
|
opts, files = parse_args()
|
|
mod = read_files(files, opts)
|
|
tmp_file = opts.output + '.tmp'
|
|
with open(tmp_file, 'w') as out:
|
|
mdp.xmlwriter.write_xml(mod, out)
|
|
|
|
if not os.path.exists(opts.output):
|
|
os.rename(tmp_file, opts.output)
|
|
elif filecmp.cmp(tmp_file, opts.output):
|
|
os.remove(tmp_file)
|
|
else:
|
|
os.remove(opts.output)
|
|
os.rename(tmp_file, opts.output)
|