/work/find_feature.py

http://github.com/tybor/Liberty · Python · 60 lines · 49 code · 10 blank · 1 comment · 16 complexity · f42ae2a98ffcae7fd92a6335f7a7b5b5 MD5 · raw file

  1. #!/usr/bin/env python
  2. import re
  3. import sys
  4. eiffel_feature = re.compile(r'^\s*(?P<feature_name>\w+)(?P<signature> \(((; )?((, )?(\w+))+: (\w+(\[\w+\])?))*\))?(: (?P<result_type>\w+))? is$')
  5. eiffel_signature = re.compile(r'(?P<locals>((, )?(\w+))+): (NATIVE_ARRAY\[(?P<array_type>\w+)\]|(?P<type>\w+))')
  6. eiffel_locals = re.compile(r'(?P<local>\w+)')
  7. code = sys.argv[1]
  8. symbol = sys.argv[2]
  9. classname = sys.argv[3][:-2].upper()
  10. i = 5
  11. while i > 0:
  12. line = sys.stdin.readline()
  13. match = eiffel_feature.match(line)
  14. if match:
  15. feature = match.groupdict()
  16. feature_name = "liberty_plugin__%s__%s" % (classname, feature["feature_name"])
  17. r = feature["result_type"]
  18. if r:
  19. result_type = "EIF_%s" % r
  20. do_return = " return"
  21. else:
  22. result_type = "void"
  23. do_return = ""
  24. c_signature = ""
  25. c_locals = ""
  26. s = feature["signature"]
  27. if s:
  28. i = 0
  29. for match in eiffel_signature.finditer(s):
  30. signature = match.groupdict()
  31. if signature["type"]:
  32. local_type = "EIF_%s" % signature["type"]
  33. else:
  34. local_type = "EIF_%s*" % signature["array_type"]
  35. for match in eiffel_locals.finditer(signature["locals"]):
  36. local = match.groupdict()["local"]
  37. if i:
  38. c_signature = c_signature + ", "
  39. c_locals = c_locals + ", "
  40. i = i + 1
  41. c_signature = c_signature + "%s a%d" % (local_type, i)
  42. c_locals = c_locals + "a%d" % i
  43. c_locals = "(" + c_locals + ")"
  44. if code == "code":
  45. print "%s __attribute__((visibility(\"default\"))) %s(%s) {%s %s%s; }" % (result_type, feature_name, c_signature, do_return, symbol, c_locals)
  46. elif code == "header":
  47. print "extern %s %s(%s);" % (result_type, feature_name, c_signature)
  48. i = 0
  49. else:
  50. i = i - 1