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