xref: /freebsd/sys/contrib/dev/acpica/compiler/aslsupport.l (revision 5ef5072350492e3ee9aff4303789fc75972b5afe)
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 /*
91c0e1b6dSJung-uk Kim  * Copyright (C) 2000 - 2015, 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 
721c0e1b6dSJung-uk Kim /*******************************************************************************
731c0e1b6dSJung-uk Kim  *
741c0e1b6dSJung-uk Kim  * FUNCTION:    AslParserCleanup
751c0e1b6dSJung-uk Kim  *
761c0e1b6dSJung-uk Kim  * Used to delete the current buffer
771c0e1b6dSJung-uk Kim  *
781c0e1b6dSJung-uk Kim  ******************************************************************************/
791c0e1b6dSJung-uk Kim 
80313a0c13SJung-uk Kim void
81313a0c13SJung-uk Kim AslParserCleanup (
82313a0c13SJung-uk Kim     void)
83313a0c13SJung-uk Kim {
84313a0c13SJung-uk Kim 
85313a0c13SJung-uk Kim     yy_delete_buffer (YY_CURRENT_BUFFER);
86313a0c13SJung-uk Kim }
87313a0c13SJung-uk Kim 
88313a0c13SJung-uk Kim 
89eef1b955SJung-uk Kim /*******************************************************************************
90eef1b955SJung-uk Kim  *
91eef1b955SJung-uk Kim  * FUNCTION:    AslDoLineDirective
92eef1b955SJung-uk Kim  *
93eef1b955SJung-uk Kim  * PARAMETERS:  None. Uses input() to access current source code line
94eef1b955SJung-uk Kim  *
95eef1b955SJung-uk Kim  * RETURN:      Updates global line number and filename
96eef1b955SJung-uk Kim  *
97eef1b955SJung-uk Kim  * DESCRIPTION: Handle #line directives emitted by the preprocessor.
98eef1b955SJung-uk Kim  *
99eef1b955SJung-uk Kim  * The #line directive is emitted by the preprocesser, and is used to
100eef1b955SJung-uk Kim  * pass through line numbers from the original source code file to the
101eef1b955SJung-uk Kim  * preprocessor output file (.i). This allows any compiler-generated
102eef1b955SJung-uk Kim  * error messages to be displayed with the correct line number.
103eef1b955SJung-uk Kim  *
104eef1b955SJung-uk Kim  ******************************************************************************/
105eef1b955SJung-uk Kim 
106eef1b955SJung-uk Kim static void
107eef1b955SJung-uk Kim AslDoLineDirective (
108eef1b955SJung-uk Kim     void)
109eef1b955SJung-uk Kim {
110f38b0f21SJung-uk Kim     int                     c;
111eef1b955SJung-uk Kim     char                    *Token;
112eef1b955SJung-uk Kim     UINT32                  LineNumber;
113eef1b955SJung-uk Kim     char                    *Filename;
114f38b0f21SJung-uk Kim     UINT32                  i;
115eef1b955SJung-uk Kim 
116*5ef50723SJung-uk Kim    Gbl_HasIncludeFiles = TRUE;
117eef1b955SJung-uk Kim 
118eef1b955SJung-uk Kim     /* Eat the entire line that contains the #line directive */
119eef1b955SJung-uk Kim 
120f38b0f21SJung-uk Kim     Gbl_LineBufPtr = Gbl_CurrentLineBuffer;
121f38b0f21SJung-uk Kim 
122f38b0f21SJung-uk Kim     while ((c = input()) != '\n' && c != EOF)
123eef1b955SJung-uk Kim     {
124f38b0f21SJung-uk Kim         *Gbl_LineBufPtr = c;
125f38b0f21SJung-uk Kim         Gbl_LineBufPtr++;
126eef1b955SJung-uk Kim     }
127f38b0f21SJung-uk Kim     *Gbl_LineBufPtr = 0;
128eef1b955SJung-uk Kim 
129eef1b955SJung-uk Kim     /* First argument is the actual line number */
130eef1b955SJung-uk Kim 
131eef1b955SJung-uk Kim     Token = strtok (Gbl_CurrentLineBuffer, " ");
132eef1b955SJung-uk Kim     if (!Token)
133eef1b955SJung-uk Kim     {
134eef1b955SJung-uk Kim         goto ResetAndExit;
135eef1b955SJung-uk Kim     }
136eef1b955SJung-uk Kim 
137f38b0f21SJung-uk Kim     /* First argument is the line number */
138eef1b955SJung-uk Kim 
139eef1b955SJung-uk Kim     LineNumber = (UINT32) UtDoConstant (Token);
140f38b0f21SJung-uk Kim 
141f38b0f21SJung-uk Kim     /* Emit the appropriate number of newlines */
142f38b0f21SJung-uk Kim 
143f38b0f21SJung-uk Kim     Gbl_CurrentColumn = 0;
144f38b0f21SJung-uk Kim     if (LineNumber > Gbl_CurrentLineNumber)
145f38b0f21SJung-uk Kim     {
146f38b0f21SJung-uk Kim         for (i = 0; i < (LineNumber - Gbl_CurrentLineNumber); i++)
147f38b0f21SJung-uk Kim         {
148f38b0f21SJung-uk Kim             FlWriteFile (ASL_FILE_SOURCE_OUTPUT, "\n", 1);
149f38b0f21SJung-uk Kim             Gbl_CurrentColumn++;
150f38b0f21SJung-uk Kim         }
151f38b0f21SJung-uk Kim     }
152f38b0f21SJung-uk Kim 
153f38b0f21SJung-uk Kim     FlSetLineNumber (LineNumber);
154eef1b955SJung-uk Kim 
155eef1b955SJung-uk Kim     /* Second argument is the optional filename (in double quotes) */
156eef1b955SJung-uk Kim 
157eef1b955SJung-uk Kim     Token = strtok (NULL, " \"");
158eef1b955SJung-uk Kim     if (Token)
159eef1b955SJung-uk Kim     {
160eef1b955SJung-uk Kim         Filename = ACPI_ALLOCATE_ZEROED (strlen (Token) + 1);
161eef1b955SJung-uk Kim         strcpy (Filename, Token);
162eef1b955SJung-uk Kim         FlSetFilename (Filename);
163eef1b955SJung-uk Kim     }
164eef1b955SJung-uk Kim 
165eef1b955SJung-uk Kim     /* Third argument is not supported at this time */
166eef1b955SJung-uk Kim 
167eef1b955SJung-uk Kim ResetAndExit:
168f38b0f21SJung-uk Kim 
169f38b0f21SJung-uk Kim     /* Reset globals for a new line */
170f38b0f21SJung-uk Kim 
171f38b0f21SJung-uk Kim     Gbl_CurrentLineOffset += Gbl_CurrentColumn;
172f38b0f21SJung-uk Kim     Gbl_CurrentColumn = 0;
173f38b0f21SJung-uk Kim     Gbl_LineBufPtr = Gbl_CurrentLineBuffer;
174eef1b955SJung-uk Kim }
175eef1b955SJung-uk Kim 
176eef1b955SJung-uk Kim 
177eef1b955SJung-uk Kim /*******************************************************************************
178eef1b955SJung-uk Kim  *
179eef1b955SJung-uk Kim  * FUNCTION:    AslPopInputFileStack
180eef1b955SJung-uk Kim  *
181eef1b955SJung-uk Kim  * PARAMETERS:  None
182eef1b955SJung-uk Kim  *
183eef1b955SJung-uk Kim  * RETURN:      0 if a node was popped, -1 otherwise
184eef1b955SJung-uk Kim  *
185eef1b955SJung-uk Kim  * DESCRIPTION: Pop the top of the input file stack and point the parser to
186eef1b955SJung-uk Kim  *              the saved parse buffer contained in the fnode. Also, set the
187eef1b955SJung-uk Kim  *              global line counters to the saved values. This function is
188eef1b955SJung-uk Kim  *              called when an include file reaches EOF.
189eef1b955SJung-uk Kim  *
190eef1b955SJung-uk Kim  ******************************************************************************/
191eef1b955SJung-uk Kim 
192eef1b955SJung-uk Kim int
193eef1b955SJung-uk Kim AslPopInputFileStack (
194eef1b955SJung-uk Kim     void)
195eef1b955SJung-uk Kim {
196eef1b955SJung-uk Kim     ASL_FILE_NODE           *Fnode;
197eef1b955SJung-uk Kim 
198eef1b955SJung-uk Kim 
199eef1b955SJung-uk Kim     Fnode = Gbl_IncludeFileStack;
2001c0e1b6dSJung-uk Kim     DbgPrint (ASL_PARSE_OUTPUT,
2011c0e1b6dSJung-uk Kim         "\nPop InputFile Stack, Fnode %p\n\n", Fnode);
202eef1b955SJung-uk Kim 
203eef1b955SJung-uk Kim     if (!Fnode)
204eef1b955SJung-uk Kim     {
205eef1b955SJung-uk Kim         return (-1);
206eef1b955SJung-uk Kim     }
207eef1b955SJung-uk Kim 
208eef1b955SJung-uk Kim     /* Close the current include file */
209eef1b955SJung-uk Kim 
210eef1b955SJung-uk Kim     fclose (yyin);
211eef1b955SJung-uk Kim 
212eef1b955SJung-uk Kim     /* Update the top-of-stack */
213eef1b955SJung-uk Kim 
214eef1b955SJung-uk Kim     Gbl_IncludeFileStack = Fnode->Next;
215eef1b955SJung-uk Kim 
216eef1b955SJung-uk Kim     /* Reset global line counter and filename */
217eef1b955SJung-uk Kim 
218eef1b955SJung-uk Kim     Gbl_Files[ASL_FILE_INPUT].Filename = Fnode->Filename;
219eef1b955SJung-uk Kim     Gbl_CurrentLineNumber = Fnode->CurrentLineNumber;
220eef1b955SJung-uk Kim 
221eef1b955SJung-uk Kim     /* Point the parser to the popped file */
222eef1b955SJung-uk Kim 
223eef1b955SJung-uk Kim     yy_delete_buffer (YY_CURRENT_BUFFER);
224eef1b955SJung-uk Kim     yy_switch_to_buffer (Fnode->State);
225eef1b955SJung-uk Kim 
226eef1b955SJung-uk Kim     /* All done with this node */
227eef1b955SJung-uk Kim 
228eef1b955SJung-uk Kim     ACPI_FREE (Fnode);
229eef1b955SJung-uk Kim     return (0);
230eef1b955SJung-uk Kim }
231eef1b955SJung-uk Kim 
232eef1b955SJung-uk Kim 
233eef1b955SJung-uk Kim /*******************************************************************************
234eef1b955SJung-uk Kim  *
235eef1b955SJung-uk Kim  * FUNCTION:    AslPushInputFileStack
236eef1b955SJung-uk Kim  *
237eef1b955SJung-uk Kim  * PARAMETERS:  InputFile           - Open file pointer
238eef1b955SJung-uk Kim  *              Filename            - Name of the file
239eef1b955SJung-uk Kim  *
240eef1b955SJung-uk Kim  * RETURN:      None
241eef1b955SJung-uk Kim  *
242eef1b955SJung-uk Kim  * DESCRIPTION: Push the InputFile onto the file stack, and point the parser
243eef1b955SJung-uk Kim  *              to this file. Called when an include file is successfully
244eef1b955SJung-uk Kim  *              opened.
245eef1b955SJung-uk Kim  *
246eef1b955SJung-uk Kim  ******************************************************************************/
247eef1b955SJung-uk Kim 
248eef1b955SJung-uk Kim void
249eef1b955SJung-uk Kim AslPushInputFileStack (
250eef1b955SJung-uk Kim     FILE                    *InputFile,
251eef1b955SJung-uk Kim     char                    *Filename)
252eef1b955SJung-uk Kim {
253eef1b955SJung-uk Kim     ASL_FILE_NODE           *Fnode;
254eef1b955SJung-uk Kim     YY_BUFFER_STATE         State;
255eef1b955SJung-uk Kim 
256eef1b955SJung-uk Kim 
257eef1b955SJung-uk Kim     /* Save the current state in an Fnode */
258eef1b955SJung-uk Kim 
259eef1b955SJung-uk Kim     Fnode = UtLocalCalloc (sizeof (ASL_FILE_NODE));
260eef1b955SJung-uk Kim 
261eef1b955SJung-uk Kim     Fnode->File = yyin;
262eef1b955SJung-uk Kim     Fnode->Next = Gbl_IncludeFileStack;
263eef1b955SJung-uk Kim     Fnode->State = YY_CURRENT_BUFFER;
264eef1b955SJung-uk Kim     Fnode->Filename = Gbl_Files[ASL_FILE_INPUT].Filename;
2651c0e1b6dSJung-uk Kim     Fnode->CurrentLineNumber = Gbl_CurrentLineNumber;
266eef1b955SJung-uk Kim 
267eef1b955SJung-uk Kim     /* Push it on the stack */
268eef1b955SJung-uk Kim 
269eef1b955SJung-uk Kim     Gbl_IncludeFileStack = Fnode;
270eef1b955SJung-uk Kim 
271eef1b955SJung-uk Kim     /* Point the parser to this file */
272eef1b955SJung-uk Kim 
273eef1b955SJung-uk Kim     State = yy_create_buffer (InputFile, YY_BUF_SIZE);
274eef1b955SJung-uk Kim     yy_switch_to_buffer (State);
275eef1b955SJung-uk Kim 
2761c0e1b6dSJung-uk Kim     DbgPrint (ASL_PARSE_OUTPUT,
2771c0e1b6dSJung-uk Kim         "\nPush InputFile Stack, returning %p\n\n", InputFile);
278eef1b955SJung-uk Kim 
279eef1b955SJung-uk Kim     /* Reset the global line count and filename */
280eef1b955SJung-uk Kim 
281313a0c13SJung-uk Kim     Gbl_Files[ASL_FILE_INPUT].Filename =
282313a0c13SJung-uk Kim         UtStringCacheCalloc (strlen (Filename) + 1);
283313a0c13SJung-uk Kim 
284313a0c13SJung-uk Kim     strcpy (Gbl_Files[ASL_FILE_INPUT].Filename, Filename);
285313a0c13SJung-uk Kim 
286eef1b955SJung-uk Kim     Gbl_CurrentLineNumber = 1;
287eef1b955SJung-uk Kim     yyin = InputFile;
288eef1b955SJung-uk Kim }
289eef1b955SJung-uk Kim 
290eef1b955SJung-uk Kim 
291eef1b955SJung-uk Kim /*******************************************************************************
292eef1b955SJung-uk Kim  *
293eef1b955SJung-uk Kim  * FUNCTION:    AslResetCurrentLineBuffer
294eef1b955SJung-uk Kim  *
295eef1b955SJung-uk Kim  * PARAMETERS:  None
296eef1b955SJung-uk Kim  *
297eef1b955SJung-uk Kim  * RETURN:      None
298eef1b955SJung-uk Kim  *
299eef1b955SJung-uk Kim  * DESCRIPTION: Reset the Line Buffer to zero, increment global line numbers.
300eef1b955SJung-uk Kim  *
301eef1b955SJung-uk Kim  ******************************************************************************/
302eef1b955SJung-uk Kim 
303eef1b955SJung-uk Kim void
304eef1b955SJung-uk Kim AslResetCurrentLineBuffer (
305eef1b955SJung-uk Kim     void)
306eef1b955SJung-uk Kim {
307eef1b955SJung-uk Kim 
308eef1b955SJung-uk Kim     if (Gbl_Files[ASL_FILE_SOURCE_OUTPUT].Handle)
309eef1b955SJung-uk Kim     {
310eef1b955SJung-uk Kim         FlWriteFile (ASL_FILE_SOURCE_OUTPUT, Gbl_CurrentLineBuffer,
311eef1b955SJung-uk Kim             Gbl_LineBufPtr - Gbl_CurrentLineBuffer);
312eef1b955SJung-uk Kim     }
313eef1b955SJung-uk Kim 
314eef1b955SJung-uk Kim     Gbl_CurrentLineOffset += Gbl_CurrentColumn;
315eef1b955SJung-uk Kim     Gbl_CurrentColumn = 0;
316eef1b955SJung-uk Kim 
317eef1b955SJung-uk Kim     Gbl_CurrentLineNumber++;
318eef1b955SJung-uk Kim     Gbl_LogicalLineNumber++;
319eef1b955SJung-uk Kim     Gbl_LineBufPtr = Gbl_CurrentLineBuffer;
320eef1b955SJung-uk Kim }
321eef1b955SJung-uk Kim 
322eef1b955SJung-uk Kim 
323eef1b955SJung-uk Kim /*******************************************************************************
324eef1b955SJung-uk Kim  *
325eef1b955SJung-uk Kim  * FUNCTION:    AslInsertLineBuffer
326eef1b955SJung-uk Kim  *
327eef1b955SJung-uk Kim  * PARAMETERS:  SourceChar          - One char from the input ASL source file
328eef1b955SJung-uk Kim  *
329eef1b955SJung-uk Kim  * RETURN:      None
330eef1b955SJung-uk Kim  *
331eef1b955SJung-uk Kim  * DESCRIPTION: Put one character of the source file into the temp line buffer
332eef1b955SJung-uk Kim  *
333eef1b955SJung-uk Kim  ******************************************************************************/
334eef1b955SJung-uk Kim 
335eef1b955SJung-uk Kim void
336eef1b955SJung-uk Kim AslInsertLineBuffer (
337eef1b955SJung-uk Kim     int                     SourceChar)
338eef1b955SJung-uk Kim {
339eef1b955SJung-uk Kim     UINT32                  i;
340eef1b955SJung-uk Kim     UINT32                  Count = 1;
341eef1b955SJung-uk Kim 
342eef1b955SJung-uk Kim 
343eef1b955SJung-uk Kim     if (SourceChar == EOF)
344eef1b955SJung-uk Kim     {
345eef1b955SJung-uk Kim         return;
346eef1b955SJung-uk Kim     }
347eef1b955SJung-uk Kim 
348eef1b955SJung-uk Kim     Gbl_InputByteCount++;
349eef1b955SJung-uk Kim 
350eef1b955SJung-uk Kim     /* Handle tabs. Convert to spaces */
351eef1b955SJung-uk Kim 
352eef1b955SJung-uk Kim     if (SourceChar == '\t')
353eef1b955SJung-uk Kim     {
354eef1b955SJung-uk Kim         SourceChar = ' ';
355eef1b955SJung-uk Kim         Count = ASL_SPACES_PER_TAB -
356eef1b955SJung-uk Kim                     (Gbl_CurrentColumn & (ASL_SPACES_PER_TAB-1));
357eef1b955SJung-uk Kim     }
358eef1b955SJung-uk Kim 
359eef1b955SJung-uk Kim     for (i = 0; i < Count; i++)
360eef1b955SJung-uk Kim     {
361eef1b955SJung-uk Kim         Gbl_CurrentColumn++;
362eef1b955SJung-uk Kim 
363eef1b955SJung-uk Kim         /* Insert the character into the line buffer */
364eef1b955SJung-uk Kim 
365eef1b955SJung-uk Kim         *Gbl_LineBufPtr = (UINT8) SourceChar;
366eef1b955SJung-uk Kim         Gbl_LineBufPtr++;
367eef1b955SJung-uk Kim 
3681c0e1b6dSJung-uk Kim         if (Gbl_LineBufPtr >
3691c0e1b6dSJung-uk Kim             (Gbl_CurrentLineBuffer + (Gbl_LineBufferSize - 1)))
370eef1b955SJung-uk Kim         {
371eef1b955SJung-uk Kim #if 0
372eef1b955SJung-uk Kim             /*
373eef1b955SJung-uk Kim              * Warning if we have split a long source line.
374eef1b955SJung-uk Kim              * <Probably overkill>
375eef1b955SJung-uk Kim              */
376042ff955SJung-uk Kim             sprintf (MsgBuffer, "Max %u", Gbl_LineBufferSize);
377eef1b955SJung-uk Kim             AslCommonError (ASL_WARNING, ASL_MSG_LONG_LINE,
378eef1b955SJung-uk Kim                 Gbl_CurrentLineNumber, Gbl_LogicalLineNumber,
379eef1b955SJung-uk Kim                 Gbl_CurrentLineOffset, Gbl_CurrentColumn,
380eef1b955SJung-uk Kim                 Gbl_Files[ASL_FILE_INPUT].Filename, MsgBuffer);
381eef1b955SJung-uk Kim #endif
382eef1b955SJung-uk Kim 
383eef1b955SJung-uk Kim             AslResetCurrentLineBuffer ();
384eef1b955SJung-uk Kim         }
385eef1b955SJung-uk Kim         else if (SourceChar == '\n')
386eef1b955SJung-uk Kim         {
387eef1b955SJung-uk Kim             /* End of line */
388eef1b955SJung-uk Kim 
389eef1b955SJung-uk Kim             AslResetCurrentLineBuffer ();
390eef1b955SJung-uk Kim         }
391eef1b955SJung-uk Kim     }
392eef1b955SJung-uk Kim }
393eef1b955SJung-uk Kim 
394eef1b955SJung-uk Kim 
395eef1b955SJung-uk Kim /*******************************************************************************
396eef1b955SJung-uk Kim  *
397eef1b955SJung-uk Kim  * FUNCTION:    count
398eef1b955SJung-uk Kim  *
399eef1b955SJung-uk Kim  * PARAMETERS:  yytext              - Contains the matched keyword.
400eef1b955SJung-uk Kim  *              Type                - Keyword/Character type:
401eef1b955SJung-uk Kim  *                                      0 = anything except a keyword
402eef1b955SJung-uk Kim  *                                      1 = pseudo-keywords
403eef1b955SJung-uk Kim  *                                      2 = non-executable ASL keywords
404eef1b955SJung-uk Kim  *                                      3 = executable ASL keywords
405eef1b955SJung-uk Kim  *
406eef1b955SJung-uk Kim  * RETURN:      None
407eef1b955SJung-uk Kim  *
408eef1b955SJung-uk Kim  * DESCRIPTION: Count keywords and put them into the line buffer
409eef1b955SJung-uk Kim  *
410eef1b955SJung-uk Kim  ******************************************************************************/
411eef1b955SJung-uk Kim 
412eef1b955SJung-uk Kim static void
413eef1b955SJung-uk Kim count (
414eef1b955SJung-uk Kim     int                 Type)
415eef1b955SJung-uk Kim {
416eef1b955SJung-uk Kim     int                 i;
417eef1b955SJung-uk Kim 
418eef1b955SJung-uk Kim 
419eef1b955SJung-uk Kim     switch (Type)
420eef1b955SJung-uk Kim     {
421eef1b955SJung-uk Kim     case 2:
422a9d8d09cSJung-uk Kim 
423eef1b955SJung-uk Kim         TotalKeywords++;
424eef1b955SJung-uk Kim         TotalNamedObjects++;
425eef1b955SJung-uk Kim         break;
426eef1b955SJung-uk Kim 
427eef1b955SJung-uk Kim     case 3:
428a9d8d09cSJung-uk Kim 
429eef1b955SJung-uk Kim         TotalKeywords++;
430eef1b955SJung-uk Kim         TotalExecutableOpcodes++;
431eef1b955SJung-uk Kim         break;
4329c48c75eSJung-uk Kim 
4339c48c75eSJung-uk Kim     default:
434a9d8d09cSJung-uk Kim 
4359c48c75eSJung-uk Kim         break;
436eef1b955SJung-uk Kim     }
437eef1b955SJung-uk Kim 
438eef1b955SJung-uk Kim     for (i = 0; (yytext[i] != 0) && (yytext[i] != EOF); i++)
439eef1b955SJung-uk Kim     {
440eef1b955SJung-uk Kim         AslInsertLineBuffer (yytext[i]);
441eef1b955SJung-uk Kim         *Gbl_LineBufPtr = 0;
442eef1b955SJung-uk Kim     }
443eef1b955SJung-uk Kim }
444eef1b955SJung-uk Kim 
445eef1b955SJung-uk Kim 
446eef1b955SJung-uk Kim /*******************************************************************************
447eef1b955SJung-uk Kim  *
448eef1b955SJung-uk Kim  * FUNCTION:    AslDoComment
449eef1b955SJung-uk Kim  *
450eef1b955SJung-uk Kim  * PARAMETERS:  none
451eef1b955SJung-uk Kim  *
452eef1b955SJung-uk Kim  * RETURN:      none
453eef1b955SJung-uk Kim  *
454eef1b955SJung-uk Kim  * DESCRIPTION: Process a standard comment.
455eef1b955SJung-uk Kim  *
456eef1b955SJung-uk Kim  ******************************************************************************/
457eef1b955SJung-uk Kim 
458eef1b955SJung-uk Kim static char
459eef1b955SJung-uk Kim AslDoComment (
460eef1b955SJung-uk Kim     void)
461eef1b955SJung-uk Kim {
462f38b0f21SJung-uk Kim     int                 c;
463f38b0f21SJung-uk Kim     int                 c1 = 0;
464eef1b955SJung-uk Kim 
465eef1b955SJung-uk Kim 
466eef1b955SJung-uk Kim     AslInsertLineBuffer ('/');
467eef1b955SJung-uk Kim     AslInsertLineBuffer ('*');
468eef1b955SJung-uk Kim 
469eef1b955SJung-uk Kim loop:
470eef1b955SJung-uk Kim 
471eef1b955SJung-uk Kim     /* Eat chars until end-of-comment */
472eef1b955SJung-uk Kim 
4731c0e1b6dSJung-uk Kim     while (((c = input ()) != '*') && (c != EOF))
474eef1b955SJung-uk Kim     {
475eef1b955SJung-uk Kim         AslInsertLineBuffer (c);
476eef1b955SJung-uk Kim         c1 = c;
477eef1b955SJung-uk Kim     }
478eef1b955SJung-uk Kim 
479eef1b955SJung-uk Kim     if (c == EOF)
480eef1b955SJung-uk Kim     {
481eef1b955SJung-uk Kim         goto EarlyEOF;
482eef1b955SJung-uk Kim     }
483eef1b955SJung-uk Kim 
484eef1b955SJung-uk Kim     /*
485eef1b955SJung-uk Kim      * Check for nested comment -- can help catch cases where a previous
486eef1b955SJung-uk Kim      * comment was accidently left unterminated
487eef1b955SJung-uk Kim      */
488eef1b955SJung-uk Kim     if ((c1 == '/') && (c == '*'))
489eef1b955SJung-uk Kim     {
490eef1b955SJung-uk Kim         AslCommonError (ASL_WARNING, ASL_MSG_NESTED_COMMENT,
491eef1b955SJung-uk Kim             Gbl_CurrentLineNumber, Gbl_LogicalLineNumber,
492eef1b955SJung-uk Kim             Gbl_InputByteCount, Gbl_CurrentColumn,
493eef1b955SJung-uk Kim             Gbl_Files[ASL_FILE_INPUT].Filename, NULL);
494eef1b955SJung-uk Kim     }
495eef1b955SJung-uk Kim 
496eef1b955SJung-uk Kim     /* Comment is closed only if the NEXT character is a slash */
497eef1b955SJung-uk Kim 
498eef1b955SJung-uk Kim     AslInsertLineBuffer (c);
499eef1b955SJung-uk Kim 
5001c0e1b6dSJung-uk Kim     if (((c1 = input ()) != '/') && (c1 != EOF))
501eef1b955SJung-uk Kim     {
502eef1b955SJung-uk Kim         unput(c1);
503eef1b955SJung-uk Kim         goto loop;
504eef1b955SJung-uk Kim     }
505eef1b955SJung-uk Kim 
506eef1b955SJung-uk Kim     if (c1 == EOF)
507eef1b955SJung-uk Kim     {
508eef1b955SJung-uk Kim         goto EarlyEOF;
509eef1b955SJung-uk Kim     }
510eef1b955SJung-uk Kim 
511eef1b955SJung-uk Kim     AslInsertLineBuffer (c1);
512eef1b955SJung-uk Kim     return (TRUE);
513eef1b955SJung-uk Kim 
514eef1b955SJung-uk Kim 
515eef1b955SJung-uk Kim EarlyEOF:
516eef1b955SJung-uk Kim     /*
517eef1b955SJung-uk Kim      * Premature End-Of-File
518eef1b955SJung-uk Kim      */
519eef1b955SJung-uk Kim     AslCommonError (ASL_ERROR, ASL_MSG_EARLY_EOF,
520eef1b955SJung-uk Kim         Gbl_CurrentLineNumber, Gbl_LogicalLineNumber,
521eef1b955SJung-uk Kim         Gbl_CurrentLineOffset, Gbl_CurrentColumn,
522eef1b955SJung-uk Kim         Gbl_Files[ASL_FILE_INPUT].Filename, NULL);
523eef1b955SJung-uk Kim     return (FALSE);
524eef1b955SJung-uk Kim }
525eef1b955SJung-uk Kim 
526eef1b955SJung-uk Kim 
527eef1b955SJung-uk Kim /*******************************************************************************
528eef1b955SJung-uk Kim  *
529eef1b955SJung-uk Kim  * FUNCTION:    AslDoCommentType2
530eef1b955SJung-uk Kim  *
531eef1b955SJung-uk Kim  * PARAMETERS:  none
532eef1b955SJung-uk Kim  *
533eef1b955SJung-uk Kim  * RETURN:      none
534eef1b955SJung-uk Kim  *
535eef1b955SJung-uk Kim  * DESCRIPTION: Process a new "//" comment.
536eef1b955SJung-uk Kim  *
537eef1b955SJung-uk Kim  ******************************************************************************/
538eef1b955SJung-uk Kim 
539eef1b955SJung-uk Kim static char
540eef1b955SJung-uk Kim AslDoCommentType2 (
541eef1b955SJung-uk Kim     void)
542eef1b955SJung-uk Kim {
543f38b0f21SJung-uk Kim     int                 c;
544eef1b955SJung-uk Kim 
545eef1b955SJung-uk Kim 
546eef1b955SJung-uk Kim     AslInsertLineBuffer ('/');
547eef1b955SJung-uk Kim     AslInsertLineBuffer ('/');
548eef1b955SJung-uk Kim 
5491c0e1b6dSJung-uk Kim     while (((c = input ()) != '\n') && (c != EOF))
550eef1b955SJung-uk Kim     {
551eef1b955SJung-uk Kim         AslInsertLineBuffer (c);
552eef1b955SJung-uk Kim     }
553eef1b955SJung-uk Kim 
554eef1b955SJung-uk Kim     if (c == EOF)
555eef1b955SJung-uk Kim     {
556eef1b955SJung-uk Kim         /* End of file is OK, change to newline. Let parser detect EOF later */
557eef1b955SJung-uk Kim 
558eef1b955SJung-uk Kim         c = '\n';
559eef1b955SJung-uk Kim     }
560eef1b955SJung-uk Kim 
561eef1b955SJung-uk Kim     AslInsertLineBuffer (c);
562eef1b955SJung-uk Kim     return (TRUE);
563eef1b955SJung-uk Kim }
564eef1b955SJung-uk Kim 
565eef1b955SJung-uk Kim 
566eef1b955SJung-uk Kim /*******************************************************************************
567eef1b955SJung-uk Kim  *
568eef1b955SJung-uk Kim  * FUNCTION:    AslDoStringLiteral
569eef1b955SJung-uk Kim  *
570eef1b955SJung-uk Kim  * PARAMETERS:  none
571eef1b955SJung-uk Kim  *
572eef1b955SJung-uk Kim  * RETURN:      none
573eef1b955SJung-uk Kim  *
574eef1b955SJung-uk Kim  * DESCRIPTION: Process a string literal (surrounded by quotes)
575eef1b955SJung-uk Kim  *
576eef1b955SJung-uk Kim  ******************************************************************************/
577eef1b955SJung-uk Kim 
578eef1b955SJung-uk Kim static char
579eef1b955SJung-uk Kim AslDoStringLiteral (
580eef1b955SJung-uk Kim     void)
581eef1b955SJung-uk Kim {
582eef1b955SJung-uk Kim     char                *StringBuffer = MsgBuffer;
583eef1b955SJung-uk Kim     char                *EndBuffer = MsgBuffer + ASL_MSG_BUFFER_SIZE;
584eef1b955SJung-uk Kim     char                *CleanString;
585f38b0f21SJung-uk Kim     int                 StringChar;
586eef1b955SJung-uk Kim     UINT32              State = ASL_NORMAL_CHAR;
587eef1b955SJung-uk Kim     UINT32              i = 0;
588eef1b955SJung-uk Kim     UINT8               Digit;
589eef1b955SJung-uk Kim     char                ConvertBuffer[4];
590eef1b955SJung-uk Kim 
591eef1b955SJung-uk Kim 
592eef1b955SJung-uk Kim     /*
593eef1b955SJung-uk Kim      * Eat chars until end-of-literal.
594eef1b955SJung-uk Kim      * NOTE:  Put back the original surrounding quotes into the
595eef1b955SJung-uk Kim      * source line buffer.
596eef1b955SJung-uk Kim      */
597eef1b955SJung-uk Kim     AslInsertLineBuffer ('\"');
598f38b0f21SJung-uk Kim     while ((StringChar = input()) != EOF)
599eef1b955SJung-uk Kim     {
600eef1b955SJung-uk Kim         AslInsertLineBuffer (StringChar);
601eef1b955SJung-uk Kim 
602eef1b955SJung-uk Kim DoCharacter:
603eef1b955SJung-uk Kim         switch (State)
604eef1b955SJung-uk Kim         {
605eef1b955SJung-uk Kim         case ASL_NORMAL_CHAR:
606eef1b955SJung-uk Kim 
607eef1b955SJung-uk Kim             switch (StringChar)
608eef1b955SJung-uk Kim             {
609eef1b955SJung-uk Kim             case '\\':
610eef1b955SJung-uk Kim                 /*
611eef1b955SJung-uk Kim                  * Special handling for backslash-escape sequence. We will
612eef1b955SJung-uk Kim                  * toss the backslash and translate the escape char(s).
613eef1b955SJung-uk Kim                  */
614eef1b955SJung-uk Kim                 State = ASL_ESCAPE_SEQUENCE;
615eef1b955SJung-uk Kim                 continue;
616eef1b955SJung-uk Kim 
617eef1b955SJung-uk Kim             case '\"':
618eef1b955SJung-uk Kim 
619eef1b955SJung-uk Kim                 /* String terminator */
620eef1b955SJung-uk Kim 
621eef1b955SJung-uk Kim                 goto CompletedString;
6229c48c75eSJung-uk Kim 
6239c48c75eSJung-uk Kim             default:
624a9d8d09cSJung-uk Kim 
6259c48c75eSJung-uk Kim                 break;
626eef1b955SJung-uk Kim             }
627eef1b955SJung-uk Kim             break;
628eef1b955SJung-uk Kim 
629eef1b955SJung-uk Kim 
630eef1b955SJung-uk Kim         case ASL_ESCAPE_SEQUENCE:
631eef1b955SJung-uk Kim 
632eef1b955SJung-uk Kim             State = ASL_NORMAL_CHAR;
633eef1b955SJung-uk Kim             switch (StringChar)
634eef1b955SJung-uk Kim             {
635eef1b955SJung-uk Kim             case 'a':
636a9d8d09cSJung-uk Kim 
637eef1b955SJung-uk Kim                 StringChar = 0x07;      /* BELL */
638eef1b955SJung-uk Kim                 break;
639eef1b955SJung-uk Kim 
640eef1b955SJung-uk Kim             case 'b':
641a9d8d09cSJung-uk Kim 
642eef1b955SJung-uk Kim                 StringChar = 0x08;      /* BACKSPACE */
643eef1b955SJung-uk Kim                 break;
644eef1b955SJung-uk Kim 
645eef1b955SJung-uk Kim             case 'f':
646a9d8d09cSJung-uk Kim 
647eef1b955SJung-uk Kim                 StringChar = 0x0C;      /* FORMFEED */
648eef1b955SJung-uk Kim                 break;
649eef1b955SJung-uk Kim 
650eef1b955SJung-uk Kim             case 'n':
651a9d8d09cSJung-uk Kim 
652eef1b955SJung-uk Kim                 StringChar = 0x0A;      /* LINEFEED */
653eef1b955SJung-uk Kim                 break;
654eef1b955SJung-uk Kim 
655eef1b955SJung-uk Kim             case 'r':
656a9d8d09cSJung-uk Kim 
657eef1b955SJung-uk Kim                 StringChar = 0x0D;      /* CARRIAGE RETURN*/
658eef1b955SJung-uk Kim                 break;
659eef1b955SJung-uk Kim 
660eef1b955SJung-uk Kim             case 't':
661a9d8d09cSJung-uk Kim 
662eef1b955SJung-uk Kim                 StringChar = 0x09;      /* HORIZONTAL TAB */
663eef1b955SJung-uk Kim                 break;
664eef1b955SJung-uk Kim 
665eef1b955SJung-uk Kim             case 'v':
666a9d8d09cSJung-uk Kim 
667eef1b955SJung-uk Kim                 StringChar = 0x0B;      /* VERTICAL TAB */
668eef1b955SJung-uk Kim                 break;
669eef1b955SJung-uk Kim 
670eef1b955SJung-uk Kim             case 'x':
671a9d8d09cSJung-uk Kim 
672eef1b955SJung-uk Kim                 State = ASL_HEX_CONSTANT;
673eef1b955SJung-uk Kim                 i = 0;
674eef1b955SJung-uk Kim                 continue;
675eef1b955SJung-uk Kim 
676eef1b955SJung-uk Kim             case '\'':                  /* Single Quote */
677eef1b955SJung-uk Kim             case '\"':                  /* Double Quote */
678eef1b955SJung-uk Kim             case '\\':                  /* Backslash */
679a9d8d09cSJung-uk Kim 
680eef1b955SJung-uk Kim                 break;
681eef1b955SJung-uk Kim 
682eef1b955SJung-uk Kim             default:
683eef1b955SJung-uk Kim 
684eef1b955SJung-uk Kim                 /* Check for an octal digit (0-7) */
685eef1b955SJung-uk Kim 
686eef1b955SJung-uk Kim                 if (ACPI_IS_OCTAL_DIGIT (StringChar))
687eef1b955SJung-uk Kim                 {
688eef1b955SJung-uk Kim                     State = ASL_OCTAL_CONSTANT;
689eef1b955SJung-uk Kim                     ConvertBuffer[0] = StringChar;
690eef1b955SJung-uk Kim                     i = 1;
691eef1b955SJung-uk Kim                     continue;
692eef1b955SJung-uk Kim                 }
693eef1b955SJung-uk Kim 
694eef1b955SJung-uk Kim                 /* Unknown escape sequence issue warning, but use the character */
695eef1b955SJung-uk Kim 
696eef1b955SJung-uk Kim                 AslCommonError (ASL_WARNING, ASL_MSG_INVALID_ESCAPE,
697eef1b955SJung-uk Kim                     Gbl_CurrentLineNumber, Gbl_LogicalLineNumber,
698eef1b955SJung-uk Kim                     Gbl_CurrentLineOffset, Gbl_CurrentColumn,
699eef1b955SJung-uk Kim                     Gbl_Files[ASL_FILE_INPUT].Filename, NULL);
700eef1b955SJung-uk Kim                 break;
701eef1b955SJung-uk Kim             }
702eef1b955SJung-uk Kim             break;
703eef1b955SJung-uk Kim 
704eef1b955SJung-uk Kim 
705eef1b955SJung-uk Kim         case ASL_OCTAL_CONSTANT:
706eef1b955SJung-uk Kim 
707eef1b955SJung-uk Kim             /* Up to three octal digits allowed */
708eef1b955SJung-uk Kim 
709eef1b955SJung-uk Kim             if (!ACPI_IS_OCTAL_DIGIT (StringChar) ||
710eef1b955SJung-uk Kim                 (i > 2))
711eef1b955SJung-uk Kim             {
712eef1b955SJung-uk Kim                 /*
713eef1b955SJung-uk Kim                  * Reached end of the constant. Convert the assembled ASCII
714eef1b955SJung-uk Kim                  * string and resume processing of the next character
715eef1b955SJung-uk Kim                  */
716eef1b955SJung-uk Kim                 ConvertBuffer[i] = 0;
717*5ef50723SJung-uk Kim                 Digit = (UINT8) strtoul (ConvertBuffer, NULL, 8);
718eef1b955SJung-uk Kim 
719eef1b955SJung-uk Kim                 /* Check for NULL or non-ascii character (ignore if so) */
720eef1b955SJung-uk Kim 
721eef1b955SJung-uk Kim                 if ((Digit == 0) || (Digit > ACPI_ASCII_MAX))
722eef1b955SJung-uk Kim                 {
723eef1b955SJung-uk Kim                     AslCommonError (ASL_WARNING, ASL_MSG_INVALID_STRING,
724eef1b955SJung-uk Kim                         Gbl_CurrentLineNumber, Gbl_LogicalLineNumber,
725eef1b955SJung-uk Kim                         Gbl_CurrentLineOffset, Gbl_CurrentColumn,
726eef1b955SJung-uk Kim                         Gbl_Files[ASL_FILE_INPUT].Filename, NULL);
727eef1b955SJung-uk Kim                 }
728eef1b955SJung-uk Kim                 else
729eef1b955SJung-uk Kim                 {
730eef1b955SJung-uk Kim                     *StringBuffer = (char) Digit;
731eef1b955SJung-uk Kim                     StringBuffer++;
732eef1b955SJung-uk Kim                     if (StringBuffer >= EndBuffer)
733eef1b955SJung-uk Kim                     {
734eef1b955SJung-uk Kim                         goto BufferOverflow;
735eef1b955SJung-uk Kim                     }
736eef1b955SJung-uk Kim                 }
737eef1b955SJung-uk Kim 
738eef1b955SJung-uk Kim                 State = ASL_NORMAL_CHAR;
739eef1b955SJung-uk Kim                 goto DoCharacter;
740eef1b955SJung-uk Kim                 break;
741eef1b955SJung-uk Kim             }
742eef1b955SJung-uk Kim 
743eef1b955SJung-uk Kim             /* Append another digit of the constant */
744eef1b955SJung-uk Kim 
745eef1b955SJung-uk Kim             ConvertBuffer[i] = StringChar;
746eef1b955SJung-uk Kim             i++;
747eef1b955SJung-uk Kim             continue;
748eef1b955SJung-uk Kim 
749eef1b955SJung-uk Kim         case ASL_HEX_CONSTANT:
750eef1b955SJung-uk Kim 
751eef1b955SJung-uk Kim             /* Up to two hex digits allowed */
752eef1b955SJung-uk Kim 
753*5ef50723SJung-uk Kim             if (!isxdigit (StringChar) ||
754eef1b955SJung-uk Kim                 (i > 1))
755eef1b955SJung-uk Kim             {
756eef1b955SJung-uk Kim                 /*
757eef1b955SJung-uk Kim                  * Reached end of the constant. Convert the assembled ASCII
758eef1b955SJung-uk Kim                  * string and resume processing of the next character
759eef1b955SJung-uk Kim                  */
760eef1b955SJung-uk Kim                 ConvertBuffer[i] = 0;
761*5ef50723SJung-uk Kim                 Digit = (UINT8) strtoul (ConvertBuffer, NULL, 16);
762eef1b955SJung-uk Kim 
763eef1b955SJung-uk Kim                 /* Check for NULL or non-ascii character (ignore if so) */
764eef1b955SJung-uk Kim 
765eef1b955SJung-uk Kim                 if ((Digit == 0) || (Digit > ACPI_ASCII_MAX))
766eef1b955SJung-uk Kim                 {
767eef1b955SJung-uk Kim                     AslCommonError (ASL_WARNING, ASL_MSG_INVALID_STRING,
768eef1b955SJung-uk Kim                         Gbl_CurrentLineNumber, Gbl_LogicalLineNumber,
769eef1b955SJung-uk Kim                         Gbl_CurrentLineOffset, Gbl_CurrentColumn,
770eef1b955SJung-uk Kim                         Gbl_Files[ASL_FILE_INPUT].Filename, NULL);
771eef1b955SJung-uk Kim                 }
772eef1b955SJung-uk Kim                 else
773eef1b955SJung-uk Kim                 {
774eef1b955SJung-uk Kim                     *StringBuffer = (char) Digit;
775eef1b955SJung-uk Kim                     StringBuffer++;
776eef1b955SJung-uk Kim                     if (StringBuffer >= EndBuffer)
777eef1b955SJung-uk Kim                     {
778eef1b955SJung-uk Kim                         goto BufferOverflow;
779eef1b955SJung-uk Kim                     }
780eef1b955SJung-uk Kim                 }
781eef1b955SJung-uk Kim 
782eef1b955SJung-uk Kim                 State = ASL_NORMAL_CHAR;
783eef1b955SJung-uk Kim                 goto DoCharacter;
784eef1b955SJung-uk Kim                 break;
785eef1b955SJung-uk Kim             }
786eef1b955SJung-uk Kim 
787eef1b955SJung-uk Kim             /* Append another digit of the constant */
788eef1b955SJung-uk Kim 
789eef1b955SJung-uk Kim             ConvertBuffer[i] = StringChar;
790eef1b955SJung-uk Kim             i++;
791eef1b955SJung-uk Kim             continue;
7929c48c75eSJung-uk Kim 
7939c48c75eSJung-uk Kim         default:
794a9d8d09cSJung-uk Kim 
7959c48c75eSJung-uk Kim             break;
796eef1b955SJung-uk Kim         }
797eef1b955SJung-uk Kim 
798eef1b955SJung-uk Kim         /* Save the finished character */
799eef1b955SJung-uk Kim 
800eef1b955SJung-uk Kim         *StringBuffer = StringChar;
801eef1b955SJung-uk Kim         StringBuffer++;
802eef1b955SJung-uk Kim         if (StringBuffer >= EndBuffer)
803eef1b955SJung-uk Kim         {
804eef1b955SJung-uk Kim             goto BufferOverflow;
805eef1b955SJung-uk Kim         }
806eef1b955SJung-uk Kim     }
807eef1b955SJung-uk Kim 
808eef1b955SJung-uk Kim     /*
809eef1b955SJung-uk Kim      * Premature End-Of-File
810eef1b955SJung-uk Kim      */
811eef1b955SJung-uk Kim     AslCommonError (ASL_ERROR, ASL_MSG_EARLY_EOF,
812eef1b955SJung-uk Kim         Gbl_CurrentLineNumber, Gbl_LogicalLineNumber,
813eef1b955SJung-uk Kim         Gbl_CurrentLineOffset, Gbl_CurrentColumn,
814eef1b955SJung-uk Kim         Gbl_Files[ASL_FILE_INPUT].Filename, NULL);
815eef1b955SJung-uk Kim     return (FALSE);
816eef1b955SJung-uk Kim 
817eef1b955SJung-uk Kim 
818eef1b955SJung-uk Kim CompletedString:
819eef1b955SJung-uk Kim     /*
820eef1b955SJung-uk Kim      * Null terminate the input string and copy string to a new buffer
821eef1b955SJung-uk Kim      */
822eef1b955SJung-uk Kim     *StringBuffer = 0;
823eef1b955SJung-uk Kim 
824313a0c13SJung-uk Kim     CleanString = UtStringCacheCalloc (strlen (MsgBuffer) + 1);
825eef1b955SJung-uk Kim     if (!CleanString)
826eef1b955SJung-uk Kim     {
827eef1b955SJung-uk Kim         AslCommonError (ASL_ERROR, ASL_MSG_MEMORY_ALLOCATION,
828eef1b955SJung-uk Kim             Gbl_CurrentLineNumber, Gbl_LogicalLineNumber,
829eef1b955SJung-uk Kim             Gbl_CurrentLineOffset, Gbl_CurrentColumn,
830eef1b955SJung-uk Kim             Gbl_Files[ASL_FILE_INPUT].Filename, NULL);
831eef1b955SJung-uk Kim         return (FALSE);
832eef1b955SJung-uk Kim     }
833eef1b955SJung-uk Kim 
834*5ef50723SJung-uk Kim     strcpy (CleanString, MsgBuffer);
835eef1b955SJung-uk Kim     AslCompilerlval.s = CleanString;
836eef1b955SJung-uk Kim     return (TRUE);
837eef1b955SJung-uk Kim 
838eef1b955SJung-uk Kim 
839eef1b955SJung-uk Kim BufferOverflow:
840eef1b955SJung-uk Kim 
841eef1b955SJung-uk Kim     /* Literal was too long */
842eef1b955SJung-uk Kim 
843eef1b955SJung-uk Kim     AslCommonError (ASL_ERROR, ASL_MSG_STRING_LENGTH,
844eef1b955SJung-uk Kim         Gbl_CurrentLineNumber, Gbl_LogicalLineNumber,
845eef1b955SJung-uk Kim         Gbl_CurrentLineOffset, Gbl_CurrentColumn,
846eef1b955SJung-uk Kim         Gbl_Files[ASL_FILE_INPUT].Filename, "Max length 4096");
847eef1b955SJung-uk Kim     return (FALSE);
848eef1b955SJung-uk Kim }
849