xref: /openbmc/linux/drivers/acpi/acpica/utascii.c (revision 1ac731c529cd4d6adbce134754b51ff7d822b145)
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