/Tools/modulator/varsubst.py

http://unladen-swallow.googlecode.com/ · Python · 56 lines · 44 code · 8 blank · 4 comment · 7 complexity · ee89d8aab33ed27dad49f05e55b72935 MD5 · raw file

  1. #
  2. # Variable substitution. Variables are $delimited$
  3. #
  4. import re
  5. error = 'varsubst.error'
  6. class Varsubst:
  7. def __init__(self, dict):
  8. self.dict = dict
  9. self.prog = re.compile('\$([a-zA-Z0-9_]*)\$')
  10. self.do_useindent = 0
  11. def useindent(self, onoff):
  12. self.do_useindent = onoff
  13. def subst(self, s):
  14. rv = ''
  15. while 1:
  16. m = self.prog.search(s)
  17. if not m:
  18. return rv + s
  19. rv = rv + s[:m.start()]
  20. s = s[m.end():]
  21. if m.end() - m.start() == 2:
  22. # Escaped dollar
  23. rv = rv + '$'
  24. s = s[2:]
  25. continue
  26. name = m.group(1)
  27. if not self.dict.has_key(name):
  28. raise error, 'No such variable: '+name
  29. value = self.dict[name]
  30. if self.do_useindent and '\n' in value:
  31. value = self._modindent(value, rv)
  32. rv = rv + value
  33. def _modindent(self, value, old):
  34. lastnl = old.rfind('\n', 0) + 1
  35. lastnl = len(old) - lastnl
  36. sub = '\n' + (' '*lastnl)
  37. return re.sub('\n', sub, value)
  38. def _test():
  39. import sys
  40. import os
  41. sys.stderr.write('-- Copying stdin to stdout with environment map --\n')
  42. c = Varsubst(os.environ)
  43. c.useindent(1)
  44. d = sys.stdin.read()
  45. sys.stdout.write(c.subst(d))
  46. sys.exit(1)
  47. if __name__ == '__main__':
  48. _test()