xref: /OK3568_Linux_fs/kernel/drivers/acpi/acpica/utnonansi.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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