text: /*******************************************************************************
   *
   * Module Name: utnonansi - Non-ansi C library functions
   *
   ******************************************************************************/
  
  /*
   * Copyright (C) 2000 - 2020, Intel Corp.
   * All rights reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   * 1. Redistributions of source code must retain the above copyright
   *    notice, this list of conditions, and the following disclaimer,
   *    without modification.
   * 2. Redistributions in binary form must reproduce at minimum a disclaimer
   *    substantially similar to the "NO WARRANTY" disclaimer below
   *    ("Disclaimer") and any redistribution must be conditioned upon
   *    including a substantially similar Disclaimer requirement for further
   *    binary redistribution.
   * 3. Neither the names of the above-listed copyright holders nor the names
   *    of any contributors may be used to endorse or promote products derived
   *    from this software without specific prior written permission.
   *
   * Alternatively, this software may be distributed under the terms of the
   * GNU General Public License ("GPL") version 2 as published by the Free
   * Software Foundation.
   *
   * NO WARRANTY
   * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
   * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
   * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
   * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
   * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
   * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
   * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
   * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
   * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
   * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
   * POSSIBILITY OF SUCH DAMAGES.
   */
  
  #include "acpi.h"
  #include "accommon.h"
  
  
  #define _COMPONENT          ACPI_UTILITIES
          ACPI_MODULE_NAME    ("utnonansi")
  
  /*
   * Non-ANSI C library functions - strlwr, strupr, stricmp, and "safe"
   * string functions.
   */
  
  /*******************************************************************************
   *
   * FUNCTION:    AcpiUtStrlwr (strlwr)
   *
   * PARAMETERS:  SrcString       - The source string to convert
   *
   * RETURN:      None
   *
   * DESCRIPTION: Convert a string to lowercase
   *
   ******************************************************************************/
  
  void
  AcpiUtStrlwr (
      char                    *SrcString)
  {
      char                    *String;
  
  
      ACPI_FUNCTION_ENTRY ();
  
  
      if (!SrcString)
      {
          return;
      }
  
      /* Walk entire string, lowercasing the letters */
  
      for (String = SrcString; *String; String++)
      {
          *String = (char) tolower ((int) *String);
      }
  }
  
  
  /*******************************************************************************
   *
   * FUNCTION:    AcpiUtStrupr (strupr)
   *
   * PARAMETERS:  SrcString       - The source string to convert
   *
   * RETURN:      None
   *
   * DESCRIPTION: Convert a string to uppercase
   *
   ******************************************************************************/
  
  void
  AcpiUtStrupr (
      char                    *SrcString)
  {
      char                    *String;
  
  
      ACPI_FUNCTION_ENTRY ();
  
  
      if (!SrcString)
      {
          return;
      }
  
      /* Walk entire string, uppercasing the letters */
  
      for (String = SrcString; *String; String++)
      {
          *String = (char) toupper ((int) *String);
      }
  }
  
  
  /******************************************************************************
   *
   * FUNCTION:    AcpiUtStricmp (stricmp)
   *
   * PARAMETERS:  String1             - first string to compare
   *              String2             - second string to compare
   *
   * RETURN:      int that signifies string relationship. Zero means strings
   *              are equal.
   *
   * DESCRIPTION: Case-insensitive string compare. Implementation of the
   *              non-ANSI stricmp function.
   *
   ******************************************************************************/
  
  int
  AcpiUtStricmp (
      char                    *String1,
      char                    *String2)
  {
      int                     c1;
      int                     c2;
  
  
      do
      {
          c1 = tolower ((int) *String1);
          c2 = tolower ((int) *String2);
  
          String1++;
          String2++;
      }
      while ((c1 == c2) && (c1));
  
      return (c1 - c2);
  }
  
  
  #if defined (ACPI_DEBUGGER) || defined (ACPI_APPLICATION) || defined (ACPI_DEBUG_OUTPUT)
  /*******************************************************************************
   *
   * FUNCTION:    AcpiUtSafeStrcpy, AcpiUtSafeStrcat, AcpiUtSafeStrncat
   *
   * PARAMETERS:  Adds a "DestSize" parameter to each of the standard string
   *              functions. This is the size of the Destination buffer.
   *
   * RETURN:      TRUE if the operation would overflow the destination buffer.
   *
   * DESCRIPTION: Safe versions of standard Clib string functions. Ensure that
   *              the result of the operation will not overflow the output string
   *              buffer.
   *
   * NOTE:        These functions are typically only helpful for processing
   *              user input and command lines. For most ACPICA code, the
   *              required buffer length is precisely calculated before buffer
   *              allocation, so the use of these functions is unnecessary.
   *
   ******************************************************************************/
  
  BOOLEAN
  AcpiUtSafeStrcpy (
      char                    *Dest,
      ACPI_SIZE               DestSize,
      char                    *Source)
  {
  
      if (strlen (Source) >= DestSize)
      {
          return (TRUE);
      }
  
      strcpy (Dest, Source);
      return (FALSE);
  }
  
  BOOLEAN
  AcpiUtSafeStrcat (
      char                    *Dest,
      ACPI_SIZE               DestSize,
      char                    *Source)
  {
  
      if ((strlen (Dest) + strlen (Source)) >= DestSize)
      {
          return (TRUE);
      }
  
      strcat (Dest, Source);
      return (FALSE);
  }
  
  BOOLEAN
  AcpiUtSafeStrncat (
      char                    *Dest,
      ACPI_SIZE               DestSize,
      char                    *Source,
      ACPI_SIZE               MaxTransferLength)
  {
      ACPI_SIZE               ActualTransferLength;
  
  
      ActualTransferLength = ACPI_MIN (MaxTransferLength, strlen (Source));
  
      if ((strlen (Dest) + ActualTransferLength) >= DestSize)
      {
          return (TRUE);
      }
  
      strncat (Dest, Source, MaxTransferLength);
      return (FALSE);
  }
  
  void
  AcpiUtSafeStrncpy (
      char                    *Dest,
      char                    *Source,
      ACPI_SIZE               DestSize)
  {
      /* Always terminate destination string */
  
      strncpy (Dest, Source, DestSize);
      Dest[DestSize - 1] = 0;
  }
  
  #endif
  