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