xref: /freebsd/sys/contrib/dev/acpica/compiler/dtio.c (revision 58308fadece25ae4c12bd2f4dce3d73d9c23be43)
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  *
11*58308fadSJung-uk Kim  * Some or all of this work - Copyright (c) 1999 - 2025, 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 
165d244b227SJung-uk Kim static ACPI_STATUS
166a88e22b7SJung-uk Kim DtParseLine (
167a88e22b7SJung-uk Kim     char                    *LineBuffer,
168a88e22b7SJung-uk Kim     UINT32                  Line,
169a88e22b7SJung-uk Kim     UINT32                  Offset);
170a88e22b7SJung-uk Kim 
171a88e22b7SJung-uk Kim static void
172a88e22b7SJung-uk Kim DtWriteBinary (
173a88e22b7SJung-uk Kim     DT_SUBTABLE             *Subtable,
174a88e22b7SJung-uk Kim     void                    *Context,
175a88e22b7SJung-uk Kim     void                    *ReturnValue);
176a88e22b7SJung-uk Kim 
177d244b227SJung-uk Kim static void
178d244b227SJung-uk Kim DtDumpBuffer (
179d244b227SJung-uk Kim     UINT32                  FileId,
180d244b227SJung-uk Kim     UINT8                   *Buffer,
1810b94ba42SJung-uk Kim     UINT32                  Offset,
182d244b227SJung-uk Kim     UINT32                  Length);
183a88e22b7SJung-uk Kim 
184efcc2a30SJung-uk Kim static void
185efcc2a30SJung-uk Kim DtDumpSubtableInfo (
186efcc2a30SJung-uk Kim     DT_SUBTABLE             *Subtable,
187efcc2a30SJung-uk Kim     void                    *Context,
188efcc2a30SJung-uk Kim     void                    *ReturnValue);
189efcc2a30SJung-uk Kim 
190efcc2a30SJung-uk Kim static void
191efcc2a30SJung-uk Kim DtDumpSubtableTree (
192efcc2a30SJung-uk Kim     DT_SUBTABLE             *Subtable,
193efcc2a30SJung-uk Kim     void                    *Context,
194efcc2a30SJung-uk Kim     void                    *ReturnValue);
195efcc2a30SJung-uk Kim 
1960b94ba42SJung-uk Kim 
197a88e22b7SJung-uk Kim /* States for DtGetNextLine */
198a88e22b7SJung-uk Kim 
199a88e22b7SJung-uk Kim #define DT_NORMAL_TEXT              0
200a88e22b7SJung-uk Kim #define DT_START_QUOTED_STRING      1
201a88e22b7SJung-uk Kim #define DT_START_COMMENT            2
202a88e22b7SJung-uk Kim #define DT_SLASH_ASTERISK_COMMENT   3
203a88e22b7SJung-uk Kim #define DT_SLASH_SLASH_COMMENT      4
204a88e22b7SJung-uk Kim #define DT_END_COMMENT              5
205d052a1ccSJung-uk Kim #define DT_MERGE_LINES              6
206eef1b955SJung-uk Kim #define DT_ESCAPE_SEQUENCE          7
207a88e22b7SJung-uk Kim 
2086f1f1a63SJung-uk Kim static UINT32               AslGbl_NextLineOffset;
209a88e22b7SJung-uk Kim 
210a88e22b7SJung-uk Kim 
211a88e22b7SJung-uk Kim /******************************************************************************
212a88e22b7SJung-uk Kim  *
213a88e22b7SJung-uk Kim  * FUNCTION:    DtTrim
214a88e22b7SJung-uk Kim  *
215a88e22b7SJung-uk Kim  * PARAMETERS:  String              - Current source code line to trim
216a88e22b7SJung-uk Kim  *
217a88e22b7SJung-uk Kim  * RETURN:      Trimmed line. Must be freed by caller.
218a88e22b7SJung-uk Kim  *
219a88e22b7SJung-uk Kim  * DESCRIPTION: Trim left and right spaces
220a88e22b7SJung-uk Kim  *
221a88e22b7SJung-uk Kim  *****************************************************************************/
222a88e22b7SJung-uk Kim 
223a88e22b7SJung-uk Kim static char *
DtTrim(char * String)224a88e22b7SJung-uk Kim DtTrim (
225a88e22b7SJung-uk Kim     char                    *String)
226a88e22b7SJung-uk Kim {
227a88e22b7SJung-uk Kim     char                    *Start;
228a88e22b7SJung-uk Kim     char                    *End;
229a88e22b7SJung-uk Kim     char                    *ReturnString;
230a88e22b7SJung-uk Kim     ACPI_SIZE               Length;
231a88e22b7SJung-uk Kim 
232a88e22b7SJung-uk Kim 
233a88e22b7SJung-uk Kim     /* Skip lines that start with a space */
234a88e22b7SJung-uk Kim 
2354a38ee6dSJung-uk Kim     if (*String == 0 || !strcmp (String, " "))
236a88e22b7SJung-uk Kim     {
23767d9aa44SJung-uk Kim         ReturnString = UtLocalCacheCalloc (1);
238a88e22b7SJung-uk Kim         return (ReturnString);
239a88e22b7SJung-uk Kim     }
240a88e22b7SJung-uk Kim 
241a88e22b7SJung-uk Kim     /* Setup pointers to start and end of input string */
242a88e22b7SJung-uk Kim 
243a88e22b7SJung-uk Kim     Start = String;
2445ef50723SJung-uk Kim     End = String + strlen (String) - 1;
245a88e22b7SJung-uk Kim 
246a88e22b7SJung-uk Kim     /* Find first non-whitespace character */
247a88e22b7SJung-uk Kim 
248a88e22b7SJung-uk Kim     while ((Start <= End) && ((*Start == ' ') || (*Start == '\t')))
249a88e22b7SJung-uk Kim     {
250a88e22b7SJung-uk Kim         Start++;
251a88e22b7SJung-uk Kim     }
252a88e22b7SJung-uk Kim 
253a88e22b7SJung-uk Kim     /* Find last non-space character */
254a88e22b7SJung-uk Kim 
255a88e22b7SJung-uk Kim     while (End >= Start)
256a88e22b7SJung-uk Kim     {
2574a38ee6dSJung-uk Kim         if (*End == '\n')
258a88e22b7SJung-uk Kim         {
259a88e22b7SJung-uk Kim             End--;
260a88e22b7SJung-uk Kim             continue;
261a88e22b7SJung-uk Kim         }
262a88e22b7SJung-uk Kim 
263a88e22b7SJung-uk Kim         if (*End != ' ')
264a88e22b7SJung-uk Kim         {
265a88e22b7SJung-uk Kim             break;
266a88e22b7SJung-uk Kim         }
267a88e22b7SJung-uk Kim 
268a88e22b7SJung-uk Kim         End--;
269a88e22b7SJung-uk Kim     }
270a88e22b7SJung-uk Kim 
271a88e22b7SJung-uk Kim     /* Remove any quotes around the string */
272a88e22b7SJung-uk Kim 
273a88e22b7SJung-uk Kim     if (*Start == '\"')
274a88e22b7SJung-uk Kim     {
275a88e22b7SJung-uk Kim         Start++;
276a88e22b7SJung-uk Kim     }
277a88e22b7SJung-uk Kim     if (*End == '\"')
278a88e22b7SJung-uk Kim     {
279a88e22b7SJung-uk Kim         End--;
280a88e22b7SJung-uk Kim     }
281a88e22b7SJung-uk Kim 
282a88e22b7SJung-uk Kim     /* Create the trimmed return string */
283a88e22b7SJung-uk Kim 
284a88e22b7SJung-uk Kim     Length = ACPI_PTR_DIFF (End, Start) + 1;
28567d9aa44SJung-uk Kim     ReturnString = UtLocalCacheCalloc (Length + 1);
2865ef50723SJung-uk Kim     if (strlen (Start))
287a88e22b7SJung-uk Kim     {
288*58308fadSJung-uk Kim         memcpy (ReturnString, Start, Length);
289a88e22b7SJung-uk Kim     }
290a88e22b7SJung-uk Kim 
291a88e22b7SJung-uk Kim     ReturnString[Length] = 0;
292a88e22b7SJung-uk Kim     return (ReturnString);
293a88e22b7SJung-uk Kim }
294a88e22b7SJung-uk Kim 
295a88e22b7SJung-uk Kim 
296a88e22b7SJung-uk Kim /******************************************************************************
297a88e22b7SJung-uk Kim  *
298a88e22b7SJung-uk Kim  * FUNCTION:    DtParseLine
299a88e22b7SJung-uk Kim  *
300a88e22b7SJung-uk Kim  * PARAMETERS:  LineBuffer          - Current source code line
301a88e22b7SJung-uk Kim  *              Line                - Current line number in the source
302a88e22b7SJung-uk Kim  *              Offset              - Current byte offset of the line
303a88e22b7SJung-uk Kim  *
304d244b227SJung-uk Kim  * RETURN:      Status
305a88e22b7SJung-uk Kim  *
306a88e22b7SJung-uk Kim  * DESCRIPTION: Parse one source line
307a88e22b7SJung-uk Kim  *
308a88e22b7SJung-uk Kim  *****************************************************************************/
309a88e22b7SJung-uk Kim 
310d244b227SJung-uk Kim static ACPI_STATUS
DtParseLine(char * LineBuffer,UINT32 Line,UINT32 Offset)311a88e22b7SJung-uk Kim DtParseLine (
312a88e22b7SJung-uk Kim     char                    *LineBuffer,
313a88e22b7SJung-uk Kim     UINT32                  Line,
314a88e22b7SJung-uk Kim     UINT32                  Offset)
315a88e22b7SJung-uk Kim {
316a88e22b7SJung-uk Kim     char                    *Start;
317a88e22b7SJung-uk Kim     char                    *End;
318a88e22b7SJung-uk Kim     char                    *TmpName;
319a88e22b7SJung-uk Kim     char                    *TmpValue;
320a88e22b7SJung-uk Kim     char                    *Name;
321a88e22b7SJung-uk Kim     char                    *Value;
322a88e22b7SJung-uk Kim     char                    *Colon;
323a88e22b7SJung-uk Kim     UINT32                  Length;
324a88e22b7SJung-uk Kim     DT_FIELD                *Field;
325a88e22b7SJung-uk Kim     UINT32                  Column;
326a88e22b7SJung-uk Kim     UINT32                  NameColumn;
327d052a1ccSJung-uk Kim     BOOLEAN                 IsNullString = FALSE;
328a88e22b7SJung-uk Kim 
329a88e22b7SJung-uk Kim 
330a88e22b7SJung-uk Kim     if (!LineBuffer)
331a88e22b7SJung-uk Kim     {
332d244b227SJung-uk Kim         return (AE_OK);
333d244b227SJung-uk Kim     }
334d244b227SJung-uk Kim 
335cd6518c7SJung-uk Kim     /* All lines after "Raw Table Data" are ignored */
336d244b227SJung-uk Kim 
337d244b227SJung-uk Kim     if (strstr (LineBuffer, ACPI_RAW_TABLE_DATA_HEADER))
338d244b227SJung-uk Kim     {
339d244b227SJung-uk Kim         return (AE_NOT_FOUND);
340a88e22b7SJung-uk Kim     }
341a88e22b7SJung-uk Kim 
342a88e22b7SJung-uk Kim     Colon = strchr (LineBuffer, ':');
343d244b227SJung-uk Kim     if (!Colon)
344a88e22b7SJung-uk Kim     {
345d244b227SJung-uk Kim         return (AE_OK);
346a88e22b7SJung-uk Kim     }
347a88e22b7SJung-uk Kim 
348a88e22b7SJung-uk Kim     Start = LineBuffer;
349a88e22b7SJung-uk Kim     End = Colon;
350a88e22b7SJung-uk Kim 
351a88e22b7SJung-uk Kim     while (Start < Colon)
352a88e22b7SJung-uk Kim     {
353a88e22b7SJung-uk Kim         if (*Start == '[')
354a88e22b7SJung-uk Kim         {
3558d744e47SJung-uk Kim             /* Found left bracket, go to the right bracket */
3568d744e47SJung-uk Kim 
357a88e22b7SJung-uk Kim             while (Start < Colon && *Start != ']')
358a88e22b7SJung-uk Kim             {
359a88e22b7SJung-uk Kim                 Start++;
360a88e22b7SJung-uk Kim             }
3618d744e47SJung-uk Kim         }
3628d744e47SJung-uk Kim         else if (*Start != ' ')
363a88e22b7SJung-uk Kim         {
364a88e22b7SJung-uk Kim             break;
365a88e22b7SJung-uk Kim         }
366a88e22b7SJung-uk Kim 
367a88e22b7SJung-uk Kim         Start++;
368a88e22b7SJung-uk Kim     }
369a88e22b7SJung-uk Kim 
370a88e22b7SJung-uk Kim     /*
371a88e22b7SJung-uk Kim      * There are two column values. One for the field name,
372a88e22b7SJung-uk Kim      * and one for the field value.
373a88e22b7SJung-uk Kim      */
374a88e22b7SJung-uk Kim     Column = ACPI_PTR_DIFF (Colon, LineBuffer) + 3;
375a88e22b7SJung-uk Kim     NameColumn = ACPI_PTR_DIFF (Start, LineBuffer) + 1;
376a88e22b7SJung-uk Kim 
377a88e22b7SJung-uk Kim     Length = ACPI_PTR_DIFF (End, Start);
378a88e22b7SJung-uk Kim 
379a88e22b7SJung-uk Kim     TmpName = UtLocalCalloc (Length + 1);
380*58308fadSJung-uk Kim     memcpy (TmpName, Start, Length);
381a88e22b7SJung-uk Kim     Name = DtTrim (TmpName);
382a88e22b7SJung-uk Kim     ACPI_FREE (TmpName);
383a88e22b7SJung-uk Kim 
384a88e22b7SJung-uk Kim     Start = End = (Colon + 1);
385a88e22b7SJung-uk Kim     while (*End)
386a88e22b7SJung-uk Kim     {
387a88e22b7SJung-uk Kim         /* Found left quotation, go to the right quotation and break */
388a88e22b7SJung-uk Kim 
389a88e22b7SJung-uk Kim         if (*End == '"')
390a88e22b7SJung-uk Kim         {
391a88e22b7SJung-uk Kim             End++;
392d052a1ccSJung-uk Kim 
393d052a1ccSJung-uk Kim             /* Check for an explicit null string */
394d052a1ccSJung-uk Kim 
395d052a1ccSJung-uk Kim             if (*End == '"')
396d052a1ccSJung-uk Kim             {
397d052a1ccSJung-uk Kim                 IsNullString = TRUE;
398d052a1ccSJung-uk Kim             }
3990b94ba42SJung-uk Kim             while (*End && (*End != '"'))
400a88e22b7SJung-uk Kim             {
401a88e22b7SJung-uk Kim                 End++;
402a88e22b7SJung-uk Kim             }
403a88e22b7SJung-uk Kim 
404a88e22b7SJung-uk Kim             End++;
405a88e22b7SJung-uk Kim             break;
406a88e22b7SJung-uk Kim         }
407a88e22b7SJung-uk Kim 
4080b94ba42SJung-uk Kim         /*
4090b94ba42SJung-uk Kim          * Special "comment" fields at line end, ignore them.
4100b94ba42SJung-uk Kim          * Note: normal slash-slash and slash-asterisk comments are
4110b94ba42SJung-uk Kim          * stripped already by the DtGetNextLine parser.
4120b94ba42SJung-uk Kim          *
4130b94ba42SJung-uk Kim          * TBD: Perhaps DtGetNextLine should parse the following type
4140b94ba42SJung-uk Kim          * of comments also.
4150b94ba42SJung-uk Kim          */
416d052a1ccSJung-uk Kim         if (*End == '[')
417a88e22b7SJung-uk Kim         {
418d052a1ccSJung-uk Kim             End--;
419a88e22b7SJung-uk Kim             break;
420a88e22b7SJung-uk Kim         }
421f8146b88SJung-uk Kim 
422a88e22b7SJung-uk Kim         End++;
423a88e22b7SJung-uk Kim     }
424a88e22b7SJung-uk Kim 
425a88e22b7SJung-uk Kim     Length = ACPI_PTR_DIFF (End, Start);
426a88e22b7SJung-uk Kim     TmpValue = UtLocalCalloc (Length + 1);
427dcbce41eSJung-uk Kim 
428*58308fadSJung-uk Kim     memcpy (TmpValue, Start, Length);
429a88e22b7SJung-uk Kim     Value = DtTrim (TmpValue);
430a88e22b7SJung-uk Kim     ACPI_FREE (TmpValue);
431a88e22b7SJung-uk Kim 
432d052a1ccSJung-uk Kim     /* Create a new field object only if we have a valid value field */
433d052a1ccSJung-uk Kim 
434d052a1ccSJung-uk Kim     if ((Value && *Value) || IsNullString)
435a88e22b7SJung-uk Kim     {
436313a0c13SJung-uk Kim         Field = UtFieldCacheCalloc ();
437a88e22b7SJung-uk Kim         Field->Name = Name;
438a88e22b7SJung-uk Kim         Field->Value = Value;
439a88e22b7SJung-uk Kim         Field->Line = Line;
440a88e22b7SJung-uk Kim         Field->ByteOffset = Offset;
441a88e22b7SJung-uk Kim         Field->NameColumn = NameColumn;
442a88e22b7SJung-uk Kim         Field->Column = Column;
4437cf3e94aSJung-uk Kim         Field->StringLength = Length;
444a88e22b7SJung-uk Kim 
445a88e22b7SJung-uk Kim         DtLinkField (Field);
446a88e22b7SJung-uk Kim     }
447313a0c13SJung-uk Kim     /* Else -- Ignore this field, it has no valid data */
448d244b227SJung-uk Kim 
449d244b227SJung-uk Kim     return (AE_OK);
450a88e22b7SJung-uk Kim }
451a88e22b7SJung-uk Kim 
452a88e22b7SJung-uk Kim 
453a88e22b7SJung-uk Kim /******************************************************************************
454a88e22b7SJung-uk Kim  *
455a88e22b7SJung-uk Kim  * FUNCTION:    DtGetNextLine
456a88e22b7SJung-uk Kim  *
457a88e22b7SJung-uk Kim  * PARAMETERS:  Handle              - Open file handle for the source file
458a88e22b7SJung-uk Kim  *
459d052a1ccSJung-uk Kim  * RETURN:      Filled line buffer and offset of start-of-line (ASL_EOF on EOF)
460a88e22b7SJung-uk Kim  *
461a88e22b7SJung-uk Kim  * DESCRIPTION: Get the next valid source line. Removes all comments.
462a88e22b7SJung-uk Kim  *              Ignores empty lines.
463a88e22b7SJung-uk Kim  *
464a88e22b7SJung-uk Kim  * Handles both slash-asterisk and slash-slash comments.
465a88e22b7SJung-uk Kim  * Also, quoted strings, but no escapes within.
466a88e22b7SJung-uk Kim  *
4676f1f1a63SJung-uk Kim  * Line is returned in AslGbl_CurrentLineBuffer.
4686f1f1a63SJung-uk Kim  * Line number in original file is returned in AslGbl_CurrentLineNumber.
469a88e22b7SJung-uk Kim  *
470a88e22b7SJung-uk Kim  *****************************************************************************/
471a88e22b7SJung-uk Kim 
4720b94ba42SJung-uk Kim UINT32
DtGetNextLine(FILE * Handle,UINT32 Flags)473a88e22b7SJung-uk Kim DtGetNextLine (
4745ef50723SJung-uk Kim     FILE                    *Handle,
4755ef50723SJung-uk Kim     UINT32                  Flags)
476a88e22b7SJung-uk Kim {
477d052a1ccSJung-uk Kim     BOOLEAN                 LineNotAllBlanks = FALSE;
478a88e22b7SJung-uk Kim     UINT32                  State = DT_NORMAL_TEXT;
479a88e22b7SJung-uk Kim     UINT32                  CurrentLineOffset;
480a88e22b7SJung-uk Kim     UINT32                  i;
481a9d8d09cSJung-uk Kim     int                     c;
4824a38ee6dSJung-uk Kim     int                     c1;
483a88e22b7SJung-uk Kim 
484a88e22b7SJung-uk Kim 
4856f1f1a63SJung-uk Kim     memset (AslGbl_CurrentLineBuffer, 0, AslGbl_LineBufferSize);
486042ff955SJung-uk Kim     for (i = 0; ;)
487a88e22b7SJung-uk Kim     {
488042ff955SJung-uk Kim         /*
489042ff955SJung-uk Kim          * If line is too long, expand the line buffers. Also increases
4906f1f1a63SJung-uk Kim          * AslGbl_LineBufferSize.
491042ff955SJung-uk Kim          */
4926f1f1a63SJung-uk Kim         if (i >= AslGbl_LineBufferSize)
493042ff955SJung-uk Kim         {
494042ff955SJung-uk Kim             UtExpandLineBuffers ();
495042ff955SJung-uk Kim         }
496042ff955SJung-uk Kim 
497a9d8d09cSJung-uk Kim         c = getc (Handle);
498a88e22b7SJung-uk Kim         if (c == EOF)
499a88e22b7SJung-uk Kim         {
5000b94ba42SJung-uk Kim             switch (State)
5010b94ba42SJung-uk Kim             {
5020b94ba42SJung-uk Kim             case DT_START_QUOTED_STRING:
5030b94ba42SJung-uk Kim             case DT_SLASH_ASTERISK_COMMENT:
5040b94ba42SJung-uk Kim 
5050b94ba42SJung-uk Kim                 AcpiOsPrintf ("**** EOF within comment/string %u\n", State);
5060b94ba42SJung-uk Kim                 break;
5070b94ba42SJung-uk Kim 
5080b94ba42SJung-uk Kim             default:
509a9d8d09cSJung-uk Kim 
5100b94ba42SJung-uk Kim                 break;
5110b94ba42SJung-uk Kim             }
5120b94ba42SJung-uk Kim 
513a7a3b383SJung-uk Kim             /* Standalone EOF is OK */
514a7a3b383SJung-uk Kim 
515a7a3b383SJung-uk Kim             if (i == 0)
516a7a3b383SJung-uk Kim             {
517d052a1ccSJung-uk Kim                 return (ASL_EOF);
518a88e22b7SJung-uk Kim             }
519a88e22b7SJung-uk Kim 
520a7a3b383SJung-uk Kim             /*
521a7a3b383SJung-uk Kim              * Received an EOF in the middle of a line. Terminate the
522a7a3b383SJung-uk Kim              * line with a newline. The next call to this function will
523a7a3b383SJung-uk Kim              * return a standalone EOF. Thus, the upper parsing software
524a7a3b383SJung-uk Kim              * never has to deal with an EOF within a valid line (or
525a7a3b383SJung-uk Kim              * the last line does not get tossed on the floor.)
526a7a3b383SJung-uk Kim              */
527a7a3b383SJung-uk Kim             c = '\n';
528a7a3b383SJung-uk Kim             State = DT_NORMAL_TEXT;
529a7a3b383SJung-uk Kim         }
5304a38ee6dSJung-uk Kim         else if (c == '\r')
5314a38ee6dSJung-uk Kim         {
5324a38ee6dSJung-uk Kim             c1 = getc (Handle);
5334a38ee6dSJung-uk Kim             if (c1 == '\n')
5344a38ee6dSJung-uk Kim             {
5354a38ee6dSJung-uk Kim                 /*
5364a38ee6dSJung-uk Kim                  * Skip the carriage return as if it didn't exist. This is
5374a38ee6dSJung-uk Kim                  * onlt meant for input files in DOS format in unix. fopen in
5384a38ee6dSJung-uk Kim                  * unix may not support "text mode" and leaves CRLF intact.
5394a38ee6dSJung-uk Kim                  */
5404a38ee6dSJung-uk Kim                 c = '\n';
5414a38ee6dSJung-uk Kim             }
5424a38ee6dSJung-uk Kim             else
5434a38ee6dSJung-uk Kim             {
5444a38ee6dSJung-uk Kim                 /* This was not a CRLF. Only a CR */
5454a38ee6dSJung-uk Kim 
5464a38ee6dSJung-uk Kim                 ungetc(c1, Handle);
5474a38ee6dSJung-uk Kim 
5484a38ee6dSJung-uk Kim                 DtFatal (ASL_MSG_COMPILER_INTERNAL, NULL,
5494a38ee6dSJung-uk Kim                     "Carriage return without linefeed detected");
5504a38ee6dSJung-uk Kim                 return (ASL_EOF);
5514a38ee6dSJung-uk Kim             }
5524a38ee6dSJung-uk Kim         }
553a7a3b383SJung-uk Kim 
554a88e22b7SJung-uk Kim         switch (State)
555a88e22b7SJung-uk Kim         {
556a88e22b7SJung-uk Kim         case DT_NORMAL_TEXT:
557a88e22b7SJung-uk Kim 
558a88e22b7SJung-uk Kim             /* Normal text, insert char into line buffer */
559a88e22b7SJung-uk Kim 
5606f1f1a63SJung-uk Kim             AslGbl_CurrentLineBuffer[i] = (char) c;
561a88e22b7SJung-uk Kim             switch (c)
562a88e22b7SJung-uk Kim             {
563a88e22b7SJung-uk Kim             case '/':
564a9d8d09cSJung-uk Kim 
565a88e22b7SJung-uk Kim                 State = DT_START_COMMENT;
566a88e22b7SJung-uk Kim                 break;
567a88e22b7SJung-uk Kim 
568a88e22b7SJung-uk Kim             case '"':
569a9d8d09cSJung-uk Kim 
570a88e22b7SJung-uk Kim                 State = DT_START_QUOTED_STRING;
571d052a1ccSJung-uk Kim                 LineNotAllBlanks = TRUE;
572a88e22b7SJung-uk Kim                 i++;
573a88e22b7SJung-uk Kim                 break;
574a88e22b7SJung-uk Kim 
575d052a1ccSJung-uk Kim             case '\\':
576d052a1ccSJung-uk Kim                 /*
577d052a1ccSJung-uk Kim                  * The continuation char MUST be last char on this line.
578d052a1ccSJung-uk Kim                  * Otherwise, it will be assumed to be a valid ASL char.
579d052a1ccSJung-uk Kim                  */
580d052a1ccSJung-uk Kim                 State = DT_MERGE_LINES;
581d052a1ccSJung-uk Kim                 break;
582d052a1ccSJung-uk Kim 
583a88e22b7SJung-uk Kim             case '\n':
584a9d8d09cSJung-uk Kim 
5856f1f1a63SJung-uk Kim                 CurrentLineOffset = AslGbl_NextLineOffset;
5866f1f1a63SJung-uk Kim                 AslGbl_NextLineOffset = (UINT32) ftell (Handle);
5876f1f1a63SJung-uk Kim                 AslGbl_CurrentLineNumber++;
588a88e22b7SJung-uk Kim 
589d052a1ccSJung-uk Kim                 /*
590d052a1ccSJung-uk Kim                  * Exit if line is complete. Ignore empty lines (only \n)
591d052a1ccSJung-uk Kim                  * or lines that contain nothing but blanks.
592d052a1ccSJung-uk Kim                  */
593d052a1ccSJung-uk Kim                 if ((i != 0) && LineNotAllBlanks)
594a88e22b7SJung-uk Kim                 {
5956f1f1a63SJung-uk Kim                     if ((i + 1) >= AslGbl_LineBufferSize)
596042ff955SJung-uk Kim                     {
597042ff955SJung-uk Kim                         UtExpandLineBuffers ();
598042ff955SJung-uk Kim                     }
599042ff955SJung-uk Kim 
6006f1f1a63SJung-uk Kim                     AslGbl_CurrentLineBuffer[i+1] = 0; /* Terminate string */
601a88e22b7SJung-uk Kim                     return (CurrentLineOffset);
602a88e22b7SJung-uk Kim                 }
603d052a1ccSJung-uk Kim 
604d052a1ccSJung-uk Kim                 /* Toss this line and start a new one */
605d052a1ccSJung-uk Kim 
606d052a1ccSJung-uk Kim                 i = 0;
607d052a1ccSJung-uk Kim                 LineNotAllBlanks = FALSE;
608a88e22b7SJung-uk Kim                 break;
609a88e22b7SJung-uk Kim 
610a88e22b7SJung-uk Kim             default:
611a9d8d09cSJung-uk Kim 
612d052a1ccSJung-uk Kim                 if (c != ' ')
613d052a1ccSJung-uk Kim                 {
614d052a1ccSJung-uk Kim                     LineNotAllBlanks = TRUE;
615d052a1ccSJung-uk Kim                 }
616d052a1ccSJung-uk Kim 
617a88e22b7SJung-uk Kim                 i++;
618a88e22b7SJung-uk Kim                 break;
619a88e22b7SJung-uk Kim             }
620a88e22b7SJung-uk Kim             break;
621a88e22b7SJung-uk Kim 
622a88e22b7SJung-uk Kim         case DT_START_QUOTED_STRING:
623a88e22b7SJung-uk Kim 
624a88e22b7SJung-uk Kim             /* Insert raw chars until end of quoted string */
625a88e22b7SJung-uk Kim 
6266f1f1a63SJung-uk Kim             AslGbl_CurrentLineBuffer[i] = (char) c;
627a88e22b7SJung-uk Kim             i++;
628a88e22b7SJung-uk Kim 
629eef1b955SJung-uk Kim             switch (c)
630a88e22b7SJung-uk Kim             {
631eef1b955SJung-uk Kim             case '"':
632a9d8d09cSJung-uk Kim 
633a88e22b7SJung-uk Kim                 State = DT_NORMAL_TEXT;
634eef1b955SJung-uk Kim                 break;
635eef1b955SJung-uk Kim 
636eef1b955SJung-uk Kim             case '\\':
637a9d8d09cSJung-uk Kim 
638eef1b955SJung-uk Kim                 State = DT_ESCAPE_SEQUENCE;
639eef1b955SJung-uk Kim                 break;
640eef1b955SJung-uk Kim 
641eef1b955SJung-uk Kim             case '\n':
642a9d8d09cSJung-uk Kim 
6435ef50723SJung-uk Kim                 if (!(Flags & DT_ALLOW_MULTILINE_QUOTES))
6445ef50723SJung-uk Kim                 {
645f8146b88SJung-uk Kim                     AcpiOsPrintf (
646f8146b88SJung-uk Kim                         "ERROR at line %u: Unterminated quoted string\n",
6476f1f1a63SJung-uk Kim                         AslGbl_CurrentLineNumber++);
648eef1b955SJung-uk Kim                     State = DT_NORMAL_TEXT;
6495ef50723SJung-uk Kim                 }
650eef1b955SJung-uk Kim                 break;
651eef1b955SJung-uk Kim 
652eef1b955SJung-uk Kim             default:    /* Get next character */
653a9d8d09cSJung-uk Kim 
654eef1b955SJung-uk Kim                 break;
655a88e22b7SJung-uk Kim             }
656a88e22b7SJung-uk Kim             break;
657a88e22b7SJung-uk Kim 
658eef1b955SJung-uk Kim         case DT_ESCAPE_SEQUENCE:
659eef1b955SJung-uk Kim 
660eef1b955SJung-uk Kim             /* Just copy the escaped character. TBD: sufficient for table compiler? */
661eef1b955SJung-uk Kim 
6626f1f1a63SJung-uk Kim             AslGbl_CurrentLineBuffer[i] = (char) c;
663eef1b955SJung-uk Kim             i++;
664eef1b955SJung-uk Kim             State = DT_START_QUOTED_STRING;
665eef1b955SJung-uk Kim             break;
666eef1b955SJung-uk Kim 
667a88e22b7SJung-uk Kim         case DT_START_COMMENT:
668a88e22b7SJung-uk Kim 
669a88e22b7SJung-uk Kim             /* Open comment if this character is an asterisk or slash */
670a88e22b7SJung-uk Kim 
671a88e22b7SJung-uk Kim             switch (c)
672a88e22b7SJung-uk Kim             {
673a88e22b7SJung-uk Kim             case '*':
674a9d8d09cSJung-uk Kim 
675a88e22b7SJung-uk Kim                 State = DT_SLASH_ASTERISK_COMMENT;
676a88e22b7SJung-uk Kim                 break;
677a88e22b7SJung-uk Kim 
678a88e22b7SJung-uk Kim             case '/':
679a9d8d09cSJung-uk Kim 
680a88e22b7SJung-uk Kim                 State = DT_SLASH_SLASH_COMMENT;
681a88e22b7SJung-uk Kim                 break;
682a88e22b7SJung-uk Kim 
683a88e22b7SJung-uk Kim             default:    /* Not a comment */
684a9d8d09cSJung-uk Kim 
6858ef1a331SJung-uk Kim                 i++;    /* Save the preceding slash */
6866f1f1a63SJung-uk Kim                 if (i >= AslGbl_LineBufferSize)
687042ff955SJung-uk Kim                 {
688042ff955SJung-uk Kim                     UtExpandLineBuffers ();
689042ff955SJung-uk Kim                 }
690042ff955SJung-uk Kim 
6916f1f1a63SJung-uk Kim                 AslGbl_CurrentLineBuffer[i] = (char) c;
692a88e22b7SJung-uk Kim                 i++;
693a88e22b7SJung-uk Kim                 State = DT_NORMAL_TEXT;
694a88e22b7SJung-uk Kim                 break;
695a88e22b7SJung-uk Kim             }
696a88e22b7SJung-uk Kim             break;
697a88e22b7SJung-uk Kim 
698a88e22b7SJung-uk Kim         case DT_SLASH_ASTERISK_COMMENT:
699a88e22b7SJung-uk Kim 
700a88e22b7SJung-uk Kim             /* Ignore chars until an asterisk-slash is found */
701a88e22b7SJung-uk Kim 
702a88e22b7SJung-uk Kim             switch (c)
703a88e22b7SJung-uk Kim             {
704a88e22b7SJung-uk Kim             case '\n':
705a9d8d09cSJung-uk Kim 
7066f1f1a63SJung-uk Kim                 AslGbl_NextLineOffset = (UINT32) ftell (Handle);
7076f1f1a63SJung-uk Kim                 AslGbl_CurrentLineNumber++;
708a88e22b7SJung-uk Kim                 break;
709a88e22b7SJung-uk Kim 
710a88e22b7SJung-uk Kim             case '*':
711a9d8d09cSJung-uk Kim 
712a88e22b7SJung-uk Kim                 State = DT_END_COMMENT;
713a88e22b7SJung-uk Kim                 break;
714a88e22b7SJung-uk Kim 
715a88e22b7SJung-uk Kim             default:
716a9d8d09cSJung-uk Kim 
717a88e22b7SJung-uk Kim                 break;
718a88e22b7SJung-uk Kim             }
719a88e22b7SJung-uk Kim             break;
720a88e22b7SJung-uk Kim 
721a88e22b7SJung-uk Kim         case DT_SLASH_SLASH_COMMENT:
722a88e22b7SJung-uk Kim 
723a88e22b7SJung-uk Kim             /* Ignore chars until end-of-line */
724a88e22b7SJung-uk Kim 
725a88e22b7SJung-uk Kim             if (c == '\n')
726a88e22b7SJung-uk Kim             {
727a88e22b7SJung-uk Kim                 /* We will exit via the NORMAL_TEXT path */
728a88e22b7SJung-uk Kim 
729a88e22b7SJung-uk Kim                 ungetc (c, Handle);
730a88e22b7SJung-uk Kim                 State = DT_NORMAL_TEXT;
731a88e22b7SJung-uk Kim             }
732a88e22b7SJung-uk Kim             break;
733a88e22b7SJung-uk Kim 
734a88e22b7SJung-uk Kim         case DT_END_COMMENT:
735a88e22b7SJung-uk Kim 
736a88e22b7SJung-uk Kim             /* End comment if this char is a slash */
737a88e22b7SJung-uk Kim 
738a88e22b7SJung-uk Kim             switch (c)
739a88e22b7SJung-uk Kim             {
740a88e22b7SJung-uk Kim             case '/':
741a9d8d09cSJung-uk Kim 
742a88e22b7SJung-uk Kim                 State = DT_NORMAL_TEXT;
743a88e22b7SJung-uk Kim                 break;
744a88e22b7SJung-uk Kim 
7450b94ba42SJung-uk Kim             case '\n':
746a9d8d09cSJung-uk Kim 
7476f1f1a63SJung-uk Kim                 AslGbl_NextLineOffset = (UINT32) ftell (Handle);
7486f1f1a63SJung-uk Kim                 AslGbl_CurrentLineNumber++;
7490b94ba42SJung-uk Kim                 break;
7500b94ba42SJung-uk Kim 
7510b94ba42SJung-uk Kim             case '*':
752a9d8d09cSJung-uk Kim 
7530b94ba42SJung-uk Kim                 /* Consume all adjacent asterisks */
7540b94ba42SJung-uk Kim                 break;
7550b94ba42SJung-uk Kim 
756a88e22b7SJung-uk Kim             default:
757a9d8d09cSJung-uk Kim 
758a88e22b7SJung-uk Kim                 State = DT_SLASH_ASTERISK_COMMENT;
759a88e22b7SJung-uk Kim                 break;
760a88e22b7SJung-uk Kim             }
761a88e22b7SJung-uk Kim             break;
762a88e22b7SJung-uk Kim 
763d052a1ccSJung-uk Kim         case DT_MERGE_LINES:
764d052a1ccSJung-uk Kim 
765d052a1ccSJung-uk Kim             if (c != '\n')
766d052a1ccSJung-uk Kim             {
767d052a1ccSJung-uk Kim                 /*
768d052a1ccSJung-uk Kim                  * This is not a continuation backslash, it is a normal
769d052a1ccSJung-uk Kim                  * normal ASL backslash - for example: Scope(\_SB_)
770d052a1ccSJung-uk Kim                  */
771d052a1ccSJung-uk Kim                 i++; /* Keep the backslash that is already in the buffer */
772d052a1ccSJung-uk Kim 
773d052a1ccSJung-uk Kim                 ungetc (c, Handle);
774d052a1ccSJung-uk Kim                 State = DT_NORMAL_TEXT;
775d052a1ccSJung-uk Kim             }
776d052a1ccSJung-uk Kim             else
777d052a1ccSJung-uk Kim             {
778d052a1ccSJung-uk Kim                 /*
779d052a1ccSJung-uk Kim                  * This is a continuation line -- a backlash followed
780d052a1ccSJung-uk Kim                  * immediately by a newline. Insert a space between the
781d052a1ccSJung-uk Kim                  * lines (overwrite the backslash)
782d052a1ccSJung-uk Kim                  */
7836f1f1a63SJung-uk Kim                 AslGbl_CurrentLineBuffer[i] = ' ';
784d052a1ccSJung-uk Kim                 i++;
785d052a1ccSJung-uk Kim 
786d052a1ccSJung-uk Kim                 /* Ignore newline, this will merge the lines */
787d052a1ccSJung-uk Kim 
7886f1f1a63SJung-uk Kim                 AslGbl_NextLineOffset = (UINT32) ftell (Handle);
7896f1f1a63SJung-uk Kim                 AslGbl_CurrentLineNumber++;
790d052a1ccSJung-uk Kim                 State = DT_NORMAL_TEXT;
791d052a1ccSJung-uk Kim             }
792d052a1ccSJung-uk Kim             break;
793d052a1ccSJung-uk Kim 
794a88e22b7SJung-uk Kim         default:
795a9d8d09cSJung-uk Kim 
796a88e22b7SJung-uk Kim             DtFatal (ASL_MSG_COMPILER_INTERNAL, NULL, "Unknown input state");
797d052a1ccSJung-uk Kim             return (ASL_EOF);
798a88e22b7SJung-uk Kim         }
799a88e22b7SJung-uk Kim     }
800a88e22b7SJung-uk Kim }
801a88e22b7SJung-uk Kim 
802a88e22b7SJung-uk Kim 
803a88e22b7SJung-uk Kim /******************************************************************************
804a88e22b7SJung-uk Kim  *
805a88e22b7SJung-uk Kim  * FUNCTION:    DtScanFile
806a88e22b7SJung-uk Kim  *
807a88e22b7SJung-uk Kim  * PARAMETERS:  Handle              - Open file handle for the source file
808a88e22b7SJung-uk Kim  *
809a88e22b7SJung-uk Kim  * RETURN:      Pointer to start of the constructed parse tree.
810a88e22b7SJung-uk Kim  *
811a88e22b7SJung-uk Kim  * DESCRIPTION: Scan source file, link all field names and values
8126f1f1a63SJung-uk Kim  *              to the global parse tree: AslGbl_FieldList
813a88e22b7SJung-uk Kim  *
814a88e22b7SJung-uk Kim  *****************************************************************************/
815a88e22b7SJung-uk Kim 
816a88e22b7SJung-uk Kim DT_FIELD *
DtScanFile(FILE * Handle)817a88e22b7SJung-uk Kim DtScanFile (
818a88e22b7SJung-uk Kim     FILE                    *Handle)
819a88e22b7SJung-uk Kim {
820d244b227SJung-uk Kim     ACPI_STATUS             Status;
821a88e22b7SJung-uk Kim     UINT32                  Offset;
822a88e22b7SJung-uk Kim 
823a88e22b7SJung-uk Kim 
824a88e22b7SJung-uk Kim     ACPI_FUNCTION_NAME (DtScanFile);
825a88e22b7SJung-uk Kim 
826a88e22b7SJung-uk Kim 
827a88e22b7SJung-uk Kim     /* Get the file size */
828a88e22b7SJung-uk Kim 
8296f1f1a63SJung-uk Kim     AslGbl_InputByteCount = CmGetFileSize (Handle);
8306f1f1a63SJung-uk Kim     if (AslGbl_InputByteCount == ACPI_UINT32_MAX)
831313a0c13SJung-uk Kim     {
832313a0c13SJung-uk Kim         AslAbort ();
833313a0c13SJung-uk Kim     }
834a88e22b7SJung-uk Kim 
8356f1f1a63SJung-uk Kim     AslGbl_CurrentLineNumber = 0;
8366f1f1a63SJung-uk Kim     AslGbl_CurrentLineOffset = 0;
8376f1f1a63SJung-uk Kim     AslGbl_NextLineOffset = 0;
838a88e22b7SJung-uk Kim 
839a88e22b7SJung-uk Kim     /* Scan line-by-line */
840a88e22b7SJung-uk Kim 
8415ef50723SJung-uk Kim     while ((Offset = DtGetNextLine (Handle, 0)) != ASL_EOF)
842a88e22b7SJung-uk Kim     {
843a88e22b7SJung-uk Kim         ACPI_DEBUG_PRINT ((ACPI_DB_PARSE, "Line %2.2u/%4.4X - %s",
8446f1f1a63SJung-uk Kim             AslGbl_CurrentLineNumber, Offset, AslGbl_CurrentLineBuffer));
845a88e22b7SJung-uk Kim 
8466f1f1a63SJung-uk Kim         Status = DtParseLine (AslGbl_CurrentLineBuffer,
8476f1f1a63SJung-uk Kim             AslGbl_CurrentLineNumber, Offset);
848d244b227SJung-uk Kim         if (Status == AE_NOT_FOUND)
849d244b227SJung-uk Kim         {
850d244b227SJung-uk Kim             break;
851d244b227SJung-uk Kim         }
852a88e22b7SJung-uk Kim     }
853a88e22b7SJung-uk Kim 
854d052a1ccSJung-uk Kim     /* Dump the parse tree if debug enabled */
855d052a1ccSJung-uk Kim 
8566f1f1a63SJung-uk Kim     DtDumpFieldList (AslGbl_FieldList);
8576f1f1a63SJung-uk Kim     return (AslGbl_FieldList);
858a88e22b7SJung-uk Kim }
859a88e22b7SJung-uk Kim 
860a88e22b7SJung-uk Kim 
861a88e22b7SJung-uk Kim /*
862a88e22b7SJung-uk Kim  * Output functions
863a88e22b7SJung-uk Kim  */
864a88e22b7SJung-uk Kim 
865a88e22b7SJung-uk Kim /******************************************************************************
866a88e22b7SJung-uk Kim  *
867a88e22b7SJung-uk Kim  * FUNCTION:    DtWriteBinary
868a88e22b7SJung-uk Kim  *
869a88e22b7SJung-uk Kim  * PARAMETERS:  DT_WALK_CALLBACK
870a88e22b7SJung-uk Kim  *
871a88e22b7SJung-uk Kim  * RETURN:      Status
872a88e22b7SJung-uk Kim  *
873a88e22b7SJung-uk Kim  * DESCRIPTION: Write one subtable of a binary ACPI table
874a88e22b7SJung-uk Kim  *
875a88e22b7SJung-uk Kim  *****************************************************************************/
876a88e22b7SJung-uk Kim 
877a88e22b7SJung-uk Kim static void
DtWriteBinary(DT_SUBTABLE * Subtable,void * Context,void * ReturnValue)878a88e22b7SJung-uk Kim DtWriteBinary (
879a88e22b7SJung-uk Kim     DT_SUBTABLE             *Subtable,
880a88e22b7SJung-uk Kim     void                    *Context,
881a88e22b7SJung-uk Kim     void                    *ReturnValue)
882a88e22b7SJung-uk Kim {
883a88e22b7SJung-uk Kim 
884a88e22b7SJung-uk Kim     FlWriteFile (ASL_FILE_AML_OUTPUT, Subtable->Buffer, Subtable->Length);
885a88e22b7SJung-uk Kim }
886a88e22b7SJung-uk Kim 
887a88e22b7SJung-uk Kim 
888a88e22b7SJung-uk Kim /******************************************************************************
889a88e22b7SJung-uk Kim  *
890a88e22b7SJung-uk Kim  * FUNCTION:    DtOutputBinary
891a88e22b7SJung-uk Kim  *
892a88e22b7SJung-uk Kim  * PARAMETERS:
893a88e22b7SJung-uk Kim  *
894a88e22b7SJung-uk Kim  * RETURN:      Status
895a88e22b7SJung-uk Kim  *
896a88e22b7SJung-uk Kim  * DESCRIPTION: Write entire binary ACPI table (result of compilation)
897a88e22b7SJung-uk Kim  *
898a88e22b7SJung-uk Kim  *****************************************************************************/
899a88e22b7SJung-uk Kim 
900a88e22b7SJung-uk Kim void
DtOutputBinary(DT_SUBTABLE * RootTable)901a88e22b7SJung-uk Kim DtOutputBinary (
902a88e22b7SJung-uk Kim     DT_SUBTABLE             *RootTable)
903a88e22b7SJung-uk Kim {
904a88e22b7SJung-uk Kim 
905a88e22b7SJung-uk Kim     if (!RootTable)
906a88e22b7SJung-uk Kim     {
907a88e22b7SJung-uk Kim         return;
908a88e22b7SJung-uk Kim     }
909a88e22b7SJung-uk Kim 
910a88e22b7SJung-uk Kim     /* Walk the entire parse tree, emitting the binary data */
911a88e22b7SJung-uk Kim 
912a88e22b7SJung-uk Kim     DtWalkTableTree (RootTable, DtWriteBinary, NULL, NULL);
913313a0c13SJung-uk Kim 
9146f1f1a63SJung-uk Kim     AslGbl_TableLength = CmGetFileSize (AslGbl_Files[ASL_FILE_AML_OUTPUT].Handle);
9156f1f1a63SJung-uk Kim     if (AslGbl_TableLength == ACPI_UINT32_MAX)
916313a0c13SJung-uk Kim     {
917313a0c13SJung-uk Kim         AslAbort ();
918313a0c13SJung-uk Kim     }
919a88e22b7SJung-uk Kim }
920d244b227SJung-uk Kim 
921d244b227SJung-uk Kim 
922d244b227SJung-uk Kim /*
923d244b227SJung-uk Kim  * Listing support
924d244b227SJung-uk Kim  */
925d244b227SJung-uk Kim 
926d244b227SJung-uk Kim /******************************************************************************
927d244b227SJung-uk Kim  *
928d244b227SJung-uk Kim  * FUNCTION:    DtDumpBuffer
929d244b227SJung-uk Kim  *
930d244b227SJung-uk Kim  * PARAMETERS:  FileID              - Where to write buffer data
931d244b227SJung-uk Kim  *              Buffer              - Buffer to dump
9320b94ba42SJung-uk Kim  *              Offset              - Offset in current table
933d244b227SJung-uk Kim  *              Length              - Buffer Length
934d244b227SJung-uk Kim  *
935d244b227SJung-uk Kim  * RETURN:      None
936d244b227SJung-uk Kim  *
937d244b227SJung-uk Kim  * DESCRIPTION: Another copy of DumpBuffer routine (unfortunately).
938d244b227SJung-uk Kim  *
939d244b227SJung-uk Kim  * TBD: merge dump buffer routines
940d244b227SJung-uk Kim  *
941d244b227SJung-uk Kim  *****************************************************************************/
942d244b227SJung-uk Kim 
943d244b227SJung-uk Kim static void
DtDumpBuffer(UINT32 FileId,UINT8 * Buffer,UINT32 Offset,UINT32 Length)944d244b227SJung-uk Kim DtDumpBuffer (
945d244b227SJung-uk Kim     UINT32                  FileId,
946d244b227SJung-uk Kim     UINT8                   *Buffer,
9470b94ba42SJung-uk Kim     UINT32                  Offset,
948d244b227SJung-uk Kim     UINT32                  Length)
949d244b227SJung-uk Kim {
950d244b227SJung-uk Kim     UINT32                  i;
951d244b227SJung-uk Kim     UINT32                  j;
952d244b227SJung-uk Kim     UINT8                   BufChar;
953d244b227SJung-uk Kim 
954d244b227SJung-uk Kim 
9559a4bc520SJung-uk Kim     FlPrintFile (FileId, "Output: [%3.3Xh %4.4d %3.3Xh] ",
9560b94ba42SJung-uk Kim         Offset, Offset, Length);
9570b94ba42SJung-uk Kim 
958d244b227SJung-uk Kim     i = 0;
959d244b227SJung-uk Kim     while (i < Length)
960d244b227SJung-uk Kim     {
9610b94ba42SJung-uk Kim         if (i >= 16)
9620b94ba42SJung-uk Kim         {
963d052a1ccSJung-uk Kim             FlPrintFile (FileId, "%24s", "");
9640b94ba42SJung-uk Kim         }
965d244b227SJung-uk Kim 
9660b94ba42SJung-uk Kim         /* Print 16 hex chars */
967d244b227SJung-uk Kim 
968d244b227SJung-uk Kim         for (j = 0; j < 16;)
969d244b227SJung-uk Kim         {
970d244b227SJung-uk Kim             if (i + j >= Length)
971d244b227SJung-uk Kim             {
972d244b227SJung-uk Kim                 /* Dump fill spaces */
973d244b227SJung-uk Kim 
974d244b227SJung-uk Kim                 FlPrintFile (FileId, "   ");
975d244b227SJung-uk Kim                 j++;
976d244b227SJung-uk Kim                 continue;
977d244b227SJung-uk Kim             }
978d244b227SJung-uk Kim 
979d244b227SJung-uk Kim             FlPrintFile (FileId, "%02X ", Buffer[i+j]);
980d244b227SJung-uk Kim             j++;
981d244b227SJung-uk Kim         }
982d244b227SJung-uk Kim 
983d244b227SJung-uk Kim         FlPrintFile (FileId, " ");
984d244b227SJung-uk Kim         for (j = 0; j < 16; j++)
985d244b227SJung-uk Kim         {
986d244b227SJung-uk Kim             if (i + j >= Length)
987d244b227SJung-uk Kim             {
988d244b227SJung-uk Kim                 FlPrintFile (FileId, "\n\n");
989d244b227SJung-uk Kim                 return;
990d244b227SJung-uk Kim             }
991d244b227SJung-uk Kim 
992d244b227SJung-uk Kim             BufChar = Buffer[(ACPI_SIZE) i + j];
9935ef50723SJung-uk Kim             if (isprint (BufChar))
994d244b227SJung-uk Kim             {
995d244b227SJung-uk Kim                 FlPrintFile (FileId, "%c", BufChar);
996d244b227SJung-uk Kim             }
997d244b227SJung-uk Kim             else
998d244b227SJung-uk Kim             {
999d244b227SJung-uk Kim                 FlPrintFile (FileId, ".");
1000d244b227SJung-uk Kim             }
1001d244b227SJung-uk Kim         }
1002d244b227SJung-uk Kim 
1003d244b227SJung-uk Kim         /* Done with that line. */
1004d244b227SJung-uk Kim 
1005d244b227SJung-uk Kim         FlPrintFile (FileId, "\n");
1006d244b227SJung-uk Kim         i += 16;
1007d244b227SJung-uk Kim     }
1008d244b227SJung-uk Kim 
1009d244b227SJung-uk Kim     FlPrintFile (FileId, "\n\n");
1010d244b227SJung-uk Kim }
1011d244b227SJung-uk Kim 
1012d244b227SJung-uk Kim 
1013d244b227SJung-uk Kim /******************************************************************************
1014d244b227SJung-uk Kim  *
1015efcc2a30SJung-uk Kim  * FUNCTION:    DtDumpFieldList
1016efcc2a30SJung-uk Kim  *
1017efcc2a30SJung-uk Kim  * PARAMETERS:  Field               - Root field
1018efcc2a30SJung-uk Kim  *
1019efcc2a30SJung-uk Kim  * RETURN:      None
1020efcc2a30SJung-uk Kim  *
1021efcc2a30SJung-uk Kim  * DESCRIPTION: Dump the entire field list
1022efcc2a30SJung-uk Kim  *
1023efcc2a30SJung-uk Kim  *****************************************************************************/
1024efcc2a30SJung-uk Kim 
1025efcc2a30SJung-uk Kim void
DtDumpFieldList(DT_FIELD * Field)1026efcc2a30SJung-uk Kim DtDumpFieldList (
1027efcc2a30SJung-uk Kim     DT_FIELD                *Field)
1028efcc2a30SJung-uk Kim {
1029efcc2a30SJung-uk Kim 
10306f1f1a63SJung-uk Kim     if (!AslGbl_DebugFlag || !Field)
1031efcc2a30SJung-uk Kim     {
1032efcc2a30SJung-uk Kim         return;
1033efcc2a30SJung-uk Kim     }
1034efcc2a30SJung-uk Kim 
1035efcc2a30SJung-uk Kim     DbgPrint (ASL_DEBUG_OUTPUT,  "\nField List:\n"
1036efcc2a30SJung-uk Kim         "LineNo   ByteOff  NameCol  Column   TableOff "
1037efcc2a30SJung-uk Kim         "Flags %32s : %s\n\n", "Name", "Value");
1038f8146b88SJung-uk Kim 
1039efcc2a30SJung-uk Kim     while (Field)
1040efcc2a30SJung-uk Kim     {
1041efcc2a30SJung-uk Kim         DbgPrint (ASL_DEBUG_OUTPUT,
10427cf3e94aSJung-uk Kim             "%.08X %.08X %.08X %.08X %.08X %2.2X    %32s : %s\n",
1043efcc2a30SJung-uk Kim             Field->Line, Field->ByteOffset, Field->NameColumn,
1044efcc2a30SJung-uk Kim             Field->Column, Field->TableOffset, Field->Flags,
1045efcc2a30SJung-uk Kim             Field->Name, Field->Value);
1046efcc2a30SJung-uk Kim 
1047efcc2a30SJung-uk Kim         Field = Field->Next;
1048efcc2a30SJung-uk Kim     }
1049efcc2a30SJung-uk Kim 
1050efcc2a30SJung-uk Kim     DbgPrint (ASL_DEBUG_OUTPUT,  "\n\n");
1051efcc2a30SJung-uk Kim }
1052efcc2a30SJung-uk Kim 
1053efcc2a30SJung-uk Kim 
1054efcc2a30SJung-uk Kim /******************************************************************************
1055efcc2a30SJung-uk Kim  *
1056efcc2a30SJung-uk Kim  * FUNCTION:    DtDumpSubtableInfo, DtDumpSubtableTree
1057efcc2a30SJung-uk Kim  *
1058efcc2a30SJung-uk Kim  * PARAMETERS:  DT_WALK_CALLBACK
1059efcc2a30SJung-uk Kim  *
1060efcc2a30SJung-uk Kim  * RETURN:      None
1061efcc2a30SJung-uk Kim  *
1062efcc2a30SJung-uk Kim  * DESCRIPTION: Info - dump a subtable tree entry with extra information.
1063efcc2a30SJung-uk Kim  *              Tree - dump a subtable tree formatted by depth indentation.
1064efcc2a30SJung-uk Kim  *
1065efcc2a30SJung-uk Kim  *****************************************************************************/
1066efcc2a30SJung-uk Kim 
1067efcc2a30SJung-uk Kim static void
DtDumpSubtableInfo(DT_SUBTABLE * Subtable,void * Context,void * ReturnValue)1068efcc2a30SJung-uk Kim DtDumpSubtableInfo (
1069efcc2a30SJung-uk Kim     DT_SUBTABLE             *Subtable,
1070efcc2a30SJung-uk Kim     void                    *Context,
1071efcc2a30SJung-uk Kim     void                    *ReturnValue)
1072efcc2a30SJung-uk Kim {
1073efcc2a30SJung-uk Kim 
1074efcc2a30SJung-uk Kim     DbgPrint (ASL_DEBUG_OUTPUT,
1075a009b7dcSJung-uk Kim         "[%.04X] %24s %.08X %.08X %.08X %.08X %p %p %p %p\n",
1076a371a5fdSJung-uk Kim         Subtable->Depth, Subtable->Name, Subtable->Length, Subtable->TotalLength,
1077efcc2a30SJung-uk Kim         Subtable->SizeOfLengthField, Subtable->Flags, Subtable,
1078efcc2a30SJung-uk Kim         Subtable->Parent, Subtable->Child, Subtable->Peer);
1079efcc2a30SJung-uk Kim }
1080efcc2a30SJung-uk Kim 
1081efcc2a30SJung-uk Kim static void
DtDumpSubtableTree(DT_SUBTABLE * Subtable,void * Context,void * ReturnValue)1082efcc2a30SJung-uk Kim DtDumpSubtableTree (
1083efcc2a30SJung-uk Kim     DT_SUBTABLE             *Subtable,
1084efcc2a30SJung-uk Kim     void                    *Context,
1085efcc2a30SJung-uk Kim     void                    *ReturnValue)
1086efcc2a30SJung-uk Kim {
1087efcc2a30SJung-uk Kim 
1088efcc2a30SJung-uk Kim     DbgPrint (ASL_DEBUG_OUTPUT,
10891970d693SJung-uk Kim         "[%.04X] %24s %*s%p (%.02X) - (%.02X)        %.02X\n",
1090a371a5fdSJung-uk Kim         Subtable->Depth, Subtable->Name, (4 * Subtable->Depth), " ",
10911970d693SJung-uk Kim         Subtable, Subtable->Length, Subtable->TotalLength, *Subtable->Buffer);
1092efcc2a30SJung-uk Kim }
1093efcc2a30SJung-uk Kim 
1094efcc2a30SJung-uk Kim 
1095efcc2a30SJung-uk Kim /******************************************************************************
1096efcc2a30SJung-uk Kim  *
1097efcc2a30SJung-uk Kim  * FUNCTION:    DtDumpSubtableList
1098efcc2a30SJung-uk Kim  *
1099efcc2a30SJung-uk Kim  * PARAMETERS:  None
1100efcc2a30SJung-uk Kim  *
1101efcc2a30SJung-uk Kim  * RETURN:      None
1102efcc2a30SJung-uk Kim  *
1103efcc2a30SJung-uk Kim  * DESCRIPTION: Dump the raw list of subtables with information, and also
1104efcc2a30SJung-uk Kim  *              dump the subtable list in formatted tree format. Assists with
1105efcc2a30SJung-uk Kim  *              the development of new table code.
1106efcc2a30SJung-uk Kim  *
1107efcc2a30SJung-uk Kim  *****************************************************************************/
1108efcc2a30SJung-uk Kim 
1109efcc2a30SJung-uk Kim void
DtDumpSubtableList(void)1110efcc2a30SJung-uk Kim DtDumpSubtableList (
1111efcc2a30SJung-uk Kim     void)
1112efcc2a30SJung-uk Kim {
1113efcc2a30SJung-uk Kim 
11146f1f1a63SJung-uk Kim     if (!AslGbl_DebugFlag || !AslGbl_RootTable)
1115efcc2a30SJung-uk Kim     {
1116efcc2a30SJung-uk Kim         return;
1117efcc2a30SJung-uk Kim     }
1118efcc2a30SJung-uk Kim 
1119efcc2a30SJung-uk Kim     DbgPrint (ASL_DEBUG_OUTPUT,
1120efcc2a30SJung-uk Kim         "Subtable Info:\n"
1121a371a5fdSJung-uk Kim         "Depth                      Name Length   TotalLen LenSize  Flags    "
1122efcc2a30SJung-uk Kim         "This     Parent   Child    Peer\n\n");
11236f1f1a63SJung-uk Kim     DtWalkTableTree (AslGbl_RootTable, DtDumpSubtableInfo, NULL, NULL);
1124efcc2a30SJung-uk Kim 
1125efcc2a30SJung-uk Kim     DbgPrint (ASL_DEBUG_OUTPUT,
11261970d693SJung-uk Kim         "\nSubtable Tree: (Depth, Name, Subtable, Length, TotalLength, Integer Value)\n\n");
11276f1f1a63SJung-uk Kim     DtWalkTableTree (AslGbl_RootTable, DtDumpSubtableTree, NULL, NULL);
1128313a0c13SJung-uk Kim 
1129313a0c13SJung-uk Kim     DbgPrint (ASL_DEBUG_OUTPUT, "\n");
1130efcc2a30SJung-uk Kim }
1131efcc2a30SJung-uk Kim 
1132efcc2a30SJung-uk Kim 
1133efcc2a30SJung-uk Kim /******************************************************************************
1134efcc2a30SJung-uk Kim  *
1135d244b227SJung-uk Kim  * FUNCTION:    DtWriteFieldToListing
1136d244b227SJung-uk Kim  *
1137d244b227SJung-uk Kim  * PARAMETERS:  Buffer              - Contains the compiled data
1138d244b227SJung-uk Kim  *              Field               - Field node for the input line
1139d244b227SJung-uk Kim  *              Length              - Length of the output data
1140d244b227SJung-uk Kim  *
1141d244b227SJung-uk Kim  * RETURN:      None
1142d244b227SJung-uk Kim  *
1143d244b227SJung-uk Kim  * DESCRIPTION: Write one field to the listing file (if listing is enabled).
1144d244b227SJung-uk Kim  *
1145d244b227SJung-uk Kim  *****************************************************************************/
1146d244b227SJung-uk Kim 
1147d244b227SJung-uk Kim void
DtWriteFieldToListing(UINT8 * Buffer,DT_FIELD * Field,UINT32 Length)1148d244b227SJung-uk Kim DtWriteFieldToListing (
1149d244b227SJung-uk Kim     UINT8                   *Buffer,
1150d244b227SJung-uk Kim     DT_FIELD                *Field,
1151d244b227SJung-uk Kim     UINT32                  Length)
1152d244b227SJung-uk Kim {
1153d244b227SJung-uk Kim     UINT8                   FileByte;
1154d244b227SJung-uk Kim 
1155d244b227SJung-uk Kim 
11566f1f1a63SJung-uk Kim     if (!AslGbl_ListingFlag || !Field)
1157d244b227SJung-uk Kim     {
1158d244b227SJung-uk Kim         return;
1159d244b227SJung-uk Kim     }
1160d244b227SJung-uk Kim 
1161d244b227SJung-uk Kim     /* Dump the original source line */
1162d244b227SJung-uk Kim 
1163d244b227SJung-uk Kim     FlPrintFile (ASL_FILE_LISTING_OUTPUT, "Input:  ");
1164d244b227SJung-uk Kim     FlSeekFile (ASL_FILE_INPUT, Field->ByteOffset);
1165d244b227SJung-uk Kim 
1166d244b227SJung-uk Kim     while (FlReadFile (ASL_FILE_INPUT, &FileByte, 1) == AE_OK)
1167d244b227SJung-uk Kim     {
1168d244b227SJung-uk Kim         FlWriteFile (ASL_FILE_LISTING_OUTPUT, &FileByte, 1);
1169d244b227SJung-uk Kim         if (FileByte == '\n')
1170d244b227SJung-uk Kim         {
1171d244b227SJung-uk Kim             break;
1172d244b227SJung-uk Kim         }
1173d244b227SJung-uk Kim     }
1174d244b227SJung-uk Kim 
1175d244b227SJung-uk Kim     /* Dump the line as parsed and represented internally */
1176d244b227SJung-uk Kim 
1177d052a1ccSJung-uk Kim     FlPrintFile (ASL_FILE_LISTING_OUTPUT, "Parsed: %*s : %.64s",
1178d244b227SJung-uk Kim         Field->Column-4, Field->Name, Field->Value);
1179d244b227SJung-uk Kim 
1180d052a1ccSJung-uk Kim     if (strlen (Field->Value) > 64)
1181d052a1ccSJung-uk Kim     {
1182d052a1ccSJung-uk Kim         FlPrintFile (ASL_FILE_LISTING_OUTPUT, "...Additional data, length 0x%X\n",
1183a009b7dcSJung-uk Kim             (UINT32) strlen (Field->Value));
1184d052a1ccSJung-uk Kim     }
1185f8146b88SJung-uk Kim 
1186d052a1ccSJung-uk Kim     FlPrintFile (ASL_FILE_LISTING_OUTPUT, "\n");
1187d052a1ccSJung-uk Kim 
1188d244b227SJung-uk Kim     /* Dump the hex data that will be output for this field */
1189d244b227SJung-uk Kim 
11900b94ba42SJung-uk Kim     DtDumpBuffer (ASL_FILE_LISTING_OUTPUT, Buffer, Field->TableOffset, Length);
1191d244b227SJung-uk Kim }
1192d244b227SJung-uk Kim 
1193d244b227SJung-uk Kim 
1194d244b227SJung-uk Kim /******************************************************************************
1195d244b227SJung-uk Kim  *
1196d244b227SJung-uk Kim  * FUNCTION:    DtWriteTableToListing
1197d244b227SJung-uk Kim  *
1198d244b227SJung-uk Kim  * PARAMETERS:  None
1199d244b227SJung-uk Kim  *
1200d244b227SJung-uk Kim  * RETURN:      None
1201d244b227SJung-uk Kim  *
1202d244b227SJung-uk Kim  * DESCRIPTION: Write the entire compiled table to the listing file
1203d244b227SJung-uk Kim  *              in hex format
1204d244b227SJung-uk Kim  *
1205d244b227SJung-uk Kim  *****************************************************************************/
1206d244b227SJung-uk Kim 
1207d244b227SJung-uk Kim void
DtWriteTableToListing(void)1208d244b227SJung-uk Kim DtWriteTableToListing (
1209d244b227SJung-uk Kim     void)
1210d244b227SJung-uk Kim {
1211d244b227SJung-uk Kim     UINT8                   *Buffer;
1212d244b227SJung-uk Kim 
1213d244b227SJung-uk Kim 
12146f1f1a63SJung-uk Kim     if (!AslGbl_ListingFlag)
1215d244b227SJung-uk Kim     {
1216d244b227SJung-uk Kim         return;
1217d244b227SJung-uk Kim     }
1218d244b227SJung-uk Kim 
1219d244b227SJung-uk Kim     /* Read the entire table from the output file */
1220d244b227SJung-uk Kim 
12216f1f1a63SJung-uk Kim     Buffer = UtLocalCalloc (AslGbl_TableLength);
1222d244b227SJung-uk Kim     FlSeekFile (ASL_FILE_AML_OUTPUT, 0);
12236f1f1a63SJung-uk Kim     FlReadFile (ASL_FILE_AML_OUTPUT, Buffer, AslGbl_TableLength);
1224d244b227SJung-uk Kim 
1225d244b227SJung-uk Kim     /* Dump the raw table data */
1226d244b227SJung-uk Kim 
12276f1f1a63SJung-uk Kim     AcpiOsRedirectOutput (AslGbl_Files[ASL_FILE_LISTING_OUTPUT].Handle);
1228d244b227SJung-uk Kim 
1229d244b227SJung-uk Kim     AcpiOsPrintf ("\n%s: Length %d (0x%X)\n\n",
12306f1f1a63SJung-uk Kim         ACPI_RAW_TABLE_DATA_HEADER, AslGbl_TableLength, AslGbl_TableLength);
12316f1f1a63SJung-uk Kim     AcpiUtDumpBuffer (Buffer, AslGbl_TableLength, DB_BYTE_DISPLAY, 0);
1232d244b227SJung-uk Kim 
1233d244b227SJung-uk Kim     AcpiOsRedirectOutput (stdout);
12348d744e47SJung-uk Kim     ACPI_FREE (Buffer);
1235d244b227SJung-uk Kim }
1236