Home | History | Annotate | Line # | Download | only in compiler
dtio.c revision 1.1.1.5.2.2
      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.1     skrll  * Copyright (C) 2000 - 2015, 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.2    jruoho 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    jruoho         End++;
    358          1.1    jruoho     }
    359          1.1    jruoho 
    360          1.1    jruoho     Length = ACPI_PTR_DIFF (End, Start);
    361          1.1    jruoho     TmpValue = UtLocalCalloc (Length + 1);
    362      1.1.1.3    jruoho 
    363  1.1.1.5.2.2     skrll     strncpy (TmpValue, Start, Length);
    364          1.1    jruoho     Value = DtTrim (TmpValue);
    365          1.1    jruoho     ACPI_FREE (TmpValue);
    366          1.1    jruoho 
    367      1.1.1.3    jruoho     /* Create a new field object only if we have a valid value field */
    368      1.1.1.3    jruoho 
    369      1.1.1.3    jruoho     if ((Value && *Value) || IsNullString)
    370          1.1    jruoho     {
    371      1.1.1.5  christos         Field = UtFieldCacheCalloc ();
    372          1.1    jruoho         Field->Name = Name;
    373          1.1    jruoho         Field->Value = Value;
    374          1.1    jruoho         Field->Line = Line;
    375          1.1    jruoho         Field->ByteOffset = Offset;
    376          1.1    jruoho         Field->NameColumn = NameColumn;
    377          1.1    jruoho         Field->Column = Column;
    378  1.1.1.5.2.1     skrll         Field->StringLength = Length;
    379          1.1    jruoho 
    380          1.1    jruoho         DtLinkField (Field);
    381          1.1    jruoho     }
    382      1.1.1.5  christos     /* Else -- Ignore this field, it has no valid data */
    383      1.1.1.2    jruoho 
    384      1.1.1.2    jruoho     return (AE_OK);
    385      1.1.1.2    jruoho }
    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  * FUNCTION:    DtGetNextLine
    391      1.1.1.2    jruoho  *
    392      1.1.1.2    jruoho  * PARAMETERS:  Handle              - Open file handle for the source file
    393      1.1.1.2    jruoho  *
    394      1.1.1.3    jruoho  * RETURN:      Filled line buffer and offset of start-of-line (ASL_EOF on EOF)
    395      1.1.1.2    jruoho  *
    396      1.1.1.2    jruoho  * DESCRIPTION: Get the next valid source line. Removes all comments.
    397      1.1.1.2    jruoho  *              Ignores empty lines.
    398      1.1.1.2    jruoho  *
    399      1.1.1.2    jruoho  * Handles both slash-asterisk and slash-slash comments.
    400      1.1.1.2    jruoho  * Also, quoted strings, but no escapes within.
    401      1.1.1.2    jruoho  *
    402      1.1.1.2    jruoho  * Line is returned in Gbl_CurrentLineBuffer.
    403      1.1.1.2    jruoho  * Line number in original file is returned in Gbl_CurrentLineNumber.
    404      1.1.1.2    jruoho  *
    405      1.1.1.2    jruoho  *****************************************************************************/
    406      1.1.1.2    jruoho 
    407      1.1.1.2    jruoho UINT32
    408      1.1.1.2    jruoho DtGetNextLine (
    409  1.1.1.5.2.2     skrll     FILE                    *Handle,
    410  1.1.1.5.2.2     skrll     UINT32                  Flags)
    411      1.1.1.2    jruoho {
    412      1.1.1.3    jruoho     BOOLEAN                 LineNotAllBlanks = FALSE;
    413      1.1.1.2    jruoho     UINT32                  State = DT_NORMAL_TEXT;
    414      1.1.1.2    jruoho     UINT32                  CurrentLineOffset;
    415      1.1.1.2    jruoho     UINT32                  i;
    416      1.1.1.4  christos     int                     c;
    417      1.1.1.2    jruoho 
    418      1.1.1.2    jruoho 
    419  1.1.1.5.2.2     skrll     memset (Gbl_CurrentLineBuffer, 0, Gbl_LineBufferSize);
    420      1.1.1.4  christos     for (i = 0; ;)
    421      1.1.1.2    jruoho     {
    422      1.1.1.4  christos         /*
    423      1.1.1.4  christos          * If line is too long, expand the line buffers. Also increases
    424      1.1.1.4  christos          * Gbl_LineBufferSize.
    425      1.1.1.4  christos          */
    426      1.1.1.4  christos         if (i >= Gbl_LineBufferSize)
    427      1.1.1.4  christos         {
    428      1.1.1.4  christos             UtExpandLineBuffers ();
    429      1.1.1.4  christos         }
    430      1.1.1.4  christos 
    431      1.1.1.4  christos         c = getc (Handle);
    432      1.1.1.2    jruoho         if (c == EOF)
    433      1.1.1.2    jruoho         {
    434      1.1.1.2    jruoho             switch (State)
    435      1.1.1.2    jruoho             {
    436      1.1.1.2    jruoho             case DT_START_QUOTED_STRING:
    437      1.1.1.2    jruoho             case DT_SLASH_ASTERISK_COMMENT:
    438      1.1.1.2    jruoho 
    439      1.1.1.2    jruoho                 AcpiOsPrintf ("**** EOF within comment/string %u\n", State);
    440      1.1.1.2    jruoho                 break;
    441      1.1.1.2    jruoho 
    442      1.1.1.2    jruoho             default:
    443      1.1.1.4  christos 
    444      1.1.1.2    jruoho                 break;
    445      1.1.1.2    jruoho             }
    446      1.1.1.2    jruoho 
    447      1.1.1.4  christos             /* Standalone EOF is OK */
    448      1.1.1.4  christos 
    449      1.1.1.4  christos             if (i == 0)
    450      1.1.1.4  christos             {
    451      1.1.1.4  christos                 return (ASL_EOF);
    452      1.1.1.4  christos             }
    453      1.1.1.4  christos 
    454      1.1.1.4  christos             /*
    455      1.1.1.4  christos              * Received an EOF in the middle of a line. Terminate the
    456      1.1.1.4  christos              * line with a newline. The next call to this function will
    457      1.1.1.4  christos              * return a standalone EOF. Thus, the upper parsing software
    458      1.1.1.4  christos              * never has to deal with an EOF within a valid line (or
    459      1.1.1.4  christos              * the last line does not get tossed on the floor.)
    460      1.1.1.4  christos              */
    461      1.1.1.4  christos             c = '\n';
    462      1.1.1.4  christos             State = DT_NORMAL_TEXT;
    463      1.1.1.2    jruoho         }
    464      1.1.1.2    jruoho 
    465      1.1.1.2    jruoho         switch (State)
    466      1.1.1.2    jruoho         {
    467      1.1.1.2    jruoho         case DT_NORMAL_TEXT:
    468      1.1.1.2    jruoho 
    469      1.1.1.2    jruoho             /* Normal text, insert char into line buffer */
    470      1.1.1.2    jruoho 
    471      1.1.1.4  christos             Gbl_CurrentLineBuffer[i] = (char) c;
    472      1.1.1.2    jruoho             switch (c)
    473      1.1.1.2    jruoho             {
    474      1.1.1.2    jruoho             case '/':
    475      1.1.1.4  christos 
    476      1.1.1.2    jruoho                 State = DT_START_COMMENT;
    477      1.1.1.2    jruoho                 break;
    478      1.1.1.2    jruoho 
    479      1.1.1.2    jruoho             case '"':
    480      1.1.1.4  christos 
    481      1.1.1.2    jruoho                 State = DT_START_QUOTED_STRING;
    482      1.1.1.3    jruoho                 LineNotAllBlanks = TRUE;
    483      1.1.1.2    jruoho                 i++;
    484      1.1.1.2    jruoho                 break;
    485      1.1.1.2    jruoho 
    486      1.1.1.3    jruoho             case '\\':
    487      1.1.1.3    jruoho                 /*
    488      1.1.1.3    jruoho                  * The continuation char MUST be last char on this line.
    489      1.1.1.3    jruoho                  * Otherwise, it will be assumed to be a valid ASL char.
    490      1.1.1.3    jruoho                  */
    491      1.1.1.3    jruoho                 State = DT_MERGE_LINES;
    492      1.1.1.3    jruoho                 break;
    493      1.1.1.3    jruoho 
    494      1.1.1.2    jruoho             case '\n':
    495      1.1.1.4  christos 
    496      1.1.1.2    jruoho                 CurrentLineOffset = Gbl_NextLineOffset;
    497      1.1.1.2    jruoho                 Gbl_NextLineOffset = (UINT32) ftell (Handle);
    498      1.1.1.2    jruoho                 Gbl_CurrentLineNumber++;
    499      1.1.1.2    jruoho 
    500      1.1.1.3    jruoho                 /*
    501      1.1.1.3    jruoho                  * Exit if line is complete. Ignore empty lines (only \n)
    502      1.1.1.3    jruoho                  * or lines that contain nothing but blanks.
    503      1.1.1.3    jruoho                  */
    504      1.1.1.3    jruoho                 if ((i != 0) && LineNotAllBlanks)
    505      1.1.1.2    jruoho                 {
    506      1.1.1.4  christos                     if ((i + 1) >= Gbl_LineBufferSize)
    507      1.1.1.4  christos                     {
    508      1.1.1.4  christos                         UtExpandLineBuffers ();
    509      1.1.1.4  christos                     }
    510      1.1.1.4  christos 
    511      1.1.1.3    jruoho                     Gbl_CurrentLineBuffer[i+1] = 0; /* Terminate string */
    512      1.1.1.2    jruoho                     return (CurrentLineOffset);
    513      1.1.1.2    jruoho                 }
    514      1.1.1.3    jruoho 
    515      1.1.1.3    jruoho                 /* Toss this line and start a new one */
    516      1.1.1.3    jruoho 
    517      1.1.1.3    jruoho                 i = 0;
    518      1.1.1.3    jruoho                 LineNotAllBlanks = FALSE;
    519      1.1.1.2    jruoho                 break;
    520      1.1.1.2    jruoho 
    521      1.1.1.2    jruoho             default:
    522      1.1.1.4  christos 
    523      1.1.1.3    jruoho                 if (c != ' ')
    524      1.1.1.3    jruoho                 {
    525      1.1.1.3    jruoho                     LineNotAllBlanks = TRUE;
    526      1.1.1.3    jruoho                 }
    527      1.1.1.3    jruoho 
    528      1.1.1.2    jruoho                 i++;
    529      1.1.1.2    jruoho                 break;
    530      1.1.1.2    jruoho             }
    531      1.1.1.2    jruoho             break;
    532      1.1.1.2    jruoho 
    533      1.1.1.2    jruoho         case DT_START_QUOTED_STRING:
    534      1.1.1.2    jruoho 
    535      1.1.1.2    jruoho             /* Insert raw chars until end of quoted string */
    536      1.1.1.2    jruoho 
    537      1.1.1.4  christos             Gbl_CurrentLineBuffer[i] = (char) c;
    538      1.1.1.2    jruoho             i++;
    539      1.1.1.2    jruoho 
    540      1.1.1.4  christos             switch (c)
    541      1.1.1.2    jruoho             {
    542      1.1.1.4  christos             case '"':
    543      1.1.1.4  christos 
    544      1.1.1.4  christos                 State = DT_NORMAL_TEXT;
    545      1.1.1.4  christos                 break;
    546      1.1.1.4  christos 
    547      1.1.1.4  christos             case '\\':
    548      1.1.1.4  christos 
    549      1.1.1.4  christos                 State = DT_ESCAPE_SEQUENCE;
    550      1.1.1.4  christos                 break;
    551      1.1.1.4  christos 
    552      1.1.1.4  christos             case '\n':
    553      1.1.1.4  christos 
    554  1.1.1.5.2.2     skrll                 if (!(Flags & DT_ALLOW_MULTILINE_QUOTES))
    555  1.1.1.5.2.2     skrll                 {
    556  1.1.1.5.2.2     skrll                     AcpiOsPrintf ("ERROR at line %u: Unterminated quoted string\n",
    557  1.1.1.5.2.2     skrll                         Gbl_CurrentLineNumber++);
    558  1.1.1.5.2.2     skrll                     State = DT_NORMAL_TEXT;
    559  1.1.1.5.2.2     skrll                 }
    560      1.1.1.4  christos                 break;
    561      1.1.1.4  christos 
    562      1.1.1.4  christos             default:    /* Get next character */
    563      1.1.1.4  christos 
    564      1.1.1.4  christos                 break;
    565      1.1.1.2    jruoho             }
    566      1.1.1.2    jruoho             break;
    567      1.1.1.2    jruoho 
    568      1.1.1.4  christos         case DT_ESCAPE_SEQUENCE:
    569      1.1.1.4  christos 
    570      1.1.1.4  christos             /* Just copy the escaped character. TBD: sufficient for table compiler? */
    571      1.1.1.4  christos 
    572      1.1.1.4  christos             Gbl_CurrentLineBuffer[i] = (char) c;
    573      1.1.1.4  christos             i++;
    574      1.1.1.4  christos             State = DT_START_QUOTED_STRING;
    575      1.1.1.4  christos             break;
    576      1.1.1.4  christos 
    577      1.1.1.2    jruoho         case DT_START_COMMENT:
    578      1.1.1.2    jruoho 
    579      1.1.1.2    jruoho             /* Open comment if this character is an asterisk or slash */
    580      1.1.1.2    jruoho 
    581      1.1.1.2    jruoho             switch (c)
    582      1.1.1.2    jruoho             {
    583      1.1.1.2    jruoho             case '*':
    584      1.1.1.4  christos 
    585      1.1.1.2    jruoho                 State = DT_SLASH_ASTERISK_COMMENT;
    586      1.1.1.2    jruoho                 break;
    587      1.1.1.2    jruoho 
    588      1.1.1.2    jruoho             case '/':
    589      1.1.1.4  christos 
    590      1.1.1.2    jruoho                 State = DT_SLASH_SLASH_COMMENT;
    591      1.1.1.2    jruoho                 break;
    592      1.1.1.2    jruoho 
    593      1.1.1.2    jruoho             default:    /* Not a comment */
    594      1.1.1.4  christos 
    595      1.1.1.4  christos                 i++;    /* Save the preceding slash */
    596      1.1.1.4  christos                 if (i >= Gbl_LineBufferSize)
    597      1.1.1.4  christos                 {
    598      1.1.1.4  christos                     UtExpandLineBuffers ();
    599      1.1.1.4  christos                 }
    600      1.1.1.4  christos 
    601      1.1.1.4  christos                 Gbl_CurrentLineBuffer[i] = (char) c;
    602      1.1.1.2    jruoho                 i++;
    603      1.1.1.2    jruoho                 State = DT_NORMAL_TEXT;
    604      1.1.1.2    jruoho                 break;
    605      1.1.1.2    jruoho             }
    606      1.1.1.2    jruoho             break;
    607      1.1.1.2    jruoho 
    608      1.1.1.2    jruoho         case DT_SLASH_ASTERISK_COMMENT:
    609      1.1.1.2    jruoho 
    610      1.1.1.2    jruoho             /* Ignore chars until an asterisk-slash is found */
    611      1.1.1.2    jruoho 
    612      1.1.1.2    jruoho             switch (c)
    613      1.1.1.2    jruoho             {
    614      1.1.1.2    jruoho             case '\n':
    615      1.1.1.4  christos 
    616      1.1.1.2    jruoho                 Gbl_NextLineOffset = (UINT32) ftell (Handle);
    617      1.1.1.2    jruoho                 Gbl_CurrentLineNumber++;
    618      1.1.1.2    jruoho                 break;
    619      1.1.1.2    jruoho 
    620      1.1.1.2    jruoho             case '*':
    621      1.1.1.4  christos 
    622      1.1.1.2    jruoho                 State = DT_END_COMMENT;
    623      1.1.1.2    jruoho                 break;
    624      1.1.1.2    jruoho 
    625      1.1.1.2    jruoho             default:
    626      1.1.1.4  christos 
    627      1.1.1.2    jruoho                 break;
    628      1.1.1.2    jruoho             }
    629      1.1.1.2    jruoho             break;
    630      1.1.1.2    jruoho 
    631      1.1.1.2    jruoho         case DT_SLASH_SLASH_COMMENT:
    632      1.1.1.2    jruoho 
    633      1.1.1.2    jruoho             /* Ignore chars until end-of-line */
    634      1.1.1.2    jruoho 
    635      1.1.1.2    jruoho             if (c == '\n')
    636      1.1.1.2    jruoho             {
    637      1.1.1.2    jruoho                 /* We will exit via the NORMAL_TEXT path */
    638      1.1.1.2    jruoho 
    639      1.1.1.2    jruoho                 ungetc (c, Handle);
    640      1.1.1.2    jruoho                 State = DT_NORMAL_TEXT;
    641      1.1.1.2    jruoho             }
    642      1.1.1.2    jruoho             break;
    643      1.1.1.2    jruoho 
    644      1.1.1.2    jruoho         case DT_END_COMMENT:
    645      1.1.1.2    jruoho 
    646      1.1.1.2    jruoho             /* End comment if this char is a slash */
    647      1.1.1.2    jruoho 
    648      1.1.1.2    jruoho             switch (c)
    649      1.1.1.2    jruoho             {
    650      1.1.1.2    jruoho             case '/':
    651      1.1.1.4  christos 
    652      1.1.1.2    jruoho                 State = DT_NORMAL_TEXT;
    653      1.1.1.2    jruoho                 break;
    654      1.1.1.2    jruoho 
    655      1.1.1.2    jruoho             case '\n':
    656      1.1.1.4  christos 
    657      1.1.1.2    jruoho                 CurrentLineOffset = Gbl_NextLineOffset;
    658      1.1.1.2    jruoho                 Gbl_NextLineOffset = (UINT32) ftell (Handle);
    659      1.1.1.2    jruoho                 Gbl_CurrentLineNumber++;
    660      1.1.1.2    jruoho                 break;
    661      1.1.1.2    jruoho 
    662      1.1.1.2    jruoho             case '*':
    663      1.1.1.4  christos 
    664      1.1.1.2    jruoho                 /* Consume all adjacent asterisks */
    665      1.1.1.2    jruoho                 break;
    666      1.1.1.2    jruoho 
    667      1.1.1.2    jruoho             default:
    668      1.1.1.4  christos 
    669      1.1.1.2    jruoho                 State = DT_SLASH_ASTERISK_COMMENT;
    670      1.1.1.2    jruoho                 break;
    671      1.1.1.2    jruoho             }
    672      1.1.1.2    jruoho             break;
    673      1.1.1.2    jruoho 
    674      1.1.1.3    jruoho         case DT_MERGE_LINES:
    675      1.1.1.3    jruoho 
    676      1.1.1.3    jruoho             if (c != '\n')
    677      1.1.1.3    jruoho             {
    678      1.1.1.3    jruoho                 /*
    679      1.1.1.3    jruoho                  * This is not a continuation backslash, it is a normal
    680      1.1.1.3    jruoho                  * normal ASL backslash - for example: Scope(\_SB_)
    681      1.1.1.3    jruoho                  */
    682      1.1.1.3    jruoho                 i++; /* Keep the backslash that is already in the buffer */
    683      1.1.1.3    jruoho 
    684      1.1.1.3    jruoho                 ungetc (c, Handle);
    685      1.1.1.3    jruoho                 State = DT_NORMAL_TEXT;
    686      1.1.1.3    jruoho             }
    687      1.1.1.3    jruoho             else
    688      1.1.1.3    jruoho             {
    689      1.1.1.3    jruoho                 /*
    690      1.1.1.3    jruoho                  * This is a continuation line -- a backlash followed
    691      1.1.1.3    jruoho                  * immediately by a newline. Insert a space between the
    692      1.1.1.3    jruoho                  * lines (overwrite the backslash)
    693      1.1.1.3    jruoho                  */
    694      1.1.1.3    jruoho                 Gbl_CurrentLineBuffer[i] = ' ';
    695      1.1.1.3    jruoho                 i++;
    696      1.1.1.3    jruoho 
    697      1.1.1.3    jruoho                 /* Ignore newline, this will merge the lines */
    698      1.1.1.3    jruoho 
    699      1.1.1.3    jruoho                 CurrentLineOffset = Gbl_NextLineOffset;
    700      1.1.1.3    jruoho                 Gbl_NextLineOffset = (UINT32) ftell (Handle);
    701      1.1.1.3    jruoho                 Gbl_CurrentLineNumber++;
    702      1.1.1.3    jruoho                 State = DT_NORMAL_TEXT;
    703      1.1.1.3    jruoho             }
    704      1.1.1.3    jruoho             break;
    705      1.1.1.3    jruoho 
    706      1.1.1.2    jruoho         default:
    707      1.1.1.4  christos 
    708      1.1.1.2    jruoho             DtFatal (ASL_MSG_COMPILER_INTERNAL, NULL, "Unknown input state");
    709      1.1.1.3    jruoho             return (ASL_EOF);
    710      1.1.1.2    jruoho         }
    711      1.1.1.2    jruoho     }
    712          1.1    jruoho }
    713          1.1    jruoho 
    714          1.1    jruoho 
    715          1.1    jruoho /******************************************************************************
    716          1.1    jruoho  *
    717          1.1    jruoho  * FUNCTION:    DtScanFile
    718          1.1    jruoho  *
    719          1.1    jruoho  * PARAMETERS:  Handle              - Open file handle for the source file
    720          1.1    jruoho  *
    721          1.1    jruoho  * RETURN:      Pointer to start of the constructed parse tree.
    722          1.1    jruoho  *
    723      1.1.1.2    jruoho  * DESCRIPTION: Scan source file, link all field names and values
    724          1.1    jruoho  *              to the global parse tree: Gbl_FieldList
    725          1.1    jruoho  *
    726          1.1    jruoho  *****************************************************************************/
    727          1.1    jruoho 
    728          1.1    jruoho DT_FIELD *
    729          1.1    jruoho DtScanFile (
    730          1.1    jruoho     FILE                    *Handle)
    731          1.1    jruoho {
    732      1.1.1.2    jruoho     ACPI_STATUS             Status;
    733      1.1.1.2    jruoho     UINT32                  Offset;
    734      1.1.1.2    jruoho 
    735      1.1.1.2    jruoho 
    736      1.1.1.2    jruoho     ACPI_FUNCTION_NAME (DtScanFile);
    737          1.1    jruoho 
    738          1.1    jruoho 
    739          1.1    jruoho     /* Get the file size */
    740          1.1    jruoho 
    741      1.1.1.5  christos     Gbl_InputByteCount = CmGetFileSize (Handle);
    742      1.1.1.5  christos     if (Gbl_InputByteCount == ACPI_UINT32_MAX)
    743      1.1.1.5  christos     {
    744      1.1.1.5  christos         AslAbort ();
    745      1.1.1.5  christos     }
    746          1.1    jruoho 
    747      1.1.1.2    jruoho     Gbl_CurrentLineNumber = 0;
    748      1.1.1.2    jruoho     Gbl_CurrentLineOffset = 0;
    749      1.1.1.2    jruoho     Gbl_NextLineOffset = 0;
    750      1.1.1.2    jruoho 
    751          1.1    jruoho     /* Scan line-by-line */
    752          1.1    jruoho 
    753  1.1.1.5.2.2     skrll     while ((Offset = DtGetNextLine (Handle, 0)) != ASL_EOF)
    754          1.1    jruoho     {
    755      1.1.1.2    jruoho         ACPI_DEBUG_PRINT ((ACPI_DB_PARSE, "Line %2.2u/%4.4X - %s",
    756      1.1.1.2    jruoho             Gbl_CurrentLineNumber, Offset, Gbl_CurrentLineBuffer));
    757          1.1    jruoho 
    758      1.1.1.2    jruoho         Status = DtParseLine (Gbl_CurrentLineBuffer, Gbl_CurrentLineNumber, Offset);
    759      1.1.1.2    jruoho         if (Status == AE_NOT_FOUND)
    760      1.1.1.2    jruoho         {
    761      1.1.1.2    jruoho             break;
    762      1.1.1.2    jruoho         }
    763          1.1    jruoho     }
    764          1.1    jruoho 
    765      1.1.1.3    jruoho     /* Dump the parse tree if debug enabled */
    766      1.1.1.3    jruoho 
    767      1.1.1.4  christos     DtDumpFieldList (Gbl_FieldList);
    768          1.1    jruoho     return (Gbl_FieldList);
    769          1.1    jruoho }
    770          1.1    jruoho 
    771          1.1    jruoho 
    772          1.1    jruoho /*
    773          1.1    jruoho  * Output functions
    774          1.1    jruoho  */
    775          1.1    jruoho 
    776          1.1    jruoho /******************************************************************************
    777          1.1    jruoho  *
    778          1.1    jruoho  * FUNCTION:    DtWriteBinary
    779          1.1    jruoho  *
    780          1.1    jruoho  * PARAMETERS:  DT_WALK_CALLBACK
    781          1.1    jruoho  *
    782          1.1    jruoho  * RETURN:      Status
    783          1.1    jruoho  *
    784          1.1    jruoho  * DESCRIPTION: Write one subtable of a binary ACPI table
    785          1.1    jruoho  *
    786          1.1    jruoho  *****************************************************************************/
    787          1.1    jruoho 
    788          1.1    jruoho static void
    789          1.1    jruoho DtWriteBinary (
    790          1.1    jruoho     DT_SUBTABLE             *Subtable,
    791          1.1    jruoho     void                    *Context,
    792          1.1    jruoho     void                    *ReturnValue)
    793          1.1    jruoho {
    794          1.1    jruoho 
    795          1.1    jruoho     FlWriteFile (ASL_FILE_AML_OUTPUT, Subtable->Buffer, Subtable->Length);
    796          1.1    jruoho }
    797          1.1    jruoho 
    798          1.1    jruoho 
    799          1.1    jruoho /******************************************************************************
    800          1.1    jruoho  *
    801          1.1    jruoho  * FUNCTION:    DtOutputBinary
    802          1.1    jruoho  *
    803          1.1    jruoho  * PARAMETERS:
    804          1.1    jruoho  *
    805          1.1    jruoho  * RETURN:      Status
    806          1.1    jruoho  *
    807          1.1    jruoho  * DESCRIPTION: Write entire binary ACPI table (result of compilation)
    808          1.1    jruoho  *
    809          1.1    jruoho  *****************************************************************************/
    810          1.1    jruoho 
    811          1.1    jruoho void
    812          1.1    jruoho DtOutputBinary (
    813          1.1    jruoho     DT_SUBTABLE             *RootTable)
    814          1.1    jruoho {
    815          1.1    jruoho 
    816          1.1    jruoho     if (!RootTable)
    817          1.1    jruoho     {
    818          1.1    jruoho         return;
    819          1.1    jruoho     }
    820          1.1    jruoho 
    821          1.1    jruoho     /* Walk the entire parse tree, emitting the binary data */
    822          1.1    jruoho 
    823          1.1    jruoho     DtWalkTableTree (RootTable, DtWriteBinary, NULL, NULL);
    824      1.1.1.5  christos 
    825      1.1.1.5  christos     Gbl_TableLength = CmGetFileSize (Gbl_Files[ASL_FILE_AML_OUTPUT].Handle);
    826      1.1.1.5  christos     if (Gbl_TableLength == ACPI_UINT32_MAX)
    827      1.1.1.5  christos     {
    828      1.1.1.5  christos         AslAbort ();
    829      1.1.1.5  christos     }
    830          1.1    jruoho }
    831      1.1.1.2    jruoho 
    832      1.1.1.2    jruoho 
    833      1.1.1.2    jruoho /*
    834      1.1.1.2    jruoho  * Listing support
    835      1.1.1.2    jruoho  */
    836      1.1.1.2    jruoho 
    837      1.1.1.2    jruoho /******************************************************************************
    838      1.1.1.2    jruoho  *
    839      1.1.1.2    jruoho  * FUNCTION:    DtDumpBuffer
    840      1.1.1.2    jruoho  *
    841      1.1.1.2    jruoho  * PARAMETERS:  FileID              - Where to write buffer data
    842      1.1.1.2    jruoho  *              Buffer              - Buffer to dump
    843      1.1.1.2    jruoho  *              Offset              - Offset in current table
    844      1.1.1.2    jruoho  *              Length              - Buffer Length
    845      1.1.1.2    jruoho  *
    846      1.1.1.2    jruoho  * RETURN:      None
    847      1.1.1.2    jruoho  *
    848      1.1.1.2    jruoho  * DESCRIPTION: Another copy of DumpBuffer routine (unfortunately).
    849      1.1.1.2    jruoho  *
    850      1.1.1.2    jruoho  * TBD: merge dump buffer routines
    851      1.1.1.2    jruoho  *
    852      1.1.1.2    jruoho  *****************************************************************************/
    853      1.1.1.2    jruoho 
    854      1.1.1.2    jruoho static void
    855      1.1.1.2    jruoho DtDumpBuffer (
    856      1.1.1.2    jruoho     UINT32                  FileId,
    857      1.1.1.2    jruoho     UINT8                   *Buffer,
    858      1.1.1.2    jruoho     UINT32                  Offset,
    859      1.1.1.2    jruoho     UINT32                  Length)
    860      1.1.1.2    jruoho {
    861      1.1.1.2    jruoho     UINT32                  i;
    862      1.1.1.2    jruoho     UINT32                  j;
    863      1.1.1.2    jruoho     UINT8                   BufChar;
    864      1.1.1.2    jruoho 
    865      1.1.1.2    jruoho 
    866      1.1.1.3    jruoho     FlPrintFile (FileId, "Output: [%3.3Xh %4.4d %3d] ",
    867      1.1.1.2    jruoho         Offset, Offset, Length);
    868      1.1.1.2    jruoho 
    869      1.1.1.2    jruoho     i = 0;
    870      1.1.1.2    jruoho     while (i < Length)
    871      1.1.1.2    jruoho     {
    872      1.1.1.2    jruoho         if (i >= 16)
    873      1.1.1.2    jruoho         {
    874      1.1.1.3    jruoho             FlPrintFile (FileId, "%24s", "");
    875      1.1.1.2    jruoho         }
    876      1.1.1.2    jruoho 
    877      1.1.1.2    jruoho         /* Print 16 hex chars */
    878      1.1.1.2    jruoho 
    879      1.1.1.2    jruoho         for (j = 0; j < 16;)
    880      1.1.1.2    jruoho         {
    881      1.1.1.2    jruoho             if (i + j >= Length)
    882      1.1.1.2    jruoho             {
    883      1.1.1.2    jruoho                 /* Dump fill spaces */
    884      1.1.1.2    jruoho 
    885      1.1.1.2    jruoho                 FlPrintFile (FileId, "   ");
    886      1.1.1.2    jruoho                 j++;
    887      1.1.1.2    jruoho                 continue;
    888      1.1.1.2    jruoho             }
    889      1.1.1.2    jruoho 
    890      1.1.1.2    jruoho             FlPrintFile (FileId, "%02X ", Buffer[i+j]);
    891      1.1.1.2    jruoho             j++;
    892      1.1.1.2    jruoho         }
    893      1.1.1.2    jruoho 
    894      1.1.1.2    jruoho         FlPrintFile (FileId, " ");
    895      1.1.1.2    jruoho         for (j = 0; j < 16; j++)
    896      1.1.1.2    jruoho         {
    897      1.1.1.2    jruoho             if (i + j >= Length)
    898      1.1.1.2    jruoho             {
    899      1.1.1.2    jruoho                 FlPrintFile (FileId, "\n\n");
    900      1.1.1.2    jruoho                 return;
    901      1.1.1.2    jruoho             }
    902      1.1.1.2    jruoho 
    903      1.1.1.2    jruoho             BufChar = Buffer[(ACPI_SIZE) i + j];
    904  1.1.1.5.2.2     skrll             if (isprint (BufChar))
    905      1.1.1.2    jruoho             {
    906      1.1.1.2    jruoho                 FlPrintFile (FileId, "%c", BufChar);
    907      1.1.1.2    jruoho             }
    908      1.1.1.2    jruoho             else
    909      1.1.1.2    jruoho             {
    910      1.1.1.2    jruoho                 FlPrintFile (FileId, ".");
    911      1.1.1.2    jruoho             }
    912      1.1.1.2    jruoho         }
    913      1.1.1.2    jruoho 
    914      1.1.1.2    jruoho         /* Done with that line. */
    915      1.1.1.2    jruoho 
    916      1.1.1.2    jruoho         FlPrintFile (FileId, "\n");
    917      1.1.1.2    jruoho         i += 16;
    918      1.1.1.2    jruoho     }
    919      1.1.1.2    jruoho 
    920      1.1.1.2    jruoho     FlPrintFile (FileId, "\n\n");
    921      1.1.1.2    jruoho }
    922      1.1.1.2    jruoho 
    923      1.1.1.2    jruoho 
    924      1.1.1.2    jruoho /******************************************************************************
    925      1.1.1.2    jruoho  *
    926      1.1.1.4  christos  * FUNCTION:    DtDumpFieldList
    927      1.1.1.4  christos  *
    928      1.1.1.4  christos  * PARAMETERS:  Field               - Root field
    929      1.1.1.4  christos  *
    930      1.1.1.4  christos  * RETURN:      None
    931      1.1.1.4  christos  *
    932      1.1.1.4  christos  * DESCRIPTION: Dump the entire field list
    933      1.1.1.4  christos  *
    934      1.1.1.4  christos  *****************************************************************************/
    935      1.1.1.4  christos 
    936      1.1.1.4  christos void
    937      1.1.1.4  christos DtDumpFieldList (
    938      1.1.1.4  christos     DT_FIELD                *Field)
    939      1.1.1.4  christos {
    940      1.1.1.4  christos 
    941      1.1.1.4  christos     if (!Gbl_DebugFlag || !Field)
    942      1.1.1.4  christos     {
    943      1.1.1.4  christos         return;
    944      1.1.1.4  christos     }
    945      1.1.1.4  christos 
    946      1.1.1.4  christos     DbgPrint (ASL_DEBUG_OUTPUT,  "\nField List:\n"
    947      1.1.1.4  christos         "LineNo   ByteOff  NameCol  Column   TableOff "
    948  1.1.1.5.2.1     skrll         "Flags %32s : %s\n\n", "Name", "Value");
    949      1.1.1.4  christos     while (Field)
    950      1.1.1.4  christos     {
    951      1.1.1.4  christos         DbgPrint (ASL_DEBUG_OUTPUT,
    952  1.1.1.5.2.1     skrll             "%.08X %.08X %.08X %.08X %.08X %2.2X    %32s : %s\n",
    953      1.1.1.4  christos             Field->Line, Field->ByteOffset, Field->NameColumn,
    954      1.1.1.4  christos             Field->Column, Field->TableOffset, Field->Flags,
    955      1.1.1.4  christos             Field->Name, Field->Value);
    956      1.1.1.4  christos 
    957      1.1.1.4  christos         Field = Field->Next;
    958      1.1.1.4  christos     }
    959      1.1.1.4  christos 
    960      1.1.1.4  christos     DbgPrint (ASL_DEBUG_OUTPUT,  "\n\n");
    961      1.1.1.4  christos }
    962      1.1.1.4  christos 
    963      1.1.1.4  christos 
    964      1.1.1.4  christos /******************************************************************************
    965      1.1.1.4  christos  *
    966      1.1.1.4  christos  * FUNCTION:    DtDumpSubtableInfo, DtDumpSubtableTree
    967      1.1.1.4  christos  *
    968      1.1.1.4  christos  * PARAMETERS:  DT_WALK_CALLBACK
    969      1.1.1.4  christos  *
    970      1.1.1.4  christos  * RETURN:      None
    971      1.1.1.4  christos  *
    972      1.1.1.4  christos  * DESCRIPTION: Info - dump a subtable tree entry with extra information.
    973      1.1.1.4  christos  *              Tree - dump a subtable tree formatted by depth indentation.
    974      1.1.1.4  christos  *
    975      1.1.1.4  christos  *****************************************************************************/
    976      1.1.1.4  christos 
    977      1.1.1.4  christos static void
    978      1.1.1.4  christos DtDumpSubtableInfo (
    979      1.1.1.4  christos     DT_SUBTABLE             *Subtable,
    980      1.1.1.4  christos     void                    *Context,
    981      1.1.1.4  christos     void                    *ReturnValue)
    982      1.1.1.4  christos {
    983      1.1.1.4  christos 
    984      1.1.1.4  christos     DbgPrint (ASL_DEBUG_OUTPUT,
    985  1.1.1.5.2.2     skrll         "[%.04X] %24s %.08X %.08X %.08X %.08X %.08X %p %p %p\n",
    986  1.1.1.5.2.2     skrll         Subtable->Depth, Subtable->Name, Subtable->Length, Subtable->TotalLength,
    987      1.1.1.4  christos         Subtable->SizeOfLengthField, Subtable->Flags, Subtable,
    988      1.1.1.4  christos         Subtable->Parent, Subtable->Child, Subtable->Peer);
    989      1.1.1.4  christos }
    990      1.1.1.4  christos 
    991      1.1.1.4  christos static void
    992      1.1.1.4  christos DtDumpSubtableTree (
    993      1.1.1.4  christos     DT_SUBTABLE             *Subtable,
    994      1.1.1.4  christos     void                    *Context,
    995      1.1.1.4  christos     void                    *ReturnValue)
    996      1.1.1.4  christos {
    997      1.1.1.4  christos 
    998      1.1.1.4  christos     DbgPrint (ASL_DEBUG_OUTPUT,
    999  1.1.1.5.2.2     skrll         "[%.04X] %24s %*s%08X (%.02X) - (%.02X)\n",
   1000  1.1.1.5.2.2     skrll         Subtable->Depth, Subtable->Name, (4 * Subtable->Depth), " ",
   1001      1.1.1.4  christos         Subtable, Subtable->Length, Subtable->TotalLength);
   1002      1.1.1.4  christos }
   1003      1.1.1.4  christos 
   1004      1.1.1.4  christos 
   1005      1.1.1.4  christos /******************************************************************************
   1006      1.1.1.4  christos  *
   1007      1.1.1.4  christos  * FUNCTION:    DtDumpSubtableList
   1008      1.1.1.4  christos  *
   1009      1.1.1.4  christos  * PARAMETERS:  None
   1010      1.1.1.4  christos  *
   1011      1.1.1.4  christos  * RETURN:      None
   1012      1.1.1.4  christos  *
   1013      1.1.1.4  christos  * DESCRIPTION: Dump the raw list of subtables with information, and also
   1014      1.1.1.4  christos  *              dump the subtable list in formatted tree format. Assists with
   1015      1.1.1.4  christos  *              the development of new table code.
   1016      1.1.1.4  christos  *
   1017      1.1.1.4  christos  *****************************************************************************/
   1018      1.1.1.4  christos 
   1019      1.1.1.4  christos void
   1020      1.1.1.4  christos DtDumpSubtableList (
   1021      1.1.1.4  christos     void)
   1022      1.1.1.4  christos {
   1023      1.1.1.4  christos 
   1024      1.1.1.4  christos     if (!Gbl_DebugFlag || !Gbl_RootTable)
   1025      1.1.1.4  christos     {
   1026      1.1.1.4  christos         return;
   1027      1.1.1.4  christos     }
   1028      1.1.1.4  christos 
   1029      1.1.1.4  christos     DbgPrint (ASL_DEBUG_OUTPUT,
   1030      1.1.1.4  christos         "Subtable Info:\n"
   1031  1.1.1.5.2.2     skrll         "Depth                      Name Length   TotalLen LenSize  Flags    "
   1032      1.1.1.4  christos         "This     Parent   Child    Peer\n\n");
   1033      1.1.1.4  christos     DtWalkTableTree (Gbl_RootTable, DtDumpSubtableInfo, NULL, NULL);
   1034      1.1.1.4  christos 
   1035      1.1.1.4  christos     DbgPrint (ASL_DEBUG_OUTPUT,
   1036  1.1.1.5.2.2     skrll         "\nSubtable Tree: (Depth, Name, Subtable, Length, TotalLength)\n\n");
   1037      1.1.1.4  christos     DtWalkTableTree (Gbl_RootTable, DtDumpSubtableTree, NULL, NULL);
   1038      1.1.1.5  christos 
   1039      1.1.1.5  christos     DbgPrint (ASL_DEBUG_OUTPUT, "\n");
   1040      1.1.1.4  christos }
   1041      1.1.1.4  christos 
   1042      1.1.1.4  christos 
   1043      1.1.1.4  christos /******************************************************************************
   1044      1.1.1.4  christos  *
   1045      1.1.1.2    jruoho  * FUNCTION:    DtWriteFieldToListing
   1046      1.1.1.2    jruoho  *
   1047      1.1.1.2    jruoho  * PARAMETERS:  Buffer              - Contains the compiled data
   1048      1.1.1.2    jruoho  *              Field               - Field node for the input line
   1049      1.1.1.2    jruoho  *              Length              - Length of the output data
   1050      1.1.1.2    jruoho  *
   1051      1.1.1.2    jruoho  * RETURN:      None
   1052      1.1.1.2    jruoho  *
   1053      1.1.1.2    jruoho  * DESCRIPTION: Write one field to the listing file (if listing is enabled).
   1054      1.1.1.2    jruoho  *
   1055      1.1.1.2    jruoho  *****************************************************************************/
   1056      1.1.1.2    jruoho 
   1057      1.1.1.2    jruoho void
   1058      1.1.1.2    jruoho DtWriteFieldToListing (
   1059      1.1.1.2    jruoho     UINT8                   *Buffer,
   1060      1.1.1.2    jruoho     DT_FIELD                *Field,
   1061      1.1.1.2    jruoho     UINT32                  Length)
   1062      1.1.1.2    jruoho {
   1063      1.1.1.2    jruoho     UINT8                   FileByte;
   1064      1.1.1.2    jruoho 
   1065      1.1.1.2    jruoho 
   1066      1.1.1.2    jruoho     if (!Gbl_ListingFlag || !Field)
   1067      1.1.1.2    jruoho     {
   1068      1.1.1.2    jruoho         return;
   1069      1.1.1.2    jruoho     }
   1070      1.1.1.2    jruoho 
   1071      1.1.1.2    jruoho     /* Dump the original source line */
   1072      1.1.1.2    jruoho 
   1073      1.1.1.2    jruoho     FlPrintFile (ASL_FILE_LISTING_OUTPUT, "Input:  ");
   1074      1.1.1.2    jruoho     FlSeekFile (ASL_FILE_INPUT, Field->ByteOffset);
   1075      1.1.1.2    jruoho 
   1076      1.1.1.2    jruoho     while (FlReadFile (ASL_FILE_INPUT, &FileByte, 1) == AE_OK)
   1077      1.1.1.2    jruoho     {
   1078      1.1.1.2    jruoho         FlWriteFile (ASL_FILE_LISTING_OUTPUT, &FileByte, 1);
   1079      1.1.1.2    jruoho         if (FileByte == '\n')
   1080      1.1.1.2    jruoho         {
   1081      1.1.1.2    jruoho             break;
   1082      1.1.1.2    jruoho         }
   1083      1.1.1.2    jruoho     }
   1084      1.1.1.2    jruoho 
   1085      1.1.1.2    jruoho     /* Dump the line as parsed and represented internally */
   1086      1.1.1.2    jruoho 
   1087      1.1.1.3    jruoho     FlPrintFile (ASL_FILE_LISTING_OUTPUT, "Parsed: %*s : %.64s",
   1088      1.1.1.2    jruoho         Field->Column-4, Field->Name, Field->Value);
   1089      1.1.1.2    jruoho 
   1090      1.1.1.3    jruoho     if (strlen (Field->Value) > 64)
   1091      1.1.1.3    jruoho     {
   1092      1.1.1.3    jruoho         FlPrintFile (ASL_FILE_LISTING_OUTPUT, "...Additional data, length 0x%X\n",
   1093      1.1.1.3    jruoho             strlen (Field->Value));
   1094      1.1.1.3    jruoho     }
   1095      1.1.1.3    jruoho     FlPrintFile (ASL_FILE_LISTING_OUTPUT, "\n");
   1096      1.1.1.3    jruoho 
   1097      1.1.1.2    jruoho     /* Dump the hex data that will be output for this field */
   1098      1.1.1.2    jruoho 
   1099      1.1.1.2    jruoho     DtDumpBuffer (ASL_FILE_LISTING_OUTPUT, Buffer, Field->TableOffset, Length);
   1100      1.1.1.2    jruoho }
   1101      1.1.1.2    jruoho 
   1102      1.1.1.2    jruoho 
   1103      1.1.1.2    jruoho /******************************************************************************
   1104      1.1.1.2    jruoho  *
   1105      1.1.1.2    jruoho  * FUNCTION:    DtWriteTableToListing
   1106      1.1.1.2    jruoho  *
   1107      1.1.1.2    jruoho  * PARAMETERS:  None
   1108      1.1.1.2    jruoho  *
   1109      1.1.1.2    jruoho  * RETURN:      None
   1110      1.1.1.2    jruoho  *
   1111      1.1.1.2    jruoho  * DESCRIPTION: Write the entire compiled table to the listing file
   1112      1.1.1.2    jruoho  *              in hex format
   1113      1.1.1.2    jruoho  *
   1114      1.1.1.2    jruoho  *****************************************************************************/
   1115      1.1.1.2    jruoho 
   1116      1.1.1.2    jruoho void
   1117      1.1.1.2    jruoho DtWriteTableToListing (
   1118      1.1.1.2    jruoho     void)
   1119      1.1.1.2    jruoho {
   1120      1.1.1.2    jruoho     UINT8                   *Buffer;
   1121      1.1.1.2    jruoho 
   1122      1.1.1.2    jruoho 
   1123      1.1.1.2    jruoho     if (!Gbl_ListingFlag)
   1124      1.1.1.2    jruoho     {
   1125      1.1.1.2    jruoho         return;
   1126      1.1.1.2    jruoho     }
   1127      1.1.1.2    jruoho 
   1128      1.1.1.2    jruoho     /* Read the entire table from the output file */
   1129      1.1.1.2    jruoho 
   1130      1.1.1.2    jruoho     Buffer = UtLocalCalloc (Gbl_TableLength);
   1131      1.1.1.2    jruoho     FlSeekFile (ASL_FILE_AML_OUTPUT, 0);
   1132      1.1.1.2    jruoho     FlReadFile (ASL_FILE_AML_OUTPUT, Buffer, Gbl_TableLength);
   1133      1.1.1.2    jruoho 
   1134      1.1.1.2    jruoho     /* Dump the raw table data */
   1135      1.1.1.2    jruoho 
   1136      1.1.1.2    jruoho     AcpiOsRedirectOutput (Gbl_Files[ASL_FILE_LISTING_OUTPUT].Handle);
   1137      1.1.1.2    jruoho 
   1138      1.1.1.2    jruoho     AcpiOsPrintf ("\n%s: Length %d (0x%X)\n\n",
   1139      1.1.1.2    jruoho         ACPI_RAW_TABLE_DATA_HEADER, Gbl_TableLength, Gbl_TableLength);
   1140      1.1.1.4  christos     AcpiUtDumpBuffer (Buffer, Gbl_TableLength, DB_BYTE_DISPLAY, 0);
   1141      1.1.1.2    jruoho 
   1142      1.1.1.2    jruoho     AcpiOsRedirectOutput (stdout);
   1143      1.1.1.4  christos     ACPI_FREE (Buffer);
   1144      1.1.1.2    jruoho }
   1145