Use esistools, getopt.
diff --git a/Doc/tools/sgmlconv/esis2sgml.py b/Doc/tools/sgmlconv/esis2sgml.py
index 5f8c6e8..1271b11 100755
--- a/Doc/tools/sgmlconv/esis2sgml.py
+++ b/Doc/tools/sgmlconv/esis2sgml.py
@@ -8,30 +8,11 @@
 __version__ = '$Revision$'
 
 import errno
+import esistools
 import re
 import string
 
 
-_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
-
-
 def format_attrs(attrs):
     attrs = attrs.items()
     attrs.sort()
@@ -56,13 +37,16 @@
         if data and data[-1] == "\n":
             data = data[:-1]
         if type == "-":
-            data = decode(data)
+            data = esistools.decode(data)
             ofp.write(data)
             if "\n" in data:
                 lastopened = None
             knownempty = 0
             lastempty = 0
         elif type == "(":
+            if data == "COMMENT":
+                ofp.write("<!--")
+                continue
             if knownempty and xml:
                 ofp.write("<%s%s/>" % (data, format_attrs(attrs)))
             else:
@@ -75,6 +59,9 @@
             lastempty = knownempty
             knownempty = 0
         elif type == ")":
+            if data == "COMMENT":
+                ofp.write("-->")
+                continue
             if xml:
                 if not lastempty:
                     ofp.write("</%s>" % data)
@@ -87,7 +74,7 @@
             lastempty = 0
         elif type == "A":
             name, type, value = string.split(data, " ", 2)
-            attrs[name] = decode(value)
+            attrs[name] = esistools.decode(value)
         elif type == "e":
             knownempty = 1
 
@@ -101,26 +88,35 @@
 
 
 def main():
+    import getopt
     import sys
     #
     convert = sgml_convert
-    if sys.argv[1:] and sys.argv[1] in ("-x", "--xml"):
-        convert = xml_convert
-        del sys.argv[1]
-    if len(sys.argv) == 1:
+    xml = 0
+    xmldecl = 0
+    opts, args = getopt.getopt(sys.argv[1:], "dx", ["declare", "xml"])
+    for opt, arg in opts:
+        if opt in ("-d", "--declare"):
+            xmldecl = 1
+        elif opt in ("-x", "--xml"):
+            xml = 1
+            convert = xml_convert
+    if len(args) == 0:
         ifp = sys.stdin
         ofp = sys.stdout
-    elif len(sys.argv) == 2:
-        ifp = open(sys.argv[1])
+    elif len(args) == 1:
+        ifp = open(args[0])
         ofp = sys.stdout
-    elif len(sys.argv) == 3:
-        ifp = open(sys.argv[1])
-        ofp = open(sys.argv[2], "w")
+    elif len(args) == 2:
+        ifp = open(args[0])
+        ofp = open(args[1], "w")
     else:
         usage()
         sys.exit(2)
     # knownempties is ignored in the XML version
     try:
+        if xml and xmldecl:
+            opf.write('<?xml version="1.0" encoding="iso8859-1"?>\n')
         convert(ifp, ofp)
     except IOError, (err, msg):
         if err != errno.EPIPE: