⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 asllisting.c

📁 acpi tools for linux include acpiexec and acpixtract
💻 C
📖 第 1 页 / 共 3 页
字号:
    /* Create a new node */    Lnode = UtLocalCalloc (sizeof (ASL_LISTING_NODE));    /* Initialize */    Lnode->Filename = Filename;    Lnode->LineNumber = 0;    /* Link (push) */    Lnode->Next = Gbl_ListingNode;    Gbl_ListingNode = Lnode;}/******************************************************************************* * * FUNCTION:    LsPopNode * * PARAMETERS:  None * * RETURN:      List head after current head is popped off * * DESCRIPTION: Pop the current head of the list, free it, and return the *              next node on the stack (the new current node). * ******************************************************************************/static ASL_LISTING_NODE *LsPopNode (    void){    ASL_LISTING_NODE        *Lnode;    /* Just grab the node at the head of the list */    Lnode = Gbl_ListingNode;    if ((!Lnode) ||        (!Lnode->Next))    {        AslError (ASL_ERROR, ASL_MSG_COMPILER_INTERNAL, NULL,            "Could not pop empty listing stack");        return Gbl_ListingNode;    }    Gbl_ListingNode = Lnode->Next;    ACPI_FREE (Lnode);    /* New "Current" node is the new head */    return (Gbl_ListingNode);}/******************************************************************************* * * FUNCTION:    LsCheckException * * PARAMETERS:  LineNumber          - Current logical (cumulative) line # *              FileId              - ID of output listing file * * RETURN:      None * * DESCRIPTION: Check if there is an exception for this line, and if there is, *              put it in the listing immediately.  Handles multiple errors *              per line.  Gbl_NextError points to the next error in the *              sorted (by line #) list of compile errors/warnings. * ******************************************************************************/static voidLsCheckException (    UINT32                  LineNumber,    UINT32                  FileId){    if ((!Gbl_NextError) ||        (LineNumber < Gbl_NextError->LogicalLineNumber ))    {        return;    }    /* Handle multiple errors per line */    if (FileId == ASL_FILE_LISTING_OUTPUT)    {        while (Gbl_NextError &&              (LineNumber >= Gbl_NextError->LogicalLineNumber))        {            AePrintException (FileId, Gbl_NextError, "\n[****iasl****]\n");            Gbl_NextError = Gbl_NextError->Next;        }        FlPrintFile (FileId, "\n");    }}/******************************************************************************* * * FUNCTION:    LsFlushListingBuffer * * PARAMETERS:  FileId          - ID of the listing file * * RETURN:      None * * DESCRIPTION: Flush out the current contents of the 16-byte hex AML code *              buffer.  Usually called at the termination of a single line *              of source code or when the buffer is full. * ******************************************************************************/static voidLsFlushListingBuffer (    UINT32                  FileId){    UINT32                  i;    if (Gbl_CurrentHexColumn == 0)    {        return;    }    /* Write the hex bytes */    switch (FileId)    {    case ASL_FILE_LISTING_OUTPUT:        for (i = 0; i < Gbl_CurrentHexColumn; i++)        {            FlPrintFile (FileId, "%2.2X ", Gbl_AmlBuffer[i]);        }        for (i = 0; i < ((HEX_LISTING_LINE_SIZE - Gbl_CurrentHexColumn) * 3); i++)        {            FlWriteFile (FileId, ".", 1);        }        /* Write the ASCII character associated with each of the bytes */        LsDumpAscii (FileId, Gbl_CurrentHexColumn, Gbl_AmlBuffer);        break;    case ASL_FILE_ASM_SOURCE_OUTPUT:        for (i = 0; i < Gbl_CurrentHexColumn; i++)        {            if (i > 0)            {                FlPrintFile (FileId, ",");            }            FlPrintFile (FileId, "0%2.2Xh", Gbl_AmlBuffer[i]);        }        for (i = 0; i < ((HEX_LISTING_LINE_SIZE - Gbl_CurrentHexColumn) * 5); i++)        {            FlWriteFile (FileId, " ", 1);        }        FlPrintFile (FileId, "  ;%8.8X",            Gbl_CurrentAmlOffset - HEX_LISTING_LINE_SIZE);        /* Write the ASCII character associated with each of the bytes */        LsDumpAscii (FileId, Gbl_CurrentHexColumn, Gbl_AmlBuffer);        break;    case ASL_FILE_C_SOURCE_OUTPUT:        for (i = 0; i < Gbl_CurrentHexColumn; i++)        {            FlPrintFile (FileId, "0x%2.2X,", Gbl_AmlBuffer[i]);        }        for (i = 0; i < ((HEX_LISTING_LINE_SIZE - Gbl_CurrentHexColumn) * 5); i++)        {            FlWriteFile (FileId, " ", 1);        }        FlPrintFile (FileId, "    /* %8.8X",            Gbl_CurrentAmlOffset - HEX_LISTING_LINE_SIZE);        /* Write the ASCII character associated with each of the bytes */        LsDumpAsciiInComment (FileId, Gbl_CurrentHexColumn, Gbl_AmlBuffer);        FlPrintFile (FileId, " */");        break;    default:        /* No other types supported */        return;    }    FlPrintFile (FileId, "\n");    Gbl_CurrentHexColumn = 0;    Gbl_HexBytesWereWritten = TRUE;}/******************************************************************************* * * FUNCTION:    LsWriteListingHexBytes * * PARAMETERS:  Buffer          - AML code buffer *              Length          - Number of AML bytes to write *              FileId          - ID of current listing file. * * RETURN:      None * * DESCRIPTION: Write the contents of the AML buffer to the listing file via *              the listing buffer.  The listing buffer is flushed every 16 *              AML bytes. * ******************************************************************************/static voidLsWriteListingHexBytes (    UINT8                   *Buffer,    UINT32                  Length,    UINT32                  FileId){    UINT32                  i;    /* Transfer all requested bytes */    for (i = 0; i < Length; i++)    {        /* Print line header when buffer is empty */        if (Gbl_CurrentHexColumn == 0)        {            if (Gbl_HasIncludeFiles)            {                FlPrintFile (FileId, "%*s", 10, " ");            }            switch (FileId)            {            case ASL_FILE_LISTING_OUTPUT:                FlPrintFile (FileId, "%8.8X....", Gbl_CurrentAmlOffset);                break;            case ASL_FILE_ASM_SOURCE_OUTPUT:                FlPrintFile (FileId, "    db ");                break;            case ASL_FILE_C_SOURCE_OUTPUT:                FlPrintFile (FileId, "        ");                break;            default:                /* No other types supported */                return;            }        }        /* Transfer AML byte and update counts */        Gbl_AmlBuffer[Gbl_CurrentHexColumn] = Buffer[i];        Gbl_CurrentHexColumn++;        Gbl_CurrentAmlOffset++;        /* Flush buffer when it is full */        if (Gbl_CurrentHexColumn >= HEX_LISTING_LINE_SIZE)        {            LsFlushListingBuffer (FileId);        }    }}/******************************************************************************* * * FUNCTION:    LsWriteOneSourceLine * * PARAMETERS:  FileID          - ID of current listing file * * RETURN:      FALSE on EOF (input source file), TRUE otherwise * * DESCRIPTION: Read one line from the input source file and echo it to the *              listing file, prefixed with the line number, and if the source *              file contains include files, prefixed with the current filename * ******************************************************************************/static UINT32LsWriteOneSourceLine (    UINT32                  FileId){    UINT8                   FileByte;    Gbl_SourceLine++;    Gbl_ListingNode->LineNumber++;    if (FileId == ASL_FILE_C_SOURCE_OUTPUT)    {        FlPrintFile (FileId, "     *");    }    if (FileId == ASL_FILE_ASM_SOURCE_OUTPUT)    {        FlPrintFile (FileId, "; ");    }    if (Gbl_HasIncludeFiles)    {        /*         * This file contains "include" statements, print the current         * filename and line number within the current file         */        FlPrintFile (FileId, "%12s %5d....",                    Gbl_ListingNode->Filename, Gbl_ListingNode->LineNumber);    }    else    {        /* No include files, just print the line number */        FlPrintFile (FileId, "%8d....", Gbl_SourceLine);    }    /* Read one line (up to a newline or EOF) */    while (FlReadFile (ASL_FILE_SOURCE_OUTPUT, &FileByte, 1) == AE_OK)    {        if (FileId == ASL_FILE_C_SOURCE_OUTPUT)        {            if (FileByte == '/')            {                FileByte = '*';            }        }        FlWriteFile (FileId, &FileByte, 1);        if (FileByte == '\n')        {            /*             * Check if an error occurred on this source line during the compile.             * If so, we print the error message after the source line.             */            LsCheckException (Gbl_SourceLine, FileId);            return (1);        }    }    /* EOF on the input file was reached */    return (0);}/******************************************************************************* * * FUNCTION:    LsFinishSourceListing * * PARAMETERS:  FileId          - ID of current listing file. * * RETURN:      None * * DESCRIPTION: Cleanup routine for the listing file.  Flush the hex AML *              listing buffer, and flush out any remaining lines in the *              source input file. * ******************************************************************************/static voidLsFinishSourceListing (    UINT32                  FileId){    if ((FileId == ASL_FILE_ASM_INCLUDE_OUTPUT) ||        (FileId == ASL_FILE_C_INCLUDE_OUTPUT))    {        return;    }    LsFlushListingBuffer (FileId);    Gbl_CurrentAmlOffset = 0;    /* Flush any remaining text in the source file */    if (FileId == ASL_FILE_C_SOURCE_OUTPUT)    {        FlPrintFile (FileId, "    /*\n");    }    while (LsWriteOneSourceLine (FileId))    { ; }    if (FileId == ASL_FILE_C_SOURCE_OUTPUT)    {        FlPrintFile (FileId, "\n     */\n    };\n");    }    FlPrintFile (FileId, "\n");    if (FileId == ASL_FILE_LISTING_OUTPUT)    {        /* Print a summary of the compile exceptions */        FlPrintFile (FileId, "\n\nSummary of errors and warnings\n\n");        AePrintErrorLog (FileId);        FlPrintFile (FileId, "\n\n");        UtDisplaySummary (FileId);        FlPrintFile (FileId, "\n\n");    }}/******************************************************************************* * * FUNCTION:    LsWriteSourceLines * * PARAMETERS:  ToLineNumber            - *              ToLogicalLineNumber     - Write up to this source line number *              FileId                  - ID of current listing file * * RETURN:      None * * DESCRIPTION: Read then write source lines to the listing file until we have *              reached the specified logical (cumulative) line number.  This *              automatically echos out comment blocks and other non-AML *              generating text until we get to the actual AML-generating line *              of ASL code specified by the logical line number. * ******************************************************************************/static voidLsWriteSourceLines (    UINT32                  ToLineNumber,    UINT32                  ToLogicalLineNumber,    UINT32                  FileId){    if ((FileId == ASL_FILE_ASM_INCLUDE_OUTPUT) ||        (FileId == ASL_FILE_C_INCLUDE_OUTPUT))    {        return;    }    Gbl_CurrentLine = ToLogicalLineNumber;    /* Flush any hex bytes remaining from the last opcode */    LsFlushListingBuffer (FileId);    /* Read lines and write them as long as we are not caught up */    if (Gbl_SourceLine < Gbl_CurrentLine)    {        /*         * If we just completed writing some AML hex bytes, output a linefeed         * to add some whitespace for readability.         */        if (Gbl_HexBytesWereWritten)        {            FlPrintFile (FileId, "\n");            Gbl_HexBytesWereWritten = FALSE;        }        if (FileId == ASL_FILE_C_SOURCE_OUTPUT)        {            FlPrintFile (FileId, "    /*\n");        }        /* Write one line at a time until we have reached the target line # */        while ((Gbl_SourceLine < Gbl_CurrentLine) &&                LsWriteOneSourceLine (FileId))        { ; }        if (FileId == ASL_FILE_C_SOURCE_OUTPUT)        {            FlPrintFile (FileId, "     */");        }        FlPrintFile (FileId, "\n");    }}/******************************************************************************* * * FUNCTION:    LsWriteNodeToListing * * PARAMETERS:  Op            - Parse node to write to the listing file.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -