exstorob.c
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:5k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /******************************************************************************
  2.  *
  3.  * Module Name: exstorob - AML Interpreter object store support, store to object
  4.  *              $Revision: 37 $
  5.  *
  6.  *****************************************************************************/
  7. /*
  8.  *  Copyright (C) 2000, 2001 R. Byron Moore
  9.  *
  10.  *  This program is free software; you can redistribute it and/or modify
  11.  *  it under the terms of the GNU General Public License as published by
  12.  *  the Free Software Foundation; either version 2 of the License, or
  13.  *  (at your option) any later version.
  14.  *
  15.  *  This program is distributed in the hope that it will be useful,
  16.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  17.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  18.  *  GNU General Public License for more details.
  19.  *
  20.  *  You should have received a copy of the GNU General Public License
  21.  *  along with this program; if not, write to the Free Software
  22.  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  23.  */
  24. #include "acpi.h"
  25. #include "acparser.h"
  26. #include "acdispat.h"
  27. #include "acinterp.h"
  28. #include "amlcode.h"
  29. #include "acnamesp.h"
  30. #include "actables.h"
  31. #define _COMPONENT          ACPI_EXECUTER
  32.  MODULE_NAME         ("exstorob")
  33. /*******************************************************************************
  34.  *
  35.  * FUNCTION:    Acpi_ex_copy_buffer_to_buffer
  36.  *
  37.  * PARAMETERS:  Source_desc         - Source object to copy
  38.  *              Target_desc         - Destination object of the copy
  39.  *
  40.  * RETURN:      Status
  41.  *
  42.  * DESCRIPTION: Copy a buffer object to another buffer object.
  43.  *
  44.  ******************************************************************************/
  45. acpi_status
  46. acpi_ex_copy_buffer_to_buffer (
  47. acpi_operand_object     *source_desc,
  48. acpi_operand_object     *target_desc)
  49. {
  50. u32                     length;
  51. u8                      *buffer;
  52. PROC_NAME ("Ex_copy_buffer_to_buffer");
  53. /*
  54.  * We know that Source_desc is a buffer by now
  55.  */
  56. buffer = (u8 *) source_desc->buffer.pointer;
  57. length = source_desc->buffer.length;
  58. /*
  59.  * If target is a buffer of length zero, allocate a new
  60.  * buffer of the proper length
  61.  */
  62. if (target_desc->buffer.length == 0) {
  63. target_desc->buffer.pointer = ACPI_MEM_ALLOCATE (length);
  64. if (!target_desc->buffer.pointer) {
  65. return (AE_NO_MEMORY);
  66. }
  67. target_desc->buffer.length = length;
  68. }
  69. /*
  70.  * Buffer is a static allocation,
  71.  * only place what will fit in the buffer.
  72.  */
  73. if (length <= target_desc->buffer.length) {
  74. /* Clear existing buffer and copy in the new one */
  75. MEMSET (target_desc->buffer.pointer, 0, target_desc->buffer.length);
  76. MEMCPY (target_desc->buffer.pointer, buffer, length);
  77. }
  78. else {
  79. /*
  80.  * Truncate the source, copy only what will fit
  81.  */
  82. MEMCPY (target_desc->buffer.pointer, buffer, target_desc->buffer.length);
  83. ACPI_DEBUG_PRINT ((ACPI_DB_INFO,
  84. "Truncating src buffer from %X to %Xn",
  85. length, target_desc->buffer.length));
  86. }
  87. return (AE_OK);
  88. }
  89. /*******************************************************************************
  90.  *
  91.  * FUNCTION:    Acpi_ex_copy_string_to_string
  92.  *
  93.  * PARAMETERS:  Source_desc         - Source object to copy
  94.  *              Target_desc         - Destination object of the copy
  95.  *
  96.  * RETURN:      Status
  97.  *
  98.  * DESCRIPTION: Copy a String object to another String object
  99.  *
  100.  ******************************************************************************/
  101. acpi_status
  102. acpi_ex_copy_string_to_string (
  103. acpi_operand_object     *source_desc,
  104. acpi_operand_object     *target_desc)
  105. {
  106. u32                     length;
  107. u8                      *buffer;
  108. FUNCTION_ENTRY ();
  109. /*
  110.  * We know that Source_desc is a string by now.
  111.  */
  112. buffer = (u8 *) source_desc->string.pointer;
  113. length = source_desc->string.length;
  114. /*
  115.  * Setting a string value replaces the old string
  116.  */
  117. if (length < target_desc->string.length) {
  118. /* Clear old string and copy in the new one */
  119. MEMSET (target_desc->string.pointer, 0, target_desc->string.length);
  120. MEMCPY (target_desc->string.pointer, buffer, length);
  121. }
  122. else {
  123. /*
  124.  * Free the current buffer, then allocate a buffer
  125.  * large enough to hold the value
  126.  */
  127. if (target_desc->string.pointer &&
  128.    (!(target_desc->common.flags & AOPOBJ_STATIC_POINTER))) {
  129. /*
  130.  * Only free if not a pointer into the DSDT
  131.  */
  132. ACPI_MEM_FREE (target_desc->string.pointer);
  133. }
  134. target_desc->string.pointer = ACPI_MEM_ALLOCATE (length + 1);
  135. if (!target_desc->string.pointer) {
  136. return (AE_NO_MEMORY);
  137. }
  138. target_desc->string.length = length;
  139. MEMCPY (target_desc->string.pointer, buffer, length);
  140. }
  141. return (AE_OK);
  142. }