xref: /freebsd/sys/contrib/dev/acpica/components/utilities/utstring.c (revision 39ee7a7a6bdd1557b1c3532abf60d139798ac88b)
1 /*******************************************************************************
2  *
3  * Module Name: utstring - Common functions for strings and characters
4  *
5  ******************************************************************************/
6 
7 /*
8  * Copyright (C) 2000 - 2015, Intel Corp.
9  * All rights reserved.
10  *
11  * Redistribution and use in source and binary forms, with or without
12  * modification, are permitted provided that the following conditions
13  * are met:
14  * 1. Redistributions of source code must retain the above copyright
15  *    notice, this list of conditions, and the following disclaimer,
16  *    without modification.
17  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
18  *    substantially similar to the "NO WARRANTY" disclaimer below
19  *    ("Disclaimer") and any redistribution must be conditioned upon
20  *    including a substantially similar Disclaimer requirement for further
21  *    binary redistribution.
22  * 3. Neither the names of the above-listed copyright holders nor the names
23  *    of any contributors may be used to endorse or promote products derived
24  *    from this software without specific prior written permission.
25  *
26  * Alternatively, this software may be distributed under the terms of the
27  * GNU General Public License ("GPL") version 2 as published by the Free
28  * Software Foundation.
29  *
30  * NO WARRANTY
31  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
32  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
33  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
34  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
35  * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
36  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
37  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
38  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
39  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
40  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
41  * POSSIBILITY OF SUCH DAMAGES.
42  */
43 
44 #include <contrib/dev/acpica/include/acpi.h>
45 #include <contrib/dev/acpica/include/accommon.h>
46 #include <contrib/dev/acpica/include/acnamesp.h>
47 
48 
49 #define _COMPONENT          ACPI_UTILITIES
50         ACPI_MODULE_NAME    ("utstring")
51 
52 
53 /*******************************************************************************
54  *
55  * FUNCTION:    AcpiUtPrintString
56  *
57  * PARAMETERS:  String          - Null terminated ASCII string
58  *              MaxLength       - Maximum output length. Used to constrain the
59  *                                length of strings during debug output only.
60  *
61  * RETURN:      None
62  *
63  * DESCRIPTION: Dump an ASCII string with support for ACPI-defined escape
64  *              sequences.
65  *
66  ******************************************************************************/
67 
68 void
69 AcpiUtPrintString (
70     char                    *String,
71     UINT16                  MaxLength)
72 {
73     UINT32                  i;
74 
75 
76     if (!String)
77     {
78         AcpiOsPrintf ("<\"NULL STRING PTR\">");
79         return;
80     }
81 
82     AcpiOsPrintf ("\"");
83     for (i = 0; (i < MaxLength) && String[i]; i++)
84     {
85         /* Escape sequences */
86 
87         switch (String[i])
88         {
89         case 0x07:
90 
91             AcpiOsPrintf ("\\a");       /* BELL */
92             break;
93 
94         case 0x08:
95 
96             AcpiOsPrintf ("\\b");       /* BACKSPACE */
97             break;
98 
99         case 0x0C:
100 
101             AcpiOsPrintf ("\\f");       /* FORMFEED */
102             break;
103 
104         case 0x0A:
105 
106             AcpiOsPrintf ("\\n");       /* LINEFEED */
107             break;
108 
109         case 0x0D:
110 
111             AcpiOsPrintf ("\\r");       /* CARRIAGE RETURN*/
112             break;
113 
114         case 0x09:
115 
116             AcpiOsPrintf ("\\t");       /* HORIZONTAL TAB */
117             break;
118 
119         case 0x0B:
120 
121             AcpiOsPrintf ("\\v");       /* VERTICAL TAB */
122             break;
123 
124         case '\'':                      /* Single Quote */
125         case '\"':                      /* Double Quote */
126         case '\\':                      /* Backslash */
127 
128             AcpiOsPrintf ("\\%c", (int) String[i]);
129             break;
130 
131         default:
132 
133             /* Check for printable character or hex escape */
134 
135             if (isprint ((int) String[i]))
136             {
137                 /* This is a normal character */
138 
139                 AcpiOsPrintf ("%c", (int) String[i]);
140             }
141             else
142             {
143                 /* All others will be Hex escapes */
144 
145                 AcpiOsPrintf ("\\x%2.2X", (INT32) String[i]);
146             }
147             break;
148         }
149     }
150     AcpiOsPrintf ("\"");
151 
152     if (i == MaxLength && String[i])
153     {
154         AcpiOsPrintf ("...");
155     }
156 }
157 
158 
159 /*******************************************************************************
160  *
161  * FUNCTION:    AcpiUtValidAcpiChar
162  *
163  * PARAMETERS:  Char            - The character to be examined
164  *              Position        - Byte position (0-3)
165  *
166  * RETURN:      TRUE if the character is valid, FALSE otherwise
167  *
168  * DESCRIPTION: Check for a valid ACPI character. Must be one of:
169  *              1) Upper case alpha
170  *              2) numeric
171  *              3) underscore
172  *
173  *              We allow a '!' as the last character because of the ASF! table
174  *
175  ******************************************************************************/
176 
177 BOOLEAN
178 AcpiUtValidAcpiChar (
179     char                    Character,
180     UINT32                  Position)
181 {
182 
183     if (!((Character >= 'A' && Character <= 'Z') ||
184           (Character >= '0' && Character <= '9') ||
185           (Character == '_')))
186     {
187         /* Allow a '!' in the last position */
188 
189         if (Character == '!' && Position == 3)
190         {
191             return (TRUE);
192         }
193 
194         return (FALSE);
195     }
196 
197     return (TRUE);
198 }
199 
200 
201 /*******************************************************************************
202  *
203  * FUNCTION:    AcpiUtValidAcpiName
204  *
205  * PARAMETERS:  Name            - The name to be examined. Does not have to
206  *                                be NULL terminated string.
207  *
208  * RETURN:      TRUE if the name is valid, FALSE otherwise
209  *
210  * DESCRIPTION: Check for a valid ACPI name. Each character must be one of:
211  *              1) Upper case alpha
212  *              2) numeric
213  *              3) underscore
214  *
215  ******************************************************************************/
216 
217 BOOLEAN
218 AcpiUtValidAcpiName (
219     char                    *Name)
220 {
221     UINT32                  i;
222 
223 
224     ACPI_FUNCTION_ENTRY ();
225 
226 
227     for (i = 0; i < ACPI_NAME_SIZE; i++)
228     {
229         if (!AcpiUtValidAcpiChar (Name[i], i))
230         {
231             return (FALSE);
232         }
233     }
234 
235     return (TRUE);
236 }
237 
238 
239 /*******************************************************************************
240  *
241  * FUNCTION:    AcpiUtRepairName
242  *
243  * PARAMETERS:  Name            - The ACPI name to be repaired
244  *
245  * RETURN:      Repaired version of the name
246  *
247  * DESCRIPTION: Repair an ACPI name: Change invalid characters to '*' and
248  *              return the new name. NOTE: the Name parameter must reside in
249  *              read/write memory, cannot be a const.
250  *
251  * An ACPI Name must consist of valid ACPI characters. We will repair the name
252  * if necessary because we don't want to abort because of this, but we want
253  * all namespace names to be printable. A warning message is appropriate.
254  *
255  * This issue came up because there are in fact machines that exhibit
256  * this problem, and we want to be able to enable ACPI support for them,
257  * even though there are a few bad names.
258  *
259  ******************************************************************************/
260 
261 void
262 AcpiUtRepairName (
263     char                    *Name)
264 {
265     UINT32                  i;
266     BOOLEAN                 FoundBadChar = FALSE;
267     UINT32                  OriginalName;
268 
269 
270     ACPI_FUNCTION_NAME (UtRepairName);
271 
272 
273     ACPI_MOVE_NAME (&OriginalName, Name);
274 
275     /* Check each character in the name */
276 
277     for (i = 0; i < ACPI_NAME_SIZE; i++)
278     {
279         if (AcpiUtValidAcpiChar (Name[i], i))
280         {
281             continue;
282         }
283 
284         /*
285          * Replace a bad character with something printable, yet technically
286          * still invalid. This prevents any collisions with existing "good"
287          * names in the namespace.
288          */
289         Name[i] = '*';
290         FoundBadChar = TRUE;
291     }
292 
293     if (FoundBadChar)
294     {
295         /* Report warning only if in strict mode or debug mode */
296 
297         if (!AcpiGbl_EnableInterpreterSlack)
298         {
299             ACPI_WARNING ((AE_INFO,
300                 "Invalid character(s) in name (0x%.8X), repaired: [%4.4s]",
301                 OriginalName, Name));
302         }
303         else
304         {
305             ACPI_DEBUG_PRINT ((ACPI_DB_INFO,
306                 "Invalid character(s) in name (0x%.8X), repaired: [%4.4s]",
307                 OriginalName, Name));
308         }
309     }
310 }
311 
312 
313 #if defined ACPI_ASL_COMPILER || defined ACPI_EXEC_APP
314 /*******************************************************************************
315  *
316  * FUNCTION:    UtConvertBackslashes
317  *
318  * PARAMETERS:  Pathname        - File pathname string to be converted
319  *
320  * RETURN:      Modifies the input Pathname
321  *
322  * DESCRIPTION: Convert all backslashes (0x5C) to forward slashes (0x2F) within
323  *              the entire input file pathname string.
324  *
325  ******************************************************************************/
326 
327 void
328 UtConvertBackslashes (
329     char                    *Pathname)
330 {
331 
332     if (!Pathname)
333     {
334         return;
335     }
336 
337     while (*Pathname)
338     {
339         if (*Pathname == '\\')
340         {
341             *Pathname = '/';
342         }
343 
344         Pathname++;
345     }
346 }
347 #endif
348