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