⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 utmisc.c

📁 h内核
💻 C
📖 第 1 页 / 共 3 页
字号:
/******************************************************************************* * * Module Name: utmisc - common utility procedures * ******************************************************************************//* * Copyright (C) 2000 - 2005, R. Byron Moore * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright *    notice, this list of conditions, and the following disclaimer, *    without modification. * 2. Redistributions in binary form must reproduce at minimum a disclaimer *    substantially similar to the "NO WARRANTY" disclaimer below *    ("Disclaimer") and any redistribution must be conditioned upon *    including a substantially similar Disclaimer requirement for further *    binary redistribution. * 3. Neither the names of the above-listed copyright holders nor the names *    of any contributors may be used to endorse or promote products derived *    from this software without specific prior written permission. * * Alternatively, this software may be distributed under the terms of the * GNU General Public License ("GPL") version 2 as published by the Free * Software Foundation. * * NO WARRANTY * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGES. */#include <acpi/acpi.h>#include <acpi/acnamesp.h>#define _COMPONENT          ACPI_UTILITIES	 ACPI_MODULE_NAME    ("utmisc")/******************************************************************************* * * FUNCTION:    acpi_ut_print_string * * PARAMETERS:  String          - Null terminated ASCII string * * RETURN:      None * * DESCRIPTION: Dump an ASCII string with support for ACPI-defined escape *              sequences. * ******************************************************************************/voidacpi_ut_print_string (	char                            *string,	u8                              max_length){	u32                             i;	if (!string) {		acpi_os_printf ("<\"NULL STRING PTR\">");		return;	}	acpi_os_printf ("\"");	for (i = 0; string[i] && (i < max_length); i++) {		/* Escape sequences */		switch (string[i]) {		case 0x07:			acpi_os_printf ("\\a");      /* BELL */			break;		case 0x08:			acpi_os_printf ("\\b");     /* BACKSPACE */			break;		case 0x0C:			acpi_os_printf ("\\f");     /* FORMFEED */			break;		case 0x0A:			acpi_os_printf ("\\n");     /* LINEFEED */			break;		case 0x0D:			acpi_os_printf ("\\r");     /* CARRIAGE RETURN*/			break;		case 0x09:			acpi_os_printf ("\\t");     /* HORIZONTAL TAB */			break;		case 0x0B:			acpi_os_printf ("\\v");     /* VERTICAL TAB */			break;		case '\'':                      /* Single Quote */		case '\"':                      /* Double Quote */		case '\\':                      /* Backslash */			acpi_os_printf ("\\%c", (int) string[i]);			break;		default:			/* Check for printable character or hex escape */			if (ACPI_IS_PRINT (string[i]))			{				/* This is a normal character */				acpi_os_printf ("%c", (int) string[i]);			}			else			{				/* All others will be Hex escapes */				acpi_os_printf ("\\x%2.2X", (s32) string[i]);			}			break;		}	}	acpi_os_printf ("\"");	if (i == max_length && string[i]) {		acpi_os_printf ("...");	}}/******************************************************************************* * * FUNCTION:    acpi_ut_dword_byte_swap * * PARAMETERS:  Value           - Value to be converted * * DESCRIPTION: Convert a 32-bit value to big-endian (swap the bytes) * ******************************************************************************/u32acpi_ut_dword_byte_swap (	u32                             value){	union {		u32                         value;		u8                          bytes[4];	} out;	union {		u32                         value;		u8                          bytes[4];	} in;	ACPI_FUNCTION_ENTRY ();	in.value = value;	out.bytes[0] = in.bytes[3];	out.bytes[1] = in.bytes[2];	out.bytes[2] = in.bytes[1];	out.bytes[3] = in.bytes[0];	return (out.value);}/******************************************************************************* * * FUNCTION:    acpi_ut_set_integer_width * * PARAMETERS:  Revision            From DSDT header * * RETURN:      None * * DESCRIPTION: Set the global integer bit width based upon the revision *              of the DSDT.  For Revision 1 and 0, Integers are 32 bits. *              For Revision 2 and above, Integers are 64 bits.  Yes, this *              makes a difference. * ******************************************************************************/voidacpi_ut_set_integer_width (	u8                              revision){	if (revision <= 1) {		acpi_gbl_integer_bit_width = 32;		acpi_gbl_integer_nybble_width = 8;		acpi_gbl_integer_byte_width = 4;	}	else {		acpi_gbl_integer_bit_width = 64;		acpi_gbl_integer_nybble_width = 16;		acpi_gbl_integer_byte_width = 8;	}}#ifdef ACPI_DEBUG_OUTPUT/******************************************************************************* * * FUNCTION:    acpi_ut_display_init_pathname * * PARAMETERS:  obj_handle          - Handle whose pathname will be displayed *              Path                - Additional path string to be appended. *                                      (NULL if no extra path) * * RETURN:      acpi_status * * DESCRIPTION: Display full pathname of an object, DEBUG ONLY * ******************************************************************************/voidacpi_ut_display_init_pathname (	u8                              type,	struct acpi_namespace_node      *obj_handle,	char                            *path){	acpi_status                     status;	struct acpi_buffer              buffer;	ACPI_FUNCTION_ENTRY ();	/* Only print the path if the appropriate debug level is enabled */	if (!(acpi_dbg_level & ACPI_LV_INIT_NAMES)) {		return;	}	/* Get the full pathname to the node */	buffer.length = ACPI_ALLOCATE_LOCAL_BUFFER;	status = acpi_ns_handle_to_pathname (obj_handle, &buffer);	if (ACPI_FAILURE (status)) {		return;	}	/* Print what we're doing */	switch (type) {	case ACPI_TYPE_METHOD:		acpi_os_printf ("Executing  ");		break;	default:		acpi_os_printf ("Initializing ");		break;	}	/* Print the object type and pathname */	acpi_os_printf ("%-12s %s", acpi_ut_get_type_name (type), (char *) buffer.pointer);	/* Extra path is used to append names like _STA, _INI, etc. */	if (path) {		acpi_os_printf (".%s", path);	}	acpi_os_printf ("\n");	ACPI_MEM_FREE (buffer.pointer);}#endif/******************************************************************************* * * FUNCTION:    acpi_ut_valid_acpi_name * * PARAMETERS:  Character           - The character to be examined * * RETURN:      1 if Character may appear in a name, else 0 * * DESCRIPTION: Check for a valid ACPI name.  Each character must be one of: *              1) Upper case alpha *              2) numeric *              3) underscore * ******************************************************************************/u8acpi_ut_valid_acpi_name (	u32                             name){	char                            *name_ptr = (char *) &name;	char                            character;	acpi_native_uint                i;	ACPI_FUNCTION_ENTRY ();	for (i = 0; i < ACPI_NAME_SIZE; i++) {		character = *name_ptr;		name_ptr++;		if (!((character == '_') ||			  (character >= 'A' && character <= 'Z') ||			  (character >= '0' && character <= '9'))) {			return (FALSE);		}	}	return (TRUE);}/******************************************************************************* * * FUNCTION:    acpi_ut_valid_acpi_character * * PARAMETERS:  Character           - The character to be examined * * RETURN:      1 if Character may appear in a name, else 0 * * DESCRIPTION: Check for a printable character * ******************************************************************************/u8acpi_ut_valid_acpi_character (	char                            character){	ACPI_FUNCTION_ENTRY ();	return ((u8)   ((character == '_') ||			   (character >= 'A' && character <= 'Z') ||			   (character >= '0' && character <= '9')));}/******************************************************************************* * * FUNCTION:    acpi_ut_strtoul64 * * PARAMETERS:  String          - Null terminated string *              Base            - Radix of the string: 10, 16, or ACPI_ANY_BASE *              ret_integer     - Where the converted integer is returned * * RETURN:      Status and Converted value * * DESCRIPTION: Convert a string into an unsigned value. *              NOTE: Does not support Octal strings, not needed. * ******************************************************************************/acpi_statusacpi_ut_strtoul64 (	char                            *string,	u32                             base,	acpi_integer                    *ret_integer){	u32                             this_digit;	acpi_integer                    return_value = 0;	acpi_integer                    quotient;	ACPI_FUNCTION_TRACE ("ut_stroul64");	switch (base) {	case ACPI_ANY_BASE:	case 10:	case 16:		break;	default:		/* Invalid Base */		return_ACPI_STATUS (AE_BAD_PARAMETER);	}	/* Skip over any white space in the buffer */	while (ACPI_IS_SPACE (*string) || *string == '\t') {		++string;	}	/*	 * If the input parameter Base is zero, then we need to	 * determine if it is decimal or hexadecimal:	 */	if (base == 0) {		if ((*string == '0') &&			(ACPI_TOLOWER (*(++string)) == 'x')) {			base = 16;			++string;		}		else {			base = 10;		}	}	/*	 * For hexadecimal base, skip over the leading	 * 0 or 0x, if they are present.	 */	if (base == 16 &&		*string == '0' &&		ACPI_TOLOWER (*(++string)) == 'x') {		string++;	}	/* Any string left? */	if (!(*string)) {		goto error_exit;	}	/* Main loop: convert the string to a 64-bit integer */	while (*string) {		if (ACPI_IS_DIGIT (*string)) {			/* Convert ASCII 0-9 to Decimal value */			this_digit = ((u8) *string) - '0';		}		else {			this_digit = (u8) ACPI_TOUPPER (*string);			if (ACPI_IS_UPPER ((char) this_digit)) {				/* Convert ASCII Hex char to value */				this_digit = this_digit - 'A' + 10;			}			else {				goto error_exit;			}		}		/* Check to see if digit is out of range */		if (this_digit >= base) {			goto error_exit;		}		/* Divide the digit into the correct position */		(void) acpi_ut_short_divide ((ACPI_INTEGER_MAX - (acpi_integer) this_digit),				 base, &quotient, NULL);		if (return_value > quotient) {			goto error_exit;		}		return_value *= base;		return_value += this_digit;		++string;	}	*ret_integer = return_value;	return_ACPI_STATUS (AE_OK);error_exit:	/* Base was set/validated above */	if (base == 10) {		return_ACPI_STATUS (AE_BAD_DECIMAL_CONSTANT);	}	else {		return_ACPI_STATUS (AE_BAD_HEX_CONSTANT);	}}/******************************************************************************* * * FUNCTION:    acpi_ut_strupr * * PARAMETERS:  src_string      - The source string to convert to * * RETURN:      src_string * * DESCRIPTION: Convert string to uppercase * ******************************************************************************/#ifdef ACPI_FUTURE_USAGEchar *acpi_ut_strupr (	char                            *src_string){	char                            *string;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -