[Piglit] [PATCH 07/12] glsl_parser_test.py: Vastly simplify the way the config is parsed

Dylan Baker baker.dylan.c at gmail.com
Tue Feb 11 18:11:12 PST 2014


This reduces the complexity of the code that searches for config section
and writes it into a StringIO. The new code just looks for a comment
followed by [config] to open the section and a comment followed by [end
config] to close it. It naively slurps up everything in between.

Signed-off-by: Dylan Baker <baker.dylan.c at gmail.com>
---
 framework/glsl_parser_test.py | 85 ++++++++++++++++---------------------------
 1 file changed, 32 insertions(+), 53 deletions(-)

diff --git a/framework/glsl_parser_test.py b/framework/glsl_parser_test.py
index 0c3c900..40271b0 100644
--- a/framework/glsl_parser_test.py
+++ b/framework/glsl_parser_test.py
@@ -84,64 +84,43 @@ def glsl_parser_test(filepath):
     # Text of config section.
     text_io = StringIO()
 
-    # Parsing state.
-    PARSE_FIND_START = 0
-    PARSE_IN_CONFIG = 1
-    PARSE_DONE = 2
-    PARSE_ERROR = 3
-    parse_state = PARSE_FIND_START
-
-    # Regexen that change parser state.
-    start = re.compile(r'\A(?P<indent>\s*(|//|/\*|\*)\s*)'
-                       '(?P<content>\[config\]\s*\n)\Z')
-    empty = None  # Empty line in config body.
-    internal = None  # Non-empty line in config body.
-    end = None  # Marks end of config body.
+    # Create a regex that can find all commented lines that contain content
+    is_header = re.compile(r'\s*(//|/\*|\*)\s*\[(config|end\sconfig)\]')
+    is_config = False
 
     # Parse the config file and get the config section, then write this section
     # to a StringIO and pass that to ConfigParser
-    with open(filepath, 'r') as f:
-        for line in f:
-            if parse_state == PARSE_FIND_START:
-                m = start.match(line)
-                if m:
-                    parse_state = PARSE_IN_CONFIG
-                    text_io.write(m.group('content'))
-                    indent = '.' * len(m.group('indent'))
-                    empty = re.compile(r'\A\s*(|//|/\*|\*)\s*\n\Z')
-                    internal = re.compile(r'\A{indent}(?P<content>'
-                                          '.*\n)\Z'.format(indent=indent))
-                    end = re.compile(r'\A{indent}\[end( |_)'
-                                     'config\]\s*\n\Z'.format(indent=indent))
-            elif parse_state == PARSE_IN_CONFIG:
-                if start.match(line):
-                    parse_state = PARSE_ERROR
+    with open(filepath, 'r') as testfile:
+        for line in testfile:
+            if is_header.match(line):
+                # If we hit this when is_config is true that makes it our the
+                # end of the config, and we can stop
+                if is_config:
                     break
-                if end.match(line):
-                    parse_state = PARSE_DONE
-                    break
-                m = internal.match(line)
-                if m:
-                    text_io.write(m.group('content'))
-                    continue
-                m = empty.match(line)
-                if m:
-                    text_io.write('\n')
+                is_config = True
+            if is_config:
+                # Remove all leading whitespace
+                temp = line.strip()
+
+                # If the starting character is a two character comment remove
+                # that and any newly revealed whitespace, then write it into
+                # the StringIO
+                if temp[:2] in ['//', '/*', '*/']:
+                    text_io.write(temp[2:].lstrip() + '\n')
+                # If we have just * then we're in the middle of a C style
+                # comment, do like above
+                elif temp[:1] == '*':
+                    text_io.write(temp[1:].lstrip() + '\n')
+                # If strip renendered '' that means we had a blank newline,
+                # just go on
+                elif temp == '':
                     continue
-                parse_state = PARSE_ERROR
-                break
-
-    if parse_state == PARSE_DONE:
-        pass
-    elif parse_state == PARSE_FIND_START:
-        raise GLSLParserException("Failed to find start of config section")
-    elif parse_state == PARSE_IN_CONFIG:
-        raise GLSLParserException("Failed to find end of config section")
-    elif parse_state == PARSE_ERROR:
-        raise GLSLParserException("Failed to parse config section. This is "
-                                  "most likely due to whitespace")
-    else:
-        raise GLSLParserException("How did you hit this? This shouldnt happen")
+                else:
+                    raise GLSLParserException(
+                        "The config section is malformed."
+                        "Check file {0}".format(filepath))
+        else:
+            raise GLSLParserException("No [end config] section found!")
 
     config = ConfigParser.SafeConfigParser(defaults={'require_extensions': '',
                                                      'check_link': 'false'})
-- 
1.8.5.4



More information about the Piglit mailing list