utclib.c revision 7b1019a6d29ccb7999dc76cba3dde1c627e8e609
6a67d144095c31bbafed93cec1619590157335eajvergara/******************************************************************************
6a67d144095c31bbafed93cec1619590157335eajvergara * Module Name: utclib - ACPICA implementations of C library functions
6a67d144095c31bbafed93cec1619590157335eajvergara *****************************************************************************/
6a67d144095c31bbafed93cec1619590157335eajvergara * Copyright (C) 2000 - 2016, Intel Corp.
8cf870d281dc8c242f083d14dfef05f24aa5fceeJnRouvignac * All rights reserved.
6a67d144095c31bbafed93cec1619590157335eajvergara * Redistribution and use in source and binary forms, with or without
6a67d144095c31bbafed93cec1619590157335eajvergara * modification, are permitted provided that the following conditions
6a67d144095c31bbafed93cec1619590157335eajvergara * 1. Redistributions of source code must retain the above copyright
8cf870d281dc8c242f083d14dfef05f24aa5fceeJnRouvignac * notice, this list of conditions, and the following disclaimer,
8cf870d281dc8c242f083d14dfef05f24aa5fceeJnRouvignac * without modification.
8cf870d281dc8c242f083d14dfef05f24aa5fceeJnRouvignac * 2. Redistributions in binary form must reproduce at minimum a disclaimer
8cf870d281dc8c242f083d14dfef05f24aa5fceeJnRouvignac * substantially similar to the "NO WARRANTY" disclaimer below
6a67d144095c31bbafed93cec1619590157335eajvergara * ("Disclaimer") and any redistribution must be conditioned upon
6a67d144095c31bbafed93cec1619590157335eajvergara * including a substantially similar Disclaimer requirement for further
6a67d144095c31bbafed93cec1619590157335eajvergara * binary redistribution.
6a67d144095c31bbafed93cec1619590157335eajvergara * 3. Neither the names of the above-listed copyright holders nor the names
6a67d144095c31bbafed93cec1619590157335eajvergara * of any contributors may be used to endorse or promote products derived
f14a485fcb48f77d077a14b766f0acc097093fe5jvergara * from this software without specific prior written permission.
6a67d144095c31bbafed93cec1619590157335eajvergara * Alternatively, this software may be distributed under the terms of the
6a67d144095c31bbafed93cec1619590157335eajvergara * GNU General Public License ("GPL") version 2 as published by the Free
6a67d144095c31bbafed93cec1619590157335eajvergara * Software Foundation.
6a67d144095c31bbafed93cec1619590157335eajvergara * NO WARRANTY
6a67d144095c31bbafed93cec1619590157335eajvergara * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
6a67d144095c31bbafed93cec1619590157335eajvergara * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
7b6b125d52edabd5b1c9134feef7aeae0e69499ekenneth_suter * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
7b6b125d52edabd5b1c9134feef7aeae0e69499ekenneth_suter * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
6a67d144095c31bbafed93cec1619590157335eajvergara * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
6a67d144095c31bbafed93cec1619590157335eajvergara * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
6a67d144095c31bbafed93cec1619590157335eajvergara * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
6a67d144095c31bbafed93cec1619590157335eajvergara * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
6a67d144095c31bbafed93cec1619590157335eajvergara * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
5b9085a87d43ed3ae0b149a9c79ba57723733185jvergara * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
6a67d144095c31bbafed93cec1619590157335eajvergara * POSSIBILITY OF SUCH DAMAGES.
5b3741e0620fd2baaa974cecc2c2d953bb7d4fbbkenneth_suter * This module contains implementations of the standard C library functions
6a67d144095c31bbafed93cec1619590157335eajvergara * that are required by the ACPICA code at both application level and kernel
6a67d144095c31bbafed93cec1619590157335eajvergara * The module is an optional feature that can be used if a local/system
6a67d144095c31bbafed93cec1619590157335eajvergara * C library is not available. Some operating system kernels may not have
6a67d144095c31bbafed93cec1619590157335eajvergara * an internal C library.
6a67d144095c31bbafed93cec1619590157335eajvergara * In general, these functions are less efficient than an inline or assembly
6a67d144095c31bbafed93cec1619590157335eajvergara * code implementation.
6a67d144095c31bbafed93cec1619590157335eajvergara * These C functions and the associated prototypes are enabled by default
7b6b125d52edabd5b1c9134feef7aeae0e69499ekenneth_suter * unless the ACPI_USE_SYSTEM_CLIBRARY symbol is defined. This is usually
7b6b125d52edabd5b1c9134feef7aeae0e69499ekenneth_suter * automatically defined for the ACPICA applications such as iASL and
7b6b125d52edabd5b1c9134feef7aeae0e69499ekenneth_suter * AcpiExec, so that these user-level applications use the local C library
6a67d144095c31bbafed93cec1619590157335eajvergara * instead of the functions in this module.
6a67d144095c31bbafed93cec1619590157335eajvergara/*******************************************************************************
6a67d144095c31bbafed93cec1619590157335eajvergara * Functions implemented in this module:
6a67d144095c31bbafed93cec1619590157335eajvergara * FUNCTION: memcmp
6a67d144095c31bbafed93cec1619590157335eajvergara * FUNCTION: memcpy
6a67d144095c31bbafed93cec1619590157335eajvergara * FUNCTION: memset
6a67d144095c31bbafed93cec1619590157335eajvergara * FUNCTION: strlen
6a67d144095c31bbafed93cec1619590157335eajvergara * FUNCTION: strcpy
3e6ff045d382a718a951d6305c8910ffc268f893kenneth_suter * FUNCTION: strncpy
6a67d144095c31bbafed93cec1619590157335eajvergara * FUNCTION: strcmp
6a67d144095c31bbafed93cec1619590157335eajvergara * FUNCTION: strchr
6a67d144095c31bbafed93cec1619590157335eajvergara * FUNCTION: strncmp
6a67d144095c31bbafed93cec1619590157335eajvergara * FUNCTION: strcat
6a67d144095c31bbafed93cec1619590157335eajvergara * FUNCTION: strncat
6a67d144095c31bbafed93cec1619590157335eajvergara * FUNCTION: strstr
857225469c51bedb8c0566aa7757800cfaac4075kenneth_suter * FUNCTION: strtoul
5b3741e0620fd2baaa974cecc2c2d953bb7d4fbbkenneth_suter * FUNCTION: toupper
0142bbb7ccb5d0efb942c20f5d27e5ddfb4344fdkenneth_suter * FUNCTION: tolower
0142bbb7ccb5d0efb942c20f5d27e5ddfb4344fdkenneth_suter * FUNCTION: is* functions
2401d3c2af505789c7c3b860a43e973f27731243jvergara ******************************************************************************/
6a67d144095c31bbafed93cec1619590157335eajvergara#ifndef ACPI_USE_SYSTEM_CLIBRARY /* Entire module */
0142bbb7ccb5d0efb942c20f5d27e5ddfb4344fdkenneth_suter/*******************************************************************************
5b3741e0620fd2baaa974cecc2c2d953bb7d4fbbkenneth_suter * FUNCTION: memcmp
6a67d144095c31bbafed93cec1619590157335eajvergara * PARAMETERS: Buffer1 - First Buffer
5b3741e0620fd2baaa974cecc2c2d953bb7d4fbbkenneth_suter * Buffer2 - Second Buffer
5b3741e0620fd2baaa974cecc2c2d953bb7d4fbbkenneth_suter * Count - Maximum # of bytes to compare
53247d28ba99538f841a13ea2cde01c3faa3ef36kenneth_suter * RETURN: Index where Buffers mismatched, or 0 if Buffers matched
5b3741e0620fd2baaa974cecc2c2d953bb7d4fbbkenneth_suter * DESCRIPTION: Compare two Buffers, with a maximum length
5b3741e0620fd2baaa974cecc2c2d953bb7d4fbbkenneth_suter ******************************************************************************/
6a67d144095c31bbafed93cec1619590157335eajvergara for ( ; Count-- && (*Buffer1 == *Buffer2); Buffer1++, Buffer2++)
a7d59bf59f3b588e70b86d920e0ab271496f4f06kenneth_suter return ((Count == ACPI_SIZE_MAX) ? 0 : ((unsigned char) *Buffer1 -
5b3741e0620fd2baaa974cecc2c2d953bb7d4fbbkenneth_suter (unsigned char) *Buffer2));
6a67d144095c31bbafed93cec1619590157335eajvergara/*******************************************************************************
6a67d144095c31bbafed93cec1619590157335eajvergara * FUNCTION: memcpy
2401d3c2af505789c7c3b860a43e973f27731243jvergara * PARAMETERS: Dest - Target of the copy
2401d3c2af505789c7c3b860a43e973f27731243jvergara * Src - Source buffer to copy
2401d3c2af505789c7c3b860a43e973f27731243jvergara * Count - Number of bytes to copy
2401d3c2af505789c7c3b860a43e973f27731243jvergara * RETURN: Dest
2401d3c2af505789c7c3b860a43e973f27731243jvergara * DESCRIPTION: Copy arbitrary bytes of memory
faf590fc96c28da606c8802466a4d95bd940a495jvergara ******************************************************************************/
2401d3c2af505789c7c3b860a43e973f27731243jvergara const void *Src,
6a67d144095c31bbafed93cec1619590157335eajvergara/*******************************************************************************
6a67d144095c31bbafed93cec1619590157335eajvergara * FUNCTION: memset
3e6ff045d382a718a951d6305c8910ffc268f893kenneth_suter * PARAMETERS: Dest - Buffer to set
6a67d144095c31bbafed93cec1619590157335eajvergara * Value - Value to set each byte of memory
6a67d144095c31bbafed93cec1619590157335eajvergara * Count - Number of bytes to set
6a67d144095c31bbafed93cec1619590157335eajvergara * RETURN: Dest
0877596da3b90efc5fd39171cef80a2fb8ec395ekenneth_suter * DESCRIPTION: Initialize a buffer to a known value.
6a67d144095c31bbafed93cec1619590157335eajvergara ******************************************************************************/
6a67d144095c31bbafed93cec1619590157335eajvergara/*******************************************************************************
6a67d144095c31bbafed93cec1619590157335eajvergara * FUNCTION: strlen
6a67d144095c31bbafed93cec1619590157335eajvergara * PARAMETERS: String - Null terminated string
6a67d144095c31bbafed93cec1619590157335eajvergara * RETURN: Length
6a67d144095c31bbafed93cec1619590157335eajvergara * DESCRIPTION: Returns the length of the input string
6a67d144095c31bbafed93cec1619590157335eajvergara ******************************************************************************/
6a67d144095c31bbafed93cec1619590157335eajvergara const char *String)
6a67d144095c31bbafed93cec1619590157335eajvergara /* Count the string until a null is encountered */
6a67d144095c31bbafed93cec1619590157335eajvergara/*******************************************************************************
6a67d144095c31bbafed93cec1619590157335eajvergara * FUNCTION: strcpy
6a67d144095c31bbafed93cec1619590157335eajvergara * PARAMETERS: DstString - Target of the copy
6a67d144095c31bbafed93cec1619590157335eajvergara * SrcString - The source string to copy
6a67d144095c31bbafed93cec1619590157335eajvergara * RETURN: DstString
6a67d144095c31bbafed93cec1619590157335eajvergara * DESCRIPTION: Copy a null terminated string
6a67d144095c31bbafed93cec1619590157335eajvergara ******************************************************************************/
6a67d144095c31bbafed93cec1619590157335eajvergara /* Move bytes brute force */
6a67d144095c31bbafed93cec1619590157335eajvergara /* Null terminate */
6a67d144095c31bbafed93cec1619590157335eajvergara/*******************************************************************************
6a67d144095c31bbafed93cec1619590157335eajvergara * FUNCTION: strncpy
c9d984b0d2c0fda320e79eb3868dd6fbeb1ffa34jvergara * PARAMETERS: DstString - Target of the copy
6a67d144095c31bbafed93cec1619590157335eajvergara * SrcString - The source string to copy
6a67d144095c31bbafed93cec1619590157335eajvergara * Count - Maximum # of bytes to copy
6a67d144095c31bbafed93cec1619590157335eajvergara * RETURN: DstString
6a67d144095c31bbafed93cec1619590157335eajvergara * DESCRIPTION: Copy a null terminated string, with a maximum length
6a67d144095c31bbafed93cec1619590157335eajvergara ******************************************************************************/
6a67d144095c31bbafed93cec1619590157335eajvergara /* Copy the string */
6a67d144095c31bbafed93cec1619590157335eajvergara /* Pad with nulls if necessary */
6a67d144095c31bbafed93cec1619590157335eajvergara /* Return original pointer */
6a67d144095c31bbafed93cec1619590157335eajvergara/*******************************************************************************
6a67d144095c31bbafed93cec1619590157335eajvergara * FUNCTION: strcmp
6a67d144095c31bbafed93cec1619590157335eajvergara * PARAMETERS: String1 - First string
c9d984b0d2c0fda320e79eb3868dd6fbeb1ffa34jvergara * String2 - Second string
6a67d144095c31bbafed93cec1619590157335eajvergara * RETURN: Index where strings mismatched, or 0 if strings matched
6a67d144095c31bbafed93cec1619590157335eajvergara * DESCRIPTION: Compare two null terminated strings
6a67d144095c31bbafed93cec1619590157335eajvergara ******************************************************************************/
c9d984b0d2c0fda320e79eb3868dd6fbeb1ffa34jvergara const char *String1,
c9d984b0d2c0fda320e79eb3868dd6fbeb1ffa34jvergara const char *String2)
6a67d144095c31bbafed93cec1619590157335eajvergara return (0);
6a67d144095c31bbafed93cec1619590157335eajvergara return ((unsigned char) *String1 - (unsigned char) *String2);
5b3741e0620fd2baaa974cecc2c2d953bb7d4fbbkenneth_suter/*******************************************************************************
6a67d144095c31bbafed93cec1619590157335eajvergara * FUNCTION: strchr
6a67d144095c31bbafed93cec1619590157335eajvergara * PARAMETERS: String - Search string
6a67d144095c31bbafed93cec1619590157335eajvergara * ch - character to search for
5b3741e0620fd2baaa974cecc2c2d953bb7d4fbbkenneth_suter * RETURN: Ptr to char or NULL if not found
6a67d144095c31bbafed93cec1619590157335eajvergara * DESCRIPTION: Search a string for a character
5b3741e0620fd2baaa974cecc2c2d953bb7d4fbbkenneth_suter ******************************************************************************/
6a67d144095c31bbafed93cec1619590157335eajvergara const char *String,
6a67d144095c31bbafed93cec1619590157335eajvergara return ((char *) String);
6a67d144095c31bbafed93cec1619590157335eajvergara/*******************************************************************************
6a67d144095c31bbafed93cec1619590157335eajvergara * FUNCTION: strncmp
6a67d144095c31bbafed93cec1619590157335eajvergara * PARAMETERS: String1 - First string
6a67d144095c31bbafed93cec1619590157335eajvergara * String2 - Second string
6a67d144095c31bbafed93cec1619590157335eajvergara * Count - Maximum # of bytes to compare
0142bbb7ccb5d0efb942c20f5d27e5ddfb4344fdkenneth_suter * RETURN: Index where strings mismatched, or 0 if strings matched
6a67d144095c31bbafed93cec1619590157335eajvergara * DESCRIPTION: Compare two null terminated strings, with a maximum length
6a67d144095c31bbafed93cec1619590157335eajvergara ******************************************************************************/
6a67d144095c31bbafed93cec1619590157335eajvergara const char *String1,
6a67d144095c31bbafed93cec1619590157335eajvergara const char *String2,
6a67d144095c31bbafed93cec1619590157335eajvergara for ( ; Count-- && (*String1 == *String2); String2++)
2401d3c2af505789c7c3b860a43e973f27731243jvergara return (0);
6a67d144095c31bbafed93cec1619590157335eajvergara return ((Count == ACPI_SIZE_MAX) ? 0 : ((unsigned char) *String1 -
5b3741e0620fd2baaa974cecc2c2d953bb7d4fbbkenneth_suter (unsigned char) *String2));
6a67d144095c31bbafed93cec1619590157335eajvergara/*******************************************************************************
6a67d144095c31bbafed93cec1619590157335eajvergara * FUNCTION: strcat
6a67d144095c31bbafed93cec1619590157335eajvergara * PARAMETERS: DstString - Target of the copy
6a67d144095c31bbafed93cec1619590157335eajvergara * SrcString - The source string to copy
6a67d144095c31bbafed93cec1619590157335eajvergara * RETURN: DstString
5b3741e0620fd2baaa974cecc2c2d953bb7d4fbbkenneth_suter * DESCRIPTION: Append a null terminated string to a null terminated string
7b6b125d52edabd5b1c9134feef7aeae0e69499ekenneth_suter ******************************************************************************/
6a67d144095c31bbafed93cec1619590157335eajvergara /* Find end of the destination string */
6a67d144095c31bbafed93cec1619590157335eajvergara /* Concatenate the string */
6a67d144095c31bbafed93cec1619590157335eajvergara/*******************************************************************************
6a67d144095c31bbafed93cec1619590157335eajvergara * FUNCTION: strncat
6a67d144095c31bbafed93cec1619590157335eajvergara * PARAMETERS: DstString - Target of the copy
6a67d144095c31bbafed93cec1619590157335eajvergara * SrcString - The source string to copy
6a67d144095c31bbafed93cec1619590157335eajvergara * Count - Maximum # of bytes to copy
6a67d144095c31bbafed93cec1619590157335eajvergara * RETURN: DstString
6a67d144095c31bbafed93cec1619590157335eajvergara * DESCRIPTION: Append a null terminated string to a null terminated string,
6a67d144095c31bbafed93cec1619590157335eajvergara * with a maximum count.
6a67d144095c31bbafed93cec1619590157335eajvergara ******************************************************************************/
6a67d144095c31bbafed93cec1619590157335eajvergara /* Find end of the destination string */
5b3741e0620fd2baaa974cecc2c2d953bb7d4fbbkenneth_suter /* Concatenate the string */
6a67d144095c31bbafed93cec1619590157335eajvergara for (--String; (*String++ = *SrcString++) && --Count; )
7b6b125d52edabd5b1c9134feef7aeae0e69499ekenneth_suter /* Null terminate if necessary */
5b3741e0620fd2baaa974cecc2c2d953bb7d4fbbkenneth_suter/*******************************************************************************
6a67d144095c31bbafed93cec1619590157335eajvergara * FUNCTION: strstr
6a67d144095c31bbafed93cec1619590157335eajvergara * PARAMETERS: String1 - Target string
6a67d144095c31bbafed93cec1619590157335eajvergara * String2 - Substring to search for
6a67d144095c31bbafed93cec1619590157335eajvergara * RETURN: Where substring match starts, Null if no match found
7056ae8910decb0d96b430451ac58b99526eb0d9jvergara * DESCRIPTION: Checks if String2 occurs in String1. This is not really a
7056ae8910decb0d96b430451ac58b99526eb0d9jvergara * full implementation of strstr, only sufficient for command
6a67d144095c31bbafed93cec1619590157335eajvergara ******************************************************************************/
strstr (
char *String1,
char *String2)
if (!Length)
return (String1);
return (String1);
String1++;
return (NULL);
strtoul (
const char *String,
char **Terminator,
const char *StringStart;
++String;
++String;
++String;
if (Base == 0)
++String;
goto done;
String++;
String++;
while (*String)
goto done;
goto done;
++String;
done:
if (Terminator)
return (ReturnValue);
toupper (
tolower (