xref: /OK3568_Linux_fs/kernel/drivers/acpi/acpica/utascii.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun // SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0
2*4882a593Smuzhiyun /******************************************************************************
3*4882a593Smuzhiyun  *
4*4882a593Smuzhiyun  * Module Name: utascii - Utility ascii functions
5*4882a593Smuzhiyun  *
6*4882a593Smuzhiyun  * Copyright (C) 2000 - 2020, Intel Corp.
7*4882a593Smuzhiyun  *
8*4882a593Smuzhiyun  *****************************************************************************/
9*4882a593Smuzhiyun 
10*4882a593Smuzhiyun #include <acpi/acpi.h>
11*4882a593Smuzhiyun #include "accommon.h"
12*4882a593Smuzhiyun 
13*4882a593Smuzhiyun /*******************************************************************************
14*4882a593Smuzhiyun  *
15*4882a593Smuzhiyun  * FUNCTION:    acpi_ut_valid_nameseg
16*4882a593Smuzhiyun  *
17*4882a593Smuzhiyun  * PARAMETERS:  name            - The name or table signature to be examined.
18*4882a593Smuzhiyun  *                                Four characters, does not have to be a
19*4882a593Smuzhiyun  *                                NULL terminated string.
20*4882a593Smuzhiyun  *
21*4882a593Smuzhiyun  * RETURN:      TRUE if signature is has 4 valid ACPI characters
22*4882a593Smuzhiyun  *
23*4882a593Smuzhiyun  * DESCRIPTION: Validate an ACPI table signature.
24*4882a593Smuzhiyun  *
25*4882a593Smuzhiyun  ******************************************************************************/
26*4882a593Smuzhiyun 
acpi_ut_valid_nameseg(char * name)27*4882a593Smuzhiyun u8 acpi_ut_valid_nameseg(char *name)
28*4882a593Smuzhiyun {
29*4882a593Smuzhiyun 	u32 i;
30*4882a593Smuzhiyun 
31*4882a593Smuzhiyun 	/* Validate each character in the signature */
32*4882a593Smuzhiyun 
33*4882a593Smuzhiyun 	for (i = 0; i < ACPI_NAMESEG_SIZE; i++) {
34*4882a593Smuzhiyun 		if (!acpi_ut_valid_name_char(name[i], i)) {
35*4882a593Smuzhiyun 			return (FALSE);
36*4882a593Smuzhiyun 		}
37*4882a593Smuzhiyun 	}
38*4882a593Smuzhiyun 
39*4882a593Smuzhiyun 	return (TRUE);
40*4882a593Smuzhiyun }
41*4882a593Smuzhiyun 
42*4882a593Smuzhiyun /*******************************************************************************
43*4882a593Smuzhiyun  *
44*4882a593Smuzhiyun  * FUNCTION:    acpi_ut_valid_name_char
45*4882a593Smuzhiyun  *
46*4882a593Smuzhiyun  * PARAMETERS:  char            - The character to be examined
47*4882a593Smuzhiyun  *              position        - Byte position (0-3)
48*4882a593Smuzhiyun  *
49*4882a593Smuzhiyun  * RETURN:      TRUE if the character is valid, FALSE otherwise
50*4882a593Smuzhiyun  *
51*4882a593Smuzhiyun  * DESCRIPTION: Check for a valid ACPI character. Must be one of:
52*4882a593Smuzhiyun  *              1) Upper case alpha
53*4882a593Smuzhiyun  *              2) numeric
54*4882a593Smuzhiyun  *              3) underscore
55*4882a593Smuzhiyun  *
56*4882a593Smuzhiyun  *              We allow a '!' as the last character because of the ASF! table
57*4882a593Smuzhiyun  *
58*4882a593Smuzhiyun  ******************************************************************************/
59*4882a593Smuzhiyun 
acpi_ut_valid_name_char(char character,u32 position)60*4882a593Smuzhiyun u8 acpi_ut_valid_name_char(char character, u32 position)
61*4882a593Smuzhiyun {
62*4882a593Smuzhiyun 
63*4882a593Smuzhiyun 	if (!((character >= 'A' && character <= 'Z') ||
64*4882a593Smuzhiyun 	      (character >= '0' && character <= '9') || (character == '_'))) {
65*4882a593Smuzhiyun 
66*4882a593Smuzhiyun 		/* Allow a '!' in the last position */
67*4882a593Smuzhiyun 
68*4882a593Smuzhiyun 		if (character == '!' && position == 3) {
69*4882a593Smuzhiyun 			return (TRUE);
70*4882a593Smuzhiyun 		}
71*4882a593Smuzhiyun 
72*4882a593Smuzhiyun 		return (FALSE);
73*4882a593Smuzhiyun 	}
74*4882a593Smuzhiyun 
75*4882a593Smuzhiyun 	return (TRUE);
76*4882a593Smuzhiyun }
77*4882a593Smuzhiyun 
78*4882a593Smuzhiyun /*******************************************************************************
79*4882a593Smuzhiyun  *
80*4882a593Smuzhiyun  * FUNCTION:    acpi_ut_check_and_repair_ascii
81*4882a593Smuzhiyun  *
82*4882a593Smuzhiyun  * PARAMETERS:  name                - Ascii string
83*4882a593Smuzhiyun  *              count               - Number of characters to check
84*4882a593Smuzhiyun  *
85*4882a593Smuzhiyun  * RETURN:      None
86*4882a593Smuzhiyun  *
87*4882a593Smuzhiyun  * DESCRIPTION: Ensure that the requested number of characters are printable
88*4882a593Smuzhiyun  *              Ascii characters. Sets non-printable and null chars to <space>.
89*4882a593Smuzhiyun  *
90*4882a593Smuzhiyun  ******************************************************************************/
91*4882a593Smuzhiyun 
acpi_ut_check_and_repair_ascii(u8 * name,char * repaired_name,u32 count)92*4882a593Smuzhiyun void acpi_ut_check_and_repair_ascii(u8 *name, char *repaired_name, u32 count)
93*4882a593Smuzhiyun {
94*4882a593Smuzhiyun 	u32 i;
95*4882a593Smuzhiyun 
96*4882a593Smuzhiyun 	for (i = 0; i < count; i++) {
97*4882a593Smuzhiyun 		repaired_name[i] = (char)name[i];
98*4882a593Smuzhiyun 
99*4882a593Smuzhiyun 		if (!name[i]) {
100*4882a593Smuzhiyun 			return;
101*4882a593Smuzhiyun 		}
102*4882a593Smuzhiyun 		if (!isprint(name[i])) {
103*4882a593Smuzhiyun 			repaired_name[i] = ' ';
104*4882a593Smuzhiyun 		}
105*4882a593Smuzhiyun 	}
106*4882a593Smuzhiyun }
107