xref: /freebsd/sys/contrib/dev/acpica/compiler/aslsupport.l (revision 58308fadece25ae4c12bd2f4dce3d73d9c23be43)
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 
80d84335fSJung-uk Kim /******************************************************************************
90d84335fSJung-uk Kim  *
100d84335fSJung-uk Kim  * 1. Copyright Notice
110d84335fSJung-uk Kim  *
12*58308fadSJung-uk Kim  * Some or all of this work - Copyright (c) 1999 - 2025, Intel Corp.
13eef1b955SJung-uk Kim  * All rights reserved.
14eef1b955SJung-uk Kim  *
150d84335fSJung-uk Kim  * 2. License
160d84335fSJung-uk Kim  *
170d84335fSJung-uk Kim  * 2.1. This is your license from Intel Corp. under its intellectual property
180d84335fSJung-uk Kim  * rights. You may have additional license terms from the party that provided
190d84335fSJung-uk Kim  * you this software, covering your right to use that party's intellectual
200d84335fSJung-uk Kim  * property rights.
210d84335fSJung-uk Kim  *
220d84335fSJung-uk Kim  * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
230d84335fSJung-uk Kim  * copy of the source code appearing in this file ("Covered Code") an
240d84335fSJung-uk Kim  * irrevocable, perpetual, worldwide license under Intel's copyrights in the
250d84335fSJung-uk Kim  * base code distributed originally by Intel ("Original Intel Code") to copy,
260d84335fSJung-uk Kim  * make derivatives, distribute, use and display any portion of the Covered
270d84335fSJung-uk Kim  * Code in any form, with the right to sublicense such rights; and
280d84335fSJung-uk Kim  *
290d84335fSJung-uk Kim  * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
300d84335fSJung-uk Kim  * license (with the right to sublicense), under only those claims of Intel
310d84335fSJung-uk Kim  * patents that are infringed by the Original Intel Code, to make, use, sell,
320d84335fSJung-uk Kim  * offer to sell, and import the Covered Code and derivative works thereof
330d84335fSJung-uk Kim  * solely to the minimum extent necessary to exercise the above copyright
340d84335fSJung-uk Kim  * license, and in no event shall the patent license extend to any additions
350d84335fSJung-uk Kim  * to or modifications of the Original Intel Code. No other license or right
360d84335fSJung-uk Kim  * is granted directly or by implication, estoppel or otherwise;
370d84335fSJung-uk Kim  *
380d84335fSJung-uk Kim  * The above copyright and patent license is granted only if the following
390d84335fSJung-uk Kim  * conditions are met:
400d84335fSJung-uk Kim  *
410d84335fSJung-uk Kim  * 3. Conditions
420d84335fSJung-uk Kim  *
430d84335fSJung-uk Kim  * 3.1. Redistribution of Source with Rights to Further Distribute Source.
440d84335fSJung-uk Kim  * Redistribution of source code of any substantial portion of the Covered
450d84335fSJung-uk Kim  * Code or modification with rights to further distribute source must include
460d84335fSJung-uk Kim  * the above Copyright Notice, the above License, this list of Conditions,
470d84335fSJung-uk Kim  * and the following Disclaimer and Export Compliance provision. In addition,
480d84335fSJung-uk Kim  * Licensee must cause all Covered Code to which Licensee contributes to
490d84335fSJung-uk Kim  * contain a file documenting the changes Licensee made to create that Covered
500d84335fSJung-uk Kim  * Code and the date of any change. Licensee must include in that file the
510d84335fSJung-uk Kim  * documentation of any changes made by any predecessor Licensee. Licensee
520d84335fSJung-uk Kim  * must include a prominent statement that the modification is derived,
530d84335fSJung-uk Kim  * directly or indirectly, from Original Intel Code.
540d84335fSJung-uk Kim  *
550d84335fSJung-uk Kim  * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
560d84335fSJung-uk Kim  * Redistribution of source code of any substantial portion of the Covered
570d84335fSJung-uk Kim  * Code or modification without rights to further distribute source must
580d84335fSJung-uk Kim  * include the following Disclaimer and Export Compliance provision in the
590d84335fSJung-uk Kim  * documentation and/or other materials provided with distribution. In
600d84335fSJung-uk Kim  * addition, Licensee may not authorize further sublicense of source of any
610d84335fSJung-uk Kim  * portion of the Covered Code, and must include terms to the effect that the
620d84335fSJung-uk Kim  * license from Licensee to its licensee is limited to the intellectual
630d84335fSJung-uk Kim  * property embodied in the software Licensee provides to its licensee, and
640d84335fSJung-uk Kim  * not to intellectual property embodied in modifications its licensee may
650d84335fSJung-uk Kim  * make.
660d84335fSJung-uk Kim  *
670d84335fSJung-uk Kim  * 3.3. Redistribution of Executable. Redistribution in executable form of any
680d84335fSJung-uk Kim  * substantial portion of the Covered Code or modification must reproduce the
690d84335fSJung-uk Kim  * above Copyright Notice, and the following Disclaimer and Export Compliance
700d84335fSJung-uk Kim  * provision in the documentation and/or other materials provided with the
710d84335fSJung-uk Kim  * distribution.
720d84335fSJung-uk Kim  *
730d84335fSJung-uk Kim  * 3.4. Intel retains all right, title, and interest in and to the Original
740d84335fSJung-uk Kim  * Intel Code.
750d84335fSJung-uk Kim  *
760d84335fSJung-uk Kim  * 3.5. Neither the name Intel nor any other trademark owned or controlled by
770d84335fSJung-uk Kim  * Intel shall be used in advertising or otherwise to promote the sale, use or
780d84335fSJung-uk Kim  * other dealings in products derived from or relating to the Covered Code
790d84335fSJung-uk Kim  * without prior written authorization from Intel.
800d84335fSJung-uk Kim  *
810d84335fSJung-uk Kim  * 4. Disclaimer and Export Compliance
820d84335fSJung-uk Kim  *
830d84335fSJung-uk Kim  * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
840d84335fSJung-uk Kim  * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
850d84335fSJung-uk Kim  * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
860d84335fSJung-uk Kim  * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
870d84335fSJung-uk Kim  * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
880d84335fSJung-uk Kim  * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
890d84335fSJung-uk Kim  * PARTICULAR PURPOSE.
900d84335fSJung-uk Kim  *
910d84335fSJung-uk Kim  * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
920d84335fSJung-uk Kim  * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
930d84335fSJung-uk Kim  * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
940d84335fSJung-uk Kim  * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
950d84335fSJung-uk Kim  * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
960d84335fSJung-uk Kim  * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
970d84335fSJung-uk Kim  * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
980d84335fSJung-uk Kim  * LIMITED REMEDY.
990d84335fSJung-uk Kim  *
1000d84335fSJung-uk Kim  * 4.3. Licensee shall not export, either directly or indirectly, any of this
1010d84335fSJung-uk Kim  * software or system incorporating such software without first obtaining any
1020d84335fSJung-uk Kim  * required license or other approval from the U. S. Department of Commerce or
1030d84335fSJung-uk Kim  * any other agency or department of the United States Government. In the
1040d84335fSJung-uk Kim  * event Licensee exports any such software from the United States or
1050d84335fSJung-uk Kim  * re-exports any such software from a foreign destination, Licensee shall
1060d84335fSJung-uk Kim  * ensure that the distribution and export/re-export of the software is in
1070d84335fSJung-uk Kim  * compliance with all laws, regulations, orders, or other restrictions of the
1080d84335fSJung-uk Kim  * U.S. Export Administration Regulations. Licensee agrees that neither it nor
1090d84335fSJung-uk Kim  * any of its subsidiaries will export/re-export any technical data, process,
1100d84335fSJung-uk Kim  * software, or service, directly or indirectly, to any country for which the
1110d84335fSJung-uk Kim  * United States government or any agency thereof requires an export license,
1120d84335fSJung-uk Kim  * other governmental approval, or letter of assurance, without first obtaining
1130d84335fSJung-uk Kim  * such license, approval or letter.
1140d84335fSJung-uk Kim  *
1150d84335fSJung-uk Kim  *****************************************************************************
1160d84335fSJung-uk Kim  *
1170d84335fSJung-uk Kim  * Alternatively, you may choose to be licensed under the terms of the
1180d84335fSJung-uk Kim  * following license:
1190d84335fSJung-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  *
1350d84335fSJung-uk Kim  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
1360d84335fSJung-uk Kim  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
1370d84335fSJung-uk Kim  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
1380d84335fSJung-uk Kim  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
1390d84335fSJung-uk Kim  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
1400d84335fSJung-uk Kim  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
1410d84335fSJung-uk Kim  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
1420d84335fSJung-uk Kim  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
1430d84335fSJung-uk Kim  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
1440d84335fSJung-uk Kim  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
1450d84335fSJung-uk Kim  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
1460d84335fSJung-uk Kim  *
1470d84335fSJung-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  *
1510d84335fSJung-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 
1630d84335fSJung-uk Kim void
yyerror(char const * s)1640d84335fSJung-uk Kim yyerror (char const *s)
165eef1b955SJung-uk Kim {
166eef1b955SJung-uk Kim 
1670d84335fSJung-uk Kim   AcpiOsPrintf ("YYERROR: %s\n", s);
1680d84335fSJung-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
AslParserCleanup(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  *
198722b1667SJung-uk Kim  * The #line directive is emitted by the preprocessor, 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
AslDoLineDirective(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 
2156f1f1a63SJung-uk Kim    AslGbl_HasIncludeFiles = TRUE;
216eef1b955SJung-uk Kim 
217eef1b955SJung-uk Kim     /* Eat the entire line that contains the #line directive */
218eef1b955SJung-uk Kim 
2196f1f1a63SJung-uk Kim     AslGbl_LineBufPtr = AslGbl_CurrentLineBuffer;
220f38b0f21SJung-uk Kim 
221f38b0f21SJung-uk Kim     while ((c = input()) != '\n' && c != EOF)
222eef1b955SJung-uk Kim     {
22337d7a5bcSJung-uk Kim         *AslGbl_LineBufPtr = (char) c;
2246f1f1a63SJung-uk Kim         AslGbl_LineBufPtr++;
225eef1b955SJung-uk Kim     }
2266f1f1a63SJung-uk Kim     *AslGbl_LineBufPtr = 0;
227eef1b955SJung-uk Kim 
228eef1b955SJung-uk Kim     /* First argument is the actual line number */
229eef1b955SJung-uk Kim 
2306f1f1a63SJung-uk Kim     Token = strtok (AslGbl_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 
2426f1f1a63SJung-uk Kim     AslGbl_CurrentColumn = 0;
2436f1f1a63SJung-uk Kim     if (LineNumber > AslGbl_CurrentLineNumber)
244f38b0f21SJung-uk Kim     {
2456f1f1a63SJung-uk Kim         for (i = 0; i < (LineNumber - AslGbl_CurrentLineNumber); i++)
246f38b0f21SJung-uk Kim         {
247f38b0f21SJung-uk Kim             FlWriteFile (ASL_FILE_SOURCE_OUTPUT, "\n", 1);
2486f1f1a63SJung-uk Kim             AslGbl_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     {
2596f1f1a63SJung-uk Kim         Filename = UtLocalCacheCalloc (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 
2706f1f1a63SJung-uk Kim     AslGbl_CurrentLineOffset += AslGbl_CurrentColumn;
2716f1f1a63SJung-uk Kim     AslGbl_CurrentColumn = 0;
2726f1f1a63SJung-uk Kim     AslGbl_LineBufPtr = AslGbl_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
AslPopInputFileStack(void)292eef1b955SJung-uk Kim AslPopInputFileStack (
293eef1b955SJung-uk Kim     void)
294eef1b955SJung-uk Kim {
295eef1b955SJung-uk Kim     ASL_FILE_NODE           *Fnode;
296eef1b955SJung-uk Kim 
297eef1b955SJung-uk Kim 
2986f1f1a63SJung-uk Kim     AslGbl_PreviousIncludeFilename = AslGbl_Files[ASL_FILE_INPUT].Filename;
2996f1f1a63SJung-uk Kim     Fnode = AslGbl_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,
3046f1f1a63SJung-uk Kim         "Include: Closing \"%s\"\n\n", AslGbl_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 
3176f1f1a63SJung-uk Kim     AslGbl_IncludeFileStack = Fnode->Next;
318eef1b955SJung-uk Kim 
319eef1b955SJung-uk Kim     /* Reset global line counter and filename */
320eef1b955SJung-uk Kim 
3216f1f1a63SJung-uk Kim     AslGbl_Files[ASL_FILE_INPUT].Filename = Fnode->Filename;
3226f1f1a63SJung-uk Kim     AslGbl_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
AslPushInputFileStack(FILE * InputFile,char * Filename)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;
3656f1f1a63SJung-uk Kim     Fnode->Next = AslGbl_IncludeFileStack;
366eef1b955SJung-uk Kim     Fnode->State = YY_CURRENT_BUFFER;
3676f1f1a63SJung-uk Kim     Fnode->Filename = AslGbl_Files[ASL_FILE_INPUT].Filename;
3686f1f1a63SJung-uk Kim     Fnode->CurrentLineNumber = AslGbl_CurrentLineNumber;
369eef1b955SJung-uk Kim 
370eef1b955SJung-uk Kim     /* Push it on the stack */
371eef1b955SJung-uk Kim 
3726f1f1a63SJung-uk Kim     AslGbl_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 
3846f1f1a63SJung-uk Kim     AslGbl_Files[ASL_FILE_INPUT].Filename =
38567d9aa44SJung-uk Kim         UtLocalCacheCalloc (strlen (Filename) + 1);
386313a0c13SJung-uk Kim 
3876f1f1a63SJung-uk Kim     strcpy (AslGbl_Files[ASL_FILE_INPUT].Filename, Filename);
388313a0c13SJung-uk Kim 
3896f1f1a63SJung-uk Kim     AslGbl_CurrentLineNumber = 1;
390eef1b955SJung-uk Kim     yyin = InputFile;
3910d84335fSJung-uk Kim 
3920d84335fSJung-uk Kim     /* converter: reset the comment state to STANDARD_COMMENT */
3930d84335fSJung-uk Kim 
3946f1f1a63SJung-uk Kim     AslGbl_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
AslResetCurrentLineBuffer(void)411eef1b955SJung-uk Kim AslResetCurrentLineBuffer (
412eef1b955SJung-uk Kim     void)
413eef1b955SJung-uk Kim {
414eef1b955SJung-uk Kim 
4156f1f1a63SJung-uk Kim     if (AslGbl_Files[ASL_FILE_SOURCE_OUTPUT].Handle)
416eef1b955SJung-uk Kim     {
4176f1f1a63SJung-uk Kim         FlWriteFile (ASL_FILE_SOURCE_OUTPUT, AslGbl_CurrentLineBuffer,
4186f1f1a63SJung-uk Kim             AslGbl_LineBufPtr - AslGbl_CurrentLineBuffer);
419eef1b955SJung-uk Kim     }
420eef1b955SJung-uk Kim 
4216f1f1a63SJung-uk Kim     AslGbl_CurrentLineOffset += AslGbl_CurrentColumn;
4226f1f1a63SJung-uk Kim     AslGbl_CurrentColumn = 0;
423eef1b955SJung-uk Kim 
4246f1f1a63SJung-uk Kim     AslGbl_CurrentLineNumber++;
4256f1f1a63SJung-uk Kim     AslGbl_LogicalLineNumber++;
4266f1f1a63SJung-uk Kim     AslGbl_LineBufPtr = AslGbl_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
AslInsertLineBuffer(int SourceChar)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 
4556f1f1a63SJung-uk Kim     AslGbl_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 -
4636f1f1a63SJung-uk Kim                     (AslGbl_CurrentColumn & (ASL_SPACES_PER_TAB-1));
464eef1b955SJung-uk Kim     }
465eef1b955SJung-uk Kim 
466eef1b955SJung-uk Kim     for (i = 0; i < Count; i++)
467eef1b955SJung-uk Kim     {
4686f1f1a63SJung-uk Kim         AslGbl_CurrentColumn++;
469eef1b955SJung-uk Kim 
470eef1b955SJung-uk Kim         /* Insert the character into the line buffer */
471eef1b955SJung-uk Kim 
4726f1f1a63SJung-uk Kim         *AslGbl_LineBufPtr = (UINT8) SourceChar;
4736f1f1a63SJung-uk Kim         AslGbl_LineBufPtr++;
474eef1b955SJung-uk Kim 
4756f1f1a63SJung-uk Kim         if (AslGbl_LineBufPtr >
4766f1f1a63SJung-uk Kim             (AslGbl_CurrentLineBuffer + (AslGbl_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              */
4836f1f1a63SJung-uk Kim             sprintf (MsgBuffer, "Max %u", AslGbl_LineBufferSize);
484eef1b955SJung-uk Kim             AslCommonError (ASL_WARNING, ASL_MSG_LONG_LINE,
4856f1f1a63SJung-uk Kim                 AslGbl_CurrentLineNumber, AslGbl_LogicalLineNumber,
4866f1f1a63SJung-uk Kim                 AslGbl_CurrentLineOffset, AslGbl_CurrentColumn,
4876f1f1a63SJung-uk Kim                 AslGbl_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         }
4980d84335fSJung-uk Kim 
499f1db5ef7SJung-uk Kim         if (AcpiGbl_CaptureComments)
5000d84335fSJung-uk Kim         {
50137d7a5bcSJung-uk Kim             CvProcessCommentState ((char) SourceChar);
5020d84335fSJung-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
count(int Type)525eef1b955SJung-uk Kim count (
526eef1b955SJung-uk Kim     int                 Type)
527eef1b955SJung-uk Kim {
528f1db5ef7SJung-uk Kim     char                *p;
529eef1b955SJung-uk Kim 
530eef1b955SJung-uk Kim 
531eef1b955SJung-uk Kim     switch (Type)
532eef1b955SJung-uk Kim     {
533eef1b955SJung-uk Kim     case 2:
534a9d8d09cSJung-uk Kim 
53544b0f624SJung-uk Kim         ++AslGbl_TotalKeywords;
53644b0f624SJung-uk Kim         ++AslGbl_TotalNamedObjects;
53744b0f624SJung-uk Kim         ++AslGbl_FilesList->TotalKeywords;
53844b0f624SJung-uk Kim         ++AslGbl_FilesList->TotalNamedObjects;
539eef1b955SJung-uk Kim         break;
540eef1b955SJung-uk Kim 
541eef1b955SJung-uk Kim     case 3:
542a9d8d09cSJung-uk Kim 
54344b0f624SJung-uk Kim         ++AslGbl_TotalKeywords;
54444b0f624SJung-uk Kim         ++AslGbl_TotalExecutableOpcodes;
54544b0f624SJung-uk Kim         ++AslGbl_FilesList->TotalKeywords;
54644b0f624SJung-uk Kim         ++AslGbl_FilesList->TotalExecutableOpcodes;
547eef1b955SJung-uk Kim         break;
5489c48c75eSJung-uk Kim 
5499c48c75eSJung-uk Kim     default:
550a9d8d09cSJung-uk Kim 
5519c48c75eSJung-uk Kim         break;
552eef1b955SJung-uk Kim     }
553eef1b955SJung-uk Kim 
554f1db5ef7SJung-uk Kim     for (p = yytext; *p != '\0'; p++)
555eef1b955SJung-uk Kim     {
556f1db5ef7SJung-uk Kim         AslInsertLineBuffer (*p);
5576f1f1a63SJung-uk Kim         *AslGbl_LineBufPtr = 0;
558eef1b955SJung-uk Kim     }
559eef1b955SJung-uk Kim }
560eef1b955SJung-uk Kim 
561eef1b955SJung-uk Kim 
562eef1b955SJung-uk Kim /*******************************************************************************
563eef1b955SJung-uk Kim  *
564eef1b955SJung-uk Kim  * FUNCTION:    AslDoComment
565eef1b955SJung-uk Kim  *
566eef1b955SJung-uk Kim  * PARAMETERS:  none
567eef1b955SJung-uk Kim  *
568eef1b955SJung-uk Kim  * RETURN:      none
569eef1b955SJung-uk Kim  *
570eef1b955SJung-uk Kim  * DESCRIPTION: Process a standard comment.
571eef1b955SJung-uk Kim  *
572eef1b955SJung-uk Kim  ******************************************************************************/
573eef1b955SJung-uk Kim 
5740d84335fSJung-uk Kim static BOOLEAN
AslDoComment(void)575eef1b955SJung-uk Kim AslDoComment (
576eef1b955SJung-uk Kim     void)
577eef1b955SJung-uk Kim {
578f38b0f21SJung-uk Kim     int                     c;
579f38b0f21SJung-uk Kim     int                     c1 = 0;
5806f1f1a63SJung-uk Kim     char                    *StringBuffer = AslGbl_MsgBuffer;
5816f1f1a63SJung-uk Kim     char                    *EndBuffer = AslGbl_MsgBuffer + ASL_MSG_BUFFER_SIZE;
5826f1f1a63SJung-uk Kim     ASL_COMMENT_STATE       CurrentState = AslGbl_CommentState; /* to reference later on */
583eef1b955SJung-uk Kim 
584eef1b955SJung-uk Kim 
585eef1b955SJung-uk Kim     AslInsertLineBuffer ('/');
586eef1b955SJung-uk Kim     AslInsertLineBuffer ('*');
587f1db5ef7SJung-uk Kim     if (AcpiGbl_CaptureComments && CurrentState.CaptureComments)
5880d84335fSJung-uk Kim     {
5890d84335fSJung-uk Kim         *StringBuffer = '/';
5900d84335fSJung-uk Kim         ++StringBuffer;
5910d84335fSJung-uk Kim         *StringBuffer = '*';
5920d84335fSJung-uk Kim         ++StringBuffer;
5930d84335fSJung-uk Kim     }
594eef1b955SJung-uk Kim 
595eef1b955SJung-uk Kim loop:
596eef1b955SJung-uk Kim 
597eef1b955SJung-uk Kim     /* Eat chars until end-of-comment */
598eef1b955SJung-uk Kim 
5991c0e1b6dSJung-uk Kim     while (((c = input ()) != '*') && (c != EOF))
600eef1b955SJung-uk Kim     {
601eef1b955SJung-uk Kim         AslInsertLineBuffer (c);
602f1db5ef7SJung-uk Kim         if (AcpiGbl_CaptureComments && CurrentState.CaptureComments)
6030d84335fSJung-uk Kim         {
60437d7a5bcSJung-uk Kim             *StringBuffer = (char) c;
6050d84335fSJung-uk Kim             ++StringBuffer;
6060d84335fSJung-uk Kim         }
607eef1b955SJung-uk Kim         c1 = c;
608eef1b955SJung-uk Kim     }
609eef1b955SJung-uk Kim 
610eef1b955SJung-uk Kim     if (c == EOF)
611eef1b955SJung-uk Kim     {
612eef1b955SJung-uk Kim         goto EarlyEOF;
613eef1b955SJung-uk Kim     }
614eef1b955SJung-uk Kim 
615eef1b955SJung-uk Kim     /*
616eef1b955SJung-uk Kim      * Check for nested comment -- can help catch cases where a previous
617cd6518c7SJung-uk Kim      * comment was accidentally left unterminated
618eef1b955SJung-uk Kim      */
619eef1b955SJung-uk Kim     if ((c1 == '/') && (c == '*'))
620eef1b955SJung-uk Kim     {
621eef1b955SJung-uk Kim         AslCommonError (ASL_WARNING, ASL_MSG_NESTED_COMMENT,
6226f1f1a63SJung-uk Kim             AslGbl_CurrentLineNumber, AslGbl_LogicalLineNumber,
6236f1f1a63SJung-uk Kim             AslGbl_InputByteCount, AslGbl_CurrentColumn,
6246f1f1a63SJung-uk Kim             AslGbl_Files[ASL_FILE_INPUT].Filename, NULL);
625eef1b955SJung-uk Kim     }
626eef1b955SJung-uk Kim 
627eef1b955SJung-uk Kim     /* Comment is closed only if the NEXT character is a slash */
628eef1b955SJung-uk Kim 
629eef1b955SJung-uk Kim     AslInsertLineBuffer (c);
630f1db5ef7SJung-uk Kim     if (AcpiGbl_CaptureComments && CurrentState.CaptureComments)
6310d84335fSJung-uk Kim     {
63237d7a5bcSJung-uk Kim         *StringBuffer = (char) c;
6330d84335fSJung-uk Kim         ++StringBuffer;
6340d84335fSJung-uk Kim     }
635eef1b955SJung-uk Kim 
6361c0e1b6dSJung-uk Kim     if (((c1 = input ()) != '/') && (c1 != EOF))
637eef1b955SJung-uk Kim     {
638eef1b955SJung-uk Kim         unput (c1);
639eef1b955SJung-uk Kim         goto loop;
640eef1b955SJung-uk Kim     }
641eef1b955SJung-uk Kim 
642eef1b955SJung-uk Kim     if (c1 == EOF)
643eef1b955SJung-uk Kim     {
644eef1b955SJung-uk Kim         goto EarlyEOF;
645eef1b955SJung-uk Kim     }
6460d84335fSJung-uk Kim     if (StringBuffer > EndBuffer)
6470d84335fSJung-uk Kim     {
6480d84335fSJung-uk Kim         goto BufferOverflow;
6490d84335fSJung-uk Kim     }
650eef1b955SJung-uk Kim 
651eef1b955SJung-uk Kim     AslInsertLineBuffer (c1);
6520d84335fSJung-uk Kim     CvProcessComment (CurrentState, StringBuffer, c1);
653eef1b955SJung-uk Kim     return (TRUE);
654eef1b955SJung-uk Kim 
655eef1b955SJung-uk Kim 
656eef1b955SJung-uk Kim EarlyEOF:
657eef1b955SJung-uk Kim     /*
658eef1b955SJung-uk Kim      * Premature End-Of-File
659eef1b955SJung-uk Kim      */
660eef1b955SJung-uk Kim     AslCommonError (ASL_ERROR, ASL_MSG_EARLY_EOF,
6616f1f1a63SJung-uk Kim         AslGbl_CurrentLineNumber, AslGbl_LogicalLineNumber,
6626f1f1a63SJung-uk Kim         AslGbl_CurrentLineOffset, AslGbl_CurrentColumn,
6636f1f1a63SJung-uk Kim         AslGbl_Files[ASL_FILE_INPUT].Filename, NULL);
664eef1b955SJung-uk Kim     return (FALSE);
6650d84335fSJung-uk Kim 
6660d84335fSJung-uk Kim 
6670d84335fSJung-uk Kim BufferOverflow:
6680d84335fSJung-uk Kim 
6690d84335fSJung-uk Kim     /* Comment was too long */
6700d84335fSJung-uk Kim 
6710d84335fSJung-uk Kim     AslCommonError (ASL_ERROR, ASL_MSG_STRING_LENGTH,
6726f1f1a63SJung-uk Kim         AslGbl_CurrentLineNumber, AslGbl_LogicalLineNumber,
6736f1f1a63SJung-uk Kim         AslGbl_CurrentLineOffset, AslGbl_CurrentColumn,
6746f1f1a63SJung-uk Kim         AslGbl_Files[ASL_FILE_INPUT].Filename, "Max length 4096");
6750d84335fSJung-uk Kim     return (FALSE);
6760d84335fSJung-uk Kim 
677eef1b955SJung-uk Kim }
678eef1b955SJung-uk Kim 
679eef1b955SJung-uk Kim 
680eef1b955SJung-uk Kim /*******************************************************************************
681eef1b955SJung-uk Kim  *
682eef1b955SJung-uk Kim  * FUNCTION:    AslDoCommentType2
683eef1b955SJung-uk Kim  *
684eef1b955SJung-uk Kim  * PARAMETERS:  none
685eef1b955SJung-uk Kim  *
686eef1b955SJung-uk Kim  * RETURN:      none
687eef1b955SJung-uk Kim  *
6880d84335fSJung-uk Kim  * DESCRIPTION: Process a new "//" comment. Inline comments will be converted
6890d84335fSJung-uk Kim  *              to "/ *" standard comments.
690eef1b955SJung-uk Kim  *
691eef1b955SJung-uk Kim  ******************************************************************************/
692eef1b955SJung-uk Kim 
6930d84335fSJung-uk Kim static BOOLEAN
AslDoCommentType2(void)694eef1b955SJung-uk Kim AslDoCommentType2 (
695eef1b955SJung-uk Kim     void)
696eef1b955SJung-uk Kim {
697f38b0f21SJung-uk Kim     int                     c;
6986f1f1a63SJung-uk Kim     char                    *StringBuffer = AslGbl_MsgBuffer;
6996f1f1a63SJung-uk Kim     char                    *EndBuffer = AslGbl_MsgBuffer + ASL_MSG_BUFFER_SIZE;
7006f1f1a63SJung-uk Kim     ASL_COMMENT_STATE       CurrentState = AslGbl_CommentState;
701eef1b955SJung-uk Kim 
702eef1b955SJung-uk Kim 
703eef1b955SJung-uk Kim     AslInsertLineBuffer ('/');
7040d84335fSJung-uk Kim 
705f1db5ef7SJung-uk Kim     if (AcpiGbl_CaptureComments && CurrentState.CaptureComments)
7060d84335fSJung-uk Kim     {
707af051161SJung-uk Kim         AslInsertLineBuffer ('*');
7080d84335fSJung-uk Kim         *StringBuffer = '/';
7090d84335fSJung-uk Kim         ++StringBuffer;
7100d84335fSJung-uk Kim         *StringBuffer = '*';
7110d84335fSJung-uk Kim         ++StringBuffer;
7120d84335fSJung-uk Kim     }
713af051161SJung-uk Kim     else
714af051161SJung-uk Kim     {
715af051161SJung-uk Kim         AslInsertLineBuffer ('/');
716af051161SJung-uk Kim     }
717eef1b955SJung-uk Kim 
7181c0e1b6dSJung-uk Kim     while (((c = input ()) != '\n') && (c != EOF))
719eef1b955SJung-uk Kim     {
720eef1b955SJung-uk Kim         AslInsertLineBuffer (c);
721f1db5ef7SJung-uk Kim         if (AcpiGbl_CaptureComments && CurrentState.CaptureComments)
7220d84335fSJung-uk Kim         {
72337d7a5bcSJung-uk Kim             *StringBuffer = (char) c;
7240d84335fSJung-uk Kim             ++StringBuffer;
7250d84335fSJung-uk Kim         }
726eef1b955SJung-uk Kim     }
727eef1b955SJung-uk Kim 
728eef1b955SJung-uk Kim     if (c == EOF)
729eef1b955SJung-uk Kim     {
730eef1b955SJung-uk Kim         /* End of file is OK, change to newline. Let parser detect EOF later */
731eef1b955SJung-uk Kim 
732eef1b955SJung-uk Kim         c = '\n';
733eef1b955SJung-uk Kim     }
734eef1b955SJung-uk Kim 
7350d84335fSJung-uk Kim     if (StringBuffer > EndBuffer)
7360d84335fSJung-uk Kim     {
7370d84335fSJung-uk Kim         goto BufferOverflow;
7380d84335fSJung-uk Kim     }
739eef1b955SJung-uk Kim     AslInsertLineBuffer (c);
7400d84335fSJung-uk Kim 
7410d84335fSJung-uk Kim     CvProcessCommentType2 (CurrentState, StringBuffer);
742eef1b955SJung-uk Kim     return (TRUE);
7430d84335fSJung-uk Kim 
7440d84335fSJung-uk Kim 
7450d84335fSJung-uk Kim BufferOverflow:
7460d84335fSJung-uk Kim 
7470d84335fSJung-uk Kim     /* Comment was too long */
7480d84335fSJung-uk Kim 
7490d84335fSJung-uk Kim     AslCommonError (ASL_ERROR, ASL_MSG_STRING_LENGTH,
7506f1f1a63SJung-uk Kim         AslGbl_CurrentLineNumber, AslGbl_LogicalLineNumber,
7516f1f1a63SJung-uk Kim         AslGbl_CurrentLineOffset, AslGbl_CurrentColumn,
7526f1f1a63SJung-uk Kim         AslGbl_Files[ASL_FILE_INPUT].Filename, "Max length 4096");
7530d84335fSJung-uk Kim     return (FALSE);
7540d84335fSJung-uk Kim 
755eef1b955SJung-uk Kim }
756eef1b955SJung-uk Kim 
757eef1b955SJung-uk Kim 
758eef1b955SJung-uk Kim /*******************************************************************************
759eef1b955SJung-uk Kim  *
760eef1b955SJung-uk Kim  * FUNCTION:    AslDoStringLiteral
761eef1b955SJung-uk Kim  *
762eef1b955SJung-uk Kim  * PARAMETERS:  none
763eef1b955SJung-uk Kim  *
764eef1b955SJung-uk Kim  * RETURN:      none
765eef1b955SJung-uk Kim  *
766eef1b955SJung-uk Kim  * DESCRIPTION: Process a string literal (surrounded by quotes)
767eef1b955SJung-uk Kim  *
768eef1b955SJung-uk Kim  ******************************************************************************/
769eef1b955SJung-uk Kim 
770eef1b955SJung-uk Kim static char
AslDoStringLiteral(void)771eef1b955SJung-uk Kim AslDoStringLiteral (
772eef1b955SJung-uk Kim     void)
773eef1b955SJung-uk Kim {
7746f1f1a63SJung-uk Kim     char                *StringBuffer = AslGbl_MsgBuffer;
7756f1f1a63SJung-uk Kim     char                *EndBuffer = AslGbl_MsgBuffer + ASL_MSG_BUFFER_SIZE;
776eef1b955SJung-uk Kim     char                *CleanString;
777f38b0f21SJung-uk Kim     int                 StringChar;
778eef1b955SJung-uk Kim     UINT32              State = ASL_NORMAL_CHAR;
779eef1b955SJung-uk Kim     UINT32              i = 0;
780eef1b955SJung-uk Kim     UINT8               Digit;
781eef1b955SJung-uk Kim     char                ConvertBuffer[4];
782eef1b955SJung-uk Kim 
783eef1b955SJung-uk Kim 
784eef1b955SJung-uk Kim     /*
785eef1b955SJung-uk Kim      * Eat chars until end-of-literal.
786eef1b955SJung-uk Kim      * NOTE:  Put back the original surrounding quotes into the
787eef1b955SJung-uk Kim      * source line buffer.
788eef1b955SJung-uk Kim      */
789eef1b955SJung-uk Kim     AslInsertLineBuffer ('\"');
790f38b0f21SJung-uk Kim     while ((StringChar = input()) != EOF)
791eef1b955SJung-uk Kim     {
792eef1b955SJung-uk Kim         AslInsertLineBuffer (StringChar);
793eef1b955SJung-uk Kim 
794eef1b955SJung-uk Kim DoCharacter:
795eef1b955SJung-uk Kim         switch (State)
796eef1b955SJung-uk Kim         {
797eef1b955SJung-uk Kim         case ASL_NORMAL_CHAR:
798eef1b955SJung-uk Kim 
799eef1b955SJung-uk Kim             switch (StringChar)
800eef1b955SJung-uk Kim             {
801eef1b955SJung-uk Kim             case '\\':
802eef1b955SJung-uk Kim                 /*
803eef1b955SJung-uk Kim                  * Special handling for backslash-escape sequence. We will
804eef1b955SJung-uk Kim                  * toss the backslash and translate the escape char(s).
805eef1b955SJung-uk Kim                  */
806eef1b955SJung-uk Kim                 State = ASL_ESCAPE_SEQUENCE;
807eef1b955SJung-uk Kim                 continue;
808eef1b955SJung-uk Kim 
809eef1b955SJung-uk Kim             case '\"':
810eef1b955SJung-uk Kim 
811eef1b955SJung-uk Kim                 /* String terminator */
812eef1b955SJung-uk Kim 
813eef1b955SJung-uk Kim                 goto CompletedString;
8149c48c75eSJung-uk Kim 
8159c48c75eSJung-uk Kim             default:
816a9d8d09cSJung-uk Kim 
8179c48c75eSJung-uk Kim                 break;
818eef1b955SJung-uk Kim             }
819eef1b955SJung-uk Kim             break;
820eef1b955SJung-uk Kim 
821eef1b955SJung-uk Kim 
822eef1b955SJung-uk Kim         case ASL_ESCAPE_SEQUENCE:
823eef1b955SJung-uk Kim 
824eef1b955SJung-uk Kim             State = ASL_NORMAL_CHAR;
825eef1b955SJung-uk Kim             switch (StringChar)
826eef1b955SJung-uk Kim             {
827eef1b955SJung-uk Kim             case 'a':
828a9d8d09cSJung-uk Kim 
829eef1b955SJung-uk Kim                 StringChar = 0x07;      /* BELL */
830eef1b955SJung-uk Kim                 break;
831eef1b955SJung-uk Kim 
832eef1b955SJung-uk Kim             case 'b':
833a9d8d09cSJung-uk Kim 
834eef1b955SJung-uk Kim                 StringChar = 0x08;      /* BACKSPACE */
835eef1b955SJung-uk Kim                 break;
836eef1b955SJung-uk Kim 
837eef1b955SJung-uk Kim             case 'f':
838a9d8d09cSJung-uk Kim 
839eef1b955SJung-uk Kim                 StringChar = 0x0C;      /* FORMFEED */
840eef1b955SJung-uk Kim                 break;
841eef1b955SJung-uk Kim 
842eef1b955SJung-uk Kim             case 'n':
843a9d8d09cSJung-uk Kim 
844eef1b955SJung-uk Kim                 StringChar = 0x0A;      /* LINEFEED */
845eef1b955SJung-uk Kim                 break;
846eef1b955SJung-uk Kim 
847eef1b955SJung-uk Kim             case 'r':
848a9d8d09cSJung-uk Kim 
849eef1b955SJung-uk Kim                 StringChar = 0x0D;      /* CARRIAGE RETURN*/
850eef1b955SJung-uk Kim                 break;
851eef1b955SJung-uk Kim 
852eef1b955SJung-uk Kim             case 't':
853a9d8d09cSJung-uk Kim 
854eef1b955SJung-uk Kim                 StringChar = 0x09;      /* HORIZONTAL TAB */
855eef1b955SJung-uk Kim                 break;
856eef1b955SJung-uk Kim 
857eef1b955SJung-uk Kim             case 'v':
858a9d8d09cSJung-uk Kim 
859eef1b955SJung-uk Kim                 StringChar = 0x0B;      /* VERTICAL TAB */
860eef1b955SJung-uk Kim                 break;
861eef1b955SJung-uk Kim 
862eef1b955SJung-uk Kim             case 'x':
863a9d8d09cSJung-uk Kim 
864eef1b955SJung-uk Kim                 State = ASL_HEX_CONSTANT;
865eef1b955SJung-uk Kim                 i = 0;
866eef1b955SJung-uk Kim                 continue;
867eef1b955SJung-uk Kim 
868eef1b955SJung-uk Kim             case '\'':                  /* Single Quote */
869eef1b955SJung-uk Kim             case '\"':                  /* Double Quote */
870eef1b955SJung-uk Kim             case '\\':                  /* Backslash */
871a9d8d09cSJung-uk Kim 
872eef1b955SJung-uk Kim                 break;
873eef1b955SJung-uk Kim 
874eef1b955SJung-uk Kim             default:
875eef1b955SJung-uk Kim 
876eef1b955SJung-uk Kim                 /* Check for an octal digit (0-7) */
877eef1b955SJung-uk Kim 
878eef1b955SJung-uk Kim                 if (ACPI_IS_OCTAL_DIGIT (StringChar))
879eef1b955SJung-uk Kim                 {
880eef1b955SJung-uk Kim                     State = ASL_OCTAL_CONSTANT;
88137d7a5bcSJung-uk Kim                     ConvertBuffer[0] = (char) StringChar;
882eef1b955SJung-uk Kim                     i = 1;
883eef1b955SJung-uk Kim                     continue;
884eef1b955SJung-uk Kim                 }
885eef1b955SJung-uk Kim 
886eef1b955SJung-uk Kim                 /* Unknown escape sequence issue warning, but use the character */
887eef1b955SJung-uk Kim 
888eef1b955SJung-uk Kim                 AslCommonError (ASL_WARNING, ASL_MSG_INVALID_ESCAPE,
8896f1f1a63SJung-uk Kim                     AslGbl_CurrentLineNumber, AslGbl_LogicalLineNumber,
8906f1f1a63SJung-uk Kim                     AslGbl_CurrentLineOffset, AslGbl_CurrentColumn,
8916f1f1a63SJung-uk Kim                     AslGbl_Files[ASL_FILE_INPUT].Filename, NULL);
892eef1b955SJung-uk Kim                 break;
893eef1b955SJung-uk Kim             }
894eef1b955SJung-uk Kim             break;
895eef1b955SJung-uk Kim 
896eef1b955SJung-uk Kim 
897eef1b955SJung-uk Kim         case ASL_OCTAL_CONSTANT:
898eef1b955SJung-uk Kim 
899eef1b955SJung-uk Kim             /* Up to three octal digits allowed */
900eef1b955SJung-uk Kim 
901eef1b955SJung-uk Kim             if (!ACPI_IS_OCTAL_DIGIT (StringChar) ||
902eef1b955SJung-uk Kim                 (i > 2))
903eef1b955SJung-uk Kim             {
904eef1b955SJung-uk Kim                 /*
905eef1b955SJung-uk Kim                  * Reached end of the constant. Convert the assembled ASCII
906eef1b955SJung-uk Kim                  * string and resume processing of the next character
907eef1b955SJung-uk Kim                  */
908eef1b955SJung-uk Kim                 ConvertBuffer[i] = 0;
9095ef50723SJung-uk Kim                 Digit = (UINT8) strtoul (ConvertBuffer, NULL, 8);
910eef1b955SJung-uk Kim 
911eef1b955SJung-uk Kim                 /* Check for NULL or non-ascii character (ignore if so) */
912eef1b955SJung-uk Kim 
913eef1b955SJung-uk Kim                 if ((Digit == 0) || (Digit > ACPI_ASCII_MAX))
914eef1b955SJung-uk Kim                 {
915eef1b955SJung-uk Kim                     AslCommonError (ASL_WARNING, ASL_MSG_INVALID_STRING,
9166f1f1a63SJung-uk Kim                         AslGbl_CurrentLineNumber, AslGbl_LogicalLineNumber,
9176f1f1a63SJung-uk Kim                         AslGbl_CurrentLineOffset, AslGbl_CurrentColumn,
9186f1f1a63SJung-uk Kim                         AslGbl_Files[ASL_FILE_INPUT].Filename, NULL);
919eef1b955SJung-uk Kim                 }
920eef1b955SJung-uk Kim                 else
921eef1b955SJung-uk Kim                 {
922eef1b955SJung-uk Kim                     *StringBuffer = (char) Digit;
923eef1b955SJung-uk Kim                     StringBuffer++;
924eef1b955SJung-uk Kim                     if (StringBuffer >= EndBuffer)
925eef1b955SJung-uk Kim                     {
926eef1b955SJung-uk Kim                         goto BufferOverflow;
927eef1b955SJung-uk Kim                     }
928eef1b955SJung-uk Kim                 }
929eef1b955SJung-uk Kim 
930eef1b955SJung-uk Kim                 State = ASL_NORMAL_CHAR;
931eef1b955SJung-uk Kim                 goto DoCharacter;
932eef1b955SJung-uk Kim                 break;
933eef1b955SJung-uk Kim             }
934eef1b955SJung-uk Kim 
935eef1b955SJung-uk Kim             /* Append another digit of the constant */
936eef1b955SJung-uk Kim 
93737d7a5bcSJung-uk Kim             ConvertBuffer[i] = (char) StringChar;
938eef1b955SJung-uk Kim             i++;
939eef1b955SJung-uk Kim             continue;
940eef1b955SJung-uk Kim 
941eef1b955SJung-uk Kim         case ASL_HEX_CONSTANT:
942eef1b955SJung-uk Kim 
943eef1b955SJung-uk Kim             /* Up to two hex digits allowed */
944eef1b955SJung-uk Kim 
9455ef50723SJung-uk Kim             if (!isxdigit (StringChar) ||
946eef1b955SJung-uk Kim                 (i > 1))
947eef1b955SJung-uk Kim             {
948eef1b955SJung-uk Kim                 /*
949eef1b955SJung-uk Kim                  * Reached end of the constant. Convert the assembled ASCII
950eef1b955SJung-uk Kim                  * string and resume processing of the next character
951eef1b955SJung-uk Kim                  */
952eef1b955SJung-uk Kim                 ConvertBuffer[i] = 0;
9535ef50723SJung-uk Kim                 Digit = (UINT8) strtoul (ConvertBuffer, NULL, 16);
954eef1b955SJung-uk Kim 
955eef1b955SJung-uk Kim                 /* Check for NULL or non-ascii character (ignore if so) */
956eef1b955SJung-uk Kim 
957eef1b955SJung-uk Kim                 if ((Digit == 0) || (Digit > ACPI_ASCII_MAX))
958eef1b955SJung-uk Kim                 {
959eef1b955SJung-uk Kim                     AslCommonError (ASL_WARNING, ASL_MSG_INVALID_STRING,
9606f1f1a63SJung-uk Kim                         AslGbl_CurrentLineNumber, AslGbl_LogicalLineNumber,
9616f1f1a63SJung-uk Kim                         AslGbl_CurrentLineOffset, AslGbl_CurrentColumn,
9626f1f1a63SJung-uk Kim                         AslGbl_Files[ASL_FILE_INPUT].Filename, NULL);
963eef1b955SJung-uk Kim                 }
964eef1b955SJung-uk Kim                 else
965eef1b955SJung-uk Kim                 {
966eef1b955SJung-uk Kim                     *StringBuffer = (char) Digit;
967eef1b955SJung-uk Kim                     StringBuffer++;
968eef1b955SJung-uk Kim                     if (StringBuffer >= EndBuffer)
969eef1b955SJung-uk Kim                     {
970eef1b955SJung-uk Kim                         goto BufferOverflow;
971eef1b955SJung-uk Kim                     }
972eef1b955SJung-uk Kim                 }
973eef1b955SJung-uk Kim 
974eef1b955SJung-uk Kim                 State = ASL_NORMAL_CHAR;
975eef1b955SJung-uk Kim                 goto DoCharacter;
976eef1b955SJung-uk Kim                 break;
977eef1b955SJung-uk Kim             }
978eef1b955SJung-uk Kim 
979eef1b955SJung-uk Kim             /* Append another digit of the constant */
980eef1b955SJung-uk Kim 
98137d7a5bcSJung-uk Kim             ConvertBuffer[i] = (char) StringChar;
982eef1b955SJung-uk Kim             i++;
983eef1b955SJung-uk Kim             continue;
9849c48c75eSJung-uk Kim 
9859c48c75eSJung-uk Kim         default:
986a9d8d09cSJung-uk Kim 
9879c48c75eSJung-uk Kim             break;
988eef1b955SJung-uk Kim         }
989eef1b955SJung-uk Kim 
990eef1b955SJung-uk Kim         /* Save the finished character */
991eef1b955SJung-uk Kim 
99237d7a5bcSJung-uk Kim         *StringBuffer = (char) StringChar;
993eef1b955SJung-uk Kim         StringBuffer++;
994eef1b955SJung-uk Kim         if (StringBuffer >= EndBuffer)
995eef1b955SJung-uk Kim         {
996eef1b955SJung-uk Kim             goto BufferOverflow;
997eef1b955SJung-uk Kim         }
998eef1b955SJung-uk Kim     }
999eef1b955SJung-uk Kim 
1000eef1b955SJung-uk Kim     /*
1001eef1b955SJung-uk Kim      * Premature End-Of-File
1002eef1b955SJung-uk Kim      */
1003eef1b955SJung-uk Kim     AslCommonError (ASL_ERROR, ASL_MSG_EARLY_EOF,
10046f1f1a63SJung-uk Kim         AslGbl_CurrentLineNumber, AslGbl_LogicalLineNumber,
10056f1f1a63SJung-uk Kim         AslGbl_CurrentLineOffset, AslGbl_CurrentColumn,
10066f1f1a63SJung-uk Kim         AslGbl_Files[ASL_FILE_INPUT].Filename, NULL);
1007eef1b955SJung-uk Kim     return (FALSE);
1008eef1b955SJung-uk Kim 
1009eef1b955SJung-uk Kim 
1010eef1b955SJung-uk Kim CompletedString:
1011eef1b955SJung-uk Kim     /*
1012eef1b955SJung-uk Kim      * Null terminate the input string and copy string to a new buffer
1013eef1b955SJung-uk Kim      */
1014eef1b955SJung-uk Kim     *StringBuffer = 0;
1015eef1b955SJung-uk Kim 
10166f1f1a63SJung-uk Kim     CleanString = UtLocalCacheCalloc (strlen (AslGbl_MsgBuffer) + 1);
10176f1f1a63SJung-uk Kim     strcpy (CleanString, AslGbl_MsgBuffer);
1018eef1b955SJung-uk Kim     AslCompilerlval.s = CleanString;
1019eef1b955SJung-uk Kim     return (TRUE);
1020eef1b955SJung-uk Kim 
1021eef1b955SJung-uk Kim 
1022eef1b955SJung-uk Kim BufferOverflow:
1023eef1b955SJung-uk Kim 
1024eef1b955SJung-uk Kim     /* Literal was too long */
1025eef1b955SJung-uk Kim 
1026eef1b955SJung-uk Kim     AslCommonError (ASL_ERROR, ASL_MSG_STRING_LENGTH,
10276f1f1a63SJung-uk Kim         AslGbl_CurrentLineNumber, AslGbl_LogicalLineNumber,
10286f1f1a63SJung-uk Kim         AslGbl_CurrentLineOffset, AslGbl_CurrentColumn,
10296f1f1a63SJung-uk Kim         AslGbl_Files[ASL_FILE_INPUT].Filename, "Max length 4096");
1030eef1b955SJung-uk Kim     return (FALSE);
1031eef1b955SJung-uk Kim }
1032