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