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

📄 asltree.c

📁 acpi tools for linux include acpiexec and acpixtract
💻 C
📖 第 1 页 / 共 3 页
字号:
ACPI_PARSE_OBJECT *TrLinkPeerNode (    ACPI_PARSE_OBJECT       *Op1,    ACPI_PARSE_OBJECT       *Op2){    ACPI_PARSE_OBJECT       *Next;    DbgPrint (ASL_PARSE_OUTPUT,        "\nLinkPeerNode: 1=%p (%s), 2=%p (%s)\n\n",        Op1, Op1 ? UtGetOpName(Op1->Asl.ParseOpcode) : NULL,        Op2, Op2 ? UtGetOpName(Op2->Asl.ParseOpcode) : NULL);    if ((!Op1) && (!Op2))    {        DbgPrint (ASL_PARSE_OUTPUT, "\nTwo Null nodes!\n");        return Op1;    }    /* If one of the nodes is null, just return the non-null node */    if (!Op2)    {        return Op1;    }    if (!Op1)    {        return Op2;    }    if (Op1 == Op2)    {        DbgPrint (ASL_DEBUG_OUTPUT,            "\n\n************* Internal error, linking node to itself %p\n\n\n",            Op1);        AslError (ASL_WARNING, ASL_MSG_COMPILER_INTERNAL, Op1,            "Linking node to itself");        return Op1;    }    Op1->Asl.Parent = Op2->Asl.Parent;    /*     * Op 1 may already have a peer list (such as an IF/ELSE pair),     * so we must walk to the end of the list and attach the new     * peer at the end     */    Next = Op1;    while (Next->Asl.Next)    {        Next = Next->Asl.Next;    }    Next->Asl.Next = Op2;    return Op1;}/******************************************************************************* * * FUNCTION:    TrLinkPeerNodes * * PARAMETERS:  NumPeers            - The number of nodes in the list to follow *              ...                 - A list of nodes to link together as peers * * RETURN:      The first node in the list (head of the peer list) * * DESCRIPTION: Link together an arbitrary number of peer nodes. * ******************************************************************************/ACPI_PARSE_OBJECT *TrLinkPeerNodes (    UINT32                  NumPeers,    ...){    ACPI_PARSE_OBJECT       *This;    ACPI_PARSE_OBJECT       *Next;    va_list                 ap;    UINT32                  i;    ACPI_PARSE_OBJECT       *Start;    DbgPrint (ASL_PARSE_OUTPUT,        "\nLinkPeerNodes: (%d) ", NumPeers);    va_start (ap, NumPeers);    This = va_arg (ap, ACPI_PARSE_OBJECT *);    Start = This;    /*     * Link all peers     */    for (i = 0; i < (NumPeers -1); i++)    {        DbgPrint (ASL_PARSE_OUTPUT, "%d=%p ", (i+1), This);        while (This->Asl.Next)        {            This = This->Asl.Next;        }        /* Get another peer node */        Next = va_arg (ap, ACPI_PARSE_OBJECT *);        if (!Next)        {            Next = TrAllocateNode (PARSEOP_DEFAULT_ARG);        }        /* link new node to the current node */        This->Asl.Next = Next;        This = Next;    }    va_end (ap);    DbgPrint (ASL_PARSE_OUTPUT,"\n\n");    return (Start);}/******************************************************************************* * * FUNCTION:    TrLinkChildNode * * PARAMETERS:  Op1           - Parent node *              Op2           - Op to become a child * * RETURN:      The parent node * * DESCRIPTION: Link two nodes together as a parent and child * ******************************************************************************/ACPI_PARSE_OBJECT *TrLinkChildNode (    ACPI_PARSE_OBJECT       *Op1,    ACPI_PARSE_OBJECT       *Op2){    ACPI_PARSE_OBJECT       *Next;    DbgPrint (ASL_PARSE_OUTPUT,        "\nLinkChildNode: Parent=%p (%s), Child=%p (%s)\n\n",        Op1, Op1 ? UtGetOpName(Op1->Asl.ParseOpcode): NULL,        Op2, Op2 ? UtGetOpName(Op2->Asl.ParseOpcode): NULL);    if (!Op1 || !Op2)    {        return Op1;    }    Op1->Asl.Child = Op2;    /* Set the child and all peers of the child to point to the parent */    Next = Op2;    while (Next)    {        Next->Asl.Parent = Op1;        Next = Next->Asl.Next;    }    return Op1;}/******************************************************************************* * * FUNCTION:    TrWalkParseTree * * PARAMETERS:  Visitation              - Type of walk *              DescendingCallback      - Called during tree descent *              AscendingCallback       - Called during tree ascent *              Context                 - To be passed to the callbacks * * RETURN:      Status from callback(s) * * DESCRIPTION: Walk the entire parse tree. * ******************************************************************************/ACPI_STATUSTrWalkParseTree (    ACPI_PARSE_OBJECT       *Op,    UINT32                  Visitation,    ASL_WALK_CALLBACK       DescendingCallback,    ASL_WALK_CALLBACK       AscendingCallback,    void                    *Context){    UINT32                  Level;    BOOLEAN                 NodePreviouslyVisited;    ACPI_PARSE_OBJECT       *StartOp = Op;    ACPI_STATUS             Status;    if (!RootNode)    {        return (AE_OK);    }    Level = 0;    NodePreviouslyVisited = FALSE;    switch (Visitation)    {    case ASL_WALK_VISIT_DOWNWARD:        while (Op)        {            if (!NodePreviouslyVisited)            {                /* Let the callback process the node. */                Status = DescendingCallback (Op, Level, Context);                if (ACPI_SUCCESS (Status))                {                    /* Visit children first, once */                    if (Op->Asl.Child)                    {                        Level++;                        Op = Op->Asl.Child;                        continue;                    }                }                else if (Status != AE_CTRL_DEPTH)                {                    /* Exit immediately on any error */                    return (Status);                }            }            /* Terminate walk at start op */            if (Op == StartOp)            {                break;            }            /* No more children, visit peers */            if (Op->Asl.Next)            {                Op = Op->Asl.Next;                NodePreviouslyVisited = FALSE;            }            else            {                /* No children or peers, re-visit parent */                if (Level != 0 )                {                    Level--;                }                Op = Op->Asl.Parent;                NodePreviouslyVisited = TRUE;            }        }        break;    case ASL_WALK_VISIT_UPWARD:        while (Op)        {            /* Visit leaf node (no children) or parent node on return trip */            if ((!Op->Asl.Child) ||                (NodePreviouslyVisited))            {                /* Let the callback process the node. */                Status = AscendingCallback (Op, Level, Context);                if (ACPI_FAILURE (Status))                {                    return (Status);                }            }            else            {                /* Visit children first, once */                Level++;                Op = Op->Asl.Child;                continue;            }            /* Terminate walk at start op */            if (Op == StartOp)            {                break;            }            /* No more children, visit peers */            if (Op->Asl.Next)            {                Op = Op->Asl.Next;                NodePreviouslyVisited = FALSE;            }            else            {                /* No children or peers, re-visit parent */                if (Level != 0 )                {                    Level--;                }                Op = Op->Asl.Parent;                NodePreviouslyVisited = TRUE;            }        }        break;     case ASL_WALK_VISIT_TWICE:        while (Op)        {            if (NodePreviouslyVisited)            {                Status = AscendingCallback (Op, Level, Context);                if (ACPI_FAILURE (Status))                {                    return (Status);                }            }            else            {                /* Let the callback process the node. */                Status = DescendingCallback (Op, Level, Context);                if (ACPI_SUCCESS (Status))                {                    /* Visit children first, once */                    if (Op->Asl.Child)                    {                        Level++;                        Op = Op->Asl.Child;                        continue;                    }                }                else if (Status != AE_CTRL_DEPTH)                {                    /* Exit immediately on any error */                    return (Status);                }            }            /* Terminate walk at start op */            if (Op == StartOp)            {                break;            }            /* No more children, visit peers */            if (Op->Asl.Next)            {                Op = Op->Asl.Next;                NodePreviouslyVisited = FALSE;            }            else            {                /* No children or peers, re-visit parent */                if (Level != 0 )                {                    Level--;                }                Op = Op->Asl.Parent;                NodePreviouslyVisited = TRUE;            }        }        break;    default:        /* No other types supported */        break;    }    /* If we get here, the walk completed with no errors */    return (AE_OK);}

⌨️ 快捷键说明

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