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