162306a36Sopenharmony_ci// SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0 262306a36Sopenharmony_ci/****************************************************************************** 362306a36Sopenharmony_ci * 462306a36Sopenharmony_ci * Module Name: utascii - Utility ascii functions 562306a36Sopenharmony_ci * 662306a36Sopenharmony_ci * Copyright (C) 2000 - 2023, Intel Corp. 762306a36Sopenharmony_ci * 862306a36Sopenharmony_ci *****************************************************************************/ 962306a36Sopenharmony_ci 1062306a36Sopenharmony_ci#include <acpi/acpi.h> 1162306a36Sopenharmony_ci#include "accommon.h" 1262306a36Sopenharmony_ci 1362306a36Sopenharmony_ci/******************************************************************************* 1462306a36Sopenharmony_ci * 1562306a36Sopenharmony_ci * FUNCTION: acpi_ut_valid_nameseg 1662306a36Sopenharmony_ci * 1762306a36Sopenharmony_ci * PARAMETERS: name - The name or table signature to be examined. 1862306a36Sopenharmony_ci * Four characters, does not have to be a 1962306a36Sopenharmony_ci * NULL terminated string. 2062306a36Sopenharmony_ci * 2162306a36Sopenharmony_ci * RETURN: TRUE if signature is has 4 valid ACPI characters 2262306a36Sopenharmony_ci * 2362306a36Sopenharmony_ci * DESCRIPTION: Validate an ACPI table signature. 2462306a36Sopenharmony_ci * 2562306a36Sopenharmony_ci ******************************************************************************/ 2662306a36Sopenharmony_ci 2762306a36Sopenharmony_ciu8 acpi_ut_valid_nameseg(char *name) 2862306a36Sopenharmony_ci{ 2962306a36Sopenharmony_ci u32 i; 3062306a36Sopenharmony_ci 3162306a36Sopenharmony_ci /* Validate each character in the signature */ 3262306a36Sopenharmony_ci 3362306a36Sopenharmony_ci for (i = 0; i < ACPI_NAMESEG_SIZE; i++) { 3462306a36Sopenharmony_ci if (!acpi_ut_valid_name_char(name[i], i)) { 3562306a36Sopenharmony_ci return (FALSE); 3662306a36Sopenharmony_ci } 3762306a36Sopenharmony_ci } 3862306a36Sopenharmony_ci 3962306a36Sopenharmony_ci return (TRUE); 4062306a36Sopenharmony_ci} 4162306a36Sopenharmony_ci 4262306a36Sopenharmony_ci/******************************************************************************* 4362306a36Sopenharmony_ci * 4462306a36Sopenharmony_ci * FUNCTION: acpi_ut_valid_name_char 4562306a36Sopenharmony_ci * 4662306a36Sopenharmony_ci * PARAMETERS: char - The character to be examined 4762306a36Sopenharmony_ci * position - Byte position (0-3) 4862306a36Sopenharmony_ci * 4962306a36Sopenharmony_ci * RETURN: TRUE if the character is valid, FALSE otherwise 5062306a36Sopenharmony_ci * 5162306a36Sopenharmony_ci * DESCRIPTION: Check for a valid ACPI character. Must be one of: 5262306a36Sopenharmony_ci * 1) Upper case alpha 5362306a36Sopenharmony_ci * 2) numeric 5462306a36Sopenharmony_ci * 3) underscore 5562306a36Sopenharmony_ci * 5662306a36Sopenharmony_ci * We allow a '!' as the last character because of the ASF! table 5762306a36Sopenharmony_ci * 5862306a36Sopenharmony_ci ******************************************************************************/ 5962306a36Sopenharmony_ci 6062306a36Sopenharmony_ciu8 acpi_ut_valid_name_char(char character, u32 position) 6162306a36Sopenharmony_ci{ 6262306a36Sopenharmony_ci 6362306a36Sopenharmony_ci if (!((character >= 'A' && character <= 'Z') || 6462306a36Sopenharmony_ci (character >= '0' && character <= '9') || (character == '_'))) { 6562306a36Sopenharmony_ci 6662306a36Sopenharmony_ci /* Allow a '!' in the last position */ 6762306a36Sopenharmony_ci 6862306a36Sopenharmony_ci if (character == '!' && position == 3) { 6962306a36Sopenharmony_ci return (TRUE); 7062306a36Sopenharmony_ci } 7162306a36Sopenharmony_ci 7262306a36Sopenharmony_ci return (FALSE); 7362306a36Sopenharmony_ci } 7462306a36Sopenharmony_ci 7562306a36Sopenharmony_ci return (TRUE); 7662306a36Sopenharmony_ci} 7762306a36Sopenharmony_ci 7862306a36Sopenharmony_ci/******************************************************************************* 7962306a36Sopenharmony_ci * 8062306a36Sopenharmony_ci * FUNCTION: acpi_ut_check_and_repair_ascii 8162306a36Sopenharmony_ci * 8262306a36Sopenharmony_ci * PARAMETERS: name - Ascii string 8362306a36Sopenharmony_ci * count - Number of characters to check 8462306a36Sopenharmony_ci * 8562306a36Sopenharmony_ci * RETURN: None 8662306a36Sopenharmony_ci * 8762306a36Sopenharmony_ci * DESCRIPTION: Ensure that the requested number of characters are printable 8862306a36Sopenharmony_ci * Ascii characters. Sets non-printable and null chars to <space>. 8962306a36Sopenharmony_ci * 9062306a36Sopenharmony_ci ******************************************************************************/ 9162306a36Sopenharmony_ci 9262306a36Sopenharmony_civoid acpi_ut_check_and_repair_ascii(u8 *name, char *repaired_name, u32 count) 9362306a36Sopenharmony_ci{ 9462306a36Sopenharmony_ci u32 i; 9562306a36Sopenharmony_ci 9662306a36Sopenharmony_ci for (i = 0; i < count; i++) { 9762306a36Sopenharmony_ci repaired_name[i] = (char)name[i]; 9862306a36Sopenharmony_ci 9962306a36Sopenharmony_ci if (!name[i]) { 10062306a36Sopenharmony_ci return; 10162306a36Sopenharmony_ci } 10262306a36Sopenharmony_ci if (!isprint(name[i])) { 10362306a36Sopenharmony_ci repaired_name[i] = ' '; 10462306a36Sopenharmony_ci } 10562306a36Sopenharmony_ci } 10662306a36Sopenharmony_ci} 107