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