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