Utility functions and misc. classes used in handling ESIS data.
diff --git a/Doc/tools/sgmlconv/esistools.py b/Doc/tools/sgmlconv/esistools.py
new file mode 100644
index 0000000..f44c13c
--- /dev/null
+++ b/Doc/tools/sgmlconv/esistools.py
@@ -0,0 +1,80 @@
+"""Miscellaneous utility functions useful for dealing with ESIS streams."""
+__version__ = '$Revision$'
+
+import re
+import string
+import sys
+
+
+_data_rx = re.compile(r"[^\\][^\\]*")
+
+def decode(s):
+    r = ''
+    while s:
+        m = _data_rx.match(s)
+        if m:
+            r = r + m.group()
+            s = s[len(m.group()):]
+        elif s[1] == "\\":
+            r = r + "\\"
+            s = s[2:]
+        elif s[1] == "n":
+            r = r + "\n"
+            s = s[2:]
+        else:
+            raise ValueError, "can't handle " + `s`
+    return r
+
+
+_charmap = {}
+for c in map(chr, range(256)):
+    _charmap[c] = c
+_charmap["\n"] = r"\n"
+_charmap["\\"] = r"\\"
+del c
+
+def encode(s):
+    return string.join(map(_charmap.get, s), '')
+
+
+import xml.dom.esis_builder
+
+
+class ExtendedEsisBuilder(xml.dom.esis_builder.EsisBuilder):
+    def __init__(self, *args, **kw):
+        self.__empties = {}
+        self.__is_empty = 0
+        apply(xml.dom.esis_builder.EsisBuilder.__init__, (self,) + args, kw)
+
+    def feed(self, data):
+        for line in string.split(data, '\n'):
+            if not line: 
+                break
+            event = line[0]
+            text = line[1:]
+            if event == '(':
+                element = self.document.createElement(text, self.attr_store)
+                self.attr_store = {}
+                self.push(element)
+                if self.__is_empty:
+                    self.__empties[text] = text
+                    self.__is_empty = 0
+            elif event == ')':
+                self.pop()
+            elif event == 'A':
+                l = re.split(' ', text, 2)
+                name = l[0]
+                value = decode(l[2])
+                self.attr_store[name] = value
+            elif event == '-':
+                text = self.document.createText(decode(text))
+                self.push(text)
+            elif event == 'C':
+                return
+            elif event == 'e':
+                self.__is_empty = 1
+            else:
+                sys.stderr.write('Unknown event: %s\n' % line)
+
+    def get_empties(self):
+        return self.__empties.keys()