xref: /freebsd/sys/contrib/dev/acpica/compiler/dtio.c (revision 4a38ee6de7913274c71349f5d5f7cbc7bf1e14fd)
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 
70d84335fSJung-uk Kim /******************************************************************************
80d84335fSJung-uk Kim  *
90d84335fSJung-uk Kim  * 1. Copyright Notice
100d84335fSJung-uk Kim  *
1132ac4016SJung-uk Kim  * Some or all of this work - Copyright (c) 1999 - 2018, Intel Corp.
12a88e22b7SJung-uk Kim  * All rights reserved.
13a88e22b7SJung-uk Kim  *
140d84335fSJung-uk Kim  * 2. License
150d84335fSJung-uk Kim  *
160d84335fSJung-uk Kim  * 2.1. This is your license from Intel Corp. under its intellectual property
170d84335fSJung-uk Kim  * rights. You may have additional license terms from the party that provided
180d84335fSJung-uk Kim  * you this software, covering your right to use that party's intellectual
190d84335fSJung-uk Kim  * property rights.
200d84335fSJung-uk Kim  *
210d84335fSJung-uk Kim  * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
220d84335fSJung-uk Kim  * copy of the source code appearing in this file ("Covered Code") an
230d84335fSJung-uk Kim  * irrevocable, perpetual, worldwide license under Intel's copyrights in the
240d84335fSJung-uk Kim  * base code distributed originally by Intel ("Original Intel Code") to copy,
250d84335fSJung-uk Kim  * make derivatives, distribute, use and display any portion of the Covered
260d84335fSJung-uk Kim  * Code in any form, with the right to sublicense such rights; and
270d84335fSJung-uk Kim  *
280d84335fSJung-uk Kim  * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
290d84335fSJung-uk Kim  * license (with the right to sublicense), under only those claims of Intel
300d84335fSJung-uk Kim  * patents that are infringed by the Original Intel Code, to make, use, sell,
310d84335fSJung-uk Kim  * offer to sell, and import the Covered Code and derivative works thereof
320d84335fSJung-uk Kim  * solely to the minimum extent necessary to exercise the above copyright
330d84335fSJung-uk Kim  * license, and in no event shall the patent license extend to any additions
340d84335fSJung-uk Kim  * to or modifications of the Original Intel Code. No other license or right
350d84335fSJung-uk Kim  * is granted directly or by implication, estoppel or otherwise;
360d84335fSJung-uk Kim  *
370d84335fSJung-uk Kim  * The above copyright and patent license is granted only if the following
380d84335fSJung-uk Kim  * conditions are met:
390d84335fSJung-uk Kim  *
400d84335fSJung-uk Kim  * 3. Conditions
410d84335fSJung-uk Kim  *
420d84335fSJung-uk Kim  * 3.1. Redistribution of Source with Rights to Further Distribute Source.
430d84335fSJung-uk Kim  * Redistribution of source code of any substantial portion of the Covered
440d84335fSJung-uk Kim  * Code or modification with rights to further distribute source must include
450d84335fSJung-uk Kim  * the above Copyright Notice, the above License, this list of Conditions,
460d84335fSJung-uk Kim  * and the following Disclaimer and Export Compliance provision. In addition,
470d84335fSJung-uk Kim  * Licensee must cause all Covered Code to which Licensee contributes to
480d84335fSJung-uk Kim  * contain a file documenting the changes Licensee made to create that Covered
490d84335fSJung-uk Kim  * Code and the date of any change. Licensee must include in that file the
500d84335fSJung-uk Kim  * documentation of any changes made by any predecessor Licensee. Licensee
510d84335fSJung-uk Kim  * must include a prominent statement that the modification is derived,
520d84335fSJung-uk Kim  * directly or indirectly, from Original Intel Code.
530d84335fSJung-uk Kim  *
540d84335fSJung-uk Kim  * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
550d84335fSJung-uk Kim  * Redistribution of source code of any substantial portion of the Covered
560d84335fSJung-uk Kim  * Code or modification without rights to further distribute source must
570d84335fSJung-uk Kim  * include the following Disclaimer and Export Compliance provision in the
580d84335fSJung-uk Kim  * documentation and/or other materials provided with distribution. In
590d84335fSJung-uk Kim  * addition, Licensee may not authorize further sublicense of source of any
600d84335fSJung-uk Kim  * portion of the Covered Code, and must include terms to the effect that the
610d84335fSJung-uk Kim  * license from Licensee to its licensee is limited to the intellectual
620d84335fSJung-uk Kim  * property embodied in the software Licensee provides to its licensee, and
630d84335fSJung-uk Kim  * not to intellectual property embodied in modifications its licensee may
640d84335fSJung-uk Kim  * make.
650d84335fSJung-uk Kim  *
660d84335fSJung-uk Kim  * 3.3. Redistribution of Executable. Redistribution in executable form of any
670d84335fSJung-uk Kim  * substantial portion of the Covered Code or modification must reproduce the
680d84335fSJung-uk Kim  * above Copyright Notice, and the following Disclaimer and Export Compliance
690d84335fSJung-uk Kim  * provision in the documentation and/or other materials provided with the
700d84335fSJung-uk Kim  * distribution.
710d84335fSJung-uk Kim  *
720d84335fSJung-uk Kim  * 3.4. Intel retains all right, title, and interest in and to the Original
730d84335fSJung-uk Kim  * Intel Code.
740d84335fSJung-uk Kim  *
750d84335fSJung-uk Kim  * 3.5. Neither the name Intel nor any other trademark owned or controlled by
760d84335fSJung-uk Kim  * Intel shall be used in advertising or otherwise to promote the sale, use or
770d84335fSJung-uk Kim  * other dealings in products derived from or relating to the Covered Code
780d84335fSJung-uk Kim  * without prior written authorization from Intel.
790d84335fSJung-uk Kim  *
800d84335fSJung-uk Kim  * 4. Disclaimer and Export Compliance
810d84335fSJung-uk Kim  *
820d84335fSJung-uk Kim  * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
830d84335fSJung-uk Kim  * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
840d84335fSJung-uk Kim  * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
850d84335fSJung-uk Kim  * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
860d84335fSJung-uk Kim  * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
870d84335fSJung-uk Kim  * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
880d84335fSJung-uk Kim  * PARTICULAR PURPOSE.
890d84335fSJung-uk Kim  *
900d84335fSJung-uk Kim  * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
910d84335fSJung-uk Kim  * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
920d84335fSJung-uk Kim  * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
930d84335fSJung-uk Kim  * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
940d84335fSJung-uk Kim  * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
950d84335fSJung-uk Kim  * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
960d84335fSJung-uk Kim  * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
970d84335fSJung-uk Kim  * LIMITED REMEDY.
980d84335fSJung-uk Kim  *
990d84335fSJung-uk Kim  * 4.3. Licensee shall not export, either directly or indirectly, any of this
1000d84335fSJung-uk Kim  * software or system incorporating such software without first obtaining any
1010d84335fSJung-uk Kim  * required license or other approval from the U. S. Department of Commerce or
1020d84335fSJung-uk Kim  * any other agency or department of the United States Government. In the
1030d84335fSJung-uk Kim  * event Licensee exports any such software from the United States or
1040d84335fSJung-uk Kim  * re-exports any such software from a foreign destination, Licensee shall
1050d84335fSJung-uk Kim  * ensure that the distribution and export/re-export of the software is in
1060d84335fSJung-uk Kim  * compliance with all laws, regulations, orders, or other restrictions of the
1070d84335fSJung-uk Kim  * U.S. Export Administration Regulations. Licensee agrees that neither it nor
1080d84335fSJung-uk Kim  * any of its subsidiaries will export/re-export any technical data, process,
1090d84335fSJung-uk Kim  * software, or service, directly or indirectly, to any country for which the
1100d84335fSJung-uk Kim  * United States government or any agency thereof requires an export license,
1110d84335fSJung-uk Kim  * other governmental approval, or letter of assurance, without first obtaining
1120d84335fSJung-uk Kim  * such license, approval or letter.
1130d84335fSJung-uk Kim  *
1140d84335fSJung-uk Kim  *****************************************************************************
1150d84335fSJung-uk Kim  *
1160d84335fSJung-uk Kim  * Alternatively, you may choose to be licensed under the terms of the
1170d84335fSJung-uk Kim  * following license:
1180d84335fSJung-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  *
1340d84335fSJung-uk Kim  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
1350d84335fSJung-uk Kim  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
1360d84335fSJung-uk Kim  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
1370d84335fSJung-uk Kim  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
1380d84335fSJung-uk Kim  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
1390d84335fSJung-uk Kim  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
1400d84335fSJung-uk Kim  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
1410d84335fSJung-uk Kim  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
1420d84335fSJung-uk Kim  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
1430d84335fSJung-uk Kim  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
1440d84335fSJung-uk Kim  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
1450d84335fSJung-uk Kim  *
1460d84335fSJung-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  *
1500d84335fSJung-uk Kim  *****************************************************************************/
151a88e22b7SJung-uk Kim 
152a88e22b7SJung-uk Kim #include <contrib/dev/acpica/compiler/aslcompiler.h>
153313a0c13SJung-uk Kim #include <contrib/dev/acpica/include/acapps.h>
154a88e22b7SJung-uk Kim 
155a88e22b7SJung-uk Kim #define _COMPONENT          DT_COMPILER
156a88e22b7SJung-uk Kim         ACPI_MODULE_NAME    ("dtio")
157a88e22b7SJung-uk Kim 
158a88e22b7SJung-uk Kim 
159a88e22b7SJung-uk Kim /* Local prototypes */
160a88e22b7SJung-uk Kim 
161a88e22b7SJung-uk Kim static char *
162a88e22b7SJung-uk Kim DtTrim (
163a88e22b7SJung-uk Kim     char                    *String);
164a88e22b7SJung-uk Kim 
165a88e22b7SJung-uk Kim static void
166a88e22b7SJung-uk Kim DtLinkField (
167a88e22b7SJung-uk Kim     DT_FIELD                *Field);
168a88e22b7SJung-uk Kim 
169d244b227SJung-uk Kim static ACPI_STATUS
170a88e22b7SJung-uk Kim DtParseLine (
171a88e22b7SJung-uk Kim     char                    *LineBuffer,
172a88e22b7SJung-uk Kim     UINT32                  Line,
173a88e22b7SJung-uk Kim     UINT32                  Offset);
174a88e22b7SJung-uk Kim 
175a88e22b7SJung-uk Kim static void
176a88e22b7SJung-uk Kim DtWriteBinary (
177a88e22b7SJung-uk Kim     DT_SUBTABLE             *Subtable,
178a88e22b7SJung-uk Kim     void                    *Context,
179a88e22b7SJung-uk Kim     void                    *ReturnValue);
180a88e22b7SJung-uk Kim 
181d244b227SJung-uk Kim static void
182d244b227SJung-uk Kim DtDumpBuffer (
183d244b227SJung-uk Kim     UINT32                  FileId,
184d244b227SJung-uk Kim     UINT8                   *Buffer,
1850b94ba42SJung-uk Kim     UINT32                  Offset,
186d244b227SJung-uk Kim     UINT32                  Length);
187a88e22b7SJung-uk Kim 
188efcc2a30SJung-uk Kim static void
189efcc2a30SJung-uk Kim DtDumpSubtableInfo (
190efcc2a30SJung-uk Kim     DT_SUBTABLE             *Subtable,
191efcc2a30SJung-uk Kim     void                    *Context,
192efcc2a30SJung-uk Kim     void                    *ReturnValue);
193efcc2a30SJung-uk Kim 
194efcc2a30SJung-uk Kim static void
195efcc2a30SJung-uk Kim DtDumpSubtableTree (
196efcc2a30SJung-uk Kim     DT_SUBTABLE             *Subtable,
197efcc2a30SJung-uk Kim     void                    *Context,
198efcc2a30SJung-uk Kim     void                    *ReturnValue);
199efcc2a30SJung-uk Kim 
2000b94ba42SJung-uk Kim 
201a88e22b7SJung-uk Kim /* States for DtGetNextLine */
202a88e22b7SJung-uk Kim 
203a88e22b7SJung-uk Kim #define DT_NORMAL_TEXT              0
204a88e22b7SJung-uk Kim #define DT_START_QUOTED_STRING      1
205a88e22b7SJung-uk Kim #define DT_START_COMMENT            2
206a88e22b7SJung-uk Kim #define DT_SLASH_ASTERISK_COMMENT   3
207a88e22b7SJung-uk Kim #define DT_SLASH_SLASH_COMMENT      4
208a88e22b7SJung-uk Kim #define DT_END_COMMENT              5
209d052a1ccSJung-uk Kim #define DT_MERGE_LINES              6
210eef1b955SJung-uk Kim #define DT_ESCAPE_SEQUENCE          7
211a88e22b7SJung-uk Kim 
2126f1f1a63SJung-uk Kim static UINT32               AslGbl_NextLineOffset;
213a88e22b7SJung-uk Kim 
214a88e22b7SJung-uk Kim 
215a88e22b7SJung-uk Kim /******************************************************************************
216a88e22b7SJung-uk Kim  *
217a88e22b7SJung-uk Kim  * FUNCTION:    DtTrim
218a88e22b7SJung-uk Kim  *
219a88e22b7SJung-uk Kim  * PARAMETERS:  String              - Current source code line to trim
220a88e22b7SJung-uk Kim  *
221a88e22b7SJung-uk Kim  * RETURN:      Trimmed line. Must be freed by caller.
222a88e22b7SJung-uk Kim  *
223a88e22b7SJung-uk Kim  * DESCRIPTION: Trim left and right spaces
224a88e22b7SJung-uk Kim  *
225a88e22b7SJung-uk Kim  *****************************************************************************/
226a88e22b7SJung-uk Kim 
227a88e22b7SJung-uk Kim static char *
228a88e22b7SJung-uk Kim DtTrim (
229a88e22b7SJung-uk Kim     char                    *String)
230a88e22b7SJung-uk Kim {
231a88e22b7SJung-uk Kim     char                    *Start;
232a88e22b7SJung-uk Kim     char                    *End;
233a88e22b7SJung-uk Kim     char                    *ReturnString;
234a88e22b7SJung-uk Kim     ACPI_SIZE               Length;
235a88e22b7SJung-uk Kim 
236a88e22b7SJung-uk Kim 
237a88e22b7SJung-uk Kim     /* Skip lines that start with a space */
238a88e22b7SJung-uk Kim 
239*4a38ee6dSJung-uk Kim     if (*String == 0 || !strcmp (String, " "))
240a88e22b7SJung-uk Kim     {
24167d9aa44SJung-uk Kim         ReturnString = UtLocalCacheCalloc (1);
242a88e22b7SJung-uk Kim         return (ReturnString);
243a88e22b7SJung-uk Kim     }
244a88e22b7SJung-uk Kim 
245a88e22b7SJung-uk Kim     /* Setup pointers to start and end of input string */
246a88e22b7SJung-uk Kim 
247a88e22b7SJung-uk Kim     Start = String;
2485ef50723SJung-uk Kim     End = String + strlen (String) - 1;
249a88e22b7SJung-uk Kim 
250a88e22b7SJung-uk Kim     /* Find first non-whitespace character */
251a88e22b7SJung-uk Kim 
252a88e22b7SJung-uk Kim     while ((Start <= End) && ((*Start == ' ') || (*Start == '\t')))
253a88e22b7SJung-uk Kim     {
254a88e22b7SJung-uk Kim         Start++;
255a88e22b7SJung-uk Kim     }
256a88e22b7SJung-uk Kim 
257a88e22b7SJung-uk Kim     /* Find last non-space character */
258a88e22b7SJung-uk Kim 
259a88e22b7SJung-uk Kim     while (End >= Start)
260a88e22b7SJung-uk Kim     {
261*4a38ee6dSJung-uk Kim         if (*End == '\n')
262a88e22b7SJung-uk Kim         {
263a88e22b7SJung-uk Kim             End--;
264a88e22b7SJung-uk Kim             continue;
265a88e22b7SJung-uk Kim         }
266a88e22b7SJung-uk Kim 
267a88e22b7SJung-uk Kim         if (*End != ' ')
268a88e22b7SJung-uk Kim         {
269a88e22b7SJung-uk Kim             break;
270a88e22b7SJung-uk Kim         }
271a88e22b7SJung-uk Kim 
272a88e22b7SJung-uk Kim         End--;
273a88e22b7SJung-uk Kim     }
274a88e22b7SJung-uk Kim 
275a88e22b7SJung-uk Kim     /* Remove any quotes around the string */
276a88e22b7SJung-uk Kim 
277a88e22b7SJung-uk Kim     if (*Start == '\"')
278a88e22b7SJung-uk Kim     {
279a88e22b7SJung-uk Kim         Start++;
280a88e22b7SJung-uk Kim     }
281a88e22b7SJung-uk Kim     if (*End == '\"')
282a88e22b7SJung-uk Kim     {
283a88e22b7SJung-uk Kim         End--;
284a88e22b7SJung-uk Kim     }
285a88e22b7SJung-uk Kim 
286a88e22b7SJung-uk Kim     /* Create the trimmed return string */
287a88e22b7SJung-uk Kim 
288a88e22b7SJung-uk Kim     Length = ACPI_PTR_DIFF (End, Start) + 1;
28967d9aa44SJung-uk Kim     ReturnString = UtLocalCacheCalloc (Length + 1);
2905ef50723SJung-uk Kim     if (strlen (Start))
291a88e22b7SJung-uk Kim     {
2925ef50723SJung-uk Kim         strncpy (ReturnString, Start, Length);
293a88e22b7SJung-uk Kim     }
294a88e22b7SJung-uk Kim 
295a88e22b7SJung-uk Kim     ReturnString[Length] = 0;
296a88e22b7SJung-uk Kim     return (ReturnString);
297a88e22b7SJung-uk Kim }
298a88e22b7SJung-uk Kim 
299a88e22b7SJung-uk Kim 
300a88e22b7SJung-uk Kim /******************************************************************************
301a88e22b7SJung-uk Kim  *
302a88e22b7SJung-uk Kim  * FUNCTION:    DtLinkField
303a88e22b7SJung-uk Kim  *
304a88e22b7SJung-uk Kim  * PARAMETERS:  Field               - New field object to link
305a88e22b7SJung-uk Kim  *
306a88e22b7SJung-uk Kim  * RETURN:      None
307a88e22b7SJung-uk Kim  *
308a88e22b7SJung-uk Kim  * DESCRIPTION: Link one field name and value to the list
309a88e22b7SJung-uk Kim  *
310a88e22b7SJung-uk Kim  *****************************************************************************/
311a88e22b7SJung-uk Kim 
312a88e22b7SJung-uk Kim static void
313a88e22b7SJung-uk Kim DtLinkField (
314a88e22b7SJung-uk Kim     DT_FIELD                *Field)
315a88e22b7SJung-uk Kim {
316a88e22b7SJung-uk Kim     DT_FIELD                *Prev;
317a88e22b7SJung-uk Kim     DT_FIELD                *Next;
318a88e22b7SJung-uk Kim 
319a88e22b7SJung-uk Kim 
3206f1f1a63SJung-uk Kim     Prev = Next = AslGbl_FieldList;
321a88e22b7SJung-uk Kim 
322a88e22b7SJung-uk Kim     while (Next)
323a88e22b7SJung-uk Kim     {
324a88e22b7SJung-uk Kim         Prev = Next;
325a88e22b7SJung-uk Kim         Next = Next->Next;
326a88e22b7SJung-uk Kim     }
327a88e22b7SJung-uk Kim 
328a88e22b7SJung-uk Kim     if (Prev)
329a88e22b7SJung-uk Kim     {
330a88e22b7SJung-uk Kim         Prev->Next = Field;
331a88e22b7SJung-uk Kim     }
332a88e22b7SJung-uk Kim     else
333a88e22b7SJung-uk Kim     {
3346f1f1a63SJung-uk Kim         AslGbl_FieldList = Field;
335a88e22b7SJung-uk Kim     }
336a88e22b7SJung-uk Kim }
337a88e22b7SJung-uk Kim 
338a88e22b7SJung-uk Kim 
339a88e22b7SJung-uk Kim /******************************************************************************
340a88e22b7SJung-uk Kim  *
341a88e22b7SJung-uk Kim  * FUNCTION:    DtParseLine
342a88e22b7SJung-uk Kim  *
343a88e22b7SJung-uk Kim  * PARAMETERS:  LineBuffer          - Current source code line
344a88e22b7SJung-uk Kim  *              Line                - Current line number in the source
345a88e22b7SJung-uk Kim  *              Offset              - Current byte offset of the line
346a88e22b7SJung-uk Kim  *
347d244b227SJung-uk Kim  * RETURN:      Status
348a88e22b7SJung-uk Kim  *
349a88e22b7SJung-uk Kim  * DESCRIPTION: Parse one source line
350a88e22b7SJung-uk Kim  *
351a88e22b7SJung-uk Kim  *****************************************************************************/
352a88e22b7SJung-uk Kim 
353d244b227SJung-uk Kim static ACPI_STATUS
354a88e22b7SJung-uk Kim DtParseLine (
355a88e22b7SJung-uk Kim     char                    *LineBuffer,
356a88e22b7SJung-uk Kim     UINT32                  Line,
357a88e22b7SJung-uk Kim     UINT32                  Offset)
358a88e22b7SJung-uk Kim {
359a88e22b7SJung-uk Kim     char                    *Start;
360a88e22b7SJung-uk Kim     char                    *End;
361a88e22b7SJung-uk Kim     char                    *TmpName;
362a88e22b7SJung-uk Kim     char                    *TmpValue;
363a88e22b7SJung-uk Kim     char                    *Name;
364a88e22b7SJung-uk Kim     char                    *Value;
365a88e22b7SJung-uk Kim     char                    *Colon;
366a88e22b7SJung-uk Kim     UINT32                  Length;
367a88e22b7SJung-uk Kim     DT_FIELD                *Field;
368a88e22b7SJung-uk Kim     UINT32                  Column;
369a88e22b7SJung-uk Kim     UINT32                  NameColumn;
370d052a1ccSJung-uk Kim     BOOLEAN                 IsNullString = FALSE;
371a88e22b7SJung-uk Kim 
372a88e22b7SJung-uk Kim 
373a88e22b7SJung-uk Kim     if (!LineBuffer)
374a88e22b7SJung-uk Kim     {
375d244b227SJung-uk Kim         return (AE_OK);
376d244b227SJung-uk Kim     }
377d244b227SJung-uk Kim 
378d244b227SJung-uk Kim     /* All lines after "Raw Table Data" are ingored */
379d244b227SJung-uk Kim 
380d244b227SJung-uk Kim     if (strstr (LineBuffer, ACPI_RAW_TABLE_DATA_HEADER))
381d244b227SJung-uk Kim     {
382d244b227SJung-uk Kim         return (AE_NOT_FOUND);
383a88e22b7SJung-uk Kim     }
384a88e22b7SJung-uk Kim 
385a88e22b7SJung-uk Kim     Colon = strchr (LineBuffer, ':');
386d244b227SJung-uk Kim     if (!Colon)
387a88e22b7SJung-uk Kim     {
388d244b227SJung-uk Kim         return (AE_OK);
389a88e22b7SJung-uk Kim     }
390a88e22b7SJung-uk Kim 
391a88e22b7SJung-uk Kim     Start = LineBuffer;
392a88e22b7SJung-uk Kim     End = Colon;
393a88e22b7SJung-uk Kim 
394a88e22b7SJung-uk Kim     while (Start < Colon)
395a88e22b7SJung-uk Kim     {
396a88e22b7SJung-uk Kim         if (*Start == '[')
397a88e22b7SJung-uk Kim         {
3988d744e47SJung-uk Kim             /* Found left bracket, go to the right bracket */
3998d744e47SJung-uk Kim 
400a88e22b7SJung-uk Kim             while (Start < Colon && *Start != ']')
401a88e22b7SJung-uk Kim             {
402a88e22b7SJung-uk Kim                 Start++;
403a88e22b7SJung-uk Kim             }
4048d744e47SJung-uk Kim         }
4058d744e47SJung-uk Kim         else if (*Start != ' ')
406a88e22b7SJung-uk Kim         {
407a88e22b7SJung-uk Kim             break;
408a88e22b7SJung-uk Kim         }
409a88e22b7SJung-uk Kim 
410a88e22b7SJung-uk Kim         Start++;
411a88e22b7SJung-uk Kim     }
412a88e22b7SJung-uk Kim 
413a88e22b7SJung-uk Kim     /*
414a88e22b7SJung-uk Kim      * There are two column values. One for the field name,
415a88e22b7SJung-uk Kim      * and one for the field value.
416a88e22b7SJung-uk Kim      */
417a88e22b7SJung-uk Kim     Column = ACPI_PTR_DIFF (Colon, LineBuffer) + 3;
418a88e22b7SJung-uk Kim     NameColumn = ACPI_PTR_DIFF (Start, LineBuffer) + 1;
419a88e22b7SJung-uk Kim 
420a88e22b7SJung-uk Kim     Length = ACPI_PTR_DIFF (End, Start);
421a88e22b7SJung-uk Kim 
422a88e22b7SJung-uk Kim     TmpName = UtLocalCalloc (Length + 1);
4235ef50723SJung-uk Kim     strncpy (TmpName, Start, Length);
424a88e22b7SJung-uk Kim     Name = DtTrim (TmpName);
425a88e22b7SJung-uk Kim     ACPI_FREE (TmpName);
426a88e22b7SJung-uk Kim 
427a88e22b7SJung-uk Kim     Start = End = (Colon + 1);
428a88e22b7SJung-uk Kim     while (*End)
429a88e22b7SJung-uk Kim     {
430a88e22b7SJung-uk Kim         /* Found left quotation, go to the right quotation and break */
431a88e22b7SJung-uk Kim 
432a88e22b7SJung-uk Kim         if (*End == '"')
433a88e22b7SJung-uk Kim         {
434a88e22b7SJung-uk Kim             End++;
435d052a1ccSJung-uk Kim 
436d052a1ccSJung-uk Kim             /* Check for an explicit null string */
437d052a1ccSJung-uk Kim 
438d052a1ccSJung-uk Kim             if (*End == '"')
439d052a1ccSJung-uk Kim             {
440d052a1ccSJung-uk Kim                 IsNullString = TRUE;
441d052a1ccSJung-uk Kim             }
4420b94ba42SJung-uk Kim             while (*End && (*End != '"'))
443a88e22b7SJung-uk Kim             {
444a88e22b7SJung-uk Kim                 End++;
445a88e22b7SJung-uk Kim             }
446a88e22b7SJung-uk Kim 
447a88e22b7SJung-uk Kim             End++;
448a88e22b7SJung-uk Kim             break;
449a88e22b7SJung-uk Kim         }
450a88e22b7SJung-uk Kim 
4510b94ba42SJung-uk Kim         /*
4520b94ba42SJung-uk Kim          * Special "comment" fields at line end, ignore them.
4530b94ba42SJung-uk Kim          * Note: normal slash-slash and slash-asterisk comments are
4540b94ba42SJung-uk Kim          * stripped already by the DtGetNextLine parser.
4550b94ba42SJung-uk Kim          *
4560b94ba42SJung-uk Kim          * TBD: Perhaps DtGetNextLine should parse the following type
4570b94ba42SJung-uk Kim          * of comments also.
4580b94ba42SJung-uk Kim          */
459d052a1ccSJung-uk Kim         if (*End == '[')
460a88e22b7SJung-uk Kim         {
461d052a1ccSJung-uk Kim             End--;
462a88e22b7SJung-uk Kim             break;
463a88e22b7SJung-uk Kim         }
464f8146b88SJung-uk Kim 
465a88e22b7SJung-uk Kim         End++;
466a88e22b7SJung-uk Kim     }
467a88e22b7SJung-uk Kim 
468a88e22b7SJung-uk Kim     Length = ACPI_PTR_DIFF (End, Start);
469a88e22b7SJung-uk Kim     TmpValue = UtLocalCalloc (Length + 1);
470dcbce41eSJung-uk Kim 
4715ef50723SJung-uk Kim     strncpy (TmpValue, Start, Length);
472a88e22b7SJung-uk Kim     Value = DtTrim (TmpValue);
473a88e22b7SJung-uk Kim     ACPI_FREE (TmpValue);
474a88e22b7SJung-uk Kim 
475d052a1ccSJung-uk Kim     /* Create a new field object only if we have a valid value field */
476d052a1ccSJung-uk Kim 
477d052a1ccSJung-uk Kim     if ((Value && *Value) || IsNullString)
478a88e22b7SJung-uk Kim     {
479313a0c13SJung-uk Kim         Field = UtFieldCacheCalloc ();
480a88e22b7SJung-uk Kim         Field->Name = Name;
481a88e22b7SJung-uk Kim         Field->Value = Value;
482a88e22b7SJung-uk Kim         Field->Line = Line;
483a88e22b7SJung-uk Kim         Field->ByteOffset = Offset;
484a88e22b7SJung-uk Kim         Field->NameColumn = NameColumn;
485a88e22b7SJung-uk Kim         Field->Column = Column;
4867cf3e94aSJung-uk Kim         Field->StringLength = Length;
487a88e22b7SJung-uk Kim 
488a88e22b7SJung-uk Kim         DtLinkField (Field);
489a88e22b7SJung-uk Kim     }
490313a0c13SJung-uk Kim     /* Else -- Ignore this field, it has no valid data */
491d244b227SJung-uk Kim 
492d244b227SJung-uk Kim     return (AE_OK);
493a88e22b7SJung-uk Kim }
494a88e22b7SJung-uk Kim 
495a88e22b7SJung-uk Kim 
496a88e22b7SJung-uk Kim /******************************************************************************
497a88e22b7SJung-uk Kim  *
498a88e22b7SJung-uk Kim  * FUNCTION:    DtGetNextLine
499a88e22b7SJung-uk Kim  *
500a88e22b7SJung-uk Kim  * PARAMETERS:  Handle              - Open file handle for the source file
501a88e22b7SJung-uk Kim  *
502d052a1ccSJung-uk Kim  * RETURN:      Filled line buffer and offset of start-of-line (ASL_EOF on EOF)
503a88e22b7SJung-uk Kim  *
504a88e22b7SJung-uk Kim  * DESCRIPTION: Get the next valid source line. Removes all comments.
505a88e22b7SJung-uk Kim  *              Ignores empty lines.
506a88e22b7SJung-uk Kim  *
507a88e22b7SJung-uk Kim  * Handles both slash-asterisk and slash-slash comments.
508a88e22b7SJung-uk Kim  * Also, quoted strings, but no escapes within.
509a88e22b7SJung-uk Kim  *
5106f1f1a63SJung-uk Kim  * Line is returned in AslGbl_CurrentLineBuffer.
5116f1f1a63SJung-uk Kim  * Line number in original file is returned in AslGbl_CurrentLineNumber.
512a88e22b7SJung-uk Kim  *
513a88e22b7SJung-uk Kim  *****************************************************************************/
514a88e22b7SJung-uk Kim 
5150b94ba42SJung-uk Kim UINT32
516a88e22b7SJung-uk Kim DtGetNextLine (
5175ef50723SJung-uk Kim     FILE                    *Handle,
5185ef50723SJung-uk Kim     UINT32                  Flags)
519a88e22b7SJung-uk Kim {
520d052a1ccSJung-uk Kim     BOOLEAN                 LineNotAllBlanks = FALSE;
521a88e22b7SJung-uk Kim     UINT32                  State = DT_NORMAL_TEXT;
522a88e22b7SJung-uk Kim     UINT32                  CurrentLineOffset;
523a88e22b7SJung-uk Kim     UINT32                  i;
524a9d8d09cSJung-uk Kim     int                     c;
525*4a38ee6dSJung-uk Kim     int                     c1;
526a88e22b7SJung-uk Kim 
527a88e22b7SJung-uk Kim 
5286f1f1a63SJung-uk Kim     memset (AslGbl_CurrentLineBuffer, 0, AslGbl_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
5336f1f1a63SJung-uk Kim          * AslGbl_LineBufferSize.
534042ff955SJung-uk Kim          */
5356f1f1a63SJung-uk Kim         if (i >= AslGbl_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         }
573*4a38ee6dSJung-uk Kim         else if (c == '\r')
574*4a38ee6dSJung-uk Kim         {
575*4a38ee6dSJung-uk Kim             c1 = getc (Handle);
576*4a38ee6dSJung-uk Kim             if (c1 == '\n')
577*4a38ee6dSJung-uk Kim             {
578*4a38ee6dSJung-uk Kim                 /*
579*4a38ee6dSJung-uk Kim                  * Skip the carriage return as if it didn't exist. This is
580*4a38ee6dSJung-uk Kim                  * onlt meant for input files in DOS format in unix. fopen in
581*4a38ee6dSJung-uk Kim                  * unix may not support "text mode" and leaves CRLF intact.
582*4a38ee6dSJung-uk Kim                  */
583*4a38ee6dSJung-uk Kim                 c = '\n';
584*4a38ee6dSJung-uk Kim             }
585*4a38ee6dSJung-uk Kim             else
586*4a38ee6dSJung-uk Kim             {
587*4a38ee6dSJung-uk Kim                 /* This was not a CRLF. Only a CR */
588*4a38ee6dSJung-uk Kim 
589*4a38ee6dSJung-uk Kim                 ungetc(c1, Handle);
590*4a38ee6dSJung-uk Kim 
591*4a38ee6dSJung-uk Kim                 DtFatal (ASL_MSG_COMPILER_INTERNAL, NULL,
592*4a38ee6dSJung-uk Kim                     "Carriage return without linefeed detected");
593*4a38ee6dSJung-uk Kim                 return (ASL_EOF);
594*4a38ee6dSJung-uk Kim             }
595*4a38ee6dSJung-uk Kim         }
596a7a3b383SJung-uk Kim 
597a88e22b7SJung-uk Kim         switch (State)
598a88e22b7SJung-uk Kim         {
599a88e22b7SJung-uk Kim         case DT_NORMAL_TEXT:
600a88e22b7SJung-uk Kim 
601a88e22b7SJung-uk Kim             /* Normal text, insert char into line buffer */
602a88e22b7SJung-uk Kim 
6036f1f1a63SJung-uk Kim             AslGbl_CurrentLineBuffer[i] = (char) c;
604a88e22b7SJung-uk Kim             switch (c)
605a88e22b7SJung-uk Kim             {
606a88e22b7SJung-uk Kim             case '/':
607a9d8d09cSJung-uk Kim 
608a88e22b7SJung-uk Kim                 State = DT_START_COMMENT;
609a88e22b7SJung-uk Kim                 break;
610a88e22b7SJung-uk Kim 
611a88e22b7SJung-uk Kim             case '"':
612a9d8d09cSJung-uk Kim 
613a88e22b7SJung-uk Kim                 State = DT_START_QUOTED_STRING;
614d052a1ccSJung-uk Kim                 LineNotAllBlanks = TRUE;
615a88e22b7SJung-uk Kim                 i++;
616a88e22b7SJung-uk Kim                 break;
617a88e22b7SJung-uk Kim 
618d052a1ccSJung-uk Kim             case '\\':
619d052a1ccSJung-uk Kim                 /*
620d052a1ccSJung-uk Kim                  * The continuation char MUST be last char on this line.
621d052a1ccSJung-uk Kim                  * Otherwise, it will be assumed to be a valid ASL char.
622d052a1ccSJung-uk Kim                  */
623d052a1ccSJung-uk Kim                 State = DT_MERGE_LINES;
624d052a1ccSJung-uk Kim                 break;
625d052a1ccSJung-uk Kim 
626a88e22b7SJung-uk Kim             case '\n':
627a9d8d09cSJung-uk Kim 
6286f1f1a63SJung-uk Kim                 CurrentLineOffset = AslGbl_NextLineOffset;
6296f1f1a63SJung-uk Kim                 AslGbl_NextLineOffset = (UINT32) ftell (Handle);
6306f1f1a63SJung-uk Kim                 AslGbl_CurrentLineNumber++;
631a88e22b7SJung-uk Kim 
632d052a1ccSJung-uk Kim                 /*
633d052a1ccSJung-uk Kim                  * Exit if line is complete. Ignore empty lines (only \n)
634d052a1ccSJung-uk Kim                  * or lines that contain nothing but blanks.
635d052a1ccSJung-uk Kim                  */
636d052a1ccSJung-uk Kim                 if ((i != 0) && LineNotAllBlanks)
637a88e22b7SJung-uk Kim                 {
6386f1f1a63SJung-uk Kim                     if ((i + 1) >= AslGbl_LineBufferSize)
639042ff955SJung-uk Kim                     {
640042ff955SJung-uk Kim                         UtExpandLineBuffers ();
641042ff955SJung-uk Kim                     }
642042ff955SJung-uk Kim 
6436f1f1a63SJung-uk Kim                     AslGbl_CurrentLineBuffer[i+1] = 0; /* Terminate string */
644a88e22b7SJung-uk Kim                     return (CurrentLineOffset);
645a88e22b7SJung-uk Kim                 }
646d052a1ccSJung-uk Kim 
647d052a1ccSJung-uk Kim                 /* Toss this line and start a new one */
648d052a1ccSJung-uk Kim 
649d052a1ccSJung-uk Kim                 i = 0;
650d052a1ccSJung-uk Kim                 LineNotAllBlanks = FALSE;
651a88e22b7SJung-uk Kim                 break;
652a88e22b7SJung-uk Kim 
653a88e22b7SJung-uk Kim             default:
654a9d8d09cSJung-uk Kim 
655d052a1ccSJung-uk Kim                 if (c != ' ')
656d052a1ccSJung-uk Kim                 {
657d052a1ccSJung-uk Kim                     LineNotAllBlanks = TRUE;
658d052a1ccSJung-uk Kim                 }
659d052a1ccSJung-uk Kim 
660a88e22b7SJung-uk Kim                 i++;
661a88e22b7SJung-uk Kim                 break;
662a88e22b7SJung-uk Kim             }
663a88e22b7SJung-uk Kim             break;
664a88e22b7SJung-uk Kim 
665a88e22b7SJung-uk Kim         case DT_START_QUOTED_STRING:
666a88e22b7SJung-uk Kim 
667a88e22b7SJung-uk Kim             /* Insert raw chars until end of quoted string */
668a88e22b7SJung-uk Kim 
6696f1f1a63SJung-uk Kim             AslGbl_CurrentLineBuffer[i] = (char) c;
670a88e22b7SJung-uk Kim             i++;
671a88e22b7SJung-uk Kim 
672eef1b955SJung-uk Kim             switch (c)
673a88e22b7SJung-uk Kim             {
674eef1b955SJung-uk Kim             case '"':
675a9d8d09cSJung-uk Kim 
676a88e22b7SJung-uk Kim                 State = DT_NORMAL_TEXT;
677eef1b955SJung-uk Kim                 break;
678eef1b955SJung-uk Kim 
679eef1b955SJung-uk Kim             case '\\':
680a9d8d09cSJung-uk Kim 
681eef1b955SJung-uk Kim                 State = DT_ESCAPE_SEQUENCE;
682eef1b955SJung-uk Kim                 break;
683eef1b955SJung-uk Kim 
684eef1b955SJung-uk Kim             case '\n':
685a9d8d09cSJung-uk Kim 
6865ef50723SJung-uk Kim                 if (!(Flags & DT_ALLOW_MULTILINE_QUOTES))
6875ef50723SJung-uk Kim                 {
688f8146b88SJung-uk Kim                     AcpiOsPrintf (
689f8146b88SJung-uk Kim                         "ERROR at line %u: Unterminated quoted string\n",
6906f1f1a63SJung-uk Kim                         AslGbl_CurrentLineNumber++);
691eef1b955SJung-uk Kim                     State = DT_NORMAL_TEXT;
6925ef50723SJung-uk Kim                 }
693eef1b955SJung-uk Kim                 break;
694eef1b955SJung-uk Kim 
695eef1b955SJung-uk Kim             default:    /* Get next character */
696a9d8d09cSJung-uk Kim 
697eef1b955SJung-uk Kim                 break;
698a88e22b7SJung-uk Kim             }
699a88e22b7SJung-uk Kim             break;
700a88e22b7SJung-uk Kim 
701eef1b955SJung-uk Kim         case DT_ESCAPE_SEQUENCE:
702eef1b955SJung-uk Kim 
703eef1b955SJung-uk Kim             /* Just copy the escaped character. TBD: sufficient for table compiler? */
704eef1b955SJung-uk Kim 
7056f1f1a63SJung-uk Kim             AslGbl_CurrentLineBuffer[i] = (char) c;
706eef1b955SJung-uk Kim             i++;
707eef1b955SJung-uk Kim             State = DT_START_QUOTED_STRING;
708eef1b955SJung-uk Kim             break;
709eef1b955SJung-uk Kim 
710a88e22b7SJung-uk Kim         case DT_START_COMMENT:
711a88e22b7SJung-uk Kim 
712a88e22b7SJung-uk Kim             /* Open comment if this character is an asterisk or slash */
713a88e22b7SJung-uk Kim 
714a88e22b7SJung-uk Kim             switch (c)
715a88e22b7SJung-uk Kim             {
716a88e22b7SJung-uk Kim             case '*':
717a9d8d09cSJung-uk Kim 
718a88e22b7SJung-uk Kim                 State = DT_SLASH_ASTERISK_COMMENT;
719a88e22b7SJung-uk Kim                 break;
720a88e22b7SJung-uk Kim 
721a88e22b7SJung-uk Kim             case '/':
722a9d8d09cSJung-uk Kim 
723a88e22b7SJung-uk Kim                 State = DT_SLASH_SLASH_COMMENT;
724a88e22b7SJung-uk Kim                 break;
725a88e22b7SJung-uk Kim 
726a88e22b7SJung-uk Kim             default:    /* Not a comment */
727a9d8d09cSJung-uk Kim 
7288ef1a331SJung-uk Kim                 i++;    /* Save the preceding slash */
7296f1f1a63SJung-uk Kim                 if (i >= AslGbl_LineBufferSize)
730042ff955SJung-uk Kim                 {
731042ff955SJung-uk Kim                     UtExpandLineBuffers ();
732042ff955SJung-uk Kim                 }
733042ff955SJung-uk Kim 
7346f1f1a63SJung-uk Kim                 AslGbl_CurrentLineBuffer[i] = (char) c;
735a88e22b7SJung-uk Kim                 i++;
736a88e22b7SJung-uk Kim                 State = DT_NORMAL_TEXT;
737a88e22b7SJung-uk Kim                 break;
738a88e22b7SJung-uk Kim             }
739a88e22b7SJung-uk Kim             break;
740a88e22b7SJung-uk Kim 
741a88e22b7SJung-uk Kim         case DT_SLASH_ASTERISK_COMMENT:
742a88e22b7SJung-uk Kim 
743a88e22b7SJung-uk Kim             /* Ignore chars until an asterisk-slash is found */
744a88e22b7SJung-uk Kim 
745a88e22b7SJung-uk Kim             switch (c)
746a88e22b7SJung-uk Kim             {
747a88e22b7SJung-uk Kim             case '\n':
748a9d8d09cSJung-uk Kim 
7496f1f1a63SJung-uk Kim                 AslGbl_NextLineOffset = (UINT32) ftell (Handle);
7506f1f1a63SJung-uk Kim                 AslGbl_CurrentLineNumber++;
751a88e22b7SJung-uk Kim                 break;
752a88e22b7SJung-uk Kim 
753a88e22b7SJung-uk Kim             case '*':
754a9d8d09cSJung-uk Kim 
755a88e22b7SJung-uk Kim                 State = DT_END_COMMENT;
756a88e22b7SJung-uk Kim                 break;
757a88e22b7SJung-uk Kim 
758a88e22b7SJung-uk Kim             default:
759a9d8d09cSJung-uk Kim 
760a88e22b7SJung-uk Kim                 break;
761a88e22b7SJung-uk Kim             }
762a88e22b7SJung-uk Kim             break;
763a88e22b7SJung-uk Kim 
764a88e22b7SJung-uk Kim         case DT_SLASH_SLASH_COMMENT:
765a88e22b7SJung-uk Kim 
766a88e22b7SJung-uk Kim             /* Ignore chars until end-of-line */
767a88e22b7SJung-uk Kim 
768a88e22b7SJung-uk Kim             if (c == '\n')
769a88e22b7SJung-uk Kim             {
770a88e22b7SJung-uk Kim                 /* We will exit via the NORMAL_TEXT path */
771a88e22b7SJung-uk Kim 
772a88e22b7SJung-uk Kim                 ungetc (c, Handle);
773a88e22b7SJung-uk Kim                 State = DT_NORMAL_TEXT;
774a88e22b7SJung-uk Kim             }
775a88e22b7SJung-uk Kim             break;
776a88e22b7SJung-uk Kim 
777a88e22b7SJung-uk Kim         case DT_END_COMMENT:
778a88e22b7SJung-uk Kim 
779a88e22b7SJung-uk Kim             /* End comment if this char is a slash */
780a88e22b7SJung-uk Kim 
781a88e22b7SJung-uk Kim             switch (c)
782a88e22b7SJung-uk Kim             {
783a88e22b7SJung-uk Kim             case '/':
784a9d8d09cSJung-uk Kim 
785a88e22b7SJung-uk Kim                 State = DT_NORMAL_TEXT;
786a88e22b7SJung-uk Kim                 break;
787a88e22b7SJung-uk Kim 
7880b94ba42SJung-uk Kim             case '\n':
789a9d8d09cSJung-uk Kim 
7906f1f1a63SJung-uk Kim                 CurrentLineOffset = AslGbl_NextLineOffset;
7916f1f1a63SJung-uk Kim                 AslGbl_NextLineOffset = (UINT32) ftell (Handle);
7926f1f1a63SJung-uk Kim                 AslGbl_CurrentLineNumber++;
7930b94ba42SJung-uk Kim                 break;
7940b94ba42SJung-uk Kim 
7950b94ba42SJung-uk Kim             case '*':
796a9d8d09cSJung-uk Kim 
7970b94ba42SJung-uk Kim                 /* Consume all adjacent asterisks */
7980b94ba42SJung-uk Kim                 break;
7990b94ba42SJung-uk Kim 
800a88e22b7SJung-uk Kim             default:
801a9d8d09cSJung-uk Kim 
802a88e22b7SJung-uk Kim                 State = DT_SLASH_ASTERISK_COMMENT;
803a88e22b7SJung-uk Kim                 break;
804a88e22b7SJung-uk Kim             }
805a88e22b7SJung-uk Kim             break;
806a88e22b7SJung-uk Kim 
807d052a1ccSJung-uk Kim         case DT_MERGE_LINES:
808d052a1ccSJung-uk Kim 
809d052a1ccSJung-uk Kim             if (c != '\n')
810d052a1ccSJung-uk Kim             {
811d052a1ccSJung-uk Kim                 /*
812d052a1ccSJung-uk Kim                  * This is not a continuation backslash, it is a normal
813d052a1ccSJung-uk Kim                  * normal ASL backslash - for example: Scope(\_SB_)
814d052a1ccSJung-uk Kim                  */
815d052a1ccSJung-uk Kim                 i++; /* Keep the backslash that is already in the buffer */
816d052a1ccSJung-uk Kim 
817d052a1ccSJung-uk Kim                 ungetc (c, Handle);
818d052a1ccSJung-uk Kim                 State = DT_NORMAL_TEXT;
819d052a1ccSJung-uk Kim             }
820d052a1ccSJung-uk Kim             else
821d052a1ccSJung-uk Kim             {
822d052a1ccSJung-uk Kim                 /*
823d052a1ccSJung-uk Kim                  * This is a continuation line -- a backlash followed
824d052a1ccSJung-uk Kim                  * immediately by a newline. Insert a space between the
825d052a1ccSJung-uk Kim                  * lines (overwrite the backslash)
826d052a1ccSJung-uk Kim                  */
8276f1f1a63SJung-uk Kim                 AslGbl_CurrentLineBuffer[i] = ' ';
828d052a1ccSJung-uk Kim                 i++;
829d052a1ccSJung-uk Kim 
830d052a1ccSJung-uk Kim                 /* Ignore newline, this will merge the lines */
831d052a1ccSJung-uk Kim 
8326f1f1a63SJung-uk Kim                 CurrentLineOffset = AslGbl_NextLineOffset;
8336f1f1a63SJung-uk Kim                 AslGbl_NextLineOffset = (UINT32) ftell (Handle);
8346f1f1a63SJung-uk Kim                 AslGbl_CurrentLineNumber++;
835d052a1ccSJung-uk Kim                 State = DT_NORMAL_TEXT;
836d052a1ccSJung-uk Kim             }
837d052a1ccSJung-uk Kim             break;
838d052a1ccSJung-uk Kim 
839a88e22b7SJung-uk Kim         default:
840a9d8d09cSJung-uk Kim 
841a88e22b7SJung-uk Kim             DtFatal (ASL_MSG_COMPILER_INTERNAL, NULL, "Unknown input state");
842d052a1ccSJung-uk Kim             return (ASL_EOF);
843a88e22b7SJung-uk Kim         }
844a88e22b7SJung-uk Kim     }
845a88e22b7SJung-uk Kim }
846a88e22b7SJung-uk Kim 
847a88e22b7SJung-uk Kim 
848a88e22b7SJung-uk Kim /******************************************************************************
849a88e22b7SJung-uk Kim  *
850a88e22b7SJung-uk Kim  * FUNCTION:    DtScanFile
851a88e22b7SJung-uk Kim  *
852a88e22b7SJung-uk Kim  * PARAMETERS:  Handle              - Open file handle for the source file
853a88e22b7SJung-uk Kim  *
854a88e22b7SJung-uk Kim  * RETURN:      Pointer to start of the constructed parse tree.
855a88e22b7SJung-uk Kim  *
856a88e22b7SJung-uk Kim  * DESCRIPTION: Scan source file, link all field names and values
8576f1f1a63SJung-uk Kim  *              to the global parse tree: AslGbl_FieldList
858a88e22b7SJung-uk Kim  *
859a88e22b7SJung-uk Kim  *****************************************************************************/
860a88e22b7SJung-uk Kim 
861a88e22b7SJung-uk Kim DT_FIELD *
862a88e22b7SJung-uk Kim DtScanFile (
863a88e22b7SJung-uk Kim     FILE                    *Handle)
864a88e22b7SJung-uk Kim {
865d244b227SJung-uk Kim     ACPI_STATUS             Status;
866a88e22b7SJung-uk Kim     UINT32                  Offset;
867a88e22b7SJung-uk Kim 
868a88e22b7SJung-uk Kim 
869a88e22b7SJung-uk Kim     ACPI_FUNCTION_NAME (DtScanFile);
870a88e22b7SJung-uk Kim 
871a88e22b7SJung-uk Kim 
872a88e22b7SJung-uk Kim     /* Get the file size */
873a88e22b7SJung-uk Kim 
8746f1f1a63SJung-uk Kim     AslGbl_InputByteCount = CmGetFileSize (Handle);
8756f1f1a63SJung-uk Kim     if (AslGbl_InputByteCount == ACPI_UINT32_MAX)
876313a0c13SJung-uk Kim     {
877313a0c13SJung-uk Kim         AslAbort ();
878313a0c13SJung-uk Kim     }
879a88e22b7SJung-uk Kim 
8806f1f1a63SJung-uk Kim     AslGbl_CurrentLineNumber = 0;
8816f1f1a63SJung-uk Kim     AslGbl_CurrentLineOffset = 0;
8826f1f1a63SJung-uk Kim     AslGbl_NextLineOffset = 0;
883a88e22b7SJung-uk Kim 
884a88e22b7SJung-uk Kim     /* Scan line-by-line */
885a88e22b7SJung-uk Kim 
8865ef50723SJung-uk Kim     while ((Offset = DtGetNextLine (Handle, 0)) != ASL_EOF)
887a88e22b7SJung-uk Kim     {
888a88e22b7SJung-uk Kim         ACPI_DEBUG_PRINT ((ACPI_DB_PARSE, "Line %2.2u/%4.4X - %s",
8896f1f1a63SJung-uk Kim             AslGbl_CurrentLineNumber, Offset, AslGbl_CurrentLineBuffer));
890a88e22b7SJung-uk Kim 
8916f1f1a63SJung-uk Kim         Status = DtParseLine (AslGbl_CurrentLineBuffer,
8926f1f1a63SJung-uk Kim             AslGbl_CurrentLineNumber, Offset);
893d244b227SJung-uk Kim         if (Status == AE_NOT_FOUND)
894d244b227SJung-uk Kim         {
895d244b227SJung-uk Kim             break;
896d244b227SJung-uk Kim         }
897a88e22b7SJung-uk Kim     }
898a88e22b7SJung-uk Kim 
899d052a1ccSJung-uk Kim     /* Dump the parse tree if debug enabled */
900d052a1ccSJung-uk Kim 
9016f1f1a63SJung-uk Kim     DtDumpFieldList (AslGbl_FieldList);
9026f1f1a63SJung-uk Kim     return (AslGbl_FieldList);
903a88e22b7SJung-uk Kim }
904a88e22b7SJung-uk Kim 
905a88e22b7SJung-uk Kim 
906a88e22b7SJung-uk Kim /*
907a88e22b7SJung-uk Kim  * Output functions
908a88e22b7SJung-uk Kim  */
909a88e22b7SJung-uk Kim 
910a88e22b7SJung-uk Kim /******************************************************************************
911a88e22b7SJung-uk Kim  *
912a88e22b7SJung-uk Kim  * FUNCTION:    DtWriteBinary
913a88e22b7SJung-uk Kim  *
914a88e22b7SJung-uk Kim  * PARAMETERS:  DT_WALK_CALLBACK
915a88e22b7SJung-uk Kim  *
916a88e22b7SJung-uk Kim  * RETURN:      Status
917a88e22b7SJung-uk Kim  *
918a88e22b7SJung-uk Kim  * DESCRIPTION: Write one subtable of a binary ACPI table
919a88e22b7SJung-uk Kim  *
920a88e22b7SJung-uk Kim  *****************************************************************************/
921a88e22b7SJung-uk Kim 
922a88e22b7SJung-uk Kim static void
923a88e22b7SJung-uk Kim DtWriteBinary (
924a88e22b7SJung-uk Kim     DT_SUBTABLE             *Subtable,
925a88e22b7SJung-uk Kim     void                    *Context,
926a88e22b7SJung-uk Kim     void                    *ReturnValue)
927a88e22b7SJung-uk Kim {
928a88e22b7SJung-uk Kim 
929a88e22b7SJung-uk Kim     FlWriteFile (ASL_FILE_AML_OUTPUT, Subtable->Buffer, Subtable->Length);
930a88e22b7SJung-uk Kim }
931a88e22b7SJung-uk Kim 
932a88e22b7SJung-uk Kim 
933a88e22b7SJung-uk Kim /******************************************************************************
934a88e22b7SJung-uk Kim  *
935a88e22b7SJung-uk Kim  * FUNCTION:    DtOutputBinary
936a88e22b7SJung-uk Kim  *
937a88e22b7SJung-uk Kim  * PARAMETERS:
938a88e22b7SJung-uk Kim  *
939a88e22b7SJung-uk Kim  * RETURN:      Status
940a88e22b7SJung-uk Kim  *
941a88e22b7SJung-uk Kim  * DESCRIPTION: Write entire binary ACPI table (result of compilation)
942a88e22b7SJung-uk Kim  *
943a88e22b7SJung-uk Kim  *****************************************************************************/
944a88e22b7SJung-uk Kim 
945a88e22b7SJung-uk Kim void
946a88e22b7SJung-uk Kim DtOutputBinary (
947a88e22b7SJung-uk Kim     DT_SUBTABLE             *RootTable)
948a88e22b7SJung-uk Kim {
949a88e22b7SJung-uk Kim 
950a88e22b7SJung-uk Kim     if (!RootTable)
951a88e22b7SJung-uk Kim     {
952a88e22b7SJung-uk Kim         return;
953a88e22b7SJung-uk Kim     }
954a88e22b7SJung-uk Kim 
955a88e22b7SJung-uk Kim     /* Walk the entire parse tree, emitting the binary data */
956a88e22b7SJung-uk Kim 
957a88e22b7SJung-uk Kim     DtWalkTableTree (RootTable, DtWriteBinary, NULL, NULL);
958313a0c13SJung-uk Kim 
9596f1f1a63SJung-uk Kim     AslGbl_TableLength = CmGetFileSize (AslGbl_Files[ASL_FILE_AML_OUTPUT].Handle);
9606f1f1a63SJung-uk Kim     if (AslGbl_TableLength == ACPI_UINT32_MAX)
961313a0c13SJung-uk Kim     {
962313a0c13SJung-uk Kim         AslAbort ();
963313a0c13SJung-uk Kim     }
964a88e22b7SJung-uk Kim }
965d244b227SJung-uk Kim 
966d244b227SJung-uk Kim 
967d244b227SJung-uk Kim /*
968d244b227SJung-uk Kim  * Listing support
969d244b227SJung-uk Kim  */
970d244b227SJung-uk Kim 
971d244b227SJung-uk Kim /******************************************************************************
972d244b227SJung-uk Kim  *
973d244b227SJung-uk Kim  * FUNCTION:    DtDumpBuffer
974d244b227SJung-uk Kim  *
975d244b227SJung-uk Kim  * PARAMETERS:  FileID              - Where to write buffer data
976d244b227SJung-uk Kim  *              Buffer              - Buffer to dump
9770b94ba42SJung-uk Kim  *              Offset              - Offset in current table
978d244b227SJung-uk Kim  *              Length              - Buffer Length
979d244b227SJung-uk Kim  *
980d244b227SJung-uk Kim  * RETURN:      None
981d244b227SJung-uk Kim  *
982d244b227SJung-uk Kim  * DESCRIPTION: Another copy of DumpBuffer routine (unfortunately).
983d244b227SJung-uk Kim  *
984d244b227SJung-uk Kim  * TBD: merge dump buffer routines
985d244b227SJung-uk Kim  *
986d244b227SJung-uk Kim  *****************************************************************************/
987d244b227SJung-uk Kim 
988d244b227SJung-uk Kim static void
989d244b227SJung-uk Kim DtDumpBuffer (
990d244b227SJung-uk Kim     UINT32                  FileId,
991d244b227SJung-uk Kim     UINT8                   *Buffer,
9920b94ba42SJung-uk Kim     UINT32                  Offset,
993d244b227SJung-uk Kim     UINT32                  Length)
994d244b227SJung-uk Kim {
995d244b227SJung-uk Kim     UINT32                  i;
996d244b227SJung-uk Kim     UINT32                  j;
997d244b227SJung-uk Kim     UINT8                   BufChar;
998d244b227SJung-uk Kim 
999d244b227SJung-uk Kim 
10000b94ba42SJung-uk Kim     FlPrintFile (FileId, "Output: [%3.3Xh %4.4d %3d] ",
10010b94ba42SJung-uk Kim         Offset, Offset, Length);
10020b94ba42SJung-uk Kim 
1003d244b227SJung-uk Kim     i = 0;
1004d244b227SJung-uk Kim     while (i < Length)
1005d244b227SJung-uk Kim     {
10060b94ba42SJung-uk Kim         if (i >= 16)
10070b94ba42SJung-uk Kim         {
1008d052a1ccSJung-uk Kim             FlPrintFile (FileId, "%24s", "");
10090b94ba42SJung-uk Kim         }
1010d244b227SJung-uk Kim 
10110b94ba42SJung-uk Kim         /* Print 16 hex chars */
1012d244b227SJung-uk Kim 
1013d244b227SJung-uk Kim         for (j = 0; j < 16;)
1014d244b227SJung-uk Kim         {
1015d244b227SJung-uk Kim             if (i + j >= Length)
1016d244b227SJung-uk Kim             {
1017d244b227SJung-uk Kim                 /* Dump fill spaces */
1018d244b227SJung-uk Kim 
1019d244b227SJung-uk Kim                 FlPrintFile (FileId, "   ");
1020d244b227SJung-uk Kim                 j++;
1021d244b227SJung-uk Kim                 continue;
1022d244b227SJung-uk Kim             }
1023d244b227SJung-uk Kim 
1024d244b227SJung-uk Kim             FlPrintFile (FileId, "%02X ", Buffer[i+j]);
1025d244b227SJung-uk Kim             j++;
1026d244b227SJung-uk Kim         }
1027d244b227SJung-uk Kim 
1028d244b227SJung-uk Kim         FlPrintFile (FileId, " ");
1029d244b227SJung-uk Kim         for (j = 0; j < 16; j++)
1030d244b227SJung-uk Kim         {
1031d244b227SJung-uk Kim             if (i + j >= Length)
1032d244b227SJung-uk Kim             {
1033d244b227SJung-uk Kim                 FlPrintFile (FileId, "\n\n");
1034d244b227SJung-uk Kim                 return;
1035d244b227SJung-uk Kim             }
1036d244b227SJung-uk Kim 
1037d244b227SJung-uk Kim             BufChar = Buffer[(ACPI_SIZE) i + j];
10385ef50723SJung-uk Kim             if (isprint (BufChar))
1039d244b227SJung-uk Kim             {
1040d244b227SJung-uk Kim                 FlPrintFile (FileId, "%c", BufChar);
1041d244b227SJung-uk Kim             }
1042d244b227SJung-uk Kim             else
1043d244b227SJung-uk Kim             {
1044d244b227SJung-uk Kim                 FlPrintFile (FileId, ".");
1045d244b227SJung-uk Kim             }
1046d244b227SJung-uk Kim         }
1047d244b227SJung-uk Kim 
1048d244b227SJung-uk Kim         /* Done with that line. */
1049d244b227SJung-uk Kim 
1050d244b227SJung-uk Kim         FlPrintFile (FileId, "\n");
1051d244b227SJung-uk Kim         i += 16;
1052d244b227SJung-uk Kim     }
1053d244b227SJung-uk Kim 
1054d244b227SJung-uk Kim     FlPrintFile (FileId, "\n\n");
1055d244b227SJung-uk Kim }
1056d244b227SJung-uk Kim 
1057d244b227SJung-uk Kim 
1058d244b227SJung-uk Kim /******************************************************************************
1059d244b227SJung-uk Kim  *
1060efcc2a30SJung-uk Kim  * FUNCTION:    DtDumpFieldList
1061efcc2a30SJung-uk Kim  *
1062efcc2a30SJung-uk Kim  * PARAMETERS:  Field               - Root field
1063efcc2a30SJung-uk Kim  *
1064efcc2a30SJung-uk Kim  * RETURN:      None
1065efcc2a30SJung-uk Kim  *
1066efcc2a30SJung-uk Kim  * DESCRIPTION: Dump the entire field list
1067efcc2a30SJung-uk Kim  *
1068efcc2a30SJung-uk Kim  *****************************************************************************/
1069efcc2a30SJung-uk Kim 
1070efcc2a30SJung-uk Kim void
1071efcc2a30SJung-uk Kim DtDumpFieldList (
1072efcc2a30SJung-uk Kim     DT_FIELD                *Field)
1073efcc2a30SJung-uk Kim {
1074efcc2a30SJung-uk Kim 
10756f1f1a63SJung-uk Kim     if (!AslGbl_DebugFlag || !Field)
1076efcc2a30SJung-uk Kim     {
1077efcc2a30SJung-uk Kim         return;
1078efcc2a30SJung-uk Kim     }
1079efcc2a30SJung-uk Kim 
1080efcc2a30SJung-uk Kim     DbgPrint (ASL_DEBUG_OUTPUT,  "\nField List:\n"
1081efcc2a30SJung-uk Kim         "LineNo   ByteOff  NameCol  Column   TableOff "
1082efcc2a30SJung-uk Kim         "Flags %32s : %s\n\n", "Name", "Value");
1083f8146b88SJung-uk Kim 
1084efcc2a30SJung-uk Kim     while (Field)
1085efcc2a30SJung-uk Kim     {
1086efcc2a30SJung-uk Kim         DbgPrint (ASL_DEBUG_OUTPUT,
10877cf3e94aSJung-uk Kim             "%.08X %.08X %.08X %.08X %.08X %2.2X    %32s : %s\n",
1088efcc2a30SJung-uk Kim             Field->Line, Field->ByteOffset, Field->NameColumn,
1089efcc2a30SJung-uk Kim             Field->Column, Field->TableOffset, Field->Flags,
1090efcc2a30SJung-uk Kim             Field->Name, Field->Value);
1091efcc2a30SJung-uk Kim 
1092efcc2a30SJung-uk Kim         Field = Field->Next;
1093efcc2a30SJung-uk Kim     }
1094efcc2a30SJung-uk Kim 
1095efcc2a30SJung-uk Kim     DbgPrint (ASL_DEBUG_OUTPUT,  "\n\n");
1096efcc2a30SJung-uk Kim }
1097efcc2a30SJung-uk Kim 
1098efcc2a30SJung-uk Kim 
1099efcc2a30SJung-uk Kim /******************************************************************************
1100efcc2a30SJung-uk Kim  *
1101efcc2a30SJung-uk Kim  * FUNCTION:    DtDumpSubtableInfo, DtDumpSubtableTree
1102efcc2a30SJung-uk Kim  *
1103efcc2a30SJung-uk Kim  * PARAMETERS:  DT_WALK_CALLBACK
1104efcc2a30SJung-uk Kim  *
1105efcc2a30SJung-uk Kim  * RETURN:      None
1106efcc2a30SJung-uk Kim  *
1107efcc2a30SJung-uk Kim  * DESCRIPTION: Info - dump a subtable tree entry with extra information.
1108efcc2a30SJung-uk Kim  *              Tree - dump a subtable tree formatted by depth indentation.
1109efcc2a30SJung-uk Kim  *
1110efcc2a30SJung-uk Kim  *****************************************************************************/
1111efcc2a30SJung-uk Kim 
1112efcc2a30SJung-uk Kim static void
1113efcc2a30SJung-uk Kim DtDumpSubtableInfo (
1114efcc2a30SJung-uk Kim     DT_SUBTABLE             *Subtable,
1115efcc2a30SJung-uk Kim     void                    *Context,
1116efcc2a30SJung-uk Kim     void                    *ReturnValue)
1117efcc2a30SJung-uk Kim {
1118efcc2a30SJung-uk Kim 
1119efcc2a30SJung-uk Kim     DbgPrint (ASL_DEBUG_OUTPUT,
1120a371a5fdSJung-uk Kim         "[%.04X] %24s %.08X %.08X %.08X %.08X %.08X %p %p %p\n",
1121a371a5fdSJung-uk Kim         Subtable->Depth, Subtable->Name, Subtable->Length, Subtable->TotalLength,
1122efcc2a30SJung-uk Kim         Subtable->SizeOfLengthField, Subtable->Flags, Subtable,
1123efcc2a30SJung-uk Kim         Subtable->Parent, Subtable->Child, Subtable->Peer);
1124efcc2a30SJung-uk Kim }
1125efcc2a30SJung-uk Kim 
1126efcc2a30SJung-uk Kim static void
1127efcc2a30SJung-uk Kim DtDumpSubtableTree (
1128efcc2a30SJung-uk Kim     DT_SUBTABLE             *Subtable,
1129efcc2a30SJung-uk Kim     void                    *Context,
1130efcc2a30SJung-uk Kim     void                    *ReturnValue)
1131efcc2a30SJung-uk Kim {
1132efcc2a30SJung-uk Kim 
1133efcc2a30SJung-uk Kim     DbgPrint (ASL_DEBUG_OUTPUT,
1134a371a5fdSJung-uk Kim         "[%.04X] %24s %*s%08X (%.02X) - (%.02X)\n",
1135a371a5fdSJung-uk Kim         Subtable->Depth, Subtable->Name, (4 * Subtable->Depth), " ",
1136efcc2a30SJung-uk Kim         Subtable, Subtable->Length, Subtable->TotalLength);
1137efcc2a30SJung-uk Kim }
1138efcc2a30SJung-uk Kim 
1139efcc2a30SJung-uk Kim 
1140efcc2a30SJung-uk Kim /******************************************************************************
1141efcc2a30SJung-uk Kim  *
1142efcc2a30SJung-uk Kim  * FUNCTION:    DtDumpSubtableList
1143efcc2a30SJung-uk Kim  *
1144efcc2a30SJung-uk Kim  * PARAMETERS:  None
1145efcc2a30SJung-uk Kim  *
1146efcc2a30SJung-uk Kim  * RETURN:      None
1147efcc2a30SJung-uk Kim  *
1148efcc2a30SJung-uk Kim  * DESCRIPTION: Dump the raw list of subtables with information, and also
1149efcc2a30SJung-uk Kim  *              dump the subtable list in formatted tree format. Assists with
1150efcc2a30SJung-uk Kim  *              the development of new table code.
1151efcc2a30SJung-uk Kim  *
1152efcc2a30SJung-uk Kim  *****************************************************************************/
1153efcc2a30SJung-uk Kim 
1154efcc2a30SJung-uk Kim void
1155efcc2a30SJung-uk Kim DtDumpSubtableList (
1156efcc2a30SJung-uk Kim     void)
1157efcc2a30SJung-uk Kim {
1158efcc2a30SJung-uk Kim 
11596f1f1a63SJung-uk Kim     if (!AslGbl_DebugFlag || !AslGbl_RootTable)
1160efcc2a30SJung-uk Kim     {
1161efcc2a30SJung-uk Kim         return;
1162efcc2a30SJung-uk Kim     }
1163efcc2a30SJung-uk Kim 
1164efcc2a30SJung-uk Kim     DbgPrint (ASL_DEBUG_OUTPUT,
1165efcc2a30SJung-uk Kim         "Subtable Info:\n"
1166a371a5fdSJung-uk Kim         "Depth                      Name Length   TotalLen LenSize  Flags    "
1167efcc2a30SJung-uk Kim         "This     Parent   Child    Peer\n\n");
11686f1f1a63SJung-uk Kim     DtWalkTableTree (AslGbl_RootTable, DtDumpSubtableInfo, NULL, NULL);
1169efcc2a30SJung-uk Kim 
1170efcc2a30SJung-uk Kim     DbgPrint (ASL_DEBUG_OUTPUT,
1171a371a5fdSJung-uk Kim         "\nSubtable Tree: (Depth, Name, Subtable, Length, TotalLength)\n\n");
11726f1f1a63SJung-uk Kim     DtWalkTableTree (AslGbl_RootTable, DtDumpSubtableTree, NULL, NULL);
1173313a0c13SJung-uk Kim 
1174313a0c13SJung-uk Kim     DbgPrint (ASL_DEBUG_OUTPUT, "\n");
1175efcc2a30SJung-uk Kim }
1176efcc2a30SJung-uk Kim 
1177efcc2a30SJung-uk Kim 
1178efcc2a30SJung-uk Kim /******************************************************************************
1179efcc2a30SJung-uk Kim  *
1180d244b227SJung-uk Kim  * FUNCTION:    DtWriteFieldToListing
1181d244b227SJung-uk Kim  *
1182d244b227SJung-uk Kim  * PARAMETERS:  Buffer              - Contains the compiled data
1183d244b227SJung-uk Kim  *              Field               - Field node for the input line
1184d244b227SJung-uk Kim  *              Length              - Length of the output data
1185d244b227SJung-uk Kim  *
1186d244b227SJung-uk Kim  * RETURN:      None
1187d244b227SJung-uk Kim  *
1188d244b227SJung-uk Kim  * DESCRIPTION: Write one field to the listing file (if listing is enabled).
1189d244b227SJung-uk Kim  *
1190d244b227SJung-uk Kim  *****************************************************************************/
1191d244b227SJung-uk Kim 
1192d244b227SJung-uk Kim void
1193d244b227SJung-uk Kim DtWriteFieldToListing (
1194d244b227SJung-uk Kim     UINT8                   *Buffer,
1195d244b227SJung-uk Kim     DT_FIELD                *Field,
1196d244b227SJung-uk Kim     UINT32                  Length)
1197d244b227SJung-uk Kim {
1198d244b227SJung-uk Kim     UINT8                   FileByte;
1199d244b227SJung-uk Kim 
1200d244b227SJung-uk Kim 
12016f1f1a63SJung-uk Kim     if (!AslGbl_ListingFlag || !Field)
1202d244b227SJung-uk Kim     {
1203d244b227SJung-uk Kim         return;
1204d244b227SJung-uk Kim     }
1205d244b227SJung-uk Kim 
1206d244b227SJung-uk Kim     /* Dump the original source line */
1207d244b227SJung-uk Kim 
1208d244b227SJung-uk Kim     FlPrintFile (ASL_FILE_LISTING_OUTPUT, "Input:  ");
1209d244b227SJung-uk Kim     FlSeekFile (ASL_FILE_INPUT, Field->ByteOffset);
1210d244b227SJung-uk Kim 
1211d244b227SJung-uk Kim     while (FlReadFile (ASL_FILE_INPUT, &FileByte, 1) == AE_OK)
1212d244b227SJung-uk Kim     {
1213d244b227SJung-uk Kim         FlWriteFile (ASL_FILE_LISTING_OUTPUT, &FileByte, 1);
1214d244b227SJung-uk Kim         if (FileByte == '\n')
1215d244b227SJung-uk Kim         {
1216d244b227SJung-uk Kim             break;
1217d244b227SJung-uk Kim         }
1218d244b227SJung-uk Kim     }
1219d244b227SJung-uk Kim 
1220d244b227SJung-uk Kim     /* Dump the line as parsed and represented internally */
1221d244b227SJung-uk Kim 
1222d052a1ccSJung-uk Kim     FlPrintFile (ASL_FILE_LISTING_OUTPUT, "Parsed: %*s : %.64s",
1223d244b227SJung-uk Kim         Field->Column-4, Field->Name, Field->Value);
1224d244b227SJung-uk Kim 
1225d052a1ccSJung-uk Kim     if (strlen (Field->Value) > 64)
1226d052a1ccSJung-uk Kim     {
1227d052a1ccSJung-uk Kim         FlPrintFile (ASL_FILE_LISTING_OUTPUT, "...Additional data, length 0x%X\n",
1228d052a1ccSJung-uk Kim             strlen (Field->Value));
1229d052a1ccSJung-uk Kim     }
1230f8146b88SJung-uk Kim 
1231d052a1ccSJung-uk Kim     FlPrintFile (ASL_FILE_LISTING_OUTPUT, "\n");
1232d052a1ccSJung-uk Kim 
1233d244b227SJung-uk Kim     /* Dump the hex data that will be output for this field */
1234d244b227SJung-uk Kim 
12350b94ba42SJung-uk Kim     DtDumpBuffer (ASL_FILE_LISTING_OUTPUT, Buffer, Field->TableOffset, Length);
1236d244b227SJung-uk Kim }
1237d244b227SJung-uk Kim 
1238d244b227SJung-uk Kim 
1239d244b227SJung-uk Kim /******************************************************************************
1240d244b227SJung-uk Kim  *
1241d244b227SJung-uk Kim  * FUNCTION:    DtWriteTableToListing
1242d244b227SJung-uk Kim  *
1243d244b227SJung-uk Kim  * PARAMETERS:  None
1244d244b227SJung-uk Kim  *
1245d244b227SJung-uk Kim  * RETURN:      None
1246d244b227SJung-uk Kim  *
1247d244b227SJung-uk Kim  * DESCRIPTION: Write the entire compiled table to the listing file
1248d244b227SJung-uk Kim  *              in hex format
1249d244b227SJung-uk Kim  *
1250d244b227SJung-uk Kim  *****************************************************************************/
1251d244b227SJung-uk Kim 
1252d244b227SJung-uk Kim void
1253d244b227SJung-uk Kim DtWriteTableToListing (
1254d244b227SJung-uk Kim     void)
1255d244b227SJung-uk Kim {
1256d244b227SJung-uk Kim     UINT8                   *Buffer;
1257d244b227SJung-uk Kim 
1258d244b227SJung-uk Kim 
12596f1f1a63SJung-uk Kim     if (!AslGbl_ListingFlag)
1260d244b227SJung-uk Kim     {
1261d244b227SJung-uk Kim         return;
1262d244b227SJung-uk Kim     }
1263d244b227SJung-uk Kim 
1264d244b227SJung-uk Kim     /* Read the entire table from the output file */
1265d244b227SJung-uk Kim 
12666f1f1a63SJung-uk Kim     Buffer = UtLocalCalloc (AslGbl_TableLength);
1267d244b227SJung-uk Kim     FlSeekFile (ASL_FILE_AML_OUTPUT, 0);
12686f1f1a63SJung-uk Kim     FlReadFile (ASL_FILE_AML_OUTPUT, Buffer, AslGbl_TableLength);
1269d244b227SJung-uk Kim 
1270d244b227SJung-uk Kim     /* Dump the raw table data */
1271d244b227SJung-uk Kim 
12726f1f1a63SJung-uk Kim     AcpiOsRedirectOutput (AslGbl_Files[ASL_FILE_LISTING_OUTPUT].Handle);
1273d244b227SJung-uk Kim 
1274d244b227SJung-uk Kim     AcpiOsPrintf ("\n%s: Length %d (0x%X)\n\n",
12756f1f1a63SJung-uk Kim         ACPI_RAW_TABLE_DATA_HEADER, AslGbl_TableLength, AslGbl_TableLength);
12766f1f1a63SJung-uk Kim     AcpiUtDumpBuffer (Buffer, AslGbl_TableLength, DB_BYTE_DISPLAY, 0);
1277d244b227SJung-uk Kim 
1278d244b227SJung-uk Kim     AcpiOsRedirectOutput (stdout);
12798d744e47SJung-uk Kim     ACPI_FREE (Buffer);
1280d244b227SJung-uk Kim }
1281