mirror of https://github.com/acidanthera/audk.git
139 lines
4.5 KiB
C
139 lines
4.5 KiB
C
/** @file
|
|
AML Tree Traversal.
|
|
|
|
Copyright (c) 2019 - 2020, Arm Limited. All rights reserved.<BR>
|
|
|
|
SPDX-License-Identifier: BSD-2-Clause-Patent
|
|
**/
|
|
|
|
#ifndef AML_TREE_TRAVERSAL_H_
|
|
#define AML_TREE_TRAVERSAL_H_
|
|
|
|
#include <AmlNodeDefines.h>
|
|
|
|
/** Get the next sibling node among the children of the input Node.
|
|
|
|
This function traverses the FixedArguments followed by the
|
|
VariableArguments at the same level in the hierarchy.
|
|
|
|
Fixed arguments are before variable arguments.
|
|
|
|
(Node) /-i # Child of fixed argument b
|
|
\ /
|
|
|- [a][b][c][d] # Fixed Arguments
|
|
|- {(e)->(f)->(g)} # Variable Arguments
|
|
\
|
|
\-h # Child of variable argument e
|
|
|
|
Traversal Order: a, b, c, d, e, f, g, NULL
|
|
|
|
|
|
@param [in] Node Pointer to a root node or an object node.
|
|
@param [in] ChildNode Get the node after the ChildNode.
|
|
|
|
@return The node after the ChildNode among the children of the input Node.
|
|
- If ChildNode is NULL, return the first available node among
|
|
the fixed argument list then variable list of arguments;
|
|
- If ChildNode is the last node of the fixed argument list,
|
|
return the first argument of the variable list of arguments;
|
|
- If ChildNode is the last node of the variable list of arguments,
|
|
return NULL.
|
|
|
|
**/
|
|
AML_NODE_HEADER *
|
|
EFIAPI
|
|
AmlGetNextSibling (
|
|
IN CONST AML_NODE_HEADER * Node,
|
|
IN CONST AML_NODE_HEADER * ChildNode
|
|
);
|
|
|
|
/** Get the previous sibling node among the children of the input Node.
|
|
|
|
This function traverses the FixedArguments followed by the
|
|
VariableArguments at the same level in the hierarchy.
|
|
|
|
Fixed arguments are before variable arguments.
|
|
|
|
(Node) /-i # Child of fixed argument b
|
|
\ /
|
|
|- [a][b][c][d] # Fixed Arguments
|
|
|- {(e)->(f)->(g)} # Variable Arguments
|
|
\
|
|
\-h # Child of variable argument e
|
|
|
|
Traversal Order: g, f, e, d, c, b, a, NULL
|
|
|
|
@param [in] Node The node to get the fixed argument from.
|
|
@param [in] ChildNode Get the node before the ChildNode.
|
|
|
|
@return The node before the ChildNode among the children of the input Node.
|
|
- If ChildNode is NULL, return the last available node among
|
|
the variable list of arguments then fixed argument list;
|
|
- If ChildNode is the first node of the variable list of arguments,
|
|
return the last argument of the fixed argument list;
|
|
- If ChildNode is the first node of the fixed argument list,
|
|
return NULL.
|
|
**/
|
|
AML_NODE_HEADER *
|
|
EFIAPI
|
|
AmlGetPreviousSibling (
|
|
IN CONST AML_NODE_HEADER * Node,
|
|
IN CONST AML_NODE_HEADER * ChildNode
|
|
);
|
|
|
|
/** Iterate through the nodes in the same order as the AML bytestream.
|
|
|
|
The iteration is similar to a depth-first path.
|
|
|
|
(Node) /-i # Child of fixed argument b
|
|
\ /
|
|
|- [a][b][c][d] # Fixed Arguments
|
|
|- {(e)->(f)->(g)} # Variable Arguments
|
|
\
|
|
\-h # Child of variable argument e
|
|
|
|
Traversal Order: a, b, i, c, d, e, h, f, g, NULL
|
|
Note: The branch i and h will be traversed if it has any children.
|
|
|
|
@param [in] Node Pointer to a node.
|
|
|
|
@return The next node in the AML bytestream order.
|
|
Return NULL if Node is the Node corresponding to the last
|
|
bytecode of the tree.
|
|
**/
|
|
AML_NODE_HEADER *
|
|
EFIAPI
|
|
AmlGetNextNode (
|
|
IN CONST AML_NODE_HEADER * Node
|
|
);
|
|
|
|
/** Iterate through the nodes in the reverse order of the AML bytestream.
|
|
|
|
The iteration is similar to a depth-first path,
|
|
but done in a reverse order.
|
|
|
|
(Node) /-i # Child of fixed argument b
|
|
\ /
|
|
|- [a][b][c][d] # Fixed Arguments
|
|
|- {(e)->(f)->(g)} # Variable Arguments
|
|
\
|
|
\-h # Child of variable argument e
|
|
|
|
Traversal Order: g, f, h, e, d, c, i, b, a, NULL
|
|
Note: The branch i and h will be traversed if it has any children.
|
|
|
|
@param [in] Node Pointer to a node.
|
|
|
|
@return The previous node in the AML bytestream order.
|
|
Return NULL if Node is the Node corresponding to the last
|
|
bytecode of the tree.
|
|
**/
|
|
AML_NODE_HEADER *
|
|
EFIAPI
|
|
AmlGetPreviousNode (
|
|
IN CONST AML_NODE_HEADER * Node
|
|
);
|
|
|
|
#endif // AML_TREE_TRAVERSAL_H_
|
|
|