# build autodefs.h and 

import re

autogen = "Automatically generated by config.py"

def parse_version_m4(kv, version_m4):
    r = re.compile(r'^define\((\w+),\[(.*)\]\)$')
    f = open(version_m4)
    for line in f:
        line = line.rstrip()
        m = re.match(r, line)
        if m:
            g = m.groups()
            kv[g[0]] = g[1]
    f.close()

def parse_settings_in(kv, settings_in):
    r = re.compile(r'^!define\s+(\w+)(?:\s+"?(.*?)"?)$')
    f = open(settings_in)
    for line in f:
        line = line.rstrip()
        m = re.match(r, line)
        if m:
            g = m.groups()
            kv[g[0]] = g[1] or ''
    f.close()

def build_autodefs(kv, autodefs_in, autodefs_out):
    def repfn(m):
        var, = m.groups()
        return kv.get(var, '')

    r = re.compile(r'@(\w+)@')
    fin = open(autodefs_in)
    fout = open(autodefs_out, 'w')
    fout.write("/* %s */\n\n" % autogen)
    for line in fin:
        newline = re.sub(r, repfn, line)
        fout.write(newline)
    fin.close()
    fout.close()

def print_key_values(kv):
    for k, v in sorted(kv.items()):
        print "%s%s%s" % (k, ' '*(32-len(k)), repr(v))

def get_sources(makefile_am):
    c = set()
    h = set()
    f = open(makefile_am)
    state = False
    for line in f:
        line = line.rstrip()
        if line == 'openvpn_SOURCES = \\':
            state = True
        elif not line:
            state = False
        elif state:
            for sf in line.split():
                if sf.endswith('.c'):
                    c.add(sf[:-2])
                elif sf.endswith('.h'):
                    h.add(sf[:-2])
                elif sf == '\\':
                    pass
                else:
                    print >>sys.stderr, "Unrecognized filename:", sf
    f.close()
    return [ sorted(list(s)) for s in (c, h) ]

def output_mak_list(out, title, srclist, ext):
    out.write("%s =" % (title,))
    for x in srclist:
        out.write(" \\\n\t%s.%s" % (x, ext))
    out.write('\n\n')

def output_mak(makefile_am, outfile):
    c, h = get_sources(makefile_am)
    out = open(outfile, 'w')
    out.write("# %s\n\n" % autogen)
    output_mak_list(out, 'HEADERS', h, 'h')
    output_mak_list(out, 'OBJS', c, 'obj')
    out.close()

def main():
    kv = {}
    parse_version_m4(kv, 'version.m4')
    parse_settings_in(kv, 'install-win32/settings.in')
    build_autodefs(kv, 'msvc/autodefs.h.in', 'autodefs.h')
    output_mak('Makefile.am', 'head_obj.mak')

main()