summary refs log tree commit diff
path: root/lib/python
diff options
context:
space:
mode:
Diffstat (limited to 'lib/python')
-rw-r--r--lib/python/qmk/c_parse.py21
1 files changed, 15 insertions, 6 deletions
diff --git a/lib/python/qmk/c_parse.py b/lib/python/qmk/c_parse.py
index 3d73e66091..560e5d3264 100644
--- a/lib/python/qmk/c_parse.py
+++ b/lib/python/qmk/c_parse.py
@@ -211,10 +211,13 @@ def _coerce_led_token(_type, value):
         return value_map[value]
 
 
-def _validate_led_config(matrix, matrix_rows, matrix_indexes, position, position_raw, flags):
+def _validate_led_config(matrix, matrix_rows, matrix_cols, matrix_indexes, position, position_raw, flags):
     # TODO: Improve crude parsing/validation
     if len(matrix) != matrix_rows and len(matrix) != (matrix_rows / 2):
         raise ValueError("Unable to parse g_led_config matrix data")
+    for index, row in enumerate(matrix):
+        if len(row) != matrix_cols:
+            raise ValueError(f"Number of columns in row {index} ({len(row)}) does not match matrix ({matrix_cols})")
     if len(position) != len(flags):
         raise ValueError(f"Number of g_led_config physical positions ({len(position)}) does not match number of flags ({len(flags)})")
     if len(matrix_indexes) and (max(matrix_indexes) >= len(flags)):
@@ -228,13 +231,16 @@ def _validate_led_config(matrix, matrix_rows, matrix_indexes, position, position
 def _parse_led_config(file, matrix_cols, matrix_rows):
     """Return any 'raw' led/rgb matrix config
     """
-    matrix_raw = []
+    matrix = []
     position_raw = []
     flags = []
 
     found_led_config = False
     bracket_count = 0
     section = 0
+    current_row_index = 0
+    current_row = []
+
     for _type, value in lex(_preprocess_c_file(file), CLexer()):
         # Assume g_led_config..stuff..;
         if value == 'g_led_config':
@@ -248,12 +254,16 @@ def _parse_led_config(file, matrix_cols, matrix_rows):
                 if bracket_count == 2:
                     section += 1
             elif value == '}':
+                if section == 1 and bracket_count == 3:
+                    matrix.append(current_row)
+                    current_row = []
+                    current_row_index += 1
                 bracket_count -= 1
             else:
                 # Assume any non whitespace value here is important enough to stash
                 if _type in [Token.Literal.Number.Integer, Token.Literal.Number.Float, Token.Literal.Number.Hex, Token.Name]:
                     if section == 1 and bracket_count == 3:
-                        matrix_raw.append(_coerce_led_token(_type, value))
+                        current_row.append(_coerce_led_token(_type, value))
                     if section == 2 and bracket_count == 3:
                         position_raw.append(_coerce_led_token(_type, value))
                     if section == 3 and bracket_count == 2:
@@ -263,16 +273,15 @@ def _parse_led_config(file, matrix_cols, matrix_rows):
                     return None
 
     # Slightly better intrim format
-    matrix = list(_get_chunks(matrix_raw, matrix_cols))
     position = list(_get_chunks(position_raw, 2))
-    matrix_indexes = list(filter(lambda x: x is not None, matrix_raw))
+    matrix_indexes = list(filter(lambda x: x is not None, sum(matrix, [])))
 
     # If we have not found anything - bail with no error
     if not section:
         return None
 
     # Throw any validation errors
-    _validate_led_config(matrix, matrix_rows, matrix_indexes, position, position_raw, flags)
+    _validate_led_config(matrix, matrix_rows, matrix_cols, matrix_indexes, position, position_raw, flags)
 
     return (matrix, position, flags)