#
# Variable substitution. Variables are $delimited$
#
import string
import regex
import regsub

error = 'varsubst.error'

class Varsubst:
    def __init__(self, dict):
	self.dict = dict
	self.prog = regex.compile('\$[a-zA-Z0-9_]*\$')
	self.do_useindent = 0

    def useindent(self, onoff):
	self.do_useindent = onoff
	
    def subst(self, str):
	rv = ''
	while 1:
	    pos = self.prog.search(str)
	    if pos < 0:
		return rv + str
	    if pos:
		rv = rv + str[:pos]
		str = str[pos:]
	    len = self.prog.match(str)
	    if len == 2:
		# Escaped dollar
		rv = rv + '$'
		str = str[2:]
		continue
	    name = str[1:len-1]
	    str = str[len:]
	    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 regsub.gsub('\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()
