From 1dc7f0427b60851593b84ca8cffd1adb5f7e0510 Mon Sep 17 00:00:00 2001
From: stijn <stinos@zoho.com>
Date: Fri, 2 May 2014 21:10:47 +0200
Subject: [PATCH] More relaxed parsing of preprocessed qstr header

The original parsing would error out on any C declarations that are not typedefs
or extern variables. This limits what can go in mpconfig.h and mpconfigport.h,
as they are included in qstr.h. For instance even a function declaration would be
rejected and including system headers is a complete no-go.
That seems too limiting for a global config header, so makeqstrdata now
ignores everything that does not match a qstr definition.
---
 py/makeqstrdata.py | 34 +++-------------------------------
 1 file changed, 3 insertions(+), 31 deletions(-)

diff --git a/py/makeqstrdata.py b/py/makeqstrdata.py
index 34413f0be..2ec5a1fb6 100644
--- a/py/makeqstrdata.py
+++ b/py/makeqstrdata.py
@@ -29,43 +29,15 @@ def compute_hash(qstr):
         hash = (hash * 33) ^ ord(char)
     return hash & 0xffff
 
-# given a list of (name,regex) pairs, find the first one that matches the given line
-def re_match_first(regexs, line):
-    for name, regex in regexs:
-        match = re.match(regex, line)
-        if match:
-            return name, match
-    return None, None
-
-# regexs to recognise lines that the CPP emits
-# use a list so that matching order is honoured
-cpp_regexs = [
-    ('qstr', r'Q\((.+)\)$'),
-    ('cdecl', r'(typedef|extern) [A-Za-z0-9_* ]+;$')
-]
-
 def do_work(infiles):
     # read the qstrs in from the input files
     qstrs = {}
     for infile in infiles:
         with open(infile, 'rt') as f:
-            line_number = 0
             for line in f:
-                line_number += 1
-                line = line.strip()
-
-                # ignore blank lines, comments and preprocessor directives
-                if len(line) == 0 or line.startswith('//') or line.startswith('#'):
-                    continue
-
-                # work out what kind of line it is
-                match_kind, match = re_match_first(cpp_regexs, line)
-                if match_kind is None:
-                    # unknown line format
-                    print('({}:{}) bad qstr format, got {}'.format(infile, line_number, line), file=sys.stderr)
-                    return False
-                elif match_kind != 'qstr':
-                    # not a line with a qstr
+                # is this a QSTR line?
+                match = re.match(r'^Q\((.+)\)$', line.strip())
+                if not match:
                     continue
 
                 # get the qstr value
-- 
GitLab