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