#! /usr/bin/env python
#  -*- Python -*-

import fileinput
import getopt
import glob
import os
import re
import sys


declare_rx = re.compile(
    r"\\declaremodule(?:\[[a-zA-Z0-9]*\]*)?{[a-zA-Z_0-9]+}{([a-zA-Z_0-9]+)}")

module_rx = re.compile(r"\\module{([a-zA-Z_0-9]+)}")

def main():
    try:
        just_list = 0
        print_lineno = 0
        opts, args = getopt.getopt(sys.argv[1:], "ln", ["list", "number"])
        for opt, arg in opts:
            if opt in ("-l", "--list"):
                just_list = 1
            elif opt in ("-n", "--number"):
                print_lineno = 1
        files = args
        if not files:
            files = glob.glob("*.tex")
            files.sort()
        modulename = None
        for line in fileinput.input(files):
            if line[:9] == r"\section{":
                modulename = None
                continue
            if line[:16] == r"\modulesynopsys{":
                continue
            m = declare_rx.match(line)
            if m:
                modulename = m.group(1)
                continue
            if not modulename:
                continue
            m = module_rx.search(line)
            if m:
                name = m.group(1)
                if name != modulename:
                    filename = fileinput.filename()
                    if just_list:
                        print filename
                        fileinput.nextfile()
                        modulename = None
                    elif print_lineno:
                        print "%s(%d):%s" \
                              % (filename, fileinput.filelineno(), line[:-1])
                    else:
                        print "%s:%s" % (filename, line[:-1])
    except KeyboardInterrupt:
        sys.exit(1)


if __name__ == "__main__":
    main()
