xref: /freebsd/sys/contrib/dev/acpica/compiler/aslsupport.l (revision eef1b955be5a82b4afee3810ab7995127a5133fe)
1*eef1b955SJung-uk Kim 
2*eef1b955SJung-uk Kim /******************************************************************************
3*eef1b955SJung-uk Kim  *
4*eef1b955SJung-uk Kim  * Module Name: aslsupport.l - Flex/lex scanner C support routines.
5*eef1b955SJung-uk Kim  *              NOTE: Included into aslcompile.l, not compiled by itself.
6*eef1b955SJung-uk Kim  *
7*eef1b955SJung-uk Kim  *****************************************************************************/
8*eef1b955SJung-uk Kim 
9*eef1b955SJung-uk Kim /*
10*eef1b955SJung-uk Kim  * Copyright (C) 2000 - 2012, Intel Corp.
11*eef1b955SJung-uk Kim  * All rights reserved.
12*eef1b955SJung-uk Kim  *
13*eef1b955SJung-uk Kim  * Redistribution and use in source and binary forms, with or without
14*eef1b955SJung-uk Kim  * modification, are permitted provided that the following conditions
15*eef1b955SJung-uk Kim  * are met:
16*eef1b955SJung-uk Kim  * 1. Redistributions of source code must retain the above copyright
17*eef1b955SJung-uk Kim  *    notice, this list of conditions, and the following disclaimer,
18*eef1b955SJung-uk Kim  *    without modification.
19*eef1b955SJung-uk Kim  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
20*eef1b955SJung-uk Kim  *    substantially similar to the "NO WARRANTY" disclaimer below
21*eef1b955SJung-uk Kim  *    ("Disclaimer") and any redistribution must be conditioned upon
22*eef1b955SJung-uk Kim  *    including a substantially similar Disclaimer requirement for further
23*eef1b955SJung-uk Kim  *    binary redistribution.
24*eef1b955SJung-uk Kim  * 3. Neither the names of the above-listed copyright holders nor the names
25*eef1b955SJung-uk Kim  *    of any contributors may be used to endorse or promote products derived
26*eef1b955SJung-uk Kim  *    from this software without specific prior written permission.
27*eef1b955SJung-uk Kim  *
28*eef1b955SJung-uk Kim  * Alternatively, this software may be distributed under the terms of the
29*eef1b955SJung-uk Kim  * GNU General Public License ("GPL") version 2 as published by the Free
30*eef1b955SJung-uk Kim  * Software Foundation.
31*eef1b955SJung-uk Kim  *
32*eef1b955SJung-uk Kim  * NO WARRANTY
33*eef1b955SJung-uk Kim  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
34*eef1b955SJung-uk Kim  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
35*eef1b955SJung-uk Kim  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
36*eef1b955SJung-uk Kim  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
37*eef1b955SJung-uk Kim  * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
38*eef1b955SJung-uk Kim  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
39*eef1b955SJung-uk Kim  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
40*eef1b955SJung-uk Kim  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
41*eef1b955SJung-uk Kim  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
42*eef1b955SJung-uk Kim  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
43*eef1b955SJung-uk Kim  * POSSIBILITY OF SUCH DAMAGES.
44*eef1b955SJung-uk Kim  */
45*eef1b955SJung-uk Kim 
46*eef1b955SJung-uk Kim 
47*eef1b955SJung-uk Kim /* Configuration */
48*eef1b955SJung-uk Kim 
49*eef1b955SJung-uk Kim #define ASL_SPACES_PER_TAB      4
50*eef1b955SJung-uk Kim 
51*eef1b955SJung-uk Kim #define ASL_NORMAL_CHAR         0
52*eef1b955SJung-uk Kim #define ASL_ESCAPE_SEQUENCE     1
53*eef1b955SJung-uk Kim #define ASL_OCTAL_CONSTANT      2
54*eef1b955SJung-uk Kim #define ASL_HEX_CONSTANT        3
55*eef1b955SJung-uk Kim 
56*eef1b955SJung-uk Kim 
57*eef1b955SJung-uk Kim /* File node - used for "Include" operator file stack */
58*eef1b955SJung-uk Kim 
59*eef1b955SJung-uk Kim typedef struct asl_file_node
60*eef1b955SJung-uk Kim {
61*eef1b955SJung-uk Kim     FILE                    *File;
62*eef1b955SJung-uk Kim     UINT32                  CurrentLineNumber;
63*eef1b955SJung-uk Kim     YY_BUFFER_STATE         State;
64*eef1b955SJung-uk Kim     char                    *Filename;
65*eef1b955SJung-uk Kim     struct asl_file_node    *Next;
66*eef1b955SJung-uk Kim 
67*eef1b955SJung-uk Kim } ASL_FILE_NODE;
68*eef1b955SJung-uk Kim 
69*eef1b955SJung-uk Kim /* File stack for the "Include" operator (NOT #include operator) */
70*eef1b955SJung-uk Kim 
71*eef1b955SJung-uk Kim ASL_FILE_NODE               *Gbl_IncludeFileStack = NULL;
72*eef1b955SJung-uk Kim 
73*eef1b955SJung-uk Kim 
74*eef1b955SJung-uk Kim /*******************************************************************************
75*eef1b955SJung-uk Kim  *
76*eef1b955SJung-uk Kim  * FUNCTION:    AslDoLineDirective
77*eef1b955SJung-uk Kim  *
78*eef1b955SJung-uk Kim  * PARAMETERS:  None. Uses input() to access current source code line
79*eef1b955SJung-uk Kim  *
80*eef1b955SJung-uk Kim  * RETURN:      Updates global line number and filename
81*eef1b955SJung-uk Kim  *
82*eef1b955SJung-uk Kim  * DESCRIPTION: Handle #line directives emitted by the preprocessor.
83*eef1b955SJung-uk Kim  *
84*eef1b955SJung-uk Kim  * The #line directive is emitted by the preprocesser, and is used to
85*eef1b955SJung-uk Kim  * pass through line numbers from the original source code file to the
86*eef1b955SJung-uk Kim  * preprocessor output file (.i). This allows any compiler-generated
87*eef1b955SJung-uk Kim  * error messages to be displayed with the correct line number.
88*eef1b955SJung-uk Kim  *
89*eef1b955SJung-uk Kim  ******************************************************************************/
90*eef1b955SJung-uk Kim 
91*eef1b955SJung-uk Kim static void
92*eef1b955SJung-uk Kim AslDoLineDirective (
93*eef1b955SJung-uk Kim     void)
94*eef1b955SJung-uk Kim {
95*eef1b955SJung-uk Kim     char                    c;
96*eef1b955SJung-uk Kim     char                    *Token;
97*eef1b955SJung-uk Kim     UINT32                  LineNumber;
98*eef1b955SJung-uk Kim     char                    *Filename;
99*eef1b955SJung-uk Kim 
100*eef1b955SJung-uk Kim 
101*eef1b955SJung-uk Kim     /* Eat the entire line that contains the #line directive */
102*eef1b955SJung-uk Kim 
103*eef1b955SJung-uk Kim     while ((c = (char) input()) != '\n' && c != EOF)
104*eef1b955SJung-uk Kim     {
105*eef1b955SJung-uk Kim         AslInsertLineBuffer (c);
106*eef1b955SJung-uk Kim     }
107*eef1b955SJung-uk Kim     AslInsertLineBuffer (0);
108*eef1b955SJung-uk Kim 
109*eef1b955SJung-uk Kim     /* First argument is the actual line number */
110*eef1b955SJung-uk Kim 
111*eef1b955SJung-uk Kim     Token = strtok (Gbl_CurrentLineBuffer, " ");
112*eef1b955SJung-uk Kim     if (!Token)
113*eef1b955SJung-uk Kim     {
114*eef1b955SJung-uk Kim         goto ResetAndExit;
115*eef1b955SJung-uk Kim     }
116*eef1b955SJung-uk Kim 
117*eef1b955SJung-uk Kim     /* Convert line number. Subtract one to handle _this_ line */
118*eef1b955SJung-uk Kim 
119*eef1b955SJung-uk Kim     LineNumber = (UINT32) UtDoConstant (Token);
120*eef1b955SJung-uk Kim     FlSetLineNumber (LineNumber - 1);
121*eef1b955SJung-uk Kim 
122*eef1b955SJung-uk Kim     /* Second argument is the optional filename (in double quotes) */
123*eef1b955SJung-uk Kim 
124*eef1b955SJung-uk Kim     Token = strtok (NULL, " \"");
125*eef1b955SJung-uk Kim     if (Token)
126*eef1b955SJung-uk Kim     {
127*eef1b955SJung-uk Kim         Filename = ACPI_ALLOCATE_ZEROED (strlen (Token) + 1);
128*eef1b955SJung-uk Kim         strcpy (Filename, Token);
129*eef1b955SJung-uk Kim         FlSetFilename (Filename);
130*eef1b955SJung-uk Kim     }
131*eef1b955SJung-uk Kim 
132*eef1b955SJung-uk Kim     /* Third argument is not supported at this time */
133*eef1b955SJung-uk Kim 
134*eef1b955SJung-uk Kim ResetAndExit:
135*eef1b955SJung-uk Kim     AslResetCurrentLineBuffer ();
136*eef1b955SJung-uk Kim }
137*eef1b955SJung-uk Kim 
138*eef1b955SJung-uk Kim 
139*eef1b955SJung-uk Kim /*******************************************************************************
140*eef1b955SJung-uk Kim  *
141*eef1b955SJung-uk Kim  * FUNCTION:    AslPopInputFileStack
142*eef1b955SJung-uk Kim  *
143*eef1b955SJung-uk Kim  * PARAMETERS:  None
144*eef1b955SJung-uk Kim  *
145*eef1b955SJung-uk Kim  * RETURN:      0 if a node was popped, -1 otherwise
146*eef1b955SJung-uk Kim  *
147*eef1b955SJung-uk Kim  * DESCRIPTION: Pop the top of the input file stack and point the parser to
148*eef1b955SJung-uk Kim  *              the saved parse buffer contained in the fnode.  Also, set the
149*eef1b955SJung-uk Kim  *              global line counters to the saved values.  This function is
150*eef1b955SJung-uk Kim  *              called when an include file reaches EOF.
151*eef1b955SJung-uk Kim  *
152*eef1b955SJung-uk Kim  ******************************************************************************/
153*eef1b955SJung-uk Kim 
154*eef1b955SJung-uk Kim int
155*eef1b955SJung-uk Kim AslPopInputFileStack (
156*eef1b955SJung-uk Kim     void)
157*eef1b955SJung-uk Kim {
158*eef1b955SJung-uk Kim     ASL_FILE_NODE           *Fnode;
159*eef1b955SJung-uk Kim 
160*eef1b955SJung-uk Kim 
161*eef1b955SJung-uk Kim     Fnode = Gbl_IncludeFileStack;
162*eef1b955SJung-uk Kim     DbgPrint (ASL_PARSE_OUTPUT, "\nPop InputFile Stack, Fnode %p\n\n", Fnode);
163*eef1b955SJung-uk Kim 
164*eef1b955SJung-uk Kim     if (!Fnode)
165*eef1b955SJung-uk Kim     {
166*eef1b955SJung-uk Kim         return (-1);
167*eef1b955SJung-uk Kim     }
168*eef1b955SJung-uk Kim 
169*eef1b955SJung-uk Kim     /* Close the current include file */
170*eef1b955SJung-uk Kim 
171*eef1b955SJung-uk Kim     fclose (yyin);
172*eef1b955SJung-uk Kim 
173*eef1b955SJung-uk Kim     /* Update the top-of-stack */
174*eef1b955SJung-uk Kim 
175*eef1b955SJung-uk Kim     Gbl_IncludeFileStack = Fnode->Next;
176*eef1b955SJung-uk Kim 
177*eef1b955SJung-uk Kim     /* Reset global line counter and filename */
178*eef1b955SJung-uk Kim 
179*eef1b955SJung-uk Kim     Gbl_Files[ASL_FILE_INPUT].Filename = Fnode->Filename;
180*eef1b955SJung-uk Kim     Gbl_CurrentLineNumber = Fnode->CurrentLineNumber;
181*eef1b955SJung-uk Kim 
182*eef1b955SJung-uk Kim     /* Point the parser to the popped file */
183*eef1b955SJung-uk Kim 
184*eef1b955SJung-uk Kim     yy_delete_buffer (YY_CURRENT_BUFFER);
185*eef1b955SJung-uk Kim     yy_switch_to_buffer (Fnode->State);
186*eef1b955SJung-uk Kim 
187*eef1b955SJung-uk Kim     /* All done with this node */
188*eef1b955SJung-uk Kim 
189*eef1b955SJung-uk Kim     ACPI_FREE (Fnode);
190*eef1b955SJung-uk Kim     return (0);
191*eef1b955SJung-uk Kim }
192*eef1b955SJung-uk Kim 
193*eef1b955SJung-uk Kim 
194*eef1b955SJung-uk Kim /*******************************************************************************
195*eef1b955SJung-uk Kim  *
196*eef1b955SJung-uk Kim  * FUNCTION:    AslPushInputFileStack
197*eef1b955SJung-uk Kim  *
198*eef1b955SJung-uk Kim  * PARAMETERS:  InputFile           - Open file pointer
199*eef1b955SJung-uk Kim  *              Filename            - Name of the file
200*eef1b955SJung-uk Kim  *
201*eef1b955SJung-uk Kim  * RETURN:      None
202*eef1b955SJung-uk Kim  *
203*eef1b955SJung-uk Kim  * DESCRIPTION: Push the InputFile onto the file stack, and point the parser
204*eef1b955SJung-uk Kim  *              to this file.  Called when an include file is successfully
205*eef1b955SJung-uk Kim  *              opened.
206*eef1b955SJung-uk Kim  *
207*eef1b955SJung-uk Kim  ******************************************************************************/
208*eef1b955SJung-uk Kim 
209*eef1b955SJung-uk Kim void
210*eef1b955SJung-uk Kim AslPushInputFileStack (
211*eef1b955SJung-uk Kim     FILE                    *InputFile,
212*eef1b955SJung-uk Kim     char                    *Filename)
213*eef1b955SJung-uk Kim {
214*eef1b955SJung-uk Kim     ASL_FILE_NODE           *Fnode;
215*eef1b955SJung-uk Kim     YY_BUFFER_STATE         State;
216*eef1b955SJung-uk Kim 
217*eef1b955SJung-uk Kim 
218*eef1b955SJung-uk Kim     /* Save the current state in an Fnode */
219*eef1b955SJung-uk Kim 
220*eef1b955SJung-uk Kim     Fnode = UtLocalCalloc (sizeof (ASL_FILE_NODE));
221*eef1b955SJung-uk Kim 
222*eef1b955SJung-uk Kim     Fnode->File                 = yyin;
223*eef1b955SJung-uk Kim     Fnode->Next                 = Gbl_IncludeFileStack;
224*eef1b955SJung-uk Kim     Fnode->State                = YY_CURRENT_BUFFER;
225*eef1b955SJung-uk Kim     Fnode->CurrentLineNumber    = Gbl_CurrentLineNumber;
226*eef1b955SJung-uk Kim     Fnode->Filename             = Gbl_Files[ASL_FILE_INPUT].Filename;
227*eef1b955SJung-uk Kim 
228*eef1b955SJung-uk Kim     /* Push it on the stack */
229*eef1b955SJung-uk Kim 
230*eef1b955SJung-uk Kim     Gbl_IncludeFileStack = Fnode;
231*eef1b955SJung-uk Kim 
232*eef1b955SJung-uk Kim     /* Point the parser to this file */
233*eef1b955SJung-uk Kim 
234*eef1b955SJung-uk Kim     State = yy_create_buffer (InputFile, YY_BUF_SIZE);
235*eef1b955SJung-uk Kim     yy_switch_to_buffer (State);
236*eef1b955SJung-uk Kim 
237*eef1b955SJung-uk Kim     DbgPrint (ASL_PARSE_OUTPUT, "\nPush InputFile Stack, returning %p\n\n", InputFile);
238*eef1b955SJung-uk Kim 
239*eef1b955SJung-uk Kim     /* Reset the global line count and filename */
240*eef1b955SJung-uk Kim 
241*eef1b955SJung-uk Kim     Gbl_Files[ASL_FILE_INPUT].Filename = Filename;
242*eef1b955SJung-uk Kim     Gbl_CurrentLineNumber = 1;
243*eef1b955SJung-uk Kim     yyin = InputFile;
244*eef1b955SJung-uk Kim }
245*eef1b955SJung-uk Kim 
246*eef1b955SJung-uk Kim 
247*eef1b955SJung-uk Kim /*******************************************************************************
248*eef1b955SJung-uk Kim  *
249*eef1b955SJung-uk Kim  * FUNCTION:    AslResetCurrentLineBuffer
250*eef1b955SJung-uk Kim  *
251*eef1b955SJung-uk Kim  * PARAMETERS:  None
252*eef1b955SJung-uk Kim  *
253*eef1b955SJung-uk Kim  * RETURN:      None
254*eef1b955SJung-uk Kim  *
255*eef1b955SJung-uk Kim  * DESCRIPTION: Reset the Line Buffer to zero, increment global line numbers.
256*eef1b955SJung-uk Kim  *
257*eef1b955SJung-uk Kim  ******************************************************************************/
258*eef1b955SJung-uk Kim 
259*eef1b955SJung-uk Kim void
260*eef1b955SJung-uk Kim AslResetCurrentLineBuffer (
261*eef1b955SJung-uk Kim     void)
262*eef1b955SJung-uk Kim {
263*eef1b955SJung-uk Kim 
264*eef1b955SJung-uk Kim     if (Gbl_Files[ASL_FILE_SOURCE_OUTPUT].Handle)
265*eef1b955SJung-uk Kim     {
266*eef1b955SJung-uk Kim         FlWriteFile (ASL_FILE_SOURCE_OUTPUT, Gbl_CurrentLineBuffer,
267*eef1b955SJung-uk Kim             Gbl_LineBufPtr - Gbl_CurrentLineBuffer);
268*eef1b955SJung-uk Kim     }
269*eef1b955SJung-uk Kim 
270*eef1b955SJung-uk Kim     Gbl_CurrentLineOffset += Gbl_CurrentColumn;
271*eef1b955SJung-uk Kim     Gbl_CurrentColumn = 0;
272*eef1b955SJung-uk Kim 
273*eef1b955SJung-uk Kim     Gbl_CurrentLineNumber++;
274*eef1b955SJung-uk Kim     Gbl_LogicalLineNumber++;
275*eef1b955SJung-uk Kim     Gbl_LineBufPtr = Gbl_CurrentLineBuffer;
276*eef1b955SJung-uk Kim }
277*eef1b955SJung-uk Kim 
278*eef1b955SJung-uk Kim 
279*eef1b955SJung-uk Kim /*******************************************************************************
280*eef1b955SJung-uk Kim  *
281*eef1b955SJung-uk Kim  * FUNCTION:    AslInsertLineBuffer
282*eef1b955SJung-uk Kim  *
283*eef1b955SJung-uk Kim  * PARAMETERS:  SourceChar      - One char from the input ASL source file
284*eef1b955SJung-uk Kim  *
285*eef1b955SJung-uk Kim  * RETURN:      None
286*eef1b955SJung-uk Kim  *
287*eef1b955SJung-uk Kim  * DESCRIPTION: Put one character of the source file into the temp line buffer
288*eef1b955SJung-uk Kim  *
289*eef1b955SJung-uk Kim  ******************************************************************************/
290*eef1b955SJung-uk Kim 
291*eef1b955SJung-uk Kim void
292*eef1b955SJung-uk Kim AslInsertLineBuffer (
293*eef1b955SJung-uk Kim     int                     SourceChar)
294*eef1b955SJung-uk Kim {
295*eef1b955SJung-uk Kim     UINT32                  i;
296*eef1b955SJung-uk Kim     UINT32                  Count = 1;
297*eef1b955SJung-uk Kim 
298*eef1b955SJung-uk Kim 
299*eef1b955SJung-uk Kim     if (SourceChar == EOF)
300*eef1b955SJung-uk Kim     {
301*eef1b955SJung-uk Kim         return;
302*eef1b955SJung-uk Kim     }
303*eef1b955SJung-uk Kim 
304*eef1b955SJung-uk Kim     Gbl_InputByteCount++;
305*eef1b955SJung-uk Kim 
306*eef1b955SJung-uk Kim     /* Handle tabs.  Convert to spaces */
307*eef1b955SJung-uk Kim 
308*eef1b955SJung-uk Kim     if (SourceChar == '\t')
309*eef1b955SJung-uk Kim     {
310*eef1b955SJung-uk Kim         SourceChar = ' ';
311*eef1b955SJung-uk Kim         Count = ASL_SPACES_PER_TAB -
312*eef1b955SJung-uk Kim                     (Gbl_CurrentColumn & (ASL_SPACES_PER_TAB-1));
313*eef1b955SJung-uk Kim     }
314*eef1b955SJung-uk Kim 
315*eef1b955SJung-uk Kim     for (i = 0; i < Count; i++)
316*eef1b955SJung-uk Kim     {
317*eef1b955SJung-uk Kim         Gbl_CurrentColumn++;
318*eef1b955SJung-uk Kim 
319*eef1b955SJung-uk Kim         /* Insert the character into the line buffer */
320*eef1b955SJung-uk Kim 
321*eef1b955SJung-uk Kim         *Gbl_LineBufPtr = (UINT8) SourceChar;
322*eef1b955SJung-uk Kim         Gbl_LineBufPtr++;
323*eef1b955SJung-uk Kim 
324*eef1b955SJung-uk Kim         if (Gbl_LineBufPtr > (Gbl_CurrentLineBuffer + (ASL_LINE_BUFFER_SIZE - 1)))
325*eef1b955SJung-uk Kim         {
326*eef1b955SJung-uk Kim #if 0
327*eef1b955SJung-uk Kim             /*
328*eef1b955SJung-uk Kim              * Warning if we have split a long source line.
329*eef1b955SJung-uk Kim              * <Probably overkill>
330*eef1b955SJung-uk Kim              */
331*eef1b955SJung-uk Kim             sprintf (MsgBuffer, "Max %u", ASL_LINE_BUFFER_SIZE);
332*eef1b955SJung-uk Kim             AslCommonError (ASL_WARNING, ASL_MSG_LONG_LINE,
333*eef1b955SJung-uk Kim                             Gbl_CurrentLineNumber, Gbl_LogicalLineNumber,
334*eef1b955SJung-uk Kim                             Gbl_CurrentLineOffset, Gbl_CurrentColumn,
335*eef1b955SJung-uk Kim                             Gbl_Files[ASL_FILE_INPUT].Filename, MsgBuffer);
336*eef1b955SJung-uk Kim #endif
337*eef1b955SJung-uk Kim 
338*eef1b955SJung-uk Kim             AslResetCurrentLineBuffer ();
339*eef1b955SJung-uk Kim         }
340*eef1b955SJung-uk Kim         else if (SourceChar == '\n')
341*eef1b955SJung-uk Kim         {
342*eef1b955SJung-uk Kim             /* End of line */
343*eef1b955SJung-uk Kim 
344*eef1b955SJung-uk Kim             AslResetCurrentLineBuffer ();
345*eef1b955SJung-uk Kim         }
346*eef1b955SJung-uk Kim     }
347*eef1b955SJung-uk Kim }
348*eef1b955SJung-uk Kim 
349*eef1b955SJung-uk Kim 
350*eef1b955SJung-uk Kim /*******************************************************************************
351*eef1b955SJung-uk Kim  *
352*eef1b955SJung-uk Kim  * FUNCTION:    count
353*eef1b955SJung-uk Kim  *
354*eef1b955SJung-uk Kim  * PARAMETERS:  yytext      - Contains the matched keyword.
355*eef1b955SJung-uk Kim  *              Type        - Keyword/Character type:
356*eef1b955SJung-uk Kim  *                             0 = anything except a keyword
357*eef1b955SJung-uk Kim  *                             1 = pseudo-keywords
358*eef1b955SJung-uk Kim  *                             2 = non-executable ASL keywords
359*eef1b955SJung-uk Kim  *                             3 = executable ASL keywords
360*eef1b955SJung-uk Kim  *
361*eef1b955SJung-uk Kim  * RETURN:      None
362*eef1b955SJung-uk Kim  *
363*eef1b955SJung-uk Kim  * DESCRIPTION: Count keywords and put them into the line buffer
364*eef1b955SJung-uk Kim  *
365*eef1b955SJung-uk Kim  ******************************************************************************/
366*eef1b955SJung-uk Kim 
367*eef1b955SJung-uk Kim static void
368*eef1b955SJung-uk Kim count (
369*eef1b955SJung-uk Kim     int                 Type)
370*eef1b955SJung-uk Kim {
371*eef1b955SJung-uk Kim     int                 i;
372*eef1b955SJung-uk Kim 
373*eef1b955SJung-uk Kim 
374*eef1b955SJung-uk Kim     switch (Type)
375*eef1b955SJung-uk Kim     {
376*eef1b955SJung-uk Kim     case 2:
377*eef1b955SJung-uk Kim         TotalKeywords++;
378*eef1b955SJung-uk Kim         TotalNamedObjects++;
379*eef1b955SJung-uk Kim         break;
380*eef1b955SJung-uk Kim 
381*eef1b955SJung-uk Kim     case 3:
382*eef1b955SJung-uk Kim         TotalKeywords++;
383*eef1b955SJung-uk Kim         TotalExecutableOpcodes++;
384*eef1b955SJung-uk Kim         break;
385*eef1b955SJung-uk Kim     }
386*eef1b955SJung-uk Kim 
387*eef1b955SJung-uk Kim     for (i = 0; (yytext[i] != 0) && (yytext[i] != EOF); i++)
388*eef1b955SJung-uk Kim     {
389*eef1b955SJung-uk Kim         AslInsertLineBuffer (yytext[i]);
390*eef1b955SJung-uk Kim         *Gbl_LineBufPtr = 0;
391*eef1b955SJung-uk Kim     }
392*eef1b955SJung-uk Kim }
393*eef1b955SJung-uk Kim 
394*eef1b955SJung-uk Kim 
395*eef1b955SJung-uk Kim /*******************************************************************************
396*eef1b955SJung-uk Kim  *
397*eef1b955SJung-uk Kim  * FUNCTION:    AslDoComment
398*eef1b955SJung-uk Kim  *
399*eef1b955SJung-uk Kim  * PARAMETERS:  none
400*eef1b955SJung-uk Kim  *
401*eef1b955SJung-uk Kim  * RETURN:      none
402*eef1b955SJung-uk Kim  *
403*eef1b955SJung-uk Kim  * DESCRIPTION: Process a standard comment.
404*eef1b955SJung-uk Kim  *
405*eef1b955SJung-uk Kim  ******************************************************************************/
406*eef1b955SJung-uk Kim 
407*eef1b955SJung-uk Kim static char
408*eef1b955SJung-uk Kim AslDoComment (
409*eef1b955SJung-uk Kim     void)
410*eef1b955SJung-uk Kim {
411*eef1b955SJung-uk Kim     char                c;
412*eef1b955SJung-uk Kim     char                c1 = 0;
413*eef1b955SJung-uk Kim 
414*eef1b955SJung-uk Kim 
415*eef1b955SJung-uk Kim     AslInsertLineBuffer ('/');
416*eef1b955SJung-uk Kim     AslInsertLineBuffer ('*');
417*eef1b955SJung-uk Kim 
418*eef1b955SJung-uk Kim loop:
419*eef1b955SJung-uk Kim 
420*eef1b955SJung-uk Kim     /* Eat chars until end-of-comment */
421*eef1b955SJung-uk Kim 
422*eef1b955SJung-uk Kim     while ((c = (char) input()) != '*' && c != EOF)
423*eef1b955SJung-uk Kim     {
424*eef1b955SJung-uk Kim         AslInsertLineBuffer (c);
425*eef1b955SJung-uk Kim         c1 = c;
426*eef1b955SJung-uk Kim     }
427*eef1b955SJung-uk Kim 
428*eef1b955SJung-uk Kim     if (c == EOF)
429*eef1b955SJung-uk Kim     {
430*eef1b955SJung-uk Kim         goto EarlyEOF;
431*eef1b955SJung-uk Kim     }
432*eef1b955SJung-uk Kim 
433*eef1b955SJung-uk Kim     /*
434*eef1b955SJung-uk Kim      * Check for nested comment -- can help catch cases where a previous
435*eef1b955SJung-uk Kim      * comment was accidently left unterminated
436*eef1b955SJung-uk Kim      */
437*eef1b955SJung-uk Kim     if ((c1 == '/') && (c == '*'))
438*eef1b955SJung-uk Kim     {
439*eef1b955SJung-uk Kim         AslCommonError (ASL_WARNING, ASL_MSG_NESTED_COMMENT,
440*eef1b955SJung-uk Kim                         Gbl_CurrentLineNumber, Gbl_LogicalLineNumber,
441*eef1b955SJung-uk Kim                         Gbl_InputByteCount, Gbl_CurrentColumn,
442*eef1b955SJung-uk Kim                         Gbl_Files[ASL_FILE_INPUT].Filename, NULL);
443*eef1b955SJung-uk Kim     }
444*eef1b955SJung-uk Kim 
445*eef1b955SJung-uk Kim     /* Comment is closed only if the NEXT character is a slash */
446*eef1b955SJung-uk Kim 
447*eef1b955SJung-uk Kim     AslInsertLineBuffer (c);
448*eef1b955SJung-uk Kim 
449*eef1b955SJung-uk Kim     if ((c1 = (char) input()) != '/' && c1 != EOF)
450*eef1b955SJung-uk Kim     {
451*eef1b955SJung-uk Kim         unput(c1);
452*eef1b955SJung-uk Kim         goto loop;
453*eef1b955SJung-uk Kim     }
454*eef1b955SJung-uk Kim 
455*eef1b955SJung-uk Kim     if (c1 == EOF)
456*eef1b955SJung-uk Kim     {
457*eef1b955SJung-uk Kim         goto EarlyEOF;
458*eef1b955SJung-uk Kim     }
459*eef1b955SJung-uk Kim 
460*eef1b955SJung-uk Kim     AslInsertLineBuffer (c1);
461*eef1b955SJung-uk Kim     return (TRUE);
462*eef1b955SJung-uk Kim 
463*eef1b955SJung-uk Kim 
464*eef1b955SJung-uk Kim EarlyEOF:
465*eef1b955SJung-uk Kim     /*
466*eef1b955SJung-uk Kim      * Premature End-Of-File
467*eef1b955SJung-uk Kim      */
468*eef1b955SJung-uk Kim     AslCommonError (ASL_ERROR, ASL_MSG_EARLY_EOF,
469*eef1b955SJung-uk Kim                     Gbl_CurrentLineNumber, Gbl_LogicalLineNumber,
470*eef1b955SJung-uk Kim                     Gbl_CurrentLineOffset, Gbl_CurrentColumn,
471*eef1b955SJung-uk Kim                     Gbl_Files[ASL_FILE_INPUT].Filename, NULL);
472*eef1b955SJung-uk Kim     return (FALSE);
473*eef1b955SJung-uk Kim }
474*eef1b955SJung-uk Kim 
475*eef1b955SJung-uk Kim 
476*eef1b955SJung-uk Kim /*******************************************************************************
477*eef1b955SJung-uk Kim  *
478*eef1b955SJung-uk Kim  * FUNCTION:    AslDoCommentType2
479*eef1b955SJung-uk Kim  *
480*eef1b955SJung-uk Kim  * PARAMETERS:  none
481*eef1b955SJung-uk Kim  *
482*eef1b955SJung-uk Kim  * RETURN:      none
483*eef1b955SJung-uk Kim  *
484*eef1b955SJung-uk Kim  * DESCRIPTION: Process a new "//" comment.
485*eef1b955SJung-uk Kim  *
486*eef1b955SJung-uk Kim  ******************************************************************************/
487*eef1b955SJung-uk Kim 
488*eef1b955SJung-uk Kim static char
489*eef1b955SJung-uk Kim AslDoCommentType2 (
490*eef1b955SJung-uk Kim     void)
491*eef1b955SJung-uk Kim {
492*eef1b955SJung-uk Kim     char                c;
493*eef1b955SJung-uk Kim 
494*eef1b955SJung-uk Kim 
495*eef1b955SJung-uk Kim     AslInsertLineBuffer ('/');
496*eef1b955SJung-uk Kim     AslInsertLineBuffer ('/');
497*eef1b955SJung-uk Kim 
498*eef1b955SJung-uk Kim     while ((c = (char) input()) != '\n' && c != EOF)
499*eef1b955SJung-uk Kim     {
500*eef1b955SJung-uk Kim         AslInsertLineBuffer (c);
501*eef1b955SJung-uk Kim     }
502*eef1b955SJung-uk Kim 
503*eef1b955SJung-uk Kim     if (c == EOF)
504*eef1b955SJung-uk Kim     {
505*eef1b955SJung-uk Kim         /* End of file is OK, change to newline. Let parser detect EOF later */
506*eef1b955SJung-uk Kim 
507*eef1b955SJung-uk Kim         c = '\n';
508*eef1b955SJung-uk Kim     }
509*eef1b955SJung-uk Kim 
510*eef1b955SJung-uk Kim     AslInsertLineBuffer (c);
511*eef1b955SJung-uk Kim     return (TRUE);
512*eef1b955SJung-uk Kim }
513*eef1b955SJung-uk Kim 
514*eef1b955SJung-uk Kim 
515*eef1b955SJung-uk Kim /*******************************************************************************
516*eef1b955SJung-uk Kim  *
517*eef1b955SJung-uk Kim  * FUNCTION:    AslDoStringLiteral
518*eef1b955SJung-uk Kim  *
519*eef1b955SJung-uk Kim  * PARAMETERS:  none
520*eef1b955SJung-uk Kim  *
521*eef1b955SJung-uk Kim  * RETURN:      none
522*eef1b955SJung-uk Kim  *
523*eef1b955SJung-uk Kim  * DESCRIPTION: Process a string literal (surrounded by quotes)
524*eef1b955SJung-uk Kim  *
525*eef1b955SJung-uk Kim  ******************************************************************************/
526*eef1b955SJung-uk Kim 
527*eef1b955SJung-uk Kim static char
528*eef1b955SJung-uk Kim AslDoStringLiteral (
529*eef1b955SJung-uk Kim     void)
530*eef1b955SJung-uk Kim {
531*eef1b955SJung-uk Kim     char                *StringBuffer = MsgBuffer;
532*eef1b955SJung-uk Kim     char                *EndBuffer = MsgBuffer + ASL_MSG_BUFFER_SIZE;
533*eef1b955SJung-uk Kim     char                *CleanString;
534*eef1b955SJung-uk Kim     char                StringChar;
535*eef1b955SJung-uk Kim     UINT32              State = ASL_NORMAL_CHAR;
536*eef1b955SJung-uk Kim     UINT32              i = 0;
537*eef1b955SJung-uk Kim     UINT8               Digit;
538*eef1b955SJung-uk Kim     char                ConvertBuffer[4];
539*eef1b955SJung-uk Kim 
540*eef1b955SJung-uk Kim 
541*eef1b955SJung-uk Kim     /*
542*eef1b955SJung-uk Kim      * Eat chars until end-of-literal.
543*eef1b955SJung-uk Kim      * NOTE:  Put back the original surrounding quotes into the
544*eef1b955SJung-uk Kim      * source line buffer.
545*eef1b955SJung-uk Kim      */
546*eef1b955SJung-uk Kim     AslInsertLineBuffer ('\"');
547*eef1b955SJung-uk Kim     while ((StringChar = (char) input()) != EOF)
548*eef1b955SJung-uk Kim     {
549*eef1b955SJung-uk Kim         AslInsertLineBuffer (StringChar);
550*eef1b955SJung-uk Kim 
551*eef1b955SJung-uk Kim DoCharacter:
552*eef1b955SJung-uk Kim 
553*eef1b955SJung-uk Kim         switch (State)
554*eef1b955SJung-uk Kim         {
555*eef1b955SJung-uk Kim         case ASL_NORMAL_CHAR:
556*eef1b955SJung-uk Kim 
557*eef1b955SJung-uk Kim             switch (StringChar)
558*eef1b955SJung-uk Kim             {
559*eef1b955SJung-uk Kim             case '\\':
560*eef1b955SJung-uk Kim                 /*
561*eef1b955SJung-uk Kim                  * Special handling for backslash-escape sequence.  We will
562*eef1b955SJung-uk Kim                  * toss the backslash and translate the escape char(s).
563*eef1b955SJung-uk Kim                  */
564*eef1b955SJung-uk Kim                 State = ASL_ESCAPE_SEQUENCE;
565*eef1b955SJung-uk Kim                 continue;
566*eef1b955SJung-uk Kim 
567*eef1b955SJung-uk Kim             case '\"':
568*eef1b955SJung-uk Kim 
569*eef1b955SJung-uk Kim                 /* String terminator */
570*eef1b955SJung-uk Kim 
571*eef1b955SJung-uk Kim                 goto CompletedString;
572*eef1b955SJung-uk Kim             }
573*eef1b955SJung-uk Kim             break;
574*eef1b955SJung-uk Kim 
575*eef1b955SJung-uk Kim 
576*eef1b955SJung-uk Kim         case ASL_ESCAPE_SEQUENCE:
577*eef1b955SJung-uk Kim 
578*eef1b955SJung-uk Kim             State = ASL_NORMAL_CHAR;
579*eef1b955SJung-uk Kim             switch (StringChar)
580*eef1b955SJung-uk Kim             {
581*eef1b955SJung-uk Kim             case 'a':
582*eef1b955SJung-uk Kim                 StringChar = 0x07;      /* BELL */
583*eef1b955SJung-uk Kim                 break;
584*eef1b955SJung-uk Kim 
585*eef1b955SJung-uk Kim             case 'b':
586*eef1b955SJung-uk Kim                 StringChar = 0x08;      /* BACKSPACE */
587*eef1b955SJung-uk Kim                 break;
588*eef1b955SJung-uk Kim 
589*eef1b955SJung-uk Kim             case 'f':
590*eef1b955SJung-uk Kim                 StringChar = 0x0C;      /* FORMFEED */
591*eef1b955SJung-uk Kim                 break;
592*eef1b955SJung-uk Kim 
593*eef1b955SJung-uk Kim             case 'n':
594*eef1b955SJung-uk Kim                 StringChar = 0x0A;      /* LINEFEED */
595*eef1b955SJung-uk Kim                 break;
596*eef1b955SJung-uk Kim 
597*eef1b955SJung-uk Kim             case 'r':
598*eef1b955SJung-uk Kim                 StringChar = 0x0D;      /* CARRIAGE RETURN*/
599*eef1b955SJung-uk Kim                 break;
600*eef1b955SJung-uk Kim 
601*eef1b955SJung-uk Kim             case 't':
602*eef1b955SJung-uk Kim                 StringChar = 0x09;      /* HORIZONTAL TAB */
603*eef1b955SJung-uk Kim                 break;
604*eef1b955SJung-uk Kim 
605*eef1b955SJung-uk Kim             case 'v':
606*eef1b955SJung-uk Kim                 StringChar = 0x0B;      /* VERTICAL TAB */
607*eef1b955SJung-uk Kim                 break;
608*eef1b955SJung-uk Kim 
609*eef1b955SJung-uk Kim             case 'x':
610*eef1b955SJung-uk Kim                 State = ASL_HEX_CONSTANT;
611*eef1b955SJung-uk Kim                 i = 0;
612*eef1b955SJung-uk Kim                 continue;
613*eef1b955SJung-uk Kim 
614*eef1b955SJung-uk Kim             case '\'':                  /* Single Quote */
615*eef1b955SJung-uk Kim             case '\"':                  /* Double Quote */
616*eef1b955SJung-uk Kim             case '\\':                  /* Backslash */
617*eef1b955SJung-uk Kim                 break;
618*eef1b955SJung-uk Kim 
619*eef1b955SJung-uk Kim             default:
620*eef1b955SJung-uk Kim 
621*eef1b955SJung-uk Kim                 /* Check for an octal digit (0-7) */
622*eef1b955SJung-uk Kim 
623*eef1b955SJung-uk Kim                 if (ACPI_IS_OCTAL_DIGIT (StringChar))
624*eef1b955SJung-uk Kim                 {
625*eef1b955SJung-uk Kim                     State = ASL_OCTAL_CONSTANT;
626*eef1b955SJung-uk Kim                     ConvertBuffer[0] = StringChar;
627*eef1b955SJung-uk Kim                     i = 1;
628*eef1b955SJung-uk Kim                     continue;
629*eef1b955SJung-uk Kim                 }
630*eef1b955SJung-uk Kim 
631*eef1b955SJung-uk Kim                 /* Unknown escape sequence issue warning, but use the character */
632*eef1b955SJung-uk Kim 
633*eef1b955SJung-uk Kim                 AslCommonError (ASL_WARNING, ASL_MSG_INVALID_ESCAPE,
634*eef1b955SJung-uk Kim                                 Gbl_CurrentLineNumber, Gbl_LogicalLineNumber,
635*eef1b955SJung-uk Kim                                 Gbl_CurrentLineOffset, Gbl_CurrentColumn,
636*eef1b955SJung-uk Kim                                 Gbl_Files[ASL_FILE_INPUT].Filename, NULL);
637*eef1b955SJung-uk Kim                 break;
638*eef1b955SJung-uk Kim             }
639*eef1b955SJung-uk Kim             break;
640*eef1b955SJung-uk Kim 
641*eef1b955SJung-uk Kim 
642*eef1b955SJung-uk Kim         case ASL_OCTAL_CONSTANT:
643*eef1b955SJung-uk Kim 
644*eef1b955SJung-uk Kim             /* Up to three octal digits allowed */
645*eef1b955SJung-uk Kim 
646*eef1b955SJung-uk Kim             if (!ACPI_IS_OCTAL_DIGIT (StringChar) ||
647*eef1b955SJung-uk Kim                 (i > 2))
648*eef1b955SJung-uk Kim             {
649*eef1b955SJung-uk Kim                 /*
650*eef1b955SJung-uk Kim                  * Reached end of the constant.  Convert the assembled ASCII
651*eef1b955SJung-uk Kim                  * string and resume processing of the next character
652*eef1b955SJung-uk Kim                  */
653*eef1b955SJung-uk Kim                 ConvertBuffer[i] = 0;
654*eef1b955SJung-uk Kim                 Digit = (UINT8) ACPI_STRTOUL (ConvertBuffer, NULL, 8);
655*eef1b955SJung-uk Kim 
656*eef1b955SJung-uk Kim                 /* Check for NULL or non-ascii character (ignore if so) */
657*eef1b955SJung-uk Kim 
658*eef1b955SJung-uk Kim                 if ((Digit == 0) || (Digit > ACPI_ASCII_MAX))
659*eef1b955SJung-uk Kim                 {
660*eef1b955SJung-uk Kim                     AslCommonError (ASL_WARNING, ASL_MSG_INVALID_STRING,
661*eef1b955SJung-uk Kim                                     Gbl_CurrentLineNumber, Gbl_LogicalLineNumber,
662*eef1b955SJung-uk Kim                                     Gbl_CurrentLineOffset, Gbl_CurrentColumn,
663*eef1b955SJung-uk Kim                                     Gbl_Files[ASL_FILE_INPUT].Filename, NULL);
664*eef1b955SJung-uk Kim                 }
665*eef1b955SJung-uk Kim                 else
666*eef1b955SJung-uk Kim                 {
667*eef1b955SJung-uk Kim                     *StringBuffer = (char) Digit;
668*eef1b955SJung-uk Kim                     StringBuffer++;
669*eef1b955SJung-uk Kim                     if (StringBuffer >= EndBuffer)
670*eef1b955SJung-uk Kim                     {
671*eef1b955SJung-uk Kim                         goto BufferOverflow;
672*eef1b955SJung-uk Kim                     }
673*eef1b955SJung-uk Kim                 }
674*eef1b955SJung-uk Kim 
675*eef1b955SJung-uk Kim                 State = ASL_NORMAL_CHAR;
676*eef1b955SJung-uk Kim                 goto DoCharacter;
677*eef1b955SJung-uk Kim                 break;
678*eef1b955SJung-uk Kim             }
679*eef1b955SJung-uk Kim 
680*eef1b955SJung-uk Kim             /* Append another digit of the constant */
681*eef1b955SJung-uk Kim 
682*eef1b955SJung-uk Kim             ConvertBuffer[i] = StringChar;
683*eef1b955SJung-uk Kim             i++;
684*eef1b955SJung-uk Kim             continue;
685*eef1b955SJung-uk Kim 
686*eef1b955SJung-uk Kim 
687*eef1b955SJung-uk Kim         case ASL_HEX_CONSTANT:
688*eef1b955SJung-uk Kim 
689*eef1b955SJung-uk Kim             /* Up to two hex digits allowed */
690*eef1b955SJung-uk Kim 
691*eef1b955SJung-uk Kim             if (!ACPI_IS_XDIGIT (StringChar) ||
692*eef1b955SJung-uk Kim                 (i > 1))
693*eef1b955SJung-uk Kim             {
694*eef1b955SJung-uk Kim                 /*
695*eef1b955SJung-uk Kim                  * Reached end of the constant.  Convert the assembled ASCII
696*eef1b955SJung-uk Kim                  * string and resume processing of the next character
697*eef1b955SJung-uk Kim                  */
698*eef1b955SJung-uk Kim                 ConvertBuffer[i] = 0;
699*eef1b955SJung-uk Kim                 Digit = (UINT8) ACPI_STRTOUL (ConvertBuffer, NULL, 16);
700*eef1b955SJung-uk Kim 
701*eef1b955SJung-uk Kim                 /* Check for NULL or non-ascii character (ignore if so) */
702*eef1b955SJung-uk Kim 
703*eef1b955SJung-uk Kim                 if ((Digit == 0) || (Digit > ACPI_ASCII_MAX))
704*eef1b955SJung-uk Kim                 {
705*eef1b955SJung-uk Kim                     AslCommonError (ASL_WARNING, ASL_MSG_INVALID_STRING,
706*eef1b955SJung-uk Kim                                     Gbl_CurrentLineNumber, Gbl_LogicalLineNumber,
707*eef1b955SJung-uk Kim                                     Gbl_CurrentLineOffset, Gbl_CurrentColumn,
708*eef1b955SJung-uk Kim                                     Gbl_Files[ASL_FILE_INPUT].Filename, NULL);
709*eef1b955SJung-uk Kim                 }
710*eef1b955SJung-uk Kim                 else
711*eef1b955SJung-uk Kim                 {
712*eef1b955SJung-uk Kim                     *StringBuffer = (char) Digit;
713*eef1b955SJung-uk Kim                     StringBuffer++;
714*eef1b955SJung-uk Kim                     if (StringBuffer >= EndBuffer)
715*eef1b955SJung-uk Kim                     {
716*eef1b955SJung-uk Kim                         goto BufferOverflow;
717*eef1b955SJung-uk Kim                     }
718*eef1b955SJung-uk Kim                 }
719*eef1b955SJung-uk Kim 
720*eef1b955SJung-uk Kim                 State = ASL_NORMAL_CHAR;
721*eef1b955SJung-uk Kim                 goto DoCharacter;
722*eef1b955SJung-uk Kim                 break;
723*eef1b955SJung-uk Kim             }
724*eef1b955SJung-uk Kim 
725*eef1b955SJung-uk Kim             /* Append another digit of the constant */
726*eef1b955SJung-uk Kim 
727*eef1b955SJung-uk Kim             ConvertBuffer[i] = StringChar;
728*eef1b955SJung-uk Kim             i++;
729*eef1b955SJung-uk Kim             continue;
730*eef1b955SJung-uk Kim         }
731*eef1b955SJung-uk Kim 
732*eef1b955SJung-uk Kim         /* Save the finished character */
733*eef1b955SJung-uk Kim 
734*eef1b955SJung-uk Kim         *StringBuffer = StringChar;
735*eef1b955SJung-uk Kim         StringBuffer++;
736*eef1b955SJung-uk Kim         if (StringBuffer >= EndBuffer)
737*eef1b955SJung-uk Kim         {
738*eef1b955SJung-uk Kim             goto BufferOverflow;
739*eef1b955SJung-uk Kim         }
740*eef1b955SJung-uk Kim     }
741*eef1b955SJung-uk Kim 
742*eef1b955SJung-uk Kim     /*
743*eef1b955SJung-uk Kim      * Premature End-Of-File
744*eef1b955SJung-uk Kim      */
745*eef1b955SJung-uk Kim     AslCommonError (ASL_ERROR, ASL_MSG_EARLY_EOF,
746*eef1b955SJung-uk Kim                     Gbl_CurrentLineNumber, Gbl_LogicalLineNumber,
747*eef1b955SJung-uk Kim                     Gbl_CurrentLineOffset, Gbl_CurrentColumn,
748*eef1b955SJung-uk Kim                     Gbl_Files[ASL_FILE_INPUT].Filename, NULL);
749*eef1b955SJung-uk Kim     return (FALSE);
750*eef1b955SJung-uk Kim 
751*eef1b955SJung-uk Kim 
752*eef1b955SJung-uk Kim CompletedString:
753*eef1b955SJung-uk Kim     /*
754*eef1b955SJung-uk Kim      * Null terminate the input string and copy string to a new buffer
755*eef1b955SJung-uk Kim      */
756*eef1b955SJung-uk Kim     *StringBuffer = 0;
757*eef1b955SJung-uk Kim 
758*eef1b955SJung-uk Kim     CleanString = UtGetStringBuffer (strlen (MsgBuffer) + 1);
759*eef1b955SJung-uk Kim     if (!CleanString)
760*eef1b955SJung-uk Kim     {
761*eef1b955SJung-uk Kim         AslCommonError (ASL_ERROR, ASL_MSG_MEMORY_ALLOCATION,
762*eef1b955SJung-uk Kim                         Gbl_CurrentLineNumber, Gbl_LogicalLineNumber,
763*eef1b955SJung-uk Kim                         Gbl_CurrentLineOffset, Gbl_CurrentColumn,
764*eef1b955SJung-uk Kim                         Gbl_Files[ASL_FILE_INPUT].Filename, NULL);
765*eef1b955SJung-uk Kim         return (FALSE);
766*eef1b955SJung-uk Kim     }
767*eef1b955SJung-uk Kim 
768*eef1b955SJung-uk Kim     ACPI_STRCPY (CleanString, MsgBuffer);
769*eef1b955SJung-uk Kim     AslCompilerlval.s = CleanString;
770*eef1b955SJung-uk Kim     return (TRUE);
771*eef1b955SJung-uk Kim 
772*eef1b955SJung-uk Kim 
773*eef1b955SJung-uk Kim BufferOverflow:
774*eef1b955SJung-uk Kim 
775*eef1b955SJung-uk Kim     /* Literal was too long */
776*eef1b955SJung-uk Kim 
777*eef1b955SJung-uk Kim     AslCommonError (ASL_ERROR, ASL_MSG_STRING_LENGTH,
778*eef1b955SJung-uk Kim                     Gbl_CurrentLineNumber, Gbl_LogicalLineNumber,
779*eef1b955SJung-uk Kim                     Gbl_CurrentLineOffset, Gbl_CurrentColumn,
780*eef1b955SJung-uk Kim                     Gbl_Files[ASL_FILE_INPUT].Filename, "Max length 4096");
781*eef1b955SJung-uk Kim     return (FALSE);
782*eef1b955SJung-uk Kim }
783