brintos

brintos / linux-shallow public Read only

0
0
Text · 5.0 KiB · aae71b8 Raw
212 lines · c
1// SPDX-License-Identifier: BSD-3-Clause OR GPL-2.02/*******************************************************************************3 *4 * Module Name: utstring - Common functions for strings and characters5 *6 ******************************************************************************/7 8#include <acpi/acpi.h>9#include "accommon.h"10#include "acnamesp.h"11 12#define _COMPONENT          ACPI_UTILITIES13ACPI_MODULE_NAME("utstring")14 15/*******************************************************************************16 *17 * FUNCTION:    acpi_ut_print_string18 *19 * PARAMETERS:  string          - Null terminated ASCII string20 *              max_length      - Maximum output length. Used to constrain the21 *                                length of strings during debug output only.22 *23 * RETURN:      None24 *25 * DESCRIPTION: Dump an ASCII string with support for ACPI-defined escape26 *              sequences.27 *28 ******************************************************************************/29void acpi_ut_print_string(char *string, u16 max_length)30{31	u32 i;32 33	if (!string) {34		acpi_os_printf("<\"NULL STRING PTR\">");35		return;36	}37 38	acpi_os_printf("\"");39	for (i = 0; (i < max_length) && string[i]; i++) {40 41		/* Escape sequences */42 43		switch (string[i]) {44		case 0x07:45 46			acpi_os_printf("\\a");	/* BELL */47			break;48 49		case 0x08:50 51			acpi_os_printf("\\b");	/* BACKSPACE */52			break;53 54		case 0x0C:55 56			acpi_os_printf("\\f");	/* FORMFEED */57			break;58 59		case 0x0A:60 61			acpi_os_printf("\\n");	/* LINEFEED */62			break;63 64		case 0x0D:65 66			acpi_os_printf("\\r");	/* CARRIAGE RETURN */67			break;68 69		case 0x09:70 71			acpi_os_printf("\\t");	/* HORIZONTAL TAB */72			break;73 74		case 0x0B:75 76			acpi_os_printf("\\v");	/* VERTICAL TAB */77			break;78 79		case '\'':	/* Single Quote */80		case '\"':	/* Double Quote */81		case '\\':	/* Backslash */82 83			acpi_os_printf("\\%c", (int)string[i]);84			break;85 86		default:87 88			/* Check for printable character or hex escape */89 90			if (isprint((int)string[i])) {91				/* This is a normal character */92 93				acpi_os_printf("%c", (int)string[i]);94			} else {95				/* All others will be Hex escapes */96 97				acpi_os_printf("\\x%2.2X", (s32)string[i]);98			}99			break;100		}101	}102 103	acpi_os_printf("\"");104 105	if (i == max_length && string[i]) {106		acpi_os_printf("...");107	}108}109 110/*******************************************************************************111 *112 * FUNCTION:    acpi_ut_repair_name113 *114 * PARAMETERS:  name            - The ACPI name to be repaired115 *116 * RETURN:      Repaired version of the name117 *118 * DESCRIPTION: Repair an ACPI name: Change invalid characters to '*' and119 *              return the new name. NOTE: the Name parameter must reside in120 *              read/write memory, cannot be a const.121 *122 * An ACPI Name must consist of valid ACPI characters. We will repair the name123 * if necessary because we don't want to abort because of this, but we want124 * all namespace names to be printable. A warning message is appropriate.125 *126 * This issue came up because there are in fact machines that exhibit127 * 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 132void acpi_ut_repair_name(char *name)133{134	u32 i;135	u8 found_bad_char = FALSE;136	u32 original_name;137 138	ACPI_FUNCTION_NAME(ut_repair_name);139 140	/*141	 * Special case for the root node. This can happen if we get an142	 * error during the execution of module-level code.143	 */144	if (ACPI_COMPARE_NAMESEG(name, ACPI_ROOT_PATHNAME)) {145		return;146	}147 148	ACPI_COPY_NAMESEG(&original_name, &name[0]);149 150	/* Check each character in the name */151 152	for (i = 0; i < ACPI_NAMESEG_SIZE; i++) {153		if (acpi_ut_valid_name_char(name[i], i)) {154			continue;155		}156 157		/*158		 * Replace a bad character with something printable, yet technically159		 * "odd". This prevents any collisions with existing "good"160		 * names in the namespace.161		 */162		name[i] = '_';163		found_bad_char = TRUE;164	}165 166	if (found_bad_char) {167 168		/* Report warning only if in strict mode or debug mode */169 170		if (!acpi_gbl_enable_interpreter_slack) {171			ACPI_WARNING((AE_INFO,172				      "Invalid character(s) in name (0x%.8X) %p, repaired: [%4.4s]",173				      original_name, name, &name[0]));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_APP183/*******************************************************************************184 *185 * FUNCTION:    ut_convert_backslashes186 *187 * PARAMETERS:  pathname        - File pathname string to be converted188 *189 * RETURN:      Modifies the input Pathname190 *191 * DESCRIPTION: Convert all backslashes (0x5C) to forward slashes (0x2F) within192 *              the entire input file pathname string.193 *194 ******************************************************************************/195 196void 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#endif212