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