195857638SErik Schmauss // SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0
26a0df32cSBob Moore /******************************************************************************
36a0df32cSBob Moore *
46a0df32cSBob Moore * Module Name: utascii - Utility ascii functions
56a0df32cSBob Moore *
6*612c2932SBob Moore * Copyright (C) 2000 - 2023, Intel Corp.
76a0df32cSBob Moore *
895857638SErik Schmauss *****************************************************************************/
96a0df32cSBob Moore
106a0df32cSBob Moore #include <acpi/acpi.h>
116a0df32cSBob Moore #include "accommon.h"
126a0df32cSBob Moore
136a0df32cSBob Moore /*******************************************************************************
146a0df32cSBob Moore *
156a0df32cSBob Moore * FUNCTION: acpi_ut_valid_nameseg
166a0df32cSBob Moore *
176a0df32cSBob Moore * PARAMETERS: name - The name or table signature to be examined.
186a0df32cSBob Moore * Four characters, does not have to be a
196a0df32cSBob Moore * NULL terminated string.
206a0df32cSBob Moore *
216a0df32cSBob Moore * RETURN: TRUE if signature is has 4 valid ACPI characters
226a0df32cSBob Moore *
236a0df32cSBob Moore * DESCRIPTION: Validate an ACPI table signature.
246a0df32cSBob Moore *
256a0df32cSBob Moore ******************************************************************************/
266a0df32cSBob Moore
acpi_ut_valid_nameseg(char * name)276a0df32cSBob Moore u8 acpi_ut_valid_nameseg(char *name)
286a0df32cSBob Moore {
296a0df32cSBob Moore u32 i;
306a0df32cSBob Moore
316a0df32cSBob Moore /* Validate each character in the signature */
326a0df32cSBob Moore
3332786755SBob Moore for (i = 0; i < ACPI_NAMESEG_SIZE; i++) {
346a0df32cSBob Moore if (!acpi_ut_valid_name_char(name[i], i)) {
356a0df32cSBob Moore return (FALSE);
366a0df32cSBob Moore }
376a0df32cSBob Moore }
386a0df32cSBob Moore
396a0df32cSBob Moore return (TRUE);
406a0df32cSBob Moore }
416a0df32cSBob Moore
426a0df32cSBob Moore /*******************************************************************************
436a0df32cSBob Moore *
446a0df32cSBob Moore * FUNCTION: acpi_ut_valid_name_char
456a0df32cSBob Moore *
466a0df32cSBob Moore * PARAMETERS: char - The character to be examined
476a0df32cSBob Moore * position - Byte position (0-3)
486a0df32cSBob Moore *
496a0df32cSBob Moore * RETURN: TRUE if the character is valid, FALSE otherwise
506a0df32cSBob Moore *
516a0df32cSBob Moore * DESCRIPTION: Check for a valid ACPI character. Must be one of:
526a0df32cSBob Moore * 1) Upper case alpha
536a0df32cSBob Moore * 2) numeric
546a0df32cSBob Moore * 3) underscore
556a0df32cSBob Moore *
566a0df32cSBob Moore * We allow a '!' as the last character because of the ASF! table
576a0df32cSBob Moore *
586a0df32cSBob Moore ******************************************************************************/
596a0df32cSBob Moore
acpi_ut_valid_name_char(char character,u32 position)606a0df32cSBob Moore u8 acpi_ut_valid_name_char(char character, u32 position)
616a0df32cSBob Moore {
626a0df32cSBob Moore
636a0df32cSBob Moore if (!((character >= 'A' && character <= 'Z') ||
646a0df32cSBob Moore (character >= '0' && character <= '9') || (character == '_'))) {
656a0df32cSBob Moore
666a0df32cSBob Moore /* Allow a '!' in the last position */
676a0df32cSBob Moore
686a0df32cSBob Moore if (character == '!' && position == 3) {
696a0df32cSBob Moore return (TRUE);
706a0df32cSBob Moore }
716a0df32cSBob Moore
726a0df32cSBob Moore return (FALSE);
736a0df32cSBob Moore }
746a0df32cSBob Moore
756a0df32cSBob Moore return (TRUE);
766a0df32cSBob Moore }
776a0df32cSBob Moore
786a0df32cSBob Moore /*******************************************************************************
796a0df32cSBob Moore *
806a0df32cSBob Moore * FUNCTION: acpi_ut_check_and_repair_ascii
816a0df32cSBob Moore *
826a0df32cSBob Moore * PARAMETERS: name - Ascii string
836a0df32cSBob Moore * count - Number of characters to check
846a0df32cSBob Moore *
856a0df32cSBob Moore * RETURN: None
866a0df32cSBob Moore *
876a0df32cSBob Moore * DESCRIPTION: Ensure that the requested number of characters are printable
886a0df32cSBob Moore * Ascii characters. Sets non-printable and null chars to <space>.
896a0df32cSBob Moore *
906a0df32cSBob Moore ******************************************************************************/
916a0df32cSBob Moore
acpi_ut_check_and_repair_ascii(u8 * name,char * repaired_name,u32 count)926a0df32cSBob Moore void acpi_ut_check_and_repair_ascii(u8 *name, char *repaired_name, u32 count)
936a0df32cSBob Moore {
946a0df32cSBob Moore u32 i;
956a0df32cSBob Moore
966a0df32cSBob Moore for (i = 0; i < count; i++) {
976a0df32cSBob Moore repaired_name[i] = (char)name[i];
986a0df32cSBob Moore
996a0df32cSBob Moore if (!name[i]) {
1006a0df32cSBob Moore return;
1016a0df32cSBob Moore }
1026a0df32cSBob Moore if (!isprint(name[i])) {
1036a0df32cSBob Moore repaired_name[i] = ' ';
1046a0df32cSBob Moore }
1056a0df32cSBob Moore }
1066a0df32cSBob Moore }
107