xref: /freebsd/sys/contrib/dev/acpica/compiler/aslsupport.l (revision 0d84335f991f528c6f038e79dd5cc0a7770532da)
1eef1b955SJung-uk Kim /******************************************************************************
2eef1b955SJung-uk Kim  *
3eef1b955SJung-uk Kim  * Module Name: aslsupport.l - Flex/lex scanner C support routines.
4eef1b955SJung-uk Kim  *              NOTE: Included into aslcompile.l, not compiled by itself.
5eef1b955SJung-uk Kim  *
6eef1b955SJung-uk Kim  *****************************************************************************/
7eef1b955SJung-uk Kim 
8*0d84335fSJung-uk Kim /******************************************************************************
9*0d84335fSJung-uk Kim  *
10*0d84335fSJung-uk Kim  * 1. Copyright Notice
11*0d84335fSJung-uk Kim  *
12*0d84335fSJung-uk Kim  * Some or all of this work - Copyright (c) 1999 - 2017, Intel Corp.
13eef1b955SJung-uk Kim  * All rights reserved.
14eef1b955SJung-uk Kim  *
15*0d84335fSJung-uk Kim  * 2. License
16*0d84335fSJung-uk Kim  *
17*0d84335fSJung-uk Kim  * 2.1. This is your license from Intel Corp. under its intellectual property
18*0d84335fSJung-uk Kim  * rights. You may have additional license terms from the party that provided
19*0d84335fSJung-uk Kim  * you this software, covering your right to use that party's intellectual
20*0d84335fSJung-uk Kim  * property rights.
21*0d84335fSJung-uk Kim  *
22*0d84335fSJung-uk Kim  * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
23*0d84335fSJung-uk Kim  * copy of the source code appearing in this file ("Covered Code") an
24*0d84335fSJung-uk Kim  * irrevocable, perpetual, worldwide license under Intel's copyrights in the
25*0d84335fSJung-uk Kim  * base code distributed originally by Intel ("Original Intel Code") to copy,
26*0d84335fSJung-uk Kim  * make derivatives, distribute, use and display any portion of the Covered
27*0d84335fSJung-uk Kim  * Code in any form, with the right to sublicense such rights; and
28*0d84335fSJung-uk Kim  *
29*0d84335fSJung-uk Kim  * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
30*0d84335fSJung-uk Kim  * license (with the right to sublicense), under only those claims of Intel
31*0d84335fSJung-uk Kim  * patents that are infringed by the Original Intel Code, to make, use, sell,
32*0d84335fSJung-uk Kim  * offer to sell, and import the Covered Code and derivative works thereof
33*0d84335fSJung-uk Kim  * solely to the minimum extent necessary to exercise the above copyright
34*0d84335fSJung-uk Kim  * license, and in no event shall the patent license extend to any additions
35*0d84335fSJung-uk Kim  * to or modifications of the Original Intel Code. No other license or right
36*0d84335fSJung-uk Kim  * is granted directly or by implication, estoppel or otherwise;
37*0d84335fSJung-uk Kim  *
38*0d84335fSJung-uk Kim  * The above copyright and patent license is granted only if the following
39*0d84335fSJung-uk Kim  * conditions are met:
40*0d84335fSJung-uk Kim  *
41*0d84335fSJung-uk Kim  * 3. Conditions
42*0d84335fSJung-uk Kim  *
43*0d84335fSJung-uk Kim  * 3.1. Redistribution of Source with Rights to Further Distribute Source.
44*0d84335fSJung-uk Kim  * Redistribution of source code of any substantial portion of the Covered
45*0d84335fSJung-uk Kim  * Code or modification with rights to further distribute source must include
46*0d84335fSJung-uk Kim  * the above Copyright Notice, the above License, this list of Conditions,
47*0d84335fSJung-uk Kim  * and the following Disclaimer and Export Compliance provision. In addition,
48*0d84335fSJung-uk Kim  * Licensee must cause all Covered Code to which Licensee contributes to
49*0d84335fSJung-uk Kim  * contain a file documenting the changes Licensee made to create that Covered
50*0d84335fSJung-uk Kim  * Code and the date of any change. Licensee must include in that file the
51*0d84335fSJung-uk Kim  * documentation of any changes made by any predecessor Licensee. Licensee
52*0d84335fSJung-uk Kim  * must include a prominent statement that the modification is derived,
53*0d84335fSJung-uk Kim  * directly or indirectly, from Original Intel Code.
54*0d84335fSJung-uk Kim  *
55*0d84335fSJung-uk Kim  * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
56*0d84335fSJung-uk Kim  * Redistribution of source code of any substantial portion of the Covered
57*0d84335fSJung-uk Kim  * Code or modification without rights to further distribute source must
58*0d84335fSJung-uk Kim  * include the following Disclaimer and Export Compliance provision in the
59*0d84335fSJung-uk Kim  * documentation and/or other materials provided with distribution. In
60*0d84335fSJung-uk Kim  * addition, Licensee may not authorize further sublicense of source of any
61*0d84335fSJung-uk Kim  * portion of the Covered Code, and must include terms to the effect that the
62*0d84335fSJung-uk Kim  * license from Licensee to its licensee is limited to the intellectual
63*0d84335fSJung-uk Kim  * property embodied in the software Licensee provides to its licensee, and
64*0d84335fSJung-uk Kim  * not to intellectual property embodied in modifications its licensee may
65*0d84335fSJung-uk Kim  * make.
66*0d84335fSJung-uk Kim  *
67*0d84335fSJung-uk Kim  * 3.3. Redistribution of Executable. Redistribution in executable form of any
68*0d84335fSJung-uk Kim  * substantial portion of the Covered Code or modification must reproduce the
69*0d84335fSJung-uk Kim  * above Copyright Notice, and the following Disclaimer and Export Compliance
70*0d84335fSJung-uk Kim  * provision in the documentation and/or other materials provided with the
71*0d84335fSJung-uk Kim  * distribution.
72*0d84335fSJung-uk Kim  *
73*0d84335fSJung-uk Kim  * 3.4. Intel retains all right, title, and interest in and to the Original
74*0d84335fSJung-uk Kim  * Intel Code.
75*0d84335fSJung-uk Kim  *
76*0d84335fSJung-uk Kim  * 3.5. Neither the name Intel nor any other trademark owned or controlled by
77*0d84335fSJung-uk Kim  * Intel shall be used in advertising or otherwise to promote the sale, use or
78*0d84335fSJung-uk Kim  * other dealings in products derived from or relating to the Covered Code
79*0d84335fSJung-uk Kim  * without prior written authorization from Intel.
80*0d84335fSJung-uk Kim  *
81*0d84335fSJung-uk Kim  * 4. Disclaimer and Export Compliance
82*0d84335fSJung-uk Kim  *
83*0d84335fSJung-uk Kim  * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
84*0d84335fSJung-uk Kim  * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
85*0d84335fSJung-uk Kim  * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
86*0d84335fSJung-uk Kim  * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
87*0d84335fSJung-uk Kim  * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
88*0d84335fSJung-uk Kim  * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
89*0d84335fSJung-uk Kim  * PARTICULAR PURPOSE.
90*0d84335fSJung-uk Kim  *
91*0d84335fSJung-uk Kim  * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
92*0d84335fSJung-uk Kim  * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
93*0d84335fSJung-uk Kim  * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
94*0d84335fSJung-uk Kim  * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
95*0d84335fSJung-uk Kim  * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
96*0d84335fSJung-uk Kim  * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
97*0d84335fSJung-uk Kim  * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
98*0d84335fSJung-uk Kim  * LIMITED REMEDY.
99*0d84335fSJung-uk Kim  *
100*0d84335fSJung-uk Kim  * 4.3. Licensee shall not export, either directly or indirectly, any of this
101*0d84335fSJung-uk Kim  * software or system incorporating such software without first obtaining any
102*0d84335fSJung-uk Kim  * required license or other approval from the U. S. Department of Commerce or
103*0d84335fSJung-uk Kim  * any other agency or department of the United States Government. In the
104*0d84335fSJung-uk Kim  * event Licensee exports any such software from the United States or
105*0d84335fSJung-uk Kim  * re-exports any such software from a foreign destination, Licensee shall
106*0d84335fSJung-uk Kim  * ensure that the distribution and export/re-export of the software is in
107*0d84335fSJung-uk Kim  * compliance with all laws, regulations, orders, or other restrictions of the
108*0d84335fSJung-uk Kim  * U.S. Export Administration Regulations. Licensee agrees that neither it nor
109*0d84335fSJung-uk Kim  * any of its subsidiaries will export/re-export any technical data, process,
110*0d84335fSJung-uk Kim  * software, or service, directly or indirectly, to any country for which the
111*0d84335fSJung-uk Kim  * United States government or any agency thereof requires an export license,
112*0d84335fSJung-uk Kim  * other governmental approval, or letter of assurance, without first obtaining
113*0d84335fSJung-uk Kim  * such license, approval or letter.
114*0d84335fSJung-uk Kim  *
115*0d84335fSJung-uk Kim  *****************************************************************************
116*0d84335fSJung-uk Kim  *
117*0d84335fSJung-uk Kim  * Alternatively, you may choose to be licensed under the terms of the
118*0d84335fSJung-uk Kim  * following license:
119*0d84335fSJung-uk Kim  *
120eef1b955SJung-uk Kim  * Redistribution and use in source and binary forms, with or without
121eef1b955SJung-uk Kim  * modification, are permitted provided that the following conditions
122eef1b955SJung-uk Kim  * are met:
123eef1b955SJung-uk Kim  * 1. Redistributions of source code must retain the above copyright
124eef1b955SJung-uk Kim  *    notice, this list of conditions, and the following disclaimer,
125eef1b955SJung-uk Kim  *    without modification.
126eef1b955SJung-uk Kim  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
127eef1b955SJung-uk Kim  *    substantially similar to the "NO WARRANTY" disclaimer below
128eef1b955SJung-uk Kim  *    ("Disclaimer") and any redistribution must be conditioned upon
129eef1b955SJung-uk Kim  *    including a substantially similar Disclaimer requirement for further
130eef1b955SJung-uk Kim  *    binary redistribution.
131eef1b955SJung-uk Kim  * 3. Neither the names of the above-listed copyright holders nor the names
132eef1b955SJung-uk Kim  *    of any contributors may be used to endorse or promote products derived
133eef1b955SJung-uk Kim  *    from this software without specific prior written permission.
134eef1b955SJung-uk Kim  *
135*0d84335fSJung-uk Kim  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
136*0d84335fSJung-uk Kim  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
137*0d84335fSJung-uk Kim  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
138*0d84335fSJung-uk Kim  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
139*0d84335fSJung-uk Kim  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
140*0d84335fSJung-uk Kim  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
141*0d84335fSJung-uk Kim  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
142*0d84335fSJung-uk Kim  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
143*0d84335fSJung-uk Kim  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
144*0d84335fSJung-uk Kim  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
145*0d84335fSJung-uk Kim  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
146*0d84335fSJung-uk Kim  *
147*0d84335fSJung-uk Kim  * Alternatively, you may choose to be licensed under the terms of the
148eef1b955SJung-uk Kim  * GNU General Public License ("GPL") version 2 as published by the Free
149eef1b955SJung-uk Kim  * Software Foundation.
150eef1b955SJung-uk Kim  *
151*0d84335fSJung-uk Kim  *****************************************************************************/
152eef1b955SJung-uk Kim 
153eef1b955SJung-uk Kim /* Configuration */
154eef1b955SJung-uk Kim 
155eef1b955SJung-uk Kim #define ASL_SPACES_PER_TAB      4
156eef1b955SJung-uk Kim 
157eef1b955SJung-uk Kim #define ASL_NORMAL_CHAR         0
158eef1b955SJung-uk Kim #define ASL_ESCAPE_SEQUENCE     1
159eef1b955SJung-uk Kim #define ASL_OCTAL_CONSTANT      2
160eef1b955SJung-uk Kim #define ASL_HEX_CONSTANT        3
161eef1b955SJung-uk Kim 
162eef1b955SJung-uk Kim 
163*0d84335fSJung-uk Kim void
164*0d84335fSJung-uk Kim yyerror (char const *s)
165eef1b955SJung-uk Kim {
166eef1b955SJung-uk Kim 
167*0d84335fSJung-uk Kim   AcpiOsPrintf ("YYERROR: %s\n", s);
168*0d84335fSJung-uk Kim }
169eef1b955SJung-uk Kim 
170eef1b955SJung-uk Kim 
1711c0e1b6dSJung-uk Kim /*******************************************************************************
1721c0e1b6dSJung-uk Kim  *
1731c0e1b6dSJung-uk Kim  * FUNCTION:    AslParserCleanup
1741c0e1b6dSJung-uk Kim  *
1751c0e1b6dSJung-uk Kim  * Used to delete the current buffer
1761c0e1b6dSJung-uk Kim  *
1771c0e1b6dSJung-uk Kim  ******************************************************************************/
1781c0e1b6dSJung-uk Kim 
179313a0c13SJung-uk Kim void
180313a0c13SJung-uk Kim AslParserCleanup (
181313a0c13SJung-uk Kim     void)
182313a0c13SJung-uk Kim {
183313a0c13SJung-uk Kim 
184313a0c13SJung-uk Kim     yy_delete_buffer (YY_CURRENT_BUFFER);
185313a0c13SJung-uk Kim }
186313a0c13SJung-uk Kim 
187313a0c13SJung-uk Kim 
188eef1b955SJung-uk Kim /*******************************************************************************
189eef1b955SJung-uk Kim  *
190eef1b955SJung-uk Kim  * FUNCTION:    AslDoLineDirective
191eef1b955SJung-uk Kim  *
192eef1b955SJung-uk Kim  * PARAMETERS:  None. Uses input() to access current source code line
193eef1b955SJung-uk Kim  *
194eef1b955SJung-uk Kim  * RETURN:      Updates global line number and filename
195eef1b955SJung-uk Kim  *
196eef1b955SJung-uk Kim  * DESCRIPTION: Handle #line directives emitted by the preprocessor.
197eef1b955SJung-uk Kim  *
198eef1b955SJung-uk Kim  * The #line directive is emitted by the preprocesser, and is used to
199eef1b955SJung-uk Kim  * pass through line numbers from the original source code file to the
200eef1b955SJung-uk Kim  * preprocessor output file (.i). This allows any compiler-generated
201eef1b955SJung-uk Kim  * error messages to be displayed with the correct line number.
202eef1b955SJung-uk Kim  *
203eef1b955SJung-uk Kim  ******************************************************************************/
204eef1b955SJung-uk Kim 
205eef1b955SJung-uk Kim static void
206eef1b955SJung-uk Kim AslDoLineDirective (
207eef1b955SJung-uk Kim     void)
208eef1b955SJung-uk Kim {
209f38b0f21SJung-uk Kim     int                     c;
210eef1b955SJung-uk Kim     char                    *Token;
211eef1b955SJung-uk Kim     UINT32                  LineNumber;
212eef1b955SJung-uk Kim     char                    *Filename;
213f38b0f21SJung-uk Kim     UINT32                  i;
214eef1b955SJung-uk Kim 
2155ef50723SJung-uk Kim    Gbl_HasIncludeFiles = TRUE;
216eef1b955SJung-uk Kim 
217eef1b955SJung-uk Kim     /* Eat the entire line that contains the #line directive */
218eef1b955SJung-uk Kim 
219f38b0f21SJung-uk Kim     Gbl_LineBufPtr = Gbl_CurrentLineBuffer;
220f38b0f21SJung-uk Kim 
221f38b0f21SJung-uk Kim     while ((c = input()) != '\n' && c != EOF)
222eef1b955SJung-uk Kim     {
223f38b0f21SJung-uk Kim         *Gbl_LineBufPtr = c;
224f38b0f21SJung-uk Kim         Gbl_LineBufPtr++;
225eef1b955SJung-uk Kim     }
226f38b0f21SJung-uk Kim     *Gbl_LineBufPtr = 0;
227eef1b955SJung-uk Kim 
228eef1b955SJung-uk Kim     /* First argument is the actual line number */
229eef1b955SJung-uk Kim 
230eef1b955SJung-uk Kim     Token = strtok (Gbl_CurrentLineBuffer, " ");
231eef1b955SJung-uk Kim     if (!Token)
232eef1b955SJung-uk Kim     {
233eef1b955SJung-uk Kim         goto ResetAndExit;
234eef1b955SJung-uk Kim     }
235eef1b955SJung-uk Kim 
236f38b0f21SJung-uk Kim     /* First argument is the line number */
237eef1b955SJung-uk Kim 
238eef1b955SJung-uk Kim     LineNumber = (UINT32) UtDoConstant (Token);
239f38b0f21SJung-uk Kim 
240f38b0f21SJung-uk Kim     /* Emit the appropriate number of newlines */
241f38b0f21SJung-uk Kim 
242f38b0f21SJung-uk Kim     Gbl_CurrentColumn = 0;
243f38b0f21SJung-uk Kim     if (LineNumber > Gbl_CurrentLineNumber)
244f38b0f21SJung-uk Kim     {
245f38b0f21SJung-uk Kim         for (i = 0; i < (LineNumber - Gbl_CurrentLineNumber); i++)
246f38b0f21SJung-uk Kim         {
247f38b0f21SJung-uk Kim             FlWriteFile (ASL_FILE_SOURCE_OUTPUT, "\n", 1);
248f38b0f21SJung-uk Kim             Gbl_CurrentColumn++;
249f38b0f21SJung-uk Kim         }
250f38b0f21SJung-uk Kim     }
251f38b0f21SJung-uk Kim 
252f38b0f21SJung-uk Kim     FlSetLineNumber (LineNumber);
253eef1b955SJung-uk Kim 
254eef1b955SJung-uk Kim     /* Second argument is the optional filename (in double quotes) */
255eef1b955SJung-uk Kim 
256eef1b955SJung-uk Kim     Token = strtok (NULL, " \"");
257eef1b955SJung-uk Kim     if (Token)
258eef1b955SJung-uk Kim     {
259eef1b955SJung-uk Kim         Filename = ACPI_ALLOCATE_ZEROED (strlen (Token) + 1);
260eef1b955SJung-uk Kim         strcpy (Filename, Token);
261eef1b955SJung-uk Kim         FlSetFilename (Filename);
262eef1b955SJung-uk Kim     }
263eef1b955SJung-uk Kim 
264eef1b955SJung-uk Kim     /* Third argument is not supported at this time */
265eef1b955SJung-uk Kim 
266eef1b955SJung-uk Kim ResetAndExit:
267f38b0f21SJung-uk Kim 
268f38b0f21SJung-uk Kim     /* Reset globals for a new line */
269f38b0f21SJung-uk Kim 
270f38b0f21SJung-uk Kim     Gbl_CurrentLineOffset += Gbl_CurrentColumn;
271f38b0f21SJung-uk Kim     Gbl_CurrentColumn = 0;
272f38b0f21SJung-uk Kim     Gbl_LineBufPtr = Gbl_CurrentLineBuffer;
273eef1b955SJung-uk Kim }
274eef1b955SJung-uk Kim 
275eef1b955SJung-uk Kim 
276eef1b955SJung-uk Kim /*******************************************************************************
277eef1b955SJung-uk Kim  *
278eef1b955SJung-uk Kim  * FUNCTION:    AslPopInputFileStack
279eef1b955SJung-uk Kim  *
280eef1b955SJung-uk Kim  * PARAMETERS:  None
281eef1b955SJung-uk Kim  *
282eef1b955SJung-uk Kim  * RETURN:      0 if a node was popped, -1 otherwise
283eef1b955SJung-uk Kim  *
284eef1b955SJung-uk Kim  * DESCRIPTION: Pop the top of the input file stack and point the parser to
285eef1b955SJung-uk Kim  *              the saved parse buffer contained in the fnode. Also, set the
286eef1b955SJung-uk Kim  *              global line counters to the saved values. This function is
287eef1b955SJung-uk Kim  *              called when an include file reaches EOF.
288eef1b955SJung-uk Kim  *
289eef1b955SJung-uk Kim  ******************************************************************************/
290eef1b955SJung-uk Kim 
291eef1b955SJung-uk Kim int
292eef1b955SJung-uk Kim AslPopInputFileStack (
293eef1b955SJung-uk Kim     void)
294eef1b955SJung-uk Kim {
295eef1b955SJung-uk Kim     ASL_FILE_NODE           *Fnode;
296eef1b955SJung-uk Kim 
297eef1b955SJung-uk Kim 
298f8146b88SJung-uk Kim     Gbl_PreviousIncludeFilename = Gbl_Files[ASL_FILE_INPUT].Filename;
299eef1b955SJung-uk Kim     Fnode = Gbl_IncludeFileStack;
3001c0e1b6dSJung-uk Kim     DbgPrint (ASL_PARSE_OUTPUT,
301f8146b88SJung-uk Kim         "\nPop InputFile Stack, Fnode %p\n", Fnode);
302f8146b88SJung-uk Kim 
303f8146b88SJung-uk Kim     DbgPrint (ASL_PARSE_OUTPUT,
304f8146b88SJung-uk Kim         "Include: Closing \"%s\"\n\n", Gbl_Files[ASL_FILE_INPUT].Filename);
305eef1b955SJung-uk Kim 
306eef1b955SJung-uk Kim     if (!Fnode)
307eef1b955SJung-uk Kim     {
308eef1b955SJung-uk Kim         return (-1);
309eef1b955SJung-uk Kim     }
310eef1b955SJung-uk Kim 
311eef1b955SJung-uk Kim     /* Close the current include file */
312eef1b955SJung-uk Kim 
313eef1b955SJung-uk Kim     fclose (yyin);
314eef1b955SJung-uk Kim 
315eef1b955SJung-uk Kim     /* Update the top-of-stack */
316eef1b955SJung-uk Kim 
317eef1b955SJung-uk Kim     Gbl_IncludeFileStack = Fnode->Next;
318eef1b955SJung-uk Kim 
319eef1b955SJung-uk Kim     /* Reset global line counter and filename */
320eef1b955SJung-uk Kim 
321eef1b955SJung-uk Kim     Gbl_Files[ASL_FILE_INPUT].Filename = Fnode->Filename;
322eef1b955SJung-uk Kim     Gbl_CurrentLineNumber = Fnode->CurrentLineNumber;
323eef1b955SJung-uk Kim 
324eef1b955SJung-uk Kim     /* Point the parser to the popped file */
325eef1b955SJung-uk Kim 
326eef1b955SJung-uk Kim     yy_delete_buffer (YY_CURRENT_BUFFER);
327eef1b955SJung-uk Kim     yy_switch_to_buffer (Fnode->State);
328eef1b955SJung-uk Kim 
329eef1b955SJung-uk Kim     /* All done with this node */
330eef1b955SJung-uk Kim 
331eef1b955SJung-uk Kim     ACPI_FREE (Fnode);
332eef1b955SJung-uk Kim     return (0);
333eef1b955SJung-uk Kim }
334eef1b955SJung-uk Kim 
335eef1b955SJung-uk Kim 
336eef1b955SJung-uk Kim /*******************************************************************************
337eef1b955SJung-uk Kim  *
338eef1b955SJung-uk Kim  * FUNCTION:    AslPushInputFileStack
339eef1b955SJung-uk Kim  *
340eef1b955SJung-uk Kim  * PARAMETERS:  InputFile           - Open file pointer
341eef1b955SJung-uk Kim  *              Filename            - Name of the file
342eef1b955SJung-uk Kim  *
343eef1b955SJung-uk Kim  * RETURN:      None
344eef1b955SJung-uk Kim  *
345eef1b955SJung-uk Kim  * DESCRIPTION: Push the InputFile onto the file stack, and point the parser
346eef1b955SJung-uk Kim  *              to this file. Called when an include file is successfully
347eef1b955SJung-uk Kim  *              opened.
348eef1b955SJung-uk Kim  *
349eef1b955SJung-uk Kim  ******************************************************************************/
350eef1b955SJung-uk Kim 
351eef1b955SJung-uk Kim void
352eef1b955SJung-uk Kim AslPushInputFileStack (
353eef1b955SJung-uk Kim     FILE                    *InputFile,
354eef1b955SJung-uk Kim     char                    *Filename)
355eef1b955SJung-uk Kim {
356eef1b955SJung-uk Kim     ASL_FILE_NODE           *Fnode;
357eef1b955SJung-uk Kim     YY_BUFFER_STATE         State;
358eef1b955SJung-uk Kim 
359eef1b955SJung-uk Kim 
360eef1b955SJung-uk Kim     /* Save the current state in an Fnode */
361eef1b955SJung-uk Kim 
362eef1b955SJung-uk Kim     Fnode = UtLocalCalloc (sizeof (ASL_FILE_NODE));
363eef1b955SJung-uk Kim 
364eef1b955SJung-uk Kim     Fnode->File = yyin;
365eef1b955SJung-uk Kim     Fnode->Next = Gbl_IncludeFileStack;
366eef1b955SJung-uk Kim     Fnode->State = YY_CURRENT_BUFFER;
367eef1b955SJung-uk Kim     Fnode->Filename = Gbl_Files[ASL_FILE_INPUT].Filename;
3681c0e1b6dSJung-uk Kim     Fnode->CurrentLineNumber = Gbl_CurrentLineNumber;
369eef1b955SJung-uk Kim 
370eef1b955SJung-uk Kim     /* Push it on the stack */
371eef1b955SJung-uk Kim 
372eef1b955SJung-uk Kim     Gbl_IncludeFileStack = Fnode;
373eef1b955SJung-uk Kim 
374eef1b955SJung-uk Kim     /* Point the parser to this file */
375eef1b955SJung-uk Kim 
376eef1b955SJung-uk Kim     State = yy_create_buffer (InputFile, YY_BUF_SIZE);
377eef1b955SJung-uk Kim     yy_switch_to_buffer (State);
378eef1b955SJung-uk Kim 
3791c0e1b6dSJung-uk Kim     DbgPrint (ASL_PARSE_OUTPUT,
3801c0e1b6dSJung-uk Kim         "\nPush InputFile Stack, returning %p\n\n", InputFile);
381eef1b955SJung-uk Kim 
382eef1b955SJung-uk Kim     /* Reset the global line count and filename */
383eef1b955SJung-uk Kim 
384313a0c13SJung-uk Kim     Gbl_Files[ASL_FILE_INPUT].Filename =
385313a0c13SJung-uk Kim         UtStringCacheCalloc (strlen (Filename) + 1);
386313a0c13SJung-uk Kim 
387313a0c13SJung-uk Kim     strcpy (Gbl_Files[ASL_FILE_INPUT].Filename, Filename);
388313a0c13SJung-uk Kim 
389eef1b955SJung-uk Kim     Gbl_CurrentLineNumber = 1;
390eef1b955SJung-uk Kim     yyin = InputFile;
391*0d84335fSJung-uk Kim 
392*0d84335fSJung-uk Kim     /* converter: reset the comment state to STANDARD_COMMENT */
393*0d84335fSJung-uk Kim 
394*0d84335fSJung-uk Kim     Gbl_CommentState.CommentType = STANDARD_COMMENT;
395eef1b955SJung-uk Kim }
396eef1b955SJung-uk Kim 
397eef1b955SJung-uk Kim 
398eef1b955SJung-uk Kim /*******************************************************************************
399eef1b955SJung-uk Kim  *
400eef1b955SJung-uk Kim  * FUNCTION:    AslResetCurrentLineBuffer
401eef1b955SJung-uk Kim  *
402eef1b955SJung-uk Kim  * PARAMETERS:  None
403eef1b955SJung-uk Kim  *
404eef1b955SJung-uk Kim  * RETURN:      None
405eef1b955SJung-uk Kim  *
406eef1b955SJung-uk Kim  * DESCRIPTION: Reset the Line Buffer to zero, increment global line numbers.
407eef1b955SJung-uk Kim  *
408eef1b955SJung-uk Kim  ******************************************************************************/
409eef1b955SJung-uk Kim 
410eef1b955SJung-uk Kim void
411eef1b955SJung-uk Kim AslResetCurrentLineBuffer (
412eef1b955SJung-uk Kim     void)
413eef1b955SJung-uk Kim {
414eef1b955SJung-uk Kim 
415eef1b955SJung-uk Kim     if (Gbl_Files[ASL_FILE_SOURCE_OUTPUT].Handle)
416eef1b955SJung-uk Kim     {
417eef1b955SJung-uk Kim         FlWriteFile (ASL_FILE_SOURCE_OUTPUT, Gbl_CurrentLineBuffer,
418eef1b955SJung-uk Kim             Gbl_LineBufPtr - Gbl_CurrentLineBuffer);
419eef1b955SJung-uk Kim     }
420eef1b955SJung-uk Kim 
421eef1b955SJung-uk Kim     Gbl_CurrentLineOffset += Gbl_CurrentColumn;
422eef1b955SJung-uk Kim     Gbl_CurrentColumn = 0;
423eef1b955SJung-uk Kim 
424eef1b955SJung-uk Kim     Gbl_CurrentLineNumber++;
425eef1b955SJung-uk Kim     Gbl_LogicalLineNumber++;
426eef1b955SJung-uk Kim     Gbl_LineBufPtr = Gbl_CurrentLineBuffer;
427eef1b955SJung-uk Kim }
428eef1b955SJung-uk Kim 
429eef1b955SJung-uk Kim 
430eef1b955SJung-uk Kim /*******************************************************************************
431eef1b955SJung-uk Kim  *
432eef1b955SJung-uk Kim  * FUNCTION:    AslInsertLineBuffer
433eef1b955SJung-uk Kim  *
434eef1b955SJung-uk Kim  * PARAMETERS:  SourceChar          - One char from the input ASL source file
435eef1b955SJung-uk Kim  *
436eef1b955SJung-uk Kim  * RETURN:      None
437eef1b955SJung-uk Kim  *
438eef1b955SJung-uk Kim  * DESCRIPTION: Put one character of the source file into the temp line buffer
439eef1b955SJung-uk Kim  *
440eef1b955SJung-uk Kim  ******************************************************************************/
441eef1b955SJung-uk Kim 
442eef1b955SJung-uk Kim void
443eef1b955SJung-uk Kim AslInsertLineBuffer (
444eef1b955SJung-uk Kim     int                     SourceChar)
445eef1b955SJung-uk Kim {
446eef1b955SJung-uk Kim     UINT32                  i;
447eef1b955SJung-uk Kim     UINT32                  Count = 1;
448eef1b955SJung-uk Kim 
449eef1b955SJung-uk Kim 
450eef1b955SJung-uk Kim     if (SourceChar == EOF)
451eef1b955SJung-uk Kim     {
452eef1b955SJung-uk Kim         return;
453eef1b955SJung-uk Kim     }
454eef1b955SJung-uk Kim 
455eef1b955SJung-uk Kim     Gbl_InputByteCount++;
456eef1b955SJung-uk Kim 
457eef1b955SJung-uk Kim     /* Handle tabs. Convert to spaces */
458eef1b955SJung-uk Kim 
459eef1b955SJung-uk Kim     if (SourceChar == '\t')
460eef1b955SJung-uk Kim     {
461eef1b955SJung-uk Kim         SourceChar = ' ';
462eef1b955SJung-uk Kim         Count = ASL_SPACES_PER_TAB -
463eef1b955SJung-uk Kim                     (Gbl_CurrentColumn & (ASL_SPACES_PER_TAB-1));
464eef1b955SJung-uk Kim     }
465eef1b955SJung-uk Kim 
466eef1b955SJung-uk Kim     for (i = 0; i < Count; i++)
467eef1b955SJung-uk Kim     {
468eef1b955SJung-uk Kim         Gbl_CurrentColumn++;
469eef1b955SJung-uk Kim 
470eef1b955SJung-uk Kim         /* Insert the character into the line buffer */
471eef1b955SJung-uk Kim 
472eef1b955SJung-uk Kim         *Gbl_LineBufPtr = (UINT8) SourceChar;
473eef1b955SJung-uk Kim         Gbl_LineBufPtr++;
474eef1b955SJung-uk Kim 
4751c0e1b6dSJung-uk Kim         if (Gbl_LineBufPtr >
4761c0e1b6dSJung-uk Kim             (Gbl_CurrentLineBuffer + (Gbl_LineBufferSize - 1)))
477eef1b955SJung-uk Kim         {
478eef1b955SJung-uk Kim #if 0
479eef1b955SJung-uk Kim             /*
480eef1b955SJung-uk Kim              * Warning if we have split a long source line.
481eef1b955SJung-uk Kim              * <Probably overkill>
482eef1b955SJung-uk Kim              */
483042ff955SJung-uk Kim             sprintf (MsgBuffer, "Max %u", Gbl_LineBufferSize);
484eef1b955SJung-uk Kim             AslCommonError (ASL_WARNING, ASL_MSG_LONG_LINE,
485eef1b955SJung-uk Kim                 Gbl_CurrentLineNumber, Gbl_LogicalLineNumber,
486eef1b955SJung-uk Kim                 Gbl_CurrentLineOffset, Gbl_CurrentColumn,
487eef1b955SJung-uk Kim                 Gbl_Files[ASL_FILE_INPUT].Filename, MsgBuffer);
488eef1b955SJung-uk Kim #endif
489eef1b955SJung-uk Kim 
490eef1b955SJung-uk Kim             AslResetCurrentLineBuffer ();
491eef1b955SJung-uk Kim         }
492eef1b955SJung-uk Kim         else if (SourceChar == '\n')
493eef1b955SJung-uk Kim         {
494eef1b955SJung-uk Kim             /* End of line */
495eef1b955SJung-uk Kim 
496eef1b955SJung-uk Kim             AslResetCurrentLineBuffer ();
497eef1b955SJung-uk Kim         }
498*0d84335fSJung-uk Kim 
499*0d84335fSJung-uk Kim         if (Gbl_CaptureComments)
500*0d84335fSJung-uk Kim         {
501*0d84335fSJung-uk Kim             CvProcessCommentState (SourceChar);
502*0d84335fSJung-uk Kim         }
503eef1b955SJung-uk Kim     }
504eef1b955SJung-uk Kim }
505eef1b955SJung-uk Kim 
506eef1b955SJung-uk Kim 
507eef1b955SJung-uk Kim /*******************************************************************************
508eef1b955SJung-uk Kim  *
509eef1b955SJung-uk Kim  * FUNCTION:    count
510eef1b955SJung-uk Kim  *
511eef1b955SJung-uk Kim  * PARAMETERS:  yytext              - Contains the matched keyword.
512eef1b955SJung-uk Kim  *              Type                - Keyword/Character type:
513eef1b955SJung-uk Kim  *                                      0 = anything except a keyword
514eef1b955SJung-uk Kim  *                                      1 = pseudo-keywords
515eef1b955SJung-uk Kim  *                                      2 = non-executable ASL keywords
516eef1b955SJung-uk Kim  *                                      3 = executable ASL keywords
517eef1b955SJung-uk Kim  *
518eef1b955SJung-uk Kim  * RETURN:      None
519eef1b955SJung-uk Kim  *
520eef1b955SJung-uk Kim  * DESCRIPTION: Count keywords and put them into the line buffer
521eef1b955SJung-uk Kim  *
522eef1b955SJung-uk Kim  ******************************************************************************/
523eef1b955SJung-uk Kim 
524eef1b955SJung-uk Kim static void
525eef1b955SJung-uk Kim count (
526eef1b955SJung-uk Kim     int                 Type)
527eef1b955SJung-uk Kim {
528eef1b955SJung-uk Kim     int                 i;
529eef1b955SJung-uk Kim 
530eef1b955SJung-uk Kim 
531eef1b955SJung-uk Kim     switch (Type)
532eef1b955SJung-uk Kim     {
533eef1b955SJung-uk Kim     case 2:
534a9d8d09cSJung-uk Kim 
535eef1b955SJung-uk Kim         TotalKeywords++;
536eef1b955SJung-uk Kim         TotalNamedObjects++;
537eef1b955SJung-uk Kim         break;
538eef1b955SJung-uk Kim 
539eef1b955SJung-uk Kim     case 3:
540a9d8d09cSJung-uk Kim 
541eef1b955SJung-uk Kim         TotalKeywords++;
542eef1b955SJung-uk Kim         TotalExecutableOpcodes++;
543eef1b955SJung-uk Kim         break;
5449c48c75eSJung-uk Kim 
5459c48c75eSJung-uk Kim     default:
546a9d8d09cSJung-uk Kim 
5479c48c75eSJung-uk Kim         break;
548eef1b955SJung-uk Kim     }
549eef1b955SJung-uk Kim 
550eef1b955SJung-uk Kim     for (i = 0; (yytext[i] != 0) && (yytext[i] != EOF); i++)
551eef1b955SJung-uk Kim     {
552eef1b955SJung-uk Kim         AslInsertLineBuffer (yytext[i]);
553eef1b955SJung-uk Kim         *Gbl_LineBufPtr = 0;
554eef1b955SJung-uk Kim     }
555eef1b955SJung-uk Kim }
556eef1b955SJung-uk Kim 
557eef1b955SJung-uk Kim 
558eef1b955SJung-uk Kim /*******************************************************************************
559eef1b955SJung-uk Kim  *
560eef1b955SJung-uk Kim  * FUNCTION:    AslDoComment
561eef1b955SJung-uk Kim  *
562eef1b955SJung-uk Kim  * PARAMETERS:  none
563eef1b955SJung-uk Kim  *
564eef1b955SJung-uk Kim  * RETURN:      none
565eef1b955SJung-uk Kim  *
566eef1b955SJung-uk Kim  * DESCRIPTION: Process a standard comment.
567eef1b955SJung-uk Kim  *
568eef1b955SJung-uk Kim  ******************************************************************************/
569eef1b955SJung-uk Kim 
570*0d84335fSJung-uk Kim static BOOLEAN
571eef1b955SJung-uk Kim AslDoComment (
572eef1b955SJung-uk Kim     void)
573eef1b955SJung-uk Kim {
574f38b0f21SJung-uk Kim     int                     c;
575f38b0f21SJung-uk Kim     int                     c1 = 0;
576*0d84335fSJung-uk Kim     char                    *StringBuffer = MsgBuffer;
577*0d84335fSJung-uk Kim     char                    *EndBuffer = MsgBuffer + ASL_MSG_BUFFER_SIZE;
578*0d84335fSJung-uk Kim     ASL_COMMENT_STATE       CurrentState = Gbl_CommentState; /* to reference later on */
579eef1b955SJung-uk Kim 
580eef1b955SJung-uk Kim 
581eef1b955SJung-uk Kim     AslInsertLineBuffer ('/');
582eef1b955SJung-uk Kim     AslInsertLineBuffer ('*');
583*0d84335fSJung-uk Kim     if (Gbl_CaptureComments && CurrentState.CaptureComments)
584*0d84335fSJung-uk Kim     {
585*0d84335fSJung-uk Kim         *StringBuffer = '/';
586*0d84335fSJung-uk Kim         ++StringBuffer;
587*0d84335fSJung-uk Kim         *StringBuffer = '*';
588*0d84335fSJung-uk Kim         ++StringBuffer;
589*0d84335fSJung-uk Kim     }
590eef1b955SJung-uk Kim 
591eef1b955SJung-uk Kim loop:
592eef1b955SJung-uk Kim 
593eef1b955SJung-uk Kim     /* Eat chars until end-of-comment */
594eef1b955SJung-uk Kim 
5951c0e1b6dSJung-uk Kim     while (((c = input ()) != '*') && (c != EOF))
596eef1b955SJung-uk Kim     {
597eef1b955SJung-uk Kim         AslInsertLineBuffer (c);
598*0d84335fSJung-uk Kim         if (Gbl_CaptureComments && CurrentState.CaptureComments)
599*0d84335fSJung-uk Kim         {
600*0d84335fSJung-uk Kim             *StringBuffer = c;
601*0d84335fSJung-uk Kim             ++StringBuffer;
602*0d84335fSJung-uk Kim         }
603eef1b955SJung-uk Kim         c1 = c;
604eef1b955SJung-uk Kim     }
605eef1b955SJung-uk Kim 
606eef1b955SJung-uk Kim     if (c == EOF)
607eef1b955SJung-uk Kim     {
608eef1b955SJung-uk Kim         goto EarlyEOF;
609eef1b955SJung-uk Kim     }
610eef1b955SJung-uk Kim 
611eef1b955SJung-uk Kim     /*
612eef1b955SJung-uk Kim      * Check for nested comment -- can help catch cases where a previous
613eef1b955SJung-uk Kim      * comment was accidently left unterminated
614eef1b955SJung-uk Kim      */
615eef1b955SJung-uk Kim     if ((c1 == '/') && (c == '*'))
616eef1b955SJung-uk Kim     {
617eef1b955SJung-uk Kim         AslCommonError (ASL_WARNING, ASL_MSG_NESTED_COMMENT,
618eef1b955SJung-uk Kim             Gbl_CurrentLineNumber, Gbl_LogicalLineNumber,
619eef1b955SJung-uk Kim             Gbl_InputByteCount, Gbl_CurrentColumn,
620eef1b955SJung-uk Kim             Gbl_Files[ASL_FILE_INPUT].Filename, NULL);
621eef1b955SJung-uk Kim     }
622eef1b955SJung-uk Kim 
623eef1b955SJung-uk Kim     /* Comment is closed only if the NEXT character is a slash */
624eef1b955SJung-uk Kim 
625eef1b955SJung-uk Kim     AslInsertLineBuffer (c);
626*0d84335fSJung-uk Kim     if (Gbl_CaptureComments && CurrentState.CaptureComments)
627*0d84335fSJung-uk Kim     {
628*0d84335fSJung-uk Kim         *StringBuffer = c;
629*0d84335fSJung-uk Kim         ++StringBuffer;
630*0d84335fSJung-uk Kim     }
631eef1b955SJung-uk Kim 
6321c0e1b6dSJung-uk Kim     if (((c1 = input ()) != '/') && (c1 != EOF))
633eef1b955SJung-uk Kim     {
634eef1b955SJung-uk Kim         unput (c1);
635eef1b955SJung-uk Kim         goto loop;
636eef1b955SJung-uk Kim     }
637eef1b955SJung-uk Kim 
638eef1b955SJung-uk Kim     if (c1 == EOF)
639eef1b955SJung-uk Kim     {
640eef1b955SJung-uk Kim         goto EarlyEOF;
641eef1b955SJung-uk Kim     }
642*0d84335fSJung-uk Kim     if (StringBuffer > EndBuffer)
643*0d84335fSJung-uk Kim     {
644*0d84335fSJung-uk Kim         goto BufferOverflow;
645*0d84335fSJung-uk Kim     }
646eef1b955SJung-uk Kim 
647eef1b955SJung-uk Kim     AslInsertLineBuffer (c1);
648*0d84335fSJung-uk Kim     CvProcessComment (CurrentState, StringBuffer, c1);
649eef1b955SJung-uk Kim     return (TRUE);
650eef1b955SJung-uk Kim 
651eef1b955SJung-uk Kim 
652eef1b955SJung-uk Kim EarlyEOF:
653eef1b955SJung-uk Kim     /*
654eef1b955SJung-uk Kim      * Premature End-Of-File
655eef1b955SJung-uk Kim      */
656eef1b955SJung-uk Kim     AslCommonError (ASL_ERROR, ASL_MSG_EARLY_EOF,
657eef1b955SJung-uk Kim         Gbl_CurrentLineNumber, Gbl_LogicalLineNumber,
658eef1b955SJung-uk Kim         Gbl_CurrentLineOffset, Gbl_CurrentColumn,
659eef1b955SJung-uk Kim         Gbl_Files[ASL_FILE_INPUT].Filename, NULL);
660eef1b955SJung-uk Kim     return (FALSE);
661*0d84335fSJung-uk Kim 
662*0d84335fSJung-uk Kim 
663*0d84335fSJung-uk Kim BufferOverflow:
664*0d84335fSJung-uk Kim 
665*0d84335fSJung-uk Kim     /* Comment was too long */
666*0d84335fSJung-uk Kim 
667*0d84335fSJung-uk Kim     AslCommonError (ASL_ERROR, ASL_MSG_STRING_LENGTH,
668*0d84335fSJung-uk Kim         Gbl_CurrentLineNumber, Gbl_LogicalLineNumber,
669*0d84335fSJung-uk Kim         Gbl_CurrentLineOffset, Gbl_CurrentColumn,
670*0d84335fSJung-uk Kim         Gbl_Files[ASL_FILE_INPUT].Filename, "Max length 4096");
671*0d84335fSJung-uk Kim     return (FALSE);
672*0d84335fSJung-uk Kim 
673eef1b955SJung-uk Kim }
674eef1b955SJung-uk Kim 
675eef1b955SJung-uk Kim 
676eef1b955SJung-uk Kim /*******************************************************************************
677eef1b955SJung-uk Kim  *
678eef1b955SJung-uk Kim  * FUNCTION:    AslDoCommentType2
679eef1b955SJung-uk Kim  *
680eef1b955SJung-uk Kim  * PARAMETERS:  none
681eef1b955SJung-uk Kim  *
682eef1b955SJung-uk Kim  * RETURN:      none
683eef1b955SJung-uk Kim  *
684*0d84335fSJung-uk Kim  * DESCRIPTION: Process a new "//" comment. Inline comments will be converted
685*0d84335fSJung-uk Kim  *              to "/ *" standard comments.
686eef1b955SJung-uk Kim  *
687eef1b955SJung-uk Kim  ******************************************************************************/
688eef1b955SJung-uk Kim 
689*0d84335fSJung-uk Kim static BOOLEAN
690eef1b955SJung-uk Kim AslDoCommentType2 (
691eef1b955SJung-uk Kim     void)
692eef1b955SJung-uk Kim {
693f38b0f21SJung-uk Kim     int                     c;
694*0d84335fSJung-uk Kim     char                    *StringBuffer = MsgBuffer;
695*0d84335fSJung-uk Kim     char                    *EndBuffer = MsgBuffer + ASL_MSG_BUFFER_SIZE;
696*0d84335fSJung-uk Kim     ASL_COMMENT_STATE       CurrentState = Gbl_CommentState;
697eef1b955SJung-uk Kim 
698eef1b955SJung-uk Kim 
699eef1b955SJung-uk Kim     AslInsertLineBuffer ('/');
700*0d84335fSJung-uk Kim     AslInsertLineBuffer ('*');
701*0d84335fSJung-uk Kim 
702*0d84335fSJung-uk Kim     if (Gbl_CaptureComments && CurrentState.CaptureComments)
703*0d84335fSJung-uk Kim     {
704*0d84335fSJung-uk Kim         *StringBuffer = '/';
705*0d84335fSJung-uk Kim         ++StringBuffer;
706*0d84335fSJung-uk Kim         *StringBuffer = '*';
707*0d84335fSJung-uk Kim         ++StringBuffer;
708*0d84335fSJung-uk Kim     }
709eef1b955SJung-uk Kim 
7101c0e1b6dSJung-uk Kim     while (((c = input ()) != '\n') && (c != EOF))
711eef1b955SJung-uk Kim     {
712eef1b955SJung-uk Kim         AslInsertLineBuffer (c);
713*0d84335fSJung-uk Kim         if (Gbl_CaptureComments && CurrentState.CaptureComments)
714*0d84335fSJung-uk Kim         {
715*0d84335fSJung-uk Kim             *StringBuffer = c;
716*0d84335fSJung-uk Kim             ++StringBuffer;
717*0d84335fSJung-uk Kim         }
718eef1b955SJung-uk Kim     }
719eef1b955SJung-uk Kim 
720eef1b955SJung-uk Kim     if (c == EOF)
721eef1b955SJung-uk Kim     {
722eef1b955SJung-uk Kim         /* End of file is OK, change to newline. Let parser detect EOF later */
723eef1b955SJung-uk Kim 
724eef1b955SJung-uk Kim         c = '\n';
725eef1b955SJung-uk Kim     }
726eef1b955SJung-uk Kim 
727*0d84335fSJung-uk Kim     if (StringBuffer > EndBuffer)
728*0d84335fSJung-uk Kim     {
729*0d84335fSJung-uk Kim         goto BufferOverflow;
730*0d84335fSJung-uk Kim     }
731eef1b955SJung-uk Kim     AslInsertLineBuffer (c);
732*0d84335fSJung-uk Kim 
733*0d84335fSJung-uk Kim     CvProcessCommentType2 (CurrentState, StringBuffer);
734eef1b955SJung-uk Kim     return (TRUE);
735*0d84335fSJung-uk Kim 
736*0d84335fSJung-uk Kim 
737*0d84335fSJung-uk Kim BufferOverflow:
738*0d84335fSJung-uk Kim 
739*0d84335fSJung-uk Kim     /* Comment was too long */
740*0d84335fSJung-uk Kim 
741*0d84335fSJung-uk Kim     AslCommonError (ASL_ERROR, ASL_MSG_STRING_LENGTH,
742*0d84335fSJung-uk Kim         Gbl_CurrentLineNumber, Gbl_LogicalLineNumber,
743*0d84335fSJung-uk Kim         Gbl_CurrentLineOffset, Gbl_CurrentColumn,
744*0d84335fSJung-uk Kim         Gbl_Files[ASL_FILE_INPUT].Filename, "Max length 4096");
745*0d84335fSJung-uk Kim     return (FALSE);
746*0d84335fSJung-uk Kim 
747eef1b955SJung-uk Kim }
748eef1b955SJung-uk Kim 
749eef1b955SJung-uk Kim 
750eef1b955SJung-uk Kim /*******************************************************************************
751eef1b955SJung-uk Kim  *
752eef1b955SJung-uk Kim  * FUNCTION:    AslDoStringLiteral
753eef1b955SJung-uk Kim  *
754eef1b955SJung-uk Kim  * PARAMETERS:  none
755eef1b955SJung-uk Kim  *
756eef1b955SJung-uk Kim  * RETURN:      none
757eef1b955SJung-uk Kim  *
758eef1b955SJung-uk Kim  * DESCRIPTION: Process a string literal (surrounded by quotes)
759eef1b955SJung-uk Kim  *
760eef1b955SJung-uk Kim  ******************************************************************************/
761eef1b955SJung-uk Kim 
762eef1b955SJung-uk Kim static char
763eef1b955SJung-uk Kim AslDoStringLiteral (
764eef1b955SJung-uk Kim     void)
765eef1b955SJung-uk Kim {
766eef1b955SJung-uk Kim     char                *StringBuffer = MsgBuffer;
767eef1b955SJung-uk Kim     char                *EndBuffer = MsgBuffer + ASL_MSG_BUFFER_SIZE;
768eef1b955SJung-uk Kim     char                *CleanString;
769f38b0f21SJung-uk Kim     int                 StringChar;
770eef1b955SJung-uk Kim     UINT32              State = ASL_NORMAL_CHAR;
771eef1b955SJung-uk Kim     UINT32              i = 0;
772eef1b955SJung-uk Kim     UINT8               Digit;
773eef1b955SJung-uk Kim     char                ConvertBuffer[4];
774eef1b955SJung-uk Kim 
775eef1b955SJung-uk Kim 
776eef1b955SJung-uk Kim     /*
777eef1b955SJung-uk Kim      * Eat chars until end-of-literal.
778eef1b955SJung-uk Kim      * NOTE:  Put back the original surrounding quotes into the
779eef1b955SJung-uk Kim      * source line buffer.
780eef1b955SJung-uk Kim      */
781eef1b955SJung-uk Kim     AslInsertLineBuffer ('\"');
782f38b0f21SJung-uk Kim     while ((StringChar = input()) != EOF)
783eef1b955SJung-uk Kim     {
784eef1b955SJung-uk Kim         AslInsertLineBuffer (StringChar);
785eef1b955SJung-uk Kim 
786eef1b955SJung-uk Kim DoCharacter:
787eef1b955SJung-uk Kim         switch (State)
788eef1b955SJung-uk Kim         {
789eef1b955SJung-uk Kim         case ASL_NORMAL_CHAR:
790eef1b955SJung-uk Kim 
791eef1b955SJung-uk Kim             switch (StringChar)
792eef1b955SJung-uk Kim             {
793eef1b955SJung-uk Kim             case '\\':
794eef1b955SJung-uk Kim                 /*
795eef1b955SJung-uk Kim                  * Special handling for backslash-escape sequence. We will
796eef1b955SJung-uk Kim                  * toss the backslash and translate the escape char(s).
797eef1b955SJung-uk Kim                  */
798eef1b955SJung-uk Kim                 State = ASL_ESCAPE_SEQUENCE;
799eef1b955SJung-uk Kim                 continue;
800eef1b955SJung-uk Kim 
801eef1b955SJung-uk Kim             case '\"':
802eef1b955SJung-uk Kim 
803eef1b955SJung-uk Kim                 /* String terminator */
804eef1b955SJung-uk Kim 
805eef1b955SJung-uk Kim                 goto CompletedString;
8069c48c75eSJung-uk Kim 
8079c48c75eSJung-uk Kim             default:
808a9d8d09cSJung-uk Kim 
8099c48c75eSJung-uk Kim                 break;
810eef1b955SJung-uk Kim             }
811eef1b955SJung-uk Kim             break;
812eef1b955SJung-uk Kim 
813eef1b955SJung-uk Kim 
814eef1b955SJung-uk Kim         case ASL_ESCAPE_SEQUENCE:
815eef1b955SJung-uk Kim 
816eef1b955SJung-uk Kim             State = ASL_NORMAL_CHAR;
817eef1b955SJung-uk Kim             switch (StringChar)
818eef1b955SJung-uk Kim             {
819eef1b955SJung-uk Kim             case 'a':
820a9d8d09cSJung-uk Kim 
821eef1b955SJung-uk Kim                 StringChar = 0x07;      /* BELL */
822eef1b955SJung-uk Kim                 break;
823eef1b955SJung-uk Kim 
824eef1b955SJung-uk Kim             case 'b':
825a9d8d09cSJung-uk Kim 
826eef1b955SJung-uk Kim                 StringChar = 0x08;      /* BACKSPACE */
827eef1b955SJung-uk Kim                 break;
828eef1b955SJung-uk Kim 
829eef1b955SJung-uk Kim             case 'f':
830a9d8d09cSJung-uk Kim 
831eef1b955SJung-uk Kim                 StringChar = 0x0C;      /* FORMFEED */
832eef1b955SJung-uk Kim                 break;
833eef1b955SJung-uk Kim 
834eef1b955SJung-uk Kim             case 'n':
835a9d8d09cSJung-uk Kim 
836eef1b955SJung-uk Kim                 StringChar = 0x0A;      /* LINEFEED */
837eef1b955SJung-uk Kim                 break;
838eef1b955SJung-uk Kim 
839eef1b955SJung-uk Kim             case 'r':
840a9d8d09cSJung-uk Kim 
841eef1b955SJung-uk Kim                 StringChar = 0x0D;      /* CARRIAGE RETURN*/
842eef1b955SJung-uk Kim                 break;
843eef1b955SJung-uk Kim 
844eef1b955SJung-uk Kim             case 't':
845a9d8d09cSJung-uk Kim 
846eef1b955SJung-uk Kim                 StringChar = 0x09;      /* HORIZONTAL TAB */
847eef1b955SJung-uk Kim                 break;
848eef1b955SJung-uk Kim 
849eef1b955SJung-uk Kim             case 'v':
850a9d8d09cSJung-uk Kim 
851eef1b955SJung-uk Kim                 StringChar = 0x0B;      /* VERTICAL TAB */
852eef1b955SJung-uk Kim                 break;
853eef1b955SJung-uk Kim 
854eef1b955SJung-uk Kim             case 'x':
855a9d8d09cSJung-uk Kim 
856eef1b955SJung-uk Kim                 State = ASL_HEX_CONSTANT;
857eef1b955SJung-uk Kim                 i = 0;
858eef1b955SJung-uk Kim                 continue;
859eef1b955SJung-uk Kim 
860eef1b955SJung-uk Kim             case '\'':                  /* Single Quote */
861eef1b955SJung-uk Kim             case '\"':                  /* Double Quote */
862eef1b955SJung-uk Kim             case '\\':                  /* Backslash */
863a9d8d09cSJung-uk Kim 
864eef1b955SJung-uk Kim                 break;
865eef1b955SJung-uk Kim 
866eef1b955SJung-uk Kim             default:
867eef1b955SJung-uk Kim 
868eef1b955SJung-uk Kim                 /* Check for an octal digit (0-7) */
869eef1b955SJung-uk Kim 
870eef1b955SJung-uk Kim                 if (ACPI_IS_OCTAL_DIGIT (StringChar))
871eef1b955SJung-uk Kim                 {
872eef1b955SJung-uk Kim                     State = ASL_OCTAL_CONSTANT;
873eef1b955SJung-uk Kim                     ConvertBuffer[0] = StringChar;
874eef1b955SJung-uk Kim                     i = 1;
875eef1b955SJung-uk Kim                     continue;
876eef1b955SJung-uk Kim                 }
877eef1b955SJung-uk Kim 
878eef1b955SJung-uk Kim                 /* Unknown escape sequence issue warning, but use the character */
879eef1b955SJung-uk Kim 
880eef1b955SJung-uk Kim                 AslCommonError (ASL_WARNING, ASL_MSG_INVALID_ESCAPE,
881eef1b955SJung-uk Kim                     Gbl_CurrentLineNumber, Gbl_LogicalLineNumber,
882eef1b955SJung-uk Kim                     Gbl_CurrentLineOffset, Gbl_CurrentColumn,
883eef1b955SJung-uk Kim                     Gbl_Files[ASL_FILE_INPUT].Filename, NULL);
884eef1b955SJung-uk Kim                 break;
885eef1b955SJung-uk Kim             }
886eef1b955SJung-uk Kim             break;
887eef1b955SJung-uk Kim 
888eef1b955SJung-uk Kim 
889eef1b955SJung-uk Kim         case ASL_OCTAL_CONSTANT:
890eef1b955SJung-uk Kim 
891eef1b955SJung-uk Kim             /* Up to three octal digits allowed */
892eef1b955SJung-uk Kim 
893eef1b955SJung-uk Kim             if (!ACPI_IS_OCTAL_DIGIT (StringChar) ||
894eef1b955SJung-uk Kim                 (i > 2))
895eef1b955SJung-uk Kim             {
896eef1b955SJung-uk Kim                 /*
897eef1b955SJung-uk Kim                  * Reached end of the constant. Convert the assembled ASCII
898eef1b955SJung-uk Kim                  * string and resume processing of the next character
899eef1b955SJung-uk Kim                  */
900eef1b955SJung-uk Kim                 ConvertBuffer[i] = 0;
9015ef50723SJung-uk Kim                 Digit = (UINT8) strtoul (ConvertBuffer, NULL, 8);
902eef1b955SJung-uk Kim 
903eef1b955SJung-uk Kim                 /* Check for NULL or non-ascii character (ignore if so) */
904eef1b955SJung-uk Kim 
905eef1b955SJung-uk Kim                 if ((Digit == 0) || (Digit > ACPI_ASCII_MAX))
906eef1b955SJung-uk Kim                 {
907eef1b955SJung-uk Kim                     AslCommonError (ASL_WARNING, ASL_MSG_INVALID_STRING,
908eef1b955SJung-uk Kim                         Gbl_CurrentLineNumber, Gbl_LogicalLineNumber,
909eef1b955SJung-uk Kim                         Gbl_CurrentLineOffset, Gbl_CurrentColumn,
910eef1b955SJung-uk Kim                         Gbl_Files[ASL_FILE_INPUT].Filename, NULL);
911eef1b955SJung-uk Kim                 }
912eef1b955SJung-uk Kim                 else
913eef1b955SJung-uk Kim                 {
914eef1b955SJung-uk Kim                     *StringBuffer = (char) Digit;
915eef1b955SJung-uk Kim                     StringBuffer++;
916eef1b955SJung-uk Kim                     if (StringBuffer >= EndBuffer)
917eef1b955SJung-uk Kim                     {
918eef1b955SJung-uk Kim                         goto BufferOverflow;
919eef1b955SJung-uk Kim                     }
920eef1b955SJung-uk Kim                 }
921eef1b955SJung-uk Kim 
922eef1b955SJung-uk Kim                 State = ASL_NORMAL_CHAR;
923eef1b955SJung-uk Kim                 goto DoCharacter;
924eef1b955SJung-uk Kim                 break;
925eef1b955SJung-uk Kim             }
926eef1b955SJung-uk Kim 
927eef1b955SJung-uk Kim             /* Append another digit of the constant */
928eef1b955SJung-uk Kim 
929eef1b955SJung-uk Kim             ConvertBuffer[i] = StringChar;
930eef1b955SJung-uk Kim             i++;
931eef1b955SJung-uk Kim             continue;
932eef1b955SJung-uk Kim 
933eef1b955SJung-uk Kim         case ASL_HEX_CONSTANT:
934eef1b955SJung-uk Kim 
935eef1b955SJung-uk Kim             /* Up to two hex digits allowed */
936eef1b955SJung-uk Kim 
9375ef50723SJung-uk Kim             if (!isxdigit (StringChar) ||
938eef1b955SJung-uk Kim                 (i > 1))
939eef1b955SJung-uk Kim             {
940eef1b955SJung-uk Kim                 /*
941eef1b955SJung-uk Kim                  * Reached end of the constant. Convert the assembled ASCII
942eef1b955SJung-uk Kim                  * string and resume processing of the next character
943eef1b955SJung-uk Kim                  */
944eef1b955SJung-uk Kim                 ConvertBuffer[i] = 0;
9455ef50723SJung-uk Kim                 Digit = (UINT8) strtoul (ConvertBuffer, NULL, 16);
946eef1b955SJung-uk Kim 
947eef1b955SJung-uk Kim                 /* Check for NULL or non-ascii character (ignore if so) */
948eef1b955SJung-uk Kim 
949eef1b955SJung-uk Kim                 if ((Digit == 0) || (Digit > ACPI_ASCII_MAX))
950eef1b955SJung-uk Kim                 {
951eef1b955SJung-uk Kim                     AslCommonError (ASL_WARNING, ASL_MSG_INVALID_STRING,
952eef1b955SJung-uk Kim                         Gbl_CurrentLineNumber, Gbl_LogicalLineNumber,
953eef1b955SJung-uk Kim                         Gbl_CurrentLineOffset, Gbl_CurrentColumn,
954eef1b955SJung-uk Kim                         Gbl_Files[ASL_FILE_INPUT].Filename, NULL);
955eef1b955SJung-uk Kim                 }
956eef1b955SJung-uk Kim                 else
957eef1b955SJung-uk Kim                 {
958eef1b955SJung-uk Kim                     *StringBuffer = (char) Digit;
959eef1b955SJung-uk Kim                     StringBuffer++;
960eef1b955SJung-uk Kim                     if (StringBuffer >= EndBuffer)
961eef1b955SJung-uk Kim                     {
962eef1b955SJung-uk Kim                         goto BufferOverflow;
963eef1b955SJung-uk Kim                     }
964eef1b955SJung-uk Kim                 }
965eef1b955SJung-uk Kim 
966eef1b955SJung-uk Kim                 State = ASL_NORMAL_CHAR;
967eef1b955SJung-uk Kim                 goto DoCharacter;
968eef1b955SJung-uk Kim                 break;
969eef1b955SJung-uk Kim             }
970eef1b955SJung-uk Kim 
971eef1b955SJung-uk Kim             /* Append another digit of the constant */
972eef1b955SJung-uk Kim 
973eef1b955SJung-uk Kim             ConvertBuffer[i] = StringChar;
974eef1b955SJung-uk Kim             i++;
975eef1b955SJung-uk Kim             continue;
9769c48c75eSJung-uk Kim 
9779c48c75eSJung-uk Kim         default:
978a9d8d09cSJung-uk Kim 
9799c48c75eSJung-uk Kim             break;
980eef1b955SJung-uk Kim         }
981eef1b955SJung-uk Kim 
982eef1b955SJung-uk Kim         /* Save the finished character */
983eef1b955SJung-uk Kim 
984eef1b955SJung-uk Kim         *StringBuffer = StringChar;
985eef1b955SJung-uk Kim         StringBuffer++;
986eef1b955SJung-uk Kim         if (StringBuffer >= EndBuffer)
987eef1b955SJung-uk Kim         {
988eef1b955SJung-uk Kim             goto BufferOverflow;
989eef1b955SJung-uk Kim         }
990eef1b955SJung-uk Kim     }
991eef1b955SJung-uk Kim 
992eef1b955SJung-uk Kim     /*
993eef1b955SJung-uk Kim      * Premature End-Of-File
994eef1b955SJung-uk Kim      */
995eef1b955SJung-uk Kim     AslCommonError (ASL_ERROR, ASL_MSG_EARLY_EOF,
996eef1b955SJung-uk Kim         Gbl_CurrentLineNumber, Gbl_LogicalLineNumber,
997eef1b955SJung-uk Kim         Gbl_CurrentLineOffset, Gbl_CurrentColumn,
998eef1b955SJung-uk Kim         Gbl_Files[ASL_FILE_INPUT].Filename, NULL);
999eef1b955SJung-uk Kim     return (FALSE);
1000eef1b955SJung-uk Kim 
1001eef1b955SJung-uk Kim 
1002eef1b955SJung-uk Kim CompletedString:
1003eef1b955SJung-uk Kim     /*
1004eef1b955SJung-uk Kim      * Null terminate the input string and copy string to a new buffer
1005eef1b955SJung-uk Kim      */
1006eef1b955SJung-uk Kim     *StringBuffer = 0;
1007eef1b955SJung-uk Kim 
1008313a0c13SJung-uk Kim     CleanString = UtStringCacheCalloc (strlen (MsgBuffer) + 1);
1009eef1b955SJung-uk Kim     if (!CleanString)
1010eef1b955SJung-uk Kim     {
1011eef1b955SJung-uk Kim         AslCommonError (ASL_ERROR, ASL_MSG_MEMORY_ALLOCATION,
1012eef1b955SJung-uk Kim             Gbl_CurrentLineNumber, Gbl_LogicalLineNumber,
1013eef1b955SJung-uk Kim             Gbl_CurrentLineOffset, Gbl_CurrentColumn,
1014eef1b955SJung-uk Kim             Gbl_Files[ASL_FILE_INPUT].Filename, NULL);
1015eef1b955SJung-uk Kim         return (FALSE);
1016eef1b955SJung-uk Kim     }
1017eef1b955SJung-uk Kim 
10185ef50723SJung-uk Kim     strcpy (CleanString, MsgBuffer);
1019eef1b955SJung-uk Kim     AslCompilerlval.s = CleanString;
1020eef1b955SJung-uk Kim     return (TRUE);
1021eef1b955SJung-uk Kim 
1022eef1b955SJung-uk Kim 
1023eef1b955SJung-uk Kim BufferOverflow:
1024eef1b955SJung-uk Kim 
1025eef1b955SJung-uk Kim     /* Literal was too long */
1026eef1b955SJung-uk Kim 
1027eef1b955SJung-uk Kim     AslCommonError (ASL_ERROR, ASL_MSG_STRING_LENGTH,
1028eef1b955SJung-uk Kim         Gbl_CurrentLineNumber, Gbl_LogicalLineNumber,
1029eef1b955SJung-uk Kim         Gbl_CurrentLineOffset, Gbl_CurrentColumn,
1030eef1b955SJung-uk Kim         Gbl_Files[ASL_FILE_INPUT].Filename, "Max length 4096");
1031eef1b955SJung-uk Kim     return (FALSE);
1032eef1b955SJung-uk Kim }
1033