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