xref: /dflybsd-src/sys/contrib/dev/acpica/source/compiler/cvcompiler.c (revision 383048aca08c2de51d27aa8638a36982a0d74550)
1d638c6eeSSascha Wildner /******************************************************************************
2d638c6eeSSascha Wildner  *
3d638c6eeSSascha Wildner  * Module Name: cvcompiler - ASL-/ASL+ converter functions
4d638c6eeSSascha Wildner  *
5d638c6eeSSascha Wildner  *****************************************************************************/
6d638c6eeSSascha Wildner 
7b4315fc7SSascha Wildner /******************************************************************************
8b4315fc7SSascha Wildner  *
9b4315fc7SSascha Wildner  * 1. Copyright Notice
10b4315fc7SSascha Wildner  *
11*383048acSSascha Wildner  * Some or all of this work - Copyright (c) 1999 - 2021, Intel Corp.
12d638c6eeSSascha Wildner  * All rights reserved.
13d638c6eeSSascha Wildner  *
14b4315fc7SSascha Wildner  * 2. License
15b4315fc7SSascha Wildner  *
16b4315fc7SSascha Wildner  * 2.1. This is your license from Intel Corp. under its intellectual property
17b4315fc7SSascha Wildner  * rights. You may have additional license terms from the party that provided
18b4315fc7SSascha Wildner  * you this software, covering your right to use that party's intellectual
19b4315fc7SSascha Wildner  * property rights.
20b4315fc7SSascha Wildner  *
21b4315fc7SSascha Wildner  * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
22b4315fc7SSascha Wildner  * copy of the source code appearing in this file ("Covered Code") an
23b4315fc7SSascha Wildner  * irrevocable, perpetual, worldwide license under Intel's copyrights in the
24b4315fc7SSascha Wildner  * base code distributed originally by Intel ("Original Intel Code") to copy,
25b4315fc7SSascha Wildner  * make derivatives, distribute, use and display any portion of the Covered
26b4315fc7SSascha Wildner  * Code in any form, with the right to sublicense such rights; and
27b4315fc7SSascha Wildner  *
28b4315fc7SSascha Wildner  * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
29b4315fc7SSascha Wildner  * license (with the right to sublicense), under only those claims of Intel
30b4315fc7SSascha Wildner  * patents that are infringed by the Original Intel Code, to make, use, sell,
31b4315fc7SSascha Wildner  * offer to sell, and import the Covered Code and derivative works thereof
32b4315fc7SSascha Wildner  * solely to the minimum extent necessary to exercise the above copyright
33b4315fc7SSascha Wildner  * license, and in no event shall the patent license extend to any additions
34b4315fc7SSascha Wildner  * to or modifications of the Original Intel Code. No other license or right
35b4315fc7SSascha Wildner  * is granted directly or by implication, estoppel or otherwise;
36b4315fc7SSascha Wildner  *
37b4315fc7SSascha Wildner  * The above copyright and patent license is granted only if the following
38b4315fc7SSascha Wildner  * conditions are met:
39b4315fc7SSascha Wildner  *
40b4315fc7SSascha Wildner  * 3. Conditions
41b4315fc7SSascha Wildner  *
42b4315fc7SSascha Wildner  * 3.1. Redistribution of Source with Rights to Further Distribute Source.
43b4315fc7SSascha Wildner  * Redistribution of source code of any substantial portion of the Covered
44b4315fc7SSascha Wildner  * Code or modification with rights to further distribute source must include
45b4315fc7SSascha Wildner  * the above Copyright Notice, the above License, this list of Conditions,
46b4315fc7SSascha Wildner  * and the following Disclaimer and Export Compliance provision. In addition,
47b4315fc7SSascha Wildner  * Licensee must cause all Covered Code to which Licensee contributes to
48b4315fc7SSascha Wildner  * contain a file documenting the changes Licensee made to create that Covered
49b4315fc7SSascha Wildner  * Code and the date of any change. Licensee must include in that file the
50b4315fc7SSascha Wildner  * documentation of any changes made by any predecessor Licensee. Licensee
51b4315fc7SSascha Wildner  * must include a prominent statement that the modification is derived,
52b4315fc7SSascha Wildner  * directly or indirectly, from Original Intel Code.
53b4315fc7SSascha Wildner  *
54b4315fc7SSascha Wildner  * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
55b4315fc7SSascha Wildner  * Redistribution of source code of any substantial portion of the Covered
56b4315fc7SSascha Wildner  * Code or modification without rights to further distribute source must
57b4315fc7SSascha Wildner  * include the following Disclaimer and Export Compliance provision in the
58b4315fc7SSascha Wildner  * documentation and/or other materials provided with distribution. In
59b4315fc7SSascha Wildner  * addition, Licensee may not authorize further sublicense of source of any
60b4315fc7SSascha Wildner  * portion of the Covered Code, and must include terms to the effect that the
61b4315fc7SSascha Wildner  * license from Licensee to its licensee is limited to the intellectual
62b4315fc7SSascha Wildner  * property embodied in the software Licensee provides to its licensee, and
63b4315fc7SSascha Wildner  * not to intellectual property embodied in modifications its licensee may
64b4315fc7SSascha Wildner  * make.
65b4315fc7SSascha Wildner  *
66b4315fc7SSascha Wildner  * 3.3. Redistribution of Executable. Redistribution in executable form of any
67b4315fc7SSascha Wildner  * substantial portion of the Covered Code or modification must reproduce the
68b4315fc7SSascha Wildner  * above Copyright Notice, and the following Disclaimer and Export Compliance
69b4315fc7SSascha Wildner  * provision in the documentation and/or other materials provided with the
70b4315fc7SSascha Wildner  * distribution.
71b4315fc7SSascha Wildner  *
72b4315fc7SSascha Wildner  * 3.4. Intel retains all right, title, and interest in and to the Original
73b4315fc7SSascha Wildner  * Intel Code.
74b4315fc7SSascha Wildner  *
75b4315fc7SSascha Wildner  * 3.5. Neither the name Intel nor any other trademark owned or controlled by
76b4315fc7SSascha Wildner  * Intel shall be used in advertising or otherwise to promote the sale, use or
77b4315fc7SSascha Wildner  * other dealings in products derived from or relating to the Covered Code
78b4315fc7SSascha Wildner  * without prior written authorization from Intel.
79b4315fc7SSascha Wildner  *
80b4315fc7SSascha Wildner  * 4. Disclaimer and Export Compliance
81b4315fc7SSascha Wildner  *
82b4315fc7SSascha Wildner  * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
83b4315fc7SSascha Wildner  * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
84b4315fc7SSascha Wildner  * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
85b4315fc7SSascha Wildner  * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
86b4315fc7SSascha Wildner  * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
87b4315fc7SSascha Wildner  * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
88b4315fc7SSascha Wildner  * PARTICULAR PURPOSE.
89b4315fc7SSascha Wildner  *
90b4315fc7SSascha Wildner  * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
91b4315fc7SSascha Wildner  * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
92b4315fc7SSascha Wildner  * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
93b4315fc7SSascha Wildner  * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
94b4315fc7SSascha Wildner  * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
95b4315fc7SSascha Wildner  * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
96b4315fc7SSascha Wildner  * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
97b4315fc7SSascha Wildner  * LIMITED REMEDY.
98b4315fc7SSascha Wildner  *
99b4315fc7SSascha Wildner  * 4.3. Licensee shall not export, either directly or indirectly, any of this
100b4315fc7SSascha Wildner  * software or system incorporating such software without first obtaining any
101b4315fc7SSascha Wildner  * required license or other approval from the U. S. Department of Commerce or
102b4315fc7SSascha Wildner  * any other agency or department of the United States Government. In the
103b4315fc7SSascha Wildner  * event Licensee exports any such software from the United States or
104b4315fc7SSascha Wildner  * re-exports any such software from a foreign destination, Licensee shall
105b4315fc7SSascha Wildner  * ensure that the distribution and export/re-export of the software is in
106b4315fc7SSascha Wildner  * compliance with all laws, regulations, orders, or other restrictions of the
107b4315fc7SSascha Wildner  * U.S. Export Administration Regulations. Licensee agrees that neither it nor
108b4315fc7SSascha Wildner  * any of its subsidiaries will export/re-export any technical data, process,
109b4315fc7SSascha Wildner  * software, or service, directly or indirectly, to any country for which the
110b4315fc7SSascha Wildner  * United States government or any agency thereof requires an export license,
111b4315fc7SSascha Wildner  * other governmental approval, or letter of assurance, without first obtaining
112b4315fc7SSascha Wildner  * such license, approval or letter.
113b4315fc7SSascha Wildner  *
114b4315fc7SSascha Wildner  *****************************************************************************
115b4315fc7SSascha Wildner  *
116b4315fc7SSascha Wildner  * Alternatively, you may choose to be licensed under the terms of the
117b4315fc7SSascha Wildner  * following license:
118b4315fc7SSascha Wildner  *
119d638c6eeSSascha Wildner  * Redistribution and use in source and binary forms, with or without
120d638c6eeSSascha Wildner  * modification, are permitted provided that the following conditions
121d638c6eeSSascha Wildner  * are met:
122d638c6eeSSascha Wildner  * 1. Redistributions of source code must retain the above copyright
123d638c6eeSSascha Wildner  *    notice, this list of conditions, and the following disclaimer,
124d638c6eeSSascha Wildner  *    without modification.
125d638c6eeSSascha Wildner  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
126d638c6eeSSascha Wildner  *    substantially similar to the "NO WARRANTY" disclaimer below
127d638c6eeSSascha Wildner  *    ("Disclaimer") and any redistribution must be conditioned upon
128d638c6eeSSascha Wildner  *    including a substantially similar Disclaimer requirement for further
129d638c6eeSSascha Wildner  *    binary redistribution.
130d638c6eeSSascha Wildner  * 3. Neither the names of the above-listed copyright holders nor the names
131d638c6eeSSascha Wildner  *    of any contributors may be used to endorse or promote products derived
132d638c6eeSSascha Wildner  *    from this software without specific prior written permission.
133d638c6eeSSascha Wildner  *
134b4315fc7SSascha Wildner  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
135b4315fc7SSascha Wildner  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
136b4315fc7SSascha Wildner  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
137b4315fc7SSascha Wildner  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
138b4315fc7SSascha Wildner  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
139b4315fc7SSascha Wildner  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
140b4315fc7SSascha Wildner  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
141b4315fc7SSascha Wildner  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
142b4315fc7SSascha Wildner  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
143b4315fc7SSascha Wildner  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
144b4315fc7SSascha Wildner  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
145b4315fc7SSascha Wildner  *
146b4315fc7SSascha Wildner  * Alternatively, you may choose to be licensed under the terms of the
147d638c6eeSSascha Wildner  * GNU General Public License ("GPL") version 2 as published by the Free
148d638c6eeSSascha Wildner  * Software Foundation.
149d638c6eeSSascha Wildner  *
150b4315fc7SSascha Wildner  *****************************************************************************/
151d638c6eeSSascha Wildner 
152d638c6eeSSascha Wildner #include "aslcompiler.h"
153d638c6eeSSascha Wildner #include "aslcompiler.y.h"
154d638c6eeSSascha Wildner #include "amlcode.h"
155d638c6eeSSascha Wildner #include "acapps.h"
156d638c6eeSSascha Wildner #include "acconvert.h"
157d638c6eeSSascha Wildner 
158d638c6eeSSascha Wildner 
159d638c6eeSSascha Wildner /*******************************************************************************
160d638c6eeSSascha Wildner  *
161d638c6eeSSascha Wildner  * FUNCTION:    CvProcessComment
162d638c6eeSSascha Wildner  *
163d638c6eeSSascha Wildner  * PARAMETERS:  CurrentState      Current comment parse state
164d638c6eeSSascha Wildner  *              StringBuffer      Buffer containing the comment being processed
165d638c6eeSSascha Wildner  *              c1                Current input
166d638c6eeSSascha Wildner  *
1671093ca81SSascha Wildner  * RETURN:      None
168d638c6eeSSascha Wildner  *
169d638c6eeSSascha Wildner  * DESCRIPTION: Process a single line comment of a c Style comment. This
170d638c6eeSSascha Wildner  *              function captures a line of a c style comment in a char* and
17100ffa116SSascha Wildner  *              places the comment in the appropriate global buffer.
172d638c6eeSSascha Wildner  *
173d638c6eeSSascha Wildner  ******************************************************************************/
174d638c6eeSSascha Wildner 
175d638c6eeSSascha Wildner void
CvProcessComment(ASL_COMMENT_STATE CurrentState,char * StringBuffer,int c1)176d638c6eeSSascha Wildner CvProcessComment (
177d638c6eeSSascha Wildner     ASL_COMMENT_STATE       CurrentState,
178d638c6eeSSascha Wildner     char                    *StringBuffer,
179d638c6eeSSascha Wildner     int                     c1)
180d638c6eeSSascha Wildner {
181d638c6eeSSascha Wildner     UINT64                  i;
182d638c6eeSSascha Wildner     char                    *LineToken;
183d638c6eeSSascha Wildner     char                    *FinalLineToken;
184d638c6eeSSascha Wildner     BOOLEAN                 CharStart;
185d638c6eeSSascha Wildner     char                    *CommentString;
186d638c6eeSSascha Wildner     char                    *FinalCommentString;
187d638c6eeSSascha Wildner 
188d638c6eeSSascha Wildner 
1897bcb6cafSSascha Wildner     if (AcpiGbl_CaptureComments && CurrentState.CaptureComments)
190d638c6eeSSascha Wildner     {
191d638c6eeSSascha Wildner         *StringBuffer = (char) c1;
192d638c6eeSSascha Wildner         ++StringBuffer;
193d638c6eeSSascha Wildner         *StringBuffer = 0;
1941093ca81SSascha Wildner 
195d638c6eeSSascha Wildner         CvDbgPrint ("Multi-line comment\n");
196806343b9SSascha Wildner         CommentString = UtLocalCacheCalloc (strlen (AslGbl_MsgBuffer) + 1);
197806343b9SSascha Wildner         strcpy (CommentString, AslGbl_MsgBuffer);
198d638c6eeSSascha Wildner 
199d638c6eeSSascha Wildner         CvDbgPrint ("CommentString: %s\n", CommentString);
200d638c6eeSSascha Wildner 
201d638c6eeSSascha Wildner         /*
2021093ca81SSascha Wildner          * Determine whether if this comment spans multiple lines. If so,
2031093ca81SSascha Wildner          * break apart the comment by storing each line in a different node
2041093ca81SSascha Wildner          * within the comment list. This allows the disassembler to
2051093ca81SSascha Wildner          * properly indent a multi-line comment.
206d638c6eeSSascha Wildner          */
207d638c6eeSSascha Wildner         LineToken = strtok (CommentString, "\n");
2081093ca81SSascha Wildner 
2091093ca81SSascha Wildner         if (LineToken)
2101093ca81SSascha Wildner         {
2117bcb6cafSSascha Wildner             FinalLineToken = UtLocalCacheCalloc (strlen (LineToken) + 1);
212d638c6eeSSascha Wildner             strcpy (FinalLineToken, LineToken);
213d638c6eeSSascha Wildner 
214d638c6eeSSascha Wildner             /* Get rid of any carriage returns */
215d638c6eeSSascha Wildner 
216d638c6eeSSascha Wildner             if (FinalLineToken[strlen (FinalLineToken) - 1] == 0x0D)
217d638c6eeSSascha Wildner             {
218d638c6eeSSascha Wildner                 FinalLineToken[strlen(FinalLineToken)-1] = 0;
219d638c6eeSSascha Wildner             }
2201093ca81SSascha Wildner 
221d638c6eeSSascha Wildner             CvAddToCommentList (FinalLineToken);
222d638c6eeSSascha Wildner             LineToken = strtok (NULL, "\n");
223d638c6eeSSascha Wildner             while (LineToken != NULL)
224d638c6eeSSascha Wildner             {
225d638c6eeSSascha Wildner                 /*
226d638c6eeSSascha Wildner                  * It is assumed that each line has some sort of indentation.
2271093ca81SSascha Wildner                  * This means that we need to find the first character that
2281093ca81SSascha Wildner                  * is not a white space within each line.
229d638c6eeSSascha Wildner                  */
230d638c6eeSSascha Wildner                 CharStart = FALSE;
231d638c6eeSSascha Wildner                 for (i = 0; (i < (strlen (LineToken) + 1)) && !CharStart; i++)
232d638c6eeSSascha Wildner                 {
233d638c6eeSSascha Wildner                     if (LineToken[i] != ' ' && LineToken[i] != '\t')
234d638c6eeSSascha Wildner                     {
235d638c6eeSSascha Wildner                         CharStart = TRUE;
236d638c6eeSSascha Wildner                         LineToken += i-1;
237d638c6eeSSascha Wildner                         LineToken [0] = ' '; /* Pad for Formatting */
238d638c6eeSSascha Wildner                     }
239d638c6eeSSascha Wildner                 }
2401093ca81SSascha Wildner 
2417bcb6cafSSascha Wildner                 FinalLineToken = UtLocalCacheCalloc (strlen (LineToken) + 1);
242d638c6eeSSascha Wildner                 strcat (FinalLineToken, LineToken);
243d638c6eeSSascha Wildner 
244d638c6eeSSascha Wildner                 /* Get rid of any carriage returns */
245d638c6eeSSascha Wildner 
246d638c6eeSSascha Wildner                 if (FinalLineToken[strlen (FinalLineToken) - 1] == 0x0D)
247d638c6eeSSascha Wildner                 {
248d638c6eeSSascha Wildner                     FinalLineToken[strlen(FinalLineToken) - 1] = 0;
249d638c6eeSSascha Wildner                 }
2501093ca81SSascha Wildner 
251d638c6eeSSascha Wildner                 CvAddToCommentList (FinalLineToken);
252d638c6eeSSascha Wildner                 LineToken = strtok (NULL,"\n");
253d638c6eeSSascha Wildner             }
254d638c6eeSSascha Wildner         }
255d638c6eeSSascha Wildner 
256d638c6eeSSascha Wildner         /*
2571093ca81SSascha Wildner          * If this only spans a single line, check to see whether if this
2581093ca81SSascha Wildner          * comment appears on the same line as a line of code. If does,
2591093ca81SSascha Wildner          * retain it's position for stylistic reasons. If it doesn't,
2601093ca81SSascha Wildner          * add it to the comment list so that it can be associated with
2611093ca81SSascha Wildner          * the next node that's created.
262d638c6eeSSascha Wildner          */
263d638c6eeSSascha Wildner         else
264d638c6eeSSascha Wildner         {
265d638c6eeSSascha Wildner            /*
2661093ca81SSascha Wildner             * If this is not a regular comment, pad with extra spaces that
2671093ca81SSascha Wildner             * appeared in the original source input to retain the original
2681093ca81SSascha Wildner             * spacing.
269d638c6eeSSascha Wildner             */
2701093ca81SSascha Wildner             FinalCommentString =
2717bcb6cafSSascha Wildner                 UtLocalCacheCalloc (strlen (CommentString) +
2721093ca81SSascha Wildner                 CurrentState.SpacesBefore + 1);
2731093ca81SSascha Wildner 
274d638c6eeSSascha Wildner             for (i = 0; (CurrentState.CommentType != ASL_COMMENT_STANDARD) &&
2751093ca81SSascha Wildner                 (i < CurrentState.SpacesBefore); i++)
276d638c6eeSSascha Wildner             {
277d638c6eeSSascha Wildner                  FinalCommentString[i] = ' ';
278d638c6eeSSascha Wildner             }
2791093ca81SSascha Wildner 
280d638c6eeSSascha Wildner             strcat (FinalCommentString, CommentString);
281d638c6eeSSascha Wildner             CvPlaceComment (CurrentState.CommentType, FinalCommentString);
282d638c6eeSSascha Wildner         }
283d638c6eeSSascha Wildner     }
284d638c6eeSSascha Wildner }
285d638c6eeSSascha Wildner 
286d638c6eeSSascha Wildner 
287d638c6eeSSascha Wildner /*******************************************************************************
288d638c6eeSSascha Wildner  *
289d638c6eeSSascha Wildner  * FUNCTION:    CvProcessCommentType2
290d638c6eeSSascha Wildner  *
291d638c6eeSSascha Wildner  * PARAMETERS:  CurrentState      Current comment parse state
292d638c6eeSSascha Wildner  *              StringBuffer      Buffer containing the comment being processed
293d638c6eeSSascha Wildner  *
294d638c6eeSSascha Wildner  * RETURN:      none
295d638c6eeSSascha Wildner  *
296d638c6eeSSascha Wildner  * DESCRIPTION: Process a single line comment. This function captures a comment
29700ffa116SSascha Wildner  *              in a char* and places the comment in the appropriate global
298d638c6eeSSascha Wildner  *              buffer through CvPlaceComment
299d638c6eeSSascha Wildner  *
300d638c6eeSSascha Wildner  ******************************************************************************/
301d638c6eeSSascha Wildner 
302d638c6eeSSascha Wildner void
CvProcessCommentType2(ASL_COMMENT_STATE CurrentState,char * StringBuffer)303d638c6eeSSascha Wildner CvProcessCommentType2 (
304d638c6eeSSascha Wildner     ASL_COMMENT_STATE       CurrentState,
305d638c6eeSSascha Wildner     char                    *StringBuffer)
306d638c6eeSSascha Wildner {
307d638c6eeSSascha Wildner     UINT32                  i;
308d638c6eeSSascha Wildner     char                    *CommentString;
309d638c6eeSSascha Wildner     char                    *FinalCommentString;
310d638c6eeSSascha Wildner 
311d638c6eeSSascha Wildner 
3127bcb6cafSSascha Wildner     if (AcpiGbl_CaptureComments && CurrentState.CaptureComments)
313d638c6eeSSascha Wildner     {
314d638c6eeSSascha Wildner         *StringBuffer = 0; /* null terminate */
315d638c6eeSSascha Wildner         CvDbgPrint ("Single-line comment\n");
316806343b9SSascha Wildner         CommentString = UtLocalCacheCalloc (strlen (AslGbl_MsgBuffer) + 1);
317806343b9SSascha Wildner         strcpy (CommentString, AslGbl_MsgBuffer);
318d638c6eeSSascha Wildner 
3191093ca81SSascha Wildner         /* If this comment lies on the same line as the latest parse op,
3201093ca81SSascha Wildner          * assign it to that op's CommentAfter field. Saving in this field
3211093ca81SSascha Wildner          * will allow us to support comments that come after code on the
3221093ca81SSascha Wildner          * same line as the code itself. For example,
323d638c6eeSSascha Wildner          * Name(A,"") //comment
324d638c6eeSSascha Wildner          *
325d638c6eeSSascha Wildner          * will be retained rather than transformed into
326d638c6eeSSascha Wildner          *
327d638c6eeSSascha Wildner          * Name(A,"")
328d638c6eeSSascha Wildner          * //comment
329d638c6eeSSascha Wildner          *
330d638c6eeSSascha Wildner          * For this case, we only need to add one comment since
331d638c6eeSSascha Wildner          *
332d638c6eeSSascha Wildner          * Name(A,"") //comment1 //comment2 ... more comments here.
333d638c6eeSSascha Wildner          *
334d638c6eeSSascha Wildner          * would be lexically analyzed as a single comment.
335d638c6eeSSascha Wildner          *
33600ffa116SSascha Wildner          * Create a new string with the appropriate spaces. Since we need
337d638c6eeSSascha Wildner          * to account for the proper spacing, the actual comment,
338d638c6eeSSascha Wildner          * extra 2 spaces so that this comment can be converted to the "/ *"
3391093ca81SSascha Wildner          * style and the null terminator, the string would look something
3401093ca81SSascha Wildner          * like:
341d638c6eeSSascha Wildner          *
342d638c6eeSSascha Wildner          * [ (spaces) (comment)  ( * /) ('\0') ]
343d638c6eeSSascha Wildner          *
344d638c6eeSSascha Wildner          */
3457bcb6cafSSascha Wildner         FinalCommentString = UtLocalCacheCalloc (CurrentState.SpacesBefore +
3461093ca81SSascha Wildner             strlen (CommentString) + 3 + 1);
3471093ca81SSascha Wildner 
3481093ca81SSascha Wildner         for (i = 0; (CurrentState.CommentType != 1) &&
3491093ca81SSascha Wildner             (i < CurrentState.SpacesBefore); i++)
350d638c6eeSSascha Wildner         {
351d638c6eeSSascha Wildner             FinalCommentString[i] = ' ';
352d638c6eeSSascha Wildner         }
3531093ca81SSascha Wildner 
354d638c6eeSSascha Wildner         strcat (FinalCommentString, CommentString);
355d638c6eeSSascha Wildner 
356d638c6eeSSascha Wildner         /* convert to a "/ *" style comment  */
357d638c6eeSSascha Wildner 
358d638c6eeSSascha Wildner         strcat (FinalCommentString, " */");
3591093ca81SSascha Wildner         FinalCommentString [CurrentState.SpacesBefore +
3601093ca81SSascha Wildner             strlen (CommentString) + 3] = 0;
361d638c6eeSSascha Wildner 
362d638c6eeSSascha Wildner         /* get rid of the carriage return */
363d638c6eeSSascha Wildner 
364d638c6eeSSascha Wildner         if (FinalCommentString[strlen (FinalCommentString) - 1] == 0x0D)
365d638c6eeSSascha Wildner         {
366d638c6eeSSascha Wildner             FinalCommentString[strlen(FinalCommentString) - 1] = 0;
367d638c6eeSSascha Wildner         }
3681093ca81SSascha Wildner 
369d638c6eeSSascha Wildner         CvPlaceComment (CurrentState.CommentType, FinalCommentString);
370d638c6eeSSascha Wildner     }
371d638c6eeSSascha Wildner }
372d638c6eeSSascha Wildner 
373d638c6eeSSascha Wildner 
374d638c6eeSSascha Wildner /*******************************************************************************
375d638c6eeSSascha Wildner  *
376d638c6eeSSascha Wildner  * FUNCTION:    CgCalculateCommentLengths
377d638c6eeSSascha Wildner  *
378d638c6eeSSascha Wildner  * PARAMETERS:  Op                 - Calculate all comments of this Op
379d638c6eeSSascha Wildner  *
3801093ca81SSascha Wildner  * RETURN:      TotalCommentLength - Length of all comments within this op.
381d638c6eeSSascha Wildner  *
3821093ca81SSascha Wildner  * DESCRIPTION: Calculate the length that the each comment takes up within Op.
38300ffa116SSascha Wildner  *              Comments look like the following: [0xA9 OptionBtye comment 0x00]
384d638c6eeSSascha Wildner  *              therefore, we add 1 + 1 + strlen (comment) + 1 to get the actual
385d638c6eeSSascha Wildner  *              length of this comment.
386d638c6eeSSascha Wildner  *
387d638c6eeSSascha Wildner  ******************************************************************************/
388d638c6eeSSascha Wildner 
389d638c6eeSSascha Wildner UINT32
CvCalculateCommentLengths(ACPI_PARSE_OBJECT * Op)390d638c6eeSSascha Wildner CvCalculateCommentLengths(
391d638c6eeSSascha Wildner    ACPI_PARSE_OBJECT        *Op)
392d638c6eeSSascha Wildner {
393d638c6eeSSascha Wildner     UINT32                  CommentLength = 0;
394d638c6eeSSascha Wildner     UINT32                  TotalCommentLength = 0;
395d638c6eeSSascha Wildner     ACPI_COMMENT_NODE       *Current = NULL;
396d638c6eeSSascha Wildner 
397d638c6eeSSascha Wildner 
3987bcb6cafSSascha Wildner     if (!AcpiGbl_CaptureComments)
399d638c6eeSSascha Wildner     {
400d638c6eeSSascha Wildner         return (0);
401d638c6eeSSascha Wildner     }
402d638c6eeSSascha Wildner 
4031093ca81SSascha Wildner     CvDbgPrint ("==Calculating comment lengths for %s\n",
4041093ca81SSascha Wildner         Op->Asl.ParseOpName);
4051093ca81SSascha Wildner 
406d638c6eeSSascha Wildner     if (Op->Asl.FileChanged)
407d638c6eeSSascha Wildner     {
408d638c6eeSSascha Wildner         TotalCommentLength += strlen (Op->Asl.Filename) + 3;
409d638c6eeSSascha Wildner 
410d638c6eeSSascha Wildner         if (Op->Asl.ParentFilename &&
411d638c6eeSSascha Wildner             AcpiUtStricmp (Op->Asl.Filename, Op->Asl.ParentFilename))
412d638c6eeSSascha Wildner         {
413d638c6eeSSascha Wildner             TotalCommentLength += strlen (Op->Asl.ParentFilename) + 3;
414d638c6eeSSascha Wildner         }
415d638c6eeSSascha Wildner     }
4161093ca81SSascha Wildner 
417d638c6eeSSascha Wildner     if (Op->Asl.CommentList)
418d638c6eeSSascha Wildner     {
419d638c6eeSSascha Wildner         Current = Op->Asl.CommentList;
420d638c6eeSSascha Wildner         while (Current)
421d638c6eeSSascha Wildner         {
422d638c6eeSSascha Wildner             CommentLength = strlen (Current->Comment)+3;
423d638c6eeSSascha Wildner             CvDbgPrint ("Length of standard comment: %d\n", CommentLength);
424d638c6eeSSascha Wildner             CvDbgPrint ("    Comment string: %s\n\n", Current->Comment);
425d638c6eeSSascha Wildner             TotalCommentLength += CommentLength;
426d638c6eeSSascha Wildner             Current = Current->Next;
427d638c6eeSSascha Wildner         }
428d638c6eeSSascha Wildner     }
4291093ca81SSascha Wildner 
430d638c6eeSSascha Wildner     if (Op->Asl.EndBlkComment)
431d638c6eeSSascha Wildner     {
432d638c6eeSSascha Wildner         Current = Op->Asl.EndBlkComment;
433d638c6eeSSascha Wildner         while (Current)
434d638c6eeSSascha Wildner         {
435d638c6eeSSascha Wildner             CommentLength = strlen (Current->Comment)+3;
436d638c6eeSSascha Wildner             CvDbgPrint ("Length of endblkcomment: %d\n", CommentLength);
437d638c6eeSSascha Wildner             CvDbgPrint ("    Comment string: %s\n\n", Current->Comment);
438d638c6eeSSascha Wildner             TotalCommentLength += CommentLength;
439d638c6eeSSascha Wildner             Current = Current->Next;
440d638c6eeSSascha Wildner         }
441d638c6eeSSascha Wildner     }
4421093ca81SSascha Wildner 
443d638c6eeSSascha Wildner     if (Op->Asl.InlineComment)
444d638c6eeSSascha Wildner     {
445d638c6eeSSascha Wildner         CommentLength = strlen (Op->Asl.InlineComment)+3;
446d638c6eeSSascha Wildner         CvDbgPrint ("Length of inline comment: %d\n", CommentLength);
447d638c6eeSSascha Wildner         CvDbgPrint ("    Comment string: %s\n\n", Op->Asl.InlineComment);
448d638c6eeSSascha Wildner         TotalCommentLength += CommentLength;
449d638c6eeSSascha Wildner     }
4501093ca81SSascha Wildner 
451d638c6eeSSascha Wildner     if (Op->Asl.EndNodeComment)
452d638c6eeSSascha Wildner     {
453d638c6eeSSascha Wildner         CommentLength = strlen(Op->Asl.EndNodeComment)+3;
454d638c6eeSSascha Wildner         CvDbgPrint ("Length of end node comment +3: %d\n", CommentLength);
455d638c6eeSSascha Wildner         CvDbgPrint ("    Comment string: %s\n\n", Op->Asl.EndNodeComment);
456d638c6eeSSascha Wildner         TotalCommentLength += CommentLength;
457d638c6eeSSascha Wildner     }
458d638c6eeSSascha Wildner 
459d638c6eeSSascha Wildner     if (Op->Asl.CloseBraceComment)
460d638c6eeSSascha Wildner     {
461d638c6eeSSascha Wildner         CommentLength = strlen (Op->Asl.CloseBraceComment)+3;
462d638c6eeSSascha Wildner         CvDbgPrint ("Length of close brace comment: %d\n", CommentLength);
463d638c6eeSSascha Wildner         CvDbgPrint ("    Comment string: %s\n\n", Op->Asl.CloseBraceComment);
464d638c6eeSSascha Wildner         TotalCommentLength += CommentLength;
465d638c6eeSSascha Wildner     }
466d638c6eeSSascha Wildner 
467d638c6eeSSascha Wildner     CvDbgPrint("\n\n");
4681093ca81SSascha Wildner     return (TotalCommentLength);
469d638c6eeSSascha Wildner }
470d638c6eeSSascha Wildner 
471d638c6eeSSascha Wildner 
472d638c6eeSSascha Wildner /*******************************************************************************
473d638c6eeSSascha Wildner  *
474d638c6eeSSascha Wildner  * FUNCTION:    CgWriteAmlDefBlockComment
475d638c6eeSSascha Wildner  *
476d638c6eeSSascha Wildner  * PARAMETERS:  Op              - Current parse op
477d638c6eeSSascha Wildner  *
478d638c6eeSSascha Wildner  * RETURN:      None
479d638c6eeSSascha Wildner  *
480d638c6eeSSascha Wildner  * DESCRIPTION: Write all comments for a particular definition block.
481d638c6eeSSascha Wildner  *              For definition blocks, the comments need to come after the
482d638c6eeSSascha Wildner  *              definition block header. The regular comments above the
483d638c6eeSSascha Wildner  *              definition block would be categorized as
484d638c6eeSSascha Wildner  *              STD_DEFBLK_COMMENT and comments after the closing brace
485d638c6eeSSascha Wildner  *              is categorized as END_DEFBLK_COMMENT.
486d638c6eeSSascha Wildner  *
487d638c6eeSSascha Wildner  ******************************************************************************/
488d638c6eeSSascha Wildner 
489d638c6eeSSascha Wildner void
CgWriteAmlDefBlockComment(ACPI_PARSE_OBJECT * Op)490d638c6eeSSascha Wildner CgWriteAmlDefBlockComment(
491d638c6eeSSascha Wildner     ACPI_PARSE_OBJECT       *Op)
492d638c6eeSSascha Wildner {
493d638c6eeSSascha Wildner     UINT8                   CommentOption;
494d638c6eeSSascha Wildner     ACPI_COMMENT_NODE       *Current;
495d638c6eeSSascha Wildner     char                    *NewFilename;
496d638c6eeSSascha Wildner     char                    *Position;
497d638c6eeSSascha Wildner     char                    *DirectoryPosition;
498d638c6eeSSascha Wildner 
499d638c6eeSSascha Wildner 
5007bcb6cafSSascha Wildner     if (!AcpiGbl_CaptureComments ||
501d638c6eeSSascha Wildner         (Op->Asl.ParseOpcode != PARSEOP_DEFINITION_BLOCK))
502d638c6eeSSascha Wildner     {
503d638c6eeSSascha Wildner         return;
504d638c6eeSSascha Wildner     }
505d638c6eeSSascha Wildner 
506d638c6eeSSascha Wildner     CvDbgPrint ("Printing comments for a definition block..\n");
507d638c6eeSSascha Wildner 
5081093ca81SSascha Wildner     /* First, print the file name comment after changing .asl to .dsl */
509d638c6eeSSascha Wildner 
5107bcb6cafSSascha Wildner     NewFilename = UtLocalCacheCalloc (strlen (Op->Asl.Filename));
511d638c6eeSSascha Wildner     strcpy (NewFilename, Op->Asl.Filename);
512d638c6eeSSascha Wildner     DirectoryPosition = strrchr (NewFilename, '/');
513d638c6eeSSascha Wildner     Position = strrchr (NewFilename, '.');
514d638c6eeSSascha Wildner 
515d638c6eeSSascha Wildner     if (Position && (Position > DirectoryPosition))
516d638c6eeSSascha Wildner     {
517d638c6eeSSascha Wildner         /* Tack on the new suffix */
518d638c6eeSSascha Wildner 
519d638c6eeSSascha Wildner         Position++;
520d638c6eeSSascha Wildner         *Position = 0;
521d638c6eeSSascha Wildner         strcat (Position, FILE_SUFFIX_DISASSEMBLY);
522d638c6eeSSascha Wildner     }
523d638c6eeSSascha Wildner     else
524d638c6eeSSascha Wildner     {
525d638c6eeSSascha Wildner         /* No dot, add one and then the suffix */
526d638c6eeSSascha Wildner 
527d638c6eeSSascha Wildner         strcat (NewFilename, ".");
528d638c6eeSSascha Wildner         strcat (NewFilename, FILE_SUFFIX_DISASSEMBLY);
529d638c6eeSSascha Wildner     }
530d638c6eeSSascha Wildner 
531d638c6eeSSascha Wildner     CommentOption = FILENAME_COMMENT;
532d638c6eeSSascha Wildner     CgWriteOneAmlComment(Op, NewFilename, CommentOption);
533d638c6eeSSascha Wildner 
534d638c6eeSSascha Wildner     Current = Op->Asl.CommentList;
535d638c6eeSSascha Wildner     CommentOption = STD_DEFBLK_COMMENT;
5361093ca81SSascha Wildner 
537d638c6eeSSascha Wildner     while (Current)
538d638c6eeSSascha Wildner     {
539d638c6eeSSascha Wildner         CgWriteOneAmlComment(Op, Current->Comment, CommentOption);
540d638c6eeSSascha Wildner         CvDbgPrint ("Printing comment: %s\n", Current->Comment);
541d638c6eeSSascha Wildner         Current = Current->Next;
542d638c6eeSSascha Wildner     }
5431093ca81SSascha Wildner 
544d638c6eeSSascha Wildner     Op->Asl.CommentList = NULL;
545d638c6eeSSascha Wildner 
5461093ca81SSascha Wildner     /* Print any Inline comments associated with this node */
547d638c6eeSSascha Wildner 
548d638c6eeSSascha Wildner     if (Op->Asl.CloseBraceComment)
549d638c6eeSSascha Wildner     {
550d638c6eeSSascha Wildner         CommentOption = END_DEFBLK_COMMENT;
551d638c6eeSSascha Wildner         CgWriteOneAmlComment(Op, Op->Asl.CloseBraceComment, CommentOption);
552d638c6eeSSascha Wildner         Op->Asl.CloseBraceComment = NULL;
553d638c6eeSSascha Wildner     }
554d638c6eeSSascha Wildner }
555d638c6eeSSascha Wildner 
556d638c6eeSSascha Wildner 
557d638c6eeSSascha Wildner /*******************************************************************************
558d638c6eeSSascha Wildner  *
559d638c6eeSSascha Wildner  * FUNCTION:    CgWriteOneAmlComment
560d638c6eeSSascha Wildner  *
561d638c6eeSSascha Wildner  * PARAMETERS:  Op              - Current parse op
562d638c6eeSSascha Wildner  *              CommentToPrint  - Comment that's printed
563d638c6eeSSascha Wildner  *              InputOption     - Denotes the comment option.
564d638c6eeSSascha Wildner  *
565d638c6eeSSascha Wildner  * RETURN:      None
566d638c6eeSSascha Wildner  *
567d638c6eeSSascha Wildner  * DESCRIPTION: write a single comment.
568d638c6eeSSascha Wildner  *
569d638c6eeSSascha Wildner  ******************************************************************************/
570d638c6eeSSascha Wildner 
571d638c6eeSSascha Wildner void
CgWriteOneAmlComment(ACPI_PARSE_OBJECT * Op,char * CommentToPrint,UINT8 InputOption)572d638c6eeSSascha Wildner CgWriteOneAmlComment(
573d638c6eeSSascha Wildner     ACPI_PARSE_OBJECT       *Op,
574d638c6eeSSascha Wildner     char*                   CommentToPrint,
575d638c6eeSSascha Wildner     UINT8                   InputOption)
576d638c6eeSSascha Wildner {
577d638c6eeSSascha Wildner     UINT8                   CommentOption = InputOption;
578d638c6eeSSascha Wildner     UINT8                   CommentOpcode = (UINT8) AML_COMMENT_OP;
579d638c6eeSSascha Wildner 
5801093ca81SSascha Wildner 
5811093ca81SSascha Wildner     if (!CommentToPrint)
5821093ca81SSascha Wildner     {
5831093ca81SSascha Wildner         return;
5841093ca81SSascha Wildner     }
5851093ca81SSascha Wildner 
586d638c6eeSSascha Wildner     CgLocalWriteAmlData (Op, &CommentOpcode, 1);
587d638c6eeSSascha Wildner     CgLocalWriteAmlData (Op, &CommentOption, 1);
588d638c6eeSSascha Wildner 
589d638c6eeSSascha Wildner     /* The strlen (..) + 1 is to include the null terminator */
590d638c6eeSSascha Wildner 
591d638c6eeSSascha Wildner     CgLocalWriteAmlData (Op, CommentToPrint, strlen (CommentToPrint) + 1);
592d638c6eeSSascha Wildner }
593d638c6eeSSascha Wildner 
594d638c6eeSSascha Wildner 
595d638c6eeSSascha Wildner /*******************************************************************************
596d638c6eeSSascha Wildner  *
597d638c6eeSSascha Wildner  * FUNCTION:    CgWriteAmlComment
598d638c6eeSSascha Wildner  *
599d638c6eeSSascha Wildner  * PARAMETERS:  Op              - Current parse op
600d638c6eeSSascha Wildner  *
601d638c6eeSSascha Wildner  * RETURN:      None
602d638c6eeSSascha Wildner  *
6031093ca81SSascha Wildner  * DESCRIPTION: Write all comments pertaining to the current parse op
604d638c6eeSSascha Wildner  *
605d638c6eeSSascha Wildner  ******************************************************************************/
606d638c6eeSSascha Wildner 
607d638c6eeSSascha Wildner void
CgWriteAmlComment(ACPI_PARSE_OBJECT * Op)608d638c6eeSSascha Wildner CgWriteAmlComment(
609d638c6eeSSascha Wildner     ACPI_PARSE_OBJECT       *Op)
610d638c6eeSSascha Wildner {
611d638c6eeSSascha Wildner     ACPI_COMMENT_NODE       *Current;
612d638c6eeSSascha Wildner     UINT8                   CommentOption;
613d638c6eeSSascha Wildner     char                    *NewFilename;
614d638c6eeSSascha Wildner     char                    *ParentFilename;
615d638c6eeSSascha Wildner 
616d638c6eeSSascha Wildner 
617d638c6eeSSascha Wildner     if ((Op->Asl.ParseOpcode == PARSEOP_DEFINITION_BLOCK) ||
6187bcb6cafSSascha Wildner          !AcpiGbl_CaptureComments)
619d638c6eeSSascha Wildner     {
620d638c6eeSSascha Wildner         return;
621d638c6eeSSascha Wildner     }
622d638c6eeSSascha Wildner 
623d638c6eeSSascha Wildner     /* Print out the filename comment if needed */
624d638c6eeSSascha Wildner 
625d638c6eeSSascha Wildner     if (Op->Asl.FileChanged)
626d638c6eeSSascha Wildner     {
627d638c6eeSSascha Wildner 
6281093ca81SSascha Wildner         /* First, print the file name comment after changing .asl to .dsl */
629d638c6eeSSascha Wildner 
630d638c6eeSSascha Wildner         NewFilename =
631d638c6eeSSascha Wildner             FlGenerateFilename (Op->Asl.Filename, FILE_SUFFIX_DISASSEMBLY);
6321093ca81SSascha Wildner         if (NewFilename)
6331093ca81SSascha Wildner         {
634d638c6eeSSascha Wildner             CvDbgPrint ("Writing file comment, \"%s\" for %s\n",
635d638c6eeSSascha Wildner                 NewFilename, Op->Asl.ParseOpName);
6361093ca81SSascha Wildner         }
6371093ca81SSascha Wildner 
638d638c6eeSSascha Wildner         CgWriteOneAmlComment(Op, NewFilename, FILENAME_COMMENT);
639d638c6eeSSascha Wildner 
640d638c6eeSSascha Wildner         if (Op->Asl.ParentFilename &&
641d638c6eeSSascha Wildner             AcpiUtStricmp (Op->Asl.ParentFilename, Op->Asl.Filename))
642d638c6eeSSascha Wildner         {
643d638c6eeSSascha Wildner             ParentFilename = FlGenerateFilename (Op->Asl.ParentFilename,
644d638c6eeSSascha Wildner                 FILE_SUFFIX_DISASSEMBLY);
645d638c6eeSSascha Wildner             CgWriteOneAmlComment(Op, ParentFilename, PARENTFILENAME_COMMENT);
646d638c6eeSSascha Wildner         }
647d638c6eeSSascha Wildner 
6481093ca81SSascha Wildner         /* Prevent multiple writes of the same comment */
649d638c6eeSSascha Wildner 
650d638c6eeSSascha Wildner         Op->Asl.FileChanged = FALSE;
651d638c6eeSSascha Wildner     }
652d638c6eeSSascha Wildner 
653d638c6eeSSascha Wildner     /*
654d638c6eeSSascha Wildner      * Regular comments are stored in a list of comments within an Op.
655d638c6eeSSascha Wildner      * If there is a such list in this node, print out the comment
656d638c6eeSSascha Wildner      * as byte code.
657d638c6eeSSascha Wildner      */
658d638c6eeSSascha Wildner     Current = Op->Asl.CommentList;
659d638c6eeSSascha Wildner     if (Op->Asl.ParseOpcode == PARSEOP_INCLUDE)
660d638c6eeSSascha Wildner     {
661d638c6eeSSascha Wildner         CommentOption = INCLUDE_COMMENT;
662d638c6eeSSascha Wildner     }
663d638c6eeSSascha Wildner     else
664d638c6eeSSascha Wildner     {
665d638c6eeSSascha Wildner         CommentOption = STANDARD_COMMENT;
666d638c6eeSSascha Wildner     }
667d638c6eeSSascha Wildner 
668d638c6eeSSascha Wildner     while (Current)
669d638c6eeSSascha Wildner     {
670d638c6eeSSascha Wildner         CgWriteOneAmlComment(Op, Current->Comment, CommentOption);
671d638c6eeSSascha Wildner         Current = Current->Next;
672d638c6eeSSascha Wildner     }
6731093ca81SSascha Wildner 
674d638c6eeSSascha Wildner     Op->Asl.CommentList = NULL;
675d638c6eeSSascha Wildner 
676d638c6eeSSascha Wildner     Current = Op->Asl.EndBlkComment;
677d638c6eeSSascha Wildner     CommentOption = ENDBLK_COMMENT;
678d638c6eeSSascha Wildner     while (Current)
679d638c6eeSSascha Wildner     {
680d638c6eeSSascha Wildner         CgWriteOneAmlComment(Op, Current->Comment, CommentOption);
681d638c6eeSSascha Wildner         Current = Current->Next;
682d638c6eeSSascha Wildner     }
6831093ca81SSascha Wildner 
684d638c6eeSSascha Wildner     Op->Asl.EndBlkComment = NULL;
685d638c6eeSSascha Wildner 
6861093ca81SSascha Wildner     /* Print any Inline comments associated with this node */
687d638c6eeSSascha Wildner 
688d638c6eeSSascha Wildner     if (Op->Asl.InlineComment)
689d638c6eeSSascha Wildner     {
690d638c6eeSSascha Wildner         CommentOption = INLINE_COMMENT;
691d638c6eeSSascha Wildner         CgWriteOneAmlComment(Op, Op->Asl.InlineComment, CommentOption);
692d638c6eeSSascha Wildner         Op->Asl.InlineComment = NULL;
693d638c6eeSSascha Wildner     }
694d638c6eeSSascha Wildner 
695d638c6eeSSascha Wildner     if (Op->Asl.EndNodeComment)
696d638c6eeSSascha Wildner     {
697d638c6eeSSascha Wildner         CommentOption = ENDNODE_COMMENT;
698d638c6eeSSascha Wildner         CgWriteOneAmlComment(Op, Op->Asl.EndNodeComment, CommentOption);
699d638c6eeSSascha Wildner         Op->Asl.EndNodeComment = NULL;
700d638c6eeSSascha Wildner     }
701d638c6eeSSascha Wildner 
702d638c6eeSSascha Wildner     if (Op->Asl.CloseBraceComment)
703d638c6eeSSascha Wildner     {
704d638c6eeSSascha Wildner         CommentOption = CLOSE_BRACE_COMMENT;
705d638c6eeSSascha Wildner         CgWriteOneAmlComment(Op, Op->Asl.CloseBraceComment, CommentOption);
706d638c6eeSSascha Wildner         Op->Asl.CloseBraceComment = NULL;
707d638c6eeSSascha Wildner     }
708d638c6eeSSascha Wildner }
709d638c6eeSSascha Wildner 
710d638c6eeSSascha Wildner 
711d638c6eeSSascha Wildner /*******************************************************************************
712d638c6eeSSascha Wildner  *
713d638c6eeSSascha Wildner  * FUNCTION:    CvCommentNodeCalloc
714d638c6eeSSascha Wildner  *
7151093ca81SSascha Wildner  * PARAMETERS:  None
716d638c6eeSSascha Wildner  *
717d638c6eeSSascha Wildner  * RETURN:      Pointer to the comment node. Aborts on allocation failure
718d638c6eeSSascha Wildner  *
719d638c6eeSSascha Wildner  * DESCRIPTION: Allocate a string node buffer.
720d638c6eeSSascha Wildner  *
721d638c6eeSSascha Wildner  ******************************************************************************/
722d638c6eeSSascha Wildner 
723d638c6eeSSascha Wildner ACPI_COMMENT_NODE *
CvCommentNodeCalloc(void)724d638c6eeSSascha Wildner CvCommentNodeCalloc (
725d638c6eeSSascha Wildner     void)
726d638c6eeSSascha Wildner {
727d638c6eeSSascha Wildner    ACPI_COMMENT_NODE        *NewCommentNode;
728d638c6eeSSascha Wildner 
729d638c6eeSSascha Wildner 
7301093ca81SSascha Wildner    NewCommentNode = UtLocalCalloc (sizeof (ACPI_COMMENT_NODE));
731d638c6eeSSascha Wildner    NewCommentNode->Next = NULL;
7321093ca81SSascha Wildner    return (NewCommentNode);
733d638c6eeSSascha Wildner }
734d638c6eeSSascha Wildner 
735d638c6eeSSascha Wildner 
736d638c6eeSSascha Wildner /*******************************************************************************
737d638c6eeSSascha Wildner  *
738d638c6eeSSascha Wildner  * FUNCTION:    CvParseOpBlockType
739d638c6eeSSascha Wildner  *
740d638c6eeSSascha Wildner  * PARAMETERS:  Op              - Object to be examined
741d638c6eeSSascha Wildner  *
742d638c6eeSSascha Wildner  * RETURN:      BlockType - not a block, parens, braces, or even both.
743d638c6eeSSascha Wildner  *
744d638c6eeSSascha Wildner  * DESCRIPTION: Type of block for this ASL parseop (parens or braces)
745d638c6eeSSascha Wildner  *              keep this in sync with aslprimaries.y, aslresources.y and
746d638c6eeSSascha Wildner  *              aslrules.y
747d638c6eeSSascha Wildner  *
748d638c6eeSSascha Wildner  ******************************************************************************/
749d638c6eeSSascha Wildner 
750d638c6eeSSascha Wildner UINT32
CvParseOpBlockType(ACPI_PARSE_OBJECT * Op)751d638c6eeSSascha Wildner CvParseOpBlockType (
752d638c6eeSSascha Wildner     ACPI_PARSE_OBJECT       *Op)
753d638c6eeSSascha Wildner {
7541093ca81SSascha Wildner 
755d638c6eeSSascha Wildner     if (!Op)
756d638c6eeSSascha Wildner     {
757d638c6eeSSascha Wildner         return (BLOCK_NONE);
758d638c6eeSSascha Wildner     }
759d638c6eeSSascha Wildner 
760d638c6eeSSascha Wildner     switch (Op->Asl.ParseOpcode)
761d638c6eeSSascha Wildner     {
7621093ca81SSascha Wildner     /* From aslprimaries.y */
763d638c6eeSSascha Wildner 
764d638c6eeSSascha Wildner     case PARSEOP_VAR_PACKAGE:
765d638c6eeSSascha Wildner     case PARSEOP_BANKFIELD:
766d638c6eeSSascha Wildner     case PARSEOP_BUFFER:
767d638c6eeSSascha Wildner     case PARSEOP_CASE:
768d638c6eeSSascha Wildner     case PARSEOP_DEVICE:
769d638c6eeSSascha Wildner     case PARSEOP_FIELD:
770d638c6eeSSascha Wildner     case PARSEOP_FOR:
771d638c6eeSSascha Wildner     case PARSEOP_FUNCTION:
772d638c6eeSSascha Wildner     case PARSEOP_IF:
773d638c6eeSSascha Wildner     case PARSEOP_ELSEIF:
774d638c6eeSSascha Wildner     case PARSEOP_INDEXFIELD:
775d638c6eeSSascha Wildner     case PARSEOP_METHOD:
776d638c6eeSSascha Wildner     case PARSEOP_POWERRESOURCE:
777d638c6eeSSascha Wildner     case PARSEOP_PROCESSOR:
778d638c6eeSSascha Wildner     case PARSEOP_DATABUFFER:
779d638c6eeSSascha Wildner     case PARSEOP_SCOPE:
780d638c6eeSSascha Wildner     case PARSEOP_SWITCH:
781d638c6eeSSascha Wildner     case PARSEOP_THERMALZONE:
782d638c6eeSSascha Wildner     case PARSEOP_WHILE:
783d638c6eeSSascha Wildner 
7841093ca81SSascha Wildner     /* From aslresources.y */
785d638c6eeSSascha Wildner 
786d638c6eeSSascha Wildner     case PARSEOP_RESOURCETEMPLATE: /* optional parens */
787d638c6eeSSascha Wildner     case PARSEOP_VENDORLONG:
788d638c6eeSSascha Wildner     case PARSEOP_VENDORSHORT:
789d638c6eeSSascha Wildner     case PARSEOP_INTERRUPT:
790d638c6eeSSascha Wildner     case PARSEOP_IRQNOFLAGS:
791d638c6eeSSascha Wildner     case PARSEOP_IRQ:
792d638c6eeSSascha Wildner     case PARSEOP_GPIO_INT:
793d638c6eeSSascha Wildner     case PARSEOP_GPIO_IO:
794d638c6eeSSascha Wildner     case PARSEOP_DMA:
795d638c6eeSSascha Wildner 
7961093ca81SSascha Wildner     /* From aslrules.y */
797d638c6eeSSascha Wildner 
798d638c6eeSSascha Wildner     case PARSEOP_DEFINITION_BLOCK:
799d638c6eeSSascha Wildner         return (BLOCK_PAREN | BLOCK_BRACE);
800d638c6eeSSascha Wildner 
801d638c6eeSSascha Wildner     default:
802d638c6eeSSascha Wildner         return (BLOCK_NONE);
803d638c6eeSSascha Wildner     }
804d638c6eeSSascha Wildner }
805d638c6eeSSascha Wildner 
806d638c6eeSSascha Wildner 
807d638c6eeSSascha Wildner /*******************************************************************************
808d638c6eeSSascha Wildner  *
809d638c6eeSSascha Wildner  * FUNCTION:    CvProcessCommentState
810d638c6eeSSascha Wildner  *
8111093ca81SSascha Wildner  * PARAMETERS:  Input           - Input character
812d638c6eeSSascha Wildner  *
813d638c6eeSSascha Wildner  * RETURN:      None
814d638c6eeSSascha Wildner  *
815d638c6eeSSascha Wildner  * DESCRIPTION: Take the given input. If this character is
816d638c6eeSSascha Wildner  *              defined as a comment table entry, then update the state
817d638c6eeSSascha Wildner  *              accordingly.
818d638c6eeSSascha Wildner  *
819d638c6eeSSascha Wildner  ******************************************************************************/
820d638c6eeSSascha Wildner 
821d638c6eeSSascha Wildner void
CvProcessCommentState(char Input)822d638c6eeSSascha Wildner CvProcessCommentState (
8231093ca81SSascha Wildner     char                    Input)
824d638c6eeSSascha Wildner {
825d638c6eeSSascha Wildner 
8261093ca81SSascha Wildner     if (Input != ' ')
827d638c6eeSSascha Wildner     {
828806343b9SSascha Wildner         AslGbl_CommentState.SpacesBefore = 0;
829d638c6eeSSascha Wildner     }
830d638c6eeSSascha Wildner 
8311093ca81SSascha Wildner     switch (Input)
832d638c6eeSSascha Wildner     {
833d638c6eeSSascha Wildner     case '\n':
834d638c6eeSSascha Wildner 
835806343b9SSascha Wildner         AslGbl_CommentState.CommentType = ASL_COMMENT_STANDARD;
836d638c6eeSSascha Wildner         break;
837d638c6eeSSascha Wildner 
838d638c6eeSSascha Wildner     case ' ':
839d638c6eeSSascha Wildner 
840d638c6eeSSascha Wildner         /* Keep the CommentType the same */
841d638c6eeSSascha Wildner 
842806343b9SSascha Wildner         AslGbl_CommentState.SpacesBefore++;
843d638c6eeSSascha Wildner         break;
844d638c6eeSSascha Wildner 
845d638c6eeSSascha Wildner     case '(':
846d638c6eeSSascha Wildner 
847806343b9SSascha Wildner         AslGbl_CommentState.CommentType = ASL_COMMENT_OPEN_PAREN;
848d638c6eeSSascha Wildner         break;
849d638c6eeSSascha Wildner 
850d638c6eeSSascha Wildner     case ')':
851d638c6eeSSascha Wildner 
852806343b9SSascha Wildner         AslGbl_CommentState.CommentType = ASL_COMMENT_CLOSE_PAREN;
853d638c6eeSSascha Wildner         break;
854d638c6eeSSascha Wildner 
855d638c6eeSSascha Wildner     case '{':
856d638c6eeSSascha Wildner 
857806343b9SSascha Wildner         AslGbl_CommentState.CommentType = ASL_COMMENT_STANDARD;
858806343b9SSascha Wildner         AslGbl_CommentState.ParsingParenBraceNode = NULL;
859d638c6eeSSascha Wildner         CvDbgPrint ("End Parsing paren/Brace node!\n");
860d638c6eeSSascha Wildner         break;
861d638c6eeSSascha Wildner 
862d638c6eeSSascha Wildner     case '}':
863d638c6eeSSascha Wildner 
864806343b9SSascha Wildner         AslGbl_CommentState.CommentType = ASL_COMMENT_CLOSE_BRACE;
865d638c6eeSSascha Wildner         break;
866d638c6eeSSascha Wildner 
867d638c6eeSSascha Wildner     case ',':
868d638c6eeSSascha Wildner 
869806343b9SSascha Wildner         AslGbl_CommentState.CommentType = ASLCOMMENT_INLINE;
870d638c6eeSSascha Wildner         break;
871d638c6eeSSascha Wildner 
872d638c6eeSSascha Wildner     default:
873d638c6eeSSascha Wildner 
874806343b9SSascha Wildner         AslGbl_CommentState.CommentType = ASLCOMMENT_INLINE;
875d638c6eeSSascha Wildner         break;
876d638c6eeSSascha Wildner     }
877d638c6eeSSascha Wildner }
878d638c6eeSSascha Wildner 
879d638c6eeSSascha Wildner 
880d638c6eeSSascha Wildner /*******************************************************************************
881d638c6eeSSascha Wildner  *
882d638c6eeSSascha Wildner  * FUNCTION:    CvAddToCommentList
883d638c6eeSSascha Wildner  *
8841093ca81SSascha Wildner  * PARAMETERS:  ToAdd              - Contains the comment to be inserted
885d638c6eeSSascha Wildner  *
886d638c6eeSSascha Wildner  * RETURN:      None
887d638c6eeSSascha Wildner  *
888d638c6eeSSascha Wildner  * DESCRIPTION: Add the given char* to a list of comments in the global list
889d638c6eeSSascha Wildner  *              of comments.
890d638c6eeSSascha Wildner  *
891d638c6eeSSascha Wildner  ******************************************************************************/
892d638c6eeSSascha Wildner 
893d638c6eeSSascha Wildner void
CvAddToCommentList(char * ToAdd)894d638c6eeSSascha Wildner CvAddToCommentList (
895d638c6eeSSascha Wildner     char                    *ToAdd)
896d638c6eeSSascha Wildner {
8971093ca81SSascha Wildner 
898806343b9SSascha Wildner    if (AslGbl_CommentListHead)
899d638c6eeSSascha Wildner    {
900806343b9SSascha Wildner        AslGbl_CommentListTail->Next = CvCommentNodeCalloc ();
901806343b9SSascha Wildner        AslGbl_CommentListTail = AslGbl_CommentListTail->Next;
902d638c6eeSSascha Wildner    }
903d638c6eeSSascha Wildner    else
904d638c6eeSSascha Wildner    {
905806343b9SSascha Wildner        AslGbl_CommentListHead = CvCommentNodeCalloc ();
906806343b9SSascha Wildner        AslGbl_CommentListTail = AslGbl_CommentListHead;
907d638c6eeSSascha Wildner    }
908d638c6eeSSascha Wildner 
909806343b9SSascha Wildner    AslGbl_CommentListTail->Comment = ToAdd;
910d638c6eeSSascha Wildner }
911d638c6eeSSascha Wildner 
9121093ca81SSascha Wildner 
913d638c6eeSSascha Wildner /*******************************************************************************
914d638c6eeSSascha Wildner  *
915d638c6eeSSascha Wildner  * FUNCTION:    CvAppendInlineComment
916d638c6eeSSascha Wildner  *
917d638c6eeSSascha Wildner  * PARAMETERS:  InlineComment      - Append to the end of this string.
918d638c6eeSSascha Wildner  *              toAdd              - Contains the comment to be inserted
919d638c6eeSSascha Wildner  *
920d638c6eeSSascha Wildner  * RETURN:      Str                - toAdd appended to InlineComment
921d638c6eeSSascha Wildner  *
922d638c6eeSSascha Wildner  * DESCRIPTION: Concatenate ToAdd to InlineComment
923d638c6eeSSascha Wildner  *
924d638c6eeSSascha Wildner  ******************************************************************************/
925d638c6eeSSascha Wildner 
926d638c6eeSSascha Wildner char *
CvAppendInlineComment(char * InlineComment,char * ToAdd)927d638c6eeSSascha Wildner CvAppendInlineComment (
928d638c6eeSSascha Wildner     char                    *InlineComment,
929d638c6eeSSascha Wildner     char                    *ToAdd)
930d638c6eeSSascha Wildner {
931d638c6eeSSascha Wildner     char*                   Str;
932d638c6eeSSascha Wildner     UINT32                  Size = 0;
933d638c6eeSSascha Wildner 
934d638c6eeSSascha Wildner 
935d638c6eeSSascha Wildner     if (!InlineComment)
936d638c6eeSSascha Wildner     {
9371093ca81SSascha Wildner         return (ToAdd);
938d638c6eeSSascha Wildner     }
9391093ca81SSascha Wildner 
9401093ca81SSascha Wildner     if (!ToAdd)
941d638c6eeSSascha Wildner     {
9421093ca81SSascha Wildner         return (InlineComment);
943d638c6eeSSascha Wildner     }
9441093ca81SSascha Wildner 
9451093ca81SSascha Wildner     Size = strlen (ToAdd);
946d638c6eeSSascha Wildner     Size += strlen (InlineComment);
9477bcb6cafSSascha Wildner     Str = UtLocalCacheCalloc (Size + 1);
9481093ca81SSascha Wildner 
949d638c6eeSSascha Wildner     strcpy (Str, InlineComment);
950d638c6eeSSascha Wildner     strcat (Str, ToAdd);
951d638c6eeSSascha Wildner     Str[Size +1] = 0;
9521093ca81SSascha Wildner     return (Str);
953d638c6eeSSascha Wildner }
954d638c6eeSSascha Wildner 
955d638c6eeSSascha Wildner 
956d638c6eeSSascha Wildner /*******************************************************************************
957d638c6eeSSascha Wildner  *
958d638c6eeSSascha Wildner  * FUNCTION:    CvPlaceComment
959d638c6eeSSascha Wildner  *
9601093ca81SSascha Wildner  * PARAMETERS:  UINT8               - Type
961d638c6eeSSascha Wildner  *              char *              - CommentString
962d638c6eeSSascha Wildner  *
963d638c6eeSSascha Wildner  * RETURN:      None
964d638c6eeSSascha Wildner  *
965d638c6eeSSascha Wildner  * DESCRIPTION: Given type and CommentString, this function places the
96600ffa116SSascha Wildner  *              CommentString in the appropriate global comment list or char*
967d638c6eeSSascha Wildner  *
968d638c6eeSSascha Wildner  ******************************************************************************/
969d638c6eeSSascha Wildner 
970d638c6eeSSascha Wildner void
CvPlaceComment(UINT8 Type,char * CommentString)971d638c6eeSSascha Wildner CvPlaceComment(
972d638c6eeSSascha Wildner     UINT8                   Type,
973d638c6eeSSascha Wildner     char                    *CommentString)
974d638c6eeSSascha Wildner {
975d638c6eeSSascha Wildner     ACPI_PARSE_OBJECT       *LatestParseNode;
976d638c6eeSSascha Wildner     ACPI_PARSE_OBJECT       *ParenBraceNode;
977d638c6eeSSascha Wildner 
978d638c6eeSSascha Wildner 
979806343b9SSascha Wildner     LatestParseNode = AslGbl_CommentState.LatestParseOp;
980806343b9SSascha Wildner     ParenBraceNode  = AslGbl_CommentState.ParsingParenBraceNode;
981d638c6eeSSascha Wildner     CvDbgPrint ("Placing comment %s for type %d\n", CommentString, Type);
982d638c6eeSSascha Wildner 
983d638c6eeSSascha Wildner     switch (Type)
984d638c6eeSSascha Wildner     {
985d638c6eeSSascha Wildner     case ASL_COMMENT_STANDARD:
986d638c6eeSSascha Wildner 
987d638c6eeSSascha Wildner         CvAddToCommentList (CommentString);
988d638c6eeSSascha Wildner         break;
989d638c6eeSSascha Wildner 
990d638c6eeSSascha Wildner     case ASLCOMMENT_INLINE:
991d638c6eeSSascha Wildner 
992d638c6eeSSascha Wildner         LatestParseNode->Asl.InlineComment =
993d638c6eeSSascha Wildner             CvAppendInlineComment (LatestParseNode->Asl.InlineComment,
994d638c6eeSSascha Wildner             CommentString);
995d638c6eeSSascha Wildner         break;
996d638c6eeSSascha Wildner 
997d638c6eeSSascha Wildner     case ASL_COMMENT_OPEN_PAREN:
998d638c6eeSSascha Wildner 
999806343b9SSascha Wildner         AslGbl_InlineCommentBuffer =
1000806343b9SSascha Wildner             CvAppendInlineComment(AslGbl_InlineCommentBuffer,
1001d638c6eeSSascha Wildner             CommentString);
1002d638c6eeSSascha Wildner         break;
1003d638c6eeSSascha Wildner 
1004d638c6eeSSascha Wildner     case ASL_COMMENT_CLOSE_PAREN:
1005d638c6eeSSascha Wildner 
1006d638c6eeSSascha Wildner         if (ParenBraceNode)
1007d638c6eeSSascha Wildner         {
1008d638c6eeSSascha Wildner             ParenBraceNode->Asl.EndNodeComment =
1009d638c6eeSSascha Wildner                 CvAppendInlineComment (ParenBraceNode->Asl.EndNodeComment,
1010d638c6eeSSascha Wildner                 CommentString);
1011d638c6eeSSascha Wildner         }
1012d638c6eeSSascha Wildner         else
1013d638c6eeSSascha Wildner         {
1014d638c6eeSSascha Wildner             LatestParseNode->Asl.EndNodeComment =
1015d638c6eeSSascha Wildner                 CvAppendInlineComment (LatestParseNode->Asl.EndNodeComment,
1016d638c6eeSSascha Wildner                 CommentString);
1017d638c6eeSSascha Wildner         }
1018d638c6eeSSascha Wildner         break;
1019d638c6eeSSascha Wildner 
1020d638c6eeSSascha Wildner     case ASL_COMMENT_CLOSE_BRACE:
1021d638c6eeSSascha Wildner 
1022d638c6eeSSascha Wildner         LatestParseNode->Asl.CloseBraceComment = CommentString;
1023d638c6eeSSascha Wildner         break;
1024d638c6eeSSascha Wildner 
1025d638c6eeSSascha Wildner     default:
1026d638c6eeSSascha Wildner 
1027d638c6eeSSascha Wildner         break;
1028d638c6eeSSascha Wildner     }
1029d638c6eeSSascha Wildner }
1030