Create an interface file for SBTarget named SBTarget.i which relieves SBTarget.h
of the duty of having SWIG docstring features and multiline string literals
embedded within.

lldb.swig now %include .../SBTarget.i, instead of .../SBTarget.h.  Will create
other interface files and transition them over.

Also update modify-python-lldb.py to better handle the trailing blank line right
before the ending '"""' Python docstring delimiter.


git-svn-id: https://llvm.org/svn/llvm-project/llvdb/trunk@135355 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/scripts/Python/modify-python-lldb.py b/scripts/Python/modify-python-lldb.py
index cc24ab6..789e2e7 100644
--- a/scripts/Python/modify-python-lldb.py
+++ b/scripts/Python/modify-python-lldb.py
@@ -36,9 +36,8 @@
 c_endif_swig = "#endif"
 c_ifdef_swig = "#ifdef SWIG"
 c_comment_marker = "//------------"
-trailing_blank_line = '            '
 # The pattern for recognizing the doxygen comment block line.
-doxygen_comment_start = re.compile("^\s*(    /// ?)")
+doxygen_comment_start = re.compile("^\s*(/// ?)")
 # The demarcation point for turning on/off residue removal state.
 # When bracketed by the lines, the CLEANUP_DOCSTRING state (see below) is ON.
 toggle_docstring_cleanup_line = '        """'
@@ -150,8 +149,31 @@
         frag.write("self.{0}() == other.{0}()".format(list[i]))
     return frag.getvalue()
 
+class NewContent(StringIO.StringIO):
+    """Simple facade to keep track of the previous line to be committed."""
+    def __init__(self):
+        StringIO.StringIO.__init__(self)
+        self.prev_line = None
+    def add_line(self, a_line):
+        """Add a line to the content, if there is a previous line, commit it."""
+        if self.prev_line != None:
+            print >> self, self.prev_line
+        self.prev_line = a_line
+    def del_line(self):
+        """Forget about the previous line, do not commit it."""
+        self.prev_line = None
+    def del_blank_line(self):
+        """Forget about the previous line if it is a blank line."""
+        if self.prev_line != None and not self.prev_line.strip():
+            self.prev_line = None
+    def finish(self):
+        """Call this when you're finished with populating content."""
+        if self.prev_line != None:
+            print >> self, self.prev_line
+        self.prev_line = None
+
 # The new content will have the iteration protocol defined for our lldb objects.
-new_content = StringIO.StringIO()
+new_content = NewContent()
 
 with open(output_name, 'r') as f_in:
     content = f_in.read()
@@ -200,6 +222,9 @@
     # CLEANUP_DOCSTRING state or out of it.
     if line == toggle_docstring_cleanup_line:
         if state & CLEANUP_DOCSTRING:
+            # Special handling of the trailing blank line right before the '"""'
+            # end docstring marker.
+            new_content.del_blank_line()
             state ^= CLEANUP_DOCSTRING
         else:
             state |= CLEANUP_DOCSTRING
@@ -208,7 +233,7 @@
         match = class_pattern.search(line)
         # Inserts the lldb_iter() definition before the first class definition.
         if not lldb_iter_defined and match:
-            print >> new_content, lldb_iter_def
+            new_content.add_line(lldb_iter_def)
             lldb_iter_defined = True
 
         # If we are at the beginning of the class definitions, prepare to
@@ -231,15 +256,15 @@
             #
             # But note that SBTarget has two types of iterations.
             if cls == "SBTarget":
-                print >> new_content, module_iter % (d[cls]['module'])
-                print >> new_content, breakpoint_iter % (d[cls]['breakpoint'])
+                new_content.add_line(module_iter % (d[cls]['module']))
+                new_content.add_line(breakpoint_iter % (d[cls]['breakpoint']))
             else:
                 if (state & DEFINING_ITERATOR):
-                    print >> new_content, iter_def % d[cls]
-                    print >> new_content, len_def % d[cls][0]
+                    new_content.add_line(iter_def % d[cls])
+                    new_content.add_line(len_def % d[cls][0])
                 if (state & DEFINING_EQUALITY):
-                    print >> new_content, eq_def % (cls, list_to_frag(e[cls]))
-                    print >> new_content, ne_def
+                    new_content.add_line(eq_def % (cls, list_to_frag(e[cls])))
+                    new_content.add_line(ne_def)
 
             # Next state will be NORMAL.
             state = NORMAL
@@ -248,9 +273,10 @@
         # Cleanse the lldb.py of the autodoc'ed residues.
         if c_ifdef_swig in line or c_endif_swig in line:
             continue
-        # As well as the comment marker line and trailing blank line.
-        if c_comment_marker in line or line == trailing_blank_line:
+        # As well as the comment marker line.
+        if c_comment_marker in line:
             continue
+
         # Also remove the '\a ' and '\b 'substrings.
         line = line.replace('\a ', '')
         line = line.replace('\b ', '')
@@ -272,11 +298,14 @@
     # Look for 'def IsValid(*args):', and once located, add implementation
     # of truth value testing for this object by delegation.
     if isvalid_pattern.search(line):
-        print >> new_content, nonzero_def
+        new_content.add_line(nonzero_def)
 
     # Pass the original line of content to new_content.
-    print >> new_content, line
-    
+    new_content.add_line(line)
+
+# We are finished with recording new content.
+new_content.finish()
+
 with open(output_name, 'w') as f_out:
     f_out.write(new_content.getvalue())
     f_out.write("debugger_unique_id = 0\n")