xref: /openbmc/linux/drivers/acpi/acpica/utnonansi.c (revision c13aca79ff3c4af5fd31a5b2743a90eba6e36a26)
1*95857638SErik Schmauss // SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0
227629196SBob Moore /*******************************************************************************
327629196SBob Moore  *
427629196SBob Moore  * Module Name: utnonansi - Non-ansi C library functions
527629196SBob Moore  *
627629196SBob Moore  ******************************************************************************/
727629196SBob Moore 
827629196SBob Moore #include <acpi/acpi.h>
927629196SBob Moore #include "accommon.h"
1027629196SBob Moore 
1127629196SBob Moore #define _COMPONENT          ACPI_UTILITIES
1227629196SBob Moore ACPI_MODULE_NAME("utnonansi")
1327629196SBob Moore 
1427629196SBob Moore /*
155ebd2eaaSBob Moore  * Non-ANSI C library functions - strlwr, strupr, stricmp, and "safe"
165ebd2eaaSBob Moore  * string functions.
1727629196SBob Moore  */
1827629196SBob Moore /*******************************************************************************
1927629196SBob Moore  *
2027629196SBob Moore  * FUNCTION:    acpi_ut_strlwr (strlwr)
2127629196SBob Moore  *
2227629196SBob Moore  * PARAMETERS:  src_string      - The source string to convert
2327629196SBob Moore  *
2427629196SBob Moore  * RETURN:      None
2527629196SBob Moore  *
2627629196SBob Moore  * DESCRIPTION: Convert a string to lowercase
2727629196SBob Moore  *
2827629196SBob Moore  ******************************************************************************/
acpi_ut_strlwr(char * src_string)2927629196SBob Moore void acpi_ut_strlwr(char *src_string)
3027629196SBob Moore {
3127629196SBob Moore 	char *string;
3227629196SBob Moore 
3327629196SBob Moore 	ACPI_FUNCTION_ENTRY();
3427629196SBob Moore 
3527629196SBob Moore 	if (!src_string) {
3627629196SBob Moore 		return;
3727629196SBob Moore 	}
3827629196SBob Moore 
3927629196SBob Moore 	/* Walk entire string, lowercasing the letters */
4027629196SBob Moore 
4127629196SBob Moore 	for (string = src_string; *string; string++) {
4227629196SBob Moore 		*string = (char)tolower((int)*string);
4327629196SBob Moore 	}
4427629196SBob Moore }
4527629196SBob Moore 
4627629196SBob Moore /*******************************************************************************
4727629196SBob Moore  *
4827629196SBob Moore  * FUNCTION:    acpi_ut_strupr (strupr)
4927629196SBob Moore  *
5027629196SBob Moore  * PARAMETERS:  src_string      - The source string to convert
5127629196SBob Moore  *
5227629196SBob Moore  * RETURN:      None
5327629196SBob Moore  *
5427629196SBob Moore  * DESCRIPTION: Convert a string to uppercase
5527629196SBob Moore  *
5627629196SBob Moore  ******************************************************************************/
5727629196SBob Moore 
acpi_ut_strupr(char * src_string)5827629196SBob Moore void acpi_ut_strupr(char *src_string)
5927629196SBob Moore {
6027629196SBob Moore 	char *string;
6127629196SBob Moore 
6227629196SBob Moore 	ACPI_FUNCTION_ENTRY();
6327629196SBob Moore 
6427629196SBob Moore 	if (!src_string) {
6527629196SBob Moore 		return;
6627629196SBob Moore 	}
6727629196SBob Moore 
6827629196SBob Moore 	/* Walk entire string, uppercasing the letters */
6927629196SBob Moore 
7027629196SBob Moore 	for (string = src_string; *string; string++) {
7127629196SBob Moore 		*string = (char)toupper((int)*string);
7227629196SBob Moore 	}
7327629196SBob Moore }
7427629196SBob Moore 
7527629196SBob Moore /******************************************************************************
7627629196SBob Moore  *
7727629196SBob Moore  * FUNCTION:    acpi_ut_stricmp (stricmp)
7827629196SBob Moore  *
7927629196SBob Moore  * PARAMETERS:  string1             - first string to compare
8027629196SBob Moore  *              string2             - second string to compare
8127629196SBob Moore  *
8227629196SBob Moore  * RETURN:      int that signifies string relationship. Zero means strings
8327629196SBob Moore  *              are equal.
8427629196SBob Moore  *
8527629196SBob Moore  * DESCRIPTION: Case-insensitive string compare. Implementation of the
8627629196SBob Moore  *              non-ANSI stricmp function.
8727629196SBob Moore  *
8827629196SBob Moore  ******************************************************************************/
8927629196SBob Moore 
acpi_ut_stricmp(char * string1,char * string2)9027629196SBob Moore int acpi_ut_stricmp(char *string1, char *string2)
9127629196SBob Moore {
9227629196SBob Moore 	int c1;
9327629196SBob Moore 	int c2;
9427629196SBob Moore 
9527629196SBob Moore 	do {
9627629196SBob Moore 		c1 = tolower((int)*string1);
9727629196SBob Moore 		c2 = tolower((int)*string2);
9827629196SBob Moore 
9927629196SBob Moore 		string1++;
10027629196SBob Moore 		string2++;
10127629196SBob Moore 	}
10227629196SBob Moore 	while ((c1 == c2) && (c1));
10327629196SBob Moore 
10427629196SBob Moore 	return (c1 - c2);
10527629196SBob Moore }
10627629196SBob Moore 
107ee68d477SBob Moore #if defined (ACPI_DEBUGGER) || defined (ACPI_APPLICATION) || defined (ACPI_DEBUG_OUTPUT)
10850db3052SBob Moore /*******************************************************************************
10950db3052SBob Moore  *
11050db3052SBob Moore  * FUNCTION:    acpi_ut_safe_strcpy, acpi_ut_safe_strcat, acpi_ut_safe_strncat
11150db3052SBob Moore  *
11250db3052SBob Moore  * PARAMETERS:  Adds a "DestSize" parameter to each of the standard string
11350db3052SBob Moore  *              functions. This is the size of the Destination buffer.
11450db3052SBob Moore  *
11550db3052SBob Moore  * RETURN:      TRUE if the operation would overflow the destination buffer.
11650db3052SBob Moore  *
11750db3052SBob Moore  * DESCRIPTION: Safe versions of standard Clib string functions. Ensure that
11850db3052SBob Moore  *              the result of the operation will not overflow the output string
11950db3052SBob Moore  *              buffer.
12050db3052SBob Moore  *
12150db3052SBob Moore  * NOTE:        These functions are typically only helpful for processing
12250db3052SBob Moore  *              user input and command lines. For most ACPICA code, the
12350db3052SBob Moore  *              required buffer length is precisely calculated before buffer
12450db3052SBob Moore  *              allocation, so the use of these functions is unnecessary.
12550db3052SBob Moore  *
12650db3052SBob Moore  ******************************************************************************/
12750db3052SBob Moore 
acpi_ut_safe_strcpy(char * dest,acpi_size dest_size,char * source)12850db3052SBob Moore u8 acpi_ut_safe_strcpy(char *dest, acpi_size dest_size, char *source)
12950db3052SBob Moore {
13050db3052SBob Moore 
13150db3052SBob Moore 	if (strlen(source) >= dest_size) {
13250db3052SBob Moore 		return (TRUE);
13350db3052SBob Moore 	}
13450db3052SBob Moore 
13550db3052SBob Moore 	strcpy(dest, source);
13650db3052SBob Moore 	return (FALSE);
13750db3052SBob Moore }
13850db3052SBob Moore 
acpi_ut_safe_strcat(char * dest,acpi_size dest_size,char * source)13950db3052SBob Moore u8 acpi_ut_safe_strcat(char *dest, acpi_size dest_size, char *source)
14050db3052SBob Moore {
14150db3052SBob Moore 
14250db3052SBob Moore 	if ((strlen(dest) + strlen(source)) >= dest_size) {
14350db3052SBob Moore 		return (TRUE);
14450db3052SBob Moore 	}
14550db3052SBob Moore 
14650db3052SBob Moore 	strcat(dest, source);
14750db3052SBob Moore 	return (FALSE);
14850db3052SBob Moore }
14950db3052SBob Moore 
15050db3052SBob Moore u8
acpi_ut_safe_strncat(char * dest,acpi_size dest_size,char * source,acpi_size max_transfer_length)15150db3052SBob Moore acpi_ut_safe_strncat(char *dest,
15250db3052SBob Moore 		     acpi_size dest_size,
15350db3052SBob Moore 		     char *source, acpi_size max_transfer_length)
15450db3052SBob Moore {
15550db3052SBob Moore 	acpi_size actual_transfer_length;
15650db3052SBob Moore 
15750db3052SBob Moore 	actual_transfer_length = ACPI_MIN(max_transfer_length, strlen(source));
15850db3052SBob Moore 
15950db3052SBob Moore 	if ((strlen(dest) + actual_transfer_length) >= dest_size) {
16050db3052SBob Moore 		return (TRUE);
16150db3052SBob Moore 	}
16250db3052SBob Moore 
16350db3052SBob Moore 	strncat(dest, source, max_transfer_length);
16450db3052SBob Moore 	return (FALSE);
16550db3052SBob Moore }
166ee68d477SBob Moore 
acpi_ut_safe_strncpy(char * dest,char * source,acpi_size dest_size)167ee68d477SBob Moore void acpi_ut_safe_strncpy(char *dest, char *source, acpi_size dest_size)
168ee68d477SBob Moore {
169ee68d477SBob Moore 	/* Always terminate destination string */
170ee68d477SBob Moore 
171ee68d477SBob Moore 	strncpy(dest, source, dest_size);
172ee68d477SBob Moore 	dest[dest_size - 1] = 0;
173ee68d477SBob Moore }
174ee68d477SBob Moore 
17550db3052SBob Moore #endif
176