153289f6aSNate Lawson /******************************************************************************
253289f6aSNate Lawson  *
3efcc2a30SJung-uk Kim  * Module Name: aslfiles - File support functions
453289f6aSNate Lawson  *
553289f6aSNate Lawson  *****************************************************************************/
653289f6aSNate Lawson 
70d84335fSJung-uk Kim /******************************************************************************
80d84335fSJung-uk Kim  *
90d84335fSJung-uk Kim  * 1. Copyright Notice
100d84335fSJung-uk Kim  *
110d84335fSJung-uk Kim  * Some or all of this work - Copyright (c) 1999 - 2017, Intel Corp.
1253289f6aSNate Lawson  * All rights reserved.
1353289f6aSNate Lawson  *
140d84335fSJung-uk Kim  * 2. License
150d84335fSJung-uk Kim  *
160d84335fSJung-uk Kim  * 2.1. This is your license from Intel Corp. under its intellectual property
170d84335fSJung-uk Kim  * rights. You may have additional license terms from the party that provided
180d84335fSJung-uk Kim  * you this software, covering your right to use that party's intellectual
190d84335fSJung-uk Kim  * property rights.
200d84335fSJung-uk Kim  *
210d84335fSJung-uk Kim  * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
220d84335fSJung-uk Kim  * copy of the source code appearing in this file ("Covered Code") an
230d84335fSJung-uk Kim  * irrevocable, perpetual, worldwide license under Intel's copyrights in the
240d84335fSJung-uk Kim  * base code distributed originally by Intel ("Original Intel Code") to copy,
250d84335fSJung-uk Kim  * make derivatives, distribute, use and display any portion of the Covered
260d84335fSJung-uk Kim  * Code in any form, with the right to sublicense such rights; and
270d84335fSJung-uk Kim  *
280d84335fSJung-uk Kim  * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
290d84335fSJung-uk Kim  * license (with the right to sublicense), under only those claims of Intel
300d84335fSJung-uk Kim  * patents that are infringed by the Original Intel Code, to make, use, sell,
310d84335fSJung-uk Kim  * offer to sell, and import the Covered Code and derivative works thereof
320d84335fSJung-uk Kim  * solely to the minimum extent necessary to exercise the above copyright
330d84335fSJung-uk Kim  * license, and in no event shall the patent license extend to any additions
340d84335fSJung-uk Kim  * to or modifications of the Original Intel Code. No other license or right
350d84335fSJung-uk Kim  * is granted directly or by implication, estoppel or otherwise;
360d84335fSJung-uk Kim  *
370d84335fSJung-uk Kim  * The above copyright and patent license is granted only if the following
380d84335fSJung-uk Kim  * conditions are met:
390d84335fSJung-uk Kim  *
400d84335fSJung-uk Kim  * 3. Conditions
410d84335fSJung-uk Kim  *
420d84335fSJung-uk Kim  * 3.1. Redistribution of Source with Rights to Further Distribute Source.
430d84335fSJung-uk Kim  * Redistribution of source code of any substantial portion of the Covered
440d84335fSJung-uk Kim  * Code or modification with rights to further distribute source must include
450d84335fSJung-uk Kim  * the above Copyright Notice, the above License, this list of Conditions,
460d84335fSJung-uk Kim  * and the following Disclaimer and Export Compliance provision. In addition,
470d84335fSJung-uk Kim  * Licensee must cause all Covered Code to which Licensee contributes to
480d84335fSJung-uk Kim  * contain a file documenting the changes Licensee made to create that Covered
490d84335fSJung-uk Kim  * Code and the date of any change. Licensee must include in that file the
500d84335fSJung-uk Kim  * documentation of any changes made by any predecessor Licensee. Licensee
510d84335fSJung-uk Kim  * must include a prominent statement that the modification is derived,
520d84335fSJung-uk Kim  * directly or indirectly, from Original Intel Code.
530d84335fSJung-uk Kim  *
540d84335fSJung-uk Kim  * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
550d84335fSJung-uk Kim  * Redistribution of source code of any substantial portion of the Covered
560d84335fSJung-uk Kim  * Code or modification without rights to further distribute source must
570d84335fSJung-uk Kim  * include the following Disclaimer and Export Compliance provision in the
580d84335fSJung-uk Kim  * documentation and/or other materials provided with distribution. In
590d84335fSJung-uk Kim  * addition, Licensee may not authorize further sublicense of source of any
600d84335fSJung-uk Kim  * portion of the Covered Code, and must include terms to the effect that the
610d84335fSJung-uk Kim  * license from Licensee to its licensee is limited to the intellectual
620d84335fSJung-uk Kim  * property embodied in the software Licensee provides to its licensee, and
630d84335fSJung-uk Kim  * not to intellectual property embodied in modifications its licensee may
640d84335fSJung-uk Kim  * make.
650d84335fSJung-uk Kim  *
660d84335fSJung-uk Kim  * 3.3. Redistribution of Executable. Redistribution in executable form of any
670d84335fSJung-uk Kim  * substantial portion of the Covered Code or modification must reproduce the
680d84335fSJung-uk Kim  * above Copyright Notice, and the following Disclaimer and Export Compliance
690d84335fSJung-uk Kim  * provision in the documentation and/or other materials provided with the
700d84335fSJung-uk Kim  * distribution.
710d84335fSJung-uk Kim  *
720d84335fSJung-uk Kim  * 3.4. Intel retains all right, title, and interest in and to the Original
730d84335fSJung-uk Kim  * Intel Code.
740d84335fSJung-uk Kim  *
750d84335fSJung-uk Kim  * 3.5. Neither the name Intel nor any other trademark owned or controlled by
760d84335fSJung-uk Kim  * Intel shall be used in advertising or otherwise to promote the sale, use or
770d84335fSJung-uk Kim  * other dealings in products derived from or relating to the Covered Code
780d84335fSJung-uk Kim  * without prior written authorization from Intel.
790d84335fSJung-uk Kim  *
800d84335fSJung-uk Kim  * 4. Disclaimer and Export Compliance
810d84335fSJung-uk Kim  *
820d84335fSJung-uk Kim  * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
830d84335fSJung-uk Kim  * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
840d84335fSJung-uk Kim  * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
850d84335fSJung-uk Kim  * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
860d84335fSJung-uk Kim  * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
870d84335fSJung-uk Kim  * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
880d84335fSJung-uk Kim  * PARTICULAR PURPOSE.
890d84335fSJung-uk Kim  *
900d84335fSJung-uk Kim  * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
910d84335fSJung-uk Kim  * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
920d84335fSJung-uk Kim  * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
930d84335fSJung-uk Kim  * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
940d84335fSJung-uk Kim  * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
950d84335fSJung-uk Kim  * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
960d84335fSJung-uk Kim  * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
970d84335fSJung-uk Kim  * LIMITED REMEDY.
980d84335fSJung-uk Kim  *
990d84335fSJung-uk Kim  * 4.3. Licensee shall not export, either directly or indirectly, any of this
1000d84335fSJung-uk Kim  * software or system incorporating such software without first obtaining any
1010d84335fSJung-uk Kim  * required license or other approval from the U. S. Department of Commerce or
1020d84335fSJung-uk Kim  * any other agency or department of the United States Government. In the
1030d84335fSJung-uk Kim  * event Licensee exports any such software from the United States or
1040d84335fSJung-uk Kim  * re-exports any such software from a foreign destination, Licensee shall
1050d84335fSJung-uk Kim  * ensure that the distribution and export/re-export of the software is in
1060d84335fSJung-uk Kim  * compliance with all laws, regulations, orders, or other restrictions of the
1070d84335fSJung-uk Kim  * U.S. Export Administration Regulations. Licensee agrees that neither it nor
1080d84335fSJung-uk Kim  * any of its subsidiaries will export/re-export any technical data, process,
1090d84335fSJung-uk Kim  * software, or service, directly or indirectly, to any country for which the
1100d84335fSJung-uk Kim  * United States government or any agency thereof requires an export license,
1110d84335fSJung-uk Kim  * other governmental approval, or letter of assurance, without first obtaining
1120d84335fSJung-uk Kim  * such license, approval or letter.
1130d84335fSJung-uk Kim  *
1140d84335fSJung-uk Kim  *****************************************************************************
1150d84335fSJung-uk Kim  *
1160d84335fSJung-uk Kim  * Alternatively, you may choose to be licensed under the terms of the
1170d84335fSJung-uk Kim  * following license:
1180d84335fSJung-uk Kim  *
119d244b227SJung-uk Kim  * Redistribution and use in source and binary forms, with or without
120d244b227SJung-uk Kim  * modification, are permitted provided that the following conditions
121d244b227SJung-uk Kim  * are met:
122d244b227SJung-uk Kim  * 1. Redistributions of source code must retain the above copyright
123d244b227SJung-uk Kim  *    notice, this list of conditions, and the following disclaimer,
124d244b227SJung-uk Kim  *    without modification.
125d244b227SJung-uk Kim  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
126d244b227SJung-uk Kim  *    substantially similar to the "NO WARRANTY" disclaimer below
127d244b227SJung-uk Kim  *    ("Disclaimer") and any redistribution must be conditioned upon
128d244b227SJung-uk Kim  *    including a substantially similar Disclaimer requirement for further
129d244b227SJung-uk Kim  *    binary redistribution.
130d244b227SJung-uk Kim  * 3. Neither the names of the above-listed copyright holders nor the names
131d244b227SJung-uk Kim  *    of any contributors may be used to endorse or promote products derived
132d244b227SJung-uk Kim  *    from this software without specific prior written permission.
13353289f6aSNate Lawson  *
1340d84335fSJung-uk Kim  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
1350d84335fSJung-uk Kim  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
1360d84335fSJung-uk Kim  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
1370d84335fSJung-uk Kim  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
1380d84335fSJung-uk Kim  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
1390d84335fSJung-uk Kim  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
1400d84335fSJung-uk Kim  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
1410d84335fSJung-uk Kim  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
1420d84335fSJung-uk Kim  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
1430d84335fSJung-uk Kim  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
1440d84335fSJung-uk Kim  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
1450d84335fSJung-uk Kim  *
1460d84335fSJung-uk Kim  * Alternatively, you may choose to be licensed under the terms of the
147d244b227SJung-uk Kim  * GNU General Public License ("GPL") version 2 as published by the Free
148d244b227SJung-uk Kim  * Software Foundation.
14953289f6aSNate Lawson  *
1500d84335fSJung-uk Kim  *****************************************************************************/
15153289f6aSNate Lawson 
152ab6f3bf9SJung-uk Kim #include <contrib/dev/acpica/compiler/aslcompiler.h>
153ab6f3bf9SJung-uk Kim #include <contrib/dev/acpica/include/acapps.h>
1545ef50723SJung-uk Kim #include <contrib/dev/acpica/compiler/dtcompiler.h>
15553289f6aSNate Lawson 
15653289f6aSNate Lawson #define _COMPONENT          ACPI_COMPILER
15753289f6aSNate Lawson         ACPI_MODULE_NAME    ("aslfiles")
15853289f6aSNate Lawson 
159fba7fc7eSJung-uk Kim /* Local prototypes */
160fba7fc7eSJung-uk Kim 
161a371a5fdSJung-uk Kim static FILE *
162d6dd1baeSJung-uk Kim FlOpenIncludeWithPrefix (
163d6dd1baeSJung-uk Kim     char                    *PrefixDir,
164a371a5fdSJung-uk Kim     ACPI_PARSE_OBJECT       *Op,
165d6dd1baeSJung-uk Kim     char                    *Filename);
166d6dd1baeSJung-uk Kim 
167fba7fc7eSJung-uk Kim #ifdef ACPI_OBSOLETE_FUNCTIONS
168fba7fc7eSJung-uk Kim ACPI_STATUS
169fba7fc7eSJung-uk Kim FlParseInputPathname (
170fba7fc7eSJung-uk Kim     char                    *InputFilename);
171fba7fc7eSJung-uk Kim #endif
172fba7fc7eSJung-uk Kim 
17353289f6aSNate Lawson 
17453289f6aSNate Lawson /*******************************************************************************
17553289f6aSNate Lawson  *
17653289f6aSNate Lawson  * FUNCTION:    FlSetLineNumber
17753289f6aSNate Lawson  *
17853289f6aSNate Lawson  * PARAMETERS:  Op        - Parse node for the LINE asl statement
17953289f6aSNate Lawson  *
18053289f6aSNate Lawson  * RETURN:      None.
18153289f6aSNate Lawson  *
18253289f6aSNate Lawson  * DESCRIPTION: Set the current line number
18353289f6aSNate Lawson  *
18453289f6aSNate Lawson  ******************************************************************************/
18553289f6aSNate Lawson 
18653289f6aSNate Lawson void
18753289f6aSNate Lawson FlSetLineNumber (
188eef1b955SJung-uk Kim     UINT32                  LineNumber)
18953289f6aSNate Lawson {
19053289f6aSNate Lawson 
191eef1b955SJung-uk Kim     DbgPrint (ASL_PARSE_OUTPUT, "\n#line: New line number %u (old %u)\n",
192eef1b955SJung-uk Kim          LineNumber, Gbl_LogicalLineNumber);
193eef1b955SJung-uk Kim 
194eef1b955SJung-uk Kim     Gbl_CurrentLineNumber = LineNumber;
195eef1b955SJung-uk Kim }
196eef1b955SJung-uk Kim 
197eef1b955SJung-uk Kim 
198eef1b955SJung-uk Kim /*******************************************************************************
199eef1b955SJung-uk Kim  *
200eef1b955SJung-uk Kim  * FUNCTION:    FlSetFilename
201eef1b955SJung-uk Kim  *
202eef1b955SJung-uk Kim  * PARAMETERS:  Op        - Parse node for the LINE asl statement
203eef1b955SJung-uk Kim  *
204eef1b955SJung-uk Kim  * RETURN:      None.
205eef1b955SJung-uk Kim  *
206eef1b955SJung-uk Kim  * DESCRIPTION: Set the current filename
207eef1b955SJung-uk Kim  *
208eef1b955SJung-uk Kim  ******************************************************************************/
209eef1b955SJung-uk Kim 
210eef1b955SJung-uk Kim void
211eef1b955SJung-uk Kim FlSetFilename (
212eef1b955SJung-uk Kim     char                    *Filename)
213eef1b955SJung-uk Kim {
214eef1b955SJung-uk Kim 
215eef1b955SJung-uk Kim     DbgPrint (ASL_PARSE_OUTPUT, "\n#line: New filename %s (old %s)\n",
216eef1b955SJung-uk Kim          Filename, Gbl_Files[ASL_FILE_INPUT].Filename);
217eef1b955SJung-uk Kim 
218313a0c13SJung-uk Kim     /* No need to free any existing filename */
219313a0c13SJung-uk Kim 
220eef1b955SJung-uk Kim     Gbl_Files[ASL_FILE_INPUT].Filename = Filename;
22153289f6aSNate Lawson }
22253289f6aSNate Lawson 
22353289f6aSNate Lawson 
22453289f6aSNate Lawson /*******************************************************************************
22553289f6aSNate Lawson  *
226d6dd1baeSJung-uk Kim  * FUNCTION:    FlAddIncludeDirectory
227d6dd1baeSJung-uk Kim  *
228d6dd1baeSJung-uk Kim  * PARAMETERS:  Dir             - Directory pathname string
229d6dd1baeSJung-uk Kim  *
230d6dd1baeSJung-uk Kim  * RETURN:      None
231d6dd1baeSJung-uk Kim  *
232d6dd1baeSJung-uk Kim  * DESCRIPTION: Add a directory the list of include prefix directories.
233d6dd1baeSJung-uk Kim  *
234d6dd1baeSJung-uk Kim  ******************************************************************************/
235d6dd1baeSJung-uk Kim 
236d6dd1baeSJung-uk Kim void
237d6dd1baeSJung-uk Kim FlAddIncludeDirectory (
238d6dd1baeSJung-uk Kim     char                    *Dir)
239d6dd1baeSJung-uk Kim {
240d6dd1baeSJung-uk Kim     ASL_INCLUDE_DIR         *NewDir;
241d6dd1baeSJung-uk Kim     ASL_INCLUDE_DIR         *NextDir;
242d6dd1baeSJung-uk Kim     ASL_INCLUDE_DIR         *PrevDir = NULL;
243d6dd1baeSJung-uk Kim     UINT32                  NeedsSeparator = 0;
244d6dd1baeSJung-uk Kim     size_t                  DirLength;
245d6dd1baeSJung-uk Kim 
246d6dd1baeSJung-uk Kim 
247d6dd1baeSJung-uk Kim     DirLength = strlen (Dir);
248d6dd1baeSJung-uk Kim     if (!DirLength)
249d6dd1baeSJung-uk Kim     {
250d6dd1baeSJung-uk Kim         return;
251d6dd1baeSJung-uk Kim     }
252d6dd1baeSJung-uk Kim 
253d6dd1baeSJung-uk Kim     /* Make sure that the pathname ends with a path separator */
254d6dd1baeSJung-uk Kim 
255d6dd1baeSJung-uk Kim     if ((Dir[DirLength-1] != '/') &&
256d6dd1baeSJung-uk Kim         (Dir[DirLength-1] != '\\'))
257d6dd1baeSJung-uk Kim     {
258d6dd1baeSJung-uk Kim         NeedsSeparator = 1;
259d6dd1baeSJung-uk Kim     }
260d6dd1baeSJung-uk Kim 
261d6dd1baeSJung-uk Kim     NewDir = ACPI_ALLOCATE_ZEROED (sizeof (ASL_INCLUDE_DIR));
262d6dd1baeSJung-uk Kim     NewDir->Dir = ACPI_ALLOCATE (DirLength + 1 + NeedsSeparator);
263d6dd1baeSJung-uk Kim     strcpy (NewDir->Dir, Dir);
264d6dd1baeSJung-uk Kim     if (NeedsSeparator)
265d6dd1baeSJung-uk Kim     {
266d6dd1baeSJung-uk Kim         strcat (NewDir->Dir, "/");
267d6dd1baeSJung-uk Kim     }
268d6dd1baeSJung-uk Kim 
269d6dd1baeSJung-uk Kim     /*
270d6dd1baeSJung-uk Kim      * Preserve command line ordering of -I options by adding new elements
271d6dd1baeSJung-uk Kim      * at the end of the list
272d6dd1baeSJung-uk Kim      */
273d6dd1baeSJung-uk Kim     NextDir = Gbl_IncludeDirList;
274d6dd1baeSJung-uk Kim     while (NextDir)
275d6dd1baeSJung-uk Kim     {
276d6dd1baeSJung-uk Kim         PrevDir = NextDir;
277d6dd1baeSJung-uk Kim         NextDir = NextDir->Next;
278d6dd1baeSJung-uk Kim     }
279d6dd1baeSJung-uk Kim 
280d6dd1baeSJung-uk Kim     if (PrevDir)
281d6dd1baeSJung-uk Kim     {
282d6dd1baeSJung-uk Kim         PrevDir->Next = NewDir;
283d6dd1baeSJung-uk Kim     }
284d6dd1baeSJung-uk Kim     else
285d6dd1baeSJung-uk Kim     {
286d6dd1baeSJung-uk Kim         Gbl_IncludeDirList = NewDir;
287d6dd1baeSJung-uk Kim     }
288d6dd1baeSJung-uk Kim }
289d6dd1baeSJung-uk Kim 
290d6dd1baeSJung-uk Kim 
291d6dd1baeSJung-uk Kim /*******************************************************************************
292d6dd1baeSJung-uk Kim  *
293a7a3b383SJung-uk Kim  * FUNCTION:    FlMergePathnames
294a7a3b383SJung-uk Kim  *
295a7a3b383SJung-uk Kim  * PARAMETERS:  PrefixDir       - Prefix directory pathname. Can be NULL or
296a7a3b383SJung-uk Kim  *                                a zero length string.
297a7a3b383SJung-uk Kim  *              FilePathname    - The include filename from the source ASL.
298a7a3b383SJung-uk Kim  *
299a7a3b383SJung-uk Kim  * RETURN:      Merged pathname string
300a7a3b383SJung-uk Kim  *
301a7a3b383SJung-uk Kim  * DESCRIPTION: Merge two pathnames that (probably) have common elements, to
302a7a3b383SJung-uk Kim  *              arrive at a minimal length string. Merge can occur if the
303a7a3b383SJung-uk Kim  *              FilePathname is relative to the PrefixDir.
304a7a3b383SJung-uk Kim  *
305a7a3b383SJung-uk Kim  ******************************************************************************/
306a7a3b383SJung-uk Kim 
307a7a3b383SJung-uk Kim char *
308a7a3b383SJung-uk Kim FlMergePathnames (
309a7a3b383SJung-uk Kim     char                    *PrefixDir,
310a7a3b383SJung-uk Kim     char                    *FilePathname)
311a7a3b383SJung-uk Kim {
312a7a3b383SJung-uk Kim     char                    *CommonPath;
313a7a3b383SJung-uk Kim     char                    *Pathname;
314a7a3b383SJung-uk Kim     char                    *LastElement;
315a7a3b383SJung-uk Kim 
316a7a3b383SJung-uk Kim 
317a7a3b383SJung-uk Kim     DbgPrint (ASL_PARSE_OUTPUT, "Include: Prefix path - \"%s\"\n"
318a7a3b383SJung-uk Kim         "Include: FilePathname - \"%s\"\n",
319a7a3b383SJung-uk Kim          PrefixDir, FilePathname);
320a7a3b383SJung-uk Kim 
321a7a3b383SJung-uk Kim     /*
322a7a3b383SJung-uk Kim      * If there is no prefix directory or if the file pathname is absolute,
323a7a3b383SJung-uk Kim      * just return the original file pathname
324a7a3b383SJung-uk Kim      */
325a7a3b383SJung-uk Kim     if (!PrefixDir || (!*PrefixDir) ||
326a7a3b383SJung-uk Kim         (*FilePathname == '/') ||
327a7a3b383SJung-uk Kim          (FilePathname[1] == ':'))
328a7a3b383SJung-uk Kim     {
329313a0c13SJung-uk Kim         Pathname = UtStringCacheCalloc (strlen (FilePathname) + 1);
330a7a3b383SJung-uk Kim         strcpy (Pathname, FilePathname);
331a7a3b383SJung-uk Kim         goto ConvertBackslashes;
332a7a3b383SJung-uk Kim     }
333a7a3b383SJung-uk Kim 
334a7a3b383SJung-uk Kim     /* Need a local copy of the prefix directory path */
335a7a3b383SJung-uk Kim 
336313a0c13SJung-uk Kim     CommonPath = UtStringCacheCalloc (strlen (PrefixDir) + 1);
337a7a3b383SJung-uk Kim     strcpy (CommonPath, PrefixDir);
338a7a3b383SJung-uk Kim 
339a7a3b383SJung-uk Kim     /*
340a7a3b383SJung-uk Kim      * Walk forward through the file path, and simultaneously backward
341a7a3b383SJung-uk Kim      * through the prefix directory path until there are no more
342a7a3b383SJung-uk Kim      * relative references at the start of the file path.
343a7a3b383SJung-uk Kim      */
344a7a3b383SJung-uk Kim     while (*FilePathname && (!strncmp (FilePathname, "../", 3)))
345a7a3b383SJung-uk Kim     {
346a7a3b383SJung-uk Kim         /* Remove last element of the prefix directory path */
347a7a3b383SJung-uk Kim 
348a7a3b383SJung-uk Kim         LastElement = strrchr (CommonPath, '/');
349a7a3b383SJung-uk Kim         if (!LastElement)
350a7a3b383SJung-uk Kim         {
351a7a3b383SJung-uk Kim             goto ConcatenatePaths;
352a7a3b383SJung-uk Kim         }
353a7a3b383SJung-uk Kim 
354a7a3b383SJung-uk Kim         *LastElement = 0;   /* Terminate CommonPath string */
355a7a3b383SJung-uk Kim         FilePathname += 3;  /* Point to next path element */
356a7a3b383SJung-uk Kim     }
357a7a3b383SJung-uk Kim 
358a7a3b383SJung-uk Kim     /*
359a7a3b383SJung-uk Kim      * Remove the last element of the prefix directory path (it is the same as
360a7a3b383SJung-uk Kim      * the first element of the file pathname), and build the final merged
361a7a3b383SJung-uk Kim      * pathname.
362a7a3b383SJung-uk Kim      */
363a7a3b383SJung-uk Kim     LastElement = strrchr (CommonPath, '/');
364a7a3b383SJung-uk Kim     if (LastElement)
365a7a3b383SJung-uk Kim     {
366a7a3b383SJung-uk Kim         *LastElement = 0;
367a7a3b383SJung-uk Kim     }
368a7a3b383SJung-uk Kim 
369a7a3b383SJung-uk Kim     /* Build the final merged pathname */
370a7a3b383SJung-uk Kim 
371a7a3b383SJung-uk Kim ConcatenatePaths:
372f8146b88SJung-uk Kim     Pathname = UtStringCacheCalloc (
373f8146b88SJung-uk Kim         strlen (CommonPath) + strlen (FilePathname) + 2);
374a7a3b383SJung-uk Kim     if (LastElement && *CommonPath)
375a7a3b383SJung-uk Kim     {
376a7a3b383SJung-uk Kim         strcpy (Pathname, CommonPath);
377a7a3b383SJung-uk Kim         strcat (Pathname, "/");
378a7a3b383SJung-uk Kim     }
379a7a3b383SJung-uk Kim     strcat (Pathname, FilePathname);
380a7a3b383SJung-uk Kim 
381a7a3b383SJung-uk Kim     /* Convert all backslashes to normal slashes */
382a7a3b383SJung-uk Kim 
383a7a3b383SJung-uk Kim ConvertBackslashes:
384a7a3b383SJung-uk Kim     UtConvertBackslashes (Pathname);
385a7a3b383SJung-uk Kim 
386a7a3b383SJung-uk Kim     DbgPrint (ASL_PARSE_OUTPUT, "Include: Merged Pathname - \"%s\"\n",
387a7a3b383SJung-uk Kim          Pathname);
388a7a3b383SJung-uk Kim     return (Pathname);
389a7a3b383SJung-uk Kim }
390a7a3b383SJung-uk Kim 
391a7a3b383SJung-uk Kim 
392a7a3b383SJung-uk Kim /*******************************************************************************
393a7a3b383SJung-uk Kim  *
394d6dd1baeSJung-uk Kim  * FUNCTION:    FlOpenIncludeWithPrefix
395d6dd1baeSJung-uk Kim  *
396d6dd1baeSJung-uk Kim  * PARAMETERS:  PrefixDir       - Prefix directory pathname. Can be a zero
397d6dd1baeSJung-uk Kim  *                                length string.
398d6dd1baeSJung-uk Kim  *              Filename        - The include filename from the source ASL.
399d6dd1baeSJung-uk Kim  *
400d6dd1baeSJung-uk Kim  * RETURN:      Valid file descriptor if successful. Null otherwise.
401d6dd1baeSJung-uk Kim  *
402d6dd1baeSJung-uk Kim  * DESCRIPTION: Open an include file and push it on the input file stack.
403d6dd1baeSJung-uk Kim  *
404d6dd1baeSJung-uk Kim  ******************************************************************************/
405d6dd1baeSJung-uk Kim 
406a371a5fdSJung-uk Kim static FILE *
407d6dd1baeSJung-uk Kim FlOpenIncludeWithPrefix (
408d6dd1baeSJung-uk Kim     char                    *PrefixDir,
409a371a5fdSJung-uk Kim     ACPI_PARSE_OBJECT       *Op,
410d6dd1baeSJung-uk Kim     char                    *Filename)
411d6dd1baeSJung-uk Kim {
412d6dd1baeSJung-uk Kim     FILE                    *IncludeFile;
413d6dd1baeSJung-uk Kim     char                    *Pathname;
4145ef50723SJung-uk Kim     UINT32                  OriginalLineNumber;
415d6dd1baeSJung-uk Kim 
416d6dd1baeSJung-uk Kim 
417d6dd1baeSJung-uk Kim     /* Build the full pathname to the file */
418d6dd1baeSJung-uk Kim 
419a7a3b383SJung-uk Kim     Pathname = FlMergePathnames (PrefixDir, Filename);
420d6dd1baeSJung-uk Kim 
421a7a3b383SJung-uk Kim     DbgPrint (ASL_PARSE_OUTPUT, "Include: Opening file - \"%s\"\n\n",
422d6dd1baeSJung-uk Kim         Pathname);
423d6dd1baeSJung-uk Kim 
424d6dd1baeSJung-uk Kim     /* Attempt to open the file, push if successful */
425d6dd1baeSJung-uk Kim 
426d6dd1baeSJung-uk Kim     IncludeFile = fopen (Pathname, "r");
427ed17e06eSJung-uk Kim     if (!IncludeFile)
428d6dd1baeSJung-uk Kim     {
429ed17e06eSJung-uk Kim         fprintf (stderr, "Could not open include file %s\n", Pathname);
430ed17e06eSJung-uk Kim         ACPI_FREE (Pathname);
431ed17e06eSJung-uk Kim         return (NULL);
432ed17e06eSJung-uk Kim     }
433ed17e06eSJung-uk Kim 
434a371a5fdSJung-uk Kim     /*
4355ef50723SJung-uk Kim      * Check the entire include file for any # preprocessor directives.
436a371a5fdSJung-uk Kim      * This is because there may be some confusion between the #include
4375ef50723SJung-uk Kim      * preprocessor directive and the ASL Include statement. A file included
4385ef50723SJung-uk Kim      * by the ASL include cannot contain preprocessor directives because
4395ef50723SJung-uk Kim      * the preprocessor has already run by the time the ASL include is
4405ef50723SJung-uk Kim      * recognized (by the compiler, not the preprocessor.)
4415ef50723SJung-uk Kim      *
4425ef50723SJung-uk Kim      * Note: DtGetNextLine strips/ignores comments.
4435ef50723SJung-uk Kim      * Save current line number since DtGetNextLine modifies it.
444a371a5fdSJung-uk Kim      */
4455ef50723SJung-uk Kim     Gbl_CurrentLineNumber--;
4465ef50723SJung-uk Kim     OriginalLineNumber = Gbl_CurrentLineNumber;
447f8146b88SJung-uk Kim 
4485ef50723SJung-uk Kim     while (DtGetNextLine (IncludeFile, DT_ALLOW_MULTILINE_QUOTES) != ASL_EOF)
449a371a5fdSJung-uk Kim     {
450a371a5fdSJung-uk Kim         if (Gbl_CurrentLineBuffer[0] == '#')
451a371a5fdSJung-uk Kim         {
452a371a5fdSJung-uk Kim             AslError (ASL_ERROR, ASL_MSG_INCLUDE_FILE,
453a371a5fdSJung-uk Kim                 Op, "use #include instead");
454a371a5fdSJung-uk Kim         }
455a371a5fdSJung-uk Kim     }
456f8146b88SJung-uk Kim 
4575ef50723SJung-uk Kim     Gbl_CurrentLineNumber = OriginalLineNumber;
458a371a5fdSJung-uk Kim 
459a371a5fdSJung-uk Kim     /* Must seek back to the start of the file */
460a371a5fdSJung-uk Kim 
461a371a5fdSJung-uk Kim     fseek (IncludeFile, 0, SEEK_SET);
462a371a5fdSJung-uk Kim 
463d6dd1baeSJung-uk Kim     /* Push the include file on the open input file stack */
464d6dd1baeSJung-uk Kim 
465d6dd1baeSJung-uk Kim     AslPushInputFileStack (IncludeFile, Pathname);
466d6dd1baeSJung-uk Kim     return (IncludeFile);
467d6dd1baeSJung-uk Kim }
468d6dd1baeSJung-uk Kim 
469d6dd1baeSJung-uk Kim 
470d6dd1baeSJung-uk Kim /*******************************************************************************
471d6dd1baeSJung-uk Kim  *
47253289f6aSNate Lawson  * FUNCTION:    FlOpenIncludeFile
47353289f6aSNate Lawson  *
47453289f6aSNate Lawson  * PARAMETERS:  Op        - Parse node for the INCLUDE ASL statement
47553289f6aSNate Lawson  *
47653289f6aSNate Lawson  * RETURN:      None.
47753289f6aSNate Lawson  *
47853289f6aSNate Lawson  * DESCRIPTION: Open an include file and push it on the input file stack.
47953289f6aSNate Lawson  *
48053289f6aSNate Lawson  ******************************************************************************/
48153289f6aSNate Lawson 
48253289f6aSNate Lawson void
48353289f6aSNate Lawson FlOpenIncludeFile (
48453289f6aSNate Lawson     ACPI_PARSE_OBJECT       *Op)
48553289f6aSNate Lawson {
486d6dd1baeSJung-uk Kim     FILE                    *IncludeFile;
487d6dd1baeSJung-uk Kim     ASL_INCLUDE_DIR         *NextDir;
48853289f6aSNate Lawson 
48953289f6aSNate Lawson 
49053289f6aSNate Lawson     /* Op must be valid */
49153289f6aSNate Lawson 
49253289f6aSNate Lawson     if (!Op)
49353289f6aSNate Lawson     {
49453289f6aSNate Lawson         AslCommonError (ASL_ERROR, ASL_MSG_INCLUDE_FILE_OPEN,
49553289f6aSNate Lawson             Gbl_CurrentLineNumber, Gbl_LogicalLineNumber,
49653289f6aSNate Lawson             Gbl_InputByteCount, Gbl_CurrentColumn,
49753289f6aSNate Lawson             Gbl_Files[ASL_FILE_INPUT].Filename, " - Null parse node");
49853289f6aSNate Lawson 
49953289f6aSNate Lawson         return;
50053289f6aSNate Lawson     }
50153289f6aSNate Lawson 
50253289f6aSNate Lawson     /*
50353289f6aSNate Lawson      * Flush out the "include ()" statement on this line, start
50453289f6aSNate Lawson      * the actual include file on the next line
50553289f6aSNate Lawson      */
506eef1b955SJung-uk Kim     AslResetCurrentLineBuffer ();
50753289f6aSNate Lawson     FlPrintFile (ASL_FILE_SOURCE_OUTPUT, "\n");
50853289f6aSNate Lawson     Gbl_CurrentLineOffset++;
50953289f6aSNate Lawson 
51053289f6aSNate Lawson 
511d6dd1baeSJung-uk Kim     /* Attempt to open the include file */
512d6dd1baeSJung-uk Kim 
513d6dd1baeSJung-uk Kim     /* If the file specifies an absolute path, just open it */
514d6dd1baeSJung-uk Kim 
515d6dd1baeSJung-uk Kim     if ((Op->Asl.Value.String[0] == '/')  ||
516d6dd1baeSJung-uk Kim         (Op->Asl.Value.String[0] == '\\') ||
517d6dd1baeSJung-uk Kim         (Op->Asl.Value.String[1] == ':'))
51853289f6aSNate Lawson     {
519a371a5fdSJung-uk Kim         IncludeFile = FlOpenIncludeWithPrefix ("", Op, Op->Asl.Value.String);
520d6dd1baeSJung-uk Kim         if (!IncludeFile)
521d6dd1baeSJung-uk Kim         {
522d6dd1baeSJung-uk Kim             goto ErrorExit;
523d6dd1baeSJung-uk Kim         }
52453289f6aSNate Lawson         return;
52553289f6aSNate Lawson     }
52653289f6aSNate Lawson 
527d6dd1baeSJung-uk Kim     /*
528d6dd1baeSJung-uk Kim      * The include filename is not an absolute path.
529d6dd1baeSJung-uk Kim      *
530d6dd1baeSJung-uk Kim      * First, search for the file within the "local" directory -- meaning
531d6dd1baeSJung-uk Kim      * the same directory that contains the source file.
532d6dd1baeSJung-uk Kim      *
533d6dd1baeSJung-uk Kim      * Construct the file pathname from the global directory name.
534d6dd1baeSJung-uk Kim      */
535f8146b88SJung-uk Kim     IncludeFile = FlOpenIncludeWithPrefix (
536f8146b88SJung-uk Kim         Gbl_DirectoryPath, Op, Op->Asl.Value.String);
537d6dd1baeSJung-uk Kim     if (IncludeFile)
538d6dd1baeSJung-uk Kim     {
539d6dd1baeSJung-uk Kim         return;
540d6dd1baeSJung-uk Kim     }
54153289f6aSNate Lawson 
542d6dd1baeSJung-uk Kim     /*
543d6dd1baeSJung-uk Kim      * Second, search for the file within the (possibly multiple) directories
544d6dd1baeSJung-uk Kim      * specified by the -I option on the command line.
545d6dd1baeSJung-uk Kim      */
546d6dd1baeSJung-uk Kim     NextDir = Gbl_IncludeDirList;
547d6dd1baeSJung-uk Kim     while (NextDir)
548d6dd1baeSJung-uk Kim     {
549f8146b88SJung-uk Kim         IncludeFile = FlOpenIncludeWithPrefix (
550f8146b88SJung-uk Kim             NextDir->Dir, Op, Op->Asl.Value.String);
551d6dd1baeSJung-uk Kim         if (IncludeFile)
552d6dd1baeSJung-uk Kim         {
553d6dd1baeSJung-uk Kim             return;
554d6dd1baeSJung-uk Kim         }
555d6dd1baeSJung-uk Kim 
556d6dd1baeSJung-uk Kim         NextDir = NextDir->Next;
557d6dd1baeSJung-uk Kim     }
558d6dd1baeSJung-uk Kim 
559d6dd1baeSJung-uk Kim     /* We could not open the include file after trying very hard */
560d6dd1baeSJung-uk Kim 
561d6dd1baeSJung-uk Kim ErrorExit:
562d6dd1baeSJung-uk Kim     sprintf (MsgBuffer, "%s, %s", Op->Asl.Value.String, strerror (errno));
563d6dd1baeSJung-uk Kim     AslError (ASL_ERROR, ASL_MSG_INCLUDE_FILE_OPEN, Op, MsgBuffer);
56453289f6aSNate Lawson }
56553289f6aSNate Lawson 
56653289f6aSNate Lawson 
56753289f6aSNate Lawson /*******************************************************************************
56853289f6aSNate Lawson  *
569fba7fc7eSJung-uk Kim  * FUNCTION:    FlOpenInputFile
570fba7fc7eSJung-uk Kim  *
571fba7fc7eSJung-uk Kim  * PARAMETERS:  InputFilename       - The user-specified ASL source file to be
572fba7fc7eSJung-uk Kim  *                                    compiled
573fba7fc7eSJung-uk Kim  *
574fba7fc7eSJung-uk Kim  * RETURN:      Status
575fba7fc7eSJung-uk Kim  *
576fba7fc7eSJung-uk Kim  * DESCRIPTION: Open the specified input file, and save the directory path to
577fba7fc7eSJung-uk Kim  *              the file so that include files can be opened in
578fba7fc7eSJung-uk Kim  *              the same directory.
579fba7fc7eSJung-uk Kim  *
580fba7fc7eSJung-uk Kim  ******************************************************************************/
581fba7fc7eSJung-uk Kim 
582fba7fc7eSJung-uk Kim ACPI_STATUS
583fba7fc7eSJung-uk Kim FlOpenInputFile (
584fba7fc7eSJung-uk Kim     char                    *InputFilename)
585fba7fc7eSJung-uk Kim {
586fba7fc7eSJung-uk Kim 
587fba7fc7eSJung-uk Kim     /* Open the input ASL file, text mode */
588fba7fc7eSJung-uk Kim 
589f38b0f21SJung-uk Kim     FlOpenFile (ASL_FILE_INPUT, InputFilename, "rt");
590fba7fc7eSJung-uk Kim     AslCompilerin = Gbl_Files[ASL_FILE_INPUT].Handle;
591fba7fc7eSJung-uk Kim 
592fba7fc7eSJung-uk Kim     return (AE_OK);
593fba7fc7eSJung-uk Kim }
594fba7fc7eSJung-uk Kim 
595fba7fc7eSJung-uk Kim 
596fba7fc7eSJung-uk Kim /*******************************************************************************
597fba7fc7eSJung-uk Kim  *
598fba7fc7eSJung-uk Kim  * FUNCTION:    FlOpenAmlOutputFile
599fba7fc7eSJung-uk Kim  *
600fba7fc7eSJung-uk Kim  * PARAMETERS:  FilenamePrefix       - The user-specified ASL source file
601fba7fc7eSJung-uk Kim  *
602fba7fc7eSJung-uk Kim  * RETURN:      Status
603fba7fc7eSJung-uk Kim  *
604fba7fc7eSJung-uk Kim  * DESCRIPTION: Create the output filename (*.AML) and open the file. The file
605fba7fc7eSJung-uk Kim  *              is created in the same directory as the parent input file.
606fba7fc7eSJung-uk Kim  *
607fba7fc7eSJung-uk Kim  ******************************************************************************/
608fba7fc7eSJung-uk Kim 
609fba7fc7eSJung-uk Kim ACPI_STATUS
610fba7fc7eSJung-uk Kim FlOpenAmlOutputFile (
611fba7fc7eSJung-uk Kim     char                    *FilenamePrefix)
612fba7fc7eSJung-uk Kim {
613fba7fc7eSJung-uk Kim     char                    *Filename;
614fba7fc7eSJung-uk Kim 
615fba7fc7eSJung-uk Kim 
616fba7fc7eSJung-uk Kim     /* Output filename usually comes from the ASL itself */
617fba7fc7eSJung-uk Kim 
618fba7fc7eSJung-uk Kim     Filename = Gbl_Files[ASL_FILE_AML_OUTPUT].Filename;
619fba7fc7eSJung-uk Kim     if (!Filename)
620fba7fc7eSJung-uk Kim     {
621fba7fc7eSJung-uk Kim         /* Create the output AML filename */
6220d84335fSJung-uk Kim         if (!Gbl_CaptureComments)
6230d84335fSJung-uk Kim         {
624fba7fc7eSJung-uk Kim             Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_AML_CODE);
6250d84335fSJung-uk Kim         }
6260d84335fSJung-uk Kim         else
6270d84335fSJung-uk Kim         {
6280d84335fSJung-uk Kim             Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_CONVERT_AML);
6290d84335fSJung-uk Kim         }
630fba7fc7eSJung-uk Kim         if (!Filename)
631fba7fc7eSJung-uk Kim         {
632fba7fc7eSJung-uk Kim             AslCommonError (ASL_ERROR, ASL_MSG_OUTPUT_FILENAME,
633fba7fc7eSJung-uk Kim                 0, 0, 0, 0, NULL, NULL);
634fba7fc7eSJung-uk Kim             return (AE_ERROR);
635fba7fc7eSJung-uk Kim         }
6361c0e1b6dSJung-uk Kim 
6371c0e1b6dSJung-uk Kim         Gbl_Files[ASL_FILE_AML_OUTPUT].Filename = Filename;
638fba7fc7eSJung-uk Kim     }
639fba7fc7eSJung-uk Kim 
640fba7fc7eSJung-uk Kim     /* Open the output AML file in binary mode */
641fba7fc7eSJung-uk Kim 
642fba7fc7eSJung-uk Kim     FlOpenFile (ASL_FILE_AML_OUTPUT, Filename, "w+b");
643fba7fc7eSJung-uk Kim     return (AE_OK);
644fba7fc7eSJung-uk Kim }
645fba7fc7eSJung-uk Kim 
646fba7fc7eSJung-uk Kim 
647fba7fc7eSJung-uk Kim /*******************************************************************************
648fba7fc7eSJung-uk Kim  *
649fba7fc7eSJung-uk Kim  * FUNCTION:    FlOpenMiscOutputFiles
650fba7fc7eSJung-uk Kim  *
651fba7fc7eSJung-uk Kim  * PARAMETERS:  FilenamePrefix       - The user-specified ASL source file
652fba7fc7eSJung-uk Kim  *
653fba7fc7eSJung-uk Kim  * RETURN:      Status
654fba7fc7eSJung-uk Kim  *
655fba7fc7eSJung-uk Kim  * DESCRIPTION: Create and open the various output files needed, depending on
656fba7fc7eSJung-uk Kim  *              the command line options
657fba7fc7eSJung-uk Kim  *
658fba7fc7eSJung-uk Kim  ******************************************************************************/
659fba7fc7eSJung-uk Kim 
660fba7fc7eSJung-uk Kim ACPI_STATUS
661fba7fc7eSJung-uk Kim FlOpenMiscOutputFiles (
662fba7fc7eSJung-uk Kim     char                    *FilenamePrefix)
663fba7fc7eSJung-uk Kim {
664fba7fc7eSJung-uk Kim     char                    *Filename;
665fba7fc7eSJung-uk Kim 
666fba7fc7eSJung-uk Kim 
667fe0f0bbbSJung-uk Kim      /* Create/Open a map file if requested */
668fe0f0bbbSJung-uk Kim 
669fe0f0bbbSJung-uk Kim     if (Gbl_MapfileFlag)
670fe0f0bbbSJung-uk Kim     {
671fe0f0bbbSJung-uk Kim         Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_MAP);
672fe0f0bbbSJung-uk Kim         if (!Filename)
673fe0f0bbbSJung-uk Kim         {
674fe0f0bbbSJung-uk Kim             AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME,
675fe0f0bbbSJung-uk Kim                 0, 0, 0, 0, NULL, NULL);
676fe0f0bbbSJung-uk Kim             return (AE_ERROR);
677fe0f0bbbSJung-uk Kim         }
678fe0f0bbbSJung-uk Kim 
679fe0f0bbbSJung-uk Kim         /* Open the hex file, text mode (closed at compiler exit) */
680fe0f0bbbSJung-uk Kim 
681fe0f0bbbSJung-uk Kim         FlOpenFile (ASL_FILE_MAP_OUTPUT, Filename, "w+t");
682fe0f0bbbSJung-uk Kim 
683fe0f0bbbSJung-uk Kim         AslCompilerSignon (ASL_FILE_MAP_OUTPUT);
684fe0f0bbbSJung-uk Kim         AslCompilerFileHeader (ASL_FILE_MAP_OUTPUT);
685fe0f0bbbSJung-uk Kim     }
686fe0f0bbbSJung-uk Kim 
6879c48c75eSJung-uk Kim     /* All done for disassembler */
6889c48c75eSJung-uk Kim 
689f8146b88SJung-uk Kim     if (Gbl_FileType == ASL_INPUT_TYPE_BINARY_ACPI_TABLE)
6909c48c75eSJung-uk Kim     {
6919c48c75eSJung-uk Kim         return (AE_OK);
6929c48c75eSJung-uk Kim     }
6939c48c75eSJung-uk Kim 
694a88e22b7SJung-uk Kim     /* Create/Open a hex output file if asked */
695a88e22b7SJung-uk Kim 
696a88e22b7SJung-uk Kim     if (Gbl_HexOutputFlag)
697a88e22b7SJung-uk Kim     {
698a88e22b7SJung-uk Kim         Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_HEX_DUMP);
699a88e22b7SJung-uk Kim         if (!Filename)
700a88e22b7SJung-uk Kim         {
701a88e22b7SJung-uk Kim             AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME,
702a88e22b7SJung-uk Kim                 0, 0, 0, 0, NULL, NULL);
703a88e22b7SJung-uk Kim             return (AE_ERROR);
704a88e22b7SJung-uk Kim         }
705a88e22b7SJung-uk Kim 
706a88e22b7SJung-uk Kim         /* Open the hex file, text mode */
707a88e22b7SJung-uk Kim 
708f38b0f21SJung-uk Kim         FlOpenFile (ASL_FILE_HEX_OUTPUT, Filename, "w+t");
709a88e22b7SJung-uk Kim 
710a88e22b7SJung-uk Kim         AslCompilerSignon (ASL_FILE_HEX_OUTPUT);
711a88e22b7SJung-uk Kim         AslCompilerFileHeader (ASL_FILE_HEX_OUTPUT);
712a88e22b7SJung-uk Kim     }
713a88e22b7SJung-uk Kim 
714a88e22b7SJung-uk Kim     /* Create/Open a debug output file if asked */
715a88e22b7SJung-uk Kim 
716a88e22b7SJung-uk Kim     if (Gbl_DebugFlag)
717a88e22b7SJung-uk Kim     {
718a88e22b7SJung-uk Kim         Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_DEBUG);
719a88e22b7SJung-uk Kim         if (!Filename)
720a88e22b7SJung-uk Kim         {
721a88e22b7SJung-uk Kim             AslCommonError (ASL_ERROR, ASL_MSG_DEBUG_FILENAME,
722a88e22b7SJung-uk Kim                 0, 0, 0, 0, NULL, NULL);
723a88e22b7SJung-uk Kim             return (AE_ERROR);
724a88e22b7SJung-uk Kim         }
725a88e22b7SJung-uk Kim 
726a88e22b7SJung-uk Kim         /* Open the debug file as STDERR, text mode */
727a88e22b7SJung-uk Kim 
728a88e22b7SJung-uk Kim         Gbl_Files[ASL_FILE_DEBUG_OUTPUT].Filename = Filename;
729a88e22b7SJung-uk Kim         Gbl_Files[ASL_FILE_DEBUG_OUTPUT].Handle =
730a88e22b7SJung-uk Kim             freopen (Filename, "w+t", stderr);
731a88e22b7SJung-uk Kim 
7324c52cad2SJung-uk Kim         if (!Gbl_Files[ASL_FILE_DEBUG_OUTPUT].Handle)
7334c52cad2SJung-uk Kim         {
7341c0e1b6dSJung-uk Kim             /*
7355ef50723SJung-uk Kim              * A problem with freopen is that on error, we no longer
7365ef50723SJung-uk Kim              * have stderr and cannot emit normal error messages.
7375ef50723SJung-uk Kim              * Emit error to stdout, close files, and exit.
7381c0e1b6dSJung-uk Kim              */
7395ef50723SJung-uk Kim             fprintf (stdout,
7405ef50723SJung-uk Kim                 "\nCould not open debug output file: %s\n\n", Filename);
7415ef50723SJung-uk Kim 
7425ef50723SJung-uk Kim             CmCleanupAndExit ();
7435ef50723SJung-uk Kim             exit (1);
7444c52cad2SJung-uk Kim         }
7454c52cad2SJung-uk Kim 
746a88e22b7SJung-uk Kim         AslCompilerSignon (ASL_FILE_DEBUG_OUTPUT);
747a88e22b7SJung-uk Kim         AslCompilerFileHeader (ASL_FILE_DEBUG_OUTPUT);
748a88e22b7SJung-uk Kim     }
749a88e22b7SJung-uk Kim 
750f8146b88SJung-uk Kim     /* Create/Open a cross-reference output file if asked */
751f8146b88SJung-uk Kim 
752f8146b88SJung-uk Kim     if (Gbl_CrossReferenceOutput)
753f8146b88SJung-uk Kim     {
754f8146b88SJung-uk Kim         Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_XREF);
755f8146b88SJung-uk Kim         if (!Filename)
756f8146b88SJung-uk Kim         {
757f8146b88SJung-uk Kim             AslCommonError (ASL_ERROR, ASL_MSG_DEBUG_FILENAME,
758f8146b88SJung-uk Kim                 0, 0, 0, 0, NULL, NULL);
759f8146b88SJung-uk Kim             return (AE_ERROR);
760f8146b88SJung-uk Kim         }
761f8146b88SJung-uk Kim 
762f8146b88SJung-uk Kim         FlOpenFile (ASL_FILE_XREF_OUTPUT, Filename, "w+t");
763f8146b88SJung-uk Kim 
764f8146b88SJung-uk Kim         AslCompilerSignon (ASL_FILE_XREF_OUTPUT);
765f8146b88SJung-uk Kim         AslCompilerFileHeader (ASL_FILE_XREF_OUTPUT);
766f8146b88SJung-uk Kim     }
767f8146b88SJung-uk Kim 
768d244b227SJung-uk Kim     /* Create/Open a listing output file if asked */
769d244b227SJung-uk Kim 
770d244b227SJung-uk Kim     if (Gbl_ListingFlag)
771d244b227SJung-uk Kim     {
772d244b227SJung-uk Kim         Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_LISTING);
773d244b227SJung-uk Kim         if (!Filename)
774d244b227SJung-uk Kim         {
775d244b227SJung-uk Kim             AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME,
776d244b227SJung-uk Kim                 0, 0, 0, 0, NULL, NULL);
777d244b227SJung-uk Kim             return (AE_ERROR);
778d244b227SJung-uk Kim         }
779d244b227SJung-uk Kim 
780d244b227SJung-uk Kim         /* Open the listing file, text mode */
781d244b227SJung-uk Kim 
782f38b0f21SJung-uk Kim         FlOpenFile (ASL_FILE_LISTING_OUTPUT, Filename, "w+t");
783d244b227SJung-uk Kim 
784d244b227SJung-uk Kim         AslCompilerSignon (ASL_FILE_LISTING_OUTPUT);
785d244b227SJung-uk Kim         AslCompilerFileHeader (ASL_FILE_LISTING_OUTPUT);
786d244b227SJung-uk Kim     }
787d244b227SJung-uk Kim 
7885ef50723SJung-uk Kim     /* Create the preprocessor output temp file if preprocessor enabled */
7894c52cad2SJung-uk Kim 
790eef1b955SJung-uk Kim     if (Gbl_PreprocessFlag)
791eef1b955SJung-uk Kim     {
7924c52cad2SJung-uk Kim         Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_PREPROCESSOR);
7934c52cad2SJung-uk Kim         if (!Filename)
7944c52cad2SJung-uk Kim         {
7954c52cad2SJung-uk Kim             AslCommonError (ASL_ERROR, ASL_MSG_PREPROCESSOR_FILENAME,
7964c52cad2SJung-uk Kim                 0, 0, 0, 0, NULL, NULL);
7974c52cad2SJung-uk Kim             return (AE_ERROR);
7984c52cad2SJung-uk Kim         }
7994c52cad2SJung-uk Kim 
800f38b0f21SJung-uk Kim         FlOpenFile (ASL_FILE_PREPROCESSOR, Filename, "w+t");
801eef1b955SJung-uk Kim     }
8024c52cad2SJung-uk Kim 
8035ef50723SJung-uk Kim     /*
8045ef50723SJung-uk Kim      * Create the "user" preprocessor output file if -li flag set.
8055ef50723SJung-uk Kim      * Note, this file contains no embedded #line directives.
8065ef50723SJung-uk Kim      */
8075ef50723SJung-uk Kim     if (Gbl_PreprocessorOutputFlag)
8085ef50723SJung-uk Kim     {
8095ef50723SJung-uk Kim         Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_PREPROC_USER);
8105ef50723SJung-uk Kim         if (!Filename)
8115ef50723SJung-uk Kim         {
8125ef50723SJung-uk Kim             AslCommonError (ASL_ERROR, ASL_MSG_PREPROCESSOR_FILENAME,
8135ef50723SJung-uk Kim                 0, 0, 0, 0, NULL, NULL);
8145ef50723SJung-uk Kim             return (AE_ERROR);
8155ef50723SJung-uk Kim         }
8165ef50723SJung-uk Kim 
8175ef50723SJung-uk Kim         FlOpenFile (ASL_FILE_PREPROCESSOR_USER, Filename, "w+t");
8185ef50723SJung-uk Kim     }
8195ef50723SJung-uk Kim 
8204c52cad2SJung-uk Kim     /* All done for data table compiler */
8214c52cad2SJung-uk Kim 
822a88e22b7SJung-uk Kim     if (Gbl_FileType == ASL_INPUT_TYPE_ASCII_DATA)
823a88e22b7SJung-uk Kim     {
824a88e22b7SJung-uk Kim         return (AE_OK);
825a88e22b7SJung-uk Kim     }
826a88e22b7SJung-uk Kim 
827fba7fc7eSJung-uk Kim     /* Create/Open a combined source output file */
828fba7fc7eSJung-uk Kim 
829fba7fc7eSJung-uk Kim     Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_SOURCE);
830fba7fc7eSJung-uk Kim     if (!Filename)
831fba7fc7eSJung-uk Kim     {
832fba7fc7eSJung-uk Kim         AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME,
833fba7fc7eSJung-uk Kim             0, 0, 0, 0, NULL, NULL);
834fba7fc7eSJung-uk Kim         return (AE_ERROR);
835fba7fc7eSJung-uk Kim     }
836fba7fc7eSJung-uk Kim 
837fba7fc7eSJung-uk Kim     /*
838fba7fc7eSJung-uk Kim      * Open the source output file, binary mode (so that LF does not get
839fba7fc7eSJung-uk Kim      * expanded to CR/LF on some systems, messing up our seek
840fba7fc7eSJung-uk Kim      * calculations.)
841fba7fc7eSJung-uk Kim      */
842fba7fc7eSJung-uk Kim     FlOpenFile (ASL_FILE_SOURCE_OUTPUT, Filename, "w+b");
843fba7fc7eSJung-uk Kim 
8444c52cad2SJung-uk Kim /*
8454c52cad2SJung-uk Kim // TBD: TEMP
8464c52cad2SJung-uk Kim //    AslCompilerin = Gbl_Files[ASL_FILE_SOURCE_OUTPUT].Handle;
8474c52cad2SJung-uk Kim */
848fba7fc7eSJung-uk Kim     /* Create/Open a assembly code source output file if asked */
849fba7fc7eSJung-uk Kim 
850fba7fc7eSJung-uk Kim     if (Gbl_AsmOutputFlag)
851fba7fc7eSJung-uk Kim     {
852fba7fc7eSJung-uk Kim         Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_ASM_SOURCE);
853fba7fc7eSJung-uk Kim         if (!Filename)
854fba7fc7eSJung-uk Kim         {
855fba7fc7eSJung-uk Kim             AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME,
856fba7fc7eSJung-uk Kim                 0, 0, 0, 0, NULL, NULL);
857fba7fc7eSJung-uk Kim             return (AE_ERROR);
858fba7fc7eSJung-uk Kim         }
859fba7fc7eSJung-uk Kim 
860fba7fc7eSJung-uk Kim         /* Open the assembly code source file, text mode */
861fba7fc7eSJung-uk Kim 
862f38b0f21SJung-uk Kim         FlOpenFile (ASL_FILE_ASM_SOURCE_OUTPUT, Filename, "w+t");
863fba7fc7eSJung-uk Kim 
864fba7fc7eSJung-uk Kim         AslCompilerSignon (ASL_FILE_ASM_SOURCE_OUTPUT);
865fba7fc7eSJung-uk Kim         AslCompilerFileHeader (ASL_FILE_ASM_SOURCE_OUTPUT);
866fba7fc7eSJung-uk Kim     }
867fba7fc7eSJung-uk Kim 
868fba7fc7eSJung-uk Kim     /* Create/Open a C code source output file if asked */
869fba7fc7eSJung-uk Kim 
870fba7fc7eSJung-uk Kim     if (Gbl_C_OutputFlag)
871fba7fc7eSJung-uk Kim     {
872fba7fc7eSJung-uk Kim         Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_C_SOURCE);
873fba7fc7eSJung-uk Kim         if (!Filename)
874fba7fc7eSJung-uk Kim         {
875fba7fc7eSJung-uk Kim             AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME,
876fba7fc7eSJung-uk Kim                 0, 0, 0, 0, NULL, NULL);
877fba7fc7eSJung-uk Kim             return (AE_ERROR);
878fba7fc7eSJung-uk Kim         }
879fba7fc7eSJung-uk Kim 
880fba7fc7eSJung-uk Kim         /* Open the C code source file, text mode */
881fba7fc7eSJung-uk Kim 
882f38b0f21SJung-uk Kim         FlOpenFile (ASL_FILE_C_SOURCE_OUTPUT, Filename, "w+t");
883fba7fc7eSJung-uk Kim 
884fba7fc7eSJung-uk Kim         FlPrintFile (ASL_FILE_C_SOURCE_OUTPUT, "/*\n");
885fba7fc7eSJung-uk Kim         AslCompilerSignon (ASL_FILE_C_SOURCE_OUTPUT);
886fba7fc7eSJung-uk Kim         AslCompilerFileHeader (ASL_FILE_C_SOURCE_OUTPUT);
887fba7fc7eSJung-uk Kim     }
888fba7fc7eSJung-uk Kim 
8899c7c683cSJung-uk Kim     /* Create/Open a C code source output file for the offset table if asked */
8909c7c683cSJung-uk Kim 
8919c7c683cSJung-uk Kim     if (Gbl_C_OffsetTableFlag)
8929c7c683cSJung-uk Kim     {
8939c7c683cSJung-uk Kim         Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_C_OFFSET);
8949c7c683cSJung-uk Kim         if (!Filename)
8959c7c683cSJung-uk Kim         {
8969c7c683cSJung-uk Kim             AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME,
8979c7c683cSJung-uk Kim                 0, 0, 0, 0, NULL, NULL);
8989c7c683cSJung-uk Kim             return (AE_ERROR);
8999c7c683cSJung-uk Kim         }
9009c7c683cSJung-uk Kim 
9019c7c683cSJung-uk Kim         /* Open the C code source file, text mode */
9029c7c683cSJung-uk Kim 
9039c7c683cSJung-uk Kim         FlOpenFile (ASL_FILE_C_OFFSET_OUTPUT, Filename, "w+t");
9049c7c683cSJung-uk Kim 
9059c7c683cSJung-uk Kim         FlPrintFile (ASL_FILE_C_OFFSET_OUTPUT, "/*\n");
9069c7c683cSJung-uk Kim         AslCompilerSignon (ASL_FILE_C_OFFSET_OUTPUT);
9079c7c683cSJung-uk Kim         AslCompilerFileHeader (ASL_FILE_C_OFFSET_OUTPUT);
9089c7c683cSJung-uk Kim     }
9099c7c683cSJung-uk Kim 
910fba7fc7eSJung-uk Kim     /* Create/Open a assembly include output file if asked */
911fba7fc7eSJung-uk Kim 
912fba7fc7eSJung-uk Kim     if (Gbl_AsmIncludeOutputFlag)
913fba7fc7eSJung-uk Kim     {
914fba7fc7eSJung-uk Kim         Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_ASM_INCLUDE);
915fba7fc7eSJung-uk Kim         if (!Filename)
916fba7fc7eSJung-uk Kim         {
917fba7fc7eSJung-uk Kim             AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME,
918fba7fc7eSJung-uk Kim                 0, 0, 0, 0, NULL, NULL);
919fba7fc7eSJung-uk Kim             return (AE_ERROR);
920fba7fc7eSJung-uk Kim         }
921fba7fc7eSJung-uk Kim 
922fba7fc7eSJung-uk Kim         /* Open the assembly include file, text mode */
923fba7fc7eSJung-uk Kim 
924f38b0f21SJung-uk Kim         FlOpenFile (ASL_FILE_ASM_INCLUDE_OUTPUT, Filename, "w+t");
925fba7fc7eSJung-uk Kim 
926fba7fc7eSJung-uk Kim         AslCompilerSignon (ASL_FILE_ASM_INCLUDE_OUTPUT);
927fba7fc7eSJung-uk Kim         AslCompilerFileHeader (ASL_FILE_ASM_INCLUDE_OUTPUT);
928fba7fc7eSJung-uk Kim     }
929fba7fc7eSJung-uk Kim 
930fba7fc7eSJung-uk Kim     /* Create/Open a C include output file if asked */
931fba7fc7eSJung-uk Kim 
932fba7fc7eSJung-uk Kim     if (Gbl_C_IncludeOutputFlag)
933fba7fc7eSJung-uk Kim     {
934fba7fc7eSJung-uk Kim         Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_C_INCLUDE);
935fba7fc7eSJung-uk Kim         if (!Filename)
936fba7fc7eSJung-uk Kim         {
937fba7fc7eSJung-uk Kim             AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME,
938fba7fc7eSJung-uk Kim                 0, 0, 0, 0, NULL, NULL);
939fba7fc7eSJung-uk Kim             return (AE_ERROR);
940fba7fc7eSJung-uk Kim         }
941fba7fc7eSJung-uk Kim 
942fba7fc7eSJung-uk Kim         /* Open the C include file, text mode */
943fba7fc7eSJung-uk Kim 
944f38b0f21SJung-uk Kim         FlOpenFile (ASL_FILE_C_INCLUDE_OUTPUT, Filename, "w+t");
945fba7fc7eSJung-uk Kim 
946fba7fc7eSJung-uk Kim         FlPrintFile (ASL_FILE_C_INCLUDE_OUTPUT, "/*\n");
947fba7fc7eSJung-uk Kim         AslCompilerSignon (ASL_FILE_C_INCLUDE_OUTPUT);
948fba7fc7eSJung-uk Kim         AslCompilerFileHeader (ASL_FILE_C_INCLUDE_OUTPUT);
949fba7fc7eSJung-uk Kim     }
950fba7fc7eSJung-uk Kim 
951fba7fc7eSJung-uk Kim     /* Create a namespace output file if asked */
952fba7fc7eSJung-uk Kim 
953fba7fc7eSJung-uk Kim     if (Gbl_NsOutputFlag)
954fba7fc7eSJung-uk Kim     {
955fba7fc7eSJung-uk Kim         Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_NAMESPACE);
956fba7fc7eSJung-uk Kim         if (!Filename)
957fba7fc7eSJung-uk Kim         {
958fba7fc7eSJung-uk Kim             AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME,
959fba7fc7eSJung-uk Kim                 0, 0, 0, 0, NULL, NULL);
960fba7fc7eSJung-uk Kim             return (AE_ERROR);
961fba7fc7eSJung-uk Kim         }
962fba7fc7eSJung-uk Kim 
963fba7fc7eSJung-uk Kim         /* Open the namespace file, text mode */
964fba7fc7eSJung-uk Kim 
965f38b0f21SJung-uk Kim         FlOpenFile (ASL_FILE_NAMESPACE_OUTPUT, Filename, "w+t");
966fba7fc7eSJung-uk Kim 
967fba7fc7eSJung-uk Kim         AslCompilerSignon (ASL_FILE_NAMESPACE_OUTPUT);
968fba7fc7eSJung-uk Kim         AslCompilerFileHeader (ASL_FILE_NAMESPACE_OUTPUT);
969fba7fc7eSJung-uk Kim     }
970fba7fc7eSJung-uk Kim 
9710d84335fSJung-uk Kim     /* Create a debug file for the converter */
9720d84335fSJung-uk Kim 
9730d84335fSJung-uk Kim     if (AcpiGbl_DebugAslConversion)
9740d84335fSJung-uk Kim     {
9750d84335fSJung-uk Kim         Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_CONVERT_DEBUG);
9760d84335fSJung-uk Kim         if (!Filename)
9770d84335fSJung-uk Kim         {
9780d84335fSJung-uk Kim             AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME,
9790d84335fSJung-uk Kim                 0, 0, 0, 0, NULL, NULL);
9800d84335fSJung-uk Kim             return (AE_ERROR);
9810d84335fSJung-uk Kim         }
9820d84335fSJung-uk Kim 
9830d84335fSJung-uk Kim         /* Open the converter debug file, text mode */
9840d84335fSJung-uk Kim 
9850d84335fSJung-uk Kim         FlOpenFile (ASL_FILE_CONV_DEBUG_OUTPUT, Filename, "w+t");
9860d84335fSJung-uk Kim 
9870d84335fSJung-uk Kim         AslCompilerSignon (ASL_FILE_CONV_DEBUG_OUTPUT);
9880d84335fSJung-uk Kim         AslCompilerFileHeader (ASL_FILE_CONV_DEBUG_OUTPUT);
9890d84335fSJung-uk Kim 
9900d84335fSJung-uk Kim         AcpiGbl_ConvDebugFile = Gbl_Files[ASL_FILE_CONV_DEBUG_OUTPUT].Handle;
9910d84335fSJung-uk Kim     }
9920d84335fSJung-uk Kim 
993fba7fc7eSJung-uk Kim     return (AE_OK);
994fba7fc7eSJung-uk Kim }
995fba7fc7eSJung-uk Kim 
996fba7fc7eSJung-uk Kim 
997fba7fc7eSJung-uk Kim #ifdef ACPI_OBSOLETE_FUNCTIONS
998fba7fc7eSJung-uk Kim /*******************************************************************************
999fba7fc7eSJung-uk Kim  *
100053289f6aSNate Lawson  * FUNCTION:    FlParseInputPathname
100153289f6aSNate Lawson  *
100253289f6aSNate Lawson  * PARAMETERS:  InputFilename       - The user-specified ASL source file to be
100353289f6aSNate Lawson  *                                    compiled
100453289f6aSNate Lawson  *
100553289f6aSNate Lawson  * RETURN:      Status
100653289f6aSNate Lawson  *
100753289f6aSNate Lawson  * DESCRIPTION: Split the input path into a directory and filename part
100853289f6aSNate Lawson  *              1) Directory part used to open include files
100953289f6aSNate Lawson  *              2) Filename part used to generate output filenames
101053289f6aSNate Lawson  *
101153289f6aSNate Lawson  ******************************************************************************/
101253289f6aSNate Lawson 
101353289f6aSNate Lawson ACPI_STATUS
101453289f6aSNate Lawson FlParseInputPathname (
101553289f6aSNate Lawson     char                    *InputFilename)
101653289f6aSNate Lawson {
101753289f6aSNate Lawson     char                    *Substring;
101853289f6aSNate Lawson 
101953289f6aSNate Lawson 
102053289f6aSNate Lawson     if (!InputFilename)
102153289f6aSNate Lawson     {
102253289f6aSNate Lawson         return (AE_OK);
102353289f6aSNate Lawson     }
102453289f6aSNate Lawson 
102553289f6aSNate Lawson     /* Get the path to the input filename's directory */
102653289f6aSNate Lawson 
102753289f6aSNate Lawson     Gbl_DirectoryPath = strdup (InputFilename);
102853289f6aSNate Lawson     if (!Gbl_DirectoryPath)
102953289f6aSNate Lawson     {
103053289f6aSNate Lawson         return (AE_NO_MEMORY);
103153289f6aSNate Lawson     }
103253289f6aSNate Lawson 
103353289f6aSNate Lawson     Substring = strrchr (Gbl_DirectoryPath, '\\');
103453289f6aSNate Lawson     if (!Substring)
103553289f6aSNate Lawson     {
103653289f6aSNate Lawson         Substring = strrchr (Gbl_DirectoryPath, '/');
103753289f6aSNate Lawson         if (!Substring)
103853289f6aSNate Lawson         {
103953289f6aSNate Lawson             Substring = strrchr (Gbl_DirectoryPath, ':');
104053289f6aSNate Lawson         }
104153289f6aSNate Lawson     }
104253289f6aSNate Lawson 
104353289f6aSNate Lawson     if (!Substring)
104453289f6aSNate Lawson     {
104553289f6aSNate Lawson         Gbl_DirectoryPath[0] = 0;
104653289f6aSNate Lawson         if (Gbl_UseDefaultAmlFilename)
104753289f6aSNate Lawson         {
104853289f6aSNate Lawson             Gbl_OutputFilenamePrefix = strdup (InputFilename);
104953289f6aSNate Lawson         }
105053289f6aSNate Lawson     }
105153289f6aSNate Lawson     else
105253289f6aSNate Lawson     {
105353289f6aSNate Lawson         if (Gbl_UseDefaultAmlFilename)
105453289f6aSNate Lawson         {
105553289f6aSNate Lawson             Gbl_OutputFilenamePrefix = strdup (Substring + 1);
105653289f6aSNate Lawson         }
105753289f6aSNate Lawson         *(Substring+1) = 0;
105853289f6aSNate Lawson     }
105953289f6aSNate Lawson 
1060313a0c13SJung-uk Kim     UtConvertBackslashes (Gbl_OutputFilenamePrefix);
106153289f6aSNate Lawson     return (AE_OK);
106253289f6aSNate Lawson }
1063fba7fc7eSJung-uk Kim #endif
1064