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 56char * 57AsSkipUntilChar ( 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 85char * 86AsSkipPastChar ( 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 118char * 119AsReplaceData ( 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 171char * 172AsInsertData ( 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 216char * 217AsRemoveData ( 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