Home | History | Annotate | Line # | Download | only in acpisrc
asutils.c revision 1.1.1.2.8.2
      1 
      2 /******************************************************************************
      3  *
      4  * Module Name: asutils - common utilities
      5  *
      6  *****************************************************************************/
      7 
      8 /*
      9  * Copyright (C) 2000 - 2011, Intel Corp.
     10  * All rights reserved.
     11  *
     12  * Redistribution and use in source and binary forms, with or without
     13  * modification, are permitted provided that the following conditions
     14  * are met:
     15  * 1. Redistributions of source code must retain the above copyright
     16  *    notice, this list of conditions, and the following disclaimer,
     17  *    without modification.
     18  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
     19  *    substantially similar to the "NO WARRANTY" disclaimer below
     20  *    ("Disclaimer") and any redistribution must be conditioned upon
     21  *    including a substantially similar Disclaimer requirement for further
     22  *    binary redistribution.
     23  * 3. Neither the names of the above-listed copyright holders nor the names
     24  *    of any contributors may be used to endorse or promote products derived
     25  *    from this software without specific prior written permission.
     26  *
     27  * Alternatively, this software may be distributed under the terms of the
     28  * GNU General Public License ("GPL") version 2 as published by the Free
     29  * Software Foundation.
     30  *
     31  * NO WARRANTY
     32  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
     33  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
     34  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
     35  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
     36  * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     37  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     38  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     39  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
     40  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
     41  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     42  * POSSIBILITY OF SUCH DAMAGES.
     43  */
     44 
     45 #include "acpisrc.h"
     46 
     47 
     48 /******************************************************************************
     49  *
     50  * FUNCTION:    AsSkipUntilChar
     51  *
     52  * DESCRIPTION: Find the next instance of the input character
     53  *
     54  ******************************************************************************/
     55 
     56 char *
     57 AsSkipUntilChar (
     58     char                    *Buffer,
     59     char                    Target)
     60 {
     61 
     62     while (*Buffer != Target)
     63     {
     64         if (!*Buffer)
     65         {
     66             return NULL;
     67         }
     68 
     69         Buffer++;
     70     }
     71 
     72     return (Buffer);
     73 }
     74 
     75 
     76 /******************************************************************************
     77  *
     78  * FUNCTION:    AsSkipPastChar
     79  *
     80  * DESCRIPTION: Find the next instance of the input character, return a buffer
     81  *              pointer to this character+1.
     82  *
     83  ******************************************************************************/
     84 
     85 char *
     86 AsSkipPastChar (
     87     char                    *Buffer,
     88     char                    Target)
     89 {
     90 
     91     while (*Buffer != Target)
     92     {
     93         if (!*Buffer)
     94         {
     95             return NULL;
     96         }
     97 
     98         Buffer++;
     99     }
    100 
    101     Buffer++;
    102 
    103     return (Buffer);
    104 }
    105 
    106 
    107 /******************************************************************************
    108  *
    109  * FUNCTION:    AsReplaceData
    110  *
    111  * DESCRIPTION: This function inserts and removes data from the file buffer.
    112  *              if more data is inserted than is removed, the data in the buffer
    113  *              is moved to make room.  If less data is inserted than is removed,
    114  *              the remaining data is moved to close the hole.
    115  *
    116  ******************************************************************************/
    117 
    118 char *
    119 AsReplaceData (
    120     char                    *Buffer,
    121     UINT32                  LengthToRemove,
    122     char                    *BufferToAdd,
    123     UINT32                  LengthToAdd)
    124 {
    125     UINT32                  BufferLength;
    126 
    127 
    128     /*
    129      * Buffer is a string, so the length must include the terminating zero
    130      */
    131     BufferLength = strlen (Buffer) + 1;
    132 
    133     if (LengthToRemove != LengthToAdd)
    134     {
    135         /*
    136          * Move some of the existing data
    137          * 1) If adding more bytes than removing, make room for the new data
    138          * 2) if removing more bytes than adding, delete the extra space
    139          */
    140         if (LengthToRemove > 0)
    141         {
    142             Gbl_MadeChanges = TRUE;
    143             memmove ((Buffer + LengthToAdd), (Buffer + LengthToRemove), (BufferLength - LengthToRemove));
    144         }
    145     }
    146 
    147     /*
    148      * Now we can move in the new data
    149      */
    150     if (LengthToAdd > 0)
    151     {
    152         Gbl_MadeChanges = TRUE;
    153         memmove (Buffer, BufferToAdd, LengthToAdd);
    154     }
    155 
    156     return (Buffer + LengthToAdd);
    157 }
    158 
    159 
    160 /******************************************************************************
    161  *
    162  * FUNCTION:    AsInsertData
    163  *
    164  * DESCRIPTION: This function inserts and removes data from the file buffer.
    165  *              if more data is inserted than is removed, the data in the buffer
    166  *              is moved to make room.  If less data is inserted than is removed,
    167  *              the remaining data is moved to close the hole.
    168  *
    169  ******************************************************************************/
    170 
    171 char *
    172 AsInsertData (
    173     char                    *Buffer,
    174     char                    *BufferToAdd,
    175     UINT32                  LengthToAdd)
    176 {
    177     UINT32                  BufferLength;
    178 
    179 
    180     if (LengthToAdd > 0)
    181     {
    182         /*
    183          * Buffer is a string, so the length must include the terminating zero
    184          */
    185         BufferLength = strlen (Buffer) + 1;
    186 
    187         /*
    188          * Move some of the existing data
    189          * 1) If adding more bytes than removing, make room for the new data
    190          * 2) if removing more bytes than adding, delete the extra space
    191          */
    192         Gbl_MadeChanges = TRUE;
    193         memmove ((Buffer + LengthToAdd), Buffer, BufferLength);
    194 
    195         /*
    196          * Now we can move in the new data
    197          */
    198         memmove (Buffer, BufferToAdd, LengthToAdd);
    199     }
    200 
    201     return (Buffer + LengthToAdd);
    202 }
    203 
    204 
    205 /******************************************************************************
    206  *
    207  * FUNCTION:    AsRemoveData
    208  *
    209  * DESCRIPTION: This function inserts and removes data from the file buffer.
    210  *              if more data is inserted than is removed, the data in the buffer
    211  *              is moved to make room.  If less data is inserted than is removed,
    212  *              the remaining data is moved to close the hole.
    213  *
    214  ******************************************************************************/
    215 
    216 char *
    217 AsRemoveData (
    218     char                    *StartPointer,
    219     char                    *EndPointer)
    220 {
    221     UINT32                  BufferLength;
    222 
    223 
    224     /*
    225      * Buffer is a string, so the length must include the terminating zero
    226      */
    227     BufferLength = strlen (EndPointer) + 1;
    228 
    229     Gbl_MadeChanges = TRUE;
    230     memmove (StartPointer, EndPointer, BufferLength);
    231 
    232     return (StartPointer);
    233 }
    234 
    235