xref: /freebsd/sys/contrib/dev/acpica/compiler/dtio.c (revision 0d84335f991f528c6f038e79dd5cc0a7770532da)
1a88e22b7SJung-uk Kim /******************************************************************************
2a88e22b7SJung-uk Kim  *
3a88e22b7SJung-uk Kim  * Module Name: dtio.c - File I/O support for data table compiler
4a88e22b7SJung-uk Kim  *
5a88e22b7SJung-uk Kim  *****************************************************************************/
6a88e22b7SJung-uk Kim 
7*0d84335fSJung-uk Kim /******************************************************************************
8*0d84335fSJung-uk Kim  *
9*0d84335fSJung-uk Kim  * 1. Copyright Notice
10*0d84335fSJung-uk Kim  *
11*0d84335fSJung-uk Kim  * Some or all of this work - Copyright (c) 1999 - 2017, Intel Corp.
12a88e22b7SJung-uk Kim  * All rights reserved.
13a88e22b7SJung-uk Kim  *
14*0d84335fSJung-uk Kim  * 2. License
15*0d84335fSJung-uk Kim  *
16*0d84335fSJung-uk Kim  * 2.1. This is your license from Intel Corp. under its intellectual property
17*0d84335fSJung-uk Kim  * rights. You may have additional license terms from the party that provided
18*0d84335fSJung-uk Kim  * you this software, covering your right to use that party's intellectual
19*0d84335fSJung-uk Kim  * property rights.
20*0d84335fSJung-uk Kim  *
21*0d84335fSJung-uk Kim  * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
22*0d84335fSJung-uk Kim  * copy of the source code appearing in this file ("Covered Code") an
23*0d84335fSJung-uk Kim  * irrevocable, perpetual, worldwide license under Intel's copyrights in the
24*0d84335fSJung-uk Kim  * base code distributed originally by Intel ("Original Intel Code") to copy,
25*0d84335fSJung-uk Kim  * make derivatives, distribute, use and display any portion of the Covered
26*0d84335fSJung-uk Kim  * Code in any form, with the right to sublicense such rights; and
27*0d84335fSJung-uk Kim  *
28*0d84335fSJung-uk Kim  * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
29*0d84335fSJung-uk Kim  * license (with the right to sublicense), under only those claims of Intel
30*0d84335fSJung-uk Kim  * patents that are infringed by the Original Intel Code, to make, use, sell,
31*0d84335fSJung-uk Kim  * offer to sell, and import the Covered Code and derivative works thereof
32*0d84335fSJung-uk Kim  * solely to the minimum extent necessary to exercise the above copyright
33*0d84335fSJung-uk Kim  * license, and in no event shall the patent license extend to any additions
34*0d84335fSJung-uk Kim  * to or modifications of the Original Intel Code. No other license or right
35*0d84335fSJung-uk Kim  * is granted directly or by implication, estoppel or otherwise;
36*0d84335fSJung-uk Kim  *
37*0d84335fSJung-uk Kim  * The above copyright and patent license is granted only if the following
38*0d84335fSJung-uk Kim  * conditions are met:
39*0d84335fSJung-uk Kim  *
40*0d84335fSJung-uk Kim  * 3. Conditions
41*0d84335fSJung-uk Kim  *
42*0d84335fSJung-uk Kim  * 3.1. Redistribution of Source with Rights to Further Distribute Source.
43*0d84335fSJung-uk Kim  * Redistribution of source code of any substantial portion of the Covered
44*0d84335fSJung-uk Kim  * Code or modification with rights to further distribute source must include
45*0d84335fSJung-uk Kim  * the above Copyright Notice, the above License, this list of Conditions,
46*0d84335fSJung-uk Kim  * and the following Disclaimer and Export Compliance provision. In addition,
47*0d84335fSJung-uk Kim  * Licensee must cause all Covered Code to which Licensee contributes to
48*0d84335fSJung-uk Kim  * contain a file documenting the changes Licensee made to create that Covered
49*0d84335fSJung-uk Kim  * Code and the date of any change. Licensee must include in that file the
50*0d84335fSJung-uk Kim  * documentation of any changes made by any predecessor Licensee. Licensee
51*0d84335fSJung-uk Kim  * must include a prominent statement that the modification is derived,
52*0d84335fSJung-uk Kim  * directly or indirectly, from Original Intel Code.
53*0d84335fSJung-uk Kim  *
54*0d84335fSJung-uk Kim  * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
55*0d84335fSJung-uk Kim  * Redistribution of source code of any substantial portion of the Covered
56*0d84335fSJung-uk Kim  * Code or modification without rights to further distribute source must
57*0d84335fSJung-uk Kim  * include the following Disclaimer and Export Compliance provision in the
58*0d84335fSJung-uk Kim  * documentation and/or other materials provided with distribution. In
59*0d84335fSJung-uk Kim  * addition, Licensee may not authorize further sublicense of source of any
60*0d84335fSJung-uk Kim  * portion of the Covered Code, and must include terms to the effect that the
61*0d84335fSJung-uk Kim  * license from Licensee to its licensee is limited to the intellectual
62*0d84335fSJung-uk Kim  * property embodied in the software Licensee provides to its licensee, and
63*0d84335fSJung-uk Kim  * not to intellectual property embodied in modifications its licensee may
64*0d84335fSJung-uk Kim  * make.
65*0d84335fSJung-uk Kim  *
66*0d84335fSJung-uk Kim  * 3.3. Redistribution of Executable. Redistribution in executable form of any
67*0d84335fSJung-uk Kim  * substantial portion of the Covered Code or modification must reproduce the
68*0d84335fSJung-uk Kim  * above Copyright Notice, and the following Disclaimer and Export Compliance
69*0d84335fSJung-uk Kim  * provision in the documentation and/or other materials provided with the
70*0d84335fSJung-uk Kim  * distribution.
71*0d84335fSJung-uk Kim  *
72*0d84335fSJung-uk Kim  * 3.4. Intel retains all right, title, and interest in and to the Original
73*0d84335fSJung-uk Kim  * Intel Code.
74*0d84335fSJung-uk Kim  *
75*0d84335fSJung-uk Kim  * 3.5. Neither the name Intel nor any other trademark owned or controlled by
76*0d84335fSJung-uk Kim  * Intel shall be used in advertising or otherwise to promote the sale, use or
77*0d84335fSJung-uk Kim  * other dealings in products derived from or relating to the Covered Code
78*0d84335fSJung-uk Kim  * without prior written authorization from Intel.
79*0d84335fSJung-uk Kim  *
80*0d84335fSJung-uk Kim  * 4. Disclaimer and Export Compliance
81*0d84335fSJung-uk Kim  *
82*0d84335fSJung-uk Kim  * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
83*0d84335fSJung-uk Kim  * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
84*0d84335fSJung-uk Kim  * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
85*0d84335fSJung-uk Kim  * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
86*0d84335fSJung-uk Kim  * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
87*0d84335fSJung-uk Kim  * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
88*0d84335fSJung-uk Kim  * PARTICULAR PURPOSE.
89*0d84335fSJung-uk Kim  *
90*0d84335fSJung-uk Kim  * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
91*0d84335fSJung-uk Kim  * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
92*0d84335fSJung-uk Kim  * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
93*0d84335fSJung-uk Kim  * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
94*0d84335fSJung-uk Kim  * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
95*0d84335fSJung-uk Kim  * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
96*0d84335fSJung-uk Kim  * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
97*0d84335fSJung-uk Kim  * LIMITED REMEDY.
98*0d84335fSJung-uk Kim  *
99*0d84335fSJung-uk Kim  * 4.3. Licensee shall not export, either directly or indirectly, any of this
100*0d84335fSJung-uk Kim  * software or system incorporating such software without first obtaining any
101*0d84335fSJung-uk Kim  * required license or other approval from the U. S. Department of Commerce or
102*0d84335fSJung-uk Kim  * any other agency or department of the United States Government. In the
103*0d84335fSJung-uk Kim  * event Licensee exports any such software from the United States or
104*0d84335fSJung-uk Kim  * re-exports any such software from a foreign destination, Licensee shall
105*0d84335fSJung-uk Kim  * ensure that the distribution and export/re-export of the software is in
106*0d84335fSJung-uk Kim  * compliance with all laws, regulations, orders, or other restrictions of the
107*0d84335fSJung-uk Kim  * U.S. Export Administration Regulations. Licensee agrees that neither it nor
108*0d84335fSJung-uk Kim  * any of its subsidiaries will export/re-export any technical data, process,
109*0d84335fSJung-uk Kim  * software, or service, directly or indirectly, to any country for which the
110*0d84335fSJung-uk Kim  * United States government or any agency thereof requires an export license,
111*0d84335fSJung-uk Kim  * other governmental approval, or letter of assurance, without first obtaining
112*0d84335fSJung-uk Kim  * such license, approval or letter.
113*0d84335fSJung-uk Kim  *
114*0d84335fSJung-uk Kim  *****************************************************************************
115*0d84335fSJung-uk Kim  *
116*0d84335fSJung-uk Kim  * Alternatively, you may choose to be licensed under the terms of the
117*0d84335fSJung-uk Kim  * following license:
118*0d84335fSJung-uk Kim  *
119d244b227SJung-uk Kim  * Redistribution and use in source and binary forms, with or without
120d244b227SJung-uk Kim  * modification, are permitted provided that the following conditions
121d244b227SJung-uk Kim  * are met:
122d244b227SJung-uk Kim  * 1. Redistributions of source code must retain the above copyright
123d244b227SJung-uk Kim  *    notice, this list of conditions, and the following disclaimer,
124d244b227SJung-uk Kim  *    without modification.
125d244b227SJung-uk Kim  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
126d244b227SJung-uk Kim  *    substantially similar to the "NO WARRANTY" disclaimer below
127d244b227SJung-uk Kim  *    ("Disclaimer") and any redistribution must be conditioned upon
128d244b227SJung-uk Kim  *    including a substantially similar Disclaimer requirement for further
129d244b227SJung-uk Kim  *    binary redistribution.
130d244b227SJung-uk Kim  * 3. Neither the names of the above-listed copyright holders nor the names
131d244b227SJung-uk Kim  *    of any contributors may be used to endorse or promote products derived
132d244b227SJung-uk Kim  *    from this software without specific prior written permission.
133a88e22b7SJung-uk Kim  *
134*0d84335fSJung-uk Kim  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
135*0d84335fSJung-uk Kim  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
136*0d84335fSJung-uk Kim  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
137*0d84335fSJung-uk Kim  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
138*0d84335fSJung-uk Kim  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
139*0d84335fSJung-uk Kim  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
140*0d84335fSJung-uk Kim  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
141*0d84335fSJung-uk Kim  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
142*0d84335fSJung-uk Kim  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
143*0d84335fSJung-uk Kim  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
144*0d84335fSJung-uk Kim  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
145*0d84335fSJung-uk Kim  *
146*0d84335fSJung-uk Kim  * Alternatively, you may choose to be licensed under the terms of the
147d244b227SJung-uk Kim  * GNU General Public License ("GPL") version 2 as published by the Free
148d244b227SJung-uk Kim  * Software Foundation.
149a88e22b7SJung-uk Kim  *
150*0d84335fSJung-uk Kim  *****************************************************************************/
151a88e22b7SJung-uk Kim 
152a88e22b7SJung-uk Kim #include <contrib/dev/acpica/compiler/aslcompiler.h>
153a88e22b7SJung-uk Kim #include <contrib/dev/acpica/compiler/dtcompiler.h>
154313a0c13SJung-uk Kim #include <contrib/dev/acpica/include/acapps.h>
155a88e22b7SJung-uk Kim 
156a88e22b7SJung-uk Kim #define _COMPONENT          DT_COMPILER
157a88e22b7SJung-uk Kim         ACPI_MODULE_NAME    ("dtio")
158a88e22b7SJung-uk Kim 
159a88e22b7SJung-uk Kim 
160a88e22b7SJung-uk Kim /* Local prototypes */
161a88e22b7SJung-uk Kim 
162a88e22b7SJung-uk Kim static char *
163a88e22b7SJung-uk Kim DtTrim (
164a88e22b7SJung-uk Kim     char                    *String);
165a88e22b7SJung-uk Kim 
166a88e22b7SJung-uk Kim static void
167a88e22b7SJung-uk Kim DtLinkField (
168a88e22b7SJung-uk Kim     DT_FIELD                *Field);
169a88e22b7SJung-uk Kim 
170d244b227SJung-uk Kim static ACPI_STATUS
171a88e22b7SJung-uk Kim DtParseLine (
172a88e22b7SJung-uk Kim     char                    *LineBuffer,
173a88e22b7SJung-uk Kim     UINT32                  Line,
174a88e22b7SJung-uk Kim     UINT32                  Offset);
175a88e22b7SJung-uk Kim 
176a88e22b7SJung-uk Kim static void
177a88e22b7SJung-uk Kim DtWriteBinary (
178a88e22b7SJung-uk Kim     DT_SUBTABLE             *Subtable,
179a88e22b7SJung-uk Kim     void                    *Context,
180a88e22b7SJung-uk Kim     void                    *ReturnValue);
181a88e22b7SJung-uk Kim 
182d244b227SJung-uk Kim static void
183d244b227SJung-uk Kim DtDumpBuffer (
184d244b227SJung-uk Kim     UINT32                  FileId,
185d244b227SJung-uk Kim     UINT8                   *Buffer,
1860b94ba42SJung-uk Kim     UINT32                  Offset,
187d244b227SJung-uk Kim     UINT32                  Length);
188a88e22b7SJung-uk Kim 
189efcc2a30SJung-uk Kim static void
190efcc2a30SJung-uk Kim DtDumpSubtableInfo (
191efcc2a30SJung-uk Kim     DT_SUBTABLE             *Subtable,
192efcc2a30SJung-uk Kim     void                    *Context,
193efcc2a30SJung-uk Kim     void                    *ReturnValue);
194efcc2a30SJung-uk Kim 
195efcc2a30SJung-uk Kim static void
196efcc2a30SJung-uk Kim DtDumpSubtableTree (
197efcc2a30SJung-uk Kim     DT_SUBTABLE             *Subtable,
198efcc2a30SJung-uk Kim     void                    *Context,
199efcc2a30SJung-uk Kim     void                    *ReturnValue);
200efcc2a30SJung-uk Kim 
2010b94ba42SJung-uk Kim 
202a88e22b7SJung-uk Kim /* States for DtGetNextLine */
203a88e22b7SJung-uk Kim 
204a88e22b7SJung-uk Kim #define DT_NORMAL_TEXT              0
205a88e22b7SJung-uk Kim #define DT_START_QUOTED_STRING      1
206a88e22b7SJung-uk Kim #define DT_START_COMMENT            2
207a88e22b7SJung-uk Kim #define DT_SLASH_ASTERISK_COMMENT   3
208a88e22b7SJung-uk Kim #define DT_SLASH_SLASH_COMMENT      4
209a88e22b7SJung-uk Kim #define DT_END_COMMENT              5
210d052a1ccSJung-uk Kim #define DT_MERGE_LINES              6
211eef1b955SJung-uk Kim #define DT_ESCAPE_SEQUENCE          7
212a88e22b7SJung-uk Kim 
21342fecd12SJung-uk Kim static UINT32               Gbl_NextLineOffset;
214a88e22b7SJung-uk Kim 
215a88e22b7SJung-uk Kim 
216a88e22b7SJung-uk Kim /******************************************************************************
217a88e22b7SJung-uk Kim  *
218a88e22b7SJung-uk Kim  * FUNCTION:    DtTrim
219a88e22b7SJung-uk Kim  *
220a88e22b7SJung-uk Kim  * PARAMETERS:  String              - Current source code line to trim
221a88e22b7SJung-uk Kim  *
222a88e22b7SJung-uk Kim  * RETURN:      Trimmed line. Must be freed by caller.
223a88e22b7SJung-uk Kim  *
224a88e22b7SJung-uk Kim  * DESCRIPTION: Trim left and right spaces
225a88e22b7SJung-uk Kim  *
226a88e22b7SJung-uk Kim  *****************************************************************************/
227a88e22b7SJung-uk Kim 
228a88e22b7SJung-uk Kim static char *
229a88e22b7SJung-uk Kim DtTrim (
230a88e22b7SJung-uk Kim     char                    *String)
231a88e22b7SJung-uk Kim {
232a88e22b7SJung-uk Kim     char                    *Start;
233a88e22b7SJung-uk Kim     char                    *End;
234a88e22b7SJung-uk Kim     char                    *ReturnString;
235a88e22b7SJung-uk Kim     ACPI_SIZE               Length;
236a88e22b7SJung-uk Kim 
237a88e22b7SJung-uk Kim 
238a88e22b7SJung-uk Kim     /* Skip lines that start with a space */
239a88e22b7SJung-uk Kim 
2405ef50723SJung-uk Kim     if (!strcmp (String, " "))
241a88e22b7SJung-uk Kim     {
242313a0c13SJung-uk Kim         ReturnString = UtStringCacheCalloc (1);
243a88e22b7SJung-uk Kim         return (ReturnString);
244a88e22b7SJung-uk Kim     }
245a88e22b7SJung-uk Kim 
246a88e22b7SJung-uk Kim     /* Setup pointers to start and end of input string */
247a88e22b7SJung-uk Kim 
248a88e22b7SJung-uk Kim     Start = String;
2495ef50723SJung-uk Kim     End = String + strlen (String) - 1;
250a88e22b7SJung-uk Kim 
251a88e22b7SJung-uk Kim     /* Find first non-whitespace character */
252a88e22b7SJung-uk Kim 
253a88e22b7SJung-uk Kim     while ((Start <= End) && ((*Start == ' ') || (*Start == '\t')))
254a88e22b7SJung-uk Kim     {
255a88e22b7SJung-uk Kim         Start++;
256a88e22b7SJung-uk Kim     }
257a88e22b7SJung-uk Kim 
258a88e22b7SJung-uk Kim     /* Find last non-space character */
259a88e22b7SJung-uk Kim 
260a88e22b7SJung-uk Kim     while (End >= Start)
261a88e22b7SJung-uk Kim     {
262a88e22b7SJung-uk Kim         if (*End == '\r' || *End == '\n')
263a88e22b7SJung-uk Kim         {
264a88e22b7SJung-uk Kim             End--;
265a88e22b7SJung-uk Kim             continue;
266a88e22b7SJung-uk Kim         }
267a88e22b7SJung-uk Kim 
268a88e22b7SJung-uk Kim         if (*End != ' ')
269a88e22b7SJung-uk Kim         {
270a88e22b7SJung-uk Kim             break;
271a88e22b7SJung-uk Kim         }
272a88e22b7SJung-uk Kim 
273a88e22b7SJung-uk Kim         End--;
274a88e22b7SJung-uk Kim     }
275a88e22b7SJung-uk Kim 
276a88e22b7SJung-uk Kim     /* Remove any quotes around the string */
277a88e22b7SJung-uk Kim 
278a88e22b7SJung-uk Kim     if (*Start == '\"')
279a88e22b7SJung-uk Kim     {
280a88e22b7SJung-uk Kim         Start++;
281a88e22b7SJung-uk Kim     }
282a88e22b7SJung-uk Kim     if (*End == '\"')
283a88e22b7SJung-uk Kim     {
284a88e22b7SJung-uk Kim         End--;
285a88e22b7SJung-uk Kim     }
286a88e22b7SJung-uk Kim 
287a88e22b7SJung-uk Kim     /* Create the trimmed return string */
288a88e22b7SJung-uk Kim 
289a88e22b7SJung-uk Kim     Length = ACPI_PTR_DIFF (End, Start) + 1;
290313a0c13SJung-uk Kim     ReturnString = UtStringCacheCalloc (Length + 1);
2915ef50723SJung-uk Kim     if (strlen (Start))
292a88e22b7SJung-uk Kim     {
2935ef50723SJung-uk Kim         strncpy (ReturnString, Start, Length);
294a88e22b7SJung-uk Kim     }
295a88e22b7SJung-uk Kim 
296a88e22b7SJung-uk Kim     ReturnString[Length] = 0;
297a88e22b7SJung-uk Kim     return (ReturnString);
298a88e22b7SJung-uk Kim }
299a88e22b7SJung-uk Kim 
300a88e22b7SJung-uk Kim 
301a88e22b7SJung-uk Kim /******************************************************************************
302a88e22b7SJung-uk Kim  *
303a88e22b7SJung-uk Kim  * FUNCTION:    DtLinkField
304a88e22b7SJung-uk Kim  *
305a88e22b7SJung-uk Kim  * PARAMETERS:  Field               - New field object to link
306a88e22b7SJung-uk Kim  *
307a88e22b7SJung-uk Kim  * RETURN:      None
308a88e22b7SJung-uk Kim  *
309a88e22b7SJung-uk Kim  * DESCRIPTION: Link one field name and value to the list
310a88e22b7SJung-uk Kim  *
311a88e22b7SJung-uk Kim  *****************************************************************************/
312a88e22b7SJung-uk Kim 
313a88e22b7SJung-uk Kim static void
314a88e22b7SJung-uk Kim DtLinkField (
315a88e22b7SJung-uk Kim     DT_FIELD                *Field)
316a88e22b7SJung-uk Kim {
317a88e22b7SJung-uk Kim     DT_FIELD                *Prev;
318a88e22b7SJung-uk Kim     DT_FIELD                *Next;
319a88e22b7SJung-uk Kim 
320a88e22b7SJung-uk Kim 
321a88e22b7SJung-uk Kim     Prev = Next = Gbl_FieldList;
322a88e22b7SJung-uk Kim 
323a88e22b7SJung-uk Kim     while (Next)
324a88e22b7SJung-uk Kim     {
325a88e22b7SJung-uk Kim         Prev = Next;
326a88e22b7SJung-uk Kim         Next = Next->Next;
327a88e22b7SJung-uk Kim     }
328a88e22b7SJung-uk Kim 
329a88e22b7SJung-uk Kim     if (Prev)
330a88e22b7SJung-uk Kim     {
331a88e22b7SJung-uk Kim         Prev->Next = Field;
332a88e22b7SJung-uk Kim     }
333a88e22b7SJung-uk Kim     else
334a88e22b7SJung-uk Kim     {
335a88e22b7SJung-uk Kim         Gbl_FieldList = Field;
336a88e22b7SJung-uk Kim     }
337a88e22b7SJung-uk Kim }
338a88e22b7SJung-uk Kim 
339a88e22b7SJung-uk Kim 
340a88e22b7SJung-uk Kim /******************************************************************************
341a88e22b7SJung-uk Kim  *
342a88e22b7SJung-uk Kim  * FUNCTION:    DtParseLine
343a88e22b7SJung-uk Kim  *
344a88e22b7SJung-uk Kim  * PARAMETERS:  LineBuffer          - Current source code line
345a88e22b7SJung-uk Kim  *              Line                - Current line number in the source
346a88e22b7SJung-uk Kim  *              Offset              - Current byte offset of the line
347a88e22b7SJung-uk Kim  *
348d244b227SJung-uk Kim  * RETURN:      Status
349a88e22b7SJung-uk Kim  *
350a88e22b7SJung-uk Kim  * DESCRIPTION: Parse one source line
351a88e22b7SJung-uk Kim  *
352a88e22b7SJung-uk Kim  *****************************************************************************/
353a88e22b7SJung-uk Kim 
354d244b227SJung-uk Kim static ACPI_STATUS
355a88e22b7SJung-uk Kim DtParseLine (
356a88e22b7SJung-uk Kim     char                    *LineBuffer,
357a88e22b7SJung-uk Kim     UINT32                  Line,
358a88e22b7SJung-uk Kim     UINT32                  Offset)
359a88e22b7SJung-uk Kim {
360a88e22b7SJung-uk Kim     char                    *Start;
361a88e22b7SJung-uk Kim     char                    *End;
362a88e22b7SJung-uk Kim     char                    *TmpName;
363a88e22b7SJung-uk Kim     char                    *TmpValue;
364a88e22b7SJung-uk Kim     char                    *Name;
365a88e22b7SJung-uk Kim     char                    *Value;
366a88e22b7SJung-uk Kim     char                    *Colon;
367a88e22b7SJung-uk Kim     UINT32                  Length;
368a88e22b7SJung-uk Kim     DT_FIELD                *Field;
369a88e22b7SJung-uk Kim     UINT32                  Column;
370a88e22b7SJung-uk Kim     UINT32                  NameColumn;
371d052a1ccSJung-uk Kim     BOOLEAN                 IsNullString = FALSE;
372a88e22b7SJung-uk Kim 
373a88e22b7SJung-uk Kim 
374a88e22b7SJung-uk Kim     if (!LineBuffer)
375a88e22b7SJung-uk Kim     {
376d244b227SJung-uk Kim         return (AE_OK);
377d244b227SJung-uk Kim     }
378d244b227SJung-uk Kim 
379d244b227SJung-uk Kim     /* All lines after "Raw Table Data" are ingored */
380d244b227SJung-uk Kim 
381d244b227SJung-uk Kim     if (strstr (LineBuffer, ACPI_RAW_TABLE_DATA_HEADER))
382d244b227SJung-uk Kim     {
383d244b227SJung-uk Kim         return (AE_NOT_FOUND);
384a88e22b7SJung-uk Kim     }
385a88e22b7SJung-uk Kim 
386a88e22b7SJung-uk Kim     Colon = strchr (LineBuffer, ':');
387d244b227SJung-uk Kim     if (!Colon)
388a88e22b7SJung-uk Kim     {
389d244b227SJung-uk Kim         return (AE_OK);
390a88e22b7SJung-uk Kim     }
391a88e22b7SJung-uk Kim 
392a88e22b7SJung-uk Kim     Start = LineBuffer;
393a88e22b7SJung-uk Kim     End = Colon;
394a88e22b7SJung-uk Kim 
395a88e22b7SJung-uk Kim     while (Start < Colon)
396a88e22b7SJung-uk Kim     {
397a88e22b7SJung-uk Kim         if (*Start == '[')
398a88e22b7SJung-uk Kim         {
3998d744e47SJung-uk Kim             /* Found left bracket, go to the right bracket */
4008d744e47SJung-uk Kim 
401a88e22b7SJung-uk Kim             while (Start < Colon && *Start != ']')
402a88e22b7SJung-uk Kim             {
403a88e22b7SJung-uk Kim                 Start++;
404a88e22b7SJung-uk Kim             }
4058d744e47SJung-uk Kim         }
4068d744e47SJung-uk Kim         else if (*Start != ' ')
407a88e22b7SJung-uk Kim         {
408a88e22b7SJung-uk Kim             break;
409a88e22b7SJung-uk Kim         }
410a88e22b7SJung-uk Kim 
411a88e22b7SJung-uk Kim         Start++;
412a88e22b7SJung-uk Kim     }
413a88e22b7SJung-uk Kim 
414a88e22b7SJung-uk Kim     /*
415a88e22b7SJung-uk Kim      * There are two column values. One for the field name,
416a88e22b7SJung-uk Kim      * and one for the field value.
417a88e22b7SJung-uk Kim      */
418a88e22b7SJung-uk Kim     Column = ACPI_PTR_DIFF (Colon, LineBuffer) + 3;
419a88e22b7SJung-uk Kim     NameColumn = ACPI_PTR_DIFF (Start, LineBuffer) + 1;
420a88e22b7SJung-uk Kim 
421a88e22b7SJung-uk Kim     Length = ACPI_PTR_DIFF (End, Start);
422a88e22b7SJung-uk Kim 
423a88e22b7SJung-uk Kim     TmpName = UtLocalCalloc (Length + 1);
4245ef50723SJung-uk Kim     strncpy (TmpName, Start, Length);
425a88e22b7SJung-uk Kim     Name = DtTrim (TmpName);
426a88e22b7SJung-uk Kim     ACPI_FREE (TmpName);
427a88e22b7SJung-uk Kim 
428a88e22b7SJung-uk Kim     Start = End = (Colon + 1);
429a88e22b7SJung-uk Kim     while (*End)
430a88e22b7SJung-uk Kim     {
431a88e22b7SJung-uk Kim         /* Found left quotation, go to the right quotation and break */
432a88e22b7SJung-uk Kim 
433a88e22b7SJung-uk Kim         if (*End == '"')
434a88e22b7SJung-uk Kim         {
435a88e22b7SJung-uk Kim             End++;
436d052a1ccSJung-uk Kim 
437d052a1ccSJung-uk Kim             /* Check for an explicit null string */
438d052a1ccSJung-uk Kim 
439d052a1ccSJung-uk Kim             if (*End == '"')
440d052a1ccSJung-uk Kim             {
441d052a1ccSJung-uk Kim                 IsNullString = TRUE;
442d052a1ccSJung-uk Kim             }
4430b94ba42SJung-uk Kim             while (*End && (*End != '"'))
444a88e22b7SJung-uk Kim             {
445a88e22b7SJung-uk Kim                 End++;
446a88e22b7SJung-uk Kim             }
447a88e22b7SJung-uk Kim 
448a88e22b7SJung-uk Kim             End++;
449a88e22b7SJung-uk Kim             break;
450a88e22b7SJung-uk Kim         }
451a88e22b7SJung-uk Kim 
4520b94ba42SJung-uk Kim         /*
4530b94ba42SJung-uk Kim          * Special "comment" fields at line end, ignore them.
4540b94ba42SJung-uk Kim          * Note: normal slash-slash and slash-asterisk comments are
4550b94ba42SJung-uk Kim          * stripped already by the DtGetNextLine parser.
4560b94ba42SJung-uk Kim          *
4570b94ba42SJung-uk Kim          * TBD: Perhaps DtGetNextLine should parse the following type
4580b94ba42SJung-uk Kim          * of comments also.
4590b94ba42SJung-uk Kim          */
460d052a1ccSJung-uk Kim         if (*End == '[')
461a88e22b7SJung-uk Kim         {
462d052a1ccSJung-uk Kim             End--;
463a88e22b7SJung-uk Kim             break;
464a88e22b7SJung-uk Kim         }
465f8146b88SJung-uk Kim 
466a88e22b7SJung-uk Kim         End++;
467a88e22b7SJung-uk Kim     }
468a88e22b7SJung-uk Kim 
469a88e22b7SJung-uk Kim     Length = ACPI_PTR_DIFF (End, Start);
470a88e22b7SJung-uk Kim     TmpValue = UtLocalCalloc (Length + 1);
471dcbce41eSJung-uk Kim 
4725ef50723SJung-uk Kim     strncpy (TmpValue, Start, Length);
473a88e22b7SJung-uk Kim     Value = DtTrim (TmpValue);
474a88e22b7SJung-uk Kim     ACPI_FREE (TmpValue);
475a88e22b7SJung-uk Kim 
476d052a1ccSJung-uk Kim     /* Create a new field object only if we have a valid value field */
477d052a1ccSJung-uk Kim 
478d052a1ccSJung-uk Kim     if ((Value && *Value) || IsNullString)
479a88e22b7SJung-uk Kim     {
480313a0c13SJung-uk Kim         Field = UtFieldCacheCalloc ();
481a88e22b7SJung-uk Kim         Field->Name = Name;
482a88e22b7SJung-uk Kim         Field->Value = Value;
483a88e22b7SJung-uk Kim         Field->Line = Line;
484a88e22b7SJung-uk Kim         Field->ByteOffset = Offset;
485a88e22b7SJung-uk Kim         Field->NameColumn = NameColumn;
486a88e22b7SJung-uk Kim         Field->Column = Column;
4877cf3e94aSJung-uk Kim         Field->StringLength = Length;
488a88e22b7SJung-uk Kim 
489a88e22b7SJung-uk Kim         DtLinkField (Field);
490a88e22b7SJung-uk Kim     }
491313a0c13SJung-uk Kim     /* Else -- Ignore this field, it has no valid data */
492d244b227SJung-uk Kim 
493d244b227SJung-uk Kim     return (AE_OK);
494a88e22b7SJung-uk Kim }
495a88e22b7SJung-uk Kim 
496a88e22b7SJung-uk Kim 
497a88e22b7SJung-uk Kim /******************************************************************************
498a88e22b7SJung-uk Kim  *
499a88e22b7SJung-uk Kim  * FUNCTION:    DtGetNextLine
500a88e22b7SJung-uk Kim  *
501a88e22b7SJung-uk Kim  * PARAMETERS:  Handle              - Open file handle for the source file
502a88e22b7SJung-uk Kim  *
503d052a1ccSJung-uk Kim  * RETURN:      Filled line buffer and offset of start-of-line (ASL_EOF on EOF)
504a88e22b7SJung-uk Kim  *
505a88e22b7SJung-uk Kim  * DESCRIPTION: Get the next valid source line. Removes all comments.
506a88e22b7SJung-uk Kim  *              Ignores empty lines.
507a88e22b7SJung-uk Kim  *
508a88e22b7SJung-uk Kim  * Handles both slash-asterisk and slash-slash comments.
509a88e22b7SJung-uk Kim  * Also, quoted strings, but no escapes within.
510a88e22b7SJung-uk Kim  *
511a88e22b7SJung-uk Kim  * Line is returned in Gbl_CurrentLineBuffer.
512a88e22b7SJung-uk Kim  * Line number in original file is returned in Gbl_CurrentLineNumber.
513a88e22b7SJung-uk Kim  *
514a88e22b7SJung-uk Kim  *****************************************************************************/
515a88e22b7SJung-uk Kim 
5160b94ba42SJung-uk Kim UINT32
517a88e22b7SJung-uk Kim DtGetNextLine (
5185ef50723SJung-uk Kim     FILE                    *Handle,
5195ef50723SJung-uk Kim     UINT32                  Flags)
520a88e22b7SJung-uk Kim {
521d052a1ccSJung-uk Kim     BOOLEAN                 LineNotAllBlanks = FALSE;
522a88e22b7SJung-uk Kim     UINT32                  State = DT_NORMAL_TEXT;
523a88e22b7SJung-uk Kim     UINT32                  CurrentLineOffset;
524a88e22b7SJung-uk Kim     UINT32                  i;
525a9d8d09cSJung-uk Kim     int                     c;
526a88e22b7SJung-uk Kim 
527a88e22b7SJung-uk Kim 
5285ef50723SJung-uk Kim     memset (Gbl_CurrentLineBuffer, 0, Gbl_LineBufferSize);
529042ff955SJung-uk Kim     for (i = 0; ;)
530a88e22b7SJung-uk Kim     {
531042ff955SJung-uk Kim         /*
532042ff955SJung-uk Kim          * If line is too long, expand the line buffers. Also increases
533042ff955SJung-uk Kim          * Gbl_LineBufferSize.
534042ff955SJung-uk Kim          */
535042ff955SJung-uk Kim         if (i >= Gbl_LineBufferSize)
536042ff955SJung-uk Kim         {
537042ff955SJung-uk Kim             UtExpandLineBuffers ();
538042ff955SJung-uk Kim         }
539042ff955SJung-uk Kim 
540a9d8d09cSJung-uk Kim         c = getc (Handle);
541a88e22b7SJung-uk Kim         if (c == EOF)
542a88e22b7SJung-uk Kim         {
5430b94ba42SJung-uk Kim             switch (State)
5440b94ba42SJung-uk Kim             {
5450b94ba42SJung-uk Kim             case DT_START_QUOTED_STRING:
5460b94ba42SJung-uk Kim             case DT_SLASH_ASTERISK_COMMENT:
5470b94ba42SJung-uk Kim 
5480b94ba42SJung-uk Kim                 AcpiOsPrintf ("**** EOF within comment/string %u\n", State);
5490b94ba42SJung-uk Kim                 break;
5500b94ba42SJung-uk Kim 
5510b94ba42SJung-uk Kim             default:
552a9d8d09cSJung-uk Kim 
5530b94ba42SJung-uk Kim                 break;
5540b94ba42SJung-uk Kim             }
5550b94ba42SJung-uk Kim 
556a7a3b383SJung-uk Kim             /* Standalone EOF is OK */
557a7a3b383SJung-uk Kim 
558a7a3b383SJung-uk Kim             if (i == 0)
559a7a3b383SJung-uk Kim             {
560d052a1ccSJung-uk Kim                 return (ASL_EOF);
561a88e22b7SJung-uk Kim             }
562a88e22b7SJung-uk Kim 
563a7a3b383SJung-uk Kim             /*
564a7a3b383SJung-uk Kim              * Received an EOF in the middle of a line. Terminate the
565a7a3b383SJung-uk Kim              * line with a newline. The next call to this function will
566a7a3b383SJung-uk Kim              * return a standalone EOF. Thus, the upper parsing software
567a7a3b383SJung-uk Kim              * never has to deal with an EOF within a valid line (or
568a7a3b383SJung-uk Kim              * the last line does not get tossed on the floor.)
569a7a3b383SJung-uk Kim              */
570a7a3b383SJung-uk Kim             c = '\n';
571a7a3b383SJung-uk Kim             State = DT_NORMAL_TEXT;
572a7a3b383SJung-uk Kim         }
573a7a3b383SJung-uk Kim 
574a88e22b7SJung-uk Kim         switch (State)
575a88e22b7SJung-uk Kim         {
576a88e22b7SJung-uk Kim         case DT_NORMAL_TEXT:
577a88e22b7SJung-uk Kim 
578a88e22b7SJung-uk Kim             /* Normal text, insert char into line buffer */
579a88e22b7SJung-uk Kim 
580a9d8d09cSJung-uk Kim             Gbl_CurrentLineBuffer[i] = (char) c;
581a88e22b7SJung-uk Kim             switch (c)
582a88e22b7SJung-uk Kim             {
583a88e22b7SJung-uk Kim             case '/':
584a9d8d09cSJung-uk Kim 
585a88e22b7SJung-uk Kim                 State = DT_START_COMMENT;
586a88e22b7SJung-uk Kim                 break;
587a88e22b7SJung-uk Kim 
588a88e22b7SJung-uk Kim             case '"':
589a9d8d09cSJung-uk Kim 
590a88e22b7SJung-uk Kim                 State = DT_START_QUOTED_STRING;
591d052a1ccSJung-uk Kim                 LineNotAllBlanks = TRUE;
592a88e22b7SJung-uk Kim                 i++;
593a88e22b7SJung-uk Kim                 break;
594a88e22b7SJung-uk Kim 
595d052a1ccSJung-uk Kim             case '\\':
596d052a1ccSJung-uk Kim                 /*
597d052a1ccSJung-uk Kim                  * The continuation char MUST be last char on this line.
598d052a1ccSJung-uk Kim                  * Otherwise, it will be assumed to be a valid ASL char.
599d052a1ccSJung-uk Kim                  */
600d052a1ccSJung-uk Kim                 State = DT_MERGE_LINES;
601d052a1ccSJung-uk Kim                 break;
602d052a1ccSJung-uk Kim 
603a88e22b7SJung-uk Kim             case '\n':
604a9d8d09cSJung-uk Kim 
605a88e22b7SJung-uk Kim                 CurrentLineOffset = Gbl_NextLineOffset;
606a88e22b7SJung-uk Kim                 Gbl_NextLineOffset = (UINT32) ftell (Handle);
607a88e22b7SJung-uk Kim                 Gbl_CurrentLineNumber++;
608a88e22b7SJung-uk Kim 
609d052a1ccSJung-uk Kim                 /*
610d052a1ccSJung-uk Kim                  * Exit if line is complete. Ignore empty lines (only \n)
611d052a1ccSJung-uk Kim                  * or lines that contain nothing but blanks.
612d052a1ccSJung-uk Kim                  */
613d052a1ccSJung-uk Kim                 if ((i != 0) && LineNotAllBlanks)
614a88e22b7SJung-uk Kim                 {
615042ff955SJung-uk Kim                     if ((i + 1) >= Gbl_LineBufferSize)
616042ff955SJung-uk Kim                     {
617042ff955SJung-uk Kim                         UtExpandLineBuffers ();
618042ff955SJung-uk Kim                     }
619042ff955SJung-uk Kim 
620d052a1ccSJung-uk Kim                     Gbl_CurrentLineBuffer[i+1] = 0; /* Terminate string */
621a88e22b7SJung-uk Kim                     return (CurrentLineOffset);
622a88e22b7SJung-uk Kim                 }
623d052a1ccSJung-uk Kim 
624d052a1ccSJung-uk Kim                 /* Toss this line and start a new one */
625d052a1ccSJung-uk Kim 
626d052a1ccSJung-uk Kim                 i = 0;
627d052a1ccSJung-uk Kim                 LineNotAllBlanks = FALSE;
628a88e22b7SJung-uk Kim                 break;
629a88e22b7SJung-uk Kim 
630a88e22b7SJung-uk Kim             default:
631a9d8d09cSJung-uk Kim 
632d052a1ccSJung-uk Kim                 if (c != ' ')
633d052a1ccSJung-uk Kim                 {
634d052a1ccSJung-uk Kim                     LineNotAllBlanks = TRUE;
635d052a1ccSJung-uk Kim                 }
636d052a1ccSJung-uk Kim 
637a88e22b7SJung-uk Kim                 i++;
638a88e22b7SJung-uk Kim                 break;
639a88e22b7SJung-uk Kim             }
640a88e22b7SJung-uk Kim             break;
641a88e22b7SJung-uk Kim 
642a88e22b7SJung-uk Kim         case DT_START_QUOTED_STRING:
643a88e22b7SJung-uk Kim 
644a88e22b7SJung-uk Kim             /* Insert raw chars until end of quoted string */
645a88e22b7SJung-uk Kim 
646a9d8d09cSJung-uk Kim             Gbl_CurrentLineBuffer[i] = (char) c;
647a88e22b7SJung-uk Kim             i++;
648a88e22b7SJung-uk Kim 
649eef1b955SJung-uk Kim             switch (c)
650a88e22b7SJung-uk Kim             {
651eef1b955SJung-uk Kim             case '"':
652a9d8d09cSJung-uk Kim 
653a88e22b7SJung-uk Kim                 State = DT_NORMAL_TEXT;
654eef1b955SJung-uk Kim                 break;
655eef1b955SJung-uk Kim 
656eef1b955SJung-uk Kim             case '\\':
657a9d8d09cSJung-uk Kim 
658eef1b955SJung-uk Kim                 State = DT_ESCAPE_SEQUENCE;
659eef1b955SJung-uk Kim                 break;
660eef1b955SJung-uk Kim 
661eef1b955SJung-uk Kim             case '\n':
662a9d8d09cSJung-uk Kim 
6635ef50723SJung-uk Kim                 if (!(Flags & DT_ALLOW_MULTILINE_QUOTES))
6645ef50723SJung-uk Kim                 {
665f8146b88SJung-uk Kim                     AcpiOsPrintf (
666f8146b88SJung-uk Kim                         "ERROR at line %u: Unterminated quoted string\n",
667eef1b955SJung-uk Kim                         Gbl_CurrentLineNumber++);
668eef1b955SJung-uk Kim                     State = DT_NORMAL_TEXT;
6695ef50723SJung-uk Kim                 }
670eef1b955SJung-uk Kim                 break;
671eef1b955SJung-uk Kim 
672eef1b955SJung-uk Kim             default:    /* Get next character */
673a9d8d09cSJung-uk Kim 
674eef1b955SJung-uk Kim                 break;
675a88e22b7SJung-uk Kim             }
676a88e22b7SJung-uk Kim             break;
677a88e22b7SJung-uk Kim 
678eef1b955SJung-uk Kim         case DT_ESCAPE_SEQUENCE:
679eef1b955SJung-uk Kim 
680eef1b955SJung-uk Kim             /* Just copy the escaped character. TBD: sufficient for table compiler? */
681eef1b955SJung-uk Kim 
682a9d8d09cSJung-uk Kim             Gbl_CurrentLineBuffer[i] = (char) c;
683eef1b955SJung-uk Kim             i++;
684eef1b955SJung-uk Kim             State = DT_START_QUOTED_STRING;
685eef1b955SJung-uk Kim             break;
686eef1b955SJung-uk Kim 
687a88e22b7SJung-uk Kim         case DT_START_COMMENT:
688a88e22b7SJung-uk Kim 
689a88e22b7SJung-uk Kim             /* Open comment if this character is an asterisk or slash */
690a88e22b7SJung-uk Kim 
691a88e22b7SJung-uk Kim             switch (c)
692a88e22b7SJung-uk Kim             {
693a88e22b7SJung-uk Kim             case '*':
694a9d8d09cSJung-uk Kim 
695a88e22b7SJung-uk Kim                 State = DT_SLASH_ASTERISK_COMMENT;
696a88e22b7SJung-uk Kim                 break;
697a88e22b7SJung-uk Kim 
698a88e22b7SJung-uk Kim             case '/':
699a9d8d09cSJung-uk Kim 
700a88e22b7SJung-uk Kim                 State = DT_SLASH_SLASH_COMMENT;
701a88e22b7SJung-uk Kim                 break;
702a88e22b7SJung-uk Kim 
703a88e22b7SJung-uk Kim             default:    /* Not a comment */
704a9d8d09cSJung-uk Kim 
7058ef1a331SJung-uk Kim                 i++;    /* Save the preceding slash */
706042ff955SJung-uk Kim                 if (i >= Gbl_LineBufferSize)
707042ff955SJung-uk Kim                 {
708042ff955SJung-uk Kim                     UtExpandLineBuffers ();
709042ff955SJung-uk Kim                 }
710042ff955SJung-uk Kim 
711a9d8d09cSJung-uk Kim                 Gbl_CurrentLineBuffer[i] = (char) c;
712a88e22b7SJung-uk Kim                 i++;
713a88e22b7SJung-uk Kim                 State = DT_NORMAL_TEXT;
714a88e22b7SJung-uk Kim                 break;
715a88e22b7SJung-uk Kim             }
716a88e22b7SJung-uk Kim             break;
717a88e22b7SJung-uk Kim 
718a88e22b7SJung-uk Kim         case DT_SLASH_ASTERISK_COMMENT:
719a88e22b7SJung-uk Kim 
720a88e22b7SJung-uk Kim             /* Ignore chars until an asterisk-slash is found */
721a88e22b7SJung-uk Kim 
722a88e22b7SJung-uk Kim             switch (c)
723a88e22b7SJung-uk Kim             {
724a88e22b7SJung-uk Kim             case '\n':
725a9d8d09cSJung-uk Kim 
726a88e22b7SJung-uk Kim                 Gbl_NextLineOffset = (UINT32) ftell (Handle);
727a88e22b7SJung-uk Kim                 Gbl_CurrentLineNumber++;
728a88e22b7SJung-uk Kim                 break;
729a88e22b7SJung-uk Kim 
730a88e22b7SJung-uk Kim             case '*':
731a9d8d09cSJung-uk Kim 
732a88e22b7SJung-uk Kim                 State = DT_END_COMMENT;
733a88e22b7SJung-uk Kim                 break;
734a88e22b7SJung-uk Kim 
735a88e22b7SJung-uk Kim             default:
736a9d8d09cSJung-uk Kim 
737a88e22b7SJung-uk Kim                 break;
738a88e22b7SJung-uk Kim             }
739a88e22b7SJung-uk Kim             break;
740a88e22b7SJung-uk Kim 
741a88e22b7SJung-uk Kim         case DT_SLASH_SLASH_COMMENT:
742a88e22b7SJung-uk Kim 
743a88e22b7SJung-uk Kim             /* Ignore chars until end-of-line */
744a88e22b7SJung-uk Kim 
745a88e22b7SJung-uk Kim             if (c == '\n')
746a88e22b7SJung-uk Kim             {
747a88e22b7SJung-uk Kim                 /* We will exit via the NORMAL_TEXT path */
748a88e22b7SJung-uk Kim 
749a88e22b7SJung-uk Kim                 ungetc (c, Handle);
750a88e22b7SJung-uk Kim                 State = DT_NORMAL_TEXT;
751a88e22b7SJung-uk Kim             }
752a88e22b7SJung-uk Kim             break;
753a88e22b7SJung-uk Kim 
754a88e22b7SJung-uk Kim         case DT_END_COMMENT:
755a88e22b7SJung-uk Kim 
756a88e22b7SJung-uk Kim             /* End comment if this char is a slash */
757a88e22b7SJung-uk Kim 
758a88e22b7SJung-uk Kim             switch (c)
759a88e22b7SJung-uk Kim             {
760a88e22b7SJung-uk Kim             case '/':
761a9d8d09cSJung-uk Kim 
762a88e22b7SJung-uk Kim                 State = DT_NORMAL_TEXT;
763a88e22b7SJung-uk Kim                 break;
764a88e22b7SJung-uk Kim 
7650b94ba42SJung-uk Kim             case '\n':
766a9d8d09cSJung-uk Kim 
7670b94ba42SJung-uk Kim                 CurrentLineOffset = Gbl_NextLineOffset;
7680b94ba42SJung-uk Kim                 Gbl_NextLineOffset = (UINT32) ftell (Handle);
7690b94ba42SJung-uk Kim                 Gbl_CurrentLineNumber++;
7700b94ba42SJung-uk Kim                 break;
7710b94ba42SJung-uk Kim 
7720b94ba42SJung-uk Kim             case '*':
773a9d8d09cSJung-uk Kim 
7740b94ba42SJung-uk Kim                 /* Consume all adjacent asterisks */
7750b94ba42SJung-uk Kim                 break;
7760b94ba42SJung-uk Kim 
777a88e22b7SJung-uk Kim             default:
778a9d8d09cSJung-uk Kim 
779a88e22b7SJung-uk Kim                 State = DT_SLASH_ASTERISK_COMMENT;
780a88e22b7SJung-uk Kim                 break;
781a88e22b7SJung-uk Kim             }
782a88e22b7SJung-uk Kim             break;
783a88e22b7SJung-uk Kim 
784d052a1ccSJung-uk Kim         case DT_MERGE_LINES:
785d052a1ccSJung-uk Kim 
786d052a1ccSJung-uk Kim             if (c != '\n')
787d052a1ccSJung-uk Kim             {
788d052a1ccSJung-uk Kim                 /*
789d052a1ccSJung-uk Kim                  * This is not a continuation backslash, it is a normal
790d052a1ccSJung-uk Kim                  * normal ASL backslash - for example: Scope(\_SB_)
791d052a1ccSJung-uk Kim                  */
792d052a1ccSJung-uk Kim                 i++; /* Keep the backslash that is already in the buffer */
793d052a1ccSJung-uk Kim 
794d052a1ccSJung-uk Kim                 ungetc (c, Handle);
795d052a1ccSJung-uk Kim                 State = DT_NORMAL_TEXT;
796d052a1ccSJung-uk Kim             }
797d052a1ccSJung-uk Kim             else
798d052a1ccSJung-uk Kim             {
799d052a1ccSJung-uk Kim                 /*
800d052a1ccSJung-uk Kim                  * This is a continuation line -- a backlash followed
801d052a1ccSJung-uk Kim                  * immediately by a newline. Insert a space between the
802d052a1ccSJung-uk Kim                  * lines (overwrite the backslash)
803d052a1ccSJung-uk Kim                  */
804d052a1ccSJung-uk Kim                 Gbl_CurrentLineBuffer[i] = ' ';
805d052a1ccSJung-uk Kim                 i++;
806d052a1ccSJung-uk Kim 
807d052a1ccSJung-uk Kim                 /* Ignore newline, this will merge the lines */
808d052a1ccSJung-uk Kim 
809d052a1ccSJung-uk Kim                 CurrentLineOffset = Gbl_NextLineOffset;
810d052a1ccSJung-uk Kim                 Gbl_NextLineOffset = (UINT32) ftell (Handle);
811d052a1ccSJung-uk Kim                 Gbl_CurrentLineNumber++;
812d052a1ccSJung-uk Kim                 State = DT_NORMAL_TEXT;
813d052a1ccSJung-uk Kim             }
814d052a1ccSJung-uk Kim             break;
815d052a1ccSJung-uk Kim 
816a88e22b7SJung-uk Kim         default:
817a9d8d09cSJung-uk Kim 
818a88e22b7SJung-uk Kim             DtFatal (ASL_MSG_COMPILER_INTERNAL, NULL, "Unknown input state");
819d052a1ccSJung-uk Kim             return (ASL_EOF);
820a88e22b7SJung-uk Kim         }
821a88e22b7SJung-uk Kim     }
822a88e22b7SJung-uk Kim }
823a88e22b7SJung-uk Kim 
824a88e22b7SJung-uk Kim 
825a88e22b7SJung-uk Kim /******************************************************************************
826a88e22b7SJung-uk Kim  *
827a88e22b7SJung-uk Kim  * FUNCTION:    DtScanFile
828a88e22b7SJung-uk Kim  *
829a88e22b7SJung-uk Kim  * PARAMETERS:  Handle              - Open file handle for the source file
830a88e22b7SJung-uk Kim  *
831a88e22b7SJung-uk Kim  * RETURN:      Pointer to start of the constructed parse tree.
832a88e22b7SJung-uk Kim  *
833a88e22b7SJung-uk Kim  * DESCRIPTION: Scan source file, link all field names and values
834a88e22b7SJung-uk Kim  *              to the global parse tree: Gbl_FieldList
835a88e22b7SJung-uk Kim  *
836a88e22b7SJung-uk Kim  *****************************************************************************/
837a88e22b7SJung-uk Kim 
838a88e22b7SJung-uk Kim DT_FIELD *
839a88e22b7SJung-uk Kim DtScanFile (
840a88e22b7SJung-uk Kim     FILE                    *Handle)
841a88e22b7SJung-uk Kim {
842d244b227SJung-uk Kim     ACPI_STATUS             Status;
843a88e22b7SJung-uk Kim     UINT32                  Offset;
844a88e22b7SJung-uk Kim 
845a88e22b7SJung-uk Kim 
846a88e22b7SJung-uk Kim     ACPI_FUNCTION_NAME (DtScanFile);
847a88e22b7SJung-uk Kim 
848a88e22b7SJung-uk Kim 
849a88e22b7SJung-uk Kim     /* Get the file size */
850a88e22b7SJung-uk Kim 
851313a0c13SJung-uk Kim     Gbl_InputByteCount = CmGetFileSize (Handle);
852313a0c13SJung-uk Kim     if (Gbl_InputByteCount == ACPI_UINT32_MAX)
853313a0c13SJung-uk Kim     {
854313a0c13SJung-uk Kim         AslAbort ();
855313a0c13SJung-uk Kim     }
856a88e22b7SJung-uk Kim 
857a88e22b7SJung-uk Kim     Gbl_CurrentLineNumber = 0;
858a88e22b7SJung-uk Kim     Gbl_CurrentLineOffset = 0;
859a88e22b7SJung-uk Kim     Gbl_NextLineOffset = 0;
860a88e22b7SJung-uk Kim 
861a88e22b7SJung-uk Kim     /* Scan line-by-line */
862a88e22b7SJung-uk Kim 
8635ef50723SJung-uk Kim     while ((Offset = DtGetNextLine (Handle, 0)) != ASL_EOF)
864a88e22b7SJung-uk Kim     {
865a88e22b7SJung-uk Kim         ACPI_DEBUG_PRINT ((ACPI_DB_PARSE, "Line %2.2u/%4.4X - %s",
866a88e22b7SJung-uk Kim             Gbl_CurrentLineNumber, Offset, Gbl_CurrentLineBuffer));
867a88e22b7SJung-uk Kim 
868f8146b88SJung-uk Kim         Status = DtParseLine (Gbl_CurrentLineBuffer,
869f8146b88SJung-uk Kim             Gbl_CurrentLineNumber, Offset);
870d244b227SJung-uk Kim         if (Status == AE_NOT_FOUND)
871d244b227SJung-uk Kim         {
872d244b227SJung-uk Kim             break;
873d244b227SJung-uk Kim         }
874a88e22b7SJung-uk Kim     }
875a88e22b7SJung-uk Kim 
876d052a1ccSJung-uk Kim     /* Dump the parse tree if debug enabled */
877d052a1ccSJung-uk Kim 
878efcc2a30SJung-uk Kim     DtDumpFieldList (Gbl_FieldList);
879a88e22b7SJung-uk Kim     return (Gbl_FieldList);
880a88e22b7SJung-uk Kim }
881a88e22b7SJung-uk Kim 
882a88e22b7SJung-uk Kim 
883a88e22b7SJung-uk Kim /*
884a88e22b7SJung-uk Kim  * Output functions
885a88e22b7SJung-uk Kim  */
886a88e22b7SJung-uk Kim 
887a88e22b7SJung-uk Kim /******************************************************************************
888a88e22b7SJung-uk Kim  *
889a88e22b7SJung-uk Kim  * FUNCTION:    DtWriteBinary
890a88e22b7SJung-uk Kim  *
891a88e22b7SJung-uk Kim  * PARAMETERS:  DT_WALK_CALLBACK
892a88e22b7SJung-uk Kim  *
893a88e22b7SJung-uk Kim  * RETURN:      Status
894a88e22b7SJung-uk Kim  *
895a88e22b7SJung-uk Kim  * DESCRIPTION: Write one subtable of a binary ACPI table
896a88e22b7SJung-uk Kim  *
897a88e22b7SJung-uk Kim  *****************************************************************************/
898a88e22b7SJung-uk Kim 
899a88e22b7SJung-uk Kim static void
900a88e22b7SJung-uk Kim DtWriteBinary (
901a88e22b7SJung-uk Kim     DT_SUBTABLE             *Subtable,
902a88e22b7SJung-uk Kim     void                    *Context,
903a88e22b7SJung-uk Kim     void                    *ReturnValue)
904a88e22b7SJung-uk Kim {
905a88e22b7SJung-uk Kim 
906a88e22b7SJung-uk Kim     FlWriteFile (ASL_FILE_AML_OUTPUT, Subtable->Buffer, Subtable->Length);
907a88e22b7SJung-uk Kim }
908a88e22b7SJung-uk Kim 
909a88e22b7SJung-uk Kim 
910a88e22b7SJung-uk Kim /******************************************************************************
911a88e22b7SJung-uk Kim  *
912a88e22b7SJung-uk Kim  * FUNCTION:    DtOutputBinary
913a88e22b7SJung-uk Kim  *
914a88e22b7SJung-uk Kim  * PARAMETERS:
915a88e22b7SJung-uk Kim  *
916a88e22b7SJung-uk Kim  * RETURN:      Status
917a88e22b7SJung-uk Kim  *
918a88e22b7SJung-uk Kim  * DESCRIPTION: Write entire binary ACPI table (result of compilation)
919a88e22b7SJung-uk Kim  *
920a88e22b7SJung-uk Kim  *****************************************************************************/
921a88e22b7SJung-uk Kim 
922a88e22b7SJung-uk Kim void
923a88e22b7SJung-uk Kim DtOutputBinary (
924a88e22b7SJung-uk Kim     DT_SUBTABLE             *RootTable)
925a88e22b7SJung-uk Kim {
926a88e22b7SJung-uk Kim 
927a88e22b7SJung-uk Kim     if (!RootTable)
928a88e22b7SJung-uk Kim     {
929a88e22b7SJung-uk Kim         return;
930a88e22b7SJung-uk Kim     }
931a88e22b7SJung-uk Kim 
932a88e22b7SJung-uk Kim     /* Walk the entire parse tree, emitting the binary data */
933a88e22b7SJung-uk Kim 
934a88e22b7SJung-uk Kim     DtWalkTableTree (RootTable, DtWriteBinary, NULL, NULL);
935313a0c13SJung-uk Kim 
936313a0c13SJung-uk Kim     Gbl_TableLength = CmGetFileSize (Gbl_Files[ASL_FILE_AML_OUTPUT].Handle);
937313a0c13SJung-uk Kim     if (Gbl_TableLength == ACPI_UINT32_MAX)
938313a0c13SJung-uk Kim     {
939313a0c13SJung-uk Kim         AslAbort ();
940313a0c13SJung-uk Kim     }
941a88e22b7SJung-uk Kim }
942d244b227SJung-uk Kim 
943d244b227SJung-uk Kim 
944d244b227SJung-uk Kim /*
945d244b227SJung-uk Kim  * Listing support
946d244b227SJung-uk Kim  */
947d244b227SJung-uk Kim 
948d244b227SJung-uk Kim /******************************************************************************
949d244b227SJung-uk Kim  *
950d244b227SJung-uk Kim  * FUNCTION:    DtDumpBuffer
951d244b227SJung-uk Kim  *
952d244b227SJung-uk Kim  * PARAMETERS:  FileID              - Where to write buffer data
953d244b227SJung-uk Kim  *              Buffer              - Buffer to dump
9540b94ba42SJung-uk Kim  *              Offset              - Offset in current table
955d244b227SJung-uk Kim  *              Length              - Buffer Length
956d244b227SJung-uk Kim  *
957d244b227SJung-uk Kim  * RETURN:      None
958d244b227SJung-uk Kim  *
959d244b227SJung-uk Kim  * DESCRIPTION: Another copy of DumpBuffer routine (unfortunately).
960d244b227SJung-uk Kim  *
961d244b227SJung-uk Kim  * TBD: merge dump buffer routines
962d244b227SJung-uk Kim  *
963d244b227SJung-uk Kim  *****************************************************************************/
964d244b227SJung-uk Kim 
965d244b227SJung-uk Kim static void
966d244b227SJung-uk Kim DtDumpBuffer (
967d244b227SJung-uk Kim     UINT32                  FileId,
968d244b227SJung-uk Kim     UINT8                   *Buffer,
9690b94ba42SJung-uk Kim     UINT32                  Offset,
970d244b227SJung-uk Kim     UINT32                  Length)
971d244b227SJung-uk Kim {
972d244b227SJung-uk Kim     UINT32                  i;
973d244b227SJung-uk Kim     UINT32                  j;
974d244b227SJung-uk Kim     UINT8                   BufChar;
975d244b227SJung-uk Kim 
976d244b227SJung-uk Kim 
9770b94ba42SJung-uk Kim     FlPrintFile (FileId, "Output: [%3.3Xh %4.4d %3d] ",
9780b94ba42SJung-uk Kim         Offset, Offset, Length);
9790b94ba42SJung-uk Kim 
980d244b227SJung-uk Kim     i = 0;
981d244b227SJung-uk Kim     while (i < Length)
982d244b227SJung-uk Kim     {
9830b94ba42SJung-uk Kim         if (i >= 16)
9840b94ba42SJung-uk Kim         {
985d052a1ccSJung-uk Kim             FlPrintFile (FileId, "%24s", "");
9860b94ba42SJung-uk Kim         }
987d244b227SJung-uk Kim 
9880b94ba42SJung-uk Kim         /* Print 16 hex chars */
989d244b227SJung-uk Kim 
990d244b227SJung-uk Kim         for (j = 0; j < 16;)
991d244b227SJung-uk Kim         {
992d244b227SJung-uk Kim             if (i + j >= Length)
993d244b227SJung-uk Kim             {
994d244b227SJung-uk Kim                 /* Dump fill spaces */
995d244b227SJung-uk Kim 
996d244b227SJung-uk Kim                 FlPrintFile (FileId, "   ");
997d244b227SJung-uk Kim                 j++;
998d244b227SJung-uk Kim                 continue;
999d244b227SJung-uk Kim             }
1000d244b227SJung-uk Kim 
1001d244b227SJung-uk Kim             FlPrintFile (FileId, "%02X ", Buffer[i+j]);
1002d244b227SJung-uk Kim             j++;
1003d244b227SJung-uk Kim         }
1004d244b227SJung-uk Kim 
1005d244b227SJung-uk Kim         FlPrintFile (FileId, " ");
1006d244b227SJung-uk Kim         for (j = 0; j < 16; j++)
1007d244b227SJung-uk Kim         {
1008d244b227SJung-uk Kim             if (i + j >= Length)
1009d244b227SJung-uk Kim             {
1010d244b227SJung-uk Kim                 FlPrintFile (FileId, "\n\n");
1011d244b227SJung-uk Kim                 return;
1012d244b227SJung-uk Kim             }
1013d244b227SJung-uk Kim 
1014d244b227SJung-uk Kim             BufChar = Buffer[(ACPI_SIZE) i + j];
10155ef50723SJung-uk Kim             if (isprint (BufChar))
1016d244b227SJung-uk Kim             {
1017d244b227SJung-uk Kim                 FlPrintFile (FileId, "%c", BufChar);
1018d244b227SJung-uk Kim             }
1019d244b227SJung-uk Kim             else
1020d244b227SJung-uk Kim             {
1021d244b227SJung-uk Kim                 FlPrintFile (FileId, ".");
1022d244b227SJung-uk Kim             }
1023d244b227SJung-uk Kim         }
1024d244b227SJung-uk Kim 
1025d244b227SJung-uk Kim         /* Done with that line. */
1026d244b227SJung-uk Kim 
1027d244b227SJung-uk Kim         FlPrintFile (FileId, "\n");
1028d244b227SJung-uk Kim         i += 16;
1029d244b227SJung-uk Kim     }
1030d244b227SJung-uk Kim 
1031d244b227SJung-uk Kim     FlPrintFile (FileId, "\n\n");
1032d244b227SJung-uk Kim }
1033d244b227SJung-uk Kim 
1034d244b227SJung-uk Kim 
1035d244b227SJung-uk Kim /******************************************************************************
1036d244b227SJung-uk Kim  *
1037efcc2a30SJung-uk Kim  * FUNCTION:    DtDumpFieldList
1038efcc2a30SJung-uk Kim  *
1039efcc2a30SJung-uk Kim  * PARAMETERS:  Field               - Root field
1040efcc2a30SJung-uk Kim  *
1041efcc2a30SJung-uk Kim  * RETURN:      None
1042efcc2a30SJung-uk Kim  *
1043efcc2a30SJung-uk Kim  * DESCRIPTION: Dump the entire field list
1044efcc2a30SJung-uk Kim  *
1045efcc2a30SJung-uk Kim  *****************************************************************************/
1046efcc2a30SJung-uk Kim 
1047efcc2a30SJung-uk Kim void
1048efcc2a30SJung-uk Kim DtDumpFieldList (
1049efcc2a30SJung-uk Kim     DT_FIELD                *Field)
1050efcc2a30SJung-uk Kim {
1051efcc2a30SJung-uk Kim 
1052efcc2a30SJung-uk Kim     if (!Gbl_DebugFlag || !Field)
1053efcc2a30SJung-uk Kim     {
1054efcc2a30SJung-uk Kim         return;
1055efcc2a30SJung-uk Kim     }
1056efcc2a30SJung-uk Kim 
1057efcc2a30SJung-uk Kim     DbgPrint (ASL_DEBUG_OUTPUT,  "\nField List:\n"
1058efcc2a30SJung-uk Kim         "LineNo   ByteOff  NameCol  Column   TableOff "
1059efcc2a30SJung-uk Kim         "Flags %32s : %s\n\n", "Name", "Value");
1060f8146b88SJung-uk Kim 
1061efcc2a30SJung-uk Kim     while (Field)
1062efcc2a30SJung-uk Kim     {
1063efcc2a30SJung-uk Kim         DbgPrint (ASL_DEBUG_OUTPUT,
10647cf3e94aSJung-uk Kim             "%.08X %.08X %.08X %.08X %.08X %2.2X    %32s : %s\n",
1065efcc2a30SJung-uk Kim             Field->Line, Field->ByteOffset, Field->NameColumn,
1066efcc2a30SJung-uk Kim             Field->Column, Field->TableOffset, Field->Flags,
1067efcc2a30SJung-uk Kim             Field->Name, Field->Value);
1068efcc2a30SJung-uk Kim 
1069efcc2a30SJung-uk Kim         Field = Field->Next;
1070efcc2a30SJung-uk Kim     }
1071efcc2a30SJung-uk Kim 
1072efcc2a30SJung-uk Kim     DbgPrint (ASL_DEBUG_OUTPUT,  "\n\n");
1073efcc2a30SJung-uk Kim }
1074efcc2a30SJung-uk Kim 
1075efcc2a30SJung-uk Kim 
1076efcc2a30SJung-uk Kim /******************************************************************************
1077efcc2a30SJung-uk Kim  *
1078efcc2a30SJung-uk Kim  * FUNCTION:    DtDumpSubtableInfo, DtDumpSubtableTree
1079efcc2a30SJung-uk Kim  *
1080efcc2a30SJung-uk Kim  * PARAMETERS:  DT_WALK_CALLBACK
1081efcc2a30SJung-uk Kim  *
1082efcc2a30SJung-uk Kim  * RETURN:      None
1083efcc2a30SJung-uk Kim  *
1084efcc2a30SJung-uk Kim  * DESCRIPTION: Info - dump a subtable tree entry with extra information.
1085efcc2a30SJung-uk Kim  *              Tree - dump a subtable tree formatted by depth indentation.
1086efcc2a30SJung-uk Kim  *
1087efcc2a30SJung-uk Kim  *****************************************************************************/
1088efcc2a30SJung-uk Kim 
1089efcc2a30SJung-uk Kim static void
1090efcc2a30SJung-uk Kim DtDumpSubtableInfo (
1091efcc2a30SJung-uk Kim     DT_SUBTABLE             *Subtable,
1092efcc2a30SJung-uk Kim     void                    *Context,
1093efcc2a30SJung-uk Kim     void                    *ReturnValue)
1094efcc2a30SJung-uk Kim {
1095efcc2a30SJung-uk Kim 
1096efcc2a30SJung-uk Kim     DbgPrint (ASL_DEBUG_OUTPUT,
1097a371a5fdSJung-uk Kim         "[%.04X] %24s %.08X %.08X %.08X %.08X %.08X %p %p %p\n",
1098a371a5fdSJung-uk Kim         Subtable->Depth, Subtable->Name, Subtable->Length, Subtable->TotalLength,
1099efcc2a30SJung-uk Kim         Subtable->SizeOfLengthField, Subtable->Flags, Subtable,
1100efcc2a30SJung-uk Kim         Subtable->Parent, Subtable->Child, Subtable->Peer);
1101efcc2a30SJung-uk Kim }
1102efcc2a30SJung-uk Kim 
1103efcc2a30SJung-uk Kim static void
1104efcc2a30SJung-uk Kim DtDumpSubtableTree (
1105efcc2a30SJung-uk Kim     DT_SUBTABLE             *Subtable,
1106efcc2a30SJung-uk Kim     void                    *Context,
1107efcc2a30SJung-uk Kim     void                    *ReturnValue)
1108efcc2a30SJung-uk Kim {
1109efcc2a30SJung-uk Kim 
1110efcc2a30SJung-uk Kim     DbgPrint (ASL_DEBUG_OUTPUT,
1111a371a5fdSJung-uk Kim         "[%.04X] %24s %*s%08X (%.02X) - (%.02X)\n",
1112a371a5fdSJung-uk Kim         Subtable->Depth, Subtable->Name, (4 * Subtable->Depth), " ",
1113efcc2a30SJung-uk Kim         Subtable, Subtable->Length, Subtable->TotalLength);
1114efcc2a30SJung-uk Kim }
1115efcc2a30SJung-uk Kim 
1116efcc2a30SJung-uk Kim 
1117efcc2a30SJung-uk Kim /******************************************************************************
1118efcc2a30SJung-uk Kim  *
1119efcc2a30SJung-uk Kim  * FUNCTION:    DtDumpSubtableList
1120efcc2a30SJung-uk Kim  *
1121efcc2a30SJung-uk Kim  * PARAMETERS:  None
1122efcc2a30SJung-uk Kim  *
1123efcc2a30SJung-uk Kim  * RETURN:      None
1124efcc2a30SJung-uk Kim  *
1125efcc2a30SJung-uk Kim  * DESCRIPTION: Dump the raw list of subtables with information, and also
1126efcc2a30SJung-uk Kim  *              dump the subtable list in formatted tree format. Assists with
1127efcc2a30SJung-uk Kim  *              the development of new table code.
1128efcc2a30SJung-uk Kim  *
1129efcc2a30SJung-uk Kim  *****************************************************************************/
1130efcc2a30SJung-uk Kim 
1131efcc2a30SJung-uk Kim void
1132efcc2a30SJung-uk Kim DtDumpSubtableList (
1133efcc2a30SJung-uk Kim     void)
1134efcc2a30SJung-uk Kim {
1135efcc2a30SJung-uk Kim 
1136efcc2a30SJung-uk Kim     if (!Gbl_DebugFlag || !Gbl_RootTable)
1137efcc2a30SJung-uk Kim     {
1138efcc2a30SJung-uk Kim         return;
1139efcc2a30SJung-uk Kim     }
1140efcc2a30SJung-uk Kim 
1141efcc2a30SJung-uk Kim     DbgPrint (ASL_DEBUG_OUTPUT,
1142efcc2a30SJung-uk Kim         "Subtable Info:\n"
1143a371a5fdSJung-uk Kim         "Depth                      Name Length   TotalLen LenSize  Flags    "
1144efcc2a30SJung-uk Kim         "This     Parent   Child    Peer\n\n");
1145efcc2a30SJung-uk Kim     DtWalkTableTree (Gbl_RootTable, DtDumpSubtableInfo, NULL, NULL);
1146efcc2a30SJung-uk Kim 
1147efcc2a30SJung-uk Kim     DbgPrint (ASL_DEBUG_OUTPUT,
1148a371a5fdSJung-uk Kim         "\nSubtable Tree: (Depth, Name, Subtable, Length, TotalLength)\n\n");
1149efcc2a30SJung-uk Kim     DtWalkTableTree (Gbl_RootTable, DtDumpSubtableTree, NULL, NULL);
1150313a0c13SJung-uk Kim 
1151313a0c13SJung-uk Kim     DbgPrint (ASL_DEBUG_OUTPUT, "\n");
1152efcc2a30SJung-uk Kim }
1153efcc2a30SJung-uk Kim 
1154efcc2a30SJung-uk Kim 
1155efcc2a30SJung-uk Kim /******************************************************************************
1156efcc2a30SJung-uk Kim  *
1157d244b227SJung-uk Kim  * FUNCTION:    DtWriteFieldToListing
1158d244b227SJung-uk Kim  *
1159d244b227SJung-uk Kim  * PARAMETERS:  Buffer              - Contains the compiled data
1160d244b227SJung-uk Kim  *              Field               - Field node for the input line
1161d244b227SJung-uk Kim  *              Length              - Length of the output data
1162d244b227SJung-uk Kim  *
1163d244b227SJung-uk Kim  * RETURN:      None
1164d244b227SJung-uk Kim  *
1165d244b227SJung-uk Kim  * DESCRIPTION: Write one field to the listing file (if listing is enabled).
1166d244b227SJung-uk Kim  *
1167d244b227SJung-uk Kim  *****************************************************************************/
1168d244b227SJung-uk Kim 
1169d244b227SJung-uk Kim void
1170d244b227SJung-uk Kim DtWriteFieldToListing (
1171d244b227SJung-uk Kim     UINT8                   *Buffer,
1172d244b227SJung-uk Kim     DT_FIELD                *Field,
1173d244b227SJung-uk Kim     UINT32                  Length)
1174d244b227SJung-uk Kim {
1175d244b227SJung-uk Kim     UINT8                   FileByte;
1176d244b227SJung-uk Kim 
1177d244b227SJung-uk Kim 
1178d244b227SJung-uk Kim     if (!Gbl_ListingFlag || !Field)
1179d244b227SJung-uk Kim     {
1180d244b227SJung-uk Kim         return;
1181d244b227SJung-uk Kim     }
1182d244b227SJung-uk Kim 
1183d244b227SJung-uk Kim     /* Dump the original source line */
1184d244b227SJung-uk Kim 
1185d244b227SJung-uk Kim     FlPrintFile (ASL_FILE_LISTING_OUTPUT, "Input:  ");
1186d244b227SJung-uk Kim     FlSeekFile (ASL_FILE_INPUT, Field->ByteOffset);
1187d244b227SJung-uk Kim 
1188d244b227SJung-uk Kim     while (FlReadFile (ASL_FILE_INPUT, &FileByte, 1) == AE_OK)
1189d244b227SJung-uk Kim     {
1190d244b227SJung-uk Kim         FlWriteFile (ASL_FILE_LISTING_OUTPUT, &FileByte, 1);
1191d244b227SJung-uk Kim         if (FileByte == '\n')
1192d244b227SJung-uk Kim         {
1193d244b227SJung-uk Kim             break;
1194d244b227SJung-uk Kim         }
1195d244b227SJung-uk Kim     }
1196d244b227SJung-uk Kim 
1197d244b227SJung-uk Kim     /* Dump the line as parsed and represented internally */
1198d244b227SJung-uk Kim 
1199d052a1ccSJung-uk Kim     FlPrintFile (ASL_FILE_LISTING_OUTPUT, "Parsed: %*s : %.64s",
1200d244b227SJung-uk Kim         Field->Column-4, Field->Name, Field->Value);
1201d244b227SJung-uk Kim 
1202d052a1ccSJung-uk Kim     if (strlen (Field->Value) > 64)
1203d052a1ccSJung-uk Kim     {
1204d052a1ccSJung-uk Kim         FlPrintFile (ASL_FILE_LISTING_OUTPUT, "...Additional data, length 0x%X\n",
1205d052a1ccSJung-uk Kim             strlen (Field->Value));
1206d052a1ccSJung-uk Kim     }
1207f8146b88SJung-uk Kim 
1208d052a1ccSJung-uk Kim     FlPrintFile (ASL_FILE_LISTING_OUTPUT, "\n");
1209d052a1ccSJung-uk Kim 
1210d244b227SJung-uk Kim     /* Dump the hex data that will be output for this field */
1211d244b227SJung-uk Kim 
12120b94ba42SJung-uk Kim     DtDumpBuffer (ASL_FILE_LISTING_OUTPUT, Buffer, Field->TableOffset, Length);
1213d244b227SJung-uk Kim }
1214d244b227SJung-uk Kim 
1215d244b227SJung-uk Kim 
1216d244b227SJung-uk Kim /******************************************************************************
1217d244b227SJung-uk Kim  *
1218d244b227SJung-uk Kim  * FUNCTION:    DtWriteTableToListing
1219d244b227SJung-uk Kim  *
1220d244b227SJung-uk Kim  * PARAMETERS:  None
1221d244b227SJung-uk Kim  *
1222d244b227SJung-uk Kim  * RETURN:      None
1223d244b227SJung-uk Kim  *
1224d244b227SJung-uk Kim  * DESCRIPTION: Write the entire compiled table to the listing file
1225d244b227SJung-uk Kim  *              in hex format
1226d244b227SJung-uk Kim  *
1227d244b227SJung-uk Kim  *****************************************************************************/
1228d244b227SJung-uk Kim 
1229d244b227SJung-uk Kim void
1230d244b227SJung-uk Kim DtWriteTableToListing (
1231d244b227SJung-uk Kim     void)
1232d244b227SJung-uk Kim {
1233d244b227SJung-uk Kim     UINT8                   *Buffer;
1234d244b227SJung-uk Kim 
1235d244b227SJung-uk Kim 
1236d244b227SJung-uk Kim     if (!Gbl_ListingFlag)
1237d244b227SJung-uk Kim     {
1238d244b227SJung-uk Kim         return;
1239d244b227SJung-uk Kim     }
1240d244b227SJung-uk Kim 
1241d244b227SJung-uk Kim     /* Read the entire table from the output file */
1242d244b227SJung-uk Kim 
1243d244b227SJung-uk Kim     Buffer = UtLocalCalloc (Gbl_TableLength);
1244d244b227SJung-uk Kim     FlSeekFile (ASL_FILE_AML_OUTPUT, 0);
1245d244b227SJung-uk Kim     FlReadFile (ASL_FILE_AML_OUTPUT, Buffer, Gbl_TableLength);
1246d244b227SJung-uk Kim 
1247d244b227SJung-uk Kim     /* Dump the raw table data */
1248d244b227SJung-uk Kim 
1249d244b227SJung-uk Kim     AcpiOsRedirectOutput (Gbl_Files[ASL_FILE_LISTING_OUTPUT].Handle);
1250d244b227SJung-uk Kim 
1251d244b227SJung-uk Kim     AcpiOsPrintf ("\n%s: Length %d (0x%X)\n\n",
1252d244b227SJung-uk Kim         ACPI_RAW_TABLE_DATA_HEADER, Gbl_TableLength, Gbl_TableLength);
12538ef1a331SJung-uk Kim     AcpiUtDumpBuffer (Buffer, Gbl_TableLength, DB_BYTE_DISPLAY, 0);
1254d244b227SJung-uk Kim 
1255d244b227SJung-uk Kim     AcpiOsRedirectOutput (stdout);
12568d744e47SJung-uk Kim     ACPI_FREE (Buffer);
1257d244b227SJung-uk Kim }
1258