Home | History | Annotate | Line # | Download | only in compiler
dtio.c revision 1.1.1.3.16.1
      1           1.1  jruoho /******************************************************************************
      2           1.1  jruoho  *
      3           1.1  jruoho  * Module Name: dtio.c - File I/O support for data table compiler
      4           1.1  jruoho  *
      5           1.1  jruoho  *****************************************************************************/
      6           1.1  jruoho 
      7       1.1.1.2  jruoho /*
      8  1.1.1.3.16.1   rmind  * Copyright (C) 2000 - 2013, Intel Corp.
      9           1.1  jruoho  * All rights reserved.
     10           1.1  jruoho  *
     11       1.1.1.2  jruoho  * Redistribution and use in source and binary forms, with or without
     12       1.1.1.2  jruoho  * modification, are permitted provided that the following conditions
     13       1.1.1.2  jruoho  * are met:
     14       1.1.1.2  jruoho  * 1. Redistributions of source code must retain the above copyright
     15       1.1.1.2  jruoho  *    notice, this list of conditions, and the following disclaimer,
     16       1.1.1.2  jruoho  *    without modification.
     17       1.1.1.2  jruoho  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
     18       1.1.1.2  jruoho  *    substantially similar to the "NO WARRANTY" disclaimer below
     19       1.1.1.2  jruoho  *    ("Disclaimer") and any redistribution must be conditioned upon
     20       1.1.1.2  jruoho  *    including a substantially similar Disclaimer requirement for further
     21       1.1.1.2  jruoho  *    binary redistribution.
     22       1.1.1.2  jruoho  * 3. Neither the names of the above-listed copyright holders nor the names
     23       1.1.1.2  jruoho  *    of any contributors may be used to endorse or promote products derived
     24       1.1.1.2  jruoho  *    from this software without specific prior written permission.
     25       1.1.1.2  jruoho  *
     26       1.1.1.2  jruoho  * Alternatively, this software may be distributed under the terms of the
     27       1.1.1.2  jruoho  * GNU General Public License ("GPL") version 2 as published by the Free
     28       1.1.1.2  jruoho  * Software Foundation.
     29       1.1.1.2  jruoho  *
     30       1.1.1.2  jruoho  * NO WARRANTY
     31       1.1.1.2  jruoho  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
     32       1.1.1.2  jruoho  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
     33       1.1.1.2  jruoho  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
     34       1.1.1.2  jruoho  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
     35       1.1.1.2  jruoho  * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     36       1.1.1.2  jruoho  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     37       1.1.1.2  jruoho  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     38       1.1.1.2  jruoho  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
     39       1.1.1.2  jruoho  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
     40       1.1.1.2  jruoho  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     41       1.1.1.2  jruoho  * POSSIBILITY OF SUCH DAMAGES.
     42       1.1.1.2  jruoho  */
     43           1.1  jruoho 
     44           1.1  jruoho #define __DTIO_C__
     45           1.1  jruoho 
     46           1.1  jruoho #include "aslcompiler.h"
     47           1.1  jruoho #include "dtcompiler.h"
     48           1.1  jruoho 
     49           1.1  jruoho #define _COMPONENT          DT_COMPILER
     50           1.1  jruoho         ACPI_MODULE_NAME    ("dtio")
     51           1.1  jruoho 
     52           1.1  jruoho 
     53       1.1.1.2  jruoho /* Local prototypes */
     54           1.1  jruoho 
     55       1.1.1.2  jruoho static char *
     56       1.1.1.2  jruoho DtTrim (
     57       1.1.1.2  jruoho     char                    *String);
     58           1.1  jruoho 
     59       1.1.1.2  jruoho static void
     60       1.1.1.2  jruoho DtLinkField (
     61       1.1.1.2  jruoho     DT_FIELD                *Field);
     62           1.1  jruoho 
     63       1.1.1.2  jruoho static ACPI_STATUS
     64       1.1.1.2  jruoho DtParseLine (
     65       1.1.1.2  jruoho     char                    *LineBuffer,
     66       1.1.1.2  jruoho     UINT32                  Line,
     67       1.1.1.2  jruoho     UINT32                  Offset);
     68           1.1  jruoho 
     69       1.1.1.2  jruoho static void
     70       1.1.1.2  jruoho DtWriteBinary (
     71       1.1.1.2  jruoho     DT_SUBTABLE             *Subtable,
     72       1.1.1.2  jruoho     void                    *Context,
     73       1.1.1.2  jruoho     void                    *ReturnValue);
     74       1.1.1.2  jruoho 
     75       1.1.1.2  jruoho static void
     76       1.1.1.2  jruoho DtDumpBuffer (
     77       1.1.1.2  jruoho     UINT32                  FileId,
     78       1.1.1.2  jruoho     UINT8                   *Buffer,
     79       1.1.1.2  jruoho     UINT32                  Offset,
     80       1.1.1.2  jruoho     UINT32                  Length);
     81       1.1.1.2  jruoho 
     82  1.1.1.3.16.1   rmind static void
     83  1.1.1.3.16.1   rmind DtDumpSubtableInfo (
     84  1.1.1.3.16.1   rmind     DT_SUBTABLE             *Subtable,
     85  1.1.1.3.16.1   rmind     void                    *Context,
     86  1.1.1.3.16.1   rmind     void                    *ReturnValue);
     87  1.1.1.3.16.1   rmind 
     88  1.1.1.3.16.1   rmind static void
     89  1.1.1.3.16.1   rmind DtDumpSubtableTree (
     90  1.1.1.3.16.1   rmind     DT_SUBTABLE             *Subtable,
     91  1.1.1.3.16.1   rmind     void                    *Context,
     92  1.1.1.3.16.1   rmind     void                    *ReturnValue);
     93  1.1.1.3.16.1   rmind 
     94       1.1.1.2  jruoho 
     95       1.1.1.2  jruoho /* States for DtGetNextLine */
     96       1.1.1.2  jruoho 
     97       1.1.1.2  jruoho #define DT_NORMAL_TEXT              0
     98       1.1.1.2  jruoho #define DT_START_QUOTED_STRING      1
     99       1.1.1.2  jruoho #define DT_START_COMMENT            2
    100       1.1.1.2  jruoho #define DT_SLASH_ASTERISK_COMMENT   3
    101       1.1.1.2  jruoho #define DT_SLASH_SLASH_COMMENT      4
    102       1.1.1.2  jruoho #define DT_END_COMMENT              5
    103       1.1.1.3  jruoho #define DT_MERGE_LINES              6
    104  1.1.1.3.16.1   rmind #define DT_ESCAPE_SEQUENCE          7
    105       1.1.1.2  jruoho 
    106       1.1.1.2  jruoho static UINT32  Gbl_NextLineOffset;
    107           1.1  jruoho 
    108           1.1  jruoho 
    109           1.1  jruoho /******************************************************************************
    110           1.1  jruoho  *
    111           1.1  jruoho  * FUNCTION:    DtTrim
    112           1.1  jruoho  *
    113           1.1  jruoho  * PARAMETERS:  String              - Current source code line to trim
    114           1.1  jruoho  *
    115           1.1  jruoho  * RETURN:      Trimmed line. Must be freed by caller.
    116           1.1  jruoho  *
    117           1.1  jruoho  * DESCRIPTION: Trim left and right spaces
    118           1.1  jruoho  *
    119           1.1  jruoho  *****************************************************************************/
    120           1.1  jruoho 
    121           1.1  jruoho static char *
    122           1.1  jruoho DtTrim (
    123           1.1  jruoho     char                    *String)
    124           1.1  jruoho {
    125           1.1  jruoho     char                    *Start;
    126           1.1  jruoho     char                    *End;
    127           1.1  jruoho     char                    *ReturnString;
    128           1.1  jruoho     ACPI_SIZE               Length;
    129           1.1  jruoho 
    130           1.1  jruoho 
    131           1.1  jruoho     /* Skip lines that start with a space */
    132           1.1  jruoho 
    133           1.1  jruoho     if (!ACPI_STRCMP (String, " "))
    134           1.1  jruoho     {
    135           1.1  jruoho         ReturnString = UtLocalCalloc (1);
    136           1.1  jruoho         return (ReturnString);
    137           1.1  jruoho     }
    138           1.1  jruoho 
    139           1.1  jruoho     /* Setup pointers to start and end of input string */
    140           1.1  jruoho 
    141           1.1  jruoho     Start = String;
    142           1.1  jruoho     End = String + ACPI_STRLEN (String) - 1;
    143           1.1  jruoho 
    144           1.1  jruoho     /* Find first non-whitespace character */
    145           1.1  jruoho 
    146           1.1  jruoho     while ((Start <= End) && ((*Start == ' ') || (*Start == '\t')))
    147           1.1  jruoho     {
    148           1.1  jruoho         Start++;
    149           1.1  jruoho     }
    150           1.1  jruoho 
    151           1.1  jruoho     /* Find last non-space character */
    152           1.1  jruoho 
    153           1.1  jruoho     while (End >= Start)
    154           1.1  jruoho     {
    155           1.1  jruoho         if (*End == '\r' || *End == '\n')
    156           1.1  jruoho         {
    157           1.1  jruoho             End--;
    158           1.1  jruoho             continue;
    159           1.1  jruoho         }
    160           1.1  jruoho 
    161           1.1  jruoho         if (*End != ' ')
    162           1.1  jruoho         {
    163           1.1  jruoho             break;
    164           1.1  jruoho         }
    165           1.1  jruoho 
    166           1.1  jruoho         End--;
    167           1.1  jruoho     }
    168           1.1  jruoho 
    169           1.1  jruoho     /* Remove any quotes around the string */
    170           1.1  jruoho 
    171           1.1  jruoho     if (*Start == '\"')
    172           1.1  jruoho     {
    173           1.1  jruoho         Start++;
    174           1.1  jruoho     }
    175           1.1  jruoho     if (*End == '\"')
    176           1.1  jruoho     {
    177           1.1  jruoho         End--;
    178           1.1  jruoho     }
    179           1.1  jruoho 
    180           1.1  jruoho     /* Create the trimmed return string */
    181           1.1  jruoho 
    182           1.1  jruoho     Length = ACPI_PTR_DIFF (End, Start) + 1;
    183           1.1  jruoho     ReturnString = UtLocalCalloc (Length + 1);
    184           1.1  jruoho     if (ACPI_STRLEN (Start))
    185           1.1  jruoho     {
    186           1.1  jruoho         ACPI_STRNCPY (ReturnString, Start, Length);
    187           1.1  jruoho     }
    188           1.1  jruoho 
    189           1.1  jruoho     ReturnString[Length] = 0;
    190           1.1  jruoho     return (ReturnString);
    191           1.1  jruoho }
    192           1.1  jruoho 
    193           1.1  jruoho 
    194           1.1  jruoho /******************************************************************************
    195           1.1  jruoho  *
    196           1.1  jruoho  * FUNCTION:    DtLinkField
    197           1.1  jruoho  *
    198           1.1  jruoho  * PARAMETERS:  Field               - New field object to link
    199           1.1  jruoho  *
    200           1.1  jruoho  * RETURN:      None
    201           1.1  jruoho  *
    202           1.1  jruoho  * DESCRIPTION: Link one field name and value to the list
    203           1.1  jruoho  *
    204           1.1  jruoho  *****************************************************************************/
    205           1.1  jruoho 
    206           1.1  jruoho static void
    207           1.1  jruoho DtLinkField (
    208           1.1  jruoho     DT_FIELD                *Field)
    209           1.1  jruoho {
    210           1.1  jruoho     DT_FIELD                *Prev;
    211           1.1  jruoho     DT_FIELD                *Next;
    212           1.1  jruoho 
    213           1.1  jruoho 
    214           1.1  jruoho     Prev = Next = Gbl_FieldList;
    215           1.1  jruoho 
    216           1.1  jruoho     while (Next)
    217           1.1  jruoho     {
    218           1.1  jruoho         Prev = Next;
    219           1.1  jruoho         Next = Next->Next;
    220           1.1  jruoho     }
    221           1.1  jruoho 
    222           1.1  jruoho     if (Prev)
    223           1.1  jruoho     {
    224           1.1  jruoho         Prev->Next = Field;
    225           1.1  jruoho     }
    226           1.1  jruoho     else
    227           1.1  jruoho     {
    228           1.1  jruoho         Gbl_FieldList = Field;
    229           1.1  jruoho     }
    230           1.1  jruoho }
    231           1.1  jruoho 
    232           1.1  jruoho 
    233           1.1  jruoho /******************************************************************************
    234           1.1  jruoho  *
    235           1.1  jruoho  * FUNCTION:    DtParseLine
    236           1.1  jruoho  *
    237           1.1  jruoho  * PARAMETERS:  LineBuffer          - Current source code line
    238           1.1  jruoho  *              Line                - Current line number in the source
    239           1.1  jruoho  *              Offset              - Current byte offset of the line
    240           1.1  jruoho  *
    241       1.1.1.2  jruoho  * RETURN:      Status
    242           1.1  jruoho  *
    243           1.1  jruoho  * DESCRIPTION: Parse one source line
    244           1.1  jruoho  *
    245           1.1  jruoho  *****************************************************************************/
    246           1.1  jruoho 
    247       1.1.1.2  jruoho static ACPI_STATUS
    248           1.1  jruoho DtParseLine (
    249           1.1  jruoho     char                    *LineBuffer,
    250           1.1  jruoho     UINT32                  Line,
    251           1.1  jruoho     UINT32                  Offset)
    252           1.1  jruoho {
    253           1.1  jruoho     char                    *Start;
    254           1.1  jruoho     char                    *End;
    255           1.1  jruoho     char                    *TmpName;
    256           1.1  jruoho     char                    *TmpValue;
    257           1.1  jruoho     char                    *Name;
    258           1.1  jruoho     char                    *Value;
    259           1.1  jruoho     char                    *Colon;
    260           1.1  jruoho     UINT32                  Length;
    261           1.1  jruoho     DT_FIELD                *Field;
    262           1.1  jruoho     UINT32                  Column;
    263           1.1  jruoho     UINT32                  NameColumn;
    264       1.1.1.3  jruoho     BOOLEAN                 IsNullString = FALSE;
    265           1.1  jruoho 
    266           1.1  jruoho 
    267       1.1.1.2  jruoho     if (!LineBuffer)
    268           1.1  jruoho     {
    269       1.1.1.2  jruoho         return (AE_OK);
    270       1.1.1.2  jruoho     }
    271       1.1.1.2  jruoho 
    272       1.1.1.2  jruoho     /* All lines after "Raw Table Data" are ingored */
    273       1.1.1.2  jruoho 
    274       1.1.1.2  jruoho     if (strstr (LineBuffer, ACPI_RAW_TABLE_DATA_HEADER))
    275       1.1.1.2  jruoho     {
    276       1.1.1.2  jruoho         return (AE_NOT_FOUND);
    277           1.1  jruoho     }
    278           1.1  jruoho 
    279           1.1  jruoho     Colon = strchr (LineBuffer, ':');
    280       1.1.1.2  jruoho     if (!Colon)
    281           1.1  jruoho     {
    282       1.1.1.2  jruoho         return (AE_OK);
    283           1.1  jruoho     }
    284           1.1  jruoho 
    285           1.1  jruoho     Start = LineBuffer;
    286           1.1  jruoho     End = Colon;
    287           1.1  jruoho 
    288           1.1  jruoho     while (Start < Colon)
    289           1.1  jruoho     {
    290           1.1  jruoho         if (*Start == '[')
    291           1.1  jruoho         {
    292  1.1.1.3.16.1   rmind             /* Found left bracket, go to the right bracket */
    293  1.1.1.3.16.1   rmind 
    294           1.1  jruoho             while (Start < Colon && *Start != ']')
    295           1.1  jruoho             {
    296           1.1  jruoho                 Start++;
    297           1.1  jruoho             }
    298  1.1.1.3.16.1   rmind         }
    299  1.1.1.3.16.1   rmind         else if (*Start != ' ')
    300  1.1.1.3.16.1   rmind         {
    301  1.1.1.3.16.1   rmind             break;
    302           1.1  jruoho         }
    303           1.1  jruoho 
    304  1.1.1.3.16.1   rmind         Start++;
    305           1.1  jruoho     }
    306           1.1  jruoho 
    307           1.1  jruoho     /*
    308           1.1  jruoho      * There are two column values. One for the field name,
    309           1.1  jruoho      * and one for the field value.
    310           1.1  jruoho      */
    311           1.1  jruoho     Column = ACPI_PTR_DIFF (Colon, LineBuffer) + 3;
    312           1.1  jruoho     NameColumn = ACPI_PTR_DIFF (Start, LineBuffer) + 1;
    313           1.1  jruoho 
    314           1.1  jruoho     Length = ACPI_PTR_DIFF (End, Start);
    315           1.1  jruoho 
    316           1.1  jruoho     TmpName = UtLocalCalloc (Length + 1);
    317           1.1  jruoho     ACPI_STRNCPY (TmpName, Start, Length);
    318           1.1  jruoho     Name = DtTrim (TmpName);
    319           1.1  jruoho     ACPI_FREE (TmpName);
    320           1.1  jruoho 
    321           1.1  jruoho     Start = End = (Colon + 1);
    322           1.1  jruoho     while (*End)
    323           1.1  jruoho     {
    324           1.1  jruoho         /* Found left quotation, go to the right quotation and break */
    325           1.1  jruoho 
    326           1.1  jruoho         if (*End == '"')
    327           1.1  jruoho         {
    328           1.1  jruoho             End++;
    329       1.1.1.3  jruoho 
    330       1.1.1.3  jruoho             /* Check for an explicit null string */
    331       1.1.1.3  jruoho 
    332       1.1.1.3  jruoho             if (*End == '"')
    333       1.1.1.3  jruoho             {
    334       1.1.1.3  jruoho                 IsNullString = TRUE;
    335       1.1.1.3  jruoho             }
    336       1.1.1.2  jruoho             while (*End && (*End != '"'))
    337           1.1  jruoho             {
    338           1.1  jruoho                 End++;
    339           1.1  jruoho             }
    340           1.1  jruoho 
    341           1.1  jruoho             End++;
    342           1.1  jruoho             break;
    343           1.1  jruoho         }
    344           1.1  jruoho 
    345       1.1.1.2  jruoho         /*
    346       1.1.1.2  jruoho          * Special "comment" fields at line end, ignore them.
    347       1.1.1.2  jruoho          * Note: normal slash-slash and slash-asterisk comments are
    348       1.1.1.2  jruoho          * stripped already by the DtGetNextLine parser.
    349       1.1.1.2  jruoho          *
    350       1.1.1.2  jruoho          * TBD: Perhaps DtGetNextLine should parse the following type
    351       1.1.1.2  jruoho          * of comments also.
    352       1.1.1.2  jruoho          */
    353       1.1.1.3  jruoho         if (*End == '[')
    354           1.1  jruoho         {
    355       1.1.1.3  jruoho             End--;
    356           1.1  jruoho             break;
    357           1.1  jruoho         }
    358           1.1  jruoho         End++;
    359           1.1  jruoho     }
    360           1.1  jruoho 
    361           1.1  jruoho     Length = ACPI_PTR_DIFF (End, Start);
    362           1.1  jruoho     TmpValue = UtLocalCalloc (Length + 1);
    363       1.1.1.3  jruoho 
    364           1.1  jruoho     ACPI_STRNCPY (TmpValue, Start, Length);
    365           1.1  jruoho     Value = DtTrim (TmpValue);
    366           1.1  jruoho     ACPI_FREE (TmpValue);
    367           1.1  jruoho 
    368       1.1.1.3  jruoho     /* Create a new field object only if we have a valid value field */
    369       1.1.1.3  jruoho 
    370       1.1.1.3  jruoho     if ((Value && *Value) || IsNullString)
    371           1.1  jruoho     {
    372           1.1  jruoho         Field = UtLocalCalloc (sizeof (DT_FIELD));
    373           1.1  jruoho         Field->Name = Name;
    374           1.1  jruoho         Field->Value = Value;
    375           1.1  jruoho         Field->Line = Line;
    376           1.1  jruoho         Field->ByteOffset = Offset;
    377           1.1  jruoho         Field->NameColumn = NameColumn;
    378           1.1  jruoho         Field->Column = Column;
    379           1.1  jruoho 
    380           1.1  jruoho         DtLinkField (Field);
    381           1.1  jruoho     }
    382       1.1.1.3  jruoho     else /* Ignore this field, it has no valid data */
    383       1.1.1.3  jruoho     {
    384       1.1.1.3  jruoho         ACPI_FREE (Name);
    385       1.1.1.3  jruoho         ACPI_FREE (Value);
    386       1.1.1.3  jruoho     }
    387       1.1.1.2  jruoho 
    388       1.1.1.2  jruoho     return (AE_OK);
    389       1.1.1.2  jruoho }
    390       1.1.1.2  jruoho 
    391       1.1.1.2  jruoho 
    392       1.1.1.2  jruoho /******************************************************************************
    393       1.1.1.2  jruoho  *
    394       1.1.1.2  jruoho  * FUNCTION:    DtGetNextLine
    395       1.1.1.2  jruoho  *
    396       1.1.1.2  jruoho  * PARAMETERS:  Handle              - Open file handle for the source file
    397       1.1.1.2  jruoho  *
    398       1.1.1.3  jruoho  * RETURN:      Filled line buffer and offset of start-of-line (ASL_EOF on EOF)
    399       1.1.1.2  jruoho  *
    400       1.1.1.2  jruoho  * DESCRIPTION: Get the next valid source line. Removes all comments.
    401       1.1.1.2  jruoho  *              Ignores empty lines.
    402       1.1.1.2  jruoho  *
    403       1.1.1.2  jruoho  * Handles both slash-asterisk and slash-slash comments.
    404       1.1.1.2  jruoho  * Also, quoted strings, but no escapes within.
    405       1.1.1.2  jruoho  *
    406       1.1.1.2  jruoho  * Line is returned in Gbl_CurrentLineBuffer.
    407       1.1.1.2  jruoho  * Line number in original file is returned in Gbl_CurrentLineNumber.
    408       1.1.1.2  jruoho  *
    409       1.1.1.2  jruoho  *****************************************************************************/
    410       1.1.1.2  jruoho 
    411       1.1.1.2  jruoho UINT32
    412       1.1.1.2  jruoho DtGetNextLine (
    413       1.1.1.2  jruoho     FILE                    *Handle)
    414       1.1.1.2  jruoho {
    415       1.1.1.3  jruoho     BOOLEAN                 LineNotAllBlanks = FALSE;
    416       1.1.1.2  jruoho     UINT32                  State = DT_NORMAL_TEXT;
    417       1.1.1.2  jruoho     UINT32                  CurrentLineOffset;
    418       1.1.1.2  jruoho     UINT32                  i;
    419  1.1.1.3.16.1   rmind     int                     c;
    420       1.1.1.2  jruoho 
    421       1.1.1.2  jruoho 
    422  1.1.1.3.16.1   rmind     for (i = 0; ;)
    423       1.1.1.2  jruoho     {
    424  1.1.1.3.16.1   rmind         /*
    425  1.1.1.3.16.1   rmind          * If line is too long, expand the line buffers. Also increases
    426  1.1.1.3.16.1   rmind          * Gbl_LineBufferSize.
    427  1.1.1.3.16.1   rmind          */
    428  1.1.1.3.16.1   rmind         if (i >= Gbl_LineBufferSize)
    429  1.1.1.3.16.1   rmind         {
    430  1.1.1.3.16.1   rmind             UtExpandLineBuffers ();
    431  1.1.1.3.16.1   rmind         }
    432  1.1.1.3.16.1   rmind 
    433  1.1.1.3.16.1   rmind         c = getc (Handle);
    434       1.1.1.2  jruoho         if (c == EOF)
    435       1.1.1.2  jruoho         {
    436       1.1.1.2  jruoho             switch (State)
    437       1.1.1.2  jruoho             {
    438       1.1.1.2  jruoho             case DT_START_QUOTED_STRING:
    439       1.1.1.2  jruoho             case DT_SLASH_ASTERISK_COMMENT:
    440       1.1.1.2  jruoho 
    441       1.1.1.2  jruoho                 AcpiOsPrintf ("**** EOF within comment/string %u\n", State);
    442       1.1.1.2  jruoho                 break;
    443       1.1.1.2  jruoho 
    444       1.1.1.2  jruoho             default:
    445  1.1.1.3.16.1   rmind 
    446       1.1.1.2  jruoho                 break;
    447       1.1.1.2  jruoho             }
    448       1.1.1.2  jruoho 
    449  1.1.1.3.16.1   rmind             /* Standalone EOF is OK */
    450  1.1.1.3.16.1   rmind 
    451  1.1.1.3.16.1   rmind             if (i == 0)
    452  1.1.1.3.16.1   rmind             {
    453  1.1.1.3.16.1   rmind                 return (ASL_EOF);
    454  1.1.1.3.16.1   rmind             }
    455  1.1.1.3.16.1   rmind 
    456  1.1.1.3.16.1   rmind             /*
    457  1.1.1.3.16.1   rmind              * Received an EOF in the middle of a line. Terminate the
    458  1.1.1.3.16.1   rmind              * line with a newline. The next call to this function will
    459  1.1.1.3.16.1   rmind              * return a standalone EOF. Thus, the upper parsing software
    460  1.1.1.3.16.1   rmind              * never has to deal with an EOF within a valid line (or
    461  1.1.1.3.16.1   rmind              * the last line does not get tossed on the floor.)
    462  1.1.1.3.16.1   rmind              */
    463  1.1.1.3.16.1   rmind             c = '\n';
    464  1.1.1.3.16.1   rmind             State = DT_NORMAL_TEXT;
    465       1.1.1.2  jruoho         }
    466       1.1.1.2  jruoho 
    467       1.1.1.2  jruoho         switch (State)
    468       1.1.1.2  jruoho         {
    469       1.1.1.2  jruoho         case DT_NORMAL_TEXT:
    470       1.1.1.2  jruoho 
    471       1.1.1.2  jruoho             /* Normal text, insert char into line buffer */
    472       1.1.1.2  jruoho 
    473  1.1.1.3.16.1   rmind             Gbl_CurrentLineBuffer[i] = (char) c;
    474       1.1.1.2  jruoho             switch (c)
    475       1.1.1.2  jruoho             {
    476       1.1.1.2  jruoho             case '/':
    477  1.1.1.3.16.1   rmind 
    478       1.1.1.2  jruoho                 State = DT_START_COMMENT;
    479       1.1.1.2  jruoho                 break;
    480       1.1.1.2  jruoho 
    481       1.1.1.2  jruoho             case '"':
    482  1.1.1.3.16.1   rmind 
    483       1.1.1.2  jruoho                 State = DT_START_QUOTED_STRING;
    484       1.1.1.3  jruoho                 LineNotAllBlanks = TRUE;
    485       1.1.1.2  jruoho                 i++;
    486       1.1.1.2  jruoho                 break;
    487       1.1.1.2  jruoho 
    488       1.1.1.3  jruoho             case '\\':
    489       1.1.1.3  jruoho                 /*
    490       1.1.1.3  jruoho                  * The continuation char MUST be last char on this line.
    491       1.1.1.3  jruoho                  * Otherwise, it will be assumed to be a valid ASL char.
    492       1.1.1.3  jruoho                  */
    493       1.1.1.3  jruoho                 State = DT_MERGE_LINES;
    494       1.1.1.3  jruoho                 break;
    495       1.1.1.3  jruoho 
    496       1.1.1.2  jruoho             case '\n':
    497  1.1.1.3.16.1   rmind 
    498       1.1.1.2  jruoho                 CurrentLineOffset = Gbl_NextLineOffset;
    499       1.1.1.2  jruoho                 Gbl_NextLineOffset = (UINT32) ftell (Handle);
    500       1.1.1.2  jruoho                 Gbl_CurrentLineNumber++;
    501       1.1.1.2  jruoho 
    502       1.1.1.3  jruoho                 /*
    503       1.1.1.3  jruoho                  * Exit if line is complete. Ignore empty lines (only \n)
    504       1.1.1.3  jruoho                  * or lines that contain nothing but blanks.
    505       1.1.1.3  jruoho                  */
    506       1.1.1.3  jruoho                 if ((i != 0) && LineNotAllBlanks)
    507       1.1.1.2  jruoho                 {
    508  1.1.1.3.16.1   rmind                     if ((i + 1) >= Gbl_LineBufferSize)
    509  1.1.1.3.16.1   rmind                     {
    510  1.1.1.3.16.1   rmind                         UtExpandLineBuffers ();
    511  1.1.1.3.16.1   rmind                     }
    512  1.1.1.3.16.1   rmind 
    513       1.1.1.3  jruoho                     Gbl_CurrentLineBuffer[i+1] = 0; /* Terminate string */
    514       1.1.1.2  jruoho                     return (CurrentLineOffset);
    515       1.1.1.2  jruoho                 }
    516       1.1.1.3  jruoho 
    517       1.1.1.3  jruoho                 /* Toss this line and start a new one */
    518       1.1.1.3  jruoho 
    519       1.1.1.3  jruoho                 i = 0;
    520       1.1.1.3  jruoho                 LineNotAllBlanks = FALSE;
    521       1.1.1.2  jruoho                 break;
    522       1.1.1.2  jruoho 
    523       1.1.1.2  jruoho             default:
    524  1.1.1.3.16.1   rmind 
    525       1.1.1.3  jruoho                 if (c != ' ')
    526       1.1.1.3  jruoho                 {
    527       1.1.1.3  jruoho                     LineNotAllBlanks = TRUE;
    528       1.1.1.3  jruoho                 }
    529       1.1.1.3  jruoho 
    530       1.1.1.2  jruoho                 i++;
    531       1.1.1.2  jruoho                 break;
    532       1.1.1.2  jruoho             }
    533       1.1.1.2  jruoho             break;
    534       1.1.1.2  jruoho 
    535       1.1.1.2  jruoho         case DT_START_QUOTED_STRING:
    536       1.1.1.2  jruoho 
    537       1.1.1.2  jruoho             /* Insert raw chars until end of quoted string */
    538       1.1.1.2  jruoho 
    539  1.1.1.3.16.1   rmind             Gbl_CurrentLineBuffer[i] = (char) c;
    540       1.1.1.2  jruoho             i++;
    541       1.1.1.2  jruoho 
    542  1.1.1.3.16.1   rmind             switch (c)
    543       1.1.1.2  jruoho             {
    544  1.1.1.3.16.1   rmind             case '"':
    545  1.1.1.3.16.1   rmind 
    546  1.1.1.3.16.1   rmind                 State = DT_NORMAL_TEXT;
    547  1.1.1.3.16.1   rmind                 break;
    548  1.1.1.3.16.1   rmind 
    549  1.1.1.3.16.1   rmind             case '\\':
    550  1.1.1.3.16.1   rmind 
    551  1.1.1.3.16.1   rmind                 State = DT_ESCAPE_SEQUENCE;
    552  1.1.1.3.16.1   rmind                 break;
    553  1.1.1.3.16.1   rmind 
    554  1.1.1.3.16.1   rmind             case '\n':
    555  1.1.1.3.16.1   rmind 
    556  1.1.1.3.16.1   rmind                 AcpiOsPrintf ("ERROR at line %u: Unterminated quoted string\n",
    557  1.1.1.3.16.1   rmind                     Gbl_CurrentLineNumber++);
    558       1.1.1.2  jruoho                 State = DT_NORMAL_TEXT;
    559  1.1.1.3.16.1   rmind                 break;
    560  1.1.1.3.16.1   rmind 
    561  1.1.1.3.16.1   rmind             default:    /* Get next character */
    562  1.1.1.3.16.1   rmind 
    563  1.1.1.3.16.1   rmind                 break;
    564       1.1.1.2  jruoho             }
    565       1.1.1.2  jruoho             break;
    566       1.1.1.2  jruoho 
    567  1.1.1.3.16.1   rmind         case DT_ESCAPE_SEQUENCE:
    568  1.1.1.3.16.1   rmind 
    569  1.1.1.3.16.1   rmind             /* Just copy the escaped character. TBD: sufficient for table compiler? */
    570  1.1.1.3.16.1   rmind 
    571  1.1.1.3.16.1   rmind             Gbl_CurrentLineBuffer[i] = (char) c;
    572  1.1.1.3.16.1   rmind             i++;
    573  1.1.1.3.16.1   rmind             State = DT_START_QUOTED_STRING;
    574  1.1.1.3.16.1   rmind             break;
    575  1.1.1.3.16.1   rmind 
    576       1.1.1.2  jruoho         case DT_START_COMMENT:
    577       1.1.1.2  jruoho 
    578       1.1.1.2  jruoho             /* Open comment if this character is an asterisk or slash */
    579       1.1.1.2  jruoho 
    580       1.1.1.2  jruoho             switch (c)
    581       1.1.1.2  jruoho             {
    582       1.1.1.2  jruoho             case '*':
    583  1.1.1.3.16.1   rmind 
    584       1.1.1.2  jruoho                 State = DT_SLASH_ASTERISK_COMMENT;
    585       1.1.1.2  jruoho                 break;
    586       1.1.1.2  jruoho 
    587       1.1.1.2  jruoho             case '/':
    588  1.1.1.3.16.1   rmind 
    589       1.1.1.2  jruoho                 State = DT_SLASH_SLASH_COMMENT;
    590       1.1.1.2  jruoho                 break;
    591       1.1.1.2  jruoho 
    592       1.1.1.2  jruoho             default:    /* Not a comment */
    593  1.1.1.3.16.1   rmind 
    594  1.1.1.3.16.1   rmind                 i++;    /* Save the preceding slash */
    595  1.1.1.3.16.1   rmind                 if (i >= Gbl_LineBufferSize)
    596  1.1.1.3.16.1   rmind                 {
    597  1.1.1.3.16.1   rmind                     UtExpandLineBuffers ();
    598  1.1.1.3.16.1   rmind                 }
    599  1.1.1.3.16.1   rmind 
    600  1.1.1.3.16.1   rmind                 Gbl_CurrentLineBuffer[i] = (char) c;
    601       1.1.1.2  jruoho                 i++;
    602       1.1.1.2  jruoho                 State = DT_NORMAL_TEXT;
    603       1.1.1.2  jruoho                 break;
    604       1.1.1.2  jruoho             }
    605       1.1.1.2  jruoho             break;
    606       1.1.1.2  jruoho 
    607       1.1.1.2  jruoho         case DT_SLASH_ASTERISK_COMMENT:
    608       1.1.1.2  jruoho 
    609       1.1.1.2  jruoho             /* Ignore chars until an asterisk-slash is found */
    610       1.1.1.2  jruoho 
    611       1.1.1.2  jruoho             switch (c)
    612       1.1.1.2  jruoho             {
    613       1.1.1.2  jruoho             case '\n':
    614  1.1.1.3.16.1   rmind 
    615       1.1.1.2  jruoho                 Gbl_NextLineOffset = (UINT32) ftell (Handle);
    616       1.1.1.2  jruoho                 Gbl_CurrentLineNumber++;
    617       1.1.1.2  jruoho                 break;
    618       1.1.1.2  jruoho 
    619       1.1.1.2  jruoho             case '*':
    620  1.1.1.3.16.1   rmind 
    621       1.1.1.2  jruoho                 State = DT_END_COMMENT;
    622       1.1.1.2  jruoho                 break;
    623       1.1.1.2  jruoho 
    624       1.1.1.2  jruoho             default:
    625  1.1.1.3.16.1   rmind 
    626       1.1.1.2  jruoho                 break;
    627       1.1.1.2  jruoho             }
    628       1.1.1.2  jruoho             break;
    629       1.1.1.2  jruoho 
    630       1.1.1.2  jruoho         case DT_SLASH_SLASH_COMMENT:
    631       1.1.1.2  jruoho 
    632       1.1.1.2  jruoho             /* Ignore chars until end-of-line */
    633       1.1.1.2  jruoho 
    634       1.1.1.2  jruoho             if (c == '\n')
    635       1.1.1.2  jruoho             {
    636       1.1.1.2  jruoho                 /* We will exit via the NORMAL_TEXT path */
    637       1.1.1.2  jruoho 
    638       1.1.1.2  jruoho                 ungetc (c, Handle);
    639       1.1.1.2  jruoho                 State = DT_NORMAL_TEXT;
    640       1.1.1.2  jruoho             }
    641       1.1.1.2  jruoho             break;
    642       1.1.1.2  jruoho 
    643       1.1.1.2  jruoho         case DT_END_COMMENT:
    644       1.1.1.2  jruoho 
    645       1.1.1.2  jruoho             /* End comment if this char is a slash */
    646       1.1.1.2  jruoho 
    647       1.1.1.2  jruoho             switch (c)
    648       1.1.1.2  jruoho             {
    649       1.1.1.2  jruoho             case '/':
    650  1.1.1.3.16.1   rmind 
    651       1.1.1.2  jruoho                 State = DT_NORMAL_TEXT;
    652       1.1.1.2  jruoho                 break;
    653       1.1.1.2  jruoho 
    654       1.1.1.2  jruoho             case '\n':
    655  1.1.1.3.16.1   rmind 
    656       1.1.1.2  jruoho                 CurrentLineOffset = Gbl_NextLineOffset;
    657       1.1.1.2  jruoho                 Gbl_NextLineOffset = (UINT32) ftell (Handle);
    658       1.1.1.2  jruoho                 Gbl_CurrentLineNumber++;
    659       1.1.1.2  jruoho                 break;
    660       1.1.1.2  jruoho 
    661       1.1.1.2  jruoho             case '*':
    662  1.1.1.3.16.1   rmind 
    663       1.1.1.2  jruoho                 /* Consume all adjacent asterisks */
    664       1.1.1.2  jruoho                 break;
    665       1.1.1.2  jruoho 
    666       1.1.1.2  jruoho             default:
    667  1.1.1.3.16.1   rmind 
    668       1.1.1.2  jruoho                 State = DT_SLASH_ASTERISK_COMMENT;
    669       1.1.1.2  jruoho                 break;
    670       1.1.1.2  jruoho             }
    671       1.1.1.2  jruoho             break;
    672       1.1.1.2  jruoho 
    673       1.1.1.3  jruoho         case DT_MERGE_LINES:
    674       1.1.1.3  jruoho 
    675       1.1.1.3  jruoho             if (c != '\n')
    676       1.1.1.3  jruoho             {
    677       1.1.1.3  jruoho                 /*
    678       1.1.1.3  jruoho                  * This is not a continuation backslash, it is a normal
    679       1.1.1.3  jruoho                  * normal ASL backslash - for example: Scope(\_SB_)
    680       1.1.1.3  jruoho                  */
    681       1.1.1.3  jruoho                 i++; /* Keep the backslash that is already in the buffer */
    682       1.1.1.3  jruoho 
    683       1.1.1.3  jruoho                 ungetc (c, Handle);
    684       1.1.1.3  jruoho                 State = DT_NORMAL_TEXT;
    685       1.1.1.3  jruoho             }
    686       1.1.1.3  jruoho             else
    687       1.1.1.3  jruoho             {
    688       1.1.1.3  jruoho                 /*
    689       1.1.1.3  jruoho                  * This is a continuation line -- a backlash followed
    690       1.1.1.3  jruoho                  * immediately by a newline. Insert a space between the
    691       1.1.1.3  jruoho                  * lines (overwrite the backslash)
    692       1.1.1.3  jruoho                  */
    693       1.1.1.3  jruoho                 Gbl_CurrentLineBuffer[i] = ' ';
    694       1.1.1.3  jruoho                 i++;
    695       1.1.1.3  jruoho 
    696       1.1.1.3  jruoho                 /* Ignore newline, this will merge the lines */
    697       1.1.1.3  jruoho 
    698       1.1.1.3  jruoho                 CurrentLineOffset = Gbl_NextLineOffset;
    699       1.1.1.3  jruoho                 Gbl_NextLineOffset = (UINT32) ftell (Handle);
    700       1.1.1.3  jruoho                 Gbl_CurrentLineNumber++;
    701       1.1.1.3  jruoho                 State = DT_NORMAL_TEXT;
    702       1.1.1.3  jruoho             }
    703       1.1.1.3  jruoho             break;
    704       1.1.1.3  jruoho 
    705       1.1.1.2  jruoho         default:
    706  1.1.1.3.16.1   rmind 
    707       1.1.1.2  jruoho             DtFatal (ASL_MSG_COMPILER_INTERNAL, NULL, "Unknown input state");
    708       1.1.1.3  jruoho             return (ASL_EOF);
    709       1.1.1.2  jruoho         }
    710       1.1.1.2  jruoho     }
    711           1.1  jruoho }
    712           1.1  jruoho 
    713           1.1  jruoho 
    714           1.1  jruoho /******************************************************************************
    715           1.1  jruoho  *
    716           1.1  jruoho  * FUNCTION:    DtScanFile
    717           1.1  jruoho  *
    718           1.1  jruoho  * PARAMETERS:  Handle              - Open file handle for the source file
    719           1.1  jruoho  *
    720           1.1  jruoho  * RETURN:      Pointer to start of the constructed parse tree.
    721           1.1  jruoho  *
    722       1.1.1.2  jruoho  * DESCRIPTION: Scan source file, link all field names and values
    723           1.1  jruoho  *              to the global parse tree: Gbl_FieldList
    724           1.1  jruoho  *
    725           1.1  jruoho  *****************************************************************************/
    726           1.1  jruoho 
    727           1.1  jruoho DT_FIELD *
    728           1.1  jruoho DtScanFile (
    729           1.1  jruoho     FILE                    *Handle)
    730           1.1  jruoho {
    731       1.1.1.2  jruoho     ACPI_STATUS             Status;
    732       1.1.1.2  jruoho     UINT32                  Offset;
    733       1.1.1.2  jruoho 
    734       1.1.1.2  jruoho 
    735       1.1.1.2  jruoho     ACPI_FUNCTION_NAME (DtScanFile);
    736           1.1  jruoho 
    737           1.1  jruoho 
    738           1.1  jruoho     /* Get the file size */
    739           1.1  jruoho 
    740           1.1  jruoho     Gbl_InputByteCount = DtGetFileSize (Handle);
    741           1.1  jruoho 
    742       1.1.1.2  jruoho     Gbl_CurrentLineNumber = 0;
    743       1.1.1.2  jruoho     Gbl_CurrentLineOffset = 0;
    744       1.1.1.2  jruoho     Gbl_NextLineOffset = 0;
    745       1.1.1.2  jruoho 
    746           1.1  jruoho     /* Scan line-by-line */
    747           1.1  jruoho 
    748       1.1.1.3  jruoho     while ((Offset = DtGetNextLine (Handle)) != ASL_EOF)
    749           1.1  jruoho     {
    750       1.1.1.2  jruoho         ACPI_DEBUG_PRINT ((ACPI_DB_PARSE, "Line %2.2u/%4.4X - %s",
    751       1.1.1.2  jruoho             Gbl_CurrentLineNumber, Offset, Gbl_CurrentLineBuffer));
    752           1.1  jruoho 
    753       1.1.1.2  jruoho         Status = DtParseLine (Gbl_CurrentLineBuffer, Gbl_CurrentLineNumber, Offset);
    754       1.1.1.2  jruoho         if (Status == AE_NOT_FOUND)
    755       1.1.1.2  jruoho         {
    756       1.1.1.2  jruoho             break;
    757       1.1.1.2  jruoho         }
    758           1.1  jruoho     }
    759           1.1  jruoho 
    760       1.1.1.3  jruoho     /* Dump the parse tree if debug enabled */
    761       1.1.1.3  jruoho 
    762  1.1.1.3.16.1   rmind     DtDumpFieldList (Gbl_FieldList);
    763           1.1  jruoho     return (Gbl_FieldList);
    764           1.1  jruoho }
    765           1.1  jruoho 
    766           1.1  jruoho 
    767           1.1  jruoho /*
    768           1.1  jruoho  * Output functions
    769           1.1  jruoho  */
    770           1.1  jruoho 
    771           1.1  jruoho /******************************************************************************
    772           1.1  jruoho  *
    773           1.1  jruoho  * FUNCTION:    DtWriteBinary
    774           1.1  jruoho  *
    775           1.1  jruoho  * PARAMETERS:  DT_WALK_CALLBACK
    776           1.1  jruoho  *
    777           1.1  jruoho  * RETURN:      Status
    778           1.1  jruoho  *
    779           1.1  jruoho  * DESCRIPTION: Write one subtable of a binary ACPI table
    780           1.1  jruoho  *
    781           1.1  jruoho  *****************************************************************************/
    782           1.1  jruoho 
    783           1.1  jruoho static void
    784           1.1  jruoho DtWriteBinary (
    785           1.1  jruoho     DT_SUBTABLE             *Subtable,
    786           1.1  jruoho     void                    *Context,
    787           1.1  jruoho     void                    *ReturnValue)
    788           1.1  jruoho {
    789           1.1  jruoho 
    790           1.1  jruoho     FlWriteFile (ASL_FILE_AML_OUTPUT, Subtable->Buffer, Subtable->Length);
    791           1.1  jruoho }
    792           1.1  jruoho 
    793           1.1  jruoho 
    794           1.1  jruoho /******************************************************************************
    795           1.1  jruoho  *
    796           1.1  jruoho  * FUNCTION:    DtOutputBinary
    797           1.1  jruoho  *
    798           1.1  jruoho  * PARAMETERS:
    799           1.1  jruoho  *
    800           1.1  jruoho  * RETURN:      Status
    801           1.1  jruoho  *
    802           1.1  jruoho  * DESCRIPTION: Write entire binary ACPI table (result of compilation)
    803           1.1  jruoho  *
    804           1.1  jruoho  *****************************************************************************/
    805           1.1  jruoho 
    806           1.1  jruoho void
    807           1.1  jruoho DtOutputBinary (
    808           1.1  jruoho     DT_SUBTABLE             *RootTable)
    809           1.1  jruoho {
    810           1.1  jruoho 
    811           1.1  jruoho     if (!RootTable)
    812           1.1  jruoho     {
    813           1.1  jruoho         return;
    814           1.1  jruoho     }
    815           1.1  jruoho 
    816           1.1  jruoho     /* Walk the entire parse tree, emitting the binary data */
    817           1.1  jruoho 
    818           1.1  jruoho     DtWalkTableTree (RootTable, DtWriteBinary, NULL, NULL);
    819           1.1  jruoho     Gbl_TableLength = DtGetFileSize (Gbl_Files[ASL_FILE_AML_OUTPUT].Handle);
    820           1.1  jruoho }
    821       1.1.1.2  jruoho 
    822       1.1.1.2  jruoho 
    823       1.1.1.2  jruoho /*
    824       1.1.1.2  jruoho  * Listing support
    825       1.1.1.2  jruoho  */
    826       1.1.1.2  jruoho 
    827       1.1.1.2  jruoho /******************************************************************************
    828       1.1.1.2  jruoho  *
    829       1.1.1.2  jruoho  * FUNCTION:    DtDumpBuffer
    830       1.1.1.2  jruoho  *
    831       1.1.1.2  jruoho  * PARAMETERS:  FileID              - Where to write buffer data
    832       1.1.1.2  jruoho  *              Buffer              - Buffer to dump
    833       1.1.1.2  jruoho  *              Offset              - Offset in current table
    834       1.1.1.2  jruoho  *              Length              - Buffer Length
    835       1.1.1.2  jruoho  *
    836       1.1.1.2  jruoho  * RETURN:      None
    837       1.1.1.2  jruoho  *
    838       1.1.1.2  jruoho  * DESCRIPTION: Another copy of DumpBuffer routine (unfortunately).
    839       1.1.1.2  jruoho  *
    840       1.1.1.2  jruoho  * TBD: merge dump buffer routines
    841       1.1.1.2  jruoho  *
    842       1.1.1.2  jruoho  *****************************************************************************/
    843       1.1.1.2  jruoho 
    844       1.1.1.2  jruoho static void
    845       1.1.1.2  jruoho DtDumpBuffer (
    846       1.1.1.2  jruoho     UINT32                  FileId,
    847       1.1.1.2  jruoho     UINT8                   *Buffer,
    848       1.1.1.2  jruoho     UINT32                  Offset,
    849       1.1.1.2  jruoho     UINT32                  Length)
    850       1.1.1.2  jruoho {
    851       1.1.1.2  jruoho     UINT32                  i;
    852       1.1.1.2  jruoho     UINT32                  j;
    853       1.1.1.2  jruoho     UINT8                   BufChar;
    854       1.1.1.2  jruoho 
    855       1.1.1.2  jruoho 
    856       1.1.1.3  jruoho     FlPrintFile (FileId, "Output: [%3.3Xh %4.4d %3d] ",
    857       1.1.1.2  jruoho         Offset, Offset, Length);
    858       1.1.1.2  jruoho 
    859       1.1.1.2  jruoho     i = 0;
    860       1.1.1.2  jruoho     while (i < Length)
    861       1.1.1.2  jruoho     {
    862       1.1.1.2  jruoho         if (i >= 16)
    863       1.1.1.2  jruoho         {
    864       1.1.1.3  jruoho             FlPrintFile (FileId, "%24s", "");
    865       1.1.1.2  jruoho         }
    866       1.1.1.2  jruoho 
    867       1.1.1.2  jruoho         /* Print 16 hex chars */
    868       1.1.1.2  jruoho 
    869       1.1.1.2  jruoho         for (j = 0; j < 16;)
    870       1.1.1.2  jruoho         {
    871       1.1.1.2  jruoho             if (i + j >= Length)
    872       1.1.1.2  jruoho             {
    873       1.1.1.2  jruoho                 /* Dump fill spaces */
    874       1.1.1.2  jruoho 
    875       1.1.1.2  jruoho                 FlPrintFile (FileId, "   ");
    876       1.1.1.2  jruoho                 j++;
    877       1.1.1.2  jruoho                 continue;
    878       1.1.1.2  jruoho             }
    879       1.1.1.2  jruoho 
    880       1.1.1.2  jruoho             FlPrintFile (FileId, "%02X ", Buffer[i+j]);
    881       1.1.1.2  jruoho             j++;
    882       1.1.1.2  jruoho         }
    883       1.1.1.2  jruoho 
    884       1.1.1.2  jruoho         FlPrintFile (FileId, " ");
    885       1.1.1.2  jruoho         for (j = 0; j < 16; j++)
    886       1.1.1.2  jruoho         {
    887       1.1.1.2  jruoho             if (i + j >= Length)
    888       1.1.1.2  jruoho             {
    889       1.1.1.2  jruoho                 FlPrintFile (FileId, "\n\n");
    890       1.1.1.2  jruoho                 return;
    891       1.1.1.2  jruoho             }
    892       1.1.1.2  jruoho 
    893       1.1.1.2  jruoho             BufChar = Buffer[(ACPI_SIZE) i + j];
    894       1.1.1.2  jruoho             if (ACPI_IS_PRINT (BufChar))
    895       1.1.1.2  jruoho             {
    896       1.1.1.2  jruoho                 FlPrintFile (FileId, "%c", BufChar);
    897       1.1.1.2  jruoho             }
    898       1.1.1.2  jruoho             else
    899       1.1.1.2  jruoho             {
    900       1.1.1.2  jruoho                 FlPrintFile (FileId, ".");
    901       1.1.1.2  jruoho             }
    902       1.1.1.2  jruoho         }
    903       1.1.1.2  jruoho 
    904       1.1.1.2  jruoho         /* Done with that line. */
    905       1.1.1.2  jruoho 
    906       1.1.1.2  jruoho         FlPrintFile (FileId, "\n");
    907       1.1.1.2  jruoho         i += 16;
    908       1.1.1.2  jruoho     }
    909       1.1.1.2  jruoho 
    910       1.1.1.2  jruoho     FlPrintFile (FileId, "\n\n");
    911       1.1.1.2  jruoho }
    912       1.1.1.2  jruoho 
    913       1.1.1.2  jruoho 
    914       1.1.1.2  jruoho /******************************************************************************
    915       1.1.1.2  jruoho  *
    916  1.1.1.3.16.1   rmind  * FUNCTION:    DtDumpFieldList
    917  1.1.1.3.16.1   rmind  *
    918  1.1.1.3.16.1   rmind  * PARAMETERS:  Field               - Root field
    919  1.1.1.3.16.1   rmind  *
    920  1.1.1.3.16.1   rmind  * RETURN:      None
    921  1.1.1.3.16.1   rmind  *
    922  1.1.1.3.16.1   rmind  * DESCRIPTION: Dump the entire field list
    923  1.1.1.3.16.1   rmind  *
    924  1.1.1.3.16.1   rmind  *****************************************************************************/
    925  1.1.1.3.16.1   rmind 
    926  1.1.1.3.16.1   rmind void
    927  1.1.1.3.16.1   rmind DtDumpFieldList (
    928  1.1.1.3.16.1   rmind     DT_FIELD                *Field)
    929  1.1.1.3.16.1   rmind {
    930  1.1.1.3.16.1   rmind 
    931  1.1.1.3.16.1   rmind     if (!Gbl_DebugFlag || !Field)
    932  1.1.1.3.16.1   rmind     {
    933  1.1.1.3.16.1   rmind         return;
    934  1.1.1.3.16.1   rmind     }
    935  1.1.1.3.16.1   rmind 
    936  1.1.1.3.16.1   rmind     DbgPrint (ASL_DEBUG_OUTPUT,  "\nField List:\n"
    937  1.1.1.3.16.1   rmind         "LineNo   ByteOff  NameCol  Column   TableOff "
    938  1.1.1.3.16.1   rmind         "Flags    %32s : %s\n\n", "Name", "Value");
    939  1.1.1.3.16.1   rmind     while (Field)
    940  1.1.1.3.16.1   rmind     {
    941  1.1.1.3.16.1   rmind         DbgPrint (ASL_DEBUG_OUTPUT,
    942  1.1.1.3.16.1   rmind             "%.08X %.08X %.08X %.08X %.08X %.08X %32s : %s\n",
    943  1.1.1.3.16.1   rmind             Field->Line, Field->ByteOffset, Field->NameColumn,
    944  1.1.1.3.16.1   rmind             Field->Column, Field->TableOffset, Field->Flags,
    945  1.1.1.3.16.1   rmind             Field->Name, Field->Value);
    946  1.1.1.3.16.1   rmind 
    947  1.1.1.3.16.1   rmind         Field = Field->Next;
    948  1.1.1.3.16.1   rmind     }
    949  1.1.1.3.16.1   rmind 
    950  1.1.1.3.16.1   rmind     DbgPrint (ASL_DEBUG_OUTPUT,  "\n\n");
    951  1.1.1.3.16.1   rmind }
    952  1.1.1.3.16.1   rmind 
    953  1.1.1.3.16.1   rmind 
    954  1.1.1.3.16.1   rmind /******************************************************************************
    955  1.1.1.3.16.1   rmind  *
    956  1.1.1.3.16.1   rmind  * FUNCTION:    DtDumpSubtableInfo, DtDumpSubtableTree
    957  1.1.1.3.16.1   rmind  *
    958  1.1.1.3.16.1   rmind  * PARAMETERS:  DT_WALK_CALLBACK
    959  1.1.1.3.16.1   rmind  *
    960  1.1.1.3.16.1   rmind  * RETURN:      None
    961  1.1.1.3.16.1   rmind  *
    962  1.1.1.3.16.1   rmind  * DESCRIPTION: Info - dump a subtable tree entry with extra information.
    963  1.1.1.3.16.1   rmind  *              Tree - dump a subtable tree formatted by depth indentation.
    964  1.1.1.3.16.1   rmind  *
    965  1.1.1.3.16.1   rmind  *****************************************************************************/
    966  1.1.1.3.16.1   rmind 
    967  1.1.1.3.16.1   rmind static void
    968  1.1.1.3.16.1   rmind DtDumpSubtableInfo (
    969  1.1.1.3.16.1   rmind     DT_SUBTABLE             *Subtable,
    970  1.1.1.3.16.1   rmind     void                    *Context,
    971  1.1.1.3.16.1   rmind     void                    *ReturnValue)
    972  1.1.1.3.16.1   rmind {
    973  1.1.1.3.16.1   rmind 
    974  1.1.1.3.16.1   rmind     DbgPrint (ASL_DEBUG_OUTPUT,
    975  1.1.1.3.16.1   rmind         "[%.04X] %.08X %.08X %.08X %.08X %.08X %p %p %p\n",
    976  1.1.1.3.16.1   rmind         Subtable->Depth, Subtable->Length, Subtable->TotalLength,
    977  1.1.1.3.16.1   rmind         Subtable->SizeOfLengthField, Subtable->Flags, Subtable,
    978  1.1.1.3.16.1   rmind         Subtable->Parent, Subtable->Child, Subtable->Peer);
    979  1.1.1.3.16.1   rmind }
    980  1.1.1.3.16.1   rmind 
    981  1.1.1.3.16.1   rmind static void
    982  1.1.1.3.16.1   rmind DtDumpSubtableTree (
    983  1.1.1.3.16.1   rmind     DT_SUBTABLE             *Subtable,
    984  1.1.1.3.16.1   rmind     void                    *Context,
    985  1.1.1.3.16.1   rmind     void                    *ReturnValue)
    986  1.1.1.3.16.1   rmind {
    987  1.1.1.3.16.1   rmind 
    988  1.1.1.3.16.1   rmind     DbgPrint (ASL_DEBUG_OUTPUT,
    989  1.1.1.3.16.1   rmind         "[%.04X] %*s%08X (%.02X) - (%.02X)\n",
    990  1.1.1.3.16.1   rmind         Subtable->Depth, (4 * Subtable->Depth), " ",
    991  1.1.1.3.16.1   rmind         Subtable, Subtable->Length, Subtable->TotalLength);
    992  1.1.1.3.16.1   rmind }
    993  1.1.1.3.16.1   rmind 
    994  1.1.1.3.16.1   rmind 
    995  1.1.1.3.16.1   rmind /******************************************************************************
    996  1.1.1.3.16.1   rmind  *
    997  1.1.1.3.16.1   rmind  * FUNCTION:    DtDumpSubtableList
    998  1.1.1.3.16.1   rmind  *
    999  1.1.1.3.16.1   rmind  * PARAMETERS:  None
   1000  1.1.1.3.16.1   rmind  *
   1001  1.1.1.3.16.1   rmind  * RETURN:      None
   1002  1.1.1.3.16.1   rmind  *
   1003  1.1.1.3.16.1   rmind  * DESCRIPTION: Dump the raw list of subtables with information, and also
   1004  1.1.1.3.16.1   rmind  *              dump the subtable list in formatted tree format. Assists with
   1005  1.1.1.3.16.1   rmind  *              the development of new table code.
   1006  1.1.1.3.16.1   rmind  *
   1007  1.1.1.3.16.1   rmind  *****************************************************************************/
   1008  1.1.1.3.16.1   rmind 
   1009  1.1.1.3.16.1   rmind void
   1010  1.1.1.3.16.1   rmind DtDumpSubtableList (
   1011  1.1.1.3.16.1   rmind     void)
   1012  1.1.1.3.16.1   rmind {
   1013  1.1.1.3.16.1   rmind 
   1014  1.1.1.3.16.1   rmind     if (!Gbl_DebugFlag || !Gbl_RootTable)
   1015  1.1.1.3.16.1   rmind     {
   1016  1.1.1.3.16.1   rmind         return;
   1017  1.1.1.3.16.1   rmind     }
   1018  1.1.1.3.16.1   rmind 
   1019  1.1.1.3.16.1   rmind     DbgPrint (ASL_DEBUG_OUTPUT,
   1020  1.1.1.3.16.1   rmind         "Subtable Info:\n"
   1021  1.1.1.3.16.1   rmind         "Depth  Length   TotalLen LenSize  Flags    "
   1022  1.1.1.3.16.1   rmind         "This     Parent   Child    Peer\n\n");
   1023  1.1.1.3.16.1   rmind     DtWalkTableTree (Gbl_RootTable, DtDumpSubtableInfo, NULL, NULL);
   1024  1.1.1.3.16.1   rmind 
   1025  1.1.1.3.16.1   rmind     DbgPrint (ASL_DEBUG_OUTPUT,
   1026  1.1.1.3.16.1   rmind         "\nSubtable Tree: (Depth, Subtable, Length, TotalLength)\n\n");
   1027  1.1.1.3.16.1   rmind     DtWalkTableTree (Gbl_RootTable, DtDumpSubtableTree, NULL, NULL);
   1028  1.1.1.3.16.1   rmind }
   1029  1.1.1.3.16.1   rmind 
   1030  1.1.1.3.16.1   rmind 
   1031  1.1.1.3.16.1   rmind /******************************************************************************
   1032  1.1.1.3.16.1   rmind  *
   1033       1.1.1.2  jruoho  * FUNCTION:    DtWriteFieldToListing
   1034       1.1.1.2  jruoho  *
   1035       1.1.1.2  jruoho  * PARAMETERS:  Buffer              - Contains the compiled data
   1036       1.1.1.2  jruoho  *              Field               - Field node for the input line
   1037       1.1.1.2  jruoho  *              Length              - Length of the output data
   1038       1.1.1.2  jruoho  *
   1039       1.1.1.2  jruoho  * RETURN:      None
   1040       1.1.1.2  jruoho  *
   1041       1.1.1.2  jruoho  * DESCRIPTION: Write one field to the listing file (if listing is enabled).
   1042       1.1.1.2  jruoho  *
   1043       1.1.1.2  jruoho  *****************************************************************************/
   1044       1.1.1.2  jruoho 
   1045       1.1.1.2  jruoho void
   1046       1.1.1.2  jruoho DtWriteFieldToListing (
   1047       1.1.1.2  jruoho     UINT8                   *Buffer,
   1048       1.1.1.2  jruoho     DT_FIELD                *Field,
   1049       1.1.1.2  jruoho     UINT32                  Length)
   1050       1.1.1.2  jruoho {
   1051       1.1.1.2  jruoho     UINT8                   FileByte;
   1052       1.1.1.2  jruoho 
   1053       1.1.1.2  jruoho 
   1054       1.1.1.2  jruoho     if (!Gbl_ListingFlag || !Field)
   1055       1.1.1.2  jruoho     {
   1056       1.1.1.2  jruoho         return;
   1057       1.1.1.2  jruoho     }
   1058       1.1.1.2  jruoho 
   1059       1.1.1.2  jruoho     /* Dump the original source line */
   1060       1.1.1.2  jruoho 
   1061       1.1.1.2  jruoho     FlPrintFile (ASL_FILE_LISTING_OUTPUT, "Input:  ");
   1062       1.1.1.2  jruoho     FlSeekFile (ASL_FILE_INPUT, Field->ByteOffset);
   1063       1.1.1.2  jruoho 
   1064       1.1.1.2  jruoho     while (FlReadFile (ASL_FILE_INPUT, &FileByte, 1) == AE_OK)
   1065       1.1.1.2  jruoho     {
   1066       1.1.1.2  jruoho         FlWriteFile (ASL_FILE_LISTING_OUTPUT, &FileByte, 1);
   1067       1.1.1.2  jruoho         if (FileByte == '\n')
   1068       1.1.1.2  jruoho         {
   1069       1.1.1.2  jruoho             break;
   1070       1.1.1.2  jruoho         }
   1071       1.1.1.2  jruoho     }
   1072       1.1.1.2  jruoho 
   1073       1.1.1.2  jruoho     /* Dump the line as parsed and represented internally */
   1074       1.1.1.2  jruoho 
   1075       1.1.1.3  jruoho     FlPrintFile (ASL_FILE_LISTING_OUTPUT, "Parsed: %*s : %.64s",
   1076       1.1.1.2  jruoho         Field->Column-4, Field->Name, Field->Value);
   1077       1.1.1.2  jruoho 
   1078       1.1.1.3  jruoho     if (strlen (Field->Value) > 64)
   1079       1.1.1.3  jruoho     {
   1080       1.1.1.3  jruoho         FlPrintFile (ASL_FILE_LISTING_OUTPUT, "...Additional data, length 0x%X\n",
   1081       1.1.1.3  jruoho             strlen (Field->Value));
   1082       1.1.1.3  jruoho     }
   1083       1.1.1.3  jruoho     FlPrintFile (ASL_FILE_LISTING_OUTPUT, "\n");
   1084       1.1.1.3  jruoho 
   1085       1.1.1.2  jruoho     /* Dump the hex data that will be output for this field */
   1086       1.1.1.2  jruoho 
   1087       1.1.1.2  jruoho     DtDumpBuffer (ASL_FILE_LISTING_OUTPUT, Buffer, Field->TableOffset, Length);
   1088       1.1.1.2  jruoho }
   1089       1.1.1.2  jruoho 
   1090       1.1.1.2  jruoho 
   1091       1.1.1.2  jruoho /******************************************************************************
   1092       1.1.1.2  jruoho  *
   1093       1.1.1.2  jruoho  * FUNCTION:    DtWriteTableToListing
   1094       1.1.1.2  jruoho  *
   1095       1.1.1.2  jruoho  * PARAMETERS:  None
   1096       1.1.1.2  jruoho  *
   1097       1.1.1.2  jruoho  * RETURN:      None
   1098       1.1.1.2  jruoho  *
   1099       1.1.1.2  jruoho  * DESCRIPTION: Write the entire compiled table to the listing file
   1100       1.1.1.2  jruoho  *              in hex format
   1101       1.1.1.2  jruoho  *
   1102       1.1.1.2  jruoho  *****************************************************************************/
   1103       1.1.1.2  jruoho 
   1104       1.1.1.2  jruoho void
   1105       1.1.1.2  jruoho DtWriteTableToListing (
   1106       1.1.1.2  jruoho     void)
   1107       1.1.1.2  jruoho {
   1108       1.1.1.2  jruoho     UINT8                   *Buffer;
   1109       1.1.1.2  jruoho 
   1110       1.1.1.2  jruoho 
   1111       1.1.1.2  jruoho     if (!Gbl_ListingFlag)
   1112       1.1.1.2  jruoho     {
   1113       1.1.1.2  jruoho         return;
   1114       1.1.1.2  jruoho     }
   1115       1.1.1.2  jruoho 
   1116       1.1.1.2  jruoho     /* Read the entire table from the output file */
   1117       1.1.1.2  jruoho 
   1118       1.1.1.2  jruoho     Buffer = UtLocalCalloc (Gbl_TableLength);
   1119       1.1.1.2  jruoho     FlSeekFile (ASL_FILE_AML_OUTPUT, 0);
   1120       1.1.1.2  jruoho     FlReadFile (ASL_FILE_AML_OUTPUT, Buffer, Gbl_TableLength);
   1121       1.1.1.2  jruoho 
   1122       1.1.1.2  jruoho     /* Dump the raw table data */
   1123       1.1.1.2  jruoho 
   1124       1.1.1.2  jruoho     AcpiOsRedirectOutput (Gbl_Files[ASL_FILE_LISTING_OUTPUT].Handle);
   1125       1.1.1.2  jruoho 
   1126       1.1.1.2  jruoho     AcpiOsPrintf ("\n%s: Length %d (0x%X)\n\n",
   1127       1.1.1.2  jruoho         ACPI_RAW_TABLE_DATA_HEADER, Gbl_TableLength, Gbl_TableLength);
   1128  1.1.1.3.16.1   rmind     AcpiUtDumpBuffer (Buffer, Gbl_TableLength, DB_BYTE_DISPLAY, 0);
   1129       1.1.1.2  jruoho 
   1130       1.1.1.2  jruoho     AcpiOsRedirectOutput (stdout);
   1131  1.1.1.3.16.1   rmind     ACPI_FREE (Buffer);
   1132       1.1.1.2  jruoho }
   1133