tools/trace: Do a better job at comparing multi line strings.
authorJosé Fonseca <jfonseca@vmware.com>
Fri, 21 Jun 2013 10:08:56 +0000 (11:08 +0100)
committerJosé Fonseca <jfonseca@vmware.com>
Fri, 21 Jun 2013 13:30:20 +0000 (14:30 +0100)
For TGSI diffing.
Reviewed-by: Brian Paul <brianp@vmware.com>
src/gallium/tools/trace/diff_state.py

index 470aeda059b8f2723ddf6796394507f8e347ee2d..00853bacbf76619e3082513e273ef81f69558c7f 100755 (executable)
@@ -28,6 +28,7 @@
 import json
 import optparse
 import re
+import difflib
 import sys
 
 
@@ -131,7 +132,7 @@ class Dumper(Visitor):
         self._write(']')
 
     def visitValue(self, node):
-        self._write(json.dumps(node))
+        self._write(json.dumps(node, allow_nan=True))
 
 
 
@@ -246,6 +247,38 @@ class Differ(Visitor):
             self.replace(a, b)
 
     def replace(self, a, b):
+        if isinstance(a, basestring) and isinstance(b, basestring):
+            if '\n' in a or '\n' in b:
+                a = a.splitlines()
+                b = b.splitlines()
+                differ = difflib.Differ()
+                result = differ.compare(a, b)
+                self.dumper.level += 1
+                for entry in result:
+                    self.dumper._newline()
+                    self.dumper._indent()
+                    tag = entry[:2]
+                    text = entry[2:]
+                    if tag == '? ':
+                        tag = '  '
+                        prefix = ' '
+                        text = text.rstrip()
+                        suffix = ''
+                    else:
+                        prefix = '"'
+                        suffix = '\\n"'
+                    line = tag + prefix + text + suffix
+                    self.dumper._write(line)
+                self.dumper.level -= 1
+                return
+        self.dumper.visit(a)
+        self.dumper._write(' -> ')
+        self.dumper.visit(b)
+
+    def isMultilineString(self, value):
+        return isinstance(value, basestring) and '\n' in value
+    
+    def replaceMultilineString(self, a, b):
         self.dumper.visit(a)
         self.dumper._write(' -> ')
         self.dumper.visit(b)