summaryrefslogtreecommitdiffstats
path: root/Tools/modulator/varsubst.py
blob: 71a2b264409b85f06f934625fb6d1ffff22df267 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#
# Variable substitution. Variables are $delimited$
#
import string
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 = string.rfind(old, '\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()