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