10d02842fSSascha Wildner /******************************************************************************
20d02842fSSascha Wildner  *
30d02842fSSascha Wildner  * Module Name: aslfiles - File support functions
40d02842fSSascha Wildner  *
50d02842fSSascha Wildner  *****************************************************************************/
60d02842fSSascha Wildner 
7b4315fc7SSascha Wildner /******************************************************************************
8b4315fc7SSascha Wildner  *
9b4315fc7SSascha Wildner  * 1. Copyright Notice
10b4315fc7SSascha Wildner  *
11383048acSSascha Wildner  * Some or all of this work - Copyright (c) 1999 - 2021, Intel Corp.
120d02842fSSascha Wildner  * All rights reserved.
130d02842fSSascha Wildner  *
14b4315fc7SSascha Wildner  * 2. License
15b4315fc7SSascha Wildner  *
16b4315fc7SSascha Wildner  * 2.1. This is your license from Intel Corp. under its intellectual property
17b4315fc7SSascha Wildner  * rights. You may have additional license terms from the party that provided
18b4315fc7SSascha Wildner  * you this software, covering your right to use that party's intellectual
19b4315fc7SSascha Wildner  * property rights.
20b4315fc7SSascha Wildner  *
21b4315fc7SSascha Wildner  * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
22b4315fc7SSascha Wildner  * copy of the source code appearing in this file ("Covered Code") an
23b4315fc7SSascha Wildner  * irrevocable, perpetual, worldwide license under Intel's copyrights in the
24b4315fc7SSascha Wildner  * base code distributed originally by Intel ("Original Intel Code") to copy,
25b4315fc7SSascha Wildner  * make derivatives, distribute, use and display any portion of the Covered
26b4315fc7SSascha Wildner  * Code in any form, with the right to sublicense such rights; and
27b4315fc7SSascha Wildner  *
28b4315fc7SSascha Wildner  * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
29b4315fc7SSascha Wildner  * license (with the right to sublicense), under only those claims of Intel
30b4315fc7SSascha Wildner  * patents that are infringed by the Original Intel Code, to make, use, sell,
31b4315fc7SSascha Wildner  * offer to sell, and import the Covered Code and derivative works thereof
32b4315fc7SSascha Wildner  * solely to the minimum extent necessary to exercise the above copyright
33b4315fc7SSascha Wildner  * license, and in no event shall the patent license extend to any additions
34b4315fc7SSascha Wildner  * to or modifications of the Original Intel Code. No other license or right
35b4315fc7SSascha Wildner  * is granted directly or by implication, estoppel or otherwise;
36b4315fc7SSascha Wildner  *
37b4315fc7SSascha Wildner  * The above copyright and patent license is granted only if the following
38b4315fc7SSascha Wildner  * conditions are met:
39b4315fc7SSascha Wildner  *
40b4315fc7SSascha Wildner  * 3. Conditions
41b4315fc7SSascha Wildner  *
42b4315fc7SSascha Wildner  * 3.1. Redistribution of Source with Rights to Further Distribute Source.
43b4315fc7SSascha Wildner  * Redistribution of source code of any substantial portion of the Covered
44b4315fc7SSascha Wildner  * Code or modification with rights to further distribute source must include
45b4315fc7SSascha Wildner  * the above Copyright Notice, the above License, this list of Conditions,
46b4315fc7SSascha Wildner  * and the following Disclaimer and Export Compliance provision. In addition,
47b4315fc7SSascha Wildner  * Licensee must cause all Covered Code to which Licensee contributes to
48b4315fc7SSascha Wildner  * contain a file documenting the changes Licensee made to create that Covered
49b4315fc7SSascha Wildner  * Code and the date of any change. Licensee must include in that file the
50b4315fc7SSascha Wildner  * documentation of any changes made by any predecessor Licensee. Licensee
51b4315fc7SSascha Wildner  * must include a prominent statement that the modification is derived,
52b4315fc7SSascha Wildner  * directly or indirectly, from Original Intel Code.
53b4315fc7SSascha Wildner  *
54b4315fc7SSascha Wildner  * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
55b4315fc7SSascha Wildner  * Redistribution of source code of any substantial portion of the Covered
56b4315fc7SSascha Wildner  * Code or modification without rights to further distribute source must
57b4315fc7SSascha Wildner  * include the following Disclaimer and Export Compliance provision in the
58b4315fc7SSascha Wildner  * documentation and/or other materials provided with distribution. In
59b4315fc7SSascha Wildner  * addition, Licensee may not authorize further sublicense of source of any
60b4315fc7SSascha Wildner  * portion of the Covered Code, and must include terms to the effect that the
61b4315fc7SSascha Wildner  * license from Licensee to its licensee is limited to the intellectual
62b4315fc7SSascha Wildner  * property embodied in the software Licensee provides to its licensee, and
63b4315fc7SSascha Wildner  * not to intellectual property embodied in modifications its licensee may
64b4315fc7SSascha Wildner  * make.
65b4315fc7SSascha Wildner  *
66b4315fc7SSascha Wildner  * 3.3. Redistribution of Executable. Redistribution in executable form of any
67b4315fc7SSascha Wildner  * substantial portion of the Covered Code or modification must reproduce the
68b4315fc7SSascha Wildner  * above Copyright Notice, and the following Disclaimer and Export Compliance
69b4315fc7SSascha Wildner  * provision in the documentation and/or other materials provided with the
70b4315fc7SSascha Wildner  * distribution.
71b4315fc7SSascha Wildner  *
72b4315fc7SSascha Wildner  * 3.4. Intel retains all right, title, and interest in and to the Original
73b4315fc7SSascha Wildner  * Intel Code.
74b4315fc7SSascha Wildner  *
75b4315fc7SSascha Wildner  * 3.5. Neither the name Intel nor any other trademark owned or controlled by
76b4315fc7SSascha Wildner  * Intel shall be used in advertising or otherwise to promote the sale, use or
77b4315fc7SSascha Wildner  * other dealings in products derived from or relating to the Covered Code
78b4315fc7SSascha Wildner  * without prior written authorization from Intel.
79b4315fc7SSascha Wildner  *
80b4315fc7SSascha Wildner  * 4. Disclaimer and Export Compliance
81b4315fc7SSascha Wildner  *
82b4315fc7SSascha Wildner  * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
83b4315fc7SSascha Wildner  * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
84b4315fc7SSascha Wildner  * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
85b4315fc7SSascha Wildner  * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
86b4315fc7SSascha Wildner  * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
87b4315fc7SSascha Wildner  * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
88b4315fc7SSascha Wildner  * PARTICULAR PURPOSE.
89b4315fc7SSascha Wildner  *
90b4315fc7SSascha Wildner  * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
91b4315fc7SSascha Wildner  * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
92b4315fc7SSascha Wildner  * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
93b4315fc7SSascha Wildner  * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
94b4315fc7SSascha Wildner  * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
95b4315fc7SSascha Wildner  * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
96b4315fc7SSascha Wildner  * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
97b4315fc7SSascha Wildner  * LIMITED REMEDY.
98b4315fc7SSascha Wildner  *
99b4315fc7SSascha Wildner  * 4.3. Licensee shall not export, either directly or indirectly, any of this
100b4315fc7SSascha Wildner  * software or system incorporating such software without first obtaining any
101b4315fc7SSascha Wildner  * required license or other approval from the U. S. Department of Commerce or
102b4315fc7SSascha Wildner  * any other agency or department of the United States Government. In the
103b4315fc7SSascha Wildner  * event Licensee exports any such software from the United States or
104b4315fc7SSascha Wildner  * re-exports any such software from a foreign destination, Licensee shall
105b4315fc7SSascha Wildner  * ensure that the distribution and export/re-export of the software is in
106b4315fc7SSascha Wildner  * compliance with all laws, regulations, orders, or other restrictions of the
107b4315fc7SSascha Wildner  * U.S. Export Administration Regulations. Licensee agrees that neither it nor
108b4315fc7SSascha Wildner  * any of its subsidiaries will export/re-export any technical data, process,
109b4315fc7SSascha Wildner  * software, or service, directly or indirectly, to any country for which the
110b4315fc7SSascha Wildner  * United States government or any agency thereof requires an export license,
111b4315fc7SSascha Wildner  * other governmental approval, or letter of assurance, without first obtaining
112b4315fc7SSascha Wildner  * such license, approval or letter.
113b4315fc7SSascha Wildner  *
114b4315fc7SSascha Wildner  *****************************************************************************
115b4315fc7SSascha Wildner  *
116b4315fc7SSascha Wildner  * Alternatively, you may choose to be licensed under the terms of the
117b4315fc7SSascha Wildner  * following license:
118b4315fc7SSascha Wildner  *
1190d02842fSSascha Wildner  * Redistribution and use in source and binary forms, with or without
1200d02842fSSascha Wildner  * modification, are permitted provided that the following conditions
1210d02842fSSascha Wildner  * are met:
1220d02842fSSascha Wildner  * 1. Redistributions of source code must retain the above copyright
1230d02842fSSascha Wildner  *    notice, this list of conditions, and the following disclaimer,
1240d02842fSSascha Wildner  *    without modification.
1250d02842fSSascha Wildner  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
1260d02842fSSascha Wildner  *    substantially similar to the "NO WARRANTY" disclaimer below
1270d02842fSSascha Wildner  *    ("Disclaimer") and any redistribution must be conditioned upon
1280d02842fSSascha Wildner  *    including a substantially similar Disclaimer requirement for further
1290d02842fSSascha Wildner  *    binary redistribution.
1300d02842fSSascha Wildner  * 3. Neither the names of the above-listed copyright holders nor the names
1310d02842fSSascha Wildner  *    of any contributors may be used to endorse or promote products derived
1320d02842fSSascha Wildner  *    from this software without specific prior written permission.
1330d02842fSSascha Wildner  *
134b4315fc7SSascha Wildner  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
135b4315fc7SSascha Wildner  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
136b4315fc7SSascha Wildner  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
137b4315fc7SSascha Wildner  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
138b4315fc7SSascha Wildner  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
139b4315fc7SSascha Wildner  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
140b4315fc7SSascha Wildner  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
141b4315fc7SSascha Wildner  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
142b4315fc7SSascha Wildner  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
143b4315fc7SSascha Wildner  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
144b4315fc7SSascha Wildner  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
145b4315fc7SSascha Wildner  *
146b4315fc7SSascha Wildner  * Alternatively, you may choose to be licensed under the terms of the
1470d02842fSSascha Wildner  * GNU General Public License ("GPL") version 2 as published by the Free
1480d02842fSSascha Wildner  * Software Foundation.
1490d02842fSSascha Wildner  *
150b4315fc7SSascha Wildner  *****************************************************************************/
1510d02842fSSascha Wildner 
1520d02842fSSascha Wildner #include "aslcompiler.h"
1530d02842fSSascha Wildner #include "acapps.h"
1540d02842fSSascha Wildner 
1550d02842fSSascha Wildner #define _COMPONENT          ACPI_COMPILER
1560d02842fSSascha Wildner         ACPI_MODULE_NAME    ("aslfiles")
1570d02842fSSascha Wildner 
1580d02842fSSascha Wildner /* Local prototypes */
1590d02842fSSascha Wildner 
160896f2e3aSSascha Wildner static FILE *
1610d02842fSSascha Wildner FlOpenIncludeWithPrefix (
1620d02842fSSascha Wildner     char                    *PrefixDir,
163896f2e3aSSascha Wildner     ACPI_PARSE_OBJECT       *Op,
1640d02842fSSascha Wildner     char                    *Filename);
1650d02842fSSascha Wildner 
166835079a2SSascha Wildner static BOOLEAN
167835079a2SSascha Wildner FlInputFileExists (
168835079a2SSascha Wildner     char                    *InputFilename);
169835079a2SSascha Wildner 
1700d02842fSSascha Wildner #ifdef ACPI_OBSOLETE_FUNCTIONS
1710d02842fSSascha Wildner ACPI_STATUS
1720d02842fSSascha Wildner FlParseInputPathname (
1730d02842fSSascha Wildner     char                    *InputFilename);
1740d02842fSSascha Wildner #endif
1750d02842fSSascha Wildner 
1760d02842fSSascha Wildner 
1770d02842fSSascha Wildner /*******************************************************************************
1780d02842fSSascha Wildner  *
179a4b9c0c9SSascha Wildner  * FUNCTION:    FlInitOneFile
180a4b9c0c9SSascha Wildner  *
181a4b9c0c9SSascha Wildner  * PARAMETERS:  InputFilename       - The user-specified ASL source file to be
182a4b9c0c9SSascha Wildner  *                                    compiled
183a4b9c0c9SSascha Wildner  *
184a4b9c0c9SSascha Wildner  * RETURN:      Status
185a4b9c0c9SSascha Wildner  *
186a4b9c0c9SSascha Wildner  * DESCRIPTION: Initialize global file structure for one input file. This file
187a4b9c0c9SSascha Wildner  *              structure contains references to input, output, debugging, and
188a4b9c0c9SSascha Wildner  *              other miscellaneous files that are associated for a single
189a4b9c0c9SSascha Wildner  *              input ASL file.
190a4b9c0c9SSascha Wildner  *
191a4b9c0c9SSascha Wildner  ******************************************************************************/
192a4b9c0c9SSascha Wildner 
193a4b9c0c9SSascha Wildner ACPI_STATUS
FlInitOneFile(char * InputFilename)194a4b9c0c9SSascha Wildner FlInitOneFile (
195a4b9c0c9SSascha Wildner     char                    *InputFilename)
196a4b9c0c9SSascha Wildner {
197a4b9c0c9SSascha Wildner     UINT32                  i;
198a4b9c0c9SSascha Wildner     ASL_GLOBAL_FILE_NODE    *NewFileNode;
199a4b9c0c9SSascha Wildner 
200a4b9c0c9SSascha Wildner 
201a4b9c0c9SSascha Wildner     if (FlInputFileExists (InputFilename))
202a4b9c0c9SSascha Wildner     {
203a4b9c0c9SSascha Wildner         AslError (ASL_ERROR, ASL_MSG_DUPLICATE_INPUT_FILE, NULL, InputFilename);
204a4b9c0c9SSascha Wildner         return (AE_ALREADY_EXISTS);
205a4b9c0c9SSascha Wildner     }
206a4b9c0c9SSascha Wildner 
207a4b9c0c9SSascha Wildner     NewFileNode = ACPI_CAST_PTR (ASL_GLOBAL_FILE_NODE,
208a4b9c0c9SSascha Wildner         UtLocalCacheCalloc (sizeof (ASL_GLOBAL_FILE_NODE)));
209a4b9c0c9SSascha Wildner 
210a4b9c0c9SSascha Wildner     NewFileNode->ParserErrorDetected = FALSE;
211a4b9c0c9SSascha Wildner     NewFileNode->Next = AslGbl_FilesList;
212a4b9c0c9SSascha Wildner 
213a4b9c0c9SSascha Wildner     AslGbl_FilesList = NewFileNode;
214a4b9c0c9SSascha Wildner     AslGbl_Files = NewFileNode->Files;
215a4b9c0c9SSascha Wildner 
216a4b9c0c9SSascha Wildner     for (i = 0; i < ASL_NUM_FILES; i++)
217a4b9c0c9SSascha Wildner     {
218a4b9c0c9SSascha Wildner         AslGbl_Files[i].Handle = NULL;
219a4b9c0c9SSascha Wildner         AslGbl_Files[i].Filename = NULL;
220a4b9c0c9SSascha Wildner     }
221a4b9c0c9SSascha Wildner 
222a4b9c0c9SSascha Wildner     AslGbl_Files[ASL_FILE_STDOUT].Handle   = stdout;
223a4b9c0c9SSascha Wildner     AslGbl_Files[ASL_FILE_STDOUT].Filename = "STDOUT";
224a4b9c0c9SSascha Wildner 
225a4b9c0c9SSascha Wildner     if (AslGbl_VerboseErrors)
226a4b9c0c9SSascha Wildner     {
227a4b9c0c9SSascha Wildner         AslGbl_Files[ASL_FILE_STDERR].Handle = stderr;
228a4b9c0c9SSascha Wildner     }
229a4b9c0c9SSascha Wildner     else
230a4b9c0c9SSascha Wildner     {
231a4b9c0c9SSascha Wildner         AslGbl_Files[ASL_FILE_STDERR].Handle = stdout;
232a4b9c0c9SSascha Wildner     }
233a4b9c0c9SSascha Wildner 
234a4b9c0c9SSascha Wildner     AslGbl_Files[ASL_FILE_STDERR].Filename = "STDERR";
235a4b9c0c9SSascha Wildner     return (AE_OK);
236a4b9c0c9SSascha Wildner }
237a4b9c0c9SSascha Wildner 
238a4b9c0c9SSascha Wildner 
239a4b9c0c9SSascha Wildner /*******************************************************************************
240a4b9c0c9SSascha Wildner  *
241a4b9c0c9SSascha Wildner  * FUNCTION:    FlInputFileExists
242a4b9c0c9SSascha Wildner  *
243a4b9c0c9SSascha Wildner  * PARAMETERS:  Filename       - File name to be searched
244a4b9c0c9SSascha Wildner  *
245a4b9c0c9SSascha Wildner  * RETURN:      Status
246a4b9c0c9SSascha Wildner  *
247a4b9c0c9SSascha Wildner  * DESCRIPTION: Returns true if the file name already exists.
248a4b9c0c9SSascha Wildner  *
249a4b9c0c9SSascha Wildner  ******************************************************************************/
250a4b9c0c9SSascha Wildner 
251835079a2SSascha Wildner static BOOLEAN
FlInputFileExists(char * Filename)252a4b9c0c9SSascha Wildner FlInputFileExists (
253a4b9c0c9SSascha Wildner     char                    *Filename)
254a4b9c0c9SSascha Wildner {
255a4b9c0c9SSascha Wildner     ASL_GLOBAL_FILE_NODE    *Current = AslGbl_FilesList;
256a4b9c0c9SSascha Wildner 
257a4b9c0c9SSascha Wildner 
258a4b9c0c9SSascha Wildner     while (Current)
259a4b9c0c9SSascha Wildner     {
260a4b9c0c9SSascha Wildner         if (!strcmp (Filename, Current->Files[ASL_FILE_INPUT].Filename))
261a4b9c0c9SSascha Wildner         {
262a4b9c0c9SSascha Wildner             return (TRUE);
263a4b9c0c9SSascha Wildner         }
264a4b9c0c9SSascha Wildner 
265a4b9c0c9SSascha Wildner         Current = Current->Next;
266a4b9c0c9SSascha Wildner     }
267a4b9c0c9SSascha Wildner 
268a4b9c0c9SSascha Wildner     return (FALSE);
269a4b9c0c9SSascha Wildner }
270a4b9c0c9SSascha Wildner 
271a4b9c0c9SSascha Wildner 
272a4b9c0c9SSascha Wildner /*******************************************************************************
273a4b9c0c9SSascha Wildner  *
274a4b9c0c9SSascha Wildner  * FUNCTION:    FlSwitchFileSet
275a4b9c0c9SSascha Wildner  *
276a4b9c0c9SSascha Wildner  * PARAMETERS:  Op        - Parse node for the LINE asl statement
277a4b9c0c9SSascha Wildner  *
278a4b9c0c9SSascha Wildner  * RETURN:      None.
279a4b9c0c9SSascha Wildner  *
280a4b9c0c9SSascha Wildner  * DESCRIPTION: Set the current line number
281a4b9c0c9SSascha Wildner  *
282a4b9c0c9SSascha Wildner  ******************************************************************************/
283a4b9c0c9SSascha Wildner 
284a4b9c0c9SSascha Wildner ASL_FILE_SWITCH_STATUS
FlSwitchFileSet(char * InputFilename)285a4b9c0c9SSascha Wildner FlSwitchFileSet (
286a4b9c0c9SSascha Wildner     char                    *InputFilename)
287a4b9c0c9SSascha Wildner {
288a4b9c0c9SSascha Wildner     ASL_GLOBAL_FILE_NODE    *Current = AslGbl_FilesList;
289a4b9c0c9SSascha Wildner     char                    *PrevFilename = Current->Files[ASL_FILE_INPUT].Filename;
290a4b9c0c9SSascha Wildner 
291a4b9c0c9SSascha Wildner 
292a4b9c0c9SSascha Wildner     while (Current)
293a4b9c0c9SSascha Wildner     {
294a4b9c0c9SSascha Wildner         if (!strcmp(Current->Files[ASL_FILE_INPUT].Filename, InputFilename))
295a4b9c0c9SSascha Wildner         {
296a4b9c0c9SSascha Wildner             AslGbl_Files = Current->Files;
297a4b9c0c9SSascha Wildner             AslGbl_TableSignature = Current->TableSignature;
298a4b9c0c9SSascha Wildner             AslGbl_TableId = Current->TableId;
299a4b9c0c9SSascha Wildner 
300a4b9c0c9SSascha Wildner             if (!strcmp (InputFilename, PrevFilename))
301a4b9c0c9SSascha Wildner             {
302a4b9c0c9SSascha Wildner                 return (SWITCH_TO_SAME_FILE);
303a4b9c0c9SSascha Wildner             }
304a4b9c0c9SSascha Wildner             else
305a4b9c0c9SSascha Wildner             {
306a4b9c0c9SSascha Wildner                 return (SWITCH_TO_DIFFERENT_FILE);
307a4b9c0c9SSascha Wildner             }
308a4b9c0c9SSascha Wildner         }
309a4b9c0c9SSascha Wildner 
310a4b9c0c9SSascha Wildner         Current = Current->Next;
311a4b9c0c9SSascha Wildner     }
312a4b9c0c9SSascha Wildner 
313a4b9c0c9SSascha Wildner     return (FILE_NOT_FOUND);
314a4b9c0c9SSascha Wildner }
315a4b9c0c9SSascha Wildner 
316a4b9c0c9SSascha Wildner 
317a4b9c0c9SSascha Wildner /*******************************************************************************
318a4b9c0c9SSascha Wildner  *
319a4b9c0c9SSascha Wildner  * FUNCTION:    FlGetFileHandle
320a4b9c0c9SSascha Wildner  *
321a4b9c0c9SSascha Wildner  * PARAMETERS:  OutFileId       - denotes file type of output handle
322a4b9c0c9SSascha Wildner  *              InFileId        - denotes file type of the input Filename
323a4b9c0c9SSascha Wildner  *              Filename
324a4b9c0c9SSascha Wildner  *
325a4b9c0c9SSascha Wildner  * RETURN:      File handle
326a4b9c0c9SSascha Wildner  *
327a4b9c0c9SSascha Wildner  * DESCRIPTION: Get the file handle for a particular filename/FileId. This
328a4b9c0c9SSascha Wildner  *              function also allows the caller to specify the file Id of the
329a4b9c0c9SSascha Wildner  *              desired type.
330a4b9c0c9SSascha Wildner  *
331a4b9c0c9SSascha Wildner  ******************************************************************************/
332a4b9c0c9SSascha Wildner 
333a4b9c0c9SSascha Wildner FILE *
FlGetFileHandle(UINT32 OutFileId,UINT32 InFileId,char * Filename)334a4b9c0c9SSascha Wildner FlGetFileHandle (
335a4b9c0c9SSascha Wildner     UINT32                  OutFileId,
336a4b9c0c9SSascha Wildner     UINT32                  InFileId,
337a4b9c0c9SSascha Wildner     char                    *Filename)
338a4b9c0c9SSascha Wildner {
339a4b9c0c9SSascha Wildner     ASL_GLOBAL_FILE_NODE    *Current = AslGbl_FilesList;
340a4b9c0c9SSascha Wildner 
341a4b9c0c9SSascha Wildner 
342a4b9c0c9SSascha Wildner     if (!Filename)
343a4b9c0c9SSascha Wildner     {
344a4b9c0c9SSascha Wildner         return (NULL);
345a4b9c0c9SSascha Wildner     }
346a4b9c0c9SSascha Wildner 
347a4b9c0c9SSascha Wildner     while (Current)
348a4b9c0c9SSascha Wildner     {
349a4b9c0c9SSascha Wildner         if (!strcmp (Current->Files[InFileId].Filename, Filename))
350a4b9c0c9SSascha Wildner         {
351a4b9c0c9SSascha Wildner             return (Current->Files[OutFileId].Handle);
352a4b9c0c9SSascha Wildner         }
353a4b9c0c9SSascha Wildner 
354a4b9c0c9SSascha Wildner         Current = Current->Next;
355a4b9c0c9SSascha Wildner     }
356a4b9c0c9SSascha Wildner 
357a4b9c0c9SSascha Wildner     return (NULL);
358a4b9c0c9SSascha Wildner }
359a4b9c0c9SSascha Wildner 
360a4b9c0c9SSascha Wildner 
361a4b9c0c9SSascha Wildner /*******************************************************************************
362a4b9c0c9SSascha Wildner  *
363a4b9c0c9SSascha Wildner  * FUNCTION:    FlGetFileNode
364a4b9c0c9SSascha Wildner  *
365a4b9c0c9SSascha Wildner  * PARAMETERS:  FileId        - File type (ID) of the input Filename
366a4b9c0c9SSascha Wildner  *              Filename      - File to search for
367a4b9c0c9SSascha Wildner  *
368a4b9c0c9SSascha Wildner  * RETURN:      A global file node
369a4b9c0c9SSascha Wildner  *
370a4b9c0c9SSascha Wildner  * DESCRIPTION: Get the file node for a particular filename/FileId.
371a4b9c0c9SSascha Wildner  *
372a4b9c0c9SSascha Wildner  ******************************************************************************/
373a4b9c0c9SSascha Wildner 
374a4b9c0c9SSascha Wildner ASL_GLOBAL_FILE_NODE *
FlGetFileNode(UINT32 FileId,char * Filename)375a4b9c0c9SSascha Wildner FlGetFileNode (
376a4b9c0c9SSascha Wildner     UINT32                  FileId,
377a4b9c0c9SSascha Wildner     char                    *Filename)
378a4b9c0c9SSascha Wildner {
379a4b9c0c9SSascha Wildner     ASL_GLOBAL_FILE_NODE    *Current = AslGbl_FilesList;
380a4b9c0c9SSascha Wildner 
381a4b9c0c9SSascha Wildner 
382a4b9c0c9SSascha Wildner     if (!Filename)
383a4b9c0c9SSascha Wildner     {
384a4b9c0c9SSascha Wildner         return (NULL);
385a4b9c0c9SSascha Wildner     }
386a4b9c0c9SSascha Wildner 
387a4b9c0c9SSascha Wildner     while (Current)
388a4b9c0c9SSascha Wildner     {
389a4b9c0c9SSascha Wildner         if (!strcmp (Current->Files[FileId].Filename, Filename))
390a4b9c0c9SSascha Wildner         {
391a4b9c0c9SSascha Wildner             return (Current);
392a4b9c0c9SSascha Wildner         }
393a4b9c0c9SSascha Wildner 
394a4b9c0c9SSascha Wildner         Current = Current->Next;
395a4b9c0c9SSascha Wildner     }
396a4b9c0c9SSascha Wildner 
397a4b9c0c9SSascha Wildner     return (NULL);
398a4b9c0c9SSascha Wildner }
399a4b9c0c9SSascha Wildner 
400a4b9c0c9SSascha Wildner 
401a4b9c0c9SSascha Wildner /*******************************************************************************
402a4b9c0c9SSascha Wildner  *
403a4b9c0c9SSascha Wildner  * FUNCTION:    FlGetCurrentFileNode
404a4b9c0c9SSascha Wildner  *
405a4b9c0c9SSascha Wildner  * PARAMETERS:  None
406a4b9c0c9SSascha Wildner  *
407a4b9c0c9SSascha Wildner  * RETURN:      Global file node
408a4b9c0c9SSascha Wildner  *
409a4b9c0c9SSascha Wildner  * DESCRIPTION: Get the current input file node
410a4b9c0c9SSascha Wildner  *
411a4b9c0c9SSascha Wildner  ******************************************************************************/
412a4b9c0c9SSascha Wildner 
413a4b9c0c9SSascha Wildner ASL_GLOBAL_FILE_NODE *
FlGetCurrentFileNode(void)414a4b9c0c9SSascha Wildner FlGetCurrentFileNode (
415a4b9c0c9SSascha Wildner     void)
416a4b9c0c9SSascha Wildner {
417e5412f1eSSascha Wildner     ASL_GLOBAL_FILE_NODE    *FileNode =
418e5412f1eSSascha Wildner         FlGetFileNode (ASL_FILE_INPUT,AslGbl_Files[ASL_FILE_INPUT].Filename);
419e5412f1eSSascha Wildner 
420e5412f1eSSascha Wildner 
421e5412f1eSSascha Wildner     if (!FileNode)
422e5412f1eSSascha Wildner     {
423e5412f1eSSascha Wildner         /*
424e5412f1eSSascha Wildner          * If the current file node does not exist after initializing the file
425e5412f1eSSascha Wildner          * node structures, something went wrong and this is an unrecoverable
426e5412f1eSSascha Wildner          * condition.
427e5412f1eSSascha Wildner          */
428e5412f1eSSascha Wildner         FlFileError (ASL_FILE_INPUT, ASL_MSG_COMPILER_INTERNAL);
429e5412f1eSSascha Wildner         AslAbort ();
430e5412f1eSSascha Wildner     }
431e5412f1eSSascha Wildner 
432e5412f1eSSascha Wildner     return (FileNode);
433a4b9c0c9SSascha Wildner }
434a4b9c0c9SSascha Wildner 
435a4b9c0c9SSascha Wildner 
436a4b9c0c9SSascha Wildner /*******************************************************************************
437a4b9c0c9SSascha Wildner  *
4380d02842fSSascha Wildner  * FUNCTION:    FlSetLineNumber
4390d02842fSSascha Wildner  *
4400d02842fSSascha Wildner  * PARAMETERS:  Op        - Parse node for the LINE asl statement
4410d02842fSSascha Wildner  *
4420d02842fSSascha Wildner  * RETURN:      None.
4430d02842fSSascha Wildner  *
4440d02842fSSascha Wildner  * DESCRIPTION: Set the current line number
4450d02842fSSascha Wildner  *
4460d02842fSSascha Wildner  ******************************************************************************/
4470d02842fSSascha Wildner 
4480d02842fSSascha Wildner void
FlSetLineNumber(UINT32 LineNumber)4490d02842fSSascha Wildner FlSetLineNumber (
4500d02842fSSascha Wildner     UINT32                  LineNumber)
4510d02842fSSascha Wildner {
4520d02842fSSascha Wildner 
4530d02842fSSascha Wildner     DbgPrint (ASL_PARSE_OUTPUT, "\n#line: New line number %u (old %u)\n",
454806343b9SSascha Wildner          LineNumber, AslGbl_LogicalLineNumber);
4550d02842fSSascha Wildner 
456806343b9SSascha Wildner     AslGbl_CurrentLineNumber = LineNumber;
4570d02842fSSascha Wildner }
4580d02842fSSascha Wildner 
4590d02842fSSascha Wildner 
4600d02842fSSascha Wildner /*******************************************************************************
4610d02842fSSascha Wildner  *
4620d02842fSSascha Wildner  * FUNCTION:    FlSetFilename
4630d02842fSSascha Wildner  *
4640d02842fSSascha Wildner  * PARAMETERS:  Op        - Parse node for the LINE asl statement
4650d02842fSSascha Wildner  *
4660d02842fSSascha Wildner  * RETURN:      None.
4670d02842fSSascha Wildner  *
4680d02842fSSascha Wildner  * DESCRIPTION: Set the current filename
4690d02842fSSascha Wildner  *
4700d02842fSSascha Wildner  ******************************************************************************/
4710d02842fSSascha Wildner 
4720d02842fSSascha Wildner void
FlSetFilename(char * Filename)4730d02842fSSascha Wildner FlSetFilename (
4740d02842fSSascha Wildner     char                    *Filename)
4750d02842fSSascha Wildner {
4760d02842fSSascha Wildner 
4770d02842fSSascha Wildner     DbgPrint (ASL_PARSE_OUTPUT, "\n#line: New filename %s (old %s)\n",
478806343b9SSascha Wildner          Filename, AslGbl_Files[ASL_FILE_INPUT].Filename);
4790d02842fSSascha Wildner 
48079eafdd7SSascha Wildner     /* No need to free any existing filename */
48179eafdd7SSascha Wildner 
482806343b9SSascha Wildner     AslGbl_Files[ASL_FILE_INPUT].Filename = Filename;
4830d02842fSSascha Wildner }
4840d02842fSSascha Wildner 
4850d02842fSSascha Wildner 
4860d02842fSSascha Wildner /*******************************************************************************
4870d02842fSSascha Wildner  *
4880d02842fSSascha Wildner  * FUNCTION:    FlAddIncludeDirectory
4890d02842fSSascha Wildner  *
4900d02842fSSascha Wildner  * PARAMETERS:  Dir             - Directory pathname string
4910d02842fSSascha Wildner  *
4920d02842fSSascha Wildner  * RETURN:      None
4930d02842fSSascha Wildner  *
4940d02842fSSascha Wildner  * DESCRIPTION: Add a directory the list of include prefix directories.
4950d02842fSSascha Wildner  *
4960d02842fSSascha Wildner  ******************************************************************************/
4970d02842fSSascha Wildner 
4980d02842fSSascha Wildner void
FlAddIncludeDirectory(char * Dir)4990d02842fSSascha Wildner FlAddIncludeDirectory (
5000d02842fSSascha Wildner     char                    *Dir)
5010d02842fSSascha Wildner {
5020d02842fSSascha Wildner     ASL_INCLUDE_DIR         *NewDir;
5030d02842fSSascha Wildner     ASL_INCLUDE_DIR         *NextDir;
5040d02842fSSascha Wildner     ASL_INCLUDE_DIR         *PrevDir = NULL;
5050d02842fSSascha Wildner     UINT32                  NeedsSeparator = 0;
5060d02842fSSascha Wildner     size_t                  DirLength;
5070d02842fSSascha Wildner 
5080d02842fSSascha Wildner 
5090d02842fSSascha Wildner     DirLength = strlen (Dir);
5100d02842fSSascha Wildner     if (!DirLength)
5110d02842fSSascha Wildner     {
5120d02842fSSascha Wildner         return;
5130d02842fSSascha Wildner     }
5140d02842fSSascha Wildner 
5150d02842fSSascha Wildner     /* Make sure that the pathname ends with a path separator */
5160d02842fSSascha Wildner 
5170d02842fSSascha Wildner     if ((Dir[DirLength-1] != '/') &&
5180d02842fSSascha Wildner         (Dir[DirLength-1] != '\\'))
5190d02842fSSascha Wildner     {
5200d02842fSSascha Wildner         NeedsSeparator = 1;
5210d02842fSSascha Wildner     }
5220d02842fSSascha Wildner 
523806343b9SSascha Wildner     NewDir = ACPI_CAST_PTR (ASL_INCLUDE_DIR,
524806343b9SSascha Wildner         UtLocalCacheCalloc (sizeof (ASL_INCLUDE_DIR)));
525806343b9SSascha Wildner     NewDir->Dir = UtLocalCacheCalloc (DirLength + 1 + NeedsSeparator);
5260d02842fSSascha Wildner     strcpy (NewDir->Dir, Dir);
5270d02842fSSascha Wildner     if (NeedsSeparator)
5280d02842fSSascha Wildner     {
5290d02842fSSascha Wildner         strcat (NewDir->Dir, "/");
5300d02842fSSascha Wildner     }
5310d02842fSSascha Wildner 
5320d02842fSSascha Wildner     /*
5330d02842fSSascha Wildner      * Preserve command line ordering of -I options by adding new elements
5340d02842fSSascha Wildner      * at the end of the list
5350d02842fSSascha Wildner      */
536806343b9SSascha Wildner     NextDir = AslGbl_IncludeDirList;
5370d02842fSSascha Wildner     while (NextDir)
5380d02842fSSascha Wildner     {
5390d02842fSSascha Wildner         PrevDir = NextDir;
5400d02842fSSascha Wildner         NextDir = NextDir->Next;
5410d02842fSSascha Wildner     }
5420d02842fSSascha Wildner 
5430d02842fSSascha Wildner     if (PrevDir)
5440d02842fSSascha Wildner     {
5450d02842fSSascha Wildner         PrevDir->Next = NewDir;
5460d02842fSSascha Wildner     }
5470d02842fSSascha Wildner     else
5480d02842fSSascha Wildner     {
549806343b9SSascha Wildner         AslGbl_IncludeDirList = NewDir;
5500d02842fSSascha Wildner     }
5510d02842fSSascha Wildner }
5520d02842fSSascha Wildner 
5530d02842fSSascha Wildner 
5540d02842fSSascha Wildner /*******************************************************************************
5550d02842fSSascha Wildner  *
5560d02842fSSascha Wildner  * FUNCTION:    FlMergePathnames
5570d02842fSSascha Wildner  *
5580d02842fSSascha Wildner  * PARAMETERS:  PrefixDir       - Prefix directory pathname. Can be NULL or
5590d02842fSSascha Wildner  *                                a zero length string.
5600d02842fSSascha Wildner  *              FilePathname    - The include filename from the source ASL.
5610d02842fSSascha Wildner  *
5620d02842fSSascha Wildner  * RETURN:      Merged pathname string
5630d02842fSSascha Wildner  *
5640d02842fSSascha Wildner  * DESCRIPTION: Merge two pathnames that (probably) have common elements, to
5650d02842fSSascha Wildner  *              arrive at a minimal length string. Merge can occur if the
5660d02842fSSascha Wildner  *              FilePathname is relative to the PrefixDir.
5670d02842fSSascha Wildner  *
5680d02842fSSascha Wildner  ******************************************************************************/
5690d02842fSSascha Wildner 
5700d02842fSSascha Wildner char *
FlMergePathnames(char * PrefixDir,char * FilePathname)5710d02842fSSascha Wildner FlMergePathnames (
5720d02842fSSascha Wildner     char                    *PrefixDir,
5730d02842fSSascha Wildner     char                    *FilePathname)
5740d02842fSSascha Wildner {
5750d02842fSSascha Wildner     char                    *CommonPath;
5760d02842fSSascha Wildner     char                    *Pathname;
5770d02842fSSascha Wildner     char                    *LastElement;
5780d02842fSSascha Wildner 
5790d02842fSSascha Wildner 
5800d02842fSSascha Wildner     DbgPrint (ASL_PARSE_OUTPUT, "Include: Prefix path - \"%s\"\n"
5810d02842fSSascha Wildner         "Include: FilePathname - \"%s\"\n",
5820d02842fSSascha Wildner          PrefixDir, FilePathname);
5830d02842fSSascha Wildner 
5840d02842fSSascha Wildner     /*
5850d02842fSSascha Wildner      * If there is no prefix directory or if the file pathname is absolute,
5860d02842fSSascha Wildner      * just return the original file pathname
5870d02842fSSascha Wildner      */
5880d02842fSSascha Wildner     if (!PrefixDir || (!*PrefixDir) ||
5890d02842fSSascha Wildner         (*FilePathname == '/') ||
5900d02842fSSascha Wildner          (FilePathname[1] == ':'))
5910d02842fSSascha Wildner     {
5927bcb6cafSSascha Wildner         Pathname = UtLocalCacheCalloc (strlen (FilePathname) + 1);
5930d02842fSSascha Wildner         strcpy (Pathname, FilePathname);
5940d02842fSSascha Wildner         goto ConvertBackslashes;
5950d02842fSSascha Wildner     }
5960d02842fSSascha Wildner 
5970d02842fSSascha Wildner     /* Need a local copy of the prefix directory path */
5980d02842fSSascha Wildner 
5997bcb6cafSSascha Wildner     CommonPath = UtLocalCacheCalloc (strlen (PrefixDir) + 1);
6000d02842fSSascha Wildner     strcpy (CommonPath, PrefixDir);
6010d02842fSSascha Wildner 
6020d02842fSSascha Wildner     /*
6030d02842fSSascha Wildner      * Walk forward through the file path, and simultaneously backward
6040d02842fSSascha Wildner      * through the prefix directory path until there are no more
6050d02842fSSascha Wildner      * relative references at the start of the file path.
6060d02842fSSascha Wildner      */
6070d02842fSSascha Wildner     while (*FilePathname && (!strncmp (FilePathname, "../", 3)))
6080d02842fSSascha Wildner     {
6090d02842fSSascha Wildner         /* Remove last element of the prefix directory path */
6100d02842fSSascha Wildner 
6110d02842fSSascha Wildner         LastElement = strrchr (CommonPath, '/');
6120d02842fSSascha Wildner         if (!LastElement)
6130d02842fSSascha Wildner         {
6140d02842fSSascha Wildner             goto ConcatenatePaths;
6150d02842fSSascha Wildner         }
6160d02842fSSascha Wildner 
6170d02842fSSascha Wildner         *LastElement = 0;   /* Terminate CommonPath string */
6180d02842fSSascha Wildner         FilePathname += 3;  /* Point to next path element */
6190d02842fSSascha Wildner     }
6200d02842fSSascha Wildner 
6210d02842fSSascha Wildner     /*
6220d02842fSSascha Wildner      * Remove the last element of the prefix directory path (it is the same as
6230d02842fSSascha Wildner      * the first element of the file pathname), and build the final merged
6240d02842fSSascha Wildner      * pathname.
6250d02842fSSascha Wildner      */
6260d02842fSSascha Wildner     LastElement = strrchr (CommonPath, '/');
6270d02842fSSascha Wildner     if (LastElement)
6280d02842fSSascha Wildner     {
6290d02842fSSascha Wildner         *LastElement = 0;
6300d02842fSSascha Wildner     }
6310d02842fSSascha Wildner 
6320d02842fSSascha Wildner     /* Build the final merged pathname */
6330d02842fSSascha Wildner 
6340d02842fSSascha Wildner ConcatenatePaths:
6357bcb6cafSSascha Wildner     Pathname = UtLocalCacheCalloc (
636820c5b08SSascha Wildner         strlen (CommonPath) + strlen (FilePathname) + 2);
6370d02842fSSascha Wildner     if (LastElement && *CommonPath)
6380d02842fSSascha Wildner     {
6390d02842fSSascha Wildner         strcpy (Pathname, CommonPath);
6400d02842fSSascha Wildner         strcat (Pathname, "/");
6410d02842fSSascha Wildner     }
6420d02842fSSascha Wildner     strcat (Pathname, FilePathname);
6430d02842fSSascha Wildner 
6440d02842fSSascha Wildner     /* Convert all backslashes to normal slashes */
6450d02842fSSascha Wildner 
6460d02842fSSascha Wildner ConvertBackslashes:
6470d02842fSSascha Wildner     UtConvertBackslashes (Pathname);
6480d02842fSSascha Wildner 
6490d02842fSSascha Wildner     DbgPrint (ASL_PARSE_OUTPUT, "Include: Merged Pathname - \"%s\"\n",
6500d02842fSSascha Wildner          Pathname);
6510d02842fSSascha Wildner     return (Pathname);
6520d02842fSSascha Wildner }
6530d02842fSSascha Wildner 
6540d02842fSSascha Wildner 
6550d02842fSSascha Wildner /*******************************************************************************
6560d02842fSSascha Wildner  *
6570d02842fSSascha Wildner  * FUNCTION:    FlOpenIncludeWithPrefix
6580d02842fSSascha Wildner  *
6590d02842fSSascha Wildner  * PARAMETERS:  PrefixDir       - Prefix directory pathname. Can be a zero
6600d02842fSSascha Wildner  *                                length string.
6610d02842fSSascha Wildner  *              Filename        - The include filename from the source ASL.
6620d02842fSSascha Wildner  *
6630d02842fSSascha Wildner  * RETURN:      Valid file descriptor if successful. Null otherwise.
6640d02842fSSascha Wildner  *
6650d02842fSSascha Wildner  * DESCRIPTION: Open an include file and push it on the input file stack.
6660d02842fSSascha Wildner  *
6670d02842fSSascha Wildner  ******************************************************************************/
6680d02842fSSascha Wildner 
669896f2e3aSSascha Wildner static FILE *
FlOpenIncludeWithPrefix(char * PrefixDir,ACPI_PARSE_OBJECT * Op,char * Filename)6700d02842fSSascha Wildner FlOpenIncludeWithPrefix (
6710d02842fSSascha Wildner     char                    *PrefixDir,
672896f2e3aSSascha Wildner     ACPI_PARSE_OBJECT       *Op,
6730d02842fSSascha Wildner     char                    *Filename)
6740d02842fSSascha Wildner {
6750d02842fSSascha Wildner     FILE                    *IncludeFile;
6760d02842fSSascha Wildner     char                    *Pathname;
67725ca8c79SSascha Wildner     UINT32                  OriginalLineNumber;
6780d02842fSSascha Wildner 
6790d02842fSSascha Wildner 
6800d02842fSSascha Wildner     /* Build the full pathname to the file */
6810d02842fSSascha Wildner 
6820d02842fSSascha Wildner     Pathname = FlMergePathnames (PrefixDir, Filename);
6830d02842fSSascha Wildner 
6840d02842fSSascha Wildner     DbgPrint (ASL_PARSE_OUTPUT, "Include: Opening file - \"%s\"\n\n",
6850d02842fSSascha Wildner         Pathname);
6860d02842fSSascha Wildner 
6870d02842fSSascha Wildner     /* Attempt to open the file, push if successful */
6880d02842fSSascha Wildner 
6890d02842fSSascha Wildner     IncludeFile = fopen (Pathname, "r");
6900d02842fSSascha Wildner     if (!IncludeFile)
6910d02842fSSascha Wildner     {
6920d02842fSSascha Wildner         return (NULL);
6930d02842fSSascha Wildner     }
6940d02842fSSascha Wildner 
695896f2e3aSSascha Wildner     /*
69625ca8c79SSascha Wildner      * Check the entire include file for any # preprocessor directives.
697896f2e3aSSascha Wildner      * This is because there may be some confusion between the #include
69825ca8c79SSascha Wildner      * preprocessor directive and the ASL Include statement. A file included
69925ca8c79SSascha Wildner      * by the ASL include cannot contain preprocessor directives because
70025ca8c79SSascha Wildner      * the preprocessor has already run by the time the ASL include is
70125ca8c79SSascha Wildner      * recognized (by the compiler, not the preprocessor.)
70225ca8c79SSascha Wildner      *
70325ca8c79SSascha Wildner      * Note: DtGetNextLine strips/ignores comments.
70425ca8c79SSascha Wildner      * Save current line number since DtGetNextLine modifies it.
705896f2e3aSSascha Wildner      */
706806343b9SSascha Wildner     AslGbl_CurrentLineNumber--;
707806343b9SSascha Wildner     OriginalLineNumber = AslGbl_CurrentLineNumber;
708f5f76cf2SSascha Wildner 
70925ca8c79SSascha Wildner     while (DtGetNextLine (IncludeFile, DT_ALLOW_MULTILINE_QUOTES) != ASL_EOF)
710896f2e3aSSascha Wildner     {
711806343b9SSascha Wildner         if (AslGbl_CurrentLineBuffer[0] == '#')
712896f2e3aSSascha Wildner         {
713896f2e3aSSascha Wildner             AslError (ASL_ERROR, ASL_MSG_INCLUDE_FILE,
714896f2e3aSSascha Wildner                 Op, "use #include instead");
715896f2e3aSSascha Wildner         }
716896f2e3aSSascha Wildner     }
717f5f76cf2SSascha Wildner 
718806343b9SSascha Wildner     AslGbl_CurrentLineNumber = OriginalLineNumber;
719896f2e3aSSascha Wildner 
720896f2e3aSSascha Wildner     /* Must seek back to the start of the file */
721896f2e3aSSascha Wildner 
722896f2e3aSSascha Wildner     fseek (IncludeFile, 0, SEEK_SET);
723896f2e3aSSascha Wildner 
7240d02842fSSascha Wildner     /* Push the include file on the open input file stack */
7250d02842fSSascha Wildner 
7260d02842fSSascha Wildner     AslPushInputFileStack (IncludeFile, Pathname);
7270d02842fSSascha Wildner     return (IncludeFile);
7280d02842fSSascha Wildner }
7290d02842fSSascha Wildner 
7300d02842fSSascha Wildner 
7310d02842fSSascha Wildner /*******************************************************************************
7320d02842fSSascha Wildner  *
7330d02842fSSascha Wildner  * FUNCTION:    FlOpenIncludeFile
7340d02842fSSascha Wildner  *
7350d02842fSSascha Wildner  * PARAMETERS:  Op        - Parse node for the INCLUDE ASL statement
7360d02842fSSascha Wildner  *
7370d02842fSSascha Wildner  * RETURN:      None.
7380d02842fSSascha Wildner  *
7390d02842fSSascha Wildner  * DESCRIPTION: Open an include file and push it on the input file stack.
7400d02842fSSascha Wildner  *
7410d02842fSSascha Wildner  ******************************************************************************/
7420d02842fSSascha Wildner 
7430d02842fSSascha Wildner void
FlOpenIncludeFile(ACPI_PARSE_OBJECT * Op)7440d02842fSSascha Wildner FlOpenIncludeFile (
7450d02842fSSascha Wildner     ACPI_PARSE_OBJECT       *Op)
7460d02842fSSascha Wildner {
7470d02842fSSascha Wildner     FILE                    *IncludeFile;
7480d02842fSSascha Wildner     ASL_INCLUDE_DIR         *NextDir;
7490d02842fSSascha Wildner 
7500d02842fSSascha Wildner 
7510d02842fSSascha Wildner     /* Op must be valid */
7520d02842fSSascha Wildner 
7530d02842fSSascha Wildner     if (!Op)
7540d02842fSSascha Wildner     {
7550d02842fSSascha Wildner         AslCommonError (ASL_ERROR, ASL_MSG_INCLUDE_FILE_OPEN,
756806343b9SSascha Wildner             AslGbl_CurrentLineNumber, AslGbl_LogicalLineNumber,
757806343b9SSascha Wildner             AslGbl_InputByteCount, AslGbl_CurrentColumn,
758806343b9SSascha Wildner             AslGbl_Files[ASL_FILE_INPUT].Filename, " - Null parse node");
7590d02842fSSascha Wildner 
7600d02842fSSascha Wildner         return;
7610d02842fSSascha Wildner     }
7620d02842fSSascha Wildner 
7630d02842fSSascha Wildner     /*
7640d02842fSSascha Wildner      * Flush out the "include ()" statement on this line, start
7650d02842fSSascha Wildner      * the actual include file on the next line
7660d02842fSSascha Wildner      */
7670d02842fSSascha Wildner     AslResetCurrentLineBuffer ();
7680d02842fSSascha Wildner     FlPrintFile (ASL_FILE_SOURCE_OUTPUT, "\n");
769806343b9SSascha Wildner     AslGbl_CurrentLineOffset++;
7700d02842fSSascha Wildner 
7710d02842fSSascha Wildner 
7720d02842fSSascha Wildner     /* Attempt to open the include file */
7730d02842fSSascha Wildner 
7740d02842fSSascha Wildner     /* If the file specifies an absolute path, just open it */
7750d02842fSSascha Wildner 
7760d02842fSSascha Wildner     if ((Op->Asl.Value.String[0] == '/')  ||
7770d02842fSSascha Wildner         (Op->Asl.Value.String[0] == '\\') ||
7780d02842fSSascha Wildner         (Op->Asl.Value.String[1] == ':'))
7790d02842fSSascha Wildner     {
780896f2e3aSSascha Wildner         IncludeFile = FlOpenIncludeWithPrefix ("", Op, Op->Asl.Value.String);
7810d02842fSSascha Wildner         if (!IncludeFile)
7820d02842fSSascha Wildner         {
7830d02842fSSascha Wildner             goto ErrorExit;
7840d02842fSSascha Wildner         }
7850d02842fSSascha Wildner         return;
7860d02842fSSascha Wildner     }
7870d02842fSSascha Wildner 
7880d02842fSSascha Wildner     /*
7890d02842fSSascha Wildner      * The include filename is not an absolute path.
7900d02842fSSascha Wildner      *
7910d02842fSSascha Wildner      * First, search for the file within the "local" directory -- meaning
7920d02842fSSascha Wildner      * the same directory that contains the source file.
7930d02842fSSascha Wildner      *
7940d02842fSSascha Wildner      * Construct the file pathname from the global directory name.
7950d02842fSSascha Wildner      */
796820c5b08SSascha Wildner     IncludeFile = FlOpenIncludeWithPrefix (
797806343b9SSascha Wildner         AslGbl_DirectoryPath, Op, Op->Asl.Value.String);
7980d02842fSSascha Wildner     if (IncludeFile)
7990d02842fSSascha Wildner     {
8000d02842fSSascha Wildner         return;
8010d02842fSSascha Wildner     }
8020d02842fSSascha Wildner 
8030d02842fSSascha Wildner     /*
8040d02842fSSascha Wildner      * Second, search for the file within the (possibly multiple) directories
8050d02842fSSascha Wildner      * specified by the -I option on the command line.
8060d02842fSSascha Wildner      */
807806343b9SSascha Wildner     NextDir = AslGbl_IncludeDirList;
8080d02842fSSascha Wildner     while (NextDir)
8090d02842fSSascha Wildner     {
810820c5b08SSascha Wildner         IncludeFile = FlOpenIncludeWithPrefix (
811820c5b08SSascha Wildner             NextDir->Dir, Op, Op->Asl.Value.String);
8120d02842fSSascha Wildner         if (IncludeFile)
8130d02842fSSascha Wildner         {
8140d02842fSSascha Wildner             return;
8150d02842fSSascha Wildner         }
8160d02842fSSascha Wildner 
8170d02842fSSascha Wildner         NextDir = NextDir->Next;
8180d02842fSSascha Wildner     }
8190d02842fSSascha Wildner 
8200d02842fSSascha Wildner     /* We could not open the include file after trying very hard */
8210d02842fSSascha Wildner 
8220d02842fSSascha Wildner ErrorExit:
823806343b9SSascha Wildner     sprintf (AslGbl_MsgBuffer, "%s, %s", Op->Asl.Value.String, strerror (errno));
824806343b9SSascha Wildner     AslError (ASL_ERROR, ASL_MSG_INCLUDE_FILE_OPEN, Op, AslGbl_MsgBuffer);
8250d02842fSSascha Wildner }
8260d02842fSSascha Wildner 
8270d02842fSSascha Wildner 
8280d02842fSSascha Wildner /*******************************************************************************
8290d02842fSSascha Wildner  *
8300d02842fSSascha Wildner  * FUNCTION:    FlOpenInputFile
8310d02842fSSascha Wildner  *
8320d02842fSSascha Wildner  * PARAMETERS:  InputFilename       - The user-specified ASL source file to be
8330d02842fSSascha Wildner  *                                    compiled
8340d02842fSSascha Wildner  *
8350d02842fSSascha Wildner  * RETURN:      Status
8360d02842fSSascha Wildner  *
8370d02842fSSascha Wildner  * DESCRIPTION: Open the specified input file, and save the directory path to
838*aab122a6SSascha Wildner  *              the file so that include files can be opened in the same
839*aab122a6SSascha Wildner  *              directory. NOTE: File is opened in text mode.
8400d02842fSSascha Wildner  *
8410d02842fSSascha Wildner  ******************************************************************************/
8420d02842fSSascha Wildner 
8430d02842fSSascha Wildner ACPI_STATUS
FlOpenInputFile(char * InputFilename)8440d02842fSSascha Wildner FlOpenInputFile (
8450d02842fSSascha Wildner     char                    *InputFilename)
8460d02842fSSascha Wildner {
8470d02842fSSascha Wildner 
8480d02842fSSascha Wildner     /* Open the input ASL file, text mode */
8490d02842fSSascha Wildner 
8500d02842fSSascha Wildner     FlOpenFile (ASL_FILE_INPUT, InputFilename, "rt");
851806343b9SSascha Wildner     AslCompilerin = AslGbl_Files[ASL_FILE_INPUT].Handle;
8520d02842fSSascha Wildner 
8530d02842fSSascha Wildner     return (AE_OK);
8540d02842fSSascha Wildner }
8550d02842fSSascha Wildner 
8560d02842fSSascha Wildner 
8570d02842fSSascha Wildner /*******************************************************************************
8580d02842fSSascha Wildner  *
8590d02842fSSascha Wildner  * FUNCTION:    FlOpenAmlOutputFile
8600d02842fSSascha Wildner  *
8610d02842fSSascha Wildner  * PARAMETERS:  FilenamePrefix       - The user-specified ASL source file
8620d02842fSSascha Wildner  *
8630d02842fSSascha Wildner  * RETURN:      Status
8640d02842fSSascha Wildner  *
8650d02842fSSascha Wildner  * DESCRIPTION: Create the output filename (*.AML) and open the file. The file
8660d02842fSSascha Wildner  *              is created in the same directory as the parent input file.
8670d02842fSSascha Wildner  *
8680d02842fSSascha Wildner  ******************************************************************************/
8690d02842fSSascha Wildner 
8700d02842fSSascha Wildner ACPI_STATUS
FlOpenAmlOutputFile(char * FilenamePrefix)8710d02842fSSascha Wildner FlOpenAmlOutputFile (
8720d02842fSSascha Wildner     char                    *FilenamePrefix)
8730d02842fSSascha Wildner {
8740d02842fSSascha Wildner     char                    *Filename;
8750d02842fSSascha Wildner 
8760d02842fSSascha Wildner 
8770d02842fSSascha Wildner     /* Output filename usually comes from the ASL itself */
8780d02842fSSascha Wildner 
879806343b9SSascha Wildner     Filename = AslGbl_Files[ASL_FILE_AML_OUTPUT].Filename;
8800d02842fSSascha Wildner     if (!Filename)
8810d02842fSSascha Wildner     {
8820d02842fSSascha Wildner         /* Create the output AML filename */
8837bcb6cafSSascha Wildner         if (!AcpiGbl_CaptureComments)
884d638c6eeSSascha Wildner         {
8850d02842fSSascha Wildner             Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_AML_CODE);
886d638c6eeSSascha Wildner         }
887d638c6eeSSascha Wildner         else
888d638c6eeSSascha Wildner         {
889d638c6eeSSascha Wildner             Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_CONVERT_AML);
890d638c6eeSSascha Wildner         }
8910d02842fSSascha Wildner         if (!Filename)
8920d02842fSSascha Wildner         {
8930d02842fSSascha Wildner             AslCommonError (ASL_ERROR, ASL_MSG_OUTPUT_FILENAME,
8940d02842fSSascha Wildner                 0, 0, 0, 0, NULL, NULL);
8950d02842fSSascha Wildner             return (AE_ERROR);
8960d02842fSSascha Wildner         }
897fe7b5cb4SSascha Wildner 
898806343b9SSascha Wildner         AslGbl_Files[ASL_FILE_AML_OUTPUT].Filename = Filename;
8990d02842fSSascha Wildner     }
9000d02842fSSascha Wildner 
9010d02842fSSascha Wildner     /* Open the output AML file in binary mode */
9020d02842fSSascha Wildner 
9030d02842fSSascha Wildner     FlOpenFile (ASL_FILE_AML_OUTPUT, Filename, "w+b");
9040d02842fSSascha Wildner     return (AE_OK);
9050d02842fSSascha Wildner }
9060d02842fSSascha Wildner 
9070d02842fSSascha Wildner 
9080d02842fSSascha Wildner /*******************************************************************************
9090d02842fSSascha Wildner  *
9100d02842fSSascha Wildner  * FUNCTION:    FlOpenMiscOutputFiles
9110d02842fSSascha Wildner  *
9120d02842fSSascha Wildner  * PARAMETERS:  FilenamePrefix       - The user-specified ASL source file
9130d02842fSSascha Wildner  *
9140d02842fSSascha Wildner  * RETURN:      Status
9150d02842fSSascha Wildner  *
9160d02842fSSascha Wildner  * DESCRIPTION: Create and open the various output files needed, depending on
9170d02842fSSascha Wildner  *              the command line options
9180d02842fSSascha Wildner  *
9190d02842fSSascha Wildner  ******************************************************************************/
9200d02842fSSascha Wildner 
9210d02842fSSascha Wildner ACPI_STATUS
FlOpenMiscOutputFiles(char * FilenamePrefix)9220d02842fSSascha Wildner FlOpenMiscOutputFiles (
9230d02842fSSascha Wildner     char                    *FilenamePrefix)
9240d02842fSSascha Wildner {
9250d02842fSSascha Wildner     char                    *Filename;
9260d02842fSSascha Wildner 
9270d02842fSSascha Wildner 
928267c04fdSSascha Wildner      /* Create/Open a map file if requested */
929267c04fdSSascha Wildner 
930806343b9SSascha Wildner     if (AslGbl_MapfileFlag)
931267c04fdSSascha Wildner     {
932267c04fdSSascha Wildner         Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_MAP);
933267c04fdSSascha Wildner         if (!Filename)
934267c04fdSSascha Wildner         {
935267c04fdSSascha Wildner             AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME,
936267c04fdSSascha Wildner                 0, 0, 0, 0, NULL, NULL);
937267c04fdSSascha Wildner             return (AE_ERROR);
938267c04fdSSascha Wildner         }
939267c04fdSSascha Wildner 
940267c04fdSSascha Wildner         /* Open the hex file, text mode (closed at compiler exit) */
941267c04fdSSascha Wildner 
942267c04fdSSascha Wildner         FlOpenFile (ASL_FILE_MAP_OUTPUT, Filename, "w+t");
943267c04fdSSascha Wildner 
944267c04fdSSascha Wildner         AslCompilerSignon (ASL_FILE_MAP_OUTPUT);
945267c04fdSSascha Wildner         AslCompilerFileHeader (ASL_FILE_MAP_OUTPUT);
946267c04fdSSascha Wildner     }
947267c04fdSSascha Wildner 
9480d02842fSSascha Wildner     /* All done for disassembler */
9490d02842fSSascha Wildner 
950806343b9SSascha Wildner     if (AslGbl_FileType == ASL_INPUT_TYPE_BINARY_ACPI_TABLE)
9510d02842fSSascha Wildner     {
9520d02842fSSascha Wildner         return (AE_OK);
9530d02842fSSascha Wildner     }
9540d02842fSSascha Wildner 
9550d02842fSSascha Wildner     /* Create/Open a hex output file if asked */
9560d02842fSSascha Wildner 
957806343b9SSascha Wildner     if (AslGbl_HexOutputFlag)
9580d02842fSSascha Wildner     {
9590d02842fSSascha Wildner         Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_HEX_DUMP);
9600d02842fSSascha Wildner         if (!Filename)
9610d02842fSSascha Wildner         {
9620d02842fSSascha Wildner             AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME,
9630d02842fSSascha Wildner                 0, 0, 0, 0, NULL, NULL);
9640d02842fSSascha Wildner             return (AE_ERROR);
9650d02842fSSascha Wildner         }
9660d02842fSSascha Wildner 
9670d02842fSSascha Wildner         /* Open the hex file, text mode */
9680d02842fSSascha Wildner 
9690d02842fSSascha Wildner         FlOpenFile (ASL_FILE_HEX_OUTPUT, Filename, "w+t");
9700d02842fSSascha Wildner 
9710d02842fSSascha Wildner         AslCompilerSignon (ASL_FILE_HEX_OUTPUT);
9720d02842fSSascha Wildner         AslCompilerFileHeader (ASL_FILE_HEX_OUTPUT);
9730d02842fSSascha Wildner     }
9740d02842fSSascha Wildner 
9750d02842fSSascha Wildner     /* Create/Open a debug output file if asked */
9760d02842fSSascha Wildner 
977806343b9SSascha Wildner     if (AslGbl_DebugFlag)
9780d02842fSSascha Wildner     {
9790d02842fSSascha Wildner         Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_DEBUG);
9800d02842fSSascha Wildner         if (!Filename)
9810d02842fSSascha Wildner         {
9820d02842fSSascha Wildner             AslCommonError (ASL_ERROR, ASL_MSG_DEBUG_FILENAME,
9830d02842fSSascha Wildner                 0, 0, 0, 0, NULL, NULL);
9840d02842fSSascha Wildner             return (AE_ERROR);
9850d02842fSSascha Wildner         }
9860d02842fSSascha Wildner 
9870d02842fSSascha Wildner         /* Open the debug file as STDERR, text mode */
9880d02842fSSascha Wildner 
989806343b9SSascha Wildner         AslGbl_Files[ASL_FILE_DEBUG_OUTPUT].Filename = Filename;
990806343b9SSascha Wildner         AslGbl_Files[ASL_FILE_DEBUG_OUTPUT].Handle =
9910d02842fSSascha Wildner             freopen (Filename, "w+t", stderr);
9920d02842fSSascha Wildner 
993806343b9SSascha Wildner         if (!AslGbl_Files[ASL_FILE_DEBUG_OUTPUT].Handle)
9940d02842fSSascha Wildner         {
995fe7b5cb4SSascha Wildner             /*
99625ca8c79SSascha Wildner              * A problem with freopen is that on error, we no longer
99725ca8c79SSascha Wildner              * have stderr and cannot emit normal error messages.
99825ca8c79SSascha Wildner              * Emit error to stdout, close files, and exit.
999fe7b5cb4SSascha Wildner              */
100025ca8c79SSascha Wildner             fprintf (stdout,
100125ca8c79SSascha Wildner                 "\nCould not open debug output file: %s\n\n", Filename);
100225ca8c79SSascha Wildner 
100325ca8c79SSascha Wildner             CmCleanupAndExit ();
100425ca8c79SSascha Wildner             exit (1);
10050d02842fSSascha Wildner         }
10060d02842fSSascha Wildner 
10070d02842fSSascha Wildner         AslCompilerSignon (ASL_FILE_DEBUG_OUTPUT);
10080d02842fSSascha Wildner         AslCompilerFileHeader (ASL_FILE_DEBUG_OUTPUT);
10090d02842fSSascha Wildner     }
10100d02842fSSascha Wildner 
10117c9678bcSSascha Wildner     /* Create/Open a cross-reference output file if asked */
10127c9678bcSSascha Wildner 
1013806343b9SSascha Wildner     if (AslGbl_CrossReferenceOutput)
10147c9678bcSSascha Wildner     {
10157c9678bcSSascha Wildner         Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_XREF);
10167c9678bcSSascha Wildner         if (!Filename)
10177c9678bcSSascha Wildner         {
10187c9678bcSSascha Wildner             AslCommonError (ASL_ERROR, ASL_MSG_DEBUG_FILENAME,
10197c9678bcSSascha Wildner                 0, 0, 0, 0, NULL, NULL);
10207c9678bcSSascha Wildner             return (AE_ERROR);
10217c9678bcSSascha Wildner         }
10227c9678bcSSascha Wildner 
10237c9678bcSSascha Wildner         FlOpenFile (ASL_FILE_XREF_OUTPUT, Filename, "w+t");
10247c9678bcSSascha Wildner 
10257c9678bcSSascha Wildner         AslCompilerSignon (ASL_FILE_XREF_OUTPUT);
10267c9678bcSSascha Wildner         AslCompilerFileHeader (ASL_FILE_XREF_OUTPUT);
10277c9678bcSSascha Wildner     }
10287c9678bcSSascha Wildner 
10290d02842fSSascha Wildner     /* Create/Open a listing output file if asked */
10300d02842fSSascha Wildner 
1031806343b9SSascha Wildner     if (AslGbl_ListingFlag)
10320d02842fSSascha Wildner     {
10330d02842fSSascha Wildner         Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_LISTING);
10340d02842fSSascha Wildner         if (!Filename)
10350d02842fSSascha Wildner         {
10360d02842fSSascha Wildner             AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME,
10370d02842fSSascha Wildner                 0, 0, 0, 0, NULL, NULL);
10380d02842fSSascha Wildner             return (AE_ERROR);
10390d02842fSSascha Wildner         }
10400d02842fSSascha Wildner 
10410d02842fSSascha Wildner         /* Open the listing file, text mode */
10420d02842fSSascha Wildner 
10430d02842fSSascha Wildner         FlOpenFile (ASL_FILE_LISTING_OUTPUT, Filename, "w+t");
10440d02842fSSascha Wildner 
10450d02842fSSascha Wildner         AslCompilerSignon (ASL_FILE_LISTING_OUTPUT);
10460d02842fSSascha Wildner         AslCompilerFileHeader (ASL_FILE_LISTING_OUTPUT);
10470d02842fSSascha Wildner     }
10480d02842fSSascha Wildner 
104925ca8c79SSascha Wildner     /* Create the preprocessor output temp file if preprocessor enabled */
10500d02842fSSascha Wildner 
1051806343b9SSascha Wildner     if (AslGbl_PreprocessFlag)
10520d02842fSSascha Wildner     {
10530d02842fSSascha Wildner         Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_PREPROCESSOR);
10540d02842fSSascha Wildner         if (!Filename)
10550d02842fSSascha Wildner         {
10560d02842fSSascha Wildner             AslCommonError (ASL_ERROR, ASL_MSG_PREPROCESSOR_FILENAME,
10570d02842fSSascha Wildner                 0, 0, 0, 0, NULL, NULL);
10580d02842fSSascha Wildner             return (AE_ERROR);
10590d02842fSSascha Wildner         }
10600d02842fSSascha Wildner 
10610d02842fSSascha Wildner         FlOpenFile (ASL_FILE_PREPROCESSOR, Filename, "w+t");
10620d02842fSSascha Wildner     }
10630d02842fSSascha Wildner 
106425ca8c79SSascha Wildner     /*
106525ca8c79SSascha Wildner      * Create the "user" preprocessor output file if -li flag set.
106625ca8c79SSascha Wildner      * Note, this file contains no embedded #line directives.
106725ca8c79SSascha Wildner      */
1068806343b9SSascha Wildner     if (AslGbl_PreprocessorOutputFlag)
106925ca8c79SSascha Wildner     {
107025ca8c79SSascha Wildner         Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_PREPROC_USER);
107125ca8c79SSascha Wildner         if (!Filename)
107225ca8c79SSascha Wildner         {
107325ca8c79SSascha Wildner             AslCommonError (ASL_ERROR, ASL_MSG_PREPROCESSOR_FILENAME,
107425ca8c79SSascha Wildner                 0, 0, 0, 0, NULL, NULL);
107525ca8c79SSascha Wildner             return (AE_ERROR);
107625ca8c79SSascha Wildner         }
107725ca8c79SSascha Wildner 
107825ca8c79SSascha Wildner         FlOpenFile (ASL_FILE_PREPROCESSOR_USER, Filename, "w+t");
107925ca8c79SSascha Wildner     }
108025ca8c79SSascha Wildner 
10810d02842fSSascha Wildner     /* All done for data table compiler */
10820d02842fSSascha Wildner 
1083806343b9SSascha Wildner     if (AslGbl_FileType == ASL_INPUT_TYPE_ASCII_DATA)
10840d02842fSSascha Wildner     {
10850d02842fSSascha Wildner         return (AE_OK);
10860d02842fSSascha Wildner     }
10870d02842fSSascha Wildner 
10880d02842fSSascha Wildner     /* Create/Open a combined source output file */
10890d02842fSSascha Wildner 
10900d02842fSSascha Wildner     Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_SOURCE);
10910d02842fSSascha Wildner     if (!Filename)
10920d02842fSSascha Wildner     {
10930d02842fSSascha Wildner         AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME,
10940d02842fSSascha Wildner             0, 0, 0, 0, NULL, NULL);
10950d02842fSSascha Wildner         return (AE_ERROR);
10960d02842fSSascha Wildner     }
10970d02842fSSascha Wildner 
10980d02842fSSascha Wildner     /*
10990d02842fSSascha Wildner      * Open the source output file, binary mode (so that LF does not get
11000d02842fSSascha Wildner      * expanded to CR/LF on some systems, messing up our seek
11010d02842fSSascha Wildner      * calculations.)
11020d02842fSSascha Wildner      */
11030d02842fSSascha Wildner     FlOpenFile (ASL_FILE_SOURCE_OUTPUT, Filename, "w+b");
11040d02842fSSascha Wildner 
11050d02842fSSascha Wildner /*
11060d02842fSSascha Wildner // TBD: TEMP
1107806343b9SSascha Wildner //    AslCompilerin = AslGbl_Files[ASL_FILE_SOURCE_OUTPUT].Handle;
11080d02842fSSascha Wildner */
11090d02842fSSascha Wildner     /* Create/Open a assembly code source output file if asked */
11100d02842fSSascha Wildner 
1111806343b9SSascha Wildner     if (AslGbl_AsmOutputFlag)
11120d02842fSSascha Wildner     {
11130d02842fSSascha Wildner         Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_ASM_SOURCE);
11140d02842fSSascha Wildner         if (!Filename)
11150d02842fSSascha Wildner         {
11160d02842fSSascha Wildner             AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME,
11170d02842fSSascha Wildner                 0, 0, 0, 0, NULL, NULL);
11180d02842fSSascha Wildner             return (AE_ERROR);
11190d02842fSSascha Wildner         }
11200d02842fSSascha Wildner 
11210d02842fSSascha Wildner         /* Open the assembly code source file, text mode */
11220d02842fSSascha Wildner 
11230d02842fSSascha Wildner         FlOpenFile (ASL_FILE_ASM_SOURCE_OUTPUT, Filename, "w+t");
11240d02842fSSascha Wildner 
11250d02842fSSascha Wildner         AslCompilerSignon (ASL_FILE_ASM_SOURCE_OUTPUT);
11260d02842fSSascha Wildner         AslCompilerFileHeader (ASL_FILE_ASM_SOURCE_OUTPUT);
11270d02842fSSascha Wildner     }
11280d02842fSSascha Wildner 
11290d02842fSSascha Wildner     /* Create/Open a C code source output file if asked */
11300d02842fSSascha Wildner 
1131806343b9SSascha Wildner     if (AslGbl_C_OutputFlag)
11320d02842fSSascha Wildner     {
11330d02842fSSascha Wildner         Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_C_SOURCE);
11340d02842fSSascha Wildner         if (!Filename)
11350d02842fSSascha Wildner         {
11360d02842fSSascha Wildner             AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME,
11370d02842fSSascha Wildner                 0, 0, 0, 0, NULL, NULL);
11380d02842fSSascha Wildner             return (AE_ERROR);
11390d02842fSSascha Wildner         }
11400d02842fSSascha Wildner 
11410d02842fSSascha Wildner         /* Open the C code source file, text mode */
11420d02842fSSascha Wildner 
11430d02842fSSascha Wildner         FlOpenFile (ASL_FILE_C_SOURCE_OUTPUT, Filename, "w+t");
11440d02842fSSascha Wildner 
11450d02842fSSascha Wildner         FlPrintFile (ASL_FILE_C_SOURCE_OUTPUT, "/*\n");
11460d02842fSSascha Wildner         AslCompilerSignon (ASL_FILE_C_SOURCE_OUTPUT);
11470d02842fSSascha Wildner         AslCompilerFileHeader (ASL_FILE_C_SOURCE_OUTPUT);
11480d02842fSSascha Wildner     }
11490d02842fSSascha Wildner 
11500d02842fSSascha Wildner     /* Create/Open a C code source output file for the offset table if asked */
11510d02842fSSascha Wildner 
1152806343b9SSascha Wildner     if (AslGbl_C_OffsetTableFlag)
11530d02842fSSascha Wildner     {
11540d02842fSSascha Wildner         Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_C_OFFSET);
11550d02842fSSascha Wildner         if (!Filename)
11560d02842fSSascha Wildner         {
11570d02842fSSascha Wildner             AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME,
11580d02842fSSascha Wildner                 0, 0, 0, 0, NULL, NULL);
11590d02842fSSascha Wildner             return (AE_ERROR);
11600d02842fSSascha Wildner         }
11610d02842fSSascha Wildner 
11620d02842fSSascha Wildner         /* Open the C code source file, text mode */
11630d02842fSSascha Wildner 
11640d02842fSSascha Wildner         FlOpenFile (ASL_FILE_C_OFFSET_OUTPUT, Filename, "w+t");
11650d02842fSSascha Wildner 
11660d02842fSSascha Wildner         FlPrintFile (ASL_FILE_C_OFFSET_OUTPUT, "/*\n");
11670d02842fSSascha Wildner         AslCompilerSignon (ASL_FILE_C_OFFSET_OUTPUT);
11680d02842fSSascha Wildner         AslCompilerFileHeader (ASL_FILE_C_OFFSET_OUTPUT);
11690d02842fSSascha Wildner     }
11700d02842fSSascha Wildner 
11710d02842fSSascha Wildner     /* Create/Open a assembly include output file if asked */
11720d02842fSSascha Wildner 
1173806343b9SSascha Wildner     if (AslGbl_AsmIncludeOutputFlag)
11740d02842fSSascha Wildner     {
11750d02842fSSascha Wildner         Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_ASM_INCLUDE);
11760d02842fSSascha Wildner         if (!Filename)
11770d02842fSSascha Wildner         {
11780d02842fSSascha Wildner             AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME,
11790d02842fSSascha Wildner                 0, 0, 0, 0, NULL, NULL);
11800d02842fSSascha Wildner             return (AE_ERROR);
11810d02842fSSascha Wildner         }
11820d02842fSSascha Wildner 
11830d02842fSSascha Wildner         /* Open the assembly include file, text mode */
11840d02842fSSascha Wildner 
11850d02842fSSascha Wildner         FlOpenFile (ASL_FILE_ASM_INCLUDE_OUTPUT, Filename, "w+t");
11860d02842fSSascha Wildner 
11870d02842fSSascha Wildner         AslCompilerSignon (ASL_FILE_ASM_INCLUDE_OUTPUT);
11880d02842fSSascha Wildner         AslCompilerFileHeader (ASL_FILE_ASM_INCLUDE_OUTPUT);
11890d02842fSSascha Wildner     }
11900d02842fSSascha Wildner 
11910d02842fSSascha Wildner     /* Create/Open a C include output file if asked */
11920d02842fSSascha Wildner 
1193806343b9SSascha Wildner     if (AslGbl_C_IncludeOutputFlag)
11940d02842fSSascha Wildner     {
11950d02842fSSascha Wildner         Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_C_INCLUDE);
11960d02842fSSascha Wildner         if (!Filename)
11970d02842fSSascha Wildner         {
11980d02842fSSascha Wildner             AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME,
11990d02842fSSascha Wildner                 0, 0, 0, 0, NULL, NULL);
12000d02842fSSascha Wildner             return (AE_ERROR);
12010d02842fSSascha Wildner         }
12020d02842fSSascha Wildner 
12030d02842fSSascha Wildner         /* Open the C include file, text mode */
12040d02842fSSascha Wildner 
12050d02842fSSascha Wildner         FlOpenFile (ASL_FILE_C_INCLUDE_OUTPUT, Filename, "w+t");
12060d02842fSSascha Wildner 
12070d02842fSSascha Wildner         FlPrintFile (ASL_FILE_C_INCLUDE_OUTPUT, "/*\n");
12080d02842fSSascha Wildner         AslCompilerSignon (ASL_FILE_C_INCLUDE_OUTPUT);
12090d02842fSSascha Wildner         AslCompilerFileHeader (ASL_FILE_C_INCLUDE_OUTPUT);
12100d02842fSSascha Wildner     }
12110d02842fSSascha Wildner 
12120d02842fSSascha Wildner     /* Create a namespace output file if asked */
12130d02842fSSascha Wildner 
1214806343b9SSascha Wildner     if (AslGbl_NsOutputFlag)
12150d02842fSSascha Wildner     {
12160d02842fSSascha Wildner         Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_NAMESPACE);
12170d02842fSSascha Wildner         if (!Filename)
12180d02842fSSascha Wildner         {
12190d02842fSSascha Wildner             AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME,
12200d02842fSSascha Wildner                 0, 0, 0, 0, NULL, NULL);
12210d02842fSSascha Wildner             return (AE_ERROR);
12220d02842fSSascha Wildner         }
12230d02842fSSascha Wildner 
12240d02842fSSascha Wildner         /* Open the namespace file, text mode */
12250d02842fSSascha Wildner 
12260d02842fSSascha Wildner         FlOpenFile (ASL_FILE_NAMESPACE_OUTPUT, Filename, "w+t");
12270d02842fSSascha Wildner 
12280d02842fSSascha Wildner         AslCompilerSignon (ASL_FILE_NAMESPACE_OUTPUT);
12290d02842fSSascha Wildner         AslCompilerFileHeader (ASL_FILE_NAMESPACE_OUTPUT);
12300d02842fSSascha Wildner     }
12310d02842fSSascha Wildner 
1232d638c6eeSSascha Wildner     /* Create a debug file for the converter */
1233d638c6eeSSascha Wildner 
1234d638c6eeSSascha Wildner     if (AcpiGbl_DebugAslConversion)
1235d638c6eeSSascha Wildner     {
1236d638c6eeSSascha Wildner         Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_CONVERT_DEBUG);
1237d638c6eeSSascha Wildner         if (!Filename)
1238d638c6eeSSascha Wildner         {
1239d638c6eeSSascha Wildner             AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME,
1240d638c6eeSSascha Wildner                 0, 0, 0, 0, NULL, NULL);
1241d638c6eeSSascha Wildner             return (AE_ERROR);
1242d638c6eeSSascha Wildner         }
1243d638c6eeSSascha Wildner 
1244d638c6eeSSascha Wildner         /* Open the converter debug file, text mode */
1245d638c6eeSSascha Wildner 
1246d638c6eeSSascha Wildner         FlOpenFile (ASL_FILE_CONV_DEBUG_OUTPUT, Filename, "w+t");
1247d638c6eeSSascha Wildner 
1248d638c6eeSSascha Wildner         AslCompilerSignon (ASL_FILE_CONV_DEBUG_OUTPUT);
1249d638c6eeSSascha Wildner         AslCompilerFileHeader (ASL_FILE_CONV_DEBUG_OUTPUT);
1250d638c6eeSSascha Wildner 
1251806343b9SSascha Wildner         AcpiGbl_ConvDebugFile = AslGbl_Files[ASL_FILE_CONV_DEBUG_OUTPUT].Handle;
1252d638c6eeSSascha Wildner     }
1253d638c6eeSSascha Wildner 
12540d02842fSSascha Wildner     return (AE_OK);
12550d02842fSSascha Wildner }
12560d02842fSSascha Wildner 
12570d02842fSSascha Wildner 
12580d02842fSSascha Wildner #ifdef ACPI_OBSOLETE_FUNCTIONS
12590d02842fSSascha Wildner /*******************************************************************************
12600d02842fSSascha Wildner  *
12610d02842fSSascha Wildner  * FUNCTION:    FlParseInputPathname
12620d02842fSSascha Wildner  *
12630d02842fSSascha Wildner  * PARAMETERS:  InputFilename       - The user-specified ASL source file to be
12640d02842fSSascha Wildner  *                                    compiled
12650d02842fSSascha Wildner  *
12660d02842fSSascha Wildner  * RETURN:      Status
12670d02842fSSascha Wildner  *
12680d02842fSSascha Wildner  * DESCRIPTION: Split the input path into a directory and filename part
12690d02842fSSascha Wildner  *              1) Directory part used to open include files
12700d02842fSSascha Wildner  *              2) Filename part used to generate output filenames
12710d02842fSSascha Wildner  *
12720d02842fSSascha Wildner  ******************************************************************************/
12730d02842fSSascha Wildner 
12740d02842fSSascha Wildner ACPI_STATUS
FlParseInputPathname(char * InputFilename)12750d02842fSSascha Wildner FlParseInputPathname (
12760d02842fSSascha Wildner     char                    *InputFilename)
12770d02842fSSascha Wildner {
12780d02842fSSascha Wildner     char                    *Substring;
12790d02842fSSascha Wildner 
12800d02842fSSascha Wildner 
12810d02842fSSascha Wildner     if (!InputFilename)
12820d02842fSSascha Wildner     {
12830d02842fSSascha Wildner         return (AE_OK);
12840d02842fSSascha Wildner     }
12850d02842fSSascha Wildner 
12860d02842fSSascha Wildner     /* Get the path to the input filename's directory */
12870d02842fSSascha Wildner 
1288806343b9SSascha Wildner     AslGbl_DirectoryPath = strdup (InputFilename);
1289806343b9SSascha Wildner     if (!AslGbl_DirectoryPath)
12900d02842fSSascha Wildner     {
12910d02842fSSascha Wildner         return (AE_NO_MEMORY);
12920d02842fSSascha Wildner     }
12930d02842fSSascha Wildner 
1294806343b9SSascha Wildner     Substring = strrchr (AslGbl_DirectoryPath, '\\');
12950d02842fSSascha Wildner     if (!Substring)
12960d02842fSSascha Wildner     {
1297806343b9SSascha Wildner         Substring = strrchr (AslGbl_DirectoryPath, '/');
12980d02842fSSascha Wildner         if (!Substring)
12990d02842fSSascha Wildner         {
1300806343b9SSascha Wildner             Substring = strrchr (AslGbl_DirectoryPath, ':');
13010d02842fSSascha Wildner         }
13020d02842fSSascha Wildner     }
13030d02842fSSascha Wildner 
13040d02842fSSascha Wildner     if (!Substring)
13050d02842fSSascha Wildner     {
1306806343b9SSascha Wildner         AslGbl_DirectoryPath[0] = 0;
1307806343b9SSascha Wildner         if (AslGbl_UseDefaultAmlFilename)
13080d02842fSSascha Wildner         {
1309806343b9SSascha Wildner             AslGbl_OutputFilenamePrefix = strdup (InputFilename);
13100d02842fSSascha Wildner         }
13110d02842fSSascha Wildner     }
13120d02842fSSascha Wildner     else
13130d02842fSSascha Wildner     {
1314806343b9SSascha Wildner         if (AslGbl_UseDefaultAmlFilename)
13150d02842fSSascha Wildner         {
1316806343b9SSascha Wildner             AslGbl_OutputFilenamePrefix = strdup (Substring + 1);
13170d02842fSSascha Wildner         }
13180d02842fSSascha Wildner         *(Substring+1) = 0;
13190d02842fSSascha Wildner     }
13200d02842fSSascha Wildner 
1321806343b9SSascha Wildner     UtConvertBackslashes (AslGbl_OutputFilenamePrefix);
13220d02842fSSascha Wildner     return (AE_OK);
13230d02842fSSascha Wildner }
13240d02842fSSascha Wildner #endif
1325