Branch data Line data Source code
1 : : // SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0 2 : : /******************************************************************************* 3 : : * 4 : : * Module Name: utstring - Common functions for strings and characters 5 : : * 6 : : ******************************************************************************/ 7 : : 8 : : #include <acpi/acpi.h> 9 : : #include "accommon.h" 10 : : #include "acnamesp.h" 11 : : 12 : : #define _COMPONENT ACPI_UTILITIES 13 : : ACPI_MODULE_NAME("utstring") 14 : : 15 : : /******************************************************************************* 16 : : * 17 : : * FUNCTION: acpi_ut_print_string 18 : : * 19 : : * PARAMETERS: string - Null terminated ASCII string 20 : : * max_length - Maximum output length. Used to constrain the 21 : : * length of strings during debug output only. 22 : : * 23 : : * RETURN: None 24 : : * 25 : : * DESCRIPTION: Dump an ASCII string with support for ACPI-defined escape 26 : : * sequences. 27 : : * 28 : : ******************************************************************************/ 29 : 0 : void acpi_ut_print_string(char *string, u16 max_length) 30 : : { 31 : 0 : u32 i; 32 : : 33 [ # # ]: 0 : if (!string) { 34 : 0 : acpi_os_printf("<\"NULL STRING PTR\">"); 35 : 0 : return; 36 : : } 37 : : 38 : 0 : acpi_os_printf("\""); 39 [ # # # # ]: 0 : for (i = 0; (i < max_length) && string[i]; i++) { 40 : : 41 : : /* Escape sequences */ 42 : : 43 [ # # # # : 0 : switch (string[i]) { # # # # # ] 44 : 0 : case 0x07: 45 : : 46 : 0 : acpi_os_printf("\\a"); /* BELL */ 47 : 0 : break; 48 : : 49 : 0 : case 0x08: 50 : : 51 : 0 : acpi_os_printf("\\b"); /* BACKSPACE */ 52 : 0 : break; 53 : : 54 : 0 : case 0x0C: 55 : : 56 : 0 : acpi_os_printf("\\f"); /* FORMFEED */ 57 : 0 : break; 58 : : 59 : 0 : case 0x0A: 60 : : 61 : 0 : acpi_os_printf("\\n"); /* LINEFEED */ 62 : 0 : break; 63 : : 64 : 0 : case 0x0D: 65 : : 66 : 0 : acpi_os_printf("\\r"); /* CARRIAGE RETURN */ 67 : 0 : break; 68 : : 69 : 0 : case 0x09: 70 : : 71 : 0 : acpi_os_printf("\\t"); /* HORIZONTAL TAB */ 72 : 0 : break; 73 : : 74 : 0 : case 0x0B: 75 : : 76 : 0 : acpi_os_printf("\\v"); /* VERTICAL TAB */ 77 : 0 : break; 78 : : 79 : 0 : case '\'': /* Single Quote */ 80 : : case '\"': /* Double Quote */ 81 : : case '\\': /* Backslash */ 82 : : 83 : 0 : acpi_os_printf("\\%c", (int)string[i]); 84 : 0 : break; 85 : : 86 : 0 : default: 87 : : 88 : : /* Check for printable character or hex escape */ 89 : : 90 [ # # ]: 0 : if (isprint((int)string[i])) { 91 : : /* This is a normal character */ 92 : : 93 : 0 : acpi_os_printf("%c", (int)string[i]); 94 : : } else { 95 : : /* All others will be Hex escapes */ 96 : : 97 : 0 : acpi_os_printf("\\x%2.2X", (s32)string[i]); 98 : : } 99 : : break; 100 : : } 101 : : } 102 : : 103 : 0 : acpi_os_printf("\""); 104 : : 105 [ # # # # ]: 0 : if (i == max_length && string[i]) { 106 : 0 : acpi_os_printf("..."); 107 : : } 108 : : } 109 : : 110 : : /******************************************************************************* 111 : : * 112 : : * FUNCTION: acpi_ut_repair_name 113 : : * 114 : : * PARAMETERS: name - The ACPI name to be repaired 115 : : * 116 : : * RETURN: Repaired version of the name 117 : : * 118 : : * DESCRIPTION: Repair an ACPI name: Change invalid characters to '*' and 119 : : * return the new name. NOTE: the Name parameter must reside in 120 : : * read/write memory, cannot be a const. 121 : : * 122 : : * An ACPI Name must consist of valid ACPI characters. We will repair the name 123 : : * if necessary because we don't want to abort because of this, but we want 124 : : * all namespace names to be printable. A warning message is appropriate. 125 : : * 126 : : * This issue came up because there are in fact machines that exhibit 127 : : * this problem, and we want to be able to enable ACPI support for them, 128 : : * even though there are a few bad names. 129 : : * 130 : : ******************************************************************************/ 131 : : 132 : 121338 : void acpi_ut_repair_name(char *name) 133 : : { 134 : 121338 : u32 i; 135 : 121338 : u8 found_bad_char = FALSE; 136 : 121338 : u32 original_name; 137 : : 138 : 121338 : ACPI_FUNCTION_NAME(ut_repair_name); 139 : : 140 : : /* 141 : : * Special case for the root node. This can happen if we get an 142 : : * error during the execution of module-level code. 143 : : */ 144 [ + - ]: 121338 : if (ACPI_COMPARE_NAMESEG(name, ACPI_ROOT_PATHNAME)) { 145 : : return; 146 : : } 147 : : 148 : : ACPI_COPY_NAMESEG(&original_name, name); 149 : : 150 : : /* Check each character in the name */ 151 : : 152 [ + + ]: 606690 : for (i = 0; i < ACPI_NAMESEG_SIZE; i++) { 153 [ + - ]: 485352 : if (acpi_ut_valid_name_char(name[i], i)) { 154 : 485352 : continue; 155 : : } 156 : : 157 : : /* 158 : : * Replace a bad character with something printable, yet technically 159 : : * still invalid. This prevents any collisions with existing "good" 160 : : * names in the namespace. 161 : : */ 162 : 0 : name[i] = '*'; 163 : 0 : found_bad_char = TRUE; 164 : : } 165 : : 166 [ - + ]: 121338 : if (found_bad_char) { 167 : : 168 : : /* Report warning only if in strict mode or debug mode */ 169 : : 170 [ # # ]: 0 : if (!acpi_gbl_enable_interpreter_slack) { 171 : 0 : ACPI_WARNING((AE_INFO, 172 : : "Invalid character(s) in name (0x%.8X), repaired: [%4.4s]", 173 : : original_name, name)); 174 : : } else { 175 : : ACPI_DEBUG_PRINT((ACPI_DB_INFO, 176 : : "Invalid character(s) in name (0x%.8X), repaired: [%4.4s]", 177 : : original_name, name)); 178 : : } 179 : : } 180 : : } 181 : : 182 : : #if defined ACPI_ASL_COMPILER || defined ACPI_EXEC_APP 183 : : /******************************************************************************* 184 : : * 185 : : * FUNCTION: ut_convert_backslashes 186 : : * 187 : : * PARAMETERS: pathname - File pathname string to be converted 188 : : * 189 : : * RETURN: Modifies the input Pathname 190 : : * 191 : : * DESCRIPTION: Convert all backslashes (0x5C) to forward slashes (0x2F) within 192 : : * the entire input file pathname string. 193 : : * 194 : : ******************************************************************************/ 195 : : 196 : : void ut_convert_backslashes(char *pathname) 197 : : { 198 : : 199 : : if (!pathname) { 200 : : return; 201 : : } 202 : : 203 : : while (*pathname) { 204 : : if (*pathname == '\\') { 205 : : *pathname = '/'; 206 : : } 207 : : 208 : : pathname++; 209 : : } 210 : : } 211 : : #endif