Home | History | Annotate | Line # | Download | only in compiler
aslascii.c revision 1.1.1.1.2.3
      1          1.1  christos /******************************************************************************
      2          1.1  christos  *
      3          1.1  christos  * Module Name: aslascii - ASCII detection and support routines
      4          1.1  christos  *
      5          1.1  christos  *****************************************************************************/
      6          1.1  christos 
      7          1.1  christos /*
      8  1.1.1.1.2.3     skrll  * Copyright (C) 2000 - 2016, Intel Corp.
      9          1.1  christos  * All rights reserved.
     10          1.1  christos  *
     11          1.1  christos  * Redistribution and use in source and binary forms, with or without
     12          1.1  christos  * modification, are permitted provided that the following conditions
     13          1.1  christos  * are met:
     14          1.1  christos  * 1. Redistributions of source code must retain the above copyright
     15          1.1  christos  *    notice, this list of conditions, and the following disclaimer,
     16          1.1  christos  *    without modification.
     17          1.1  christos  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
     18          1.1  christos  *    substantially similar to the "NO WARRANTY" disclaimer below
     19          1.1  christos  *    ("Disclaimer") and any redistribution must be conditioned upon
     20          1.1  christos  *    including a substantially similar Disclaimer requirement for further
     21          1.1  christos  *    binary redistribution.
     22          1.1  christos  * 3. Neither the names of the above-listed copyright holders nor the names
     23          1.1  christos  *    of any contributors may be used to endorse or promote products derived
     24          1.1  christos  *    from this software without specific prior written permission.
     25          1.1  christos  *
     26          1.1  christos  * Alternatively, this software may be distributed under the terms of the
     27          1.1  christos  * GNU General Public License ("GPL") version 2 as published by the Free
     28          1.1  christos  * Software Foundation.
     29          1.1  christos  *
     30          1.1  christos  * NO WARRANTY
     31          1.1  christos  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
     32          1.1  christos  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
     33          1.1  christos  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
     34          1.1  christos  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
     35          1.1  christos  * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     36          1.1  christos  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     37          1.1  christos  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     38          1.1  christos  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
     39          1.1  christos  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
     40          1.1  christos  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     41          1.1  christos  * POSSIBILITY OF SUCH DAMAGES.
     42          1.1  christos  */
     43          1.1  christos 
     44          1.1  christos #include "aslcompiler.h"
     45  1.1.1.1.2.3     skrll #include <actables.h>
     46          1.1  christos #include <acapps.h>
     47          1.1  christos 
     48          1.1  christos #define _COMPONENT          ACPI_COMPILER
     49          1.1  christos         ACPI_MODULE_NAME    ("aslascii")
     50          1.1  christos 
     51          1.1  christos 
     52          1.1  christos /* Local prototypes */
     53          1.1  christos 
     54          1.1  christos static void
     55          1.1  christos FlConsumeAnsiComment (
     56          1.1  christos     FILE                    *Handle,
     57          1.1  christos     ASL_FILE_STATUS         *Status);
     58          1.1  christos 
     59          1.1  christos static void
     60          1.1  christos FlConsumeNewComment (
     61          1.1  christos     FILE                    *Handle,
     62          1.1  christos     ASL_FILE_STATUS         *Status);
     63          1.1  christos 
     64          1.1  christos 
     65          1.1  christos /*******************************************************************************
     66          1.1  christos  *
     67  1.1.1.1.2.3     skrll  * FUNCTION:    FlIsFileAsciiSource
     68          1.1  christos  *
     69  1.1.1.1.2.2     skrll  * PARAMETERS:  Filename            - Full input filename
     70          1.1  christos  *              DisplayErrors       - TRUE if error messages desired
     71          1.1  christos  *
     72          1.1  christos  * RETURN:      Status
     73          1.1  christos  *
     74          1.1  christos  * DESCRIPTION: Verify that the input file is entirely ASCII. Ignores characters
     75          1.1  christos  *              within comments. Note: does not handle nested comments and does
     76          1.1  christos  *              not handle comment delimiters within string literals. However,
     77          1.1  christos  *              on the rare chance this happens and an invalid character is
     78          1.1  christos  *              missed, the parser will catch the error by failing in some
     79          1.1  christos  *              spectactular manner.
     80          1.1  christos  *
     81          1.1  christos  ******************************************************************************/
     82          1.1  christos 
     83          1.1  christos ACPI_STATUS
     84  1.1.1.1.2.3     skrll FlIsFileAsciiSource (
     85          1.1  christos     char                    *Filename,
     86          1.1  christos     BOOLEAN                 DisplayErrors)
     87          1.1  christos {
     88          1.1  christos     UINT8                   Byte;
     89          1.1  christos     ACPI_SIZE               BadBytes = 0;
     90          1.1  christos     BOOLEAN                 OpeningComment = FALSE;
     91          1.1  christos     ASL_FILE_STATUS         Status;
     92  1.1.1.1.2.2     skrll     FILE                    *Handle;
     93  1.1.1.1.2.2     skrll 
     94          1.1  christos 
     95  1.1.1.1.2.2     skrll     /* Open file in text mode so file offset is always accurate */
     96  1.1.1.1.2.2     skrll 
     97  1.1.1.1.2.2     skrll     Handle = fopen (Filename, "rb");
     98  1.1.1.1.2.2     skrll     if (!Handle)
     99  1.1.1.1.2.2     skrll     {
    100  1.1.1.1.2.2     skrll         perror ("Could not open input file");
    101  1.1.1.1.2.2     skrll         return (AE_ERROR);
    102  1.1.1.1.2.2     skrll     }
    103          1.1  christos 
    104          1.1  christos     Status.Line = 1;
    105          1.1  christos     Status.Offset = 0;
    106          1.1  christos 
    107          1.1  christos     /* Read the entire file */
    108          1.1  christos 
    109          1.1  christos     while (fread (&Byte, 1, 1, Handle) == 1)
    110          1.1  christos     {
    111          1.1  christos         /* Ignore comment fields (allow non-ascii within) */
    112          1.1  christos 
    113          1.1  christos         if (OpeningComment)
    114          1.1  christos         {
    115          1.1  christos             /* Check for second comment open delimiter */
    116          1.1  christos 
    117          1.1  christos             if (Byte == '*')
    118          1.1  christos             {
    119          1.1  christos                 FlConsumeAnsiComment (Handle, &Status);
    120          1.1  christos             }
    121          1.1  christos 
    122          1.1  christos             if (Byte == '/')
    123          1.1  christos             {
    124          1.1  christos                 FlConsumeNewComment (Handle, &Status);
    125          1.1  christos             }
    126          1.1  christos 
    127          1.1  christos             /* Reset */
    128          1.1  christos 
    129          1.1  christos             OpeningComment = FALSE;
    130          1.1  christos         }
    131          1.1  christos         else if (Byte == '/')
    132          1.1  christos         {
    133          1.1  christos             OpeningComment = TRUE;
    134          1.1  christos         }
    135          1.1  christos 
    136          1.1  christos         /* Check for an ASCII character */
    137          1.1  christos 
    138          1.1  christos         if (!ACPI_IS_ASCII (Byte))
    139          1.1  christos         {
    140          1.1  christos             if ((BadBytes < 10) && (DisplayErrors))
    141          1.1  christos             {
    142          1.1  christos                 AcpiOsPrintf (
    143  1.1.1.1.2.2     skrll                     "Found non-ASCII character in source text: "
    144  1.1.1.1.2.2     skrll                     "0x%2.2X in line %u, file offset 0x%2.2X\n",
    145          1.1  christos                     Byte, Status.Line, Status.Offset);
    146          1.1  christos             }
    147  1.1.1.1.2.2     skrll             BadBytes++;
    148  1.1.1.1.2.2     skrll         }
    149  1.1.1.1.2.2     skrll 
    150  1.1.1.1.2.2     skrll         /* Ensure character is either printable or a "space" char */
    151          1.1  christos 
    152  1.1.1.1.2.2     skrll         else if (!isprint (Byte) && !isspace (Byte))
    153  1.1.1.1.2.2     skrll         {
    154  1.1.1.1.2.2     skrll             if ((BadBytes < 10) && (DisplayErrors))
    155  1.1.1.1.2.2     skrll             {
    156  1.1.1.1.2.2     skrll                 AcpiOsPrintf (
    157  1.1.1.1.2.2     skrll                     "Found invalid character in source text: "
    158  1.1.1.1.2.2     skrll                     "0x%2.2X in line %u, file offset 0x%2.2X\n",
    159  1.1.1.1.2.2     skrll                     Byte, Status.Line, Status.Offset);
    160  1.1.1.1.2.2     skrll             }
    161          1.1  christos             BadBytes++;
    162          1.1  christos         }
    163          1.1  christos 
    164  1.1.1.1.2.2     skrll         /* Update line counter as necessary */
    165          1.1  christos 
    166  1.1.1.1.2.2     skrll         if (Byte == 0x0A)
    167          1.1  christos         {
    168          1.1  christos             Status.Line++;
    169          1.1  christos         }
    170          1.1  christos 
    171          1.1  christos         Status.Offset++;
    172          1.1  christos     }
    173          1.1  christos 
    174  1.1.1.1.2.2     skrll     fclose (Handle);
    175          1.1  christos 
    176          1.1  christos     /* Were there any non-ASCII characters in the file? */
    177          1.1  christos 
    178          1.1  christos     if (BadBytes)
    179          1.1  christos     {
    180          1.1  christos         if (DisplayErrors)
    181          1.1  christos         {
    182          1.1  christos             AcpiOsPrintf (
    183  1.1.1.1.2.2     skrll                 "Total %u invalid characters found in input source text, "
    184  1.1.1.1.2.2     skrll                 "could be a binary file\n", BadBytes);
    185          1.1  christos             AslError (ASL_ERROR, ASL_MSG_NON_ASCII, NULL, Filename);
    186          1.1  christos         }
    187          1.1  christos 
    188          1.1  christos         return (AE_BAD_CHARACTER);
    189          1.1  christos     }
    190          1.1  christos 
    191          1.1  christos     /* File is OK (100% ASCII) */
    192          1.1  christos 
    193          1.1  christos     return (AE_OK);
    194          1.1  christos }
    195          1.1  christos 
    196          1.1  christos 
    197          1.1  christos /*******************************************************************************
    198          1.1  christos  *
    199          1.1  christos  * FUNCTION:    FlConsumeAnsiComment
    200          1.1  christos  *
    201          1.1  christos  * PARAMETERS:  Handle              - Open input file
    202          1.1  christos  *              Status              - File current status struct
    203          1.1  christos  *
    204          1.1  christos  * RETURN:      Number of lines consumed
    205          1.1  christos  *
    206          1.1  christos  * DESCRIPTION: Step over a normal slash-star type comment
    207          1.1  christos  *
    208          1.1  christos  ******************************************************************************/
    209          1.1  christos 
    210          1.1  christos static void
    211          1.1  christos FlConsumeAnsiComment (
    212          1.1  christos     FILE                    *Handle,
    213          1.1  christos     ASL_FILE_STATUS         *Status)
    214          1.1  christos {
    215          1.1  christos     UINT8                   Byte;
    216          1.1  christos     BOOLEAN                 ClosingComment = FALSE;
    217          1.1  christos 
    218          1.1  christos 
    219          1.1  christos     while (fread (&Byte, 1, 1, Handle) == 1)
    220          1.1  christos     {
    221          1.1  christos         /* Scan until comment close is found */
    222          1.1  christos 
    223          1.1  christos         if (ClosingComment)
    224          1.1  christos         {
    225          1.1  christos             if (Byte == '/')
    226          1.1  christos             {
    227  1.1.1.1.2.2     skrll                 Status->Offset++;
    228          1.1  christos                 return;
    229          1.1  christos             }
    230          1.1  christos 
    231          1.1  christos             if (Byte != '*')
    232          1.1  christos             {
    233          1.1  christos                 /* Reset */
    234          1.1  christos 
    235          1.1  christos                 ClosingComment = FALSE;
    236          1.1  christos             }
    237          1.1  christos         }
    238          1.1  christos         else if (Byte == '*')
    239          1.1  christos         {
    240          1.1  christos             ClosingComment = TRUE;
    241          1.1  christos         }
    242          1.1  christos 
    243          1.1  christos         /* Maintain line count */
    244          1.1  christos 
    245          1.1  christos         if (Byte == 0x0A)
    246          1.1  christos         {
    247          1.1  christos             Status->Line++;
    248          1.1  christos         }
    249          1.1  christos 
    250          1.1  christos         Status->Offset++;
    251          1.1  christos     }
    252          1.1  christos }
    253          1.1  christos 
    254          1.1  christos 
    255          1.1  christos /*******************************************************************************
    256          1.1  christos  *
    257          1.1  christos  * FUNCTION:    FlConsumeNewComment
    258          1.1  christos  *
    259          1.1  christos  * PARAMETERS:  Handle              - Open input file
    260          1.1  christos  *              Status              - File current status struct
    261          1.1  christos  *
    262          1.1  christos  * RETURN:      Number of lines consumed
    263          1.1  christos  *
    264          1.1  christos  * DESCRIPTION: Step over a slash-slash type of comment
    265          1.1  christos  *
    266          1.1  christos  ******************************************************************************/
    267          1.1  christos 
    268          1.1  christos static void
    269          1.1  christos FlConsumeNewComment (
    270          1.1  christos     FILE                    *Handle,
    271          1.1  christos     ASL_FILE_STATUS         *Status)
    272          1.1  christos {
    273          1.1  christos     UINT8                   Byte;
    274          1.1  christos 
    275          1.1  christos 
    276          1.1  christos     while (fread (&Byte, 1, 1, Handle) == 1)
    277          1.1  christos     {
    278          1.1  christos         Status->Offset++;
    279          1.1  christos 
    280          1.1  christos         /* Comment ends at newline */
    281          1.1  christos 
    282          1.1  christos         if (Byte == 0x0A)
    283          1.1  christos         {
    284          1.1  christos             Status->Line++;
    285          1.1  christos             return;
    286          1.1  christos         }
    287          1.1  christos     }
    288          1.1  christos }
    289