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 - 2023, 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 | |
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(character: name[i], position: 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 | |
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 | |
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 | |