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 7d244b227SJung-uk Kim /* 8d244b227SJung-uk Kim * Copyright (C) 2000 - 2011, Intel Corp. 9a88e22b7SJung-uk Kim * All rights reserved. 10a88e22b7SJung-uk Kim * 11d244b227SJung-uk Kim * Redistribution and use in source and binary forms, with or without 12d244b227SJung-uk Kim * modification, are permitted provided that the following conditions 13d244b227SJung-uk Kim * are met: 14d244b227SJung-uk Kim * 1. Redistributions of source code must retain the above copyright 15d244b227SJung-uk Kim * notice, this list of conditions, and the following disclaimer, 16d244b227SJung-uk Kim * without modification. 17d244b227SJung-uk Kim * 2. Redistributions in binary form must reproduce at minimum a disclaimer 18d244b227SJung-uk Kim * substantially similar to the "NO WARRANTY" disclaimer below 19d244b227SJung-uk Kim * ("Disclaimer") and any redistribution must be conditioned upon 20d244b227SJung-uk Kim * including a substantially similar Disclaimer requirement for further 21d244b227SJung-uk Kim * binary redistribution. 22d244b227SJung-uk Kim * 3. Neither the names of the above-listed copyright holders nor the names 23d244b227SJung-uk Kim * of any contributors may be used to endorse or promote products derived 24d244b227SJung-uk Kim * from this software without specific prior written permission. 25a88e22b7SJung-uk Kim * 26d244b227SJung-uk Kim * Alternatively, this software may be distributed under the terms of the 27d244b227SJung-uk Kim * GNU General Public License ("GPL") version 2 as published by the Free 28d244b227SJung-uk Kim * Software Foundation. 29a88e22b7SJung-uk Kim * 30d244b227SJung-uk Kim * NO WARRANTY 31d244b227SJung-uk Kim * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 32d244b227SJung-uk Kim * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 33d244b227SJung-uk Kim * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR 34d244b227SJung-uk Kim * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 35d244b227SJung-uk Kim * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 36d244b227SJung-uk Kim * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 37d244b227SJung-uk Kim * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 38d244b227SJung-uk Kim * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 39d244b227SJung-uk Kim * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 40d244b227SJung-uk Kim * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 41d244b227SJung-uk Kim * POSSIBILITY OF SUCH DAMAGES. 42d244b227SJung-uk Kim */ 43a88e22b7SJung-uk Kim 44a88e22b7SJung-uk Kim #define __DTIO_C__ 45a88e22b7SJung-uk Kim 46a88e22b7SJung-uk Kim #include <contrib/dev/acpica/compiler/aslcompiler.h> 47a88e22b7SJung-uk Kim #include <contrib/dev/acpica/compiler/dtcompiler.h> 48a88e22b7SJung-uk Kim 49a88e22b7SJung-uk Kim #define _COMPONENT DT_COMPILER 50a88e22b7SJung-uk Kim ACPI_MODULE_NAME ("dtio") 51a88e22b7SJung-uk Kim 52a88e22b7SJung-uk Kim 53a88e22b7SJung-uk Kim /* Local prototypes */ 54a88e22b7SJung-uk Kim 55a88e22b7SJung-uk Kim static char * 56a88e22b7SJung-uk Kim DtTrim ( 57a88e22b7SJung-uk Kim char *String); 58a88e22b7SJung-uk Kim 59a88e22b7SJung-uk Kim static void 60a88e22b7SJung-uk Kim DtLinkField ( 61a88e22b7SJung-uk Kim DT_FIELD *Field); 62a88e22b7SJung-uk Kim 63*dcbce41eSJung-uk Kim static void 64*dcbce41eSJung-uk Kim DtMergeField ( 65*dcbce41eSJung-uk Kim char *Value); 66*dcbce41eSJung-uk Kim 67d244b227SJung-uk Kim static ACPI_STATUS 68a88e22b7SJung-uk Kim DtParseLine ( 69a88e22b7SJung-uk Kim char *LineBuffer, 70a88e22b7SJung-uk Kim UINT32 Line, 71a88e22b7SJung-uk Kim UINT32 Offset); 72a88e22b7SJung-uk Kim 730b94ba42SJung-uk Kim UINT32 74a88e22b7SJung-uk Kim DtGetNextLine ( 75a88e22b7SJung-uk Kim FILE *Handle); 76a88e22b7SJung-uk Kim 77a88e22b7SJung-uk Kim static void 78a88e22b7SJung-uk Kim DtWriteBinary ( 79a88e22b7SJung-uk Kim DT_SUBTABLE *Subtable, 80a88e22b7SJung-uk Kim void *Context, 81a88e22b7SJung-uk Kim void *ReturnValue); 82a88e22b7SJung-uk Kim 83d244b227SJung-uk Kim static void 84d244b227SJung-uk Kim DtDumpBuffer ( 85d244b227SJung-uk Kim UINT32 FileId, 86d244b227SJung-uk Kim UINT8 *Buffer, 870b94ba42SJung-uk Kim UINT32 Offset, 88d244b227SJung-uk Kim UINT32 Length); 89a88e22b7SJung-uk Kim 900b94ba42SJung-uk Kim 91a88e22b7SJung-uk Kim /* States for DtGetNextLine */ 92a88e22b7SJung-uk Kim 93a88e22b7SJung-uk Kim #define DT_NORMAL_TEXT 0 94a88e22b7SJung-uk Kim #define DT_START_QUOTED_STRING 1 95a88e22b7SJung-uk Kim #define DT_START_COMMENT 2 96a88e22b7SJung-uk Kim #define DT_SLASH_ASTERISK_COMMENT 3 97a88e22b7SJung-uk Kim #define DT_SLASH_SLASH_COMMENT 4 98a88e22b7SJung-uk Kim #define DT_END_COMMENT 5 99a88e22b7SJung-uk Kim 10042fecd12SJung-uk Kim static UINT32 Gbl_NextLineOffset; 101a88e22b7SJung-uk Kim 102a88e22b7SJung-uk Kim 103a88e22b7SJung-uk Kim /****************************************************************************** 104a88e22b7SJung-uk Kim * 105a88e22b7SJung-uk Kim * FUNCTION: DtTrim 106a88e22b7SJung-uk Kim * 107a88e22b7SJung-uk Kim * PARAMETERS: String - Current source code line to trim 108a88e22b7SJung-uk Kim * 109a88e22b7SJung-uk Kim * RETURN: Trimmed line. Must be freed by caller. 110a88e22b7SJung-uk Kim * 111a88e22b7SJung-uk Kim * DESCRIPTION: Trim left and right spaces 112a88e22b7SJung-uk Kim * 113a88e22b7SJung-uk Kim *****************************************************************************/ 114a88e22b7SJung-uk Kim 115a88e22b7SJung-uk Kim static char * 116a88e22b7SJung-uk Kim DtTrim ( 117a88e22b7SJung-uk Kim char *String) 118a88e22b7SJung-uk Kim { 119a88e22b7SJung-uk Kim char *Start; 120a88e22b7SJung-uk Kim char *End; 121a88e22b7SJung-uk Kim char *ReturnString; 122a88e22b7SJung-uk Kim ACPI_SIZE Length; 123a88e22b7SJung-uk Kim 124a88e22b7SJung-uk Kim 125a88e22b7SJung-uk Kim /* Skip lines that start with a space */ 126a88e22b7SJung-uk Kim 127a88e22b7SJung-uk Kim if (!ACPI_STRCMP (String, " ")) 128a88e22b7SJung-uk Kim { 129a88e22b7SJung-uk Kim ReturnString = UtLocalCalloc (1); 130a88e22b7SJung-uk Kim return (ReturnString); 131a88e22b7SJung-uk Kim } 132a88e22b7SJung-uk Kim 133a88e22b7SJung-uk Kim /* Setup pointers to start and end of input string */ 134a88e22b7SJung-uk Kim 135a88e22b7SJung-uk Kim Start = String; 136a88e22b7SJung-uk Kim End = String + ACPI_STRLEN (String) - 1; 137a88e22b7SJung-uk Kim 138a88e22b7SJung-uk Kim /* Find first non-whitespace character */ 139a88e22b7SJung-uk Kim 140a88e22b7SJung-uk Kim while ((Start <= End) && ((*Start == ' ') || (*Start == '\t'))) 141a88e22b7SJung-uk Kim { 142a88e22b7SJung-uk Kim Start++; 143a88e22b7SJung-uk Kim } 144a88e22b7SJung-uk Kim 145a88e22b7SJung-uk Kim /* Find last non-space character */ 146a88e22b7SJung-uk Kim 147a88e22b7SJung-uk Kim while (End >= Start) 148a88e22b7SJung-uk Kim { 149a88e22b7SJung-uk Kim if (*End == '\r' || *End == '\n') 150a88e22b7SJung-uk Kim { 151a88e22b7SJung-uk Kim End--; 152a88e22b7SJung-uk Kim continue; 153a88e22b7SJung-uk Kim } 154a88e22b7SJung-uk Kim 155a88e22b7SJung-uk Kim if (*End != ' ') 156a88e22b7SJung-uk Kim { 157a88e22b7SJung-uk Kim break; 158a88e22b7SJung-uk Kim } 159a88e22b7SJung-uk Kim 160a88e22b7SJung-uk Kim End--; 161a88e22b7SJung-uk Kim } 162a88e22b7SJung-uk Kim 163a88e22b7SJung-uk Kim /* Remove any quotes around the string */ 164a88e22b7SJung-uk Kim 165a88e22b7SJung-uk Kim if (*Start == '\"') 166a88e22b7SJung-uk Kim { 167a88e22b7SJung-uk Kim Start++; 168a88e22b7SJung-uk Kim } 169a88e22b7SJung-uk Kim if (*End == '\"') 170a88e22b7SJung-uk Kim { 171a88e22b7SJung-uk Kim End--; 172a88e22b7SJung-uk Kim } 173a88e22b7SJung-uk Kim 174a88e22b7SJung-uk Kim /* Create the trimmed return string */ 175a88e22b7SJung-uk Kim 176a88e22b7SJung-uk Kim Length = ACPI_PTR_DIFF (End, Start) + 1; 177a88e22b7SJung-uk Kim ReturnString = UtLocalCalloc (Length + 1); 178a88e22b7SJung-uk Kim if (ACPI_STRLEN (Start)) 179a88e22b7SJung-uk Kim { 180a88e22b7SJung-uk Kim ACPI_STRNCPY (ReturnString, Start, Length); 181a88e22b7SJung-uk Kim } 182a88e22b7SJung-uk Kim 183a88e22b7SJung-uk Kim ReturnString[Length] = 0; 184a88e22b7SJung-uk Kim return (ReturnString); 185a88e22b7SJung-uk Kim } 186a88e22b7SJung-uk Kim 187a88e22b7SJung-uk Kim 188a88e22b7SJung-uk Kim /****************************************************************************** 189a88e22b7SJung-uk Kim * 190a88e22b7SJung-uk Kim * FUNCTION: DtLinkField 191a88e22b7SJung-uk Kim * 192a88e22b7SJung-uk Kim * PARAMETERS: Field - New field object to link 193a88e22b7SJung-uk Kim * 194a88e22b7SJung-uk Kim * RETURN: None 195a88e22b7SJung-uk Kim * 196a88e22b7SJung-uk Kim * DESCRIPTION: Link one field name and value to the list 197a88e22b7SJung-uk Kim * 198a88e22b7SJung-uk Kim *****************************************************************************/ 199a88e22b7SJung-uk Kim 200a88e22b7SJung-uk Kim static void 201a88e22b7SJung-uk Kim DtLinkField ( 202a88e22b7SJung-uk Kim DT_FIELD *Field) 203a88e22b7SJung-uk Kim { 204a88e22b7SJung-uk Kim DT_FIELD *Prev; 205a88e22b7SJung-uk Kim DT_FIELD *Next; 206a88e22b7SJung-uk Kim 207a88e22b7SJung-uk Kim 208a88e22b7SJung-uk Kim Prev = Next = Gbl_FieldList; 209a88e22b7SJung-uk Kim 210a88e22b7SJung-uk Kim while (Next) 211a88e22b7SJung-uk Kim { 212a88e22b7SJung-uk Kim Prev = Next; 213a88e22b7SJung-uk Kim Next = Next->Next; 214a88e22b7SJung-uk Kim } 215a88e22b7SJung-uk Kim 216a88e22b7SJung-uk Kim if (Prev) 217a88e22b7SJung-uk Kim { 218a88e22b7SJung-uk Kim Prev->Next = Field; 219a88e22b7SJung-uk Kim } 220a88e22b7SJung-uk Kim else 221a88e22b7SJung-uk Kim { 222a88e22b7SJung-uk Kim Gbl_FieldList = Field; 223a88e22b7SJung-uk Kim } 224a88e22b7SJung-uk Kim } 225a88e22b7SJung-uk Kim 226a88e22b7SJung-uk Kim 227a88e22b7SJung-uk Kim /****************************************************************************** 228a88e22b7SJung-uk Kim * 229*dcbce41eSJung-uk Kim * FUNCTION: DtMergeField 230*dcbce41eSJung-uk Kim * 231*dcbce41eSJung-uk Kim * PARAMETERS: Value - Merge this line into previous one 232*dcbce41eSJung-uk Kim * 233*dcbce41eSJung-uk Kim * RETURN: None 234*dcbce41eSJung-uk Kim * 235*dcbce41eSJung-uk Kim * DESCRIPTION: Merge a field value to the previous one, 236*dcbce41eSJung-uk Kim * probably for a multi-line buffer definition. 237*dcbce41eSJung-uk Kim * 238*dcbce41eSJung-uk Kim *****************************************************************************/ 239*dcbce41eSJung-uk Kim 240*dcbce41eSJung-uk Kim static void 241*dcbce41eSJung-uk Kim DtMergeField ( 242*dcbce41eSJung-uk Kim char *Value) 243*dcbce41eSJung-uk Kim { 244*dcbce41eSJung-uk Kim DT_FIELD *Prev; 245*dcbce41eSJung-uk Kim DT_FIELD *Next; 246*dcbce41eSJung-uk Kim char *NewValue; 247*dcbce41eSJung-uk Kim UINT32 PrevLength; 248*dcbce41eSJung-uk Kim UINT32 ThisLength; 249*dcbce41eSJung-uk Kim 250*dcbce41eSJung-uk Kim 251*dcbce41eSJung-uk Kim Prev = Next = Gbl_FieldList; 252*dcbce41eSJung-uk Kim 253*dcbce41eSJung-uk Kim while (Next) 254*dcbce41eSJung-uk Kim { 255*dcbce41eSJung-uk Kim Prev = Next; 256*dcbce41eSJung-uk Kim Next = Next->Next; 257*dcbce41eSJung-uk Kim } 258*dcbce41eSJung-uk Kim 259*dcbce41eSJung-uk Kim if (Prev) 260*dcbce41eSJung-uk Kim { 261*dcbce41eSJung-uk Kim PrevLength = ACPI_STRLEN (Prev->Value); 262*dcbce41eSJung-uk Kim ThisLength = ACPI_STRLEN (Value); 263*dcbce41eSJung-uk Kim 264*dcbce41eSJung-uk Kim /* Add two for: separator + NULL terminator */ 265*dcbce41eSJung-uk Kim 266*dcbce41eSJung-uk Kim NewValue = UtLocalCalloc (PrevLength + ThisLength + 2); 267*dcbce41eSJung-uk Kim ACPI_STRNCPY (NewValue, Prev->Value, PrevLength); 268*dcbce41eSJung-uk Kim NewValue[PrevLength] = ' '; 269*dcbce41eSJung-uk Kim 270*dcbce41eSJung-uk Kim ACPI_STRNCPY ((NewValue + PrevLength + 1), Value, ThisLength); 271*dcbce41eSJung-uk Kim ACPI_FREE (Prev->Value); 272*dcbce41eSJung-uk Kim Prev->Value = NewValue; 273*dcbce41eSJung-uk Kim } 274*dcbce41eSJung-uk Kim } 275*dcbce41eSJung-uk Kim 276*dcbce41eSJung-uk Kim 277*dcbce41eSJung-uk Kim /****************************************************************************** 278*dcbce41eSJung-uk Kim * 279a88e22b7SJung-uk Kim * FUNCTION: DtParseLine 280a88e22b7SJung-uk Kim * 281a88e22b7SJung-uk Kim * PARAMETERS: LineBuffer - Current source code line 282a88e22b7SJung-uk Kim * Line - Current line number in the source 283a88e22b7SJung-uk Kim * Offset - Current byte offset of the line 284a88e22b7SJung-uk Kim * 285d244b227SJung-uk Kim * RETURN: Status 286a88e22b7SJung-uk Kim * 287a88e22b7SJung-uk Kim * DESCRIPTION: Parse one source line 288a88e22b7SJung-uk Kim * 289a88e22b7SJung-uk Kim *****************************************************************************/ 290a88e22b7SJung-uk Kim 291d244b227SJung-uk Kim static ACPI_STATUS 292a88e22b7SJung-uk Kim DtParseLine ( 293a88e22b7SJung-uk Kim char *LineBuffer, 294a88e22b7SJung-uk Kim UINT32 Line, 295a88e22b7SJung-uk Kim UINT32 Offset) 296a88e22b7SJung-uk Kim { 297a88e22b7SJung-uk Kim char *Start; 298a88e22b7SJung-uk Kim char *End; 299a88e22b7SJung-uk Kim char *TmpName; 300a88e22b7SJung-uk Kim char *TmpValue; 301a88e22b7SJung-uk Kim char *Name; 302a88e22b7SJung-uk Kim char *Value; 303a88e22b7SJung-uk Kim char *Colon; 304a88e22b7SJung-uk Kim UINT32 Length; 305a88e22b7SJung-uk Kim DT_FIELD *Field; 306a88e22b7SJung-uk Kim UINT32 Column; 307a88e22b7SJung-uk Kim UINT32 NameColumn; 308a88e22b7SJung-uk Kim 309a88e22b7SJung-uk Kim 310a88e22b7SJung-uk Kim if (!LineBuffer) 311a88e22b7SJung-uk Kim { 312d244b227SJung-uk Kim return (AE_OK); 313d244b227SJung-uk Kim } 314d244b227SJung-uk Kim 315d244b227SJung-uk Kim /* All lines after "Raw Table Data" are ingored */ 316d244b227SJung-uk Kim 317d244b227SJung-uk Kim if (strstr (LineBuffer, ACPI_RAW_TABLE_DATA_HEADER)) 318d244b227SJung-uk Kim { 319d244b227SJung-uk Kim return (AE_NOT_FOUND); 320a88e22b7SJung-uk Kim } 321a88e22b7SJung-uk Kim 322a88e22b7SJung-uk Kim Colon = strchr (LineBuffer, ':'); 323d244b227SJung-uk Kim if (!Colon) 324a88e22b7SJung-uk Kim { 325d244b227SJung-uk Kim return (AE_OK); 326a88e22b7SJung-uk Kim } 327a88e22b7SJung-uk Kim 328a88e22b7SJung-uk Kim Start = LineBuffer; 329a88e22b7SJung-uk Kim End = Colon; 330a88e22b7SJung-uk Kim 331a88e22b7SJung-uk Kim while (Start < Colon) 332a88e22b7SJung-uk Kim { 333a88e22b7SJung-uk Kim if (*Start == ' ') 334a88e22b7SJung-uk Kim { 335a88e22b7SJung-uk Kim Start++; 336a88e22b7SJung-uk Kim continue; 337a88e22b7SJung-uk Kim } 338a88e22b7SJung-uk Kim 339a88e22b7SJung-uk Kim /* Found left bracket, go to the right bracket */ 340a88e22b7SJung-uk Kim 341a88e22b7SJung-uk Kim if (*Start == '[') 342a88e22b7SJung-uk Kim { 343a88e22b7SJung-uk Kim while (Start < Colon && *Start != ']') 344a88e22b7SJung-uk Kim { 345a88e22b7SJung-uk Kim Start++; 346a88e22b7SJung-uk Kim } 347a88e22b7SJung-uk Kim 348a88e22b7SJung-uk Kim if (Start == Colon) 349a88e22b7SJung-uk Kim { 350a88e22b7SJung-uk Kim break; 351a88e22b7SJung-uk Kim } 352a88e22b7SJung-uk Kim 353a88e22b7SJung-uk Kim Start++; 354a88e22b7SJung-uk Kim continue; 355a88e22b7SJung-uk Kim } 356a88e22b7SJung-uk Kim 357a88e22b7SJung-uk Kim break; 358a88e22b7SJung-uk Kim } 359a88e22b7SJung-uk Kim 360a88e22b7SJung-uk Kim /* 361a88e22b7SJung-uk Kim * There are two column values. One for the field name, 362a88e22b7SJung-uk Kim * and one for the field value. 363a88e22b7SJung-uk Kim */ 364a88e22b7SJung-uk Kim Column = ACPI_PTR_DIFF (Colon, LineBuffer) + 3; 365a88e22b7SJung-uk Kim NameColumn = ACPI_PTR_DIFF (Start, LineBuffer) + 1; 366a88e22b7SJung-uk Kim 367a88e22b7SJung-uk Kim Length = ACPI_PTR_DIFF (End, Start); 368a88e22b7SJung-uk Kim 369a88e22b7SJung-uk Kim TmpName = UtLocalCalloc (Length + 1); 370a88e22b7SJung-uk Kim ACPI_STRNCPY (TmpName, Start, Length); 371a88e22b7SJung-uk Kim Name = DtTrim (TmpName); 372a88e22b7SJung-uk Kim ACPI_FREE (TmpName); 373a88e22b7SJung-uk Kim 374a88e22b7SJung-uk Kim Start = End = (Colon + 1); 375a88e22b7SJung-uk Kim 376a88e22b7SJung-uk Kim while (*End) 377a88e22b7SJung-uk Kim { 378a88e22b7SJung-uk Kim /* Found left quotation, go to the right quotation and break */ 379a88e22b7SJung-uk Kim 380a88e22b7SJung-uk Kim if (*End == '"') 381a88e22b7SJung-uk Kim { 382a88e22b7SJung-uk Kim End++; 3830b94ba42SJung-uk Kim while (*End && (*End != '"')) 384a88e22b7SJung-uk Kim { 385a88e22b7SJung-uk Kim End++; 386a88e22b7SJung-uk Kim } 387a88e22b7SJung-uk Kim 388a88e22b7SJung-uk Kim End++; 389a88e22b7SJung-uk Kim break; 390a88e22b7SJung-uk Kim } 391a88e22b7SJung-uk Kim 3920b94ba42SJung-uk Kim /* 3930b94ba42SJung-uk Kim * Special "comment" fields at line end, ignore them. 3940b94ba42SJung-uk Kim * Note: normal slash-slash and slash-asterisk comments are 3950b94ba42SJung-uk Kim * stripped already by the DtGetNextLine parser. 3960b94ba42SJung-uk Kim * 3970b94ba42SJung-uk Kim * TBD: Perhaps DtGetNextLine should parse the following type 3980b94ba42SJung-uk Kim * of comments also. 3990b94ba42SJung-uk Kim */ 400a88e22b7SJung-uk Kim if (*End == '(' || 4010b94ba42SJung-uk Kim *End == '<') 402a88e22b7SJung-uk Kim { 403a88e22b7SJung-uk Kim break; 404a88e22b7SJung-uk Kim } 405a88e22b7SJung-uk Kim 406a88e22b7SJung-uk Kim End++; 407a88e22b7SJung-uk Kim } 408a88e22b7SJung-uk Kim 409a88e22b7SJung-uk Kim Length = ACPI_PTR_DIFF (End, Start); 410a88e22b7SJung-uk Kim TmpValue = UtLocalCalloc (Length + 1); 411*dcbce41eSJung-uk Kim 412a88e22b7SJung-uk Kim ACPI_STRNCPY (TmpValue, Start, Length); 413a88e22b7SJung-uk Kim Value = DtTrim (TmpValue); 414a88e22b7SJung-uk Kim ACPI_FREE (TmpValue); 415a88e22b7SJung-uk Kim 416*dcbce41eSJung-uk Kim if (ACPI_STRLEN (Name) && Value) 417a88e22b7SJung-uk Kim { 418a88e22b7SJung-uk Kim Field = UtLocalCalloc (sizeof (DT_FIELD)); 419a88e22b7SJung-uk Kim Field->Name = Name; 420a88e22b7SJung-uk Kim Field->Value = Value; 421a88e22b7SJung-uk Kim Field->Line = Line; 422a88e22b7SJung-uk Kim Field->ByteOffset = Offset; 423a88e22b7SJung-uk Kim Field->NameColumn = NameColumn; 424a88e22b7SJung-uk Kim Field->Column = Column; 425a88e22b7SJung-uk Kim 426a88e22b7SJung-uk Kim DtLinkField (Field); 427a88e22b7SJung-uk Kim } 428*dcbce41eSJung-uk Kim else if (!ACPI_STRLEN (Name)) 429*dcbce41eSJung-uk Kim { 430*dcbce41eSJung-uk Kim /* Handle multi-line buffers (length > 16) */ 431*dcbce41eSJung-uk Kim 432*dcbce41eSJung-uk Kim DtMergeField (Value); 433*dcbce41eSJung-uk Kim } 434*dcbce41eSJung-uk Kim else 435*dcbce41eSJung-uk Kim { 436*dcbce41eSJung-uk Kim ACPI_FREE (Name); 437*dcbce41eSJung-uk Kim ACPI_FREE (Value); 438*dcbce41eSJung-uk Kim } 439d244b227SJung-uk Kim 440d244b227SJung-uk Kim return (AE_OK); 441a88e22b7SJung-uk Kim } 442a88e22b7SJung-uk Kim 443a88e22b7SJung-uk Kim 444a88e22b7SJung-uk Kim /****************************************************************************** 445a88e22b7SJung-uk Kim * 446a88e22b7SJung-uk Kim * FUNCTION: DtGetNextLine 447a88e22b7SJung-uk Kim * 448a88e22b7SJung-uk Kim * PARAMETERS: Handle - Open file handle for the source file 449a88e22b7SJung-uk Kim * 450a88e22b7SJung-uk Kim * RETURN: Filled line buffer and offset of start-of-line (zero on EOF) 451a88e22b7SJung-uk Kim * 452a88e22b7SJung-uk Kim * DESCRIPTION: Get the next valid source line. Removes all comments. 453a88e22b7SJung-uk Kim * Ignores empty lines. 454a88e22b7SJung-uk Kim * 455a88e22b7SJung-uk Kim * Handles both slash-asterisk and slash-slash comments. 456a88e22b7SJung-uk Kim * Also, quoted strings, but no escapes within. 457a88e22b7SJung-uk Kim * 458a88e22b7SJung-uk Kim * Line is returned in Gbl_CurrentLineBuffer. 459a88e22b7SJung-uk Kim * Line number in original file is returned in Gbl_CurrentLineNumber. 460a88e22b7SJung-uk Kim * 461a88e22b7SJung-uk Kim *****************************************************************************/ 462a88e22b7SJung-uk Kim 4630b94ba42SJung-uk Kim UINT32 464a88e22b7SJung-uk Kim DtGetNextLine ( 465a88e22b7SJung-uk Kim FILE *Handle) 466a88e22b7SJung-uk Kim { 467a88e22b7SJung-uk Kim UINT32 State = DT_NORMAL_TEXT; 468a88e22b7SJung-uk Kim UINT32 CurrentLineOffset; 469a88e22b7SJung-uk Kim UINT32 i; 470a88e22b7SJung-uk Kim char c; 471a88e22b7SJung-uk Kim 472a88e22b7SJung-uk Kim 473a88e22b7SJung-uk Kim for (i = 0; i < ASL_LINE_BUFFER_SIZE;) 474a88e22b7SJung-uk Kim { 475a88e22b7SJung-uk Kim c = (char) getc (Handle); 476a88e22b7SJung-uk Kim if (c == EOF) 477a88e22b7SJung-uk Kim { 4780b94ba42SJung-uk Kim switch (State) 4790b94ba42SJung-uk Kim { 4800b94ba42SJung-uk Kim case DT_START_QUOTED_STRING: 4810b94ba42SJung-uk Kim case DT_SLASH_ASTERISK_COMMENT: 4820b94ba42SJung-uk Kim case DT_SLASH_SLASH_COMMENT: 4830b94ba42SJung-uk Kim 4840b94ba42SJung-uk Kim AcpiOsPrintf ("**** EOF within comment/string %u\n", State); 4850b94ba42SJung-uk Kim break; 4860b94ba42SJung-uk Kim 4870b94ba42SJung-uk Kim default: 4880b94ba42SJung-uk Kim break; 4890b94ba42SJung-uk Kim } 4900b94ba42SJung-uk Kim 491a88e22b7SJung-uk Kim return (0); 492a88e22b7SJung-uk Kim } 493a88e22b7SJung-uk Kim 494a88e22b7SJung-uk Kim switch (State) 495a88e22b7SJung-uk Kim { 496a88e22b7SJung-uk Kim case DT_NORMAL_TEXT: 497a88e22b7SJung-uk Kim 498a88e22b7SJung-uk Kim /* Normal text, insert char into line buffer */ 499a88e22b7SJung-uk Kim 500a88e22b7SJung-uk Kim Gbl_CurrentLineBuffer[i] = c; 501a88e22b7SJung-uk Kim switch (c) 502a88e22b7SJung-uk Kim { 503a88e22b7SJung-uk Kim case '/': 504a88e22b7SJung-uk Kim State = DT_START_COMMENT; 505a88e22b7SJung-uk Kim break; 506a88e22b7SJung-uk Kim 507a88e22b7SJung-uk Kim case '"': 508a88e22b7SJung-uk Kim State = DT_START_QUOTED_STRING; 509a88e22b7SJung-uk Kim i++; 510a88e22b7SJung-uk Kim break; 511a88e22b7SJung-uk Kim 512a88e22b7SJung-uk Kim case '\n': 513a88e22b7SJung-uk Kim CurrentLineOffset = Gbl_NextLineOffset; 514a88e22b7SJung-uk Kim Gbl_NextLineOffset = (UINT32) ftell (Handle); 515a88e22b7SJung-uk Kim Gbl_CurrentLineNumber++; 516a88e22b7SJung-uk Kim 517a88e22b7SJung-uk Kim /* Exit if line is complete. Ignore blank lines */ 518a88e22b7SJung-uk Kim 519a88e22b7SJung-uk Kim if (i != 0) 520a88e22b7SJung-uk Kim { 521a88e22b7SJung-uk Kim Gbl_CurrentLineBuffer[i+1] = 0; /* Terminate line */ 522a88e22b7SJung-uk Kim return (CurrentLineOffset); 523a88e22b7SJung-uk Kim } 524a88e22b7SJung-uk Kim break; 525a88e22b7SJung-uk Kim 526a88e22b7SJung-uk Kim default: 527a88e22b7SJung-uk Kim i++; 528a88e22b7SJung-uk Kim break; 529a88e22b7SJung-uk Kim } 530a88e22b7SJung-uk Kim break; 531a88e22b7SJung-uk Kim 532a88e22b7SJung-uk Kim case DT_START_QUOTED_STRING: 533a88e22b7SJung-uk Kim 534a88e22b7SJung-uk Kim /* Insert raw chars until end of quoted string */ 535a88e22b7SJung-uk Kim 536a88e22b7SJung-uk Kim Gbl_CurrentLineBuffer[i] = c; 537a88e22b7SJung-uk Kim i++; 538a88e22b7SJung-uk Kim 539a88e22b7SJung-uk Kim if (c == '"') 540a88e22b7SJung-uk Kim { 541a88e22b7SJung-uk Kim State = DT_NORMAL_TEXT; 542a88e22b7SJung-uk Kim } 543a88e22b7SJung-uk Kim break; 544a88e22b7SJung-uk Kim 545a88e22b7SJung-uk Kim case DT_START_COMMENT: 546a88e22b7SJung-uk Kim 547a88e22b7SJung-uk Kim /* Open comment if this character is an asterisk or slash */ 548a88e22b7SJung-uk Kim 549a88e22b7SJung-uk Kim switch (c) 550a88e22b7SJung-uk Kim { 551a88e22b7SJung-uk Kim case '*': 552a88e22b7SJung-uk Kim State = DT_SLASH_ASTERISK_COMMENT; 553a88e22b7SJung-uk Kim break; 554a88e22b7SJung-uk Kim 555a88e22b7SJung-uk Kim case '/': 556a88e22b7SJung-uk Kim State = DT_SLASH_SLASH_COMMENT; 557a88e22b7SJung-uk Kim break; 558a88e22b7SJung-uk Kim 559a88e22b7SJung-uk Kim default: /* Not a comment */ 560a88e22b7SJung-uk Kim i++; /* Save the preceeding slash */ 561a88e22b7SJung-uk Kim Gbl_CurrentLineBuffer[i] = c; 562a88e22b7SJung-uk Kim i++; 563a88e22b7SJung-uk Kim State = DT_NORMAL_TEXT; 564a88e22b7SJung-uk Kim break; 565a88e22b7SJung-uk Kim } 566a88e22b7SJung-uk Kim break; 567a88e22b7SJung-uk Kim 568a88e22b7SJung-uk Kim case DT_SLASH_ASTERISK_COMMENT: 569a88e22b7SJung-uk Kim 570a88e22b7SJung-uk Kim /* Ignore chars until an asterisk-slash is found */ 571a88e22b7SJung-uk Kim 572a88e22b7SJung-uk Kim switch (c) 573a88e22b7SJung-uk Kim { 574a88e22b7SJung-uk Kim case '\n': 575a88e22b7SJung-uk Kim Gbl_NextLineOffset = (UINT32) ftell (Handle); 576a88e22b7SJung-uk Kim Gbl_CurrentLineNumber++; 577a88e22b7SJung-uk Kim break; 578a88e22b7SJung-uk Kim 579a88e22b7SJung-uk Kim case '*': 580a88e22b7SJung-uk Kim State = DT_END_COMMENT; 581a88e22b7SJung-uk Kim break; 582a88e22b7SJung-uk Kim 583a88e22b7SJung-uk Kim default: 584a88e22b7SJung-uk Kim break; 585a88e22b7SJung-uk Kim } 586a88e22b7SJung-uk Kim break; 587a88e22b7SJung-uk Kim 588a88e22b7SJung-uk Kim case DT_SLASH_SLASH_COMMENT: 589a88e22b7SJung-uk Kim 590a88e22b7SJung-uk Kim /* Ignore chars until end-of-line */ 591a88e22b7SJung-uk Kim 592a88e22b7SJung-uk Kim if (c == '\n') 593a88e22b7SJung-uk Kim { 594a88e22b7SJung-uk Kim /* We will exit via the NORMAL_TEXT path */ 595a88e22b7SJung-uk Kim 596a88e22b7SJung-uk Kim ungetc (c, Handle); 597a88e22b7SJung-uk Kim State = DT_NORMAL_TEXT; 598a88e22b7SJung-uk Kim } 599a88e22b7SJung-uk Kim break; 600a88e22b7SJung-uk Kim 601a88e22b7SJung-uk Kim case DT_END_COMMENT: 602a88e22b7SJung-uk Kim 603a88e22b7SJung-uk Kim /* End comment if this char is a slash */ 604a88e22b7SJung-uk Kim 605a88e22b7SJung-uk Kim switch (c) 606a88e22b7SJung-uk Kim { 607a88e22b7SJung-uk Kim case '/': 608a88e22b7SJung-uk Kim State = DT_NORMAL_TEXT; 609a88e22b7SJung-uk Kim break; 610a88e22b7SJung-uk Kim 6110b94ba42SJung-uk Kim case '\n': 6120b94ba42SJung-uk Kim CurrentLineOffset = Gbl_NextLineOffset; 6130b94ba42SJung-uk Kim Gbl_NextLineOffset = (UINT32) ftell (Handle); 6140b94ba42SJung-uk Kim Gbl_CurrentLineNumber++; 6150b94ba42SJung-uk Kim break; 6160b94ba42SJung-uk Kim 6170b94ba42SJung-uk Kim case '*': 6180b94ba42SJung-uk Kim /* Consume all adjacent asterisks */ 6190b94ba42SJung-uk Kim break; 6200b94ba42SJung-uk Kim 621a88e22b7SJung-uk Kim default: 622a88e22b7SJung-uk Kim State = DT_SLASH_ASTERISK_COMMENT; 623a88e22b7SJung-uk Kim break; 624a88e22b7SJung-uk Kim } 625a88e22b7SJung-uk Kim break; 626a88e22b7SJung-uk Kim 627a88e22b7SJung-uk Kim default: 628a88e22b7SJung-uk Kim DtFatal (ASL_MSG_COMPILER_INTERNAL, NULL, "Unknown input state"); 629a88e22b7SJung-uk Kim return (0); 630a88e22b7SJung-uk Kim } 631a88e22b7SJung-uk Kim } 632a88e22b7SJung-uk Kim 633a88e22b7SJung-uk Kim printf ("ERROR - Input line is too long (max %u)\n", ASL_LINE_BUFFER_SIZE); 634a88e22b7SJung-uk Kim return (0); 635a88e22b7SJung-uk Kim } 636a88e22b7SJung-uk Kim 637a88e22b7SJung-uk Kim 638a88e22b7SJung-uk Kim /****************************************************************************** 639a88e22b7SJung-uk Kim * 640a88e22b7SJung-uk Kim * FUNCTION: DtScanFile 641a88e22b7SJung-uk Kim * 642a88e22b7SJung-uk Kim * PARAMETERS: Handle - Open file handle for the source file 643a88e22b7SJung-uk Kim * 644a88e22b7SJung-uk Kim * RETURN: Pointer to start of the constructed parse tree. 645a88e22b7SJung-uk Kim * 646a88e22b7SJung-uk Kim * DESCRIPTION: Scan source file, link all field names and values 647a88e22b7SJung-uk Kim * to the global parse tree: Gbl_FieldList 648a88e22b7SJung-uk Kim * 649a88e22b7SJung-uk Kim *****************************************************************************/ 650a88e22b7SJung-uk Kim 651a88e22b7SJung-uk Kim DT_FIELD * 652a88e22b7SJung-uk Kim DtScanFile ( 653a88e22b7SJung-uk Kim FILE *Handle) 654a88e22b7SJung-uk Kim { 655d244b227SJung-uk Kim ACPI_STATUS Status; 656a88e22b7SJung-uk Kim UINT32 Offset; 657a88e22b7SJung-uk Kim 658a88e22b7SJung-uk Kim 659a88e22b7SJung-uk Kim ACPI_FUNCTION_NAME (DtScanFile); 660a88e22b7SJung-uk Kim 661a88e22b7SJung-uk Kim 662a88e22b7SJung-uk Kim /* Get the file size */ 663a88e22b7SJung-uk Kim 664a88e22b7SJung-uk Kim Gbl_InputByteCount = DtGetFileSize (Handle); 665a88e22b7SJung-uk Kim 666a88e22b7SJung-uk Kim Gbl_CurrentLineNumber = 0; 667a88e22b7SJung-uk Kim Gbl_CurrentLineOffset = 0; 668a88e22b7SJung-uk Kim Gbl_NextLineOffset = 0; 669a88e22b7SJung-uk Kim 670a88e22b7SJung-uk Kim /* Scan line-by-line */ 671a88e22b7SJung-uk Kim 672a88e22b7SJung-uk Kim while ((Offset = DtGetNextLine (Handle))) 673a88e22b7SJung-uk Kim { 674a88e22b7SJung-uk Kim ACPI_DEBUG_PRINT ((ACPI_DB_PARSE, "Line %2.2u/%4.4X - %s", 675a88e22b7SJung-uk Kim Gbl_CurrentLineNumber, Offset, Gbl_CurrentLineBuffer)); 676a88e22b7SJung-uk Kim 677d244b227SJung-uk Kim Status = DtParseLine (Gbl_CurrentLineBuffer, Gbl_CurrentLineNumber, Offset); 678d244b227SJung-uk Kim if (Status == AE_NOT_FOUND) 679d244b227SJung-uk Kim { 680d244b227SJung-uk Kim break; 681d244b227SJung-uk Kim } 682a88e22b7SJung-uk Kim } 683a88e22b7SJung-uk Kim 684a88e22b7SJung-uk Kim return (Gbl_FieldList); 685a88e22b7SJung-uk Kim } 686a88e22b7SJung-uk Kim 687a88e22b7SJung-uk Kim 688a88e22b7SJung-uk Kim /* 689a88e22b7SJung-uk Kim * Output functions 690a88e22b7SJung-uk Kim */ 691a88e22b7SJung-uk Kim 692a88e22b7SJung-uk Kim /****************************************************************************** 693a88e22b7SJung-uk Kim * 694a88e22b7SJung-uk Kim * FUNCTION: DtWriteBinary 695a88e22b7SJung-uk Kim * 696a88e22b7SJung-uk Kim * PARAMETERS: DT_WALK_CALLBACK 697a88e22b7SJung-uk Kim * 698a88e22b7SJung-uk Kim * RETURN: Status 699a88e22b7SJung-uk Kim * 700a88e22b7SJung-uk Kim * DESCRIPTION: Write one subtable of a binary ACPI table 701a88e22b7SJung-uk Kim * 702a88e22b7SJung-uk Kim *****************************************************************************/ 703a88e22b7SJung-uk Kim 704a88e22b7SJung-uk Kim static void 705a88e22b7SJung-uk Kim DtWriteBinary ( 706a88e22b7SJung-uk Kim DT_SUBTABLE *Subtable, 707a88e22b7SJung-uk Kim void *Context, 708a88e22b7SJung-uk Kim void *ReturnValue) 709a88e22b7SJung-uk Kim { 710a88e22b7SJung-uk Kim 711a88e22b7SJung-uk Kim FlWriteFile (ASL_FILE_AML_OUTPUT, Subtable->Buffer, Subtable->Length); 712a88e22b7SJung-uk Kim } 713a88e22b7SJung-uk Kim 714a88e22b7SJung-uk Kim 715a88e22b7SJung-uk Kim /****************************************************************************** 716a88e22b7SJung-uk Kim * 717a88e22b7SJung-uk Kim * FUNCTION: DtOutputBinary 718a88e22b7SJung-uk Kim * 719a88e22b7SJung-uk Kim * PARAMETERS: 720a88e22b7SJung-uk Kim * 721a88e22b7SJung-uk Kim * RETURN: Status 722a88e22b7SJung-uk Kim * 723a88e22b7SJung-uk Kim * DESCRIPTION: Write entire binary ACPI table (result of compilation) 724a88e22b7SJung-uk Kim * 725a88e22b7SJung-uk Kim *****************************************************************************/ 726a88e22b7SJung-uk Kim 727a88e22b7SJung-uk Kim void 728a88e22b7SJung-uk Kim DtOutputBinary ( 729a88e22b7SJung-uk Kim DT_SUBTABLE *RootTable) 730a88e22b7SJung-uk Kim { 731a88e22b7SJung-uk Kim 732a88e22b7SJung-uk Kim if (!RootTable) 733a88e22b7SJung-uk Kim { 734a88e22b7SJung-uk Kim return; 735a88e22b7SJung-uk Kim } 736a88e22b7SJung-uk Kim 737a88e22b7SJung-uk Kim /* Walk the entire parse tree, emitting the binary data */ 738a88e22b7SJung-uk Kim 739a88e22b7SJung-uk Kim DtWalkTableTree (RootTable, DtWriteBinary, NULL, NULL); 740a88e22b7SJung-uk Kim Gbl_TableLength = DtGetFileSize (Gbl_Files[ASL_FILE_AML_OUTPUT].Handle); 741a88e22b7SJung-uk Kim } 742d244b227SJung-uk Kim 743d244b227SJung-uk Kim 744d244b227SJung-uk Kim /* 745d244b227SJung-uk Kim * Listing support 746d244b227SJung-uk Kim */ 747d244b227SJung-uk Kim 748d244b227SJung-uk Kim /****************************************************************************** 749d244b227SJung-uk Kim * 750d244b227SJung-uk Kim * FUNCTION: DtDumpBuffer 751d244b227SJung-uk Kim * 752d244b227SJung-uk Kim * PARAMETERS: FileID - Where to write buffer data 753d244b227SJung-uk Kim * Buffer - Buffer to dump 7540b94ba42SJung-uk Kim * Offset - Offset in current table 755d244b227SJung-uk Kim * Length - Buffer Length 756d244b227SJung-uk Kim * 757d244b227SJung-uk Kim * RETURN: None 758d244b227SJung-uk Kim * 759d244b227SJung-uk Kim * DESCRIPTION: Another copy of DumpBuffer routine (unfortunately). 760d244b227SJung-uk Kim * 761d244b227SJung-uk Kim * TBD: merge dump buffer routines 762d244b227SJung-uk Kim * 763d244b227SJung-uk Kim *****************************************************************************/ 764d244b227SJung-uk Kim 765d244b227SJung-uk Kim static void 766d244b227SJung-uk Kim DtDumpBuffer ( 767d244b227SJung-uk Kim UINT32 FileId, 768d244b227SJung-uk Kim UINT8 *Buffer, 7690b94ba42SJung-uk Kim UINT32 Offset, 770d244b227SJung-uk Kim UINT32 Length) 771d244b227SJung-uk Kim { 772d244b227SJung-uk Kim UINT32 i; 773d244b227SJung-uk Kim UINT32 j; 774d244b227SJung-uk Kim UINT8 BufChar; 775d244b227SJung-uk Kim 776d244b227SJung-uk Kim 7770b94ba42SJung-uk Kim FlPrintFile (FileId, "Output: [%3.3Xh %4.4d% 3d] ", 7780b94ba42SJung-uk Kim Offset, Offset, Length); 7790b94ba42SJung-uk Kim 780d244b227SJung-uk Kim i = 0; 781d244b227SJung-uk Kim while (i < Length) 782d244b227SJung-uk Kim { 7830b94ba42SJung-uk Kim if (i >= 16) 7840b94ba42SJung-uk Kim { 7850b94ba42SJung-uk Kim FlPrintFile (FileId, "%23s", ""); 7860b94ba42SJung-uk Kim } 787d244b227SJung-uk Kim 7880b94ba42SJung-uk Kim /* Print 16 hex chars */ 789d244b227SJung-uk Kim 790d244b227SJung-uk Kim for (j = 0; j < 16;) 791d244b227SJung-uk Kim { 792d244b227SJung-uk Kim if (i + j >= Length) 793d244b227SJung-uk Kim { 794d244b227SJung-uk Kim /* Dump fill spaces */ 795d244b227SJung-uk Kim 796d244b227SJung-uk Kim FlPrintFile (FileId, " "); 797d244b227SJung-uk Kim j++; 798d244b227SJung-uk Kim continue; 799d244b227SJung-uk Kim } 800d244b227SJung-uk Kim 801d244b227SJung-uk Kim FlPrintFile (FileId, "%02X ", Buffer[i+j]); 802d244b227SJung-uk Kim j++; 803d244b227SJung-uk Kim } 804d244b227SJung-uk Kim 805d244b227SJung-uk Kim FlPrintFile (FileId, " "); 806d244b227SJung-uk Kim for (j = 0; j < 16; j++) 807d244b227SJung-uk Kim { 808d244b227SJung-uk Kim if (i + j >= Length) 809d244b227SJung-uk Kim { 810d244b227SJung-uk Kim FlPrintFile (FileId, "\n\n"); 811d244b227SJung-uk Kim return; 812d244b227SJung-uk Kim } 813d244b227SJung-uk Kim 814d244b227SJung-uk Kim BufChar = Buffer[(ACPI_SIZE) i + j]; 815d244b227SJung-uk Kim if (ACPI_IS_PRINT (BufChar)) 816d244b227SJung-uk Kim { 817d244b227SJung-uk Kim FlPrintFile (FileId, "%c", BufChar); 818d244b227SJung-uk Kim } 819d244b227SJung-uk Kim else 820d244b227SJung-uk Kim { 821d244b227SJung-uk Kim FlPrintFile (FileId, "."); 822d244b227SJung-uk Kim } 823d244b227SJung-uk Kim } 824d244b227SJung-uk Kim 825d244b227SJung-uk Kim /* Done with that line. */ 826d244b227SJung-uk Kim 827d244b227SJung-uk Kim FlPrintFile (FileId, "\n"); 828d244b227SJung-uk Kim i += 16; 829d244b227SJung-uk Kim } 830d244b227SJung-uk Kim 831d244b227SJung-uk Kim FlPrintFile (FileId, "\n\n"); 832d244b227SJung-uk Kim } 833d244b227SJung-uk Kim 834d244b227SJung-uk Kim 835d244b227SJung-uk Kim /****************************************************************************** 836d244b227SJung-uk Kim * 837d244b227SJung-uk Kim * FUNCTION: DtWriteFieldToListing 838d244b227SJung-uk Kim * 839d244b227SJung-uk Kim * PARAMETERS: Buffer - Contains the compiled data 840d244b227SJung-uk Kim * Field - Field node for the input line 841d244b227SJung-uk Kim * Length - Length of the output data 842d244b227SJung-uk Kim * 843d244b227SJung-uk Kim * RETURN: None 844d244b227SJung-uk Kim * 845d244b227SJung-uk Kim * DESCRIPTION: Write one field to the listing file (if listing is enabled). 846d244b227SJung-uk Kim * 847d244b227SJung-uk Kim *****************************************************************************/ 848d244b227SJung-uk Kim 849d244b227SJung-uk Kim void 850d244b227SJung-uk Kim DtWriteFieldToListing ( 851d244b227SJung-uk Kim UINT8 *Buffer, 852d244b227SJung-uk Kim DT_FIELD *Field, 853d244b227SJung-uk Kim UINT32 Length) 854d244b227SJung-uk Kim { 855d244b227SJung-uk Kim UINT8 FileByte; 856d244b227SJung-uk Kim 857d244b227SJung-uk Kim 858d244b227SJung-uk Kim if (!Gbl_ListingFlag || !Field) 859d244b227SJung-uk Kim { 860d244b227SJung-uk Kim return; 861d244b227SJung-uk Kim } 862d244b227SJung-uk Kim 863d244b227SJung-uk Kim /* Dump the original source line */ 864d244b227SJung-uk Kim 865d244b227SJung-uk Kim FlPrintFile (ASL_FILE_LISTING_OUTPUT, "Input: "); 866d244b227SJung-uk Kim FlSeekFile (ASL_FILE_INPUT, Field->ByteOffset); 867d244b227SJung-uk Kim 868d244b227SJung-uk Kim while (FlReadFile (ASL_FILE_INPUT, &FileByte, 1) == AE_OK) 869d244b227SJung-uk Kim { 870d244b227SJung-uk Kim FlWriteFile (ASL_FILE_LISTING_OUTPUT, &FileByte, 1); 871d244b227SJung-uk Kim if (FileByte == '\n') 872d244b227SJung-uk Kim { 873d244b227SJung-uk Kim break; 874d244b227SJung-uk Kim } 875d244b227SJung-uk Kim } 876d244b227SJung-uk Kim 877d244b227SJung-uk Kim /* Dump the line as parsed and represented internally */ 878d244b227SJung-uk Kim 879d244b227SJung-uk Kim FlPrintFile (ASL_FILE_LISTING_OUTPUT, "Parsed: %*s : %s\n", 880d244b227SJung-uk Kim Field->Column-4, Field->Name, Field->Value); 881d244b227SJung-uk Kim 882d244b227SJung-uk Kim /* Dump the hex data that will be output for this field */ 883d244b227SJung-uk Kim 8840b94ba42SJung-uk Kim DtDumpBuffer (ASL_FILE_LISTING_OUTPUT, Buffer, Field->TableOffset, Length); 885d244b227SJung-uk Kim } 886d244b227SJung-uk Kim 887d244b227SJung-uk Kim 888d244b227SJung-uk Kim /****************************************************************************** 889d244b227SJung-uk Kim * 890d244b227SJung-uk Kim * FUNCTION: DtWriteTableToListing 891d244b227SJung-uk Kim * 892d244b227SJung-uk Kim * PARAMETERS: None 893d244b227SJung-uk Kim * 894d244b227SJung-uk Kim * RETURN: None 895d244b227SJung-uk Kim * 896d244b227SJung-uk Kim * DESCRIPTION: Write the entire compiled table to the listing file 897d244b227SJung-uk Kim * in hex format 898d244b227SJung-uk Kim * 899d244b227SJung-uk Kim *****************************************************************************/ 900d244b227SJung-uk Kim 901d244b227SJung-uk Kim void 902d244b227SJung-uk Kim DtWriteTableToListing ( 903d244b227SJung-uk Kim void) 904d244b227SJung-uk Kim { 905d244b227SJung-uk Kim UINT8 *Buffer; 906d244b227SJung-uk Kim 907d244b227SJung-uk Kim 908d244b227SJung-uk Kim if (!Gbl_ListingFlag) 909d244b227SJung-uk Kim { 910d244b227SJung-uk Kim return; 911d244b227SJung-uk Kim } 912d244b227SJung-uk Kim 913d244b227SJung-uk Kim /* Read the entire table from the output file */ 914d244b227SJung-uk Kim 915d244b227SJung-uk Kim Buffer = UtLocalCalloc (Gbl_TableLength); 916d244b227SJung-uk Kim FlSeekFile (ASL_FILE_AML_OUTPUT, 0); 917d244b227SJung-uk Kim FlReadFile (ASL_FILE_AML_OUTPUT, Buffer, Gbl_TableLength); 918d244b227SJung-uk Kim 919d244b227SJung-uk Kim /* Dump the raw table data */ 920d244b227SJung-uk Kim 921d244b227SJung-uk Kim AcpiOsRedirectOutput (Gbl_Files[ASL_FILE_LISTING_OUTPUT].Handle); 922d244b227SJung-uk Kim 923d244b227SJung-uk Kim AcpiOsPrintf ("\n%s: Length %d (0x%X)\n\n", 924d244b227SJung-uk Kim ACPI_RAW_TABLE_DATA_HEADER, Gbl_TableLength, Gbl_TableLength); 925d244b227SJung-uk Kim AcpiUtDumpBuffer2 (Buffer, Gbl_TableLength, DB_BYTE_DISPLAY); 926d244b227SJung-uk Kim 927d244b227SJung-uk Kim AcpiOsRedirectOutput (stdout); 928d244b227SJung-uk Kim } 929