1fe0f0bbbSJung-uk Kim /******************************************************************************* 2fe0f0bbbSJung-uk Kim * 3fe0f0bbbSJung-uk Kim * Module Name: utnonansi - Non-ansi C library functions 4fe0f0bbbSJung-uk Kim * 5fe0f0bbbSJung-uk Kim ******************************************************************************/ 6fe0f0bbbSJung-uk Kim 7fe0f0bbbSJung-uk Kim /* 8f8146b88SJung-uk Kim * Copyright (C) 2000 - 2016, Intel Corp. 9fe0f0bbbSJung-uk Kim * All rights reserved. 10fe0f0bbbSJung-uk Kim * 11fe0f0bbbSJung-uk Kim * Redistribution and use in source and binary forms, with or without 12fe0f0bbbSJung-uk Kim * modification, are permitted provided that the following conditions 13fe0f0bbbSJung-uk Kim * are met: 14fe0f0bbbSJung-uk Kim * 1. Redistributions of source code must retain the above copyright 15fe0f0bbbSJung-uk Kim * notice, this list of conditions, and the following disclaimer, 16fe0f0bbbSJung-uk Kim * without modification. 17fe0f0bbbSJung-uk Kim * 2. Redistributions in binary form must reproduce at minimum a disclaimer 18fe0f0bbbSJung-uk Kim * substantially similar to the "NO WARRANTY" disclaimer below 19fe0f0bbbSJung-uk Kim * ("Disclaimer") and any redistribution must be conditioned upon 20fe0f0bbbSJung-uk Kim * including a substantially similar Disclaimer requirement for further 21fe0f0bbbSJung-uk Kim * binary redistribution. 22fe0f0bbbSJung-uk Kim * 3. Neither the names of the above-listed copyright holders nor the names 23fe0f0bbbSJung-uk Kim * of any contributors may be used to endorse or promote products derived 24fe0f0bbbSJung-uk Kim * from this software without specific prior written permission. 25fe0f0bbbSJung-uk Kim * 26fe0f0bbbSJung-uk Kim * Alternatively, this software may be distributed under the terms of the 27fe0f0bbbSJung-uk Kim * GNU General Public License ("GPL") version 2 as published by the Free 28fe0f0bbbSJung-uk Kim * Software Foundation. 29fe0f0bbbSJung-uk Kim * 30fe0f0bbbSJung-uk Kim * NO WARRANTY 31fe0f0bbbSJung-uk Kim * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 32fe0f0bbbSJung-uk Kim * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 33fe0f0bbbSJung-uk Kim * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR 34fe0f0bbbSJung-uk Kim * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 35fe0f0bbbSJung-uk Kim * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 36fe0f0bbbSJung-uk Kim * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 37fe0f0bbbSJung-uk Kim * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 38fe0f0bbbSJung-uk Kim * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 39fe0f0bbbSJung-uk Kim * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 40fe0f0bbbSJung-uk Kim * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 41fe0f0bbbSJung-uk Kim * POSSIBILITY OF SUCH DAMAGES. 42fe0f0bbbSJung-uk Kim */ 43fe0f0bbbSJung-uk Kim 44fe0f0bbbSJung-uk Kim #include <contrib/dev/acpica/include/acpi.h> 45fe0f0bbbSJung-uk Kim #include <contrib/dev/acpica/include/accommon.h> 46fe0f0bbbSJung-uk Kim 47fe0f0bbbSJung-uk Kim 48fe0f0bbbSJung-uk Kim #define _COMPONENT ACPI_UTILITIES 49fe0f0bbbSJung-uk Kim ACPI_MODULE_NAME ("utnonansi") 50fe0f0bbbSJung-uk Kim 51fe0f0bbbSJung-uk Kim /* 52*493deb39SJung-uk Kim * Non-ANSI C library functions - strlwr, strupr, stricmp, and "safe" 53*493deb39SJung-uk Kim * string functions. 54fe0f0bbbSJung-uk Kim */ 55fe0f0bbbSJung-uk Kim 56fe0f0bbbSJung-uk Kim /******************************************************************************* 57fe0f0bbbSJung-uk Kim * 58fe0f0bbbSJung-uk Kim * FUNCTION: AcpiUtStrlwr (strlwr) 59fe0f0bbbSJung-uk Kim * 60fe0f0bbbSJung-uk Kim * PARAMETERS: SrcString - The source string to convert 61fe0f0bbbSJung-uk Kim * 62fe0f0bbbSJung-uk Kim * RETURN: None 63fe0f0bbbSJung-uk Kim * 64fe0f0bbbSJung-uk Kim * DESCRIPTION: Convert a string to lowercase 65fe0f0bbbSJung-uk Kim * 66fe0f0bbbSJung-uk Kim ******************************************************************************/ 67fe0f0bbbSJung-uk Kim 68fe0f0bbbSJung-uk Kim void 69fe0f0bbbSJung-uk Kim AcpiUtStrlwr ( 70fe0f0bbbSJung-uk Kim char *SrcString) 71fe0f0bbbSJung-uk Kim { 72fe0f0bbbSJung-uk Kim char *String; 73fe0f0bbbSJung-uk Kim 74fe0f0bbbSJung-uk Kim 75fe0f0bbbSJung-uk Kim ACPI_FUNCTION_ENTRY (); 76fe0f0bbbSJung-uk Kim 77fe0f0bbbSJung-uk Kim 78fe0f0bbbSJung-uk Kim if (!SrcString) 79fe0f0bbbSJung-uk Kim { 80fe0f0bbbSJung-uk Kim return; 81fe0f0bbbSJung-uk Kim } 82fe0f0bbbSJung-uk Kim 83fe0f0bbbSJung-uk Kim /* Walk entire string, lowercasing the letters */ 84fe0f0bbbSJung-uk Kim 85fe0f0bbbSJung-uk Kim for (String = SrcString; *String; String++) 86fe0f0bbbSJung-uk Kim { 87fe0f0bbbSJung-uk Kim *String = (char) tolower ((int) *String); 88fe0f0bbbSJung-uk Kim } 89fe0f0bbbSJung-uk Kim } 90fe0f0bbbSJung-uk Kim 91fe0f0bbbSJung-uk Kim 92fe0f0bbbSJung-uk Kim /******************************************************************************* 93fe0f0bbbSJung-uk Kim * 94fe0f0bbbSJung-uk Kim * FUNCTION: AcpiUtStrupr (strupr) 95fe0f0bbbSJung-uk Kim * 96fe0f0bbbSJung-uk Kim * PARAMETERS: SrcString - The source string to convert 97fe0f0bbbSJung-uk Kim * 98fe0f0bbbSJung-uk Kim * RETURN: None 99fe0f0bbbSJung-uk Kim * 100fe0f0bbbSJung-uk Kim * DESCRIPTION: Convert a string to uppercase 101fe0f0bbbSJung-uk Kim * 102fe0f0bbbSJung-uk Kim ******************************************************************************/ 103fe0f0bbbSJung-uk Kim 104fe0f0bbbSJung-uk Kim void 105fe0f0bbbSJung-uk Kim AcpiUtStrupr ( 106fe0f0bbbSJung-uk Kim char *SrcString) 107fe0f0bbbSJung-uk Kim { 108fe0f0bbbSJung-uk Kim char *String; 109fe0f0bbbSJung-uk Kim 110fe0f0bbbSJung-uk Kim 111fe0f0bbbSJung-uk Kim ACPI_FUNCTION_ENTRY (); 112fe0f0bbbSJung-uk Kim 113fe0f0bbbSJung-uk Kim 114fe0f0bbbSJung-uk Kim if (!SrcString) 115fe0f0bbbSJung-uk Kim { 116fe0f0bbbSJung-uk Kim return; 117fe0f0bbbSJung-uk Kim } 118fe0f0bbbSJung-uk Kim 119fe0f0bbbSJung-uk Kim /* Walk entire string, uppercasing the letters */ 120fe0f0bbbSJung-uk Kim 121fe0f0bbbSJung-uk Kim for (String = SrcString; *String; String++) 122fe0f0bbbSJung-uk Kim { 123fe0f0bbbSJung-uk Kim *String = (char) toupper ((int) *String); 124fe0f0bbbSJung-uk Kim } 125fe0f0bbbSJung-uk Kim } 126fe0f0bbbSJung-uk Kim 127fe0f0bbbSJung-uk Kim 128fe0f0bbbSJung-uk Kim /****************************************************************************** 129fe0f0bbbSJung-uk Kim * 130fe0f0bbbSJung-uk Kim * FUNCTION: AcpiUtStricmp (stricmp) 131fe0f0bbbSJung-uk Kim * 132fe0f0bbbSJung-uk Kim * PARAMETERS: String1 - first string to compare 133fe0f0bbbSJung-uk Kim * String2 - second string to compare 134fe0f0bbbSJung-uk Kim * 135fe0f0bbbSJung-uk Kim * RETURN: int that signifies string relationship. Zero means strings 136fe0f0bbbSJung-uk Kim * are equal. 137fe0f0bbbSJung-uk Kim * 138fe0f0bbbSJung-uk Kim * DESCRIPTION: Case-insensitive string compare. Implementation of the 139fe0f0bbbSJung-uk Kim * non-ANSI stricmp function. 140fe0f0bbbSJung-uk Kim * 141fe0f0bbbSJung-uk Kim ******************************************************************************/ 142fe0f0bbbSJung-uk Kim 143fe0f0bbbSJung-uk Kim int 144fe0f0bbbSJung-uk Kim AcpiUtStricmp ( 145fe0f0bbbSJung-uk Kim char *String1, 146fe0f0bbbSJung-uk Kim char *String2) 147fe0f0bbbSJung-uk Kim { 148fe0f0bbbSJung-uk Kim int c1; 149fe0f0bbbSJung-uk Kim int c2; 150fe0f0bbbSJung-uk Kim 151fe0f0bbbSJung-uk Kim 152fe0f0bbbSJung-uk Kim do 153fe0f0bbbSJung-uk Kim { 154fe0f0bbbSJung-uk Kim c1 = tolower ((int) *String1); 155fe0f0bbbSJung-uk Kim c2 = tolower ((int) *String2); 156fe0f0bbbSJung-uk Kim 157fe0f0bbbSJung-uk Kim String1++; 158fe0f0bbbSJung-uk Kim String2++; 159fe0f0bbbSJung-uk Kim } 160fe0f0bbbSJung-uk Kim while ((c1 == c2) && (c1)); 161fe0f0bbbSJung-uk Kim 162fe0f0bbbSJung-uk Kim return (c1 - c2); 163fe0f0bbbSJung-uk Kim } 164fe0f0bbbSJung-uk Kim 165fe0f0bbbSJung-uk Kim 166fe0f0bbbSJung-uk Kim #if defined (ACPI_DEBUGGER) || defined (ACPI_APPLICATION) 167fe0f0bbbSJung-uk Kim /******************************************************************************* 168fe0f0bbbSJung-uk Kim * 169f8146b88SJung-uk Kim * FUNCTION: AcpiUtSafeStrcpy, AcpiUtSafeStrcat, AcpiUtSafeStrncat 170fe0f0bbbSJung-uk Kim * 171fe0f0bbbSJung-uk Kim * PARAMETERS: Adds a "DestSize" parameter to each of the standard string 172fe0f0bbbSJung-uk Kim * functions. This is the size of the Destination buffer. 173fe0f0bbbSJung-uk Kim * 174fe0f0bbbSJung-uk Kim * RETURN: TRUE if the operation would overflow the destination buffer. 175fe0f0bbbSJung-uk Kim * 176fe0f0bbbSJung-uk Kim * DESCRIPTION: Safe versions of standard Clib string functions. Ensure that 177fe0f0bbbSJung-uk Kim * the result of the operation will not overflow the output string 178fe0f0bbbSJung-uk Kim * buffer. 179fe0f0bbbSJung-uk Kim * 180fe0f0bbbSJung-uk Kim * NOTE: These functions are typically only helpful for processing 181fe0f0bbbSJung-uk Kim * user input and command lines. For most ACPICA code, the 182fe0f0bbbSJung-uk Kim * required buffer length is precisely calculated before buffer 183fe0f0bbbSJung-uk Kim * allocation, so the use of these functions is unnecessary. 184fe0f0bbbSJung-uk Kim * 185fe0f0bbbSJung-uk Kim ******************************************************************************/ 186fe0f0bbbSJung-uk Kim 187fe0f0bbbSJung-uk Kim BOOLEAN 188fe0f0bbbSJung-uk Kim AcpiUtSafeStrcpy ( 189fe0f0bbbSJung-uk Kim char *Dest, 190fe0f0bbbSJung-uk Kim ACPI_SIZE DestSize, 191fe0f0bbbSJung-uk Kim char *Source) 192fe0f0bbbSJung-uk Kim { 193fe0f0bbbSJung-uk Kim 194fe0f0bbbSJung-uk Kim if (strlen (Source) >= DestSize) 195fe0f0bbbSJung-uk Kim { 196fe0f0bbbSJung-uk Kim return (TRUE); 197fe0f0bbbSJung-uk Kim } 198fe0f0bbbSJung-uk Kim 199fe0f0bbbSJung-uk Kim strcpy (Dest, Source); 200fe0f0bbbSJung-uk Kim return (FALSE); 201fe0f0bbbSJung-uk Kim } 202fe0f0bbbSJung-uk Kim 203fe0f0bbbSJung-uk Kim BOOLEAN 204fe0f0bbbSJung-uk Kim AcpiUtSafeStrcat ( 205fe0f0bbbSJung-uk Kim char *Dest, 206fe0f0bbbSJung-uk Kim ACPI_SIZE DestSize, 207fe0f0bbbSJung-uk Kim char *Source) 208fe0f0bbbSJung-uk Kim { 209fe0f0bbbSJung-uk Kim 210fe0f0bbbSJung-uk Kim if ((strlen (Dest) + strlen (Source)) >= DestSize) 211fe0f0bbbSJung-uk Kim { 212fe0f0bbbSJung-uk Kim return (TRUE); 213fe0f0bbbSJung-uk Kim } 214fe0f0bbbSJung-uk Kim 215fe0f0bbbSJung-uk Kim strcat (Dest, Source); 216fe0f0bbbSJung-uk Kim return (FALSE); 217fe0f0bbbSJung-uk Kim } 218f8146b88SJung-uk Kim 219f8146b88SJung-uk Kim BOOLEAN 220f8146b88SJung-uk Kim AcpiUtSafeStrncat ( 221f8146b88SJung-uk Kim char *Dest, 222f8146b88SJung-uk Kim ACPI_SIZE DestSize, 223f8146b88SJung-uk Kim char *Source, 224f8146b88SJung-uk Kim ACPI_SIZE MaxTransferLength) 225f8146b88SJung-uk Kim { 226f8146b88SJung-uk Kim ACPI_SIZE ActualTransferLength; 227f8146b88SJung-uk Kim 228f8146b88SJung-uk Kim 229f8146b88SJung-uk Kim ActualTransferLength = ACPI_MIN (MaxTransferLength, strlen (Source)); 230f8146b88SJung-uk Kim 231f8146b88SJung-uk Kim if ((strlen (Dest) + ActualTransferLength) >= DestSize) 232f8146b88SJung-uk Kim { 233f8146b88SJung-uk Kim return (TRUE); 234f8146b88SJung-uk Kim } 235f8146b88SJung-uk Kim 236f8146b88SJung-uk Kim strncat (Dest, Source, MaxTransferLength); 237f8146b88SJung-uk Kim return (FALSE); 238f8146b88SJung-uk Kim } 239f8146b88SJung-uk Kim #endif 240