162306a36Sopenharmony_ci// SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0 262306a36Sopenharmony_ci/******************************************************************************* 362306a36Sopenharmony_ci * 462306a36Sopenharmony_ci * Module Name: utnonansi - Non-ansi C library functions 562306a36Sopenharmony_ci * 662306a36Sopenharmony_ci ******************************************************************************/ 762306a36Sopenharmony_ci 862306a36Sopenharmony_ci#include <acpi/acpi.h> 962306a36Sopenharmony_ci#include "accommon.h" 1062306a36Sopenharmony_ci 1162306a36Sopenharmony_ci#define _COMPONENT ACPI_UTILITIES 1262306a36Sopenharmony_ciACPI_MODULE_NAME("utnonansi") 1362306a36Sopenharmony_ci 1462306a36Sopenharmony_ci/* 1562306a36Sopenharmony_ci * Non-ANSI C library functions - strlwr, strupr, stricmp, and "safe" 1662306a36Sopenharmony_ci * string functions. 1762306a36Sopenharmony_ci */ 1862306a36Sopenharmony_ci/******************************************************************************* 1962306a36Sopenharmony_ci * 2062306a36Sopenharmony_ci * FUNCTION: acpi_ut_strlwr (strlwr) 2162306a36Sopenharmony_ci * 2262306a36Sopenharmony_ci * PARAMETERS: src_string - The source string to convert 2362306a36Sopenharmony_ci * 2462306a36Sopenharmony_ci * RETURN: None 2562306a36Sopenharmony_ci * 2662306a36Sopenharmony_ci * DESCRIPTION: Convert a string to lowercase 2762306a36Sopenharmony_ci * 2862306a36Sopenharmony_ci ******************************************************************************/ 2962306a36Sopenharmony_civoid acpi_ut_strlwr(char *src_string) 3062306a36Sopenharmony_ci{ 3162306a36Sopenharmony_ci char *string; 3262306a36Sopenharmony_ci 3362306a36Sopenharmony_ci ACPI_FUNCTION_ENTRY(); 3462306a36Sopenharmony_ci 3562306a36Sopenharmony_ci if (!src_string) { 3662306a36Sopenharmony_ci return; 3762306a36Sopenharmony_ci } 3862306a36Sopenharmony_ci 3962306a36Sopenharmony_ci /* Walk entire string, lowercasing the letters */ 4062306a36Sopenharmony_ci 4162306a36Sopenharmony_ci for (string = src_string; *string; string++) { 4262306a36Sopenharmony_ci *string = (char)tolower((int)*string); 4362306a36Sopenharmony_ci } 4462306a36Sopenharmony_ci} 4562306a36Sopenharmony_ci 4662306a36Sopenharmony_ci/******************************************************************************* 4762306a36Sopenharmony_ci * 4862306a36Sopenharmony_ci * FUNCTION: acpi_ut_strupr (strupr) 4962306a36Sopenharmony_ci * 5062306a36Sopenharmony_ci * PARAMETERS: src_string - The source string to convert 5162306a36Sopenharmony_ci * 5262306a36Sopenharmony_ci * RETURN: None 5362306a36Sopenharmony_ci * 5462306a36Sopenharmony_ci * DESCRIPTION: Convert a string to uppercase 5562306a36Sopenharmony_ci * 5662306a36Sopenharmony_ci ******************************************************************************/ 5762306a36Sopenharmony_ci 5862306a36Sopenharmony_civoid acpi_ut_strupr(char *src_string) 5962306a36Sopenharmony_ci{ 6062306a36Sopenharmony_ci char *string; 6162306a36Sopenharmony_ci 6262306a36Sopenharmony_ci ACPI_FUNCTION_ENTRY(); 6362306a36Sopenharmony_ci 6462306a36Sopenharmony_ci if (!src_string) { 6562306a36Sopenharmony_ci return; 6662306a36Sopenharmony_ci } 6762306a36Sopenharmony_ci 6862306a36Sopenharmony_ci /* Walk entire string, uppercasing the letters */ 6962306a36Sopenharmony_ci 7062306a36Sopenharmony_ci for (string = src_string; *string; string++) { 7162306a36Sopenharmony_ci *string = (char)toupper((int)*string); 7262306a36Sopenharmony_ci } 7362306a36Sopenharmony_ci} 7462306a36Sopenharmony_ci 7562306a36Sopenharmony_ci/****************************************************************************** 7662306a36Sopenharmony_ci * 7762306a36Sopenharmony_ci * FUNCTION: acpi_ut_stricmp (stricmp) 7862306a36Sopenharmony_ci * 7962306a36Sopenharmony_ci * PARAMETERS: string1 - first string to compare 8062306a36Sopenharmony_ci * string2 - second string to compare 8162306a36Sopenharmony_ci * 8262306a36Sopenharmony_ci * RETURN: int that signifies string relationship. Zero means strings 8362306a36Sopenharmony_ci * are equal. 8462306a36Sopenharmony_ci * 8562306a36Sopenharmony_ci * DESCRIPTION: Case-insensitive string compare. Implementation of the 8662306a36Sopenharmony_ci * non-ANSI stricmp function. 8762306a36Sopenharmony_ci * 8862306a36Sopenharmony_ci ******************************************************************************/ 8962306a36Sopenharmony_ci 9062306a36Sopenharmony_ciint acpi_ut_stricmp(char *string1, char *string2) 9162306a36Sopenharmony_ci{ 9262306a36Sopenharmony_ci int c1; 9362306a36Sopenharmony_ci int c2; 9462306a36Sopenharmony_ci 9562306a36Sopenharmony_ci do { 9662306a36Sopenharmony_ci c1 = tolower((int)*string1); 9762306a36Sopenharmony_ci c2 = tolower((int)*string2); 9862306a36Sopenharmony_ci 9962306a36Sopenharmony_ci string1++; 10062306a36Sopenharmony_ci string2++; 10162306a36Sopenharmony_ci } 10262306a36Sopenharmony_ci while ((c1 == c2) && (c1)); 10362306a36Sopenharmony_ci 10462306a36Sopenharmony_ci return (c1 - c2); 10562306a36Sopenharmony_ci} 10662306a36Sopenharmony_ci 10762306a36Sopenharmony_ci#if defined (ACPI_DEBUGGER) || defined (ACPI_APPLICATION) || defined (ACPI_DEBUG_OUTPUT) 10862306a36Sopenharmony_ci/******************************************************************************* 10962306a36Sopenharmony_ci * 11062306a36Sopenharmony_ci * FUNCTION: acpi_ut_safe_strcpy, acpi_ut_safe_strcat, acpi_ut_safe_strncat 11162306a36Sopenharmony_ci * 11262306a36Sopenharmony_ci * PARAMETERS: Adds a "DestSize" parameter to each of the standard string 11362306a36Sopenharmony_ci * functions. This is the size of the Destination buffer. 11462306a36Sopenharmony_ci * 11562306a36Sopenharmony_ci * RETURN: TRUE if the operation would overflow the destination buffer. 11662306a36Sopenharmony_ci * 11762306a36Sopenharmony_ci * DESCRIPTION: Safe versions of standard Clib string functions. Ensure that 11862306a36Sopenharmony_ci * the result of the operation will not overflow the output string 11962306a36Sopenharmony_ci * buffer. 12062306a36Sopenharmony_ci * 12162306a36Sopenharmony_ci * NOTE: These functions are typically only helpful for processing 12262306a36Sopenharmony_ci * user input and command lines. For most ACPICA code, the 12362306a36Sopenharmony_ci * required buffer length is precisely calculated before buffer 12462306a36Sopenharmony_ci * allocation, so the use of these functions is unnecessary. 12562306a36Sopenharmony_ci * 12662306a36Sopenharmony_ci ******************************************************************************/ 12762306a36Sopenharmony_ci 12862306a36Sopenharmony_ciu8 acpi_ut_safe_strcpy(char *dest, acpi_size dest_size, char *source) 12962306a36Sopenharmony_ci{ 13062306a36Sopenharmony_ci 13162306a36Sopenharmony_ci if (strlen(source) >= dest_size) { 13262306a36Sopenharmony_ci return (TRUE); 13362306a36Sopenharmony_ci } 13462306a36Sopenharmony_ci 13562306a36Sopenharmony_ci strcpy(dest, source); 13662306a36Sopenharmony_ci return (FALSE); 13762306a36Sopenharmony_ci} 13862306a36Sopenharmony_ci 13962306a36Sopenharmony_ciu8 acpi_ut_safe_strcat(char *dest, acpi_size dest_size, char *source) 14062306a36Sopenharmony_ci{ 14162306a36Sopenharmony_ci 14262306a36Sopenharmony_ci if ((strlen(dest) + strlen(source)) >= dest_size) { 14362306a36Sopenharmony_ci return (TRUE); 14462306a36Sopenharmony_ci } 14562306a36Sopenharmony_ci 14662306a36Sopenharmony_ci strcat(dest, source); 14762306a36Sopenharmony_ci return (FALSE); 14862306a36Sopenharmony_ci} 14962306a36Sopenharmony_ci 15062306a36Sopenharmony_ciu8 15162306a36Sopenharmony_ciacpi_ut_safe_strncat(char *dest, 15262306a36Sopenharmony_ci acpi_size dest_size, 15362306a36Sopenharmony_ci char *source, acpi_size max_transfer_length) 15462306a36Sopenharmony_ci{ 15562306a36Sopenharmony_ci acpi_size actual_transfer_length; 15662306a36Sopenharmony_ci 15762306a36Sopenharmony_ci actual_transfer_length = ACPI_MIN(max_transfer_length, strlen(source)); 15862306a36Sopenharmony_ci 15962306a36Sopenharmony_ci if ((strlen(dest) + actual_transfer_length) >= dest_size) { 16062306a36Sopenharmony_ci return (TRUE); 16162306a36Sopenharmony_ci } 16262306a36Sopenharmony_ci 16362306a36Sopenharmony_ci strncat(dest, source, max_transfer_length); 16462306a36Sopenharmony_ci return (FALSE); 16562306a36Sopenharmony_ci} 16662306a36Sopenharmony_ci 16762306a36Sopenharmony_civoid acpi_ut_safe_strncpy(char *dest, char *source, acpi_size dest_size) 16862306a36Sopenharmony_ci{ 16962306a36Sopenharmony_ci /* Always terminate destination string */ 17062306a36Sopenharmony_ci 17162306a36Sopenharmony_ci strncpy(dest, source, dest_size); 17262306a36Sopenharmony_ci dest[dest_size - 1] = 0; 17362306a36Sopenharmony_ci} 17462306a36Sopenharmony_ci 17562306a36Sopenharmony_ci#endif 176