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