DEADSOFTWARE

Lin interface modules generators added
[bbcp.git] / Trurl-based / _OpenBSD_ / Lin / Mod / gen-Libc / dumpdefs.py
1 #! /usr/bin/env python2.7
2 #
3 # A. V. Shiryaev, 2012.09
4 # simple *.h '#define' macro translator
6 import sys, re
8 INDENT = "\t"
10 _p1 = re.compile('^#define\s+([^\s]+)\s+([A-Za-z0-9]+)\s*$')
11 _p2 = re.compile('^#define\s+([^\s]+)\s+([^\s]+)\s+\/\*([^\*]+)\*\/\s*$')
13 def mkset (x):
14 if x >= 0:
15 s = []
16 ss = 0
17 i = 0
18 while x != 0:
19 if x % 2 != 0:
20 if ss == 0:
21 si = i
22 sn = 1
23 ss = 1
24 elif i == si + sn:
25 sn = sn + 1
26 else:
27 if sn == 1:
28 s.append(str(si))
29 elif sn == 2:
30 s.append("%s,%s" % (si, si+1))
31 else:
32 s.append("%s..%s" % (si, si + sn - 1))
33 si = i
34 sn = 1
35 i = i + 1
36 x = x / 2
37 if ss == 1:
38 if sn == 1:
39 s.append(str(si))
40 elif sn == 2:
41 s.append("%s,%s" % (si, si+1))
42 else:
43 s.append("%s..%s" % (si, si + sn - 1))
44 return '{' + ','.join(s) + '}'
45 else:
46 return None
48 def fixVal (x, tip):
49 if x.startswith('(') and x.endswith(')') and (x.count('(') == 1) and (x.count(')') == 1):
50 x = x[1:-1]
52 if x.startswith('0x'): # fix HEX
53 if tip == 'i':
54 if x[2] in ('0', '1', '2', '3', '4', '5', '6', '7', '8', '9'):
55 return x[2:].upper() + "H"
56 else:
57 return "0" + x[2:].upper() + "H"
58 else:
59 return mkset(int(x, 16))
60 elif x[0] == '0': # fix OCT
61 if tip == 'i':
62 return str(int(x, 8))
63 else:
64 return mkset(int(x, 8))
65 else:
66 if tip == 'i':
67 return x
68 else:
69 try:
70 y = int(x)
71 except:
72 return x
73 else:
74 return mkset(y)
76 def p (nIndents, sym, val, comment, val1):
77 r = [ "%s%s* = %s;" % (INDENT*nIndents, sym, val) ]
78 if (val1 != None) and (val != val1):
79 r.append( "(* %s *)" % (val1,) )
80 if comment:
81 r.append( "(* %s *)" % (comment,) )
82 print ' '.join(r)
84 def isBits (s):
85 return (len(s) > 1) and s.startswith('0') # HEX or OCT
87 def main ():
88 if len(sys.argv) == 5:
89 nIndents = int(sys.argv[1])
90 if sys.argv[2] == '*':
91 level = None
92 else:
93 level = int(sys.argv[2])
94 tip = sys.argv[3]
95 assert tip in ('i', 's')
97 fh = open(sys.argv[4], 'r')
98 st = 0
99 for line in fh.readlines():
100 if line.startswith("#if"):
101 # print line,
102 st = st + 1
103 elif line.startswith("#endif"):
104 # print line,
105 st = st - 1
106 elif (level == None) or (st == level):
107 r = _p2.match(line)
108 if r:
109 sym = r.group(1)
110 val = fixVal(r.group(2), tip)
111 if isBits(r.group(2)):
112 val1 = fixVal(r.group(2), 's')
113 else:
114 val1 = None
115 comment = r.group(3).strip()
116 p(nIndents, sym, val, comment, val1)
117 else:
118 r = _p1.match(line)
119 if r:
120 sym = r.group(1)
121 val = fixVal(r.group(2), tip)
122 if isBits(r.group(2)):
123 val1 = fixVal(r.group(2), 's')
124 else:
125 val1 = None
126 comment = None
127 p(nIndents, sym, val, comment, val1)
128 else:
129 print "usage: %s nIndents level type file.h" % (sys.argv[0],)
130 print " level:"
131 print " number: selected level"
132 print " *: all levels"
133 print " type:"
134 print " i: integer"
135 print " s: set"
137 if __name__ == '__main__':
138 main()