Check all rows have the correct number of columns when parsing g_led_config (#19954)

This commit is contained in:
Ryan 2023-03-01 12:51:18 +11:00 committed by GitHub
parent f1894e4bac
commit 9b09e7c6d7
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -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)