Check all rows have the correct number of columns when parsing g_led_config
(#19954)
This commit is contained in:
parent
f1894e4bac
commit
9b09e7c6d7
@ -211,10 +211,13 @@ def _coerce_led_token(_type, value):
|
|||||||
return value_map[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
|
# TODO: Improve crude parsing/validation
|
||||||
if len(matrix) != matrix_rows and len(matrix) != (matrix_rows / 2):
|
if len(matrix) != matrix_rows and len(matrix) != (matrix_rows / 2):
|
||||||
raise ValueError("Unable to parse g_led_config matrix data")
|
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):
|
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)})")
|
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)):
|
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):
|
def _parse_led_config(file, matrix_cols, matrix_rows):
|
||||||
"""Return any 'raw' led/rgb matrix config
|
"""Return any 'raw' led/rgb matrix config
|
||||||
"""
|
"""
|
||||||
matrix_raw = []
|
matrix = []
|
||||||
position_raw = []
|
position_raw = []
|
||||||
flags = []
|
flags = []
|
||||||
|
|
||||||
found_led_config = False
|
found_led_config = False
|
||||||
bracket_count = 0
|
bracket_count = 0
|
||||||
section = 0
|
section = 0
|
||||||
|
current_row_index = 0
|
||||||
|
current_row = []
|
||||||
|
|
||||||
for _type, value in lex(_preprocess_c_file(file), CLexer()):
|
for _type, value in lex(_preprocess_c_file(file), CLexer()):
|
||||||
# Assume g_led_config..stuff..;
|
# Assume g_led_config..stuff..;
|
||||||
if value == 'g_led_config':
|
if value == 'g_led_config':
|
||||||
@ -248,12 +254,16 @@ def _parse_led_config(file, matrix_cols, matrix_rows):
|
|||||||
if bracket_count == 2:
|
if bracket_count == 2:
|
||||||
section += 1
|
section += 1
|
||||||
elif value == '}':
|
elif value == '}':
|
||||||
|
if section == 1 and bracket_count == 3:
|
||||||
|
matrix.append(current_row)
|
||||||
|
current_row = []
|
||||||
|
current_row_index += 1
|
||||||
bracket_count -= 1
|
bracket_count -= 1
|
||||||
else:
|
else:
|
||||||
# Assume any non whitespace value here is important enough to stash
|
# 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 _type in [Token.Literal.Number.Integer, Token.Literal.Number.Float, Token.Literal.Number.Hex, Token.Name]:
|
||||||
if section == 1 and bracket_count == 3:
|
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:
|
if section == 2 and bracket_count == 3:
|
||||||
position_raw.append(_coerce_led_token(_type, value))
|
position_raw.append(_coerce_led_token(_type, value))
|
||||||
if section == 3 and bracket_count == 2:
|
if section == 3 and bracket_count == 2:
|
||||||
@ -263,16 +273,15 @@ def _parse_led_config(file, matrix_cols, matrix_rows):
|
|||||||
return None
|
return None
|
||||||
|
|
||||||
# Slightly better intrim format
|
# Slightly better intrim format
|
||||||
matrix = list(_get_chunks(matrix_raw, matrix_cols))
|
|
||||||
position = list(_get_chunks(position_raw, 2))
|
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 we have not found anything - bail with no error
|
||||||
if not section:
|
if not section:
|
||||||
return None
|
return None
|
||||||
|
|
||||||
# Throw any validation errors
|
# 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)
|
return (matrix, position, flags)
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user