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*804fe266SJung-uk Kim * Some or all of this work - Copyright (c) 1999 - 2024, 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 * 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 { 2885ef50723SJung-uk Kim strncpy (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 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); 3805ef50723SJung-uk Kim strncpy (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 4285ef50723SJung-uk Kim strncpy (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 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 * 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 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 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 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 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 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 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 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 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 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