1  /*******************************************************************************
2   *
3   * Module Name: utnonansi - Non-ansi C library functions
4   *
5   ******************************************************************************/
6  
7  /*
8   * Copyright (C) 2000 - 2019, 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 "acpi.h"
45  #include "accommon.h"
46  
47  
48  #define _COMPONENT          ACPI_UTILITIES
49          ACPI_MODULE_NAME    ("utnonansi")
50  
51  /*
52   * Non-ANSI C library functions - strlwr, strupr, stricmp, and "safe"
53   * string functions.
54   */
55  
56  /*******************************************************************************
57   *
58   * FUNCTION:    AcpiUtStrlwr (strlwr)
59   *
60   * PARAMETERS:  SrcString       - The source string to convert
61   *
62   * RETURN:      None
63   *
64   * DESCRIPTION: Convert a string to lowercase
65   *
66   ******************************************************************************/
67  
68  void
69  AcpiUtStrlwr (
70      char                    *SrcString)
71  {
72      char                    *String;
73  
74  
75      ACPI_FUNCTION_ENTRY ();
76  
77  
78      if (!SrcString)
79      {
80          return;
81      }
82  
83      /* Walk entire string, lowercasing the letters */
84  
85      for (String = SrcString; *String; String++)
86      {
87          *String = (char) tolower ((int) *String);
88      }
89  }
90  
91  
92  /*******************************************************************************
93   *
94   * FUNCTION:    AcpiUtStrupr (strupr)
95   *
96   * PARAMETERS:  SrcString       - The source string to convert
97   *
98   * RETURN:      None
99   *
100   * DESCRIPTION: Convert a string to uppercase
101   *
102   ******************************************************************************/
103  
104  void
105  AcpiUtStrupr (
106      char                    *SrcString)
107  {
108      char                    *String;
109  
110  
111      ACPI_FUNCTION_ENTRY ();
112  
113  
114      if (!SrcString)
115      {
116          return;
117      }
118  
119      /* Walk entire string, uppercasing the letters */
120  
121      for (String = SrcString; *String; String++)
122      {
123          *String = (char) toupper ((int) *String);
124      }
125  }
126  
127  
128  /******************************************************************************
129   *
130   * FUNCTION:    AcpiUtStricmp (stricmp)
131   *
132   * PARAMETERS:  String1             - first string to compare
133   *              String2             - second string to compare
134   *
135   * RETURN:      int that signifies string relationship. Zero means strings
136   *              are equal.
137   *
138   * DESCRIPTION: Case-insensitive string compare. Implementation of the
139   *              non-ANSI stricmp function.
140   *
141   ******************************************************************************/
142  
143  int
144  AcpiUtStricmp (
145      char                    *String1,
146      char                    *String2)
147  {
148      int                     c1;
149      int                     c2;
150  
151  
152      do
153      {
154          c1 = tolower ((int) *String1);
155          c2 = tolower ((int) *String2);
156  
157          String1++;
158          String2++;
159      }
160      while ((c1 == c2) && (c1));
161  
162      return (c1 - c2);
163  }
164  
165  
166  #if defined (ACPI_DEBUGGER) || defined (ACPI_APPLICATION) || defined (ACPI_DEBUG_OUTPUT)
167  /*******************************************************************************
168   *
169   * FUNCTION:    AcpiUtSafeStrcpy, AcpiUtSafeStrcat, AcpiUtSafeStrncat
170   *
171   * PARAMETERS:  Adds a "DestSize" parameter to each of the standard string
172   *              functions. This is the size of the Destination buffer.
173   *
174   * RETURN:      TRUE if the operation would overflow the destination buffer.
175   *
176   * DESCRIPTION: Safe versions of standard Clib string functions. Ensure that
177   *              the result of the operation will not overflow the output string
178   *              buffer.
179   *
180   * NOTE:        These functions are typically only helpful for processing
181   *              user input and command lines. For most ACPICA code, the
182   *              required buffer length is precisely calculated before buffer
183   *              allocation, so the use of these functions is unnecessary.
184   *
185   ******************************************************************************/
186  
187  BOOLEAN
188  AcpiUtSafeStrcpy (
189      char                    *Dest,
190      ACPI_SIZE               DestSize,
191      char                    *Source)
192  {
193  
194      if (strlen (Source) >= DestSize)
195      {
196          return (TRUE);
197      }
198  
199      strcpy (Dest, Source);
200      return (FALSE);
201  }
202  
203  BOOLEAN
204  AcpiUtSafeStrcat (
205      char                    *Dest,
206      ACPI_SIZE               DestSize,
207      char                    *Source)
208  {
209  
210      if ((strlen (Dest) + strlen (Source)) >= DestSize)
211      {
212          return (TRUE);
213      }
214  
215      strcat (Dest, Source);
216      return (FALSE);
217  }
218  
219  BOOLEAN
220  AcpiUtSafeStrncat (
221      char                    *Dest,
222      ACPI_SIZE               DestSize,
223      char                    *Source,
224      ACPI_SIZE               MaxTransferLength)
225  {
226      ACPI_SIZE               ActualTransferLength;
227  
228  
229      ActualTransferLength = ACPI_MIN (MaxTransferLength, strlen (Source));
230  
231      if ((strlen (Dest) + ActualTransferLength) >= DestSize)
232      {
233          return (TRUE);
234      }
235  
236      strncat (Dest, Source, MaxTransferLength);
237      return (FALSE);
238  }
239  
240  void
241  AcpiUtSafeStrncpy (
242      char                    *Dest,
243      char                    *Source,
244      ACPI_SIZE               DestSize)
245  {
246      /* Always terminate destination string */
247  
248      strncpy (Dest, Source, DestSize);
249      Dest[DestSize - 1] = 0;
250  }
251  
252  #endif
253