xref: /freebsd/sys/contrib/dev/acpica/components/parser/pswalk.c (revision f8146b882bc156c1d8ddf14bbea67253ebc064bb)
1a159c266SJung-uk Kim /******************************************************************************
2a159c266SJung-uk Kim  *
3a159c266SJung-uk Kim  * Module Name: pswalk - Parser routines to walk parsed op tree(s)
4a159c266SJung-uk Kim  *
5a159c266SJung-uk Kim  *****************************************************************************/
6a159c266SJung-uk Kim 
7a159c266SJung-uk Kim /*
8*f8146b88SJung-uk Kim  * Copyright (C) 2000 - 2016, Intel Corp.
9a159c266SJung-uk Kim  * All rights reserved.
10a159c266SJung-uk Kim  *
11a159c266SJung-uk Kim  * Redistribution and use in source and binary forms, with or without
12a159c266SJung-uk Kim  * modification, are permitted provided that the following conditions
13a159c266SJung-uk Kim  * are met:
14a159c266SJung-uk Kim  * 1. Redistributions of source code must retain the above copyright
15a159c266SJung-uk Kim  *    notice, this list of conditions, and the following disclaimer,
16a159c266SJung-uk Kim  *    without modification.
17a159c266SJung-uk Kim  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
18a159c266SJung-uk Kim  *    substantially similar to the "NO WARRANTY" disclaimer below
19a159c266SJung-uk Kim  *    ("Disclaimer") and any redistribution must be conditioned upon
20a159c266SJung-uk Kim  *    including a substantially similar Disclaimer requirement for further
21a159c266SJung-uk Kim  *    binary redistribution.
22a159c266SJung-uk Kim  * 3. Neither the names of the above-listed copyright holders nor the names
23a159c266SJung-uk Kim  *    of any contributors may be used to endorse or promote products derived
24a159c266SJung-uk Kim  *    from this software without specific prior written permission.
25a159c266SJung-uk Kim  *
26a159c266SJung-uk Kim  * Alternatively, this software may be distributed under the terms of the
27a159c266SJung-uk Kim  * GNU General Public License ("GPL") version 2 as published by the Free
28a159c266SJung-uk Kim  * Software Foundation.
29a159c266SJung-uk Kim  *
30a159c266SJung-uk Kim  * NO WARRANTY
31a159c266SJung-uk Kim  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
32a159c266SJung-uk Kim  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
33a159c266SJung-uk Kim  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
34a159c266SJung-uk Kim  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
35a159c266SJung-uk Kim  * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
36a159c266SJung-uk Kim  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
37a159c266SJung-uk Kim  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
38a159c266SJung-uk Kim  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
39a159c266SJung-uk Kim  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
40a159c266SJung-uk Kim  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
41a159c266SJung-uk Kim  * POSSIBILITY OF SUCH DAMAGES.
42a159c266SJung-uk Kim  */
43a159c266SJung-uk Kim 
44a159c266SJung-uk Kim #include <contrib/dev/acpica/include/acpi.h>
45a159c266SJung-uk Kim #include <contrib/dev/acpica/include/accommon.h>
46a159c266SJung-uk Kim #include <contrib/dev/acpica/include/acparser.h>
47a159c266SJung-uk Kim 
48a159c266SJung-uk Kim #define _COMPONENT          ACPI_PARSER
49a159c266SJung-uk Kim         ACPI_MODULE_NAME    ("pswalk")
50a159c266SJung-uk Kim 
51a159c266SJung-uk Kim 
52a159c266SJung-uk Kim /*******************************************************************************
53a159c266SJung-uk Kim  *
54a159c266SJung-uk Kim  * FUNCTION:    AcpiPsDeleteParseTree
55a159c266SJung-uk Kim  *
56a159c266SJung-uk Kim  * PARAMETERS:  SubtreeRoot         - Root of tree (or subtree) to delete
57a159c266SJung-uk Kim  *
58a159c266SJung-uk Kim  * RETURN:      None
59a159c266SJung-uk Kim  *
60a159c266SJung-uk Kim  * DESCRIPTION: Delete a portion of or an entire parse tree.
61a159c266SJung-uk Kim  *
62a159c266SJung-uk Kim  ******************************************************************************/
63a159c266SJung-uk Kim 
64a159c266SJung-uk Kim void
65a159c266SJung-uk Kim AcpiPsDeleteParseTree (
66a159c266SJung-uk Kim     ACPI_PARSE_OBJECT       *SubtreeRoot)
67a159c266SJung-uk Kim {
68a159c266SJung-uk Kim     ACPI_PARSE_OBJECT       *Op = SubtreeRoot;
69a159c266SJung-uk Kim     ACPI_PARSE_OBJECT       *Next = NULL;
70a159c266SJung-uk Kim     ACPI_PARSE_OBJECT       *Parent = NULL;
71a159c266SJung-uk Kim 
72a159c266SJung-uk Kim 
73a159c266SJung-uk Kim     ACPI_FUNCTION_TRACE_PTR (PsDeleteParseTree, SubtreeRoot);
74a159c266SJung-uk Kim 
75a159c266SJung-uk Kim 
76a159c266SJung-uk Kim     /* Visit all nodes in the subtree */
77a159c266SJung-uk Kim 
78a159c266SJung-uk Kim     while (Op)
79a159c266SJung-uk Kim     {
80a159c266SJung-uk Kim         /* Check if we are not ascending */
81a159c266SJung-uk Kim 
82a159c266SJung-uk Kim         if (Op != Parent)
83a159c266SJung-uk Kim         {
84a159c266SJung-uk Kim             /* Look for an argument or child of the current op */
85a159c266SJung-uk Kim 
86a159c266SJung-uk Kim             Next = AcpiPsGetArg (Op, 0);
87a159c266SJung-uk Kim             if (Next)
88a159c266SJung-uk Kim             {
89a159c266SJung-uk Kim                 /* Still going downward in tree (Op is not completed yet) */
90a159c266SJung-uk Kim 
91a159c266SJung-uk Kim                 Op = Next;
92a159c266SJung-uk Kim                 continue;
93a159c266SJung-uk Kim             }
94a159c266SJung-uk Kim         }
95a159c266SJung-uk Kim 
96a159c266SJung-uk Kim         /* No more children, this Op is complete. */
97a159c266SJung-uk Kim 
98a159c266SJung-uk Kim         Next = Op->Common.Next;
99a159c266SJung-uk Kim         Parent = Op->Common.Parent;
100a159c266SJung-uk Kim 
101a159c266SJung-uk Kim         AcpiPsFreeOp (Op);
102a159c266SJung-uk Kim 
103a159c266SJung-uk Kim         /* If we are back to the starting point, the walk is complete. */
104a159c266SJung-uk Kim 
105a159c266SJung-uk Kim         if (Op == SubtreeRoot)
106a159c266SJung-uk Kim         {
107a159c266SJung-uk Kim             return_VOID;
108a159c266SJung-uk Kim         }
109*f8146b88SJung-uk Kim 
110a159c266SJung-uk Kim         if (Next)
111a159c266SJung-uk Kim         {
112a159c266SJung-uk Kim             Op = Next;
113a159c266SJung-uk Kim         }
114a159c266SJung-uk Kim         else
115a159c266SJung-uk Kim         {
116a159c266SJung-uk Kim             Op = Parent;
117a159c266SJung-uk Kim         }
118a159c266SJung-uk Kim     }
119a159c266SJung-uk Kim 
120a159c266SJung-uk Kim     return_VOID;
121a159c266SJung-uk Kim }
122