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