1*a88e22b7SJung-uk Kim /****************************************************************************** 2*a88e22b7SJung-uk Kim * 3*a88e22b7SJung-uk Kim * Module Name: dtio.c - File I/O support for data table compiler 4*a88e22b7SJung-uk Kim * 5*a88e22b7SJung-uk Kim *****************************************************************************/ 6*a88e22b7SJung-uk Kim 7*a88e22b7SJung-uk Kim /****************************************************************************** 8*a88e22b7SJung-uk Kim * 9*a88e22b7SJung-uk Kim * 1. Copyright Notice 10*a88e22b7SJung-uk Kim * 11*a88e22b7SJung-uk Kim * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. 12*a88e22b7SJung-uk Kim * All rights reserved. 13*a88e22b7SJung-uk Kim * 14*a88e22b7SJung-uk Kim * 2. License 15*a88e22b7SJung-uk Kim * 16*a88e22b7SJung-uk Kim * 2.1. This is your license from Intel Corp. under its intellectual property 17*a88e22b7SJung-uk Kim * rights. You may have additional license terms from the party that provided 18*a88e22b7SJung-uk Kim * you this software, covering your right to use that party's intellectual 19*a88e22b7SJung-uk Kim * property rights. 20*a88e22b7SJung-uk Kim * 21*a88e22b7SJung-uk Kim * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a 22*a88e22b7SJung-uk Kim * copy of the source code appearing in this file ("Covered Code") an 23*a88e22b7SJung-uk Kim * irrevocable, perpetual, worldwide license under Intel's copyrights in the 24*a88e22b7SJung-uk Kim * base code distributed originally by Intel ("Original Intel Code") to copy, 25*a88e22b7SJung-uk Kim * make derivatives, distribute, use and display any portion of the Covered 26*a88e22b7SJung-uk Kim * Code in any form, with the right to sublicense such rights; and 27*a88e22b7SJung-uk Kim * 28*a88e22b7SJung-uk Kim * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent 29*a88e22b7SJung-uk Kim * license (with the right to sublicense), under only those claims of Intel 30*a88e22b7SJung-uk Kim * patents that are infringed by the Original Intel Code, to make, use, sell, 31*a88e22b7SJung-uk Kim * offer to sell, and import the Covered Code and derivative works thereof 32*a88e22b7SJung-uk Kim * solely to the minimum extent necessary to exercise the above copyright 33*a88e22b7SJung-uk Kim * license, and in no event shall the patent license extend to any additions 34*a88e22b7SJung-uk Kim * to or modifications of the Original Intel Code. No other license or right 35*a88e22b7SJung-uk Kim * is granted directly or by implication, estoppel or otherwise; 36*a88e22b7SJung-uk Kim * 37*a88e22b7SJung-uk Kim * The above copyright and patent license is granted only if the following 38*a88e22b7SJung-uk Kim * conditions are met: 39*a88e22b7SJung-uk Kim * 40*a88e22b7SJung-uk Kim * 3. Conditions 41*a88e22b7SJung-uk Kim * 42*a88e22b7SJung-uk Kim * 3.1. Redistribution of Source with Rights to Further Distribute Source. 43*a88e22b7SJung-uk Kim * Redistribution of source code of any substantial portion of the Covered 44*a88e22b7SJung-uk Kim * Code or modification with rights to further distribute source must include 45*a88e22b7SJung-uk Kim * the above Copyright Notice, the above License, this list of Conditions, 46*a88e22b7SJung-uk Kim * and the following Disclaimer and Export Compliance provision. In addition, 47*a88e22b7SJung-uk Kim * Licensee must cause all Covered Code to which Licensee contributes to 48*a88e22b7SJung-uk Kim * contain a file documenting the changes Licensee made to create that Covered 49*a88e22b7SJung-uk Kim * Code and the date of any change. Licensee must include in that file the 50*a88e22b7SJung-uk Kim * documentation of any changes made by any predecessor Licensee. Licensee 51*a88e22b7SJung-uk Kim * must include a prominent statement that the modification is derived, 52*a88e22b7SJung-uk Kim * directly or indirectly, from Original Intel Code. 53*a88e22b7SJung-uk Kim * 54*a88e22b7SJung-uk Kim * 3.2. Redistribution of Source with no Rights to Further Distribute Source. 55*a88e22b7SJung-uk Kim * Redistribution of source code of any substantial portion of the Covered 56*a88e22b7SJung-uk Kim * Code or modification without rights to further distribute source must 57*a88e22b7SJung-uk Kim * include the following Disclaimer and Export Compliance provision in the 58*a88e22b7SJung-uk Kim * documentation and/or other materials provided with distribution. In 59*a88e22b7SJung-uk Kim * addition, Licensee may not authorize further sublicense of source of any 60*a88e22b7SJung-uk Kim * portion of the Covered Code, and must include terms to the effect that the 61*a88e22b7SJung-uk Kim * license from Licensee to its licensee is limited to the intellectual 62*a88e22b7SJung-uk Kim * property embodied in the software Licensee provides to its licensee, and 63*a88e22b7SJung-uk Kim * not to intellectual property embodied in modifications its licensee may 64*a88e22b7SJung-uk Kim * make. 65*a88e22b7SJung-uk Kim * 66*a88e22b7SJung-uk Kim * 3.3. Redistribution of Executable. Redistribution in executable form of any 67*a88e22b7SJung-uk Kim * substantial portion of the Covered Code or modification must reproduce the 68*a88e22b7SJung-uk Kim * above Copyright Notice, and the following Disclaimer and Export Compliance 69*a88e22b7SJung-uk Kim * provision in the documentation and/or other materials provided with the 70*a88e22b7SJung-uk Kim * distribution. 71*a88e22b7SJung-uk Kim * 72*a88e22b7SJung-uk Kim * 3.4. Intel retains all right, title, and interest in and to the Original 73*a88e22b7SJung-uk Kim * Intel Code. 74*a88e22b7SJung-uk Kim * 75*a88e22b7SJung-uk Kim * 3.5. Neither the name Intel nor any other trademark owned or controlled by 76*a88e22b7SJung-uk Kim * Intel shall be used in advertising or otherwise to promote the sale, use or 77*a88e22b7SJung-uk Kim * other dealings in products derived from or relating to the Covered Code 78*a88e22b7SJung-uk Kim * without prior written authorization from Intel. 79*a88e22b7SJung-uk Kim * 80*a88e22b7SJung-uk Kim * 4. Disclaimer and Export Compliance 81*a88e22b7SJung-uk Kim * 82*a88e22b7SJung-uk Kim * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED 83*a88e22b7SJung-uk Kim * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE 84*a88e22b7SJung-uk Kim * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE, 85*a88e22b7SJung-uk Kim * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY 86*a88e22b7SJung-uk Kim * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY 87*a88e22b7SJung-uk Kim * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A 88*a88e22b7SJung-uk Kim * PARTICULAR PURPOSE. 89*a88e22b7SJung-uk Kim * 90*a88e22b7SJung-uk Kim * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES 91*a88e22b7SJung-uk Kim * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR 92*a88e22b7SJung-uk Kim * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT, 93*a88e22b7SJung-uk Kim * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY 94*a88e22b7SJung-uk Kim * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL 95*a88e22b7SJung-uk Kim * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS 96*a88e22b7SJung-uk Kim * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY 97*a88e22b7SJung-uk Kim * LIMITED REMEDY. 98*a88e22b7SJung-uk Kim * 99*a88e22b7SJung-uk Kim * 4.3. Licensee shall not export, either directly or indirectly, any of this 100*a88e22b7SJung-uk Kim * software or system incorporating such software without first obtaining any 101*a88e22b7SJung-uk Kim * required license or other approval from the U. S. Department of Commerce or 102*a88e22b7SJung-uk Kim * any other agency or department of the United States Government. In the 103*a88e22b7SJung-uk Kim * event Licensee exports any such software from the United States or 104*a88e22b7SJung-uk Kim * re-exports any such software from a foreign destination, Licensee shall 105*a88e22b7SJung-uk Kim * ensure that the distribution and export/re-export of the software is in 106*a88e22b7SJung-uk Kim * compliance with all laws, regulations, orders, or other restrictions of the 107*a88e22b7SJung-uk Kim * U.S. Export Administration Regulations. Licensee agrees that neither it nor 108*a88e22b7SJung-uk Kim * any of its subsidiaries will export/re-export any technical data, process, 109*a88e22b7SJung-uk Kim * software, or service, directly or indirectly, to any country for which the 110*a88e22b7SJung-uk Kim * United States government or any agency thereof requires an export license, 111*a88e22b7SJung-uk Kim * other governmental approval, or letter of assurance, without first obtaining 112*a88e22b7SJung-uk Kim * such license, approval or letter. 113*a88e22b7SJung-uk Kim * 114*a88e22b7SJung-uk Kim *****************************************************************************/ 115*a88e22b7SJung-uk Kim 116*a88e22b7SJung-uk Kim #define __DTIO_C__ 117*a88e22b7SJung-uk Kim 118*a88e22b7SJung-uk Kim #include <contrib/dev/acpica/compiler/aslcompiler.h> 119*a88e22b7SJung-uk Kim #include <contrib/dev/acpica/compiler/dtcompiler.h> 120*a88e22b7SJung-uk Kim 121*a88e22b7SJung-uk Kim #define _COMPONENT DT_COMPILER 122*a88e22b7SJung-uk Kim ACPI_MODULE_NAME ("dtio") 123*a88e22b7SJung-uk Kim 124*a88e22b7SJung-uk Kim 125*a88e22b7SJung-uk Kim /* Local prototypes */ 126*a88e22b7SJung-uk Kim 127*a88e22b7SJung-uk Kim static char * 128*a88e22b7SJung-uk Kim DtTrim ( 129*a88e22b7SJung-uk Kim char *String); 130*a88e22b7SJung-uk Kim 131*a88e22b7SJung-uk Kim static void 132*a88e22b7SJung-uk Kim DtLinkField ( 133*a88e22b7SJung-uk Kim DT_FIELD *Field); 134*a88e22b7SJung-uk Kim 135*a88e22b7SJung-uk Kim static void 136*a88e22b7SJung-uk Kim DtParseLine ( 137*a88e22b7SJung-uk Kim char *LineBuffer, 138*a88e22b7SJung-uk Kim UINT32 Line, 139*a88e22b7SJung-uk Kim UINT32 Offset); 140*a88e22b7SJung-uk Kim 141*a88e22b7SJung-uk Kim static UINT32 142*a88e22b7SJung-uk Kim DtGetNextLine ( 143*a88e22b7SJung-uk Kim FILE *Handle); 144*a88e22b7SJung-uk Kim 145*a88e22b7SJung-uk Kim static void 146*a88e22b7SJung-uk Kim DtWriteBinary ( 147*a88e22b7SJung-uk Kim DT_SUBTABLE *Subtable, 148*a88e22b7SJung-uk Kim void *Context, 149*a88e22b7SJung-uk Kim void *ReturnValue); 150*a88e22b7SJung-uk Kim 151*a88e22b7SJung-uk Kim 152*a88e22b7SJung-uk Kim /* States for DtGetNextLine */ 153*a88e22b7SJung-uk Kim 154*a88e22b7SJung-uk Kim #define DT_NORMAL_TEXT 0 155*a88e22b7SJung-uk Kim #define DT_START_QUOTED_STRING 1 156*a88e22b7SJung-uk Kim #define DT_START_COMMENT 2 157*a88e22b7SJung-uk Kim #define DT_SLASH_ASTERISK_COMMENT 3 158*a88e22b7SJung-uk Kim #define DT_SLASH_SLASH_COMMENT 4 159*a88e22b7SJung-uk Kim #define DT_END_COMMENT 5 160*a88e22b7SJung-uk Kim 161*a88e22b7SJung-uk Kim UINT32 Gbl_NextLineOffset; 162*a88e22b7SJung-uk Kim 163*a88e22b7SJung-uk Kim 164*a88e22b7SJung-uk Kim /****************************************************************************** 165*a88e22b7SJung-uk Kim * 166*a88e22b7SJung-uk Kim * FUNCTION: DtTrim 167*a88e22b7SJung-uk Kim * 168*a88e22b7SJung-uk Kim * PARAMETERS: String - Current source code line to trim 169*a88e22b7SJung-uk Kim * 170*a88e22b7SJung-uk Kim * RETURN: Trimmed line. Must be freed by caller. 171*a88e22b7SJung-uk Kim * 172*a88e22b7SJung-uk Kim * DESCRIPTION: Trim left and right spaces 173*a88e22b7SJung-uk Kim * 174*a88e22b7SJung-uk Kim *****************************************************************************/ 175*a88e22b7SJung-uk Kim 176*a88e22b7SJung-uk Kim static char * 177*a88e22b7SJung-uk Kim DtTrim ( 178*a88e22b7SJung-uk Kim char *String) 179*a88e22b7SJung-uk Kim { 180*a88e22b7SJung-uk Kim char *Start; 181*a88e22b7SJung-uk Kim char *End; 182*a88e22b7SJung-uk Kim char *ReturnString; 183*a88e22b7SJung-uk Kim ACPI_SIZE Length; 184*a88e22b7SJung-uk Kim 185*a88e22b7SJung-uk Kim 186*a88e22b7SJung-uk Kim /* Skip lines that start with a space */ 187*a88e22b7SJung-uk Kim 188*a88e22b7SJung-uk Kim if (!ACPI_STRCMP (String, " ")) 189*a88e22b7SJung-uk Kim { 190*a88e22b7SJung-uk Kim ReturnString = UtLocalCalloc (1); 191*a88e22b7SJung-uk Kim return (ReturnString); 192*a88e22b7SJung-uk Kim } 193*a88e22b7SJung-uk Kim 194*a88e22b7SJung-uk Kim /* Setup pointers to start and end of input string */ 195*a88e22b7SJung-uk Kim 196*a88e22b7SJung-uk Kim Start = String; 197*a88e22b7SJung-uk Kim End = String + ACPI_STRLEN (String) - 1; 198*a88e22b7SJung-uk Kim 199*a88e22b7SJung-uk Kim /* Find first non-whitespace character */ 200*a88e22b7SJung-uk Kim 201*a88e22b7SJung-uk Kim while ((Start <= End) && ((*Start == ' ') || (*Start == '\t'))) 202*a88e22b7SJung-uk Kim { 203*a88e22b7SJung-uk Kim Start++; 204*a88e22b7SJung-uk Kim } 205*a88e22b7SJung-uk Kim 206*a88e22b7SJung-uk Kim /* Find last non-space character */ 207*a88e22b7SJung-uk Kim 208*a88e22b7SJung-uk Kim while (End >= Start) 209*a88e22b7SJung-uk Kim { 210*a88e22b7SJung-uk Kim if (*End == '\r' || *End == '\n') 211*a88e22b7SJung-uk Kim { 212*a88e22b7SJung-uk Kim End--; 213*a88e22b7SJung-uk Kim continue; 214*a88e22b7SJung-uk Kim } 215*a88e22b7SJung-uk Kim 216*a88e22b7SJung-uk Kim if (*End != ' ') 217*a88e22b7SJung-uk Kim { 218*a88e22b7SJung-uk Kim break; 219*a88e22b7SJung-uk Kim } 220*a88e22b7SJung-uk Kim 221*a88e22b7SJung-uk Kim End--; 222*a88e22b7SJung-uk Kim } 223*a88e22b7SJung-uk Kim 224*a88e22b7SJung-uk Kim /* Remove any quotes around the string */ 225*a88e22b7SJung-uk Kim 226*a88e22b7SJung-uk Kim if (*Start == '\"') 227*a88e22b7SJung-uk Kim { 228*a88e22b7SJung-uk Kim Start++; 229*a88e22b7SJung-uk Kim } 230*a88e22b7SJung-uk Kim if (*End == '\"') 231*a88e22b7SJung-uk Kim { 232*a88e22b7SJung-uk Kim End--; 233*a88e22b7SJung-uk Kim } 234*a88e22b7SJung-uk Kim 235*a88e22b7SJung-uk Kim /* Create the trimmed return string */ 236*a88e22b7SJung-uk Kim 237*a88e22b7SJung-uk Kim Length = ACPI_PTR_DIFF (End, Start) + 1; 238*a88e22b7SJung-uk Kim ReturnString = UtLocalCalloc (Length + 1); 239*a88e22b7SJung-uk Kim if (ACPI_STRLEN (Start)) 240*a88e22b7SJung-uk Kim { 241*a88e22b7SJung-uk Kim ACPI_STRNCPY (ReturnString, Start, Length); 242*a88e22b7SJung-uk Kim } 243*a88e22b7SJung-uk Kim 244*a88e22b7SJung-uk Kim ReturnString[Length] = 0; 245*a88e22b7SJung-uk Kim return (ReturnString); 246*a88e22b7SJung-uk Kim } 247*a88e22b7SJung-uk Kim 248*a88e22b7SJung-uk Kim 249*a88e22b7SJung-uk Kim /****************************************************************************** 250*a88e22b7SJung-uk Kim * 251*a88e22b7SJung-uk Kim * FUNCTION: DtLinkField 252*a88e22b7SJung-uk Kim * 253*a88e22b7SJung-uk Kim * PARAMETERS: Field - New field object to link 254*a88e22b7SJung-uk Kim * 255*a88e22b7SJung-uk Kim * RETURN: None 256*a88e22b7SJung-uk Kim * 257*a88e22b7SJung-uk Kim * DESCRIPTION: Link one field name and value to the list 258*a88e22b7SJung-uk Kim * 259*a88e22b7SJung-uk Kim *****************************************************************************/ 260*a88e22b7SJung-uk Kim 261*a88e22b7SJung-uk Kim static void 262*a88e22b7SJung-uk Kim DtLinkField ( 263*a88e22b7SJung-uk Kim DT_FIELD *Field) 264*a88e22b7SJung-uk Kim { 265*a88e22b7SJung-uk Kim DT_FIELD *Prev; 266*a88e22b7SJung-uk Kim DT_FIELD *Next; 267*a88e22b7SJung-uk Kim 268*a88e22b7SJung-uk Kim 269*a88e22b7SJung-uk Kim Prev = Next = Gbl_FieldList; 270*a88e22b7SJung-uk Kim 271*a88e22b7SJung-uk Kim while (Next) 272*a88e22b7SJung-uk Kim { 273*a88e22b7SJung-uk Kim Prev = Next; 274*a88e22b7SJung-uk Kim Next = Next->Next; 275*a88e22b7SJung-uk Kim } 276*a88e22b7SJung-uk Kim 277*a88e22b7SJung-uk Kim if (Prev) 278*a88e22b7SJung-uk Kim { 279*a88e22b7SJung-uk Kim Prev->Next = Field; 280*a88e22b7SJung-uk Kim } 281*a88e22b7SJung-uk Kim else 282*a88e22b7SJung-uk Kim { 283*a88e22b7SJung-uk Kim Gbl_FieldList = Field; 284*a88e22b7SJung-uk Kim } 285*a88e22b7SJung-uk Kim } 286*a88e22b7SJung-uk Kim 287*a88e22b7SJung-uk Kim 288*a88e22b7SJung-uk Kim /****************************************************************************** 289*a88e22b7SJung-uk Kim * 290*a88e22b7SJung-uk Kim * FUNCTION: DtParseLine 291*a88e22b7SJung-uk Kim * 292*a88e22b7SJung-uk Kim * PARAMETERS: LineBuffer - Current source code line 293*a88e22b7SJung-uk Kim * Line - Current line number in the source 294*a88e22b7SJung-uk Kim * Offset - Current byte offset of the line 295*a88e22b7SJung-uk Kim * 296*a88e22b7SJung-uk Kim * RETURN: None 297*a88e22b7SJung-uk Kim * 298*a88e22b7SJung-uk Kim * DESCRIPTION: Parse one source line 299*a88e22b7SJung-uk Kim * 300*a88e22b7SJung-uk Kim *****************************************************************************/ 301*a88e22b7SJung-uk Kim 302*a88e22b7SJung-uk Kim static void 303*a88e22b7SJung-uk Kim DtParseLine ( 304*a88e22b7SJung-uk Kim char *LineBuffer, 305*a88e22b7SJung-uk Kim UINT32 Line, 306*a88e22b7SJung-uk Kim UINT32 Offset) 307*a88e22b7SJung-uk Kim { 308*a88e22b7SJung-uk Kim char *Start; 309*a88e22b7SJung-uk Kim char *End; 310*a88e22b7SJung-uk Kim char *TmpName; 311*a88e22b7SJung-uk Kim char *TmpValue; 312*a88e22b7SJung-uk Kim char *Name; 313*a88e22b7SJung-uk Kim char *Value; 314*a88e22b7SJung-uk Kim char *Colon; 315*a88e22b7SJung-uk Kim UINT32 Length; 316*a88e22b7SJung-uk Kim DT_FIELD *Field; 317*a88e22b7SJung-uk Kim UINT32 Column; 318*a88e22b7SJung-uk Kim UINT32 NameColumn; 319*a88e22b7SJung-uk Kim 320*a88e22b7SJung-uk Kim 321*a88e22b7SJung-uk Kim if (!LineBuffer) 322*a88e22b7SJung-uk Kim { 323*a88e22b7SJung-uk Kim return; 324*a88e22b7SJung-uk Kim } 325*a88e22b7SJung-uk Kim 326*a88e22b7SJung-uk Kim Colon = strchr (LineBuffer, ':'); 327*a88e22b7SJung-uk Kim if (!Colon || *(Colon - 1) != ' ') 328*a88e22b7SJung-uk Kim { 329*a88e22b7SJung-uk Kim return; 330*a88e22b7SJung-uk Kim } 331*a88e22b7SJung-uk Kim 332*a88e22b7SJung-uk Kim Start = LineBuffer; 333*a88e22b7SJung-uk Kim End = Colon; 334*a88e22b7SJung-uk Kim 335*a88e22b7SJung-uk Kim while (Start < Colon) 336*a88e22b7SJung-uk Kim { 337*a88e22b7SJung-uk Kim if (*Start == ' ') 338*a88e22b7SJung-uk Kim { 339*a88e22b7SJung-uk Kim Start++; 340*a88e22b7SJung-uk Kim continue; 341*a88e22b7SJung-uk Kim } 342*a88e22b7SJung-uk Kim 343*a88e22b7SJung-uk Kim /* Found left bracket, go to the right bracket */ 344*a88e22b7SJung-uk Kim 345*a88e22b7SJung-uk Kim if (*Start == '[') 346*a88e22b7SJung-uk Kim { 347*a88e22b7SJung-uk Kim while (Start < Colon && *Start != ']') 348*a88e22b7SJung-uk Kim { 349*a88e22b7SJung-uk Kim Start++; 350*a88e22b7SJung-uk Kim } 351*a88e22b7SJung-uk Kim 352*a88e22b7SJung-uk Kim if (Start == Colon) 353*a88e22b7SJung-uk Kim { 354*a88e22b7SJung-uk Kim MYDEBUG ("ERROR: right bracket reaches colon position\n"); 355*a88e22b7SJung-uk Kim break; 356*a88e22b7SJung-uk Kim } 357*a88e22b7SJung-uk Kim 358*a88e22b7SJung-uk Kim Start++; 359*a88e22b7SJung-uk Kim continue; 360*a88e22b7SJung-uk Kim } 361*a88e22b7SJung-uk Kim 362*a88e22b7SJung-uk Kim break; 363*a88e22b7SJung-uk Kim } 364*a88e22b7SJung-uk Kim 365*a88e22b7SJung-uk Kim /* 366*a88e22b7SJung-uk Kim * There are two column values. One for the field name, 367*a88e22b7SJung-uk Kim * and one for the field value. 368*a88e22b7SJung-uk Kim */ 369*a88e22b7SJung-uk Kim Column = ACPI_PTR_DIFF (Colon, LineBuffer) + 3; 370*a88e22b7SJung-uk Kim NameColumn = ACPI_PTR_DIFF (Start, LineBuffer) + 1; 371*a88e22b7SJung-uk Kim 372*a88e22b7SJung-uk Kim Length = ACPI_PTR_DIFF (End, Start); 373*a88e22b7SJung-uk Kim 374*a88e22b7SJung-uk Kim TmpName = UtLocalCalloc (Length + 1); 375*a88e22b7SJung-uk Kim ACPI_STRNCPY (TmpName, Start, Length); 376*a88e22b7SJung-uk Kim Name = DtTrim (TmpName); 377*a88e22b7SJung-uk Kim ACPI_FREE (TmpName); 378*a88e22b7SJung-uk Kim 379*a88e22b7SJung-uk Kim Start = End = (Colon + 1); 380*a88e22b7SJung-uk Kim 381*a88e22b7SJung-uk Kim while (*End) 382*a88e22b7SJung-uk Kim { 383*a88e22b7SJung-uk Kim /* Found left quotation, go to the right quotation and break */ 384*a88e22b7SJung-uk Kim 385*a88e22b7SJung-uk Kim if (*End == '"') 386*a88e22b7SJung-uk Kim { 387*a88e22b7SJung-uk Kim End++; 388*a88e22b7SJung-uk Kim while (*End && *End != '"') 389*a88e22b7SJung-uk Kim { 390*a88e22b7SJung-uk Kim End++; 391*a88e22b7SJung-uk Kim } 392*a88e22b7SJung-uk Kim 393*a88e22b7SJung-uk Kim End++; 394*a88e22b7SJung-uk Kim break; 395*a88e22b7SJung-uk Kim } 396*a88e22b7SJung-uk Kim 397*a88e22b7SJung-uk Kim if (*End == '(' || 398*a88e22b7SJung-uk Kim *End == '<' || 399*a88e22b7SJung-uk Kim *End == '/') 400*a88e22b7SJung-uk Kim { 401*a88e22b7SJung-uk Kim break; 402*a88e22b7SJung-uk Kim } 403*a88e22b7SJung-uk Kim 404*a88e22b7SJung-uk Kim End++; 405*a88e22b7SJung-uk Kim } 406*a88e22b7SJung-uk Kim 407*a88e22b7SJung-uk Kim Length = ACPI_PTR_DIFF (End, Start); 408*a88e22b7SJung-uk Kim TmpValue = UtLocalCalloc (Length + 1); 409*a88e22b7SJung-uk Kim ACPI_STRNCPY (TmpValue, Start, Length); 410*a88e22b7SJung-uk Kim Value = DtTrim (TmpValue); 411*a88e22b7SJung-uk Kim ACPI_FREE (TmpValue); 412*a88e22b7SJung-uk Kim 413*a88e22b7SJung-uk Kim if (Name && Value) 414*a88e22b7SJung-uk Kim { 415*a88e22b7SJung-uk Kim Field = UtLocalCalloc (sizeof (DT_FIELD)); 416*a88e22b7SJung-uk Kim Field->Name = Name; 417*a88e22b7SJung-uk Kim Field->Value = Value; 418*a88e22b7SJung-uk Kim Field->Line = Line; 419*a88e22b7SJung-uk Kim Field->ByteOffset = Offset; 420*a88e22b7SJung-uk Kim Field->NameColumn = NameColumn; 421*a88e22b7SJung-uk Kim Field->Column = Column; 422*a88e22b7SJung-uk Kim 423*a88e22b7SJung-uk Kim DtLinkField (Field); 424*a88e22b7SJung-uk Kim } 425*a88e22b7SJung-uk Kim } 426*a88e22b7SJung-uk Kim 427*a88e22b7SJung-uk Kim 428*a88e22b7SJung-uk Kim /****************************************************************************** 429*a88e22b7SJung-uk Kim * 430*a88e22b7SJung-uk Kim * FUNCTION: DtGetNextLine 431*a88e22b7SJung-uk Kim * 432*a88e22b7SJung-uk Kim * PARAMETERS: Handle - Open file handle for the source file 433*a88e22b7SJung-uk Kim * 434*a88e22b7SJung-uk Kim * RETURN: Filled line buffer and offset of start-of-line (zero on EOF) 435*a88e22b7SJung-uk Kim * 436*a88e22b7SJung-uk Kim * DESCRIPTION: Get the next valid source line. Removes all comments. 437*a88e22b7SJung-uk Kim * Ignores empty lines. 438*a88e22b7SJung-uk Kim * 439*a88e22b7SJung-uk Kim * Handles both slash-asterisk and slash-slash comments. 440*a88e22b7SJung-uk Kim * Also, quoted strings, but no escapes within. 441*a88e22b7SJung-uk Kim * 442*a88e22b7SJung-uk Kim * Line is returned in Gbl_CurrentLineBuffer. 443*a88e22b7SJung-uk Kim * Line number in original file is returned in Gbl_CurrentLineNumber. 444*a88e22b7SJung-uk Kim * 445*a88e22b7SJung-uk Kim *****************************************************************************/ 446*a88e22b7SJung-uk Kim 447*a88e22b7SJung-uk Kim static UINT32 448*a88e22b7SJung-uk Kim DtGetNextLine ( 449*a88e22b7SJung-uk Kim FILE *Handle) 450*a88e22b7SJung-uk Kim { 451*a88e22b7SJung-uk Kim UINT32 State = DT_NORMAL_TEXT; 452*a88e22b7SJung-uk Kim UINT32 CurrentLineOffset; 453*a88e22b7SJung-uk Kim UINT32 i; 454*a88e22b7SJung-uk Kim char c; 455*a88e22b7SJung-uk Kim 456*a88e22b7SJung-uk Kim 457*a88e22b7SJung-uk Kim for (i = 0; i < ASL_LINE_BUFFER_SIZE;) 458*a88e22b7SJung-uk Kim { 459*a88e22b7SJung-uk Kim c = (char) getc (Handle); 460*a88e22b7SJung-uk Kim if (c == EOF) 461*a88e22b7SJung-uk Kim { 462*a88e22b7SJung-uk Kim return (0); 463*a88e22b7SJung-uk Kim } 464*a88e22b7SJung-uk Kim 465*a88e22b7SJung-uk Kim switch (State) 466*a88e22b7SJung-uk Kim { 467*a88e22b7SJung-uk Kim case DT_NORMAL_TEXT: 468*a88e22b7SJung-uk Kim 469*a88e22b7SJung-uk Kim /* Normal text, insert char into line buffer */ 470*a88e22b7SJung-uk Kim 471*a88e22b7SJung-uk Kim Gbl_CurrentLineBuffer[i] = c; 472*a88e22b7SJung-uk Kim switch (c) 473*a88e22b7SJung-uk Kim { 474*a88e22b7SJung-uk Kim case '/': 475*a88e22b7SJung-uk Kim State = DT_START_COMMENT; 476*a88e22b7SJung-uk Kim break; 477*a88e22b7SJung-uk Kim 478*a88e22b7SJung-uk Kim case '"': 479*a88e22b7SJung-uk Kim State = DT_START_QUOTED_STRING; 480*a88e22b7SJung-uk Kim i++; 481*a88e22b7SJung-uk Kim break; 482*a88e22b7SJung-uk Kim 483*a88e22b7SJung-uk Kim case '\n': 484*a88e22b7SJung-uk Kim CurrentLineOffset = Gbl_NextLineOffset; 485*a88e22b7SJung-uk Kim Gbl_NextLineOffset = (UINT32) ftell (Handle); 486*a88e22b7SJung-uk Kim Gbl_CurrentLineNumber++; 487*a88e22b7SJung-uk Kim 488*a88e22b7SJung-uk Kim /* Exit if line is complete. Ignore blank lines */ 489*a88e22b7SJung-uk Kim 490*a88e22b7SJung-uk Kim if (i != 0) 491*a88e22b7SJung-uk Kim { 492*a88e22b7SJung-uk Kim Gbl_CurrentLineBuffer[i+1] = 0; /* Terminate line */ 493*a88e22b7SJung-uk Kim return (CurrentLineOffset); 494*a88e22b7SJung-uk Kim } 495*a88e22b7SJung-uk Kim break; 496*a88e22b7SJung-uk Kim 497*a88e22b7SJung-uk Kim default: 498*a88e22b7SJung-uk Kim i++; 499*a88e22b7SJung-uk Kim break; 500*a88e22b7SJung-uk Kim } 501*a88e22b7SJung-uk Kim break; 502*a88e22b7SJung-uk Kim 503*a88e22b7SJung-uk Kim case DT_START_QUOTED_STRING: 504*a88e22b7SJung-uk Kim 505*a88e22b7SJung-uk Kim /* Insert raw chars until end of quoted string */ 506*a88e22b7SJung-uk Kim 507*a88e22b7SJung-uk Kim Gbl_CurrentLineBuffer[i] = c; 508*a88e22b7SJung-uk Kim i++; 509*a88e22b7SJung-uk Kim 510*a88e22b7SJung-uk Kim if (c == '"') 511*a88e22b7SJung-uk Kim { 512*a88e22b7SJung-uk Kim State = DT_NORMAL_TEXT; 513*a88e22b7SJung-uk Kim } 514*a88e22b7SJung-uk Kim break; 515*a88e22b7SJung-uk Kim 516*a88e22b7SJung-uk Kim case DT_START_COMMENT: 517*a88e22b7SJung-uk Kim 518*a88e22b7SJung-uk Kim /* Open comment if this character is an asterisk or slash */ 519*a88e22b7SJung-uk Kim 520*a88e22b7SJung-uk Kim switch (c) 521*a88e22b7SJung-uk Kim { 522*a88e22b7SJung-uk Kim case '*': 523*a88e22b7SJung-uk Kim State = DT_SLASH_ASTERISK_COMMENT; 524*a88e22b7SJung-uk Kim break; 525*a88e22b7SJung-uk Kim 526*a88e22b7SJung-uk Kim case '/': 527*a88e22b7SJung-uk Kim State = DT_SLASH_SLASH_COMMENT; 528*a88e22b7SJung-uk Kim break; 529*a88e22b7SJung-uk Kim 530*a88e22b7SJung-uk Kim default: /* Not a comment */ 531*a88e22b7SJung-uk Kim i++; /* Save the preceeding slash */ 532*a88e22b7SJung-uk Kim Gbl_CurrentLineBuffer[i] = c; 533*a88e22b7SJung-uk Kim i++; 534*a88e22b7SJung-uk Kim State = DT_NORMAL_TEXT; 535*a88e22b7SJung-uk Kim break; 536*a88e22b7SJung-uk Kim } 537*a88e22b7SJung-uk Kim break; 538*a88e22b7SJung-uk Kim 539*a88e22b7SJung-uk Kim case DT_SLASH_ASTERISK_COMMENT: 540*a88e22b7SJung-uk Kim 541*a88e22b7SJung-uk Kim /* Ignore chars until an asterisk-slash is found */ 542*a88e22b7SJung-uk Kim 543*a88e22b7SJung-uk Kim switch (c) 544*a88e22b7SJung-uk Kim { 545*a88e22b7SJung-uk Kim case '\n': 546*a88e22b7SJung-uk Kim Gbl_NextLineOffset = (UINT32) ftell (Handle); 547*a88e22b7SJung-uk Kim Gbl_CurrentLineNumber++; 548*a88e22b7SJung-uk Kim break; 549*a88e22b7SJung-uk Kim 550*a88e22b7SJung-uk Kim case '*': 551*a88e22b7SJung-uk Kim State = DT_END_COMMENT; 552*a88e22b7SJung-uk Kim break; 553*a88e22b7SJung-uk Kim 554*a88e22b7SJung-uk Kim default: 555*a88e22b7SJung-uk Kim break; 556*a88e22b7SJung-uk Kim } 557*a88e22b7SJung-uk Kim break; 558*a88e22b7SJung-uk Kim 559*a88e22b7SJung-uk Kim case DT_SLASH_SLASH_COMMENT: 560*a88e22b7SJung-uk Kim 561*a88e22b7SJung-uk Kim /* Ignore chars until end-of-line */ 562*a88e22b7SJung-uk Kim 563*a88e22b7SJung-uk Kim if (c == '\n') 564*a88e22b7SJung-uk Kim { 565*a88e22b7SJung-uk Kim /* We will exit via the NORMAL_TEXT path */ 566*a88e22b7SJung-uk Kim 567*a88e22b7SJung-uk Kim ungetc (c, Handle); 568*a88e22b7SJung-uk Kim State = DT_NORMAL_TEXT; 569*a88e22b7SJung-uk Kim } 570*a88e22b7SJung-uk Kim break; 571*a88e22b7SJung-uk Kim 572*a88e22b7SJung-uk Kim case DT_END_COMMENT: 573*a88e22b7SJung-uk Kim 574*a88e22b7SJung-uk Kim /* End comment if this char is a slash */ 575*a88e22b7SJung-uk Kim 576*a88e22b7SJung-uk Kim switch (c) 577*a88e22b7SJung-uk Kim { 578*a88e22b7SJung-uk Kim case '/': 579*a88e22b7SJung-uk Kim State = DT_NORMAL_TEXT; 580*a88e22b7SJung-uk Kim break; 581*a88e22b7SJung-uk Kim 582*a88e22b7SJung-uk Kim default: 583*a88e22b7SJung-uk Kim State = DT_SLASH_ASTERISK_COMMENT; 584*a88e22b7SJung-uk Kim break; 585*a88e22b7SJung-uk Kim } 586*a88e22b7SJung-uk Kim break; 587*a88e22b7SJung-uk Kim 588*a88e22b7SJung-uk Kim default: 589*a88e22b7SJung-uk Kim DtFatal (ASL_MSG_COMPILER_INTERNAL, NULL, "Unknown input state"); 590*a88e22b7SJung-uk Kim return (0); 591*a88e22b7SJung-uk Kim } 592*a88e22b7SJung-uk Kim } 593*a88e22b7SJung-uk Kim 594*a88e22b7SJung-uk Kim printf ("ERROR - Input line is too long (max %u)\n", ASL_LINE_BUFFER_SIZE); 595*a88e22b7SJung-uk Kim return (0); 596*a88e22b7SJung-uk Kim } 597*a88e22b7SJung-uk Kim 598*a88e22b7SJung-uk Kim 599*a88e22b7SJung-uk Kim /****************************************************************************** 600*a88e22b7SJung-uk Kim * 601*a88e22b7SJung-uk Kim * FUNCTION: DtScanFile 602*a88e22b7SJung-uk Kim * 603*a88e22b7SJung-uk Kim * PARAMETERS: Handle - Open file handle for the source file 604*a88e22b7SJung-uk Kim * 605*a88e22b7SJung-uk Kim * RETURN: Pointer to start of the constructed parse tree. 606*a88e22b7SJung-uk Kim * 607*a88e22b7SJung-uk Kim * DESCRIPTION: Scan source file, link all field names and values 608*a88e22b7SJung-uk Kim * to the global parse tree: Gbl_FieldList 609*a88e22b7SJung-uk Kim * 610*a88e22b7SJung-uk Kim *****************************************************************************/ 611*a88e22b7SJung-uk Kim 612*a88e22b7SJung-uk Kim DT_FIELD * 613*a88e22b7SJung-uk Kim DtScanFile ( 614*a88e22b7SJung-uk Kim FILE *Handle) 615*a88e22b7SJung-uk Kim { 616*a88e22b7SJung-uk Kim UINT32 Offset; 617*a88e22b7SJung-uk Kim 618*a88e22b7SJung-uk Kim 619*a88e22b7SJung-uk Kim ACPI_FUNCTION_NAME (DtScanFile); 620*a88e22b7SJung-uk Kim 621*a88e22b7SJung-uk Kim 622*a88e22b7SJung-uk Kim /* Get the file size */ 623*a88e22b7SJung-uk Kim 624*a88e22b7SJung-uk Kim Gbl_InputByteCount = DtGetFileSize (Handle); 625*a88e22b7SJung-uk Kim 626*a88e22b7SJung-uk Kim Gbl_CurrentLineNumber = 0; 627*a88e22b7SJung-uk Kim Gbl_CurrentLineOffset = 0; 628*a88e22b7SJung-uk Kim Gbl_NextLineOffset = 0; 629*a88e22b7SJung-uk Kim 630*a88e22b7SJung-uk Kim /* Scan line-by-line */ 631*a88e22b7SJung-uk Kim 632*a88e22b7SJung-uk Kim while ((Offset = DtGetNextLine (Handle))) 633*a88e22b7SJung-uk Kim { 634*a88e22b7SJung-uk Kim ACPI_DEBUG_PRINT ((ACPI_DB_PARSE, "Line %2.2u/%4.4X - %s", 635*a88e22b7SJung-uk Kim Gbl_CurrentLineNumber, Offset, Gbl_CurrentLineBuffer)); 636*a88e22b7SJung-uk Kim 637*a88e22b7SJung-uk Kim DtParseLine (Gbl_CurrentLineBuffer, Gbl_CurrentLineNumber, Offset); 638*a88e22b7SJung-uk Kim } 639*a88e22b7SJung-uk Kim 640*a88e22b7SJung-uk Kim return (Gbl_FieldList); 641*a88e22b7SJung-uk Kim } 642*a88e22b7SJung-uk Kim 643*a88e22b7SJung-uk Kim 644*a88e22b7SJung-uk Kim /* 645*a88e22b7SJung-uk Kim * Output functions 646*a88e22b7SJung-uk Kim */ 647*a88e22b7SJung-uk Kim 648*a88e22b7SJung-uk Kim 649*a88e22b7SJung-uk Kim /****************************************************************************** 650*a88e22b7SJung-uk Kim * 651*a88e22b7SJung-uk Kim * FUNCTION: DtWriteBinary 652*a88e22b7SJung-uk Kim * 653*a88e22b7SJung-uk Kim * PARAMETERS: DT_WALK_CALLBACK 654*a88e22b7SJung-uk Kim * 655*a88e22b7SJung-uk Kim * RETURN: Status 656*a88e22b7SJung-uk Kim * 657*a88e22b7SJung-uk Kim * DESCRIPTION: Write one subtable of a binary ACPI table 658*a88e22b7SJung-uk Kim * 659*a88e22b7SJung-uk Kim *****************************************************************************/ 660*a88e22b7SJung-uk Kim 661*a88e22b7SJung-uk Kim static void 662*a88e22b7SJung-uk Kim DtWriteBinary ( 663*a88e22b7SJung-uk Kim DT_SUBTABLE *Subtable, 664*a88e22b7SJung-uk Kim void *Context, 665*a88e22b7SJung-uk Kim void *ReturnValue) 666*a88e22b7SJung-uk Kim { 667*a88e22b7SJung-uk Kim 668*a88e22b7SJung-uk Kim FlWriteFile (ASL_FILE_AML_OUTPUT, Subtable->Buffer, Subtable->Length); 669*a88e22b7SJung-uk Kim } 670*a88e22b7SJung-uk Kim 671*a88e22b7SJung-uk Kim 672*a88e22b7SJung-uk Kim /****************************************************************************** 673*a88e22b7SJung-uk Kim * 674*a88e22b7SJung-uk Kim * FUNCTION: DtOutputBinary 675*a88e22b7SJung-uk Kim * 676*a88e22b7SJung-uk Kim * PARAMETERS: 677*a88e22b7SJung-uk Kim * 678*a88e22b7SJung-uk Kim * RETURN: Status 679*a88e22b7SJung-uk Kim * 680*a88e22b7SJung-uk Kim * DESCRIPTION: Write entire binary ACPI table (result of compilation) 681*a88e22b7SJung-uk Kim * 682*a88e22b7SJung-uk Kim *****************************************************************************/ 683*a88e22b7SJung-uk Kim 684*a88e22b7SJung-uk Kim void 685*a88e22b7SJung-uk Kim DtOutputBinary ( 686*a88e22b7SJung-uk Kim DT_SUBTABLE *RootTable) 687*a88e22b7SJung-uk Kim { 688*a88e22b7SJung-uk Kim 689*a88e22b7SJung-uk Kim if (!RootTable) 690*a88e22b7SJung-uk Kim { 691*a88e22b7SJung-uk Kim return; 692*a88e22b7SJung-uk Kim } 693*a88e22b7SJung-uk Kim 694*a88e22b7SJung-uk Kim /* Walk the entire parse tree, emitting the binary data */ 695*a88e22b7SJung-uk Kim 696*a88e22b7SJung-uk Kim DtWalkTableTree (RootTable, DtWriteBinary, NULL, NULL); 697*a88e22b7SJung-uk Kim Gbl_TableLength = DtGetFileSize (Gbl_Files[ASL_FILE_AML_OUTPUT].Handle); 698*a88e22b7SJung-uk Kim } 699