exstorob.c
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:5k
- /******************************************************************************
- *
- * Module Name: exstorob - AML Interpreter object store support, store to object
- * $Revision: 37 $
- *
- *****************************************************************************/
- /*
- * Copyright (C) 2000, 2001 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 "acparser.h"
- #include "acdispat.h"
- #include "acinterp.h"
- #include "amlcode.h"
- #include "acnamesp.h"
- #include "actables.h"
- #define _COMPONENT ACPI_EXECUTER
- MODULE_NAME ("exstorob")
- /*******************************************************************************
- *
- * FUNCTION: Acpi_ex_copy_buffer_to_buffer
- *
- * PARAMETERS: Source_desc - Source object to copy
- * Target_desc - Destination object of the copy
- *
- * RETURN: Status
- *
- * DESCRIPTION: Copy a buffer object to another buffer object.
- *
- ******************************************************************************/
- acpi_status
- acpi_ex_copy_buffer_to_buffer (
- acpi_operand_object *source_desc,
- acpi_operand_object *target_desc)
- {
- u32 length;
- u8 *buffer;
- PROC_NAME ("Ex_copy_buffer_to_buffer");
- /*
- * We know that Source_desc is a buffer by now
- */
- buffer = (u8 *) source_desc->buffer.pointer;
- length = source_desc->buffer.length;
- /*
- * If target is a buffer of length zero, allocate a new
- * buffer of the proper length
- */
- if (target_desc->buffer.length == 0) {
- target_desc->buffer.pointer = ACPI_MEM_ALLOCATE (length);
- if (!target_desc->buffer.pointer) {
- return (AE_NO_MEMORY);
- }
- target_desc->buffer.length = length;
- }
- /*
- * Buffer is a static allocation,
- * only place what will fit in the buffer.
- */
- if (length <= target_desc->buffer.length) {
- /* Clear existing buffer and copy in the new one */
- MEMSET (target_desc->buffer.pointer, 0, target_desc->buffer.length);
- MEMCPY (target_desc->buffer.pointer, buffer, length);
- }
- else {
- /*
- * Truncate the source, copy only what will fit
- */
- MEMCPY (target_desc->buffer.pointer, buffer, target_desc->buffer.length);
- ACPI_DEBUG_PRINT ((ACPI_DB_INFO,
- "Truncating src buffer from %X to %Xn",
- length, target_desc->buffer.length));
- }
- return (AE_OK);
- }
- /*******************************************************************************
- *
- * FUNCTION: Acpi_ex_copy_string_to_string
- *
- * PARAMETERS: Source_desc - Source object to copy
- * Target_desc - Destination object of the copy
- *
- * RETURN: Status
- *
- * DESCRIPTION: Copy a String object to another String object
- *
- ******************************************************************************/
- acpi_status
- acpi_ex_copy_string_to_string (
- acpi_operand_object *source_desc,
- acpi_operand_object *target_desc)
- {
- u32 length;
- u8 *buffer;
- FUNCTION_ENTRY ();
- /*
- * We know that Source_desc is a string by now.
- */
- buffer = (u8 *) source_desc->string.pointer;
- length = source_desc->string.length;
- /*
- * Setting a string value replaces the old string
- */
- if (length < target_desc->string.length) {
- /* Clear old string and copy in the new one */
- MEMSET (target_desc->string.pointer, 0, target_desc->string.length);
- MEMCPY (target_desc->string.pointer, buffer, length);
- }
- else {
- /*
- * Free the current buffer, then allocate a buffer
- * large enough to hold the value
- */
- if (target_desc->string.pointer &&
- (!(target_desc->common.flags & AOPOBJ_STATIC_POINTER))) {
- /*
- * Only free if not a pointer into the DSDT
- */
- ACPI_MEM_FREE (target_desc->string.pointer);
- }
- target_desc->string.pointer = ACPI_MEM_ALLOCATE (length + 1);
- if (!target_desc->string.pointer) {
- return (AE_NO_MEMORY);
- }
- target_desc->string.length = length;
- MEMCPY (target_desc->string.pointer, buffer, length);
- }
- return (AE_OK);
- }