chgcalls 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. #!/usr/bin/python
  2. # vim:sw=4
  3. from StringIO import StringIO
  4. from getopt import gnu_getopt, GetoptError
  5. import re
  6. import sys
  7. class ChgCalls:
  8. input_filename = '-'
  9. input_file = None
  10. output_filename = '-'
  11. output_file = None
  12. wrapper_filename = ''
  13. wrapper_file = None
  14. function_regex = None
  15. underscore = False
  16. prefix = 'ac_'
  17. debug = False
  18. renamed_functions = {}
  19. def print_help (self):
  20. print 'Usage: %s CONFIGFILE < SRCFILE > DSTFILE' % (sys.argv[0])
  21. def strip_line (self, line):
  22. n = line.find ('#')
  23. if n >= 0:
  24. line = line[:n]
  25. return line.strip ()
  26. def read_config (self):
  27. '''Build a regexp that will match all the function names that are
  28. meant to be replaced, and save it in self.function_regex, based on the
  29. wrapper config.'''
  30. all_regex = StringIO ()
  31. all_regex.write (r'(.*)\b(_(')
  32. ln = 0
  33. while True:
  34. line = self.wrapper_file.readline ()
  35. if len (line) == 0:
  36. break
  37. ln += 1
  38. line = self.strip_line (line)
  39. if len (line) == 0:
  40. continue
  41. parts = re.split (r'\s+', line)
  42. if len (parts) < 2 or len (parts) > 3:
  43. print >> sys.stderr, 'Bad line %i: %s' % (ln, line)
  44. continue
  45. if all_regex.tell () > 9:
  46. all_regex.write ('|')
  47. all_regex.write (parts[0])
  48. all_regex.write (r'))\b(.*)')
  49. self.function_regex = re.compile (all_regex.getvalue ())
  50. def wrap_name (self, name):
  51. return '%s%s' % (self.prefix, name)
  52. def sym_name (self, name):
  53. name = self.renamed_functions.get (name, name)
  54. if not self.underscore:
  55. return '%s' % name
  56. else:
  57. return '_%s' % name
  58. def open_file (self, name, mode = 'r'):
  59. if name == '-':
  60. if mode.find ('r') >= 0:
  61. return sys.stdin
  62. else:
  63. return sys.stdout
  64. else:
  65. return open (name, mode)
  66. def close_file (self, file, name):
  67. if name == '-':
  68. return
  69. file.close ()
  70. def change (self):
  71. while True:
  72. line = self.input_file.readline ()
  73. if len (line) == 0:
  74. break
  75. while True:
  76. m = self.function_regex.match (line)
  77. if m is None or re.match ('^\s*_%s:' % m.group (3), line):
  78. break
  79. line = '%s%s%s%s\n' % (m.group (1), self.prefix,
  80. m.group (3), m.group (4))
  81. self.output_file.write (line)
  82. def main (self):
  83. try:
  84. opts, args = gnu_getopt (sys.argv[1:], 'h', ('help'))
  85. except GetoptError, message:
  86. print >> sys.stderr, 'Error:', message
  87. sys.exit (1)
  88. for opt, arg in opts:
  89. if opt in ('-h', '--help'):
  90. self.print_help ()
  91. sys.exit (0)
  92. if len (args) == 1:
  93. self.wrapper_filename = args[0]
  94. else:
  95. print >> sys.stderr, 'Error: Bad number of arguments (must be 1)'
  96. sys.exit (1)
  97. self.wrapper_file = self.open_file (self.wrapper_filename)
  98. self.read_config()
  99. self.close_file (self.wrapper_file, self.wrapper_filename)
  100. self.input_file = self.open_file (self.input_filename)
  101. self.output_file = self.open_file (self.output_filename, 'w')
  102. self.change ()
  103. self.close_file (self.output_file, self.output_filename)
  104. self.close_file (self.input_file, self.input_filename)
  105. self.input_file = None
  106. self.output_file = None
  107. chg = ChgCalls ()
  108. chg.main ()