dumpdefs.py 3.3 KB

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