1#!/usr/bin/python
2##
3## license:BSD-3-Clause
4## copyright-holders:Couriersud
5
6import os
7import os.path
8import re
9import sys
10import xml.sax
11import xml.sax.saxutils
12import zlib
13
14
15# workaround for version incompatibility
16if sys.version_info > (3, ):
17    long = int
18
19# globals
20
21last_src = ""
22
23def process_entry(srcfile, name, params):
24    global last_src
25    if (last_src != srcfile):
26        last_src = srcfile
27        print("// ---------------------------------------------------------------------")
28        print("// Source: {}".format(srcfile))
29        print("// ---------------------------------------------------------------------")
30        print("")
31    p = re.sub("\+","",params)
32    ps = p.split(",")
33    pusage = ""
34    pauto = ""
35    for x in ps:
36        if x[0:1] == "@":
37            pauto = pauto + ", " + x[1:]
38        else:
39            pusage = pusage + ", " + x
40    print("// usage       : {}(name{})".format(name, pusage))
41    if len(pauto) > 0:
42        print("// auto connect: {}".format(pauto[2:]))
43    print("#define {}(...)                                                   \\".format(name))
44    print("\tNET_REGISTER_DEVEXT({}, __VA_ARGS__)".format(name))
45    print("")
46
47
48def process_file(srcfile):
49    src = open(srcfile,'r')
50    lines = src.readlines()
51    for line in lines:
52        ls = re.sub("\s+","",line.strip())
53        ls = re.sub("^\s*//.*","",ls)
54        ls = re.sub("\"","",ls)
55        m = re.match(r"NETLIB_DEVICE_IMPL\((\w+),(\w+),([a-zA-Z0-9_+@,]*)", ls)
56        #print("Line{}: {}".format(count, line.strip()))
57        if m != None:
58            process_entry(srcfile, m.group(2), m.group(3))
59        else:
60            m = re.match(r"NETLIB_DEVICE_IMPL_ALIAS\((\w+),(\w+),(\w+),([a-zA-Z0-9_+@,]*)", ls)
61            if m != None:
62                process_entry(srcfile, m.group(3), m.group(4))
63            else:
64                m = re.match(r"NETLIB_DEVICE_IMPL_NS\((\w+),(\w+),(\w+),([a-zA-Z0-9_+@,]*)", ls)
65                if m != None:
66                    process_entry(srcfile, m.group(3), m.group(4))
67                else:
68                    m = re.match(r"LOCAL_LIB_ENTRY\((\w+)\)", ls)
69                    if m != None:
70                        process_entry(srcfile, m.group(1), "")
71                    else:
72                        m = re.match(r"(static)*TRUTHTABLE_START\((\w+),(\w+),(\w+),([a-zA-Z0-9_+@,]*)", ls)
73                        if m != None:
74                            process_entry(srcfile, m.group(2), m.group(5))
75
76    src.close()
77
78if __name__ == '__main__':
79    if (len(sys.argv) == 0):
80        print('Usage:')
81        print('  create_devinc files ...')
82        sys.exit(0)
83    files_sorted = [];
84    for argno in range(1, len(sys.argv)):
85        files_sorted.append(sys.argv[argno])
86    files_sorted.sort();
87    for entry in files_sorted:
88        process_file(entry)
89
90