|
@@ -24,6 +24,14 @@ def _get_chunks(it, size):
|
|
|
return iter(lambda: tuple(islice(it, size)), ())
|
|
|
|
|
|
|
|
|
+def _preprocess_c_file(file):
|
|
|
+ """Load file and strip comments
|
|
|
+ """
|
|
|
+ file_contents = file.read_text(encoding='utf-8')
|
|
|
+ file_contents = comment_remover(file_contents)
|
|
|
+ return file_contents.replace('\\\n', '')
|
|
|
+
|
|
|
+
|
|
|
def strip_line_comment(string):
|
|
|
"""Removes comments from a single line string.
|
|
|
"""
|
|
@@ -58,9 +66,7 @@ def find_layouts(file):
|
|
|
parsed_layouts = {}
|
|
|
|
|
|
# Search the file for LAYOUT macros and aliases
|
|
|
- file_contents = file.read_text(encoding='utf-8')
|
|
|
- file_contents = comment_remover(file_contents)
|
|
|
- file_contents = file_contents.replace('\\\n', '')
|
|
|
+ file_contents = _preprocess_c_file(file)
|
|
|
|
|
|
for line in file_contents.split('\n'):
|
|
|
if layout_macro_define_regex.match(line.lstrip()) and '(' in line and 'LAYOUT' in line:
|
|
@@ -205,13 +211,23 @@ def _coerce_led_token(_type, value):
|
|
|
return value_map[value]
|
|
|
|
|
|
|
|
|
+def _validate_led_config(matrix, matrix_rows, 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")
|
|
|
+ if len(position) != len(flags):
|
|
|
+ raise ValueError("Unable to parse g_led_config position data")
|
|
|
+ if len(matrix_indexes) and (max(matrix_indexes) >= len(flags)):
|
|
|
+ raise ValueError("OOB within g_led_config matrix data")
|
|
|
+ if not all(isinstance(n, int) for n in matrix_indexes):
|
|
|
+ raise ValueError("matrix indexes are not all ints")
|
|
|
+ if (len(position_raw) % 2) != 0:
|
|
|
+ raise ValueError("Malformed g_led_config position data")
|
|
|
+
|
|
|
+
|
|
|
def _parse_led_config(file, matrix_cols, matrix_rows):
|
|
|
"""Return any 'raw' led/rgb matrix config
|
|
|
"""
|
|
|
- file_contents = file.read_text(encoding='utf-8')
|
|
|
- file_contents = comment_remover(file_contents)
|
|
|
- file_contents = file_contents.replace('\\\n', '')
|
|
|
-
|
|
|
matrix_raw = []
|
|
|
position_raw = []
|
|
|
flags = []
|
|
@@ -219,7 +235,7 @@ def _parse_led_config(file, matrix_cols, matrix_rows):
|
|
|
found_led_config = False
|
|
|
bracket_count = 0
|
|
|
section = 0
|
|
|
- for _type, value in lex(file_contents, CLexer()):
|
|
|
+ for _type, value in lex(_preprocess_c_file(file), CLexer()):
|
|
|
# Assume g_led_config..stuff..;
|
|
|
if value == 'g_led_config':
|
|
|
found_led_config = True
|
|
@@ -248,17 +264,12 @@ def _parse_led_config(file, matrix_cols, matrix_rows):
|
|
|
position = list(_get_chunks(position_raw, 2))
|
|
|
matrix_indexes = list(filter(lambda x: x is not None, matrix_raw))
|
|
|
|
|
|
- # If we have not found anything - bail
|
|
|
+ # If we have not found anything - bail with no error
|
|
|
if not section:
|
|
|
return None
|
|
|
|
|
|
- # 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")
|
|
|
- if len(position) != len(flags):
|
|
|
- raise ValueError("Unable to parse g_led_config position data")
|
|
|
- if len(matrix_indexes) and (max(matrix_indexes) >= len(flags)):
|
|
|
- raise ValueError("OOB within g_led_config matrix data")
|
|
|
+ # Throw any validation errors
|
|
|
+ _validate_led_config(matrix, matrix_rows, matrix_indexes, position, position_raw, flags)
|
|
|
|
|
|
return (matrix, position, flags)
|
|
|
|