nsnames.c

来自「是关于linux2.5.1的完全源码」· C语言 代码 · 共 244 行

C
244
字号
/******************************************************************************* * * Module Name: nsnames - Name manipulation and search *              $Revision: 74 $ * ******************************************************************************//* *  Copyright (C) 2000 - 2002, R. Byron Moore * *  This program is free software; you can redistribute it and/or modify *  it under the terms of the GNU General Public License as published by *  the Free Software Foundation; either version 2 of the License, or *  (at your option) any later version. * *  This program is distributed in the hope that it will be useful, *  but WITHOUT ANY WARRANTY; without even the implied warranty of *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the *  GNU General Public License for more details. * *  You should have received a copy of the GNU General Public License *  along with this program; if not, write to the Free Software *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */#include "acpi.h"#include "amlcode.h"#include "acinterp.h"#include "acnamesp.h"#define _COMPONENT          ACPI_NAMESPACE	 ACPI_MODULE_NAME    ("nsnames")/******************************************************************************* * * FUNCTION:    Acpi_ns_build_external_path * * PARAMETERS:  Node            - NS node whose pathname is needed *              Size            - Size of the pathname *              *Name_buffer    - Where to return the pathname * * RETURN:      Places the pathname into the Name_buffer, in external format *              (name segments separated by path separators) * * DESCRIPTION: Generate a full pathaname * ******************************************************************************/voidacpi_ns_build_external_path (	acpi_namespace_node     *node,	ACPI_SIZE               size,	NATIVE_CHAR             *name_buffer){	u32                     index;	acpi_namespace_node     *parent_node;	ACPI_FUNCTION_NAME ("Ns_build_external_path");	/* Special case for root */	index = size - 1;	if (index < ACPI_NAME_SIZE) {		name_buffer[0] = AML_ROOT_PREFIX;		name_buffer[1] = 0;		return;	}	/* Store terminator byte, then build name backwards */	parent_node = node;	name_buffer[index] = 0;	while ((index > ACPI_NAME_SIZE) && (parent_node != acpi_gbl_root_node)) {		index -= ACPI_NAME_SIZE;		/* Put the name into the buffer */		ACPI_MOVE_UNALIGNED32_TO_32 ((name_buffer + index), &parent_node->name);		parent_node = acpi_ns_get_parent_node (parent_node);		/* Prefix name with the path separator */		index--;		name_buffer[index] = PATH_SEPARATOR;	}	/* Overwrite final separator with the root prefix character */	name_buffer[index] = AML_ROOT_PREFIX;	if (index != 0) {		ACPI_DEBUG_PRINT ((ACPI_DB_ERROR,			"Could not construct pathname; index=%X, size=%X, Path=%s\n",			index, size, &name_buffer[size]));	}	return;}#ifdef ACPI_DEBUG/******************************************************************************* * * FUNCTION:    Acpi_ns_get_external_pathname * * PARAMETERS:  Node            - NS node whose pathname is needed * * RETURN:      Pointer to storage containing the fully qualified name of *              the node, In external format (name segments separated by path *              separators.) * * DESCRIPTION: Used for debug printing in Acpi_ns_search_table(). * ******************************************************************************/NATIVE_CHAR *acpi_ns_get_external_pathname (	acpi_namespace_node     *node){	NATIVE_CHAR             *name_buffer;	ACPI_SIZE               size;	ACPI_FUNCTION_TRACE_PTR ("Ns_get_external_pathname", node);	/* Calculate required buffer size based on depth below root */	size = acpi_ns_get_pathname_length (node);	/* Allocate a buffer to be returned to caller */	name_buffer = ACPI_MEM_CALLOCATE (size);	if (!name_buffer) {		ACPI_REPORT_ERROR (("Ns_get_table_pathname: allocation failure\n"));		return_PTR (NULL);	}	/* Build the path in the allocated buffer */	acpi_ns_build_external_path (node, size, name_buffer);	return_PTR (name_buffer);}#endif/******************************************************************************* * * FUNCTION:    Acpi_ns_get_pathname_length * * PARAMETERS:  Node        - Namespace node * * RETURN:      Length of path, including prefix * * DESCRIPTION: Get the length of the pathname string for this node * ******************************************************************************/ACPI_SIZEacpi_ns_get_pathname_length (	acpi_namespace_node     *node){	ACPI_SIZE               size;	acpi_namespace_node     *next_node;	ACPI_FUNCTION_ENTRY ();	/*	 * Compute length of pathname as 5 * number of name segments.	 * Go back up the parent tree to the root	 */	size = 0;	next_node = node;	while (next_node != acpi_gbl_root_node) {		size += PATH_SEGMENT_LENGTH;		next_node = acpi_ns_get_parent_node (next_node);	}	return (size + 1);}/******************************************************************************* * * FUNCTION:    Acpi_ns_handle_to_pathname * * PARAMETERS:  Target_handle           - Handle of named object whose name is *                                        to be found *              Buffer                  - Where the pathname is returned * * RETURN:      Status, Buffer is filled with pathname if status is AE_OK * * DESCRIPTION: Build and return a full namespace pathname * ******************************************************************************/acpi_statusacpi_ns_handle_to_pathname (	acpi_handle             target_handle,	acpi_buffer             *buffer){	acpi_status             status;	acpi_namespace_node     *node;	ACPI_SIZE               required_size;	ACPI_FUNCTION_TRACE_PTR ("Ns_handle_to_pathname", target_handle);	node = acpi_ns_map_handle_to_node (target_handle);	if (!node) {		return_ACPI_STATUS (AE_BAD_PARAMETER);	}	/* Determine size required for the caller buffer */	required_size = acpi_ns_get_pathname_length (node);	/* Validate/Allocate/Clear caller buffer */	status = acpi_ut_initialize_buffer (buffer, required_size);	if (ACPI_FAILURE (status)) {		return_ACPI_STATUS (status);	}	/* Build the path in the caller buffer */	acpi_ns_build_external_path (node, required_size, buffer->pointer);	ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "%s [%X] \n", (char *) buffer->pointer, required_size));	return_ACPI_STATUS (AE_OK);}

⌨️ 快捷键说明

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