xref: /freebsd/sys/contrib/dev/acpica/compiler/aslsupport.l (revision f8146b882bc156c1d8ddf14bbea67253ebc064bb)
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*f8146b88SJung-uk Kim  * Copyright (C) 2000 - 2016, 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 
1165ef50723SJung-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 
199*f8146b88SJung-uk Kim     Gbl_PreviousIncludeFilename = Gbl_Files[ASL_FILE_INPUT].Filename;
200eef1b955SJung-uk Kim     Fnode = Gbl_IncludeFileStack;
2011c0e1b6dSJung-uk Kim     DbgPrint (ASL_PARSE_OUTPUT,
202*f8146b88SJung-uk Kim         "\nPop InputFile Stack, Fnode %p\n", Fnode);
203*f8146b88SJung-uk Kim 
204*f8146b88SJung-uk Kim     DbgPrint (ASL_PARSE_OUTPUT,
205*f8146b88SJung-uk Kim         "Include: Closing \"%s\"\n\n", Gbl_Files[ASL_FILE_INPUT].Filename);
206eef1b955SJung-uk Kim 
207eef1b955SJung-uk Kim     if (!Fnode)
208eef1b955SJung-uk Kim     {
209eef1b955SJung-uk Kim         return (-1);
210eef1b955SJung-uk Kim     }
211eef1b955SJung-uk Kim 
212eef1b955SJung-uk Kim     /* Close the current include file */
213eef1b955SJung-uk Kim 
214eef1b955SJung-uk Kim     fclose (yyin);
215eef1b955SJung-uk Kim 
216eef1b955SJung-uk Kim     /* Update the top-of-stack */
217eef1b955SJung-uk Kim 
218eef1b955SJung-uk Kim     Gbl_IncludeFileStack = Fnode->Next;
219eef1b955SJung-uk Kim 
220eef1b955SJung-uk Kim     /* Reset global line counter and filename */
221eef1b955SJung-uk Kim 
222eef1b955SJung-uk Kim     Gbl_Files[ASL_FILE_INPUT].Filename = Fnode->Filename;
223eef1b955SJung-uk Kim     Gbl_CurrentLineNumber = Fnode->CurrentLineNumber;
224eef1b955SJung-uk Kim 
225eef1b955SJung-uk Kim     /* Point the parser to the popped file */
226eef1b955SJung-uk Kim 
227eef1b955SJung-uk Kim     yy_delete_buffer (YY_CURRENT_BUFFER);
228eef1b955SJung-uk Kim     yy_switch_to_buffer (Fnode->State);
229eef1b955SJung-uk Kim 
230eef1b955SJung-uk Kim     /* All done with this node */
231eef1b955SJung-uk Kim 
232eef1b955SJung-uk Kim     ACPI_FREE (Fnode);
233eef1b955SJung-uk Kim     return (0);
234eef1b955SJung-uk Kim }
235eef1b955SJung-uk Kim 
236eef1b955SJung-uk Kim 
237eef1b955SJung-uk Kim /*******************************************************************************
238eef1b955SJung-uk Kim  *
239eef1b955SJung-uk Kim  * FUNCTION:    AslPushInputFileStack
240eef1b955SJung-uk Kim  *
241eef1b955SJung-uk Kim  * PARAMETERS:  InputFile           - Open file pointer
242eef1b955SJung-uk Kim  *              Filename            - Name of the file
243eef1b955SJung-uk Kim  *
244eef1b955SJung-uk Kim  * RETURN:      None
245eef1b955SJung-uk Kim  *
246eef1b955SJung-uk Kim  * DESCRIPTION: Push the InputFile onto the file stack, and point the parser
247eef1b955SJung-uk Kim  *              to this file. Called when an include file is successfully
248eef1b955SJung-uk Kim  *              opened.
249eef1b955SJung-uk Kim  *
250eef1b955SJung-uk Kim  ******************************************************************************/
251eef1b955SJung-uk Kim 
252eef1b955SJung-uk Kim void
253eef1b955SJung-uk Kim AslPushInputFileStack (
254eef1b955SJung-uk Kim     FILE                    *InputFile,
255eef1b955SJung-uk Kim     char                    *Filename)
256eef1b955SJung-uk Kim {
257eef1b955SJung-uk Kim     ASL_FILE_NODE           *Fnode;
258eef1b955SJung-uk Kim     YY_BUFFER_STATE         State;
259eef1b955SJung-uk Kim 
260eef1b955SJung-uk Kim 
261eef1b955SJung-uk Kim     /* Save the current state in an Fnode */
262eef1b955SJung-uk Kim 
263eef1b955SJung-uk Kim     Fnode = UtLocalCalloc (sizeof (ASL_FILE_NODE));
264eef1b955SJung-uk Kim 
265eef1b955SJung-uk Kim     Fnode->File = yyin;
266eef1b955SJung-uk Kim     Fnode->Next = Gbl_IncludeFileStack;
267eef1b955SJung-uk Kim     Fnode->State = YY_CURRENT_BUFFER;
268eef1b955SJung-uk Kim     Fnode->Filename = Gbl_Files[ASL_FILE_INPUT].Filename;
2691c0e1b6dSJung-uk Kim     Fnode->CurrentLineNumber = Gbl_CurrentLineNumber;
270eef1b955SJung-uk Kim 
271eef1b955SJung-uk Kim     /* Push it on the stack */
272eef1b955SJung-uk Kim 
273eef1b955SJung-uk Kim     Gbl_IncludeFileStack = Fnode;
274eef1b955SJung-uk Kim 
275eef1b955SJung-uk Kim     /* Point the parser to this file */
276eef1b955SJung-uk Kim 
277eef1b955SJung-uk Kim     State = yy_create_buffer (InputFile, YY_BUF_SIZE);
278eef1b955SJung-uk Kim     yy_switch_to_buffer (State);
279eef1b955SJung-uk Kim 
2801c0e1b6dSJung-uk Kim     DbgPrint (ASL_PARSE_OUTPUT,
2811c0e1b6dSJung-uk Kim         "\nPush InputFile Stack, returning %p\n\n", InputFile);
282eef1b955SJung-uk Kim 
283eef1b955SJung-uk Kim     /* Reset the global line count and filename */
284eef1b955SJung-uk Kim 
285313a0c13SJung-uk Kim     Gbl_Files[ASL_FILE_INPUT].Filename =
286313a0c13SJung-uk Kim         UtStringCacheCalloc (strlen (Filename) + 1);
287313a0c13SJung-uk Kim 
288313a0c13SJung-uk Kim     strcpy (Gbl_Files[ASL_FILE_INPUT].Filename, Filename);
289313a0c13SJung-uk Kim 
290eef1b955SJung-uk Kim     Gbl_CurrentLineNumber = 1;
291eef1b955SJung-uk Kim     yyin = InputFile;
292eef1b955SJung-uk Kim }
293eef1b955SJung-uk Kim 
294eef1b955SJung-uk Kim 
295eef1b955SJung-uk Kim /*******************************************************************************
296eef1b955SJung-uk Kim  *
297eef1b955SJung-uk Kim  * FUNCTION:    AslResetCurrentLineBuffer
298eef1b955SJung-uk Kim  *
299eef1b955SJung-uk Kim  * PARAMETERS:  None
300eef1b955SJung-uk Kim  *
301eef1b955SJung-uk Kim  * RETURN:      None
302eef1b955SJung-uk Kim  *
303eef1b955SJung-uk Kim  * DESCRIPTION: Reset the Line Buffer to zero, increment global line numbers.
304eef1b955SJung-uk Kim  *
305eef1b955SJung-uk Kim  ******************************************************************************/
306eef1b955SJung-uk Kim 
307eef1b955SJung-uk Kim void
308eef1b955SJung-uk Kim AslResetCurrentLineBuffer (
309eef1b955SJung-uk Kim     void)
310eef1b955SJung-uk Kim {
311eef1b955SJung-uk Kim 
312eef1b955SJung-uk Kim     if (Gbl_Files[ASL_FILE_SOURCE_OUTPUT].Handle)
313eef1b955SJung-uk Kim     {
314eef1b955SJung-uk Kim         FlWriteFile (ASL_FILE_SOURCE_OUTPUT, Gbl_CurrentLineBuffer,
315eef1b955SJung-uk Kim             Gbl_LineBufPtr - Gbl_CurrentLineBuffer);
316eef1b955SJung-uk Kim     }
317eef1b955SJung-uk Kim 
318eef1b955SJung-uk Kim     Gbl_CurrentLineOffset += Gbl_CurrentColumn;
319eef1b955SJung-uk Kim     Gbl_CurrentColumn = 0;
320eef1b955SJung-uk Kim 
321eef1b955SJung-uk Kim     Gbl_CurrentLineNumber++;
322eef1b955SJung-uk Kim     Gbl_LogicalLineNumber++;
323eef1b955SJung-uk Kim     Gbl_LineBufPtr = Gbl_CurrentLineBuffer;
324eef1b955SJung-uk Kim }
325eef1b955SJung-uk Kim 
326eef1b955SJung-uk Kim 
327eef1b955SJung-uk Kim /*******************************************************************************
328eef1b955SJung-uk Kim  *
329eef1b955SJung-uk Kim  * FUNCTION:    AslInsertLineBuffer
330eef1b955SJung-uk Kim  *
331eef1b955SJung-uk Kim  * PARAMETERS:  SourceChar          - One char from the input ASL source file
332eef1b955SJung-uk Kim  *
333eef1b955SJung-uk Kim  * RETURN:      None
334eef1b955SJung-uk Kim  *
335eef1b955SJung-uk Kim  * DESCRIPTION: Put one character of the source file into the temp line buffer
336eef1b955SJung-uk Kim  *
337eef1b955SJung-uk Kim  ******************************************************************************/
338eef1b955SJung-uk Kim 
339eef1b955SJung-uk Kim void
340eef1b955SJung-uk Kim AslInsertLineBuffer (
341eef1b955SJung-uk Kim     int                     SourceChar)
342eef1b955SJung-uk Kim {
343eef1b955SJung-uk Kim     UINT32                  i;
344eef1b955SJung-uk Kim     UINT32                  Count = 1;
345eef1b955SJung-uk Kim 
346eef1b955SJung-uk Kim 
347eef1b955SJung-uk Kim     if (SourceChar == EOF)
348eef1b955SJung-uk Kim     {
349eef1b955SJung-uk Kim         return;
350eef1b955SJung-uk Kim     }
351eef1b955SJung-uk Kim 
352eef1b955SJung-uk Kim     Gbl_InputByteCount++;
353eef1b955SJung-uk Kim 
354eef1b955SJung-uk Kim     /* Handle tabs. Convert to spaces */
355eef1b955SJung-uk Kim 
356eef1b955SJung-uk Kim     if (SourceChar == '\t')
357eef1b955SJung-uk Kim     {
358eef1b955SJung-uk Kim         SourceChar = ' ';
359eef1b955SJung-uk Kim         Count = ASL_SPACES_PER_TAB -
360eef1b955SJung-uk Kim                     (Gbl_CurrentColumn & (ASL_SPACES_PER_TAB-1));
361eef1b955SJung-uk Kim     }
362eef1b955SJung-uk Kim 
363eef1b955SJung-uk Kim     for (i = 0; i < Count; i++)
364eef1b955SJung-uk Kim     {
365eef1b955SJung-uk Kim         Gbl_CurrentColumn++;
366eef1b955SJung-uk Kim 
367eef1b955SJung-uk Kim         /* Insert the character into the line buffer */
368eef1b955SJung-uk Kim 
369eef1b955SJung-uk Kim         *Gbl_LineBufPtr = (UINT8) SourceChar;
370eef1b955SJung-uk Kim         Gbl_LineBufPtr++;
371eef1b955SJung-uk Kim 
3721c0e1b6dSJung-uk Kim         if (Gbl_LineBufPtr >
3731c0e1b6dSJung-uk Kim             (Gbl_CurrentLineBuffer + (Gbl_LineBufferSize - 1)))
374eef1b955SJung-uk Kim         {
375eef1b955SJung-uk Kim #if 0
376eef1b955SJung-uk Kim             /*
377eef1b955SJung-uk Kim              * Warning if we have split a long source line.
378eef1b955SJung-uk Kim              * <Probably overkill>
379eef1b955SJung-uk Kim              */
380042ff955SJung-uk Kim             sprintf (MsgBuffer, "Max %u", Gbl_LineBufferSize);
381eef1b955SJung-uk Kim             AslCommonError (ASL_WARNING, ASL_MSG_LONG_LINE,
382eef1b955SJung-uk Kim                 Gbl_CurrentLineNumber, Gbl_LogicalLineNumber,
383eef1b955SJung-uk Kim                 Gbl_CurrentLineOffset, Gbl_CurrentColumn,
384eef1b955SJung-uk Kim                 Gbl_Files[ASL_FILE_INPUT].Filename, MsgBuffer);
385eef1b955SJung-uk Kim #endif
386eef1b955SJung-uk Kim 
387eef1b955SJung-uk Kim             AslResetCurrentLineBuffer ();
388eef1b955SJung-uk Kim         }
389eef1b955SJung-uk Kim         else if (SourceChar == '\n')
390eef1b955SJung-uk Kim         {
391eef1b955SJung-uk Kim             /* End of line */
392eef1b955SJung-uk Kim 
393eef1b955SJung-uk Kim             AslResetCurrentLineBuffer ();
394eef1b955SJung-uk Kim         }
395eef1b955SJung-uk Kim     }
396eef1b955SJung-uk Kim }
397eef1b955SJung-uk Kim 
398eef1b955SJung-uk Kim 
399eef1b955SJung-uk Kim /*******************************************************************************
400eef1b955SJung-uk Kim  *
401eef1b955SJung-uk Kim  * FUNCTION:    count
402eef1b955SJung-uk Kim  *
403eef1b955SJung-uk Kim  * PARAMETERS:  yytext              - Contains the matched keyword.
404eef1b955SJung-uk Kim  *              Type                - Keyword/Character type:
405eef1b955SJung-uk Kim  *                                      0 = anything except a keyword
406eef1b955SJung-uk Kim  *                                      1 = pseudo-keywords
407eef1b955SJung-uk Kim  *                                      2 = non-executable ASL keywords
408eef1b955SJung-uk Kim  *                                      3 = executable ASL keywords
409eef1b955SJung-uk Kim  *
410eef1b955SJung-uk Kim  * RETURN:      None
411eef1b955SJung-uk Kim  *
412eef1b955SJung-uk Kim  * DESCRIPTION: Count keywords and put them into the line buffer
413eef1b955SJung-uk Kim  *
414eef1b955SJung-uk Kim  ******************************************************************************/
415eef1b955SJung-uk Kim 
416eef1b955SJung-uk Kim static void
417eef1b955SJung-uk Kim count (
418eef1b955SJung-uk Kim     int                 Type)
419eef1b955SJung-uk Kim {
420eef1b955SJung-uk Kim     int                 i;
421eef1b955SJung-uk Kim 
422eef1b955SJung-uk Kim 
423eef1b955SJung-uk Kim     switch (Type)
424eef1b955SJung-uk Kim     {
425eef1b955SJung-uk Kim     case 2:
426a9d8d09cSJung-uk Kim 
427eef1b955SJung-uk Kim         TotalKeywords++;
428eef1b955SJung-uk Kim         TotalNamedObjects++;
429eef1b955SJung-uk Kim         break;
430eef1b955SJung-uk Kim 
431eef1b955SJung-uk Kim     case 3:
432a9d8d09cSJung-uk Kim 
433eef1b955SJung-uk Kim         TotalKeywords++;
434eef1b955SJung-uk Kim         TotalExecutableOpcodes++;
435eef1b955SJung-uk Kim         break;
4369c48c75eSJung-uk Kim 
4379c48c75eSJung-uk Kim     default:
438a9d8d09cSJung-uk Kim 
4399c48c75eSJung-uk Kim         break;
440eef1b955SJung-uk Kim     }
441eef1b955SJung-uk Kim 
442eef1b955SJung-uk Kim     for (i = 0; (yytext[i] != 0) && (yytext[i] != EOF); i++)
443eef1b955SJung-uk Kim     {
444eef1b955SJung-uk Kim         AslInsertLineBuffer (yytext[i]);
445eef1b955SJung-uk Kim         *Gbl_LineBufPtr = 0;
446eef1b955SJung-uk Kim     }
447eef1b955SJung-uk Kim }
448eef1b955SJung-uk Kim 
449eef1b955SJung-uk Kim 
450eef1b955SJung-uk Kim /*******************************************************************************
451eef1b955SJung-uk Kim  *
452eef1b955SJung-uk Kim  * FUNCTION:    AslDoComment
453eef1b955SJung-uk Kim  *
454eef1b955SJung-uk Kim  * PARAMETERS:  none
455eef1b955SJung-uk Kim  *
456eef1b955SJung-uk Kim  * RETURN:      none
457eef1b955SJung-uk Kim  *
458eef1b955SJung-uk Kim  * DESCRIPTION: Process a standard comment.
459eef1b955SJung-uk Kim  *
460eef1b955SJung-uk Kim  ******************************************************************************/
461eef1b955SJung-uk Kim 
462eef1b955SJung-uk Kim static char
463eef1b955SJung-uk Kim AslDoComment (
464eef1b955SJung-uk Kim     void)
465eef1b955SJung-uk Kim {
466f38b0f21SJung-uk Kim     int                 c;
467f38b0f21SJung-uk Kim     int                 c1 = 0;
468eef1b955SJung-uk Kim 
469eef1b955SJung-uk Kim 
470eef1b955SJung-uk Kim     AslInsertLineBuffer ('/');
471eef1b955SJung-uk Kim     AslInsertLineBuffer ('*');
472eef1b955SJung-uk Kim 
473eef1b955SJung-uk Kim loop:
474eef1b955SJung-uk Kim 
475eef1b955SJung-uk Kim     /* Eat chars until end-of-comment */
476eef1b955SJung-uk Kim 
4771c0e1b6dSJung-uk Kim     while (((c = input ()) != '*') && (c != EOF))
478eef1b955SJung-uk Kim     {
479eef1b955SJung-uk Kim         AslInsertLineBuffer (c);
480eef1b955SJung-uk Kim         c1 = c;
481eef1b955SJung-uk Kim     }
482eef1b955SJung-uk Kim 
483eef1b955SJung-uk Kim     if (c == EOF)
484eef1b955SJung-uk Kim     {
485eef1b955SJung-uk Kim         goto EarlyEOF;
486eef1b955SJung-uk Kim     }
487eef1b955SJung-uk Kim 
488eef1b955SJung-uk Kim     /*
489eef1b955SJung-uk Kim      * Check for nested comment -- can help catch cases where a previous
490eef1b955SJung-uk Kim      * comment was accidently left unterminated
491eef1b955SJung-uk Kim      */
492eef1b955SJung-uk Kim     if ((c1 == '/') && (c == '*'))
493eef1b955SJung-uk Kim     {
494eef1b955SJung-uk Kim         AslCommonError (ASL_WARNING, ASL_MSG_NESTED_COMMENT,
495eef1b955SJung-uk Kim             Gbl_CurrentLineNumber, Gbl_LogicalLineNumber,
496eef1b955SJung-uk Kim             Gbl_InputByteCount, Gbl_CurrentColumn,
497eef1b955SJung-uk Kim             Gbl_Files[ASL_FILE_INPUT].Filename, NULL);
498eef1b955SJung-uk Kim     }
499eef1b955SJung-uk Kim 
500eef1b955SJung-uk Kim     /* Comment is closed only if the NEXT character is a slash */
501eef1b955SJung-uk Kim 
502eef1b955SJung-uk Kim     AslInsertLineBuffer (c);
503eef1b955SJung-uk Kim 
5041c0e1b6dSJung-uk Kim     if (((c1 = input ()) != '/') && (c1 != EOF))
505eef1b955SJung-uk Kim     {
506eef1b955SJung-uk Kim         unput(c1);
507eef1b955SJung-uk Kim         goto loop;
508eef1b955SJung-uk Kim     }
509eef1b955SJung-uk Kim 
510eef1b955SJung-uk Kim     if (c1 == EOF)
511eef1b955SJung-uk Kim     {
512eef1b955SJung-uk Kim         goto EarlyEOF;
513eef1b955SJung-uk Kim     }
514eef1b955SJung-uk Kim 
515eef1b955SJung-uk Kim     AslInsertLineBuffer (c1);
516eef1b955SJung-uk Kim     return (TRUE);
517eef1b955SJung-uk Kim 
518eef1b955SJung-uk Kim 
519eef1b955SJung-uk Kim EarlyEOF:
520eef1b955SJung-uk Kim     /*
521eef1b955SJung-uk Kim      * Premature End-Of-File
522eef1b955SJung-uk Kim      */
523eef1b955SJung-uk Kim     AslCommonError (ASL_ERROR, ASL_MSG_EARLY_EOF,
524eef1b955SJung-uk Kim         Gbl_CurrentLineNumber, Gbl_LogicalLineNumber,
525eef1b955SJung-uk Kim         Gbl_CurrentLineOffset, Gbl_CurrentColumn,
526eef1b955SJung-uk Kim         Gbl_Files[ASL_FILE_INPUT].Filename, NULL);
527eef1b955SJung-uk Kim     return (FALSE);
528eef1b955SJung-uk Kim }
529eef1b955SJung-uk Kim 
530eef1b955SJung-uk Kim 
531eef1b955SJung-uk Kim /*******************************************************************************
532eef1b955SJung-uk Kim  *
533eef1b955SJung-uk Kim  * FUNCTION:    AslDoCommentType2
534eef1b955SJung-uk Kim  *
535eef1b955SJung-uk Kim  * PARAMETERS:  none
536eef1b955SJung-uk Kim  *
537eef1b955SJung-uk Kim  * RETURN:      none
538eef1b955SJung-uk Kim  *
539eef1b955SJung-uk Kim  * DESCRIPTION: Process a new "//" comment.
540eef1b955SJung-uk Kim  *
541eef1b955SJung-uk Kim  ******************************************************************************/
542eef1b955SJung-uk Kim 
543eef1b955SJung-uk Kim static char
544eef1b955SJung-uk Kim AslDoCommentType2 (
545eef1b955SJung-uk Kim     void)
546eef1b955SJung-uk Kim {
547f38b0f21SJung-uk Kim     int                 c;
548eef1b955SJung-uk Kim 
549eef1b955SJung-uk Kim 
550eef1b955SJung-uk Kim     AslInsertLineBuffer ('/');
551eef1b955SJung-uk Kim     AslInsertLineBuffer ('/');
552eef1b955SJung-uk Kim 
5531c0e1b6dSJung-uk Kim     while (((c = input ()) != '\n') && (c != EOF))
554eef1b955SJung-uk Kim     {
555eef1b955SJung-uk Kim         AslInsertLineBuffer (c);
556eef1b955SJung-uk Kim     }
557eef1b955SJung-uk Kim 
558eef1b955SJung-uk Kim     if (c == EOF)
559eef1b955SJung-uk Kim     {
560eef1b955SJung-uk Kim         /* End of file is OK, change to newline. Let parser detect EOF later */
561eef1b955SJung-uk Kim 
562eef1b955SJung-uk Kim         c = '\n';
563eef1b955SJung-uk Kim     }
564eef1b955SJung-uk Kim 
565eef1b955SJung-uk Kim     AslInsertLineBuffer (c);
566eef1b955SJung-uk Kim     return (TRUE);
567eef1b955SJung-uk Kim }
568eef1b955SJung-uk Kim 
569eef1b955SJung-uk Kim 
570eef1b955SJung-uk Kim /*******************************************************************************
571eef1b955SJung-uk Kim  *
572eef1b955SJung-uk Kim  * FUNCTION:    AslDoStringLiteral
573eef1b955SJung-uk Kim  *
574eef1b955SJung-uk Kim  * PARAMETERS:  none
575eef1b955SJung-uk Kim  *
576eef1b955SJung-uk Kim  * RETURN:      none
577eef1b955SJung-uk Kim  *
578eef1b955SJung-uk Kim  * DESCRIPTION: Process a string literal (surrounded by quotes)
579eef1b955SJung-uk Kim  *
580eef1b955SJung-uk Kim  ******************************************************************************/
581eef1b955SJung-uk Kim 
582eef1b955SJung-uk Kim static char
583eef1b955SJung-uk Kim AslDoStringLiteral (
584eef1b955SJung-uk Kim     void)
585eef1b955SJung-uk Kim {
586eef1b955SJung-uk Kim     char                *StringBuffer = MsgBuffer;
587eef1b955SJung-uk Kim     char                *EndBuffer = MsgBuffer + ASL_MSG_BUFFER_SIZE;
588eef1b955SJung-uk Kim     char                *CleanString;
589f38b0f21SJung-uk Kim     int                 StringChar;
590eef1b955SJung-uk Kim     UINT32              State = ASL_NORMAL_CHAR;
591eef1b955SJung-uk Kim     UINT32              i = 0;
592eef1b955SJung-uk Kim     UINT8               Digit;
593eef1b955SJung-uk Kim     char                ConvertBuffer[4];
594eef1b955SJung-uk Kim 
595eef1b955SJung-uk Kim 
596eef1b955SJung-uk Kim     /*
597eef1b955SJung-uk Kim      * Eat chars until end-of-literal.
598eef1b955SJung-uk Kim      * NOTE:  Put back the original surrounding quotes into the
599eef1b955SJung-uk Kim      * source line buffer.
600eef1b955SJung-uk Kim      */
601eef1b955SJung-uk Kim     AslInsertLineBuffer ('\"');
602f38b0f21SJung-uk Kim     while ((StringChar = input()) != EOF)
603eef1b955SJung-uk Kim     {
604eef1b955SJung-uk Kim         AslInsertLineBuffer (StringChar);
605eef1b955SJung-uk Kim 
606eef1b955SJung-uk Kim DoCharacter:
607eef1b955SJung-uk Kim         switch (State)
608eef1b955SJung-uk Kim         {
609eef1b955SJung-uk Kim         case ASL_NORMAL_CHAR:
610eef1b955SJung-uk Kim 
611eef1b955SJung-uk Kim             switch (StringChar)
612eef1b955SJung-uk Kim             {
613eef1b955SJung-uk Kim             case '\\':
614eef1b955SJung-uk Kim                 /*
615eef1b955SJung-uk Kim                  * Special handling for backslash-escape sequence. We will
616eef1b955SJung-uk Kim                  * toss the backslash and translate the escape char(s).
617eef1b955SJung-uk Kim                  */
618eef1b955SJung-uk Kim                 State = ASL_ESCAPE_SEQUENCE;
619eef1b955SJung-uk Kim                 continue;
620eef1b955SJung-uk Kim 
621eef1b955SJung-uk Kim             case '\"':
622eef1b955SJung-uk Kim 
623eef1b955SJung-uk Kim                 /* String terminator */
624eef1b955SJung-uk Kim 
625eef1b955SJung-uk Kim                 goto CompletedString;
6269c48c75eSJung-uk Kim 
6279c48c75eSJung-uk Kim             default:
628a9d8d09cSJung-uk Kim 
6299c48c75eSJung-uk Kim                 break;
630eef1b955SJung-uk Kim             }
631eef1b955SJung-uk Kim             break;
632eef1b955SJung-uk Kim 
633eef1b955SJung-uk Kim 
634eef1b955SJung-uk Kim         case ASL_ESCAPE_SEQUENCE:
635eef1b955SJung-uk Kim 
636eef1b955SJung-uk Kim             State = ASL_NORMAL_CHAR;
637eef1b955SJung-uk Kim             switch (StringChar)
638eef1b955SJung-uk Kim             {
639eef1b955SJung-uk Kim             case 'a':
640a9d8d09cSJung-uk Kim 
641eef1b955SJung-uk Kim                 StringChar = 0x07;      /* BELL */
642eef1b955SJung-uk Kim                 break;
643eef1b955SJung-uk Kim 
644eef1b955SJung-uk Kim             case 'b':
645a9d8d09cSJung-uk Kim 
646eef1b955SJung-uk Kim                 StringChar = 0x08;      /* BACKSPACE */
647eef1b955SJung-uk Kim                 break;
648eef1b955SJung-uk Kim 
649eef1b955SJung-uk Kim             case 'f':
650a9d8d09cSJung-uk Kim 
651eef1b955SJung-uk Kim                 StringChar = 0x0C;      /* FORMFEED */
652eef1b955SJung-uk Kim                 break;
653eef1b955SJung-uk Kim 
654eef1b955SJung-uk Kim             case 'n':
655a9d8d09cSJung-uk Kim 
656eef1b955SJung-uk Kim                 StringChar = 0x0A;      /* LINEFEED */
657eef1b955SJung-uk Kim                 break;
658eef1b955SJung-uk Kim 
659eef1b955SJung-uk Kim             case 'r':
660a9d8d09cSJung-uk Kim 
661eef1b955SJung-uk Kim                 StringChar = 0x0D;      /* CARRIAGE RETURN*/
662eef1b955SJung-uk Kim                 break;
663eef1b955SJung-uk Kim 
664eef1b955SJung-uk Kim             case 't':
665a9d8d09cSJung-uk Kim 
666eef1b955SJung-uk Kim                 StringChar = 0x09;      /* HORIZONTAL TAB */
667eef1b955SJung-uk Kim                 break;
668eef1b955SJung-uk Kim 
669eef1b955SJung-uk Kim             case 'v':
670a9d8d09cSJung-uk Kim 
671eef1b955SJung-uk Kim                 StringChar = 0x0B;      /* VERTICAL TAB */
672eef1b955SJung-uk Kim                 break;
673eef1b955SJung-uk Kim 
674eef1b955SJung-uk Kim             case 'x':
675a9d8d09cSJung-uk Kim 
676eef1b955SJung-uk Kim                 State = ASL_HEX_CONSTANT;
677eef1b955SJung-uk Kim                 i = 0;
678eef1b955SJung-uk Kim                 continue;
679eef1b955SJung-uk Kim 
680eef1b955SJung-uk Kim             case '\'':                  /* Single Quote */
681eef1b955SJung-uk Kim             case '\"':                  /* Double Quote */
682eef1b955SJung-uk Kim             case '\\':                  /* Backslash */
683a9d8d09cSJung-uk Kim 
684eef1b955SJung-uk Kim                 break;
685eef1b955SJung-uk Kim 
686eef1b955SJung-uk Kim             default:
687eef1b955SJung-uk Kim 
688eef1b955SJung-uk Kim                 /* Check for an octal digit (0-7) */
689eef1b955SJung-uk Kim 
690eef1b955SJung-uk Kim                 if (ACPI_IS_OCTAL_DIGIT (StringChar))
691eef1b955SJung-uk Kim                 {
692eef1b955SJung-uk Kim                     State = ASL_OCTAL_CONSTANT;
693eef1b955SJung-uk Kim                     ConvertBuffer[0] = StringChar;
694eef1b955SJung-uk Kim                     i = 1;
695eef1b955SJung-uk Kim                     continue;
696eef1b955SJung-uk Kim                 }
697eef1b955SJung-uk Kim 
698eef1b955SJung-uk Kim                 /* Unknown escape sequence issue warning, but use the character */
699eef1b955SJung-uk Kim 
700eef1b955SJung-uk Kim                 AslCommonError (ASL_WARNING, ASL_MSG_INVALID_ESCAPE,
701eef1b955SJung-uk Kim                     Gbl_CurrentLineNumber, Gbl_LogicalLineNumber,
702eef1b955SJung-uk Kim                     Gbl_CurrentLineOffset, Gbl_CurrentColumn,
703eef1b955SJung-uk Kim                     Gbl_Files[ASL_FILE_INPUT].Filename, NULL);
704eef1b955SJung-uk Kim                 break;
705eef1b955SJung-uk Kim             }
706eef1b955SJung-uk Kim             break;
707eef1b955SJung-uk Kim 
708eef1b955SJung-uk Kim 
709eef1b955SJung-uk Kim         case ASL_OCTAL_CONSTANT:
710eef1b955SJung-uk Kim 
711eef1b955SJung-uk Kim             /* Up to three octal digits allowed */
712eef1b955SJung-uk Kim 
713eef1b955SJung-uk Kim             if (!ACPI_IS_OCTAL_DIGIT (StringChar) ||
714eef1b955SJung-uk Kim                 (i > 2))
715eef1b955SJung-uk Kim             {
716eef1b955SJung-uk Kim                 /*
717eef1b955SJung-uk Kim                  * Reached end of the constant. Convert the assembled ASCII
718eef1b955SJung-uk Kim                  * string and resume processing of the next character
719eef1b955SJung-uk Kim                  */
720eef1b955SJung-uk Kim                 ConvertBuffer[i] = 0;
7215ef50723SJung-uk Kim                 Digit = (UINT8) strtoul (ConvertBuffer, NULL, 8);
722eef1b955SJung-uk Kim 
723eef1b955SJung-uk Kim                 /* Check for NULL or non-ascii character (ignore if so) */
724eef1b955SJung-uk Kim 
725eef1b955SJung-uk Kim                 if ((Digit == 0) || (Digit > ACPI_ASCII_MAX))
726eef1b955SJung-uk Kim                 {
727eef1b955SJung-uk Kim                     AslCommonError (ASL_WARNING, ASL_MSG_INVALID_STRING,
728eef1b955SJung-uk Kim                         Gbl_CurrentLineNumber, Gbl_LogicalLineNumber,
729eef1b955SJung-uk Kim                         Gbl_CurrentLineOffset, Gbl_CurrentColumn,
730eef1b955SJung-uk Kim                         Gbl_Files[ASL_FILE_INPUT].Filename, NULL);
731eef1b955SJung-uk Kim                 }
732eef1b955SJung-uk Kim                 else
733eef1b955SJung-uk Kim                 {
734eef1b955SJung-uk Kim                     *StringBuffer = (char) Digit;
735eef1b955SJung-uk Kim                     StringBuffer++;
736eef1b955SJung-uk Kim                     if (StringBuffer >= EndBuffer)
737eef1b955SJung-uk Kim                     {
738eef1b955SJung-uk Kim                         goto BufferOverflow;
739eef1b955SJung-uk Kim                     }
740eef1b955SJung-uk Kim                 }
741eef1b955SJung-uk Kim 
742eef1b955SJung-uk Kim                 State = ASL_NORMAL_CHAR;
743eef1b955SJung-uk Kim                 goto DoCharacter;
744eef1b955SJung-uk Kim                 break;
745eef1b955SJung-uk Kim             }
746eef1b955SJung-uk Kim 
747eef1b955SJung-uk Kim             /* Append another digit of the constant */
748eef1b955SJung-uk Kim 
749eef1b955SJung-uk Kim             ConvertBuffer[i] = StringChar;
750eef1b955SJung-uk Kim             i++;
751eef1b955SJung-uk Kim             continue;
752eef1b955SJung-uk Kim 
753eef1b955SJung-uk Kim         case ASL_HEX_CONSTANT:
754eef1b955SJung-uk Kim 
755eef1b955SJung-uk Kim             /* Up to two hex digits allowed */
756eef1b955SJung-uk Kim 
7575ef50723SJung-uk Kim             if (!isxdigit (StringChar) ||
758eef1b955SJung-uk Kim                 (i > 1))
759eef1b955SJung-uk Kim             {
760eef1b955SJung-uk Kim                 /*
761eef1b955SJung-uk Kim                  * Reached end of the constant. Convert the assembled ASCII
762eef1b955SJung-uk Kim                  * string and resume processing of the next character
763eef1b955SJung-uk Kim                  */
764eef1b955SJung-uk Kim                 ConvertBuffer[i] = 0;
7655ef50723SJung-uk Kim                 Digit = (UINT8) strtoul (ConvertBuffer, NULL, 16);
766eef1b955SJung-uk Kim 
767eef1b955SJung-uk Kim                 /* Check for NULL or non-ascii character (ignore if so) */
768eef1b955SJung-uk Kim 
769eef1b955SJung-uk Kim                 if ((Digit == 0) || (Digit > ACPI_ASCII_MAX))
770eef1b955SJung-uk Kim                 {
771eef1b955SJung-uk Kim                     AslCommonError (ASL_WARNING, ASL_MSG_INVALID_STRING,
772eef1b955SJung-uk Kim                         Gbl_CurrentLineNumber, Gbl_LogicalLineNumber,
773eef1b955SJung-uk Kim                         Gbl_CurrentLineOffset, Gbl_CurrentColumn,
774eef1b955SJung-uk Kim                         Gbl_Files[ASL_FILE_INPUT].Filename, NULL);
775eef1b955SJung-uk Kim                 }
776eef1b955SJung-uk Kim                 else
777eef1b955SJung-uk Kim                 {
778eef1b955SJung-uk Kim                     *StringBuffer = (char) Digit;
779eef1b955SJung-uk Kim                     StringBuffer++;
780eef1b955SJung-uk Kim                     if (StringBuffer >= EndBuffer)
781eef1b955SJung-uk Kim                     {
782eef1b955SJung-uk Kim                         goto BufferOverflow;
783eef1b955SJung-uk Kim                     }
784eef1b955SJung-uk Kim                 }
785eef1b955SJung-uk Kim 
786eef1b955SJung-uk Kim                 State = ASL_NORMAL_CHAR;
787eef1b955SJung-uk Kim                 goto DoCharacter;
788eef1b955SJung-uk Kim                 break;
789eef1b955SJung-uk Kim             }
790eef1b955SJung-uk Kim 
791eef1b955SJung-uk Kim             /* Append another digit of the constant */
792eef1b955SJung-uk Kim 
793eef1b955SJung-uk Kim             ConvertBuffer[i] = StringChar;
794eef1b955SJung-uk Kim             i++;
795eef1b955SJung-uk Kim             continue;
7969c48c75eSJung-uk Kim 
7979c48c75eSJung-uk Kim         default:
798a9d8d09cSJung-uk Kim 
7999c48c75eSJung-uk Kim             break;
800eef1b955SJung-uk Kim         }
801eef1b955SJung-uk Kim 
802eef1b955SJung-uk Kim         /* Save the finished character */
803eef1b955SJung-uk Kim 
804eef1b955SJung-uk Kim         *StringBuffer = StringChar;
805eef1b955SJung-uk Kim         StringBuffer++;
806eef1b955SJung-uk Kim         if (StringBuffer >= EndBuffer)
807eef1b955SJung-uk Kim         {
808eef1b955SJung-uk Kim             goto BufferOverflow;
809eef1b955SJung-uk Kim         }
810eef1b955SJung-uk Kim     }
811eef1b955SJung-uk Kim 
812eef1b955SJung-uk Kim     /*
813eef1b955SJung-uk Kim      * Premature End-Of-File
814eef1b955SJung-uk Kim      */
815eef1b955SJung-uk Kim     AslCommonError (ASL_ERROR, ASL_MSG_EARLY_EOF,
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 CompletedString:
823eef1b955SJung-uk Kim     /*
824eef1b955SJung-uk Kim      * Null terminate the input string and copy string to a new buffer
825eef1b955SJung-uk Kim      */
826eef1b955SJung-uk Kim     *StringBuffer = 0;
827eef1b955SJung-uk Kim 
828313a0c13SJung-uk Kim     CleanString = UtStringCacheCalloc (strlen (MsgBuffer) + 1);
829eef1b955SJung-uk Kim     if (!CleanString)
830eef1b955SJung-uk Kim     {
831eef1b955SJung-uk Kim         AslCommonError (ASL_ERROR, ASL_MSG_MEMORY_ALLOCATION,
832eef1b955SJung-uk Kim             Gbl_CurrentLineNumber, Gbl_LogicalLineNumber,
833eef1b955SJung-uk Kim             Gbl_CurrentLineOffset, Gbl_CurrentColumn,
834eef1b955SJung-uk Kim             Gbl_Files[ASL_FILE_INPUT].Filename, NULL);
835eef1b955SJung-uk Kim         return (FALSE);
836eef1b955SJung-uk Kim     }
837eef1b955SJung-uk Kim 
8385ef50723SJung-uk Kim     strcpy (CleanString, MsgBuffer);
839eef1b955SJung-uk Kim     AslCompilerlval.s = CleanString;
840eef1b955SJung-uk Kim     return (TRUE);
841eef1b955SJung-uk Kim 
842eef1b955SJung-uk Kim 
843eef1b955SJung-uk Kim BufferOverflow:
844eef1b955SJung-uk Kim 
845eef1b955SJung-uk Kim     /* Literal was too long */
846eef1b955SJung-uk Kim 
847eef1b955SJung-uk Kim     AslCommonError (ASL_ERROR, ASL_MSG_STRING_LENGTH,
848eef1b955SJung-uk Kim         Gbl_CurrentLineNumber, Gbl_LogicalLineNumber,
849eef1b955SJung-uk Kim         Gbl_CurrentLineOffset, Gbl_CurrentColumn,
850eef1b955SJung-uk Kim         Gbl_Files[ASL_FILE_INPUT].Filename, "Max length 4096");
851eef1b955SJung-uk Kim     return (FALSE);
852eef1b955SJung-uk Kim }
853