1*4882a593Smuzhiyun // SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0
2*4882a593Smuzhiyun /*******************************************************************************
3*4882a593Smuzhiyun *
4*4882a593Smuzhiyun * Module Name: utnonansi - Non-ansi C library functions
5*4882a593Smuzhiyun *
6*4882a593Smuzhiyun ******************************************************************************/
7*4882a593Smuzhiyun
8*4882a593Smuzhiyun #include <acpi/acpi.h>
9*4882a593Smuzhiyun #include "accommon.h"
10*4882a593Smuzhiyun
11*4882a593Smuzhiyun #define _COMPONENT ACPI_UTILITIES
12*4882a593Smuzhiyun ACPI_MODULE_NAME("utnonansi")
13*4882a593Smuzhiyun
14*4882a593Smuzhiyun /*
15*4882a593Smuzhiyun * Non-ANSI C library functions - strlwr, strupr, stricmp, and "safe"
16*4882a593Smuzhiyun * string functions.
17*4882a593Smuzhiyun */
18*4882a593Smuzhiyun /*******************************************************************************
19*4882a593Smuzhiyun *
20*4882a593Smuzhiyun * FUNCTION: acpi_ut_strlwr (strlwr)
21*4882a593Smuzhiyun *
22*4882a593Smuzhiyun * PARAMETERS: src_string - The source string to convert
23*4882a593Smuzhiyun *
24*4882a593Smuzhiyun * RETURN: None
25*4882a593Smuzhiyun *
26*4882a593Smuzhiyun * DESCRIPTION: Convert a string to lowercase
27*4882a593Smuzhiyun *
28*4882a593Smuzhiyun ******************************************************************************/
acpi_ut_strlwr(char * src_string)29*4882a593Smuzhiyun void acpi_ut_strlwr(char *src_string)
30*4882a593Smuzhiyun {
31*4882a593Smuzhiyun char *string;
32*4882a593Smuzhiyun
33*4882a593Smuzhiyun ACPI_FUNCTION_ENTRY();
34*4882a593Smuzhiyun
35*4882a593Smuzhiyun if (!src_string) {
36*4882a593Smuzhiyun return;
37*4882a593Smuzhiyun }
38*4882a593Smuzhiyun
39*4882a593Smuzhiyun /* Walk entire string, lowercasing the letters */
40*4882a593Smuzhiyun
41*4882a593Smuzhiyun for (string = src_string; *string; string++) {
42*4882a593Smuzhiyun *string = (char)tolower((int)*string);
43*4882a593Smuzhiyun }
44*4882a593Smuzhiyun }
45*4882a593Smuzhiyun
46*4882a593Smuzhiyun /*******************************************************************************
47*4882a593Smuzhiyun *
48*4882a593Smuzhiyun * FUNCTION: acpi_ut_strupr (strupr)
49*4882a593Smuzhiyun *
50*4882a593Smuzhiyun * PARAMETERS: src_string - The source string to convert
51*4882a593Smuzhiyun *
52*4882a593Smuzhiyun * RETURN: None
53*4882a593Smuzhiyun *
54*4882a593Smuzhiyun * DESCRIPTION: Convert a string to uppercase
55*4882a593Smuzhiyun *
56*4882a593Smuzhiyun ******************************************************************************/
57*4882a593Smuzhiyun
acpi_ut_strupr(char * src_string)58*4882a593Smuzhiyun void acpi_ut_strupr(char *src_string)
59*4882a593Smuzhiyun {
60*4882a593Smuzhiyun char *string;
61*4882a593Smuzhiyun
62*4882a593Smuzhiyun ACPI_FUNCTION_ENTRY();
63*4882a593Smuzhiyun
64*4882a593Smuzhiyun if (!src_string) {
65*4882a593Smuzhiyun return;
66*4882a593Smuzhiyun }
67*4882a593Smuzhiyun
68*4882a593Smuzhiyun /* Walk entire string, uppercasing the letters */
69*4882a593Smuzhiyun
70*4882a593Smuzhiyun for (string = src_string; *string; string++) {
71*4882a593Smuzhiyun *string = (char)toupper((int)*string);
72*4882a593Smuzhiyun }
73*4882a593Smuzhiyun }
74*4882a593Smuzhiyun
75*4882a593Smuzhiyun /******************************************************************************
76*4882a593Smuzhiyun *
77*4882a593Smuzhiyun * FUNCTION: acpi_ut_stricmp (stricmp)
78*4882a593Smuzhiyun *
79*4882a593Smuzhiyun * PARAMETERS: string1 - first string to compare
80*4882a593Smuzhiyun * string2 - second string to compare
81*4882a593Smuzhiyun *
82*4882a593Smuzhiyun * RETURN: int that signifies string relationship. Zero means strings
83*4882a593Smuzhiyun * are equal.
84*4882a593Smuzhiyun *
85*4882a593Smuzhiyun * DESCRIPTION: Case-insensitive string compare. Implementation of the
86*4882a593Smuzhiyun * non-ANSI stricmp function.
87*4882a593Smuzhiyun *
88*4882a593Smuzhiyun ******************************************************************************/
89*4882a593Smuzhiyun
acpi_ut_stricmp(char * string1,char * string2)90*4882a593Smuzhiyun int acpi_ut_stricmp(char *string1, char *string2)
91*4882a593Smuzhiyun {
92*4882a593Smuzhiyun int c1;
93*4882a593Smuzhiyun int c2;
94*4882a593Smuzhiyun
95*4882a593Smuzhiyun do {
96*4882a593Smuzhiyun c1 = tolower((int)*string1);
97*4882a593Smuzhiyun c2 = tolower((int)*string2);
98*4882a593Smuzhiyun
99*4882a593Smuzhiyun string1++;
100*4882a593Smuzhiyun string2++;
101*4882a593Smuzhiyun }
102*4882a593Smuzhiyun while ((c1 == c2) && (c1));
103*4882a593Smuzhiyun
104*4882a593Smuzhiyun return (c1 - c2);
105*4882a593Smuzhiyun }
106*4882a593Smuzhiyun
107*4882a593Smuzhiyun #if defined (ACPI_DEBUGGER) || defined (ACPI_APPLICATION) || defined (ACPI_DEBUG_OUTPUT)
108*4882a593Smuzhiyun /*******************************************************************************
109*4882a593Smuzhiyun *
110*4882a593Smuzhiyun * FUNCTION: acpi_ut_safe_strcpy, acpi_ut_safe_strcat, acpi_ut_safe_strncat
111*4882a593Smuzhiyun *
112*4882a593Smuzhiyun * PARAMETERS: Adds a "DestSize" parameter to each of the standard string
113*4882a593Smuzhiyun * functions. This is the size of the Destination buffer.
114*4882a593Smuzhiyun *
115*4882a593Smuzhiyun * RETURN: TRUE if the operation would overflow the destination buffer.
116*4882a593Smuzhiyun *
117*4882a593Smuzhiyun * DESCRIPTION: Safe versions of standard Clib string functions. Ensure that
118*4882a593Smuzhiyun * the result of the operation will not overflow the output string
119*4882a593Smuzhiyun * buffer.
120*4882a593Smuzhiyun *
121*4882a593Smuzhiyun * NOTE: These functions are typically only helpful for processing
122*4882a593Smuzhiyun * user input and command lines. For most ACPICA code, the
123*4882a593Smuzhiyun * required buffer length is precisely calculated before buffer
124*4882a593Smuzhiyun * allocation, so the use of these functions is unnecessary.
125*4882a593Smuzhiyun *
126*4882a593Smuzhiyun ******************************************************************************/
127*4882a593Smuzhiyun
acpi_ut_safe_strcpy(char * dest,acpi_size dest_size,char * source)128*4882a593Smuzhiyun u8 acpi_ut_safe_strcpy(char *dest, acpi_size dest_size, char *source)
129*4882a593Smuzhiyun {
130*4882a593Smuzhiyun
131*4882a593Smuzhiyun if (strlen(source) >= dest_size) {
132*4882a593Smuzhiyun return (TRUE);
133*4882a593Smuzhiyun }
134*4882a593Smuzhiyun
135*4882a593Smuzhiyun strcpy(dest, source);
136*4882a593Smuzhiyun return (FALSE);
137*4882a593Smuzhiyun }
138*4882a593Smuzhiyun
acpi_ut_safe_strcat(char * dest,acpi_size dest_size,char * source)139*4882a593Smuzhiyun u8 acpi_ut_safe_strcat(char *dest, acpi_size dest_size, char *source)
140*4882a593Smuzhiyun {
141*4882a593Smuzhiyun
142*4882a593Smuzhiyun if ((strlen(dest) + strlen(source)) >= dest_size) {
143*4882a593Smuzhiyun return (TRUE);
144*4882a593Smuzhiyun }
145*4882a593Smuzhiyun
146*4882a593Smuzhiyun strcat(dest, source);
147*4882a593Smuzhiyun return (FALSE);
148*4882a593Smuzhiyun }
149*4882a593Smuzhiyun
150*4882a593Smuzhiyun u8
acpi_ut_safe_strncat(char * dest,acpi_size dest_size,char * source,acpi_size max_transfer_length)151*4882a593Smuzhiyun acpi_ut_safe_strncat(char *dest,
152*4882a593Smuzhiyun acpi_size dest_size,
153*4882a593Smuzhiyun char *source, acpi_size max_transfer_length)
154*4882a593Smuzhiyun {
155*4882a593Smuzhiyun acpi_size actual_transfer_length;
156*4882a593Smuzhiyun
157*4882a593Smuzhiyun actual_transfer_length = ACPI_MIN(max_transfer_length, strlen(source));
158*4882a593Smuzhiyun
159*4882a593Smuzhiyun if ((strlen(dest) + actual_transfer_length) >= dest_size) {
160*4882a593Smuzhiyun return (TRUE);
161*4882a593Smuzhiyun }
162*4882a593Smuzhiyun
163*4882a593Smuzhiyun strncat(dest, source, max_transfer_length);
164*4882a593Smuzhiyun return (FALSE);
165*4882a593Smuzhiyun }
166*4882a593Smuzhiyun
acpi_ut_safe_strncpy(char * dest,char * source,acpi_size dest_size)167*4882a593Smuzhiyun void acpi_ut_safe_strncpy(char *dest, char *source, acpi_size dest_size)
168*4882a593Smuzhiyun {
169*4882a593Smuzhiyun /* Always terminate destination string */
170*4882a593Smuzhiyun
171*4882a593Smuzhiyun strncpy(dest, source, dest_size);
172*4882a593Smuzhiyun dest[dest_size - 1] = 0;
173*4882a593Smuzhiyun }
174*4882a593Smuzhiyun
175*4882a593Smuzhiyun #endif
176