From 3954cd3bb33407829dda5ba86db22a0d8272e43d Mon Sep 17 00:00:00 2001
From: dkuhlman <none@none>
Date: Fri, 6 Mar 2015 20:50:09 -0800
Subject: [PATCH] Fix for infinite loop in one-file-per-xsd mode.

---
 README                           |  4 ++++
 generateDS.py                    | 19 ++++++++++---------
 generateDS.txt                   |  2 +-
 gui/generateds_gui.py            |  2 +-
 librarytemplate_howto.txt        |  2 +-
 process_includes.py              |  2 +-
 setup.py                         |  2 +-
 tutorial/generateds_tutorial.txt |  2 +-
 8 files changed, 20 insertions(+), 15 deletions(-)

diff --git a/README b/README
index 1d6c846..c8d896a 100644
--- a/README
+++ b/README
@@ -144,6 +144,10 @@ Change history
 Version 2.15b (03/04/2015)
 - Fix to generation of simpleType validation code for list (unbounded)
   elements.  Thanks to wobanator for this fix.
+- Fix to code for --one-file-per-xsd.  Added check to avoid an
+  infinite loop schemas not suitable to --one-file-per-xsd.  Thanks
+  Michael Vezie for catching this and for identifying relevant
+  location in the code.
 
 Version 2.15a (02/18/2015)
 - Modifications so that we generate code that can be used by Python 3.
diff --git a/generateDS.py b/generateDS.py
index b88ac01..e14e02e 100755
--- a/generateDS.py
+++ b/generateDS.py
@@ -184,7 +184,7 @@ logging.disable(logging.INFO)
 # Do not modify the following VERSION comments.
 # Used by updateversion.py.
 ##VERSION##
-VERSION = '2.15a'
+VERSION = '2.15b'
 ##VERSION##
 
 GenerateProperties = 0
@@ -678,7 +678,7 @@ class XschemaElement(XschemaElementBase):
             typeName = self.name
         if typeName and not self.fullyQualifiedType:
             namespace = self.targetNamespace
-            if self.prefix:
+            if self.prefix and self.prefix in prefixToNamespaceMap:
                 xmlns = prefixToNamespaceMap[self.prefix]
                 if xmlns:
                     namespace = xmlns
@@ -6094,7 +6094,10 @@ def generate(outfileName, subclassFilename, behaviorFilename,
     #
     # Generate the elements that were postponed because we had not
     #   yet generated their base class.
-    while 1:
+    maxLoops = 100
+    loops = 0
+    while loops <= maxLoops:
+        loops += 1
         if len(PostponedExtensions) <= 0:
             break
         element = PostponedExtensions.pop()
@@ -6105,6 +6108,9 @@ def generate(outfileName, subclassFilename, behaviorFilename,
                 generateClasses(wrt, prefix, element, 1)
             else:
                 PostponedExtensions.insert(0, element)
+    if loops >= maxLoops:
+        sys.stderr.write('\n*** maxLoops exceeded.  Something is wrong with '
+                         '--one-file-per-xsd.\n\n')
     #
     # Disable the generation of SAX handler/parser.
     # It failed when we stopped putting simple types into ElementDict.
@@ -6223,7 +6229,6 @@ def parseAndGenerate(
     if SingleFileOutput:
         parser = make_parser()
         dh = XschemaHandler()
-    ##    parser.setDocumentHandler(dh)
         parser.setContentHandler(dh)
         if processIncludes:
             import process_includes
@@ -6239,10 +6244,6 @@ def parseAndGenerate(
         parser.parse(infile)
         root = dh.getRoot()
         root.annotate()
-##     print '-' * 60
-##     root.show(sys.stdout, 0)
-##     print '-' * 60
-    #debug_show_elements(root)
         generate(
             outfileName, subclassFilename, behaviorFilename,
             prefix, root, options, args, superModule)
@@ -6259,7 +6260,7 @@ def parseAndGenerate(
             outfile = open(outfileName, "a")
             outfile.write(exportLine)
             outfile.close()
-    else:
+    else:    # not SingleFileOutput
         import process_includes
         rootPaths = process_includes.get_all_root_file_paths(
             infile, inpath=xschemaFileName,
diff --git a/generateDS.txt b/generateDS.txt
index 8400144..4d90a12 100644
--- a/generateDS.txt
+++ b/generateDS.txt
@@ -12,7 +12,7 @@ generateDS -- Generate Data Structures from XML Schema
 
 .. version
 
-:revision: 2.15a
+:revision: 2.15b
 
 .. version
 
diff --git a/gui/generateds_gui.py b/gui/generateds_gui.py
index e1d2646..dd14694 100755
--- a/gui/generateds_gui.py
+++ b/gui/generateds_gui.py
@@ -31,7 +31,7 @@ from libgenerateDS.gui import generateds_gui_session
 # Do not modify the following VERSION comments.
 # Used by updateversion.py.
 ##VERSION##
-VERSION = '2.15a'
+VERSION = '2.15b'
 ##VERSION##
 
 
diff --git a/librarytemplate_howto.txt b/librarytemplate_howto.txt
index 8ae28ac..3a3f9c2 100644
--- a/librarytemplate_howto.txt
+++ b/librarytemplate_howto.txt
@@ -8,7 +8,7 @@ How to package a generateDS.py generated library
 
 .. version
 
-:revision: 2.15a
+:revision: 2.15b
 
 .. version
 
diff --git a/process_includes.py b/process_includes.py
index 8c326a1..62f4fe6 100755
--- a/process_includes.py
+++ b/process_includes.py
@@ -30,7 +30,7 @@ from lxml import etree
 # Do not modify the following VERSION comments.
 # Used by updateversion.py.
 ##VERSION##
-VERSION = '2.15a'
+VERSION = '2.15b'
 ##VERSION##
 
 CatalogDict = {}
diff --git a/setup.py b/setup.py
index c24e551..f0bb6dd 100644
--- a/setup.py
+++ b/setup.py
@@ -7,7 +7,7 @@ setup(name="generateDS",
 # Do not modify the following VERSION comments.
 # Used by updateversion.py.
 ##VERSION##
-    version="2.15a",
+    version="2.15b",
 ##VERSION##
     author="Dave Kuhlman",
     author_email="dkuhlman@davekuhlman.org",
diff --git a/tutorial/generateds_tutorial.txt b/tutorial/generateds_tutorial.txt
index d01a293..adf2b8b 100644
--- a/tutorial/generateds_tutorial.txt
+++ b/tutorial/generateds_tutorial.txt
@@ -11,7 +11,7 @@ generateDS -- Introduction and Tutorial
 
 .. version
 
-:revision: 2.15a
+:revision: 2.15b
 
 .. version
 
-- 
GitLab