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