2018-03-14 16:13:07 -07:00
// SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0
2013-01-11 13:08:51 +01:00
/*******************************************************************************
*
* Module Name : utstring - Common functions for strings and characters
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
# include <acpi/acpi.h>
# include "accommon.h"
# include "acnamesp.h"
# define _COMPONENT ACPI_UTILITIES
ACPI_MODULE_NAME ( " utstring " )
/*******************************************************************************
*
* FUNCTION : acpi_ut_print_string
*
* PARAMETERS : string - Null terminated ASCII string
2013-07-17 09:48:40 +08:00
* max_length - Maximum output length . Used to constrain the
* length of strings during debug output only .
2013-01-11 13:08:51 +01:00
*
* RETURN : None
*
* DESCRIPTION : Dump an ASCII string with support for ACPI - defined escape
* sequences .
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2013-07-17 09:48:40 +08:00
void acpi_ut_print_string ( char * string , u16 max_length )
2013-01-11 13:08:51 +01:00
{
u32 i ;
if ( ! string ) {
acpi_os_printf ( " < \" NULL STRING PTR \" > " ) ;
return ;
}
acpi_os_printf ( " \" " ) ;
2014-04-04 12:36:55 +08:00
for ( i = 0 ; ( i < max_length ) & & string [ i ] ; i + + ) {
2013-01-11 13:08:51 +01:00
/* Escape sequences */
switch ( string [ i ] ) {
case 0x07 :
2013-06-08 00:58:14 +00:00
2013-01-11 13:08:51 +01:00
acpi_os_printf ( " \\ a " ) ; /* BELL */
break ;
case 0x08 :
2013-06-08 00:58:14 +00:00
2013-01-11 13:08:51 +01:00
acpi_os_printf ( " \\ b " ) ; /* BACKSPACE */
break ;
case 0x0C :
2013-06-08 00:58:14 +00:00
2013-01-11 13:08:51 +01:00
acpi_os_printf ( " \\ f " ) ; /* FORMFEED */
break ;
case 0x0A :
2013-06-08 00:58:14 +00:00
2013-01-11 13:08:51 +01:00
acpi_os_printf ( " \\ n " ) ; /* LINEFEED */
break ;
case 0x0D :
2013-06-08 00:58:14 +00:00
2013-01-11 13:08:51 +01:00
acpi_os_printf ( " \\ r " ) ; /* CARRIAGE RETURN */
break ;
case 0x09 :
2013-06-08 00:58:14 +00:00
2013-01-11 13:08:51 +01:00
acpi_os_printf ( " \\ t " ) ; /* HORIZONTAL TAB */
break ;
case 0x0B :
2013-06-08 00:58:14 +00:00
2013-01-11 13:08:51 +01:00
acpi_os_printf ( " \\ v " ) ; /* VERTICAL TAB */
break ;
case ' \' ' : /* Single Quote */
case ' \" ' : /* Double Quote */
case ' \\ ' : /* Backslash */
2013-06-08 00:58:14 +00:00
2013-01-11 13:08:51 +01:00
acpi_os_printf ( " \\ %c " , ( int ) string [ i ] ) ;
break ;
default :
/* Check for printable character or hex escape */
2015-07-01 14:45:11 +08:00
if ( isprint ( ( int ) string [ i ] ) ) {
2013-01-11 13:08:51 +01:00
/* This is a normal character */
acpi_os_printf ( " %c " , ( int ) string [ i ] ) ;
} else {
/* All others will be Hex escapes */
2016-05-05 12:57:53 +08:00
acpi_os_printf ( " \\ x%2.2X " , ( s32 ) string [ i ] ) ;
2013-01-11 13:08:51 +01:00
}
break ;
}
}
2015-12-29 13:54:36 +08:00
2013-01-11 13:08:51 +01:00
acpi_os_printf ( " \" " ) ;
if ( i = = max_length & & string [ i ] ) {
acpi_os_printf ( " ... " ) ;
}
}
/*******************************************************************************
*
* FUNCTION : acpi_ut_repair_name
*
* PARAMETERS : name - The ACPI name to be repaired
*
* RETURN : Repaired version of the name
*
* DESCRIPTION : Repair an ACPI name : Change invalid characters to ' * ' and
* return the new name . NOTE : the Name parameter must reside in
* read / write memory , cannot be a const .
*
* An ACPI Name must consist of valid ACPI characters . We will repair the name
* if necessary because we don ' t want to abort because of this , but we want
* all namespace names to be printable . A warning message is appropriate .
*
* This issue came up because there are in fact machines that exhibit
* this problem , and we want to be able to enable ACPI support for them ,
* even though there are a few bad names .
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
void acpi_ut_repair_name ( char * name )
{
u32 i ;
u8 found_bad_char = FALSE ;
u32 original_name ;
ACPI_FUNCTION_NAME ( ut_repair_name ) ;
2015-12-29 14:04:11 +08:00
/*
* Special case for the root node . This can happen if we get an
* error during the execution of module - level code .
*/
2019-04-08 13:42:24 -07:00
if ( ACPI_COMPARE_NAMESEG ( name , ACPI_ROOT_PATHNAME ) ) {
2015-12-29 14:04:11 +08:00
return ;
}
2019-04-08 13:42:23 -07:00
ACPI_COPY_NAMESEG ( & original_name , name ) ;
2013-01-11 13:08:51 +01:00
/* Check each character in the name */
2019-04-08 13:42:25 -07:00
for ( i = 0 ; i < ACPI_NAMESEG_SIZE ; i + + ) {
2016-05-05 13:00:36 +08:00
if ( acpi_ut_valid_name_char ( name [ i ] , i ) ) {
2013-01-11 13:08:51 +01:00
continue ;
}
/*
* Replace a bad character with something printable , yet technically
* still invalid . This prevents any collisions with existing " good "
* names in the namespace .
*/
name [ i ] = ' * ' ;
found_bad_char = TRUE ;
}
if ( found_bad_char ) {
/* Report warning only if in strict mode or debug mode */
if ( ! acpi_gbl_enable_interpreter_slack ) {
ACPI_WARNING ( ( AE_INFO ,
" Invalid character(s) in name (0x%.8X), repaired: [%4.4s] " ,
original_name , name ) ) ;
} else {
ACPI_DEBUG_PRINT ( ( ACPI_DB_INFO ,
" Invalid character(s) in name (0x%.8X), repaired: [%4.4s] " ,
original_name , name ) ) ;
}
}
}
# if defined ACPI_ASL_COMPILER || defined ACPI_EXEC_APP
/*******************************************************************************
*
* FUNCTION : ut_convert_backslashes
*
* PARAMETERS : pathname - File pathname string to be converted
*
* RETURN : Modifies the input Pathname
*
* DESCRIPTION : Convert all backslashes ( 0x5C ) to forward slashes ( 0x2F ) within
* the entire input file pathname string .
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
void ut_convert_backslashes ( char * pathname )
{
if ( ! pathname ) {
return ;
}
while ( * pathname ) {
if ( * pathname = = ' \\ ' ) {
* pathname = ' / ' ;
}
pathname + + ;
}
}
# endif