summaryrefslogtreecommitdiff
path: root/sys/src/cmd/python/Tools/modulator/varsubst.py
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@localhost>2011-05-03 11:25:13 +0000
committercinap_lenrek <cinap_lenrek@localhost>2011-05-03 11:25:13 +0000
commit458120dd40db6b4df55a4e96b650e16798ef06a0 (patch)
tree8f82685be24fef97e715c6f5ca4c68d34d5074ee /sys/src/cmd/python/Tools/modulator/varsubst.py
parent3a742c699f6806c1145aea5149bf15de15a0afd7 (diff)
add hg and python
Diffstat (limited to 'sys/src/cmd/python/Tools/modulator/varsubst.py')
-rw-r--r--sys/src/cmd/python/Tools/modulator/varsubst.py56
1 files changed, 56 insertions, 0 deletions
diff --git a/sys/src/cmd/python/Tools/modulator/varsubst.py b/sys/src/cmd/python/Tools/modulator/varsubst.py
new file mode 100644
index 000000000..3b3395065
--- /dev/null
+++ b/sys/src/cmd/python/Tools/modulator/varsubst.py
@@ -0,0 +1,56 @@
+#
+# Variable substitution. Variables are $delimited$
+#
+import re
+
+error = 'varsubst.error'
+
+class Varsubst:
+ def __init__(self, dict):
+ self.dict = dict
+ self.prog = re.compile('\$([a-zA-Z0-9_]*)\$')
+ self.do_useindent = 0
+
+ def useindent(self, onoff):
+ self.do_useindent = onoff
+
+ def subst(self, s):
+ rv = ''
+ while 1:
+ m = self.prog.search(s)
+ if not m:
+ return rv + s
+ rv = rv + s[:m.start()]
+ s = s[m.end():]
+ if m.end() - m.start() == 2:
+ # Escaped dollar
+ rv = rv + '$'
+ s = s[2:]
+ continue
+ name = m.group(1)
+ if not self.dict.has_key(name):
+ raise error, 'No such variable: '+name
+ value = self.dict[name]
+ if self.do_useindent and '\n' in value:
+ value = self._modindent(value, rv)
+ rv = rv + value
+
+ def _modindent(self, value, old):
+ lastnl = old.rfind('\n', 0) + 1
+ lastnl = len(old) - lastnl
+ sub = '\n' + (' '*lastnl)
+ return re.sub('\n', sub, value)
+
+def _test():
+ import sys
+ import os
+
+ sys.stderr.write('-- Copying stdin to stdout with environment map --\n')
+ c = Varsubst(os.environ)
+ c.useindent(1)
+ d = sys.stdin.read()
+ sys.stdout.write(c.subst(d))
+ sys.exit(1)
+
+if __name__ == '__main__':
+ _test()