Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1.  
  2. /******************************************************************************
  3.  *
  4.  * Module Name: aslerror - Error handling and statistics
  5.  *
  6.  *****************************************************************************/
  7.  
  8. /******************************************************************************
  9.  *
  10.  * 1. Copyright Notice
  11.  *
  12.  * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp.
  13.  * All rights reserved.
  14.  *
  15.  * 2. License
  16.  *
  17.  * 2.1. This is your license from Intel Corp. under its intellectual property
  18.  * rights.  You may have additional license terms from the party that provided
  19.  * you this software, covering your right to use that party's intellectual
  20.  * property rights.
  21.  *
  22.  * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
  23.  * copy of the source code appearing in this file ("Covered Code") an
  24.  * irrevocable, perpetual, worldwide license under Intel's copyrights in the
  25.  * base code distributed originally by Intel ("Original Intel Code") to copy,
  26.  * make derivatives, distribute, use and display any portion of the Covered
  27.  * Code in any form, with the right to sublicense such rights; and
  28.  *
  29.  * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
  30.  * license (with the right to sublicense), under only those claims of Intel
  31.  * patents that are infringed by the Original Intel Code, to make, use, sell,
  32.  * offer to sell, and import the Covered Code and derivative works thereof
  33.  * solely to the minimum extent necessary to exercise the above copyright
  34.  * license, and in no event shall the patent license extend to any additions
  35.  * to or modifications of the Original Intel Code.  No other license or right
  36.  * is granted directly or by implication, estoppel or otherwise;
  37.  *
  38.  * The above copyright and patent license is granted only if the following
  39.  * conditions are met:
  40.  *
  41.  * 3. Conditions
  42.  *
  43.  * 3.1. Redistribution of Source with Rights to Further Distribute Source.
  44.  * Redistribution of source code of any substantial portion of the Covered
  45.  * Code or modification with rights to further distribute source must include
  46.  * the above Copyright Notice, the above License, this list of Conditions,
  47.  * and the following Disclaimer and Export Compliance provision.  In addition,
  48.  * Licensee must cause all Covered Code to which Licensee contributes to
  49.  * contain a file documenting the changes Licensee made to create that Covered
  50.  * Code and the date of any change.  Licensee must include in that file the
  51.  * documentation of any changes made by any predecessor Licensee.  Licensee
  52.  * must include a prominent statement that the modification is derived,
  53.  * directly or indirectly, from Original Intel Code.
  54.  *
  55.  * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
  56.  * Redistribution of source code of any substantial portion of the Covered
  57.  * Code or modification without rights to further distribute source must
  58.  * include the following Disclaimer and Export Compliance provision in the
  59.  * documentation and/or other materials provided with distribution.  In
  60.  * addition, Licensee may not authorize further sublicense of source of any
  61.  * portion of the Covered Code, and must include terms to the effect that the
  62.  * license from Licensee to its licensee is limited to the intellectual
  63.  * property embodied in the software Licensee provides to its licensee, and
  64.  * not to intellectual property embodied in modifications its licensee may
  65.  * make.
  66.  *
  67.  * 3.3. Redistribution of Executable. Redistribution in executable form of any
  68.  * substantial portion of the Covered Code or modification must reproduce the
  69.  * above Copyright Notice, and the following Disclaimer and Export Compliance
  70.  * provision in the documentation and/or other materials provided with the
  71.  * distribution.
  72.  *
  73.  * 3.4. Intel retains all right, title, and interest in and to the Original
  74.  * Intel Code.
  75.  *
  76.  * 3.5. Neither the name Intel nor any other trademark owned or controlled by
  77.  * Intel shall be used in advertising or otherwise to promote the sale, use or
  78.  * other dealings in products derived from or relating to the Covered Code
  79.  * without prior written authorization from Intel.
  80.  *
  81.  * 4. Disclaimer and Export Compliance
  82.  *
  83.  * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
  84.  * HERE.  ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
  85.  * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT,  ASSISTANCE,
  86.  * INSTALLATION, TRAINING OR OTHER SERVICES.  INTEL WILL NOT PROVIDE ANY
  87.  * UPDATES, ENHANCEMENTS OR EXTENSIONS.  INTEL SPECIFICALLY DISCLAIMS ANY
  88.  * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
  89.  * PARTICULAR PURPOSE.
  90.  *
  91.  * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
  92.  * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
  93.  * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
  94.  * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
  95.  * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
  96.  * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES.  THESE LIMITATIONS
  97.  * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
  98.  * LIMITED REMEDY.
  99.  *
  100.  * 4.3. Licensee shall not export, either directly or indirectly, any of this
  101.  * software or system incorporating such software without first obtaining any
  102.  * required license or other approval from the U. S. Department of Commerce or
  103.  * any other agency or department of the United States Government.  In the
  104.  * event Licensee exports any such software from the United States or
  105.  * re-exports any such software from a foreign destination, Licensee shall
  106.  * ensure that the distribution and export/re-export of the software is in
  107.  * compliance with all laws, regulations, orders, or other restrictions of the
  108.  * U.S. Export Administration Regulations. Licensee agrees that neither it nor
  109.  * any of its subsidiaries will export/re-export any technical data, process,
  110.  * software, or service, directly or indirectly, to any country for which the
  111.  * United States government or any agency thereof requires an export license,
  112.  * other governmental approval, or letter of assurance, without first obtaining
  113.  * such license, approval or letter.
  114.  *
  115.  *****************************************************************************/
  116.  
  117. #define ASL_EXCEPTIONS
  118. #include "aslcompiler.h"
  119.  
  120. #define _COMPONENT          ACPI_COMPILER
  121.         ACPI_MODULE_NAME    ("aslerror")
  122.  
  123. /* Local prototypes */
  124.  
  125. static void
  126. AeAddToErrorLog (
  127.     ASL_ERROR_MSG           *Enode);
  128.  
  129.  
  130. void
  131. AeClearErrorLog (
  132.     void)
  133. {
  134.     ASL_ERROR_MSG           *Enode = Gbl_ErrorLog;
  135.     ASL_ERROR_MSG           *Next;
  136.  
  137.     /* Walk the error node list */
  138.  
  139.     while (Enode)
  140.     {
  141.         Next = Enode->Next;
  142.         ACPI_FREE (Enode);
  143.         Enode = Next;
  144.     }
  145.  
  146.     Gbl_ErrorLog = NULL;
  147. }
  148.  
  149.  
  150. /*******************************************************************************
  151.  *
  152.  * FUNCTION:    AeAddToErrorLog
  153.  *
  154.  * PARAMETERS:  Enode       - An error node to add to the log
  155.  *
  156.  * RETURN:      None
  157.  *
  158.  * DESCRIPTION: Add a new error node to the error log.  The error log is
  159.  *              ordered by the "logical" line number (cumulative line number
  160.  *              including all include files.)
  161.  *
  162.  ******************************************************************************/
  163.  
  164. static void
  165. AeAddToErrorLog (
  166.     ASL_ERROR_MSG           *Enode)
  167. {
  168.     ASL_ERROR_MSG           *Next;
  169.     ASL_ERROR_MSG           *Prev;
  170.  
  171.  
  172.     /* If Gbl_ErrorLog is null, this is the first error node */
  173.  
  174.     if (!Gbl_ErrorLog)
  175.     {
  176.         Gbl_ErrorLog = Enode;
  177.         return;
  178.     }
  179.  
  180.     /*
  181.      * Walk error list until we find a line number greater than ours.
  182.      * List is sorted according to line number.
  183.      */
  184.     Prev = NULL;
  185.     Next = Gbl_ErrorLog;
  186.  
  187.     while ((Next) &&
  188.            (Next->LogicalLineNumber <= Enode->LogicalLineNumber))
  189.     {
  190.         Prev = Next;
  191.         Next = Next->Next;
  192.     }
  193.  
  194.     /* Found our place in the list */
  195.  
  196.     Enode->Next = Next;
  197.  
  198.     if (Prev)
  199.     {
  200.         Prev->Next = Enode;
  201.     }
  202.     else
  203.     {
  204.         Gbl_ErrorLog = Enode;
  205.     }
  206. }
  207.  
  208.  
  209. /*******************************************************************************
  210.  *
  211.  * FUNCTION:    AePrintException
  212.  *
  213.  * PARAMETERS:  FileId          - ID of output file
  214.  *              Enode           - Error node to print
  215.  *              Header          - Additional text before each message
  216.  *
  217.  * RETURN:      None
  218.  *
  219.  * DESCRIPTION: Print the contents of an error node.
  220.  *
  221.  * NOTE:        We don't use the FlxxxFile I/O functions here because on error
  222.  *              they abort the compiler and call this function!  Since we
  223.  *              are reporting errors here, we ignore most output errors and
  224.  *              just try to get out as much as we can.
  225.  *
  226.  ******************************************************************************/
  227.  
  228. void
  229. AePrintException (
  230.     UINT32                  FileId,
  231.     ASL_ERROR_MSG           *Enode,
  232.     char                    *Header)
  233. {
  234.     UINT8                   SourceByte;
  235.     int                     Actual;
  236.     size_t                  RActual;
  237.     UINT32                  MsgLength;
  238.     char                    *MainMessage;
  239.     char                    *ExtraMessage;
  240.     UINT32                  SourceColumn;
  241.     UINT32                  ErrorColumn;
  242.     FILE                    *OutputFile;
  243.     FILE                    *SourceFile;
  244.  
  245.  
  246.     if (Gbl_NoErrors)
  247.     {
  248.         return;
  249.     }
  250.  
  251.     /*
  252.      * Only listing files have a header, and remarks/optimizations
  253.      * are always output
  254.      */
  255.     if (!Header)
  256.     {
  257.         /* Ignore remarks if requested */
  258.  
  259.         switch (Enode->Level)
  260.         {
  261.         case ASL_REMARK:
  262.             if (!Gbl_DisplayRemarks)
  263.             {
  264.                 return;
  265.             }
  266.             break;
  267.  
  268.         case ASL_OPTIMIZATION:
  269.             if (!Gbl_DisplayOptimizations)
  270.             {
  271.                 return;
  272.             }
  273.             break;
  274.  
  275.         default:
  276.             break;
  277.         }
  278.     }
  279.  
  280.     /* Get the file handles */
  281.  
  282.     OutputFile = Gbl_Files[FileId].Handle;
  283.     SourceFile = Gbl_Files[ASL_FILE_SOURCE_OUTPUT].Handle;
  284.  
  285.     if (Header)
  286.     {
  287.         fprintf (OutputFile, "%s", Header);
  288.     }
  289.  
  290.     /* Print filename and line number if present and valid */
  291.  
  292.     if (Enode->Filename)
  293.     {
  294.         if (Gbl_VerboseErrors)
  295.         {
  296.             fprintf (OutputFile, "%6s", Enode->Filename);
  297.  
  298.             if (Enode->LineNumber)
  299.             {
  300.                 fprintf (OutputFile, "%6u: ", Enode->LineNumber);
  301.  
  302.                 /*
  303.                  * Seek to the offset in the combined source file, read the source
  304.                  * line, and write it to the output.
  305.                  */
  306.                 Actual = fseek (SourceFile, (long) Enode->LogicalByteOffset,
  307.                             (int) SEEK_SET);
  308.                 if (Actual)
  309.                 {
  310.                     fprintf (OutputFile,
  311.                         "[*** iASL: Seek error on source code temp file %s ***]",
  312.                         Gbl_Files[ASL_FILE_SOURCE_OUTPUT].Filename);
  313.                 }
  314.                 else
  315.                 {
  316.                     RActual = fread (&SourceByte, 1, 1, SourceFile);
  317.                     if (!RActual)
  318.                     {
  319.                         fprintf (OutputFile,
  320.                             "[*** iASL: Read error on source code temp file %s ***]",
  321.                             Gbl_Files[ASL_FILE_SOURCE_OUTPUT].Filename);
  322.                     }
  323.  
  324.                     else while (RActual && SourceByte && (SourceByte != '\n'))
  325.                     {
  326.                         fwrite (&SourceByte, 1, 1, OutputFile);
  327.                         RActual = fread (&SourceByte, 1, 1, SourceFile);
  328.                     }
  329.                 }
  330.                 fprintf (OutputFile, "\n");
  331.             }
  332.         }
  333.         else
  334.         {
  335.             fprintf (OutputFile, "%s", Enode->Filename);
  336.  
  337.             if (Enode->LineNumber)
  338.             {
  339.                 fprintf (OutputFile, "(%u) : ", Enode->LineNumber);
  340.             }
  341.         }
  342.     }
  343.  
  344.     /* NULL message ID, just print the raw message */
  345.  
  346.     if (Enode->MessageId == 0)
  347.     {
  348.         fprintf (OutputFile, "%s\n", Enode->Message);
  349.     }
  350.     else
  351.     {
  352.         /* Decode the message ID */
  353.  
  354.         fprintf (OutputFile, "%s %4.4d -",
  355.                     AslErrorLevel[Enode->Level],
  356.                     Enode->MessageId + ((Enode->Level+1) * 1000));
  357.  
  358.         MainMessage = AslMessages[Enode->MessageId];
  359.         ExtraMessage = Enode->Message;
  360.  
  361.         if (Enode->LineNumber)
  362.         {
  363.             MsgLength = strlen (MainMessage);
  364.             if (MsgLength == 0)
  365.             {
  366.                 MainMessage = Enode->Message;
  367.  
  368.                 MsgLength = strlen (MainMessage);
  369.                 ExtraMessage = NULL;
  370.             }
  371.  
  372.             if (Gbl_VerboseErrors)
  373.             {
  374.                 SourceColumn = Enode->Column + Enode->FilenameLength + 6 + 2;
  375.                 ErrorColumn = ASL_ERROR_LEVEL_LENGTH + 5 + 2 + 1;
  376.  
  377.                 if ((MsgLength + ErrorColumn) < (SourceColumn - 1))
  378.                 {
  379.                     fprintf (OutputFile, "%*s%s",
  380.                         (int) ((SourceColumn - 1) - ErrorColumn),
  381.                         MainMessage, " ^ ");
  382.                 }
  383.                 else
  384.                 {
  385.                     fprintf (OutputFile, "%*s %s",
  386.                         (int) ((SourceColumn - ErrorColumn) + 1), "^",
  387.                         MainMessage);
  388.                 }
  389.             }
  390.             else
  391.             {
  392.                 fprintf (OutputFile, " %s", MainMessage);
  393.             }
  394.  
  395.             /* Print the extra info message if present */
  396.  
  397.             if (ExtraMessage)
  398.             {
  399.                 fprintf (OutputFile, " (%s)", ExtraMessage);
  400.             }
  401.  
  402.             fprintf (OutputFile, "\n");
  403.             if (Gbl_VerboseErrors)
  404.             {
  405.                 fprintf (OutputFile, "\n");
  406.             }
  407.         }
  408.         else
  409.         {
  410.             fprintf (OutputFile, " %s %s\n\n", MainMessage, ExtraMessage);
  411.         }
  412.     }
  413. }
  414.  
  415.  
  416. /*******************************************************************************
  417.  *
  418.  * FUNCTION:    AePrintErrorLog
  419.  *
  420.  * PARAMETERS:  FileId           - Where to output the error log
  421.  *
  422.  * RETURN:      None
  423.  *
  424.  * DESCRIPTION: Print the entire contents of the error log
  425.  *
  426.  ******************************************************************************/
  427.  
  428. void
  429. AePrintErrorLog (
  430.     UINT32                  FileId)
  431. {
  432.     ASL_ERROR_MSG           *Enode = Gbl_ErrorLog;
  433.  
  434.  
  435.     /* Walk the error node list */
  436.  
  437.     while (Enode)
  438.     {
  439.         AePrintException (FileId, Enode, NULL);
  440.         Enode = Enode->Next;
  441.     }
  442. }
  443.  
  444.  
  445. /*******************************************************************************
  446.  *
  447.  * FUNCTION:    AslCommonError
  448.  *
  449.  * PARAMETERS:  Level               - Seriousness (Warning/error, etc.)
  450.  *              MessageId           - Index into global message buffer
  451.  *              CurrentLineNumber   - Actual file line number
  452.  *              LogicalLineNumber   - Cumulative line number
  453.  *              LogicalByteOffset   - Byte offset in source file
  454.  *              Column              - Column in current line
  455.  *              Filename            - source filename
  456.  *              ExtraMessage        - additional error message
  457.  *
  458.  * RETURN:      None
  459.  *
  460.  * DESCRIPTION: Create a new error node and add it to the error log
  461.  *
  462.  ******************************************************************************/
  463.  
  464. void
  465. AslCommonError (
  466.     UINT8                   Level,
  467.     UINT8                   MessageId,
  468.     UINT32                  CurrentLineNumber,
  469.     UINT32                  LogicalLineNumber,
  470.     UINT32                  LogicalByteOffset,
  471.     UINT32                  Column,
  472.     char                    *Filename,
  473.     char                    *ExtraMessage)
  474. {
  475.     UINT32                  MessageSize;
  476.     char                    *MessageBuffer = NULL;
  477.     ASL_ERROR_MSG           *Enode;
  478.  
  479.  
  480.     Enode = UtLocalCalloc (sizeof (ASL_ERROR_MSG));
  481.  
  482.     if (ExtraMessage)
  483.     {
  484.         /* Allocate a buffer for the message and a new error node */
  485.  
  486.         MessageSize   = strlen (ExtraMessage) + 1;
  487.         MessageBuffer = UtLocalCalloc (MessageSize);
  488.  
  489.         /* Keep a copy of the extra message */
  490.  
  491.         ACPI_STRCPY (MessageBuffer, ExtraMessage);
  492.     }
  493.  
  494.     /* Initialize the error node */
  495.  
  496.     if (Filename)
  497.     {
  498.         Enode->Filename       = Filename;
  499.         Enode->FilenameLength = strlen (Filename);
  500.         if (Enode->FilenameLength < 6)
  501.         {
  502.             Enode->FilenameLength = 6;
  503.         }
  504.     }
  505.  
  506.     Enode->MessageId            = MessageId;
  507.     Enode->Level                = Level;
  508.     Enode->LineNumber           = CurrentLineNumber;
  509.     Enode->LogicalLineNumber    = LogicalLineNumber;
  510.     Enode->LogicalByteOffset    = LogicalByteOffset;
  511.     Enode->Column               = Column;
  512.     Enode->Message              = MessageBuffer;
  513.  
  514.     /* Add the new node to the error node list */
  515.  
  516.     AeAddToErrorLog (Enode);
  517.  
  518.     if (Gbl_DebugFlag)
  519.     {
  520.         /* stderr is a file, send error to it immediately */
  521.  
  522.         AePrintException (ASL_FILE_STDERR, Enode, NULL);
  523.     }
  524.  
  525.     Gbl_ExceptionCount[Level]++;
  526.     if (Gbl_ExceptionCount[ASL_ERROR] > ASL_MAX_ERROR_COUNT)
  527.     {
  528.         printf ("\nMaximum error count (%u) exceeded\n", ASL_MAX_ERROR_COUNT);
  529.  
  530.         Gbl_SourceLine = 0;
  531.         Gbl_NextError = Gbl_ErrorLog;
  532.         CmDoOutputFiles ();
  533.         CmCleanupAndExit ();
  534.         exit(1);
  535.     }
  536.  
  537.     return;
  538. }
  539.  
  540.  
  541. /*******************************************************************************
  542.  *
  543.  * FUNCTION:    AslError
  544.  *
  545.  * PARAMETERS:  Level               - Seriousness (Warning/error, etc.)
  546.  *              MessageId           - Index into global message buffer
  547.  *              Op                  - Parse node where error happened
  548.  *              ExtraMessage        - additional error message
  549.  *
  550.  * RETURN:      None
  551.  *
  552.  * DESCRIPTION: Main error reporting routine for the ASL compiler (all code
  553.  *              except the parser.)
  554.  *
  555.  ******************************************************************************/
  556.  
  557. void
  558. AslError (
  559.     UINT8                   Level,
  560.     UINT8                   MessageId,
  561.     ACPI_PARSE_OBJECT       *Op,
  562.     char                    *ExtraMessage)
  563. {
  564.  
  565.     switch (Level)
  566.     {
  567.     case ASL_WARNING2:
  568.     case ASL_WARNING3:
  569.         if (Gbl_WarningLevel < Level)
  570.         {
  571.             return;
  572.         }
  573.         break;
  574.  
  575.     default:
  576.         break;
  577.     }
  578.  
  579.  
  580.     if (Op)
  581.     {
  582.         AslCommonError (Level, MessageId, Op->Asl.LineNumber,
  583.                         Op->Asl.LogicalLineNumber,
  584.                         Op->Asl.LogicalByteOffset,
  585.                         Op->Asl.Column,
  586.                         Op->Asl.Filename, ExtraMessage);
  587.     }
  588.     else
  589.     {
  590.         AslCommonError (Level, MessageId, 0,
  591.                         0, 0, 0, NULL, ExtraMessage);
  592.     }
  593. }
  594.  
  595.  
  596. /*******************************************************************************
  597.  *
  598.  * FUNCTION:    AslCoreSubsystemError
  599.  *
  600.  * PARAMETERS:  Op                  - Parse node where error happened
  601.  *              Status              - The ACPI CA Exception
  602.  *              ExtraMessage        - additional error message
  603.  *              Abort               - TRUE -> Abort compilation
  604.  *
  605.  * RETURN:      None
  606.  *
  607.  * DESCRIPTION: Error reporting routine for exceptions returned by the ACPI
  608.  *              CA core subsystem.
  609.  *
  610.  ******************************************************************************/
  611.  
  612. void
  613. AslCoreSubsystemError (
  614.     ACPI_PARSE_OBJECT       *Op,
  615.     ACPI_STATUS             Status,
  616.     char                    *ExtraMessage,
  617.     BOOLEAN                 Abort)
  618. {
  619.  
  620.     sprintf (MsgBuffer, "%s %s", AcpiFormatException (Status), ExtraMessage);
  621.  
  622.     if (Op)
  623.     {
  624.         AslCommonError (ASL_ERROR, ASL_MSG_CORE_EXCEPTION, Op->Asl.LineNumber,
  625.                         Op->Asl.LogicalLineNumber,
  626.                         Op->Asl.LogicalByteOffset,
  627.                         Op->Asl.Column,
  628.                         Op->Asl.Filename, MsgBuffer);
  629.     }
  630.     else
  631.     {
  632.         AslCommonError (ASL_ERROR, ASL_MSG_CORE_EXCEPTION, 0,
  633.                         0, 0, 0, NULL, MsgBuffer);
  634.     }
  635.  
  636.     if (Abort)
  637.     {
  638.         AslAbort ();
  639.     }
  640. }
  641.  
  642.  
  643. /*******************************************************************************
  644.  *
  645.  * FUNCTION:    AslCompilererror
  646.  *
  647.  * PARAMETERS:  CompilerMessage         - Error message from the parser
  648.  *
  649.  * RETURN:      Status (0 for now)
  650.  *
  651.  * DESCRIPTION: Report an error situation discovered in a production
  652.  *              NOTE: don't change the name of this function, it is called
  653.  *              from the auto-generated parser.
  654.  *
  655.  ******************************************************************************/
  656.  
  657. int
  658. AslCompilererror (
  659.     char                    *CompilerMessage)
  660. {
  661.  
  662.     AslCommonError (ASL_ERROR, ASL_MSG_SYNTAX, Gbl_CurrentLineNumber,
  663.                     Gbl_LogicalLineNumber, Gbl_CurrentLineOffset,
  664.                     Gbl_CurrentColumn, Gbl_Files[ASL_FILE_INPUT].Filename,
  665.                     CompilerMessage);
  666.  
  667.     return 0;
  668. }
  669.  
  670.  
  671.