1 /*******************************************************************************
3 * Module Name: utstring - Common functions for strings and characters
5 ******************************************************************************/
7 /******************************************************************************
11 * Some or all of this work - Copyright (c) 1999 - 2014, Intel Corp.
12 * All rights reserved.
16 * 2.1. This is your license from Intel Corp. under its intellectual property
17 * rights. You may have additional license terms from the party that provided
18 * you this software, covering your right to use that party's intellectual
21 * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
22 * copy of the source code appearing in this file ("Covered Code") an
23 * irrevocable, perpetual, worldwide license under Intel's copyrights in the
24 * base code distributed originally by Intel ("Original Intel Code") to copy,
25 * make derivatives, distribute, use and display any portion of the Covered
26 * Code in any form, with the right to sublicense such rights; and
28 * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
29 * license (with the right to sublicense), under only those claims of Intel
30 * patents that are infringed by the Original Intel Code, to make, use, sell,
31 * offer to sell, and import the Covered Code and derivative works thereof
32 * solely to the minimum extent necessary to exercise the above copyright
33 * license, and in no event shall the patent license extend to any additions
34 * to or modifications of the Original Intel Code. No other license or right
35 * is granted directly or by implication, estoppel or otherwise;
37 * The above copyright and patent license is granted only if the following
42 * 3.1. Redistribution of Source with Rights to Further Distribute Source.
43 * Redistribution of source code of any substantial portion of the Covered
44 * Code or modification with rights to further distribute source must include
45 * the above Copyright Notice, the above License, this list of Conditions,
46 * and the following Disclaimer and Export Compliance provision. In addition,
47 * Licensee must cause all Covered Code to which Licensee contributes to
48 * contain a file documenting the changes Licensee made to create that Covered
49 * Code and the date of any change. Licensee must include in that file the
50 * documentation of any changes made by any predecessor Licensee. Licensee
51 * must include a prominent statement that the modification is derived,
52 * directly or indirectly, from Original Intel Code.
54 * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
55 * Redistribution of source code of any substantial portion of the Covered
56 * Code or modification without rights to further distribute source must
57 * include the following Disclaimer and Export Compliance provision in the
58 * documentation and/or other materials provided with distribution. In
59 * addition, Licensee may not authorize further sublicense of source of any
60 * portion of the Covered Code, and must include terms to the effect that the
61 * license from Licensee to its licensee is limited to the intellectual
62 * property embodied in the software Licensee provides to its licensee, and
63 * not to intellectual property embodied in modifications its licensee may
66 * 3.3. Redistribution of Executable. Redistribution in executable form of any
67 * substantial portion of the Covered Code or modification must reproduce the
68 * above Copyright Notice, and the following Disclaimer and Export Compliance
69 * provision in the documentation and/or other materials provided with the
72 * 3.4. Intel retains all right, title, and interest in and to the Original
75 * 3.5. Neither the name Intel nor any other trademark owned or controlled by
76 * Intel shall be used in advertising or otherwise to promote the sale, use or
77 * other dealings in products derived from or relating to the Covered Code
78 * without prior written authorization from Intel.
80 * 4. Disclaimer and Export Compliance
82 * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
83 * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
84 * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
85 * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
86 * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
87 * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
90 * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
91 * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
92 * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
93 * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
94 * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
95 * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
96 * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
99 * 4.3. Licensee shall not export, either directly or indirectly, any of this
100 * software or system incorporating such software without first obtaining any
101 * required license or other approval from the U. S. Department of Commerce or
102 * any other agency or department of the United States Government. In the
103 * event Licensee exports any such software from the United States or
104 * re-exports any such software from a foreign destination, Licensee shall
105 * ensure that the distribution and export/re-export of the software is in
106 * compliance with all laws, regulations, orders, or other restrictions of the
107 * U.S. Export Administration Regulations. Licensee agrees that neither it nor
108 * any of its subsidiaries will export/re-export any technical data, process,
109 * software, or service, directly or indirectly, to any country for which the
110 * United States government or any agency thereof requires an export license,
111 * other governmental approval, or letter of assurance, without first obtaining
112 * such license, approval or letter.
114 *****************************************************************************/
117 #define __UTSTRING_C__
120 #include "accommon.h"
121 #include "acnamesp.h"
124 #define _COMPONENT ACPI_UTILITIES
125 ACPI_MODULE_NAME ("utstring")
129 * Non-ANSI C library functions - strlwr, strupr, stricmp, and a 64-bit
130 * version of strtoul.
133 #ifdef ACPI_ASL_COMPILER
134 /*******************************************************************************
136 * FUNCTION: AcpiUtStrlwr (strlwr)
138 * PARAMETERS: SrcString - The source string to convert
142 * DESCRIPTION: Convert string to lowercase
144 * NOTE: This is not a POSIX function, so it appears here, not in utclib.c
146 ******************************************************************************/
155 ACPI_FUNCTION_ENTRY ();
163 /* Walk entire string, lowercasing the letters */
165 for (String
= SrcString
; *String
; String
++)
167 *String
= (char) ACPI_TOLOWER (*String
);
174 /******************************************************************************
176 * FUNCTION: AcpiUtStricmp (stricmp)
178 * PARAMETERS: String1 - first string to compare
179 * String2 - second string to compare
181 * RETURN: int that signifies string relationship. Zero means strings
184 * DESCRIPTION: Implementation of the non-ANSI stricmp function (compare
185 * strings with no case sensitivity)
187 ******************************************************************************/
200 c1
= tolower ((int) *String1
);
201 c2
= tolower ((int) *String2
);
206 while ((c1
== c2
) && (c1
));
213 /*******************************************************************************
215 * FUNCTION: AcpiUtStrupr (strupr)
217 * PARAMETERS: SrcString - The source string to convert
221 * DESCRIPTION: Convert string to uppercase
223 * NOTE: This is not a POSIX function, so it appears here, not in utclib.c
225 ******************************************************************************/
234 ACPI_FUNCTION_ENTRY ();
242 /* Walk entire string, uppercasing the letters */
244 for (String
= SrcString
; *String
; String
++)
246 *String
= (char) ACPI_TOUPPER (*String
);
253 /*******************************************************************************
255 * FUNCTION: AcpiUtStrtoul64
257 * PARAMETERS: String - Null terminated string
258 * Base - Radix of the string: 16 or ACPI_ANY_BASE;
259 * ACPI_ANY_BASE means 'in behalf of ToInteger'
260 * RetInteger - Where the converted integer is returned
262 * RETURN: Status and Converted value
264 * DESCRIPTION: Convert a string into an unsigned value. Performs either a
265 * 32-bit or 64-bit conversion, depending on the current mode
266 * of the interpreter.
267 * NOTE: Does not support Octal strings, not needed.
269 ******************************************************************************/
277 UINT32 ThisDigit
= 0;
278 UINT64 ReturnValue
= 0;
281 UINT32 ToIntegerOp
= (Base
== ACPI_ANY_BASE
);
282 UINT32 Mode32
= (AcpiGbl_IntegerByteWidth
== 4);
283 UINT8 ValidDigits
= 0;
288 ACPI_FUNCTION_TRACE_STR (UtStroul64
, String
);
302 return_ACPI_STATUS (AE_BAD_PARAMETER
);
310 /* Skip over any white space in the buffer */
312 while ((*String
) && (ACPI_IS_SPACE (*String
) || *String
== '\t'))
320 * Base equal to ACPI_ANY_BASE means 'ToInteger operation case'.
321 * We need to determine if it is decimal or hexadecimal.
323 if ((*String
== '0') && (ACPI_TOLOWER (*(String
+ 1)) == 'x'))
328 /* Skip over the leading '0x' */
337 /* Any string left? Check that '0x' is not followed by white space. */
339 if (!(*String
) || ACPI_IS_SPACE (*String
) || *String
== '\t')
352 * Perform a 32-bit or 64-bit conversion, depending upon the current
353 * execution mode of the interpreter
355 Dividend
= (Mode32
) ? ACPI_UINT32_MAX
: ACPI_UINT64_MAX
;
357 /* Main loop: convert the string to a 32- or 64-bit integer */
361 if (ACPI_IS_DIGIT (*String
))
363 /* Convert ASCII 0-9 to Decimal value */
365 ThisDigit
= ((UINT8
) *String
) - '0';
369 /* Digit is out of range; possible in ToInteger case only */
375 ThisDigit
= (UINT8
) ACPI_TOUPPER (*String
);
376 if (ACPI_IS_XDIGIT ((char) ThisDigit
))
378 /* Convert ASCII Hex char to value */
380 ThisDigit
= ThisDigit
- 'A' + 10;
399 else if ((ValidDigits
== 0) && (ThisDigit
== 0) && !SignOf0x
)
408 if (SignOf0x
&& ((ValidDigits
> 16) || ((ValidDigits
> 8) && Mode32
)))
411 * This is ToInteger operation case.
412 * No any restrictions for string-to-integer conversion,
418 /* Divide the digit into the correct position */
420 (void) AcpiUtShortDivide ((Dividend
- (UINT64
) ThisDigit
),
421 Base
, &Quotient
, NULL
);
423 if (ReturnValue
> Quotient
)
436 ReturnValue
+= ThisDigit
;
440 /* All done, normal exit */
444 ACPI_DEBUG_PRINT ((ACPI_DB_EXEC
, "Converted value: %8.8X%8.8X\n",
445 ACPI_FORMAT_UINT64 (ReturnValue
)));
447 *RetInteger
= ReturnValue
;
448 return_ACPI_STATUS (AE_OK
);
452 /* Base was set/validated above */
456 return_ACPI_STATUS (AE_BAD_DECIMAL_CONSTANT
);
460 return_ACPI_STATUS (AE_BAD_HEX_CONSTANT
);
465 /*******************************************************************************
467 * FUNCTION: AcpiUtPrintString
469 * PARAMETERS: String - Null terminated ASCII string
470 * MaxLength - Maximum output length. Used to constrain the
471 * length of strings during debug output only.
475 * DESCRIPTION: Dump an ASCII string with support for ACPI-defined escape
478 ******************************************************************************/
490 AcpiOsPrintf ("<\"NULL STRING PTR\">");
495 for (i
= 0; (i
< MaxLength
) && String
[i
]; i
++)
497 /* Escape sequences */
503 AcpiOsPrintf ("\\a"); /* BELL */
508 AcpiOsPrintf ("\\b"); /* BACKSPACE */
513 AcpiOsPrintf ("\\f"); /* FORMFEED */
518 AcpiOsPrintf ("\\n"); /* LINEFEED */
523 AcpiOsPrintf ("\\r"); /* CARRIAGE RETURN*/
528 AcpiOsPrintf ("\\t"); /* HORIZONTAL TAB */
533 AcpiOsPrintf ("\\v"); /* VERTICAL TAB */
536 case '\'': /* Single Quote */
537 case '\"': /* Double Quote */
538 case '\\': /* Backslash */
540 AcpiOsPrintf ("\\%c", (int) String
[i
]);
545 /* Check for printable character or hex escape */
547 if (ACPI_IS_PRINT (String
[i
]))
549 /* This is a normal character */
551 AcpiOsPrintf ("%c", (int) String
[i
]);
555 /* All others will be Hex escapes */
557 AcpiOsPrintf ("\\x%2.2X", (INT32
) String
[i
]);
564 if (i
== MaxLength
&& String
[i
])
566 AcpiOsPrintf ("...");
571 /*******************************************************************************
573 * FUNCTION: AcpiUtValidAcpiChar
575 * PARAMETERS: Char - The character to be examined
576 * Position - Byte position (0-3)
578 * RETURN: TRUE if the character is valid, FALSE otherwise
580 * DESCRIPTION: Check for a valid ACPI character. Must be one of:
581 * 1) Upper case alpha
585 * We allow a '!' as the last character because of the ASF! table
587 ******************************************************************************/
590 AcpiUtValidAcpiChar (
595 if (!((Character
>= 'A' && Character
<= 'Z') ||
596 (Character
>= '0' && Character
<= '9') ||
599 /* Allow a '!' in the last position */
601 if (Character
== '!' && Position
== 3)
613 /*******************************************************************************
615 * FUNCTION: AcpiUtValidAcpiName
617 * PARAMETERS: Name - The name to be examined. Does not have to
618 * be NULL terminated string.
620 * RETURN: TRUE if the name is valid, FALSE otherwise
622 * DESCRIPTION: Check for a valid ACPI name. Each character must be one of:
623 * 1) Upper case alpha
627 ******************************************************************************/
630 AcpiUtValidAcpiName (
636 ACPI_FUNCTION_ENTRY ();
639 for (i
= 0; i
< ACPI_NAME_SIZE
; i
++)
641 if (!AcpiUtValidAcpiChar (Name
[i
], i
))
651 /*******************************************************************************
653 * FUNCTION: AcpiUtRepairName
655 * PARAMETERS: Name - The ACPI name to be repaired
657 * RETURN: Repaired version of the name
659 * DESCRIPTION: Repair an ACPI name: Change invalid characters to '*' and
660 * return the new name. NOTE: the Name parameter must reside in
661 * read/write memory, cannot be a const.
663 * An ACPI Name must consist of valid ACPI characters. We will repair the name
664 * if necessary because we don't want to abort because of this, but we want
665 * all namespace names to be printable. A warning message is appropriate.
667 * This issue came up because there are in fact machines that exhibit
668 * this problem, and we want to be able to enable ACPI support for them,
669 * even though there are a few bad names.
671 ******************************************************************************/
678 BOOLEAN FoundBadChar
= FALSE
;
682 ACPI_FUNCTION_NAME (UtRepairName
);
685 ACPI_MOVE_NAME (&OriginalName
, Name
);
687 /* Check each character in the name */
689 for (i
= 0; i
< ACPI_NAME_SIZE
; i
++)
691 if (AcpiUtValidAcpiChar (Name
[i
], i
))
697 * Replace a bad character with something printable, yet technically
698 * still invalid. This prevents any collisions with existing "good"
699 * names in the namespace.
707 /* Report warning only if in strict mode or debug mode */
709 if (!AcpiGbl_EnableInterpreterSlack
)
711 ACPI_WARNING ((AE_INFO
,
712 "Invalid character(s) in name (0x%.8X), repaired: [%4.4s]",
713 OriginalName
, Name
));
717 ACPI_DEBUG_PRINT ((ACPI_DB_INFO
,
718 "Invalid character(s) in name (0x%.8X), repaired: [%4.4s]",
719 OriginalName
, Name
));
725 #if defined ACPI_ASL_COMPILER || defined ACPI_EXEC_APP
726 /*******************************************************************************
728 * FUNCTION: UtConvertBackslashes
730 * PARAMETERS: Pathname - File pathname string to be converted
732 * RETURN: Modifies the input Pathname
734 * DESCRIPTION: Convert all backslashes (0x5C) to forward slashes (0x2F) within
735 * the entire input file pathname string.
737 ******************************************************************************/
740 UtConvertBackslashes (
751 if (*Pathname
== '\\')
761 #if defined (ACPI_DEBUGGER) || defined (ACPI_APPLICATION)
762 /*******************************************************************************
764 * FUNCTION: AcpiUtSafeStrcpy, AcpiUtSafeStrcat, AcpiUtSafeStrncat
766 * PARAMETERS: Adds a "DestSize" parameter to each of the standard string
767 * functions. This is the size of the Destination buffer.
769 * RETURN: TRUE if the operation would overflow the destination buffer.
771 * DESCRIPTION: Safe versions of standard Clib string functions. Ensure that
772 * the result of the operation will not overflow the output string
775 * NOTE: These functions are typically only helpful for processing
776 * user input and command lines. For most ACPICA code, the
777 * required buffer length is precisely calculated before buffer
778 * allocation, so the use of these functions is unnecessary.
780 ******************************************************************************/
789 if (ACPI_STRLEN (Source
) >= DestSize
)
794 ACPI_STRCPY (Dest
, Source
);
805 if ((ACPI_STRLEN (Dest
) + ACPI_STRLEN (Source
)) >= DestSize
)
810 ACPI_STRCAT (Dest
, Source
);
819 ACPI_SIZE MaxTransferLength
)
821 ACPI_SIZE ActualTransferLength
;
824 ActualTransferLength
= ACPI_MIN (MaxTransferLength
, ACPI_STRLEN (Source
));
826 if ((ACPI_STRLEN (Dest
) + ActualTransferLength
) >= DestSize
)
831 ACPI_STRNCAT (Dest
, Source
, MaxTransferLength
);