dumpdefs.py 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. #! /usr/bin/env python2.7
  2. #
  3. # A. V. Shiryaev, 2012.09
  4. # simple *.h '#define' macro translator
  5. import sys, re
  6. INDENT = "\t"
  7. _p1 = re.compile('^#define\s+([^\s]+)\s+([A-Za-z0-9]+)\s*$')
  8. _p2 = re.compile('^#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. else:
  53. return mkset(int(x, 16))
  54. elif x[0] == '0': # fix OCT
  55. if tip == 'i':
  56. return str(int(x, 8))
  57. else:
  58. return mkset(int(x, 8))
  59. else:
  60. if tip == 'i':
  61. return x
  62. else:
  63. try:
  64. y = int(x)
  65. except:
  66. return x
  67. else:
  68. return mkset(y)
  69. def p (nIndents, sym, val, comment, val1):
  70. r = [ "%s%s* = %s;" % (INDENT*nIndents, sym, val) ]
  71. if (val1 != None) and (val != val1):
  72. r.append( "(* %s *)" % (val1,) )
  73. if comment:
  74. r.append( "(* %s *)" % (comment,) )
  75. print ' '.join(r)
  76. def isBits (s):
  77. return (len(s) > 1) and s.startswith('0') # HEX or OCT
  78. def main ():
  79. if len(sys.argv) == 5:
  80. nIndents = int(sys.argv[1])
  81. if sys.argv[2] == '*':
  82. level = None
  83. else:
  84. level = int(sys.argv[2])
  85. tip = sys.argv[3]
  86. assert tip in ('i', 's')
  87. fh = open(sys.argv[4], 'r')
  88. st = 0
  89. for line in fh.readlines():
  90. if line.startswith("#if"):
  91. # print line,
  92. st = st + 1
  93. elif line.startswith("#endif"):
  94. # print line,
  95. st = st - 1
  96. elif (level == None) or (st == level):
  97. r = _p2.match(line)
  98. if r:
  99. sym = r.group(1)
  100. val = fixVal(r.group(2), tip)
  101. if isBits(r.group(2)):
  102. val1 = fixVal(r.group(2), 's')
  103. else:
  104. val1 = None
  105. comment = r.group(3).strip()
  106. p(nIndents, sym, val, comment, val1)
  107. else:
  108. r = _p1.match(line)
  109. if r:
  110. sym = r.group(1)
  111. val = fixVal(r.group(2), tip)
  112. if isBits(r.group(2)):
  113. val1 = fixVal(r.group(2), 's')
  114. else:
  115. val1 = None
  116. comment = None
  117. p(nIndents, sym, val, comment, val1)
  118. else:
  119. print "usage: %s nIndents level type file.h" % (sys.argv[0],)
  120. print " level:"
  121. print " number: selected level"
  122. print " *: all levels"
  123. print " type:"
  124. print " i: integer"
  125. print " s: set"
  126. if __name__ == '__main__':
  127. main()