📄 asltree.c
字号:
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 + -