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