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>
15453289f6aSNate Lawson 
15553289f6aSNate Lawson #define _COMPONENT          ACPI_COMPILER
15653289f6aSNate Lawson         ACPI_MODULE_NAME    ("aslfiles")
15753289f6aSNate Lawson 
158fba7fc7eSJung-uk Kim /* Local prototypes */
159fba7fc7eSJung-uk Kim 
160a371a5fdSJung-uk Kim static FILE *
161d6dd1baeSJung-uk Kim FlOpenIncludeWithPrefix (
162d6dd1baeSJung-uk Kim     char                    *PrefixDir,
163a371a5fdSJung-uk Kim     ACPI_PARSE_OBJECT       *Op,
164d6dd1baeSJung-uk Kim     char                    *Filename);
165d6dd1baeSJung-uk Kim 
166fba7fc7eSJung-uk Kim #ifdef ACPI_OBSOLETE_FUNCTIONS
167fba7fc7eSJung-uk Kim ACPI_STATUS
168fba7fc7eSJung-uk Kim FlParseInputPathname (
169fba7fc7eSJung-uk Kim     char                    *InputFilename);
170fba7fc7eSJung-uk Kim #endif
171fba7fc7eSJung-uk Kim 
17253289f6aSNate Lawson 
17353289f6aSNate Lawson /*******************************************************************************
17453289f6aSNate Lawson  *
17553289f6aSNate Lawson  * FUNCTION:    FlSetLineNumber
17653289f6aSNate Lawson  *
17753289f6aSNate Lawson  * PARAMETERS:  Op        - Parse node for the LINE asl statement
17853289f6aSNate Lawson  *
17953289f6aSNate Lawson  * RETURN:      None.
18053289f6aSNate Lawson  *
18153289f6aSNate Lawson  * DESCRIPTION: Set the current line number
18253289f6aSNate Lawson  *
18353289f6aSNate Lawson  ******************************************************************************/
18453289f6aSNate Lawson 
18553289f6aSNate Lawson void
18653289f6aSNate Lawson FlSetLineNumber (
187eef1b955SJung-uk Kim     UINT32                  LineNumber)
18853289f6aSNate Lawson {
18953289f6aSNate Lawson 
190eef1b955SJung-uk Kim     DbgPrint (ASL_PARSE_OUTPUT, "\n#line: New line number %u (old %u)\n",
191eef1b955SJung-uk Kim          LineNumber, Gbl_LogicalLineNumber);
192eef1b955SJung-uk Kim 
193eef1b955SJung-uk Kim     Gbl_CurrentLineNumber = LineNumber;
194eef1b955SJung-uk Kim }
195eef1b955SJung-uk Kim 
196eef1b955SJung-uk Kim 
197eef1b955SJung-uk Kim /*******************************************************************************
198eef1b955SJung-uk Kim  *
199eef1b955SJung-uk Kim  * FUNCTION:    FlSetFilename
200eef1b955SJung-uk Kim  *
201eef1b955SJung-uk Kim  * PARAMETERS:  Op        - Parse node for the LINE asl statement
202eef1b955SJung-uk Kim  *
203eef1b955SJung-uk Kim  * RETURN:      None.
204eef1b955SJung-uk Kim  *
205eef1b955SJung-uk Kim  * DESCRIPTION: Set the current filename
206eef1b955SJung-uk Kim  *
207eef1b955SJung-uk Kim  ******************************************************************************/
208eef1b955SJung-uk Kim 
209eef1b955SJung-uk Kim void
210eef1b955SJung-uk Kim FlSetFilename (
211eef1b955SJung-uk Kim     char                    *Filename)
212eef1b955SJung-uk Kim {
213eef1b955SJung-uk Kim 
214eef1b955SJung-uk Kim     DbgPrint (ASL_PARSE_OUTPUT, "\n#line: New filename %s (old %s)\n",
215eef1b955SJung-uk Kim          Filename, Gbl_Files[ASL_FILE_INPUT].Filename);
216eef1b955SJung-uk Kim 
217313a0c13SJung-uk Kim     /* No need to free any existing filename */
218313a0c13SJung-uk Kim 
219eef1b955SJung-uk Kim     Gbl_Files[ASL_FILE_INPUT].Filename = Filename;
22053289f6aSNate Lawson }
22153289f6aSNate Lawson 
22253289f6aSNate Lawson 
22353289f6aSNate Lawson /*******************************************************************************
22453289f6aSNate Lawson  *
225d6dd1baeSJung-uk Kim  * FUNCTION:    FlAddIncludeDirectory
226d6dd1baeSJung-uk Kim  *
227d6dd1baeSJung-uk Kim  * PARAMETERS:  Dir             - Directory pathname string
228d6dd1baeSJung-uk Kim  *
229d6dd1baeSJung-uk Kim  * RETURN:      None
230d6dd1baeSJung-uk Kim  *
231d6dd1baeSJung-uk Kim  * DESCRIPTION: Add a directory the list of include prefix directories.
232d6dd1baeSJung-uk Kim  *
233d6dd1baeSJung-uk Kim  ******************************************************************************/
234d6dd1baeSJung-uk Kim 
235d6dd1baeSJung-uk Kim void
236d6dd1baeSJung-uk Kim FlAddIncludeDirectory (
237d6dd1baeSJung-uk Kim     char                    *Dir)
238d6dd1baeSJung-uk Kim {
239d6dd1baeSJung-uk Kim     ASL_INCLUDE_DIR         *NewDir;
240d6dd1baeSJung-uk Kim     ASL_INCLUDE_DIR         *NextDir;
241d6dd1baeSJung-uk Kim     ASL_INCLUDE_DIR         *PrevDir = NULL;
242d6dd1baeSJung-uk Kim     UINT32                  NeedsSeparator = 0;
243d6dd1baeSJung-uk Kim     size_t                  DirLength;
244d6dd1baeSJung-uk Kim 
245d6dd1baeSJung-uk Kim 
246d6dd1baeSJung-uk Kim     DirLength = strlen (Dir);
247d6dd1baeSJung-uk Kim     if (!DirLength)
248d6dd1baeSJung-uk Kim     {
249d6dd1baeSJung-uk Kim         return;
250d6dd1baeSJung-uk Kim     }
251d6dd1baeSJung-uk Kim 
252d6dd1baeSJung-uk Kim     /* Make sure that the pathname ends with a path separator */
253d6dd1baeSJung-uk Kim 
254d6dd1baeSJung-uk Kim     if ((Dir[DirLength-1] != '/') &&
255d6dd1baeSJung-uk Kim         (Dir[DirLength-1] != '\\'))
256d6dd1baeSJung-uk Kim     {
257d6dd1baeSJung-uk Kim         NeedsSeparator = 1;
258d6dd1baeSJung-uk Kim     }
259d6dd1baeSJung-uk Kim 
260d6dd1baeSJung-uk Kim     NewDir = ACPI_ALLOCATE_ZEROED (sizeof (ASL_INCLUDE_DIR));
261d6dd1baeSJung-uk Kim     NewDir->Dir = ACPI_ALLOCATE (DirLength + 1 + NeedsSeparator);
262d6dd1baeSJung-uk Kim     strcpy (NewDir->Dir, Dir);
263d6dd1baeSJung-uk Kim     if (NeedsSeparator)
264d6dd1baeSJung-uk Kim     {
265d6dd1baeSJung-uk Kim         strcat (NewDir->Dir, "/");
266d6dd1baeSJung-uk Kim     }
267d6dd1baeSJung-uk Kim 
268d6dd1baeSJung-uk Kim     /*
269d6dd1baeSJung-uk Kim      * Preserve command line ordering of -I options by adding new elements
270d6dd1baeSJung-uk Kim      * at the end of the list
271d6dd1baeSJung-uk Kim      */
272d6dd1baeSJung-uk Kim     NextDir = Gbl_IncludeDirList;
273d6dd1baeSJung-uk Kim     while (NextDir)
274d6dd1baeSJung-uk Kim     {
275d6dd1baeSJung-uk Kim         PrevDir = NextDir;
276d6dd1baeSJung-uk Kim         NextDir = NextDir->Next;
277d6dd1baeSJung-uk Kim     }
278d6dd1baeSJung-uk Kim 
279d6dd1baeSJung-uk Kim     if (PrevDir)
280d6dd1baeSJung-uk Kim     {
281d6dd1baeSJung-uk Kim         PrevDir->Next = NewDir;
282d6dd1baeSJung-uk Kim     }
283d6dd1baeSJung-uk Kim     else
284d6dd1baeSJung-uk Kim     {
285d6dd1baeSJung-uk Kim         Gbl_IncludeDirList = NewDir;
286d6dd1baeSJung-uk Kim     }
287d6dd1baeSJung-uk Kim }
288d6dd1baeSJung-uk Kim 
289d6dd1baeSJung-uk Kim 
290d6dd1baeSJung-uk Kim /*******************************************************************************
291d6dd1baeSJung-uk Kim  *
292a7a3b383SJung-uk Kim  * FUNCTION:    FlMergePathnames
293a7a3b383SJung-uk Kim  *
294a7a3b383SJung-uk Kim  * PARAMETERS:  PrefixDir       - Prefix directory pathname. Can be NULL or
295a7a3b383SJung-uk Kim  *                                a zero length string.
296a7a3b383SJung-uk Kim  *              FilePathname    - The include filename from the source ASL.
297a7a3b383SJung-uk Kim  *
298a7a3b383SJung-uk Kim  * RETURN:      Merged pathname string
299a7a3b383SJung-uk Kim  *
300a7a3b383SJung-uk Kim  * DESCRIPTION: Merge two pathnames that (probably) have common elements, to
301a7a3b383SJung-uk Kim  *              arrive at a minimal length string. Merge can occur if the
302a7a3b383SJung-uk Kim  *              FilePathname is relative to the PrefixDir.
303a7a3b383SJung-uk Kim  *
304a7a3b383SJung-uk Kim  ******************************************************************************/
305a7a3b383SJung-uk Kim 
306a7a3b383SJung-uk Kim char *
307a7a3b383SJung-uk Kim FlMergePathnames (
308a7a3b383SJung-uk Kim     char                    *PrefixDir,
309a7a3b383SJung-uk Kim     char                    *FilePathname)
310a7a3b383SJung-uk Kim {
311a7a3b383SJung-uk Kim     char                    *CommonPath;
312a7a3b383SJung-uk Kim     char                    *Pathname;
313a7a3b383SJung-uk Kim     char                    *LastElement;
314a7a3b383SJung-uk Kim 
315a7a3b383SJung-uk Kim 
316a7a3b383SJung-uk Kim     DbgPrint (ASL_PARSE_OUTPUT, "Include: Prefix path - \"%s\"\n"
317a7a3b383SJung-uk Kim         "Include: FilePathname - \"%s\"\n",
318a7a3b383SJung-uk Kim          PrefixDir, FilePathname);
319a7a3b383SJung-uk Kim 
320a7a3b383SJung-uk Kim     /*
321a7a3b383SJung-uk Kim      * If there is no prefix directory or if the file pathname is absolute,
322a7a3b383SJung-uk Kim      * just return the original file pathname
323a7a3b383SJung-uk Kim      */
324a7a3b383SJung-uk Kim     if (!PrefixDir || (!*PrefixDir) ||
325a7a3b383SJung-uk Kim         (*FilePathname == '/') ||
326a7a3b383SJung-uk Kim          (FilePathname[1] == ':'))
327a7a3b383SJung-uk Kim     {
32867d9aa44SJung-uk Kim         Pathname = UtLocalCacheCalloc (strlen (FilePathname) + 1);
329a7a3b383SJung-uk Kim         strcpy (Pathname, FilePathname);
330a7a3b383SJung-uk Kim         goto ConvertBackslashes;
331a7a3b383SJung-uk Kim     }
332a7a3b383SJung-uk Kim 
333a7a3b383SJung-uk Kim     /* Need a local copy of the prefix directory path */
334a7a3b383SJung-uk Kim 
33567d9aa44SJung-uk Kim     CommonPath = UtLocalCacheCalloc (strlen (PrefixDir) + 1);
336a7a3b383SJung-uk Kim     strcpy (CommonPath, PrefixDir);
337a7a3b383SJung-uk Kim 
338a7a3b383SJung-uk Kim     /*
339a7a3b383SJung-uk Kim      * Walk forward through the file path, and simultaneously backward
340a7a3b383SJung-uk Kim      * through the prefix directory path until there are no more
341a7a3b383SJung-uk Kim      * relative references at the start of the file path.
342a7a3b383SJung-uk Kim      */
343a7a3b383SJung-uk Kim     while (*FilePathname && (!strncmp (FilePathname, "../", 3)))
344a7a3b383SJung-uk Kim     {
345a7a3b383SJung-uk Kim         /* Remove last element of the prefix directory path */
346a7a3b383SJung-uk Kim 
347a7a3b383SJung-uk Kim         LastElement = strrchr (CommonPath, '/');
348a7a3b383SJung-uk Kim         if (!LastElement)
349a7a3b383SJung-uk Kim         {
350a7a3b383SJung-uk Kim             goto ConcatenatePaths;
351a7a3b383SJung-uk Kim         }
352a7a3b383SJung-uk Kim 
353a7a3b383SJung-uk Kim         *LastElement = 0;   /* Terminate CommonPath string */
354a7a3b383SJung-uk Kim         FilePathname += 3;  /* Point to next path element */
355a7a3b383SJung-uk Kim     }
356a7a3b383SJung-uk Kim 
357a7a3b383SJung-uk Kim     /*
358a7a3b383SJung-uk Kim      * Remove the last element of the prefix directory path (it is the same as
359a7a3b383SJung-uk Kim      * the first element of the file pathname), and build the final merged
360a7a3b383SJung-uk Kim      * pathname.
361a7a3b383SJung-uk Kim      */
362a7a3b383SJung-uk Kim     LastElement = strrchr (CommonPath, '/');
363a7a3b383SJung-uk Kim     if (LastElement)
364a7a3b383SJung-uk Kim     {
365a7a3b383SJung-uk Kim         *LastElement = 0;
366a7a3b383SJung-uk Kim     }
367a7a3b383SJung-uk Kim 
368a7a3b383SJung-uk Kim     /* Build the final merged pathname */
369a7a3b383SJung-uk Kim 
370a7a3b383SJung-uk Kim ConcatenatePaths:
37167d9aa44SJung-uk Kim     Pathname = UtLocalCacheCalloc (
372f8146b88SJung-uk Kim         strlen (CommonPath) + strlen (FilePathname) + 2);
373a7a3b383SJung-uk Kim     if (LastElement && *CommonPath)
374a7a3b383SJung-uk Kim     {
375a7a3b383SJung-uk Kim         strcpy (Pathname, CommonPath);
376a7a3b383SJung-uk Kim         strcat (Pathname, "/");
377a7a3b383SJung-uk Kim     }
378a7a3b383SJung-uk Kim     strcat (Pathname, FilePathname);
379a7a3b383SJung-uk Kim 
380a7a3b383SJung-uk Kim     /* Convert all backslashes to normal slashes */
381a7a3b383SJung-uk Kim 
382a7a3b383SJung-uk Kim ConvertBackslashes:
383a7a3b383SJung-uk Kim     UtConvertBackslashes (Pathname);
384a7a3b383SJung-uk Kim 
385a7a3b383SJung-uk Kim     DbgPrint (ASL_PARSE_OUTPUT, "Include: Merged Pathname - \"%s\"\n",
386a7a3b383SJung-uk Kim          Pathname);
387a7a3b383SJung-uk Kim     return (Pathname);
388a7a3b383SJung-uk Kim }
389a7a3b383SJung-uk Kim 
390a7a3b383SJung-uk Kim 
391a7a3b383SJung-uk Kim /*******************************************************************************
392a7a3b383SJung-uk Kim  *
393d6dd1baeSJung-uk Kim  * FUNCTION:    FlOpenIncludeWithPrefix
394d6dd1baeSJung-uk Kim  *
395d6dd1baeSJung-uk Kim  * PARAMETERS:  PrefixDir       - Prefix directory pathname. Can be a zero
396d6dd1baeSJung-uk Kim  *                                length string.
397d6dd1baeSJung-uk Kim  *              Filename        - The include filename from the source ASL.
398d6dd1baeSJung-uk Kim  *
399d6dd1baeSJung-uk Kim  * RETURN:      Valid file descriptor if successful. Null otherwise.
400d6dd1baeSJung-uk Kim  *
401d6dd1baeSJung-uk Kim  * DESCRIPTION: Open an include file and push it on the input file stack.
402d6dd1baeSJung-uk Kim  *
403d6dd1baeSJung-uk Kim  ******************************************************************************/
404d6dd1baeSJung-uk Kim 
405a371a5fdSJung-uk Kim static FILE *
406d6dd1baeSJung-uk Kim FlOpenIncludeWithPrefix (
407d6dd1baeSJung-uk Kim     char                    *PrefixDir,
408a371a5fdSJung-uk Kim     ACPI_PARSE_OBJECT       *Op,
409d6dd1baeSJung-uk Kim     char                    *Filename)
410d6dd1baeSJung-uk Kim {
411d6dd1baeSJung-uk Kim     FILE                    *IncludeFile;
412d6dd1baeSJung-uk Kim     char                    *Pathname;
4135ef50723SJung-uk Kim     UINT32                  OriginalLineNumber;
414d6dd1baeSJung-uk Kim 
415d6dd1baeSJung-uk Kim 
416d6dd1baeSJung-uk Kim     /* Build the full pathname to the file */
417d6dd1baeSJung-uk Kim 
418a7a3b383SJung-uk Kim     Pathname = FlMergePathnames (PrefixDir, Filename);
419d6dd1baeSJung-uk Kim 
420a7a3b383SJung-uk Kim     DbgPrint (ASL_PARSE_OUTPUT, "Include: Opening file - \"%s\"\n\n",
421d6dd1baeSJung-uk Kim         Pathname);
422d6dd1baeSJung-uk Kim 
423d6dd1baeSJung-uk Kim     /* Attempt to open the file, push if successful */
424d6dd1baeSJung-uk Kim 
425d6dd1baeSJung-uk Kim     IncludeFile = fopen (Pathname, "r");
426ed17e06eSJung-uk Kim     if (!IncludeFile)
427d6dd1baeSJung-uk Kim     {
428ed17e06eSJung-uk Kim         fprintf (stderr, "Could not open include file %s\n", Pathname);
429ed17e06eSJung-uk Kim         ACPI_FREE (Pathname);
430ed17e06eSJung-uk Kim         return (NULL);
431ed17e06eSJung-uk Kim     }
432ed17e06eSJung-uk Kim 
433a371a5fdSJung-uk Kim     /*
4345ef50723SJung-uk Kim      * Check the entire include file for any # preprocessor directives.
435a371a5fdSJung-uk Kim      * This is because there may be some confusion between the #include
4365ef50723SJung-uk Kim      * preprocessor directive and the ASL Include statement. A file included
4375ef50723SJung-uk Kim      * by the ASL include cannot contain preprocessor directives because
4385ef50723SJung-uk Kim      * the preprocessor has already run by the time the ASL include is
4395ef50723SJung-uk Kim      * recognized (by the compiler, not the preprocessor.)
4405ef50723SJung-uk Kim      *
4415ef50723SJung-uk Kim      * Note: DtGetNextLine strips/ignores comments.
4425ef50723SJung-uk Kim      * Save current line number since DtGetNextLine modifies it.
443a371a5fdSJung-uk Kim      */
4445ef50723SJung-uk Kim     Gbl_CurrentLineNumber--;
4455ef50723SJung-uk Kim     OriginalLineNumber = Gbl_CurrentLineNumber;
446f8146b88SJung-uk Kim 
4475ef50723SJung-uk Kim     while (DtGetNextLine (IncludeFile, DT_ALLOW_MULTILINE_QUOTES) != ASL_EOF)
448a371a5fdSJung-uk Kim     {
449a371a5fdSJung-uk Kim         if (Gbl_CurrentLineBuffer[0] == '#')
450a371a5fdSJung-uk Kim         {
451a371a5fdSJung-uk Kim             AslError (ASL_ERROR, ASL_MSG_INCLUDE_FILE,
452a371a5fdSJung-uk Kim                 Op, "use #include instead");
453a371a5fdSJung-uk Kim         }
454a371a5fdSJung-uk Kim     }
455f8146b88SJung-uk Kim 
4565ef50723SJung-uk Kim     Gbl_CurrentLineNumber = OriginalLineNumber;
457a371a5fdSJung-uk Kim 
458a371a5fdSJung-uk Kim     /* Must seek back to the start of the file */
459a371a5fdSJung-uk Kim 
460a371a5fdSJung-uk Kim     fseek (IncludeFile, 0, SEEK_SET);
461a371a5fdSJung-uk Kim 
462d6dd1baeSJung-uk Kim     /* Push the include file on the open input file stack */
463d6dd1baeSJung-uk Kim 
464d6dd1baeSJung-uk Kim     AslPushInputFileStack (IncludeFile, Pathname);
465d6dd1baeSJung-uk Kim     return (IncludeFile);
466d6dd1baeSJung-uk Kim }
467d6dd1baeSJung-uk Kim 
468d6dd1baeSJung-uk Kim 
469d6dd1baeSJung-uk Kim /*******************************************************************************
470d6dd1baeSJung-uk Kim  *
47153289f6aSNate Lawson  * FUNCTION:    FlOpenIncludeFile
47253289f6aSNate Lawson  *
47353289f6aSNate Lawson  * PARAMETERS:  Op        - Parse node for the INCLUDE ASL statement
47453289f6aSNate Lawson  *
47553289f6aSNate Lawson  * RETURN:      None.
47653289f6aSNate Lawson  *
47753289f6aSNate Lawson  * DESCRIPTION: Open an include file and push it on the input file stack.
47853289f6aSNate Lawson  *
47953289f6aSNate Lawson  ******************************************************************************/
48053289f6aSNate Lawson 
48153289f6aSNate Lawson void
48253289f6aSNate Lawson FlOpenIncludeFile (
48353289f6aSNate Lawson     ACPI_PARSE_OBJECT       *Op)
48453289f6aSNate Lawson {
485d6dd1baeSJung-uk Kim     FILE                    *IncludeFile;
486d6dd1baeSJung-uk Kim     ASL_INCLUDE_DIR         *NextDir;
48753289f6aSNate Lawson 
48853289f6aSNate Lawson 
48953289f6aSNate Lawson     /* Op must be valid */
49053289f6aSNate Lawson 
49153289f6aSNate Lawson     if (!Op)
49253289f6aSNate Lawson     {
49353289f6aSNate Lawson         AslCommonError (ASL_ERROR, ASL_MSG_INCLUDE_FILE_OPEN,
49453289f6aSNate Lawson             Gbl_CurrentLineNumber, Gbl_LogicalLineNumber,
49553289f6aSNate Lawson             Gbl_InputByteCount, Gbl_CurrentColumn,
49653289f6aSNate Lawson             Gbl_Files[ASL_FILE_INPUT].Filename, " - Null parse node");
49753289f6aSNate Lawson 
49853289f6aSNate Lawson         return;
49953289f6aSNate Lawson     }
50053289f6aSNate Lawson 
50153289f6aSNate Lawson     /*
50253289f6aSNate Lawson      * Flush out the "include ()" statement on this line, start
50353289f6aSNate Lawson      * the actual include file on the next line
50453289f6aSNate Lawson      */
505eef1b955SJung-uk Kim     AslResetCurrentLineBuffer ();
50653289f6aSNate Lawson     FlPrintFile (ASL_FILE_SOURCE_OUTPUT, "\n");
50753289f6aSNate Lawson     Gbl_CurrentLineOffset++;
50853289f6aSNate Lawson 
50953289f6aSNate Lawson 
510d6dd1baeSJung-uk Kim     /* Attempt to open the include file */
511d6dd1baeSJung-uk Kim 
512d6dd1baeSJung-uk Kim     /* If the file specifies an absolute path, just open it */
513d6dd1baeSJung-uk Kim 
514d6dd1baeSJung-uk Kim     if ((Op->Asl.Value.String[0] == '/')  ||
515d6dd1baeSJung-uk Kim         (Op->Asl.Value.String[0] == '\\') ||
516d6dd1baeSJung-uk Kim         (Op->Asl.Value.String[1] == ':'))
51753289f6aSNate Lawson     {
518a371a5fdSJung-uk Kim         IncludeFile = FlOpenIncludeWithPrefix ("", Op, Op->Asl.Value.String);
519d6dd1baeSJung-uk Kim         if (!IncludeFile)
520d6dd1baeSJung-uk Kim         {
521d6dd1baeSJung-uk Kim             goto ErrorExit;
522d6dd1baeSJung-uk Kim         }
52353289f6aSNate Lawson         return;
52453289f6aSNate Lawson     }
52553289f6aSNate Lawson 
526d6dd1baeSJung-uk Kim     /*
527d6dd1baeSJung-uk Kim      * The include filename is not an absolute path.
528d6dd1baeSJung-uk Kim      *
529d6dd1baeSJung-uk Kim      * First, search for the file within the "local" directory -- meaning
530d6dd1baeSJung-uk Kim      * the same directory that contains the source file.
531d6dd1baeSJung-uk Kim      *
532d6dd1baeSJung-uk Kim      * Construct the file pathname from the global directory name.
533d6dd1baeSJung-uk Kim      */
534f8146b88SJung-uk Kim     IncludeFile = FlOpenIncludeWithPrefix (
535f8146b88SJung-uk Kim         Gbl_DirectoryPath, Op, Op->Asl.Value.String);
536d6dd1baeSJung-uk Kim     if (IncludeFile)
537d6dd1baeSJung-uk Kim     {
538d6dd1baeSJung-uk Kim         return;
539d6dd1baeSJung-uk Kim     }
54053289f6aSNate Lawson 
541d6dd1baeSJung-uk Kim     /*
542d6dd1baeSJung-uk Kim      * Second, search for the file within the (possibly multiple) directories
543d6dd1baeSJung-uk Kim      * specified by the -I option on the command line.
544d6dd1baeSJung-uk Kim      */
545d6dd1baeSJung-uk Kim     NextDir = Gbl_IncludeDirList;
546d6dd1baeSJung-uk Kim     while (NextDir)
547d6dd1baeSJung-uk Kim     {
548f8146b88SJung-uk Kim         IncludeFile = FlOpenIncludeWithPrefix (
549f8146b88SJung-uk Kim             NextDir->Dir, Op, Op->Asl.Value.String);
550d6dd1baeSJung-uk Kim         if (IncludeFile)
551d6dd1baeSJung-uk Kim         {
552d6dd1baeSJung-uk Kim             return;
553d6dd1baeSJung-uk Kim         }
554d6dd1baeSJung-uk Kim 
555d6dd1baeSJung-uk Kim         NextDir = NextDir->Next;
556d6dd1baeSJung-uk Kim     }
557d6dd1baeSJung-uk Kim 
558d6dd1baeSJung-uk Kim     /* We could not open the include file after trying very hard */
559d6dd1baeSJung-uk Kim 
560d6dd1baeSJung-uk Kim ErrorExit:
561d6dd1baeSJung-uk Kim     sprintf (MsgBuffer, "%s, %s", Op->Asl.Value.String, strerror (errno));
562d6dd1baeSJung-uk Kim     AslError (ASL_ERROR, ASL_MSG_INCLUDE_FILE_OPEN, Op, MsgBuffer);
56353289f6aSNate Lawson }
56453289f6aSNate Lawson 
56553289f6aSNate Lawson 
56653289f6aSNate Lawson /*******************************************************************************
56753289f6aSNate Lawson  *
568fba7fc7eSJung-uk Kim  * FUNCTION:    FlOpenInputFile
569fba7fc7eSJung-uk Kim  *
570fba7fc7eSJung-uk Kim  * PARAMETERS:  InputFilename       - The user-specified ASL source file to be
571fba7fc7eSJung-uk Kim  *                                    compiled
572fba7fc7eSJung-uk Kim  *
573fba7fc7eSJung-uk Kim  * RETURN:      Status
574fba7fc7eSJung-uk Kim  *
575fba7fc7eSJung-uk Kim  * DESCRIPTION: Open the specified input file, and save the directory path to
576fba7fc7eSJung-uk Kim  *              the file so that include files can be opened in
577fba7fc7eSJung-uk Kim  *              the same directory.
578fba7fc7eSJung-uk Kim  *
579fba7fc7eSJung-uk Kim  ******************************************************************************/
580fba7fc7eSJung-uk Kim 
581fba7fc7eSJung-uk Kim ACPI_STATUS
582fba7fc7eSJung-uk Kim FlOpenInputFile (
583fba7fc7eSJung-uk Kim     char                    *InputFilename)
584fba7fc7eSJung-uk Kim {
585fba7fc7eSJung-uk Kim 
586fba7fc7eSJung-uk Kim     /* Open the input ASL file, text mode */
587fba7fc7eSJung-uk Kim 
588f38b0f21SJung-uk Kim     FlOpenFile (ASL_FILE_INPUT, InputFilename, "rt");
589fba7fc7eSJung-uk Kim     AslCompilerin = Gbl_Files[ASL_FILE_INPUT].Handle;
590fba7fc7eSJung-uk Kim 
591fba7fc7eSJung-uk Kim     return (AE_OK);
592fba7fc7eSJung-uk Kim }
593fba7fc7eSJung-uk Kim 
594fba7fc7eSJung-uk Kim 
595fba7fc7eSJung-uk Kim /*******************************************************************************
596fba7fc7eSJung-uk Kim  *
597fba7fc7eSJung-uk Kim  * FUNCTION:    FlOpenAmlOutputFile
598fba7fc7eSJung-uk Kim  *
599fba7fc7eSJung-uk Kim  * PARAMETERS:  FilenamePrefix       - The user-specified ASL source file
600fba7fc7eSJung-uk Kim  *
601fba7fc7eSJung-uk Kim  * RETURN:      Status
602fba7fc7eSJung-uk Kim  *
603fba7fc7eSJung-uk Kim  * DESCRIPTION: Create the output filename (*.AML) and open the file. The file
604fba7fc7eSJung-uk Kim  *              is created in the same directory as the parent input file.
605fba7fc7eSJung-uk Kim  *
606fba7fc7eSJung-uk Kim  ******************************************************************************/
607fba7fc7eSJung-uk Kim 
608fba7fc7eSJung-uk Kim ACPI_STATUS
609fba7fc7eSJung-uk Kim FlOpenAmlOutputFile (
610fba7fc7eSJung-uk Kim     char                    *FilenamePrefix)
611fba7fc7eSJung-uk Kim {
612fba7fc7eSJung-uk Kim     char                    *Filename;
613fba7fc7eSJung-uk Kim 
614fba7fc7eSJung-uk Kim 
615fba7fc7eSJung-uk Kim     /* Output filename usually comes from the ASL itself */
616fba7fc7eSJung-uk Kim 
617fba7fc7eSJung-uk Kim     Filename = Gbl_Files[ASL_FILE_AML_OUTPUT].Filename;
618fba7fc7eSJung-uk Kim     if (!Filename)
619fba7fc7eSJung-uk Kim     {
620fba7fc7eSJung-uk Kim         /* Create the output AML filename */
621f1db5ef7SJung-uk Kim         if (!AcpiGbl_CaptureComments)
6220d84335fSJung-uk Kim         {
623fba7fc7eSJung-uk Kim             Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_AML_CODE);
6240d84335fSJung-uk Kim         }
6250d84335fSJung-uk Kim         else
6260d84335fSJung-uk Kim         {
6270d84335fSJung-uk Kim             Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_CONVERT_AML);
6280d84335fSJung-uk Kim         }
629fba7fc7eSJung-uk Kim         if (!Filename)
630fba7fc7eSJung-uk Kim         {
631fba7fc7eSJung-uk Kim             AslCommonError (ASL_ERROR, ASL_MSG_OUTPUT_FILENAME,
632fba7fc7eSJung-uk Kim                 0, 0, 0, 0, NULL, NULL);
633fba7fc7eSJung-uk Kim             return (AE_ERROR);
634fba7fc7eSJung-uk Kim         }
6351c0e1b6dSJung-uk Kim 
6361c0e1b6dSJung-uk Kim         Gbl_Files[ASL_FILE_AML_OUTPUT].Filename = Filename;
637fba7fc7eSJung-uk Kim     }
638fba7fc7eSJung-uk Kim 
639fba7fc7eSJung-uk Kim     /* Open the output AML file in binary mode */
640fba7fc7eSJung-uk Kim 
641fba7fc7eSJung-uk Kim     FlOpenFile (ASL_FILE_AML_OUTPUT, Filename, "w+b");
642fba7fc7eSJung-uk Kim     return (AE_OK);
643fba7fc7eSJung-uk Kim }
644fba7fc7eSJung-uk Kim 
645fba7fc7eSJung-uk Kim 
646fba7fc7eSJung-uk Kim /*******************************************************************************
647fba7fc7eSJung-uk Kim  *
648fba7fc7eSJung-uk Kim  * FUNCTION:    FlOpenMiscOutputFiles
649fba7fc7eSJung-uk Kim  *
650fba7fc7eSJung-uk Kim  * PARAMETERS:  FilenamePrefix       - The user-specified ASL source file
651fba7fc7eSJung-uk Kim  *
652fba7fc7eSJung-uk Kim  * RETURN:      Status
653fba7fc7eSJung-uk Kim  *
654fba7fc7eSJung-uk Kim  * DESCRIPTION: Create and open the various output files needed, depending on
655fba7fc7eSJung-uk Kim  *              the command line options
656fba7fc7eSJung-uk Kim  *
657fba7fc7eSJung-uk Kim  ******************************************************************************/
658fba7fc7eSJung-uk Kim 
659fba7fc7eSJung-uk Kim ACPI_STATUS
660fba7fc7eSJung-uk Kim FlOpenMiscOutputFiles (
661fba7fc7eSJung-uk Kim     char                    *FilenamePrefix)
662fba7fc7eSJung-uk Kim {
663fba7fc7eSJung-uk Kim     char                    *Filename;
664fba7fc7eSJung-uk Kim 
665fba7fc7eSJung-uk Kim 
666fe0f0bbbSJung-uk Kim      /* Create/Open a map file if requested */
667fe0f0bbbSJung-uk Kim 
668fe0f0bbbSJung-uk Kim     if (Gbl_MapfileFlag)
669fe0f0bbbSJung-uk Kim     {
670fe0f0bbbSJung-uk Kim         Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_MAP);
671fe0f0bbbSJung-uk Kim         if (!Filename)
672fe0f0bbbSJung-uk Kim         {
673fe0f0bbbSJung-uk Kim             AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME,
674fe0f0bbbSJung-uk Kim                 0, 0, 0, 0, NULL, NULL);
675fe0f0bbbSJung-uk Kim             return (AE_ERROR);
676fe0f0bbbSJung-uk Kim         }
677fe0f0bbbSJung-uk Kim 
678fe0f0bbbSJung-uk Kim         /* Open the hex file, text mode (closed at compiler exit) */
679fe0f0bbbSJung-uk Kim 
680fe0f0bbbSJung-uk Kim         FlOpenFile (ASL_FILE_MAP_OUTPUT, Filename, "w+t");
681fe0f0bbbSJung-uk Kim 
682fe0f0bbbSJung-uk Kim         AslCompilerSignon (ASL_FILE_MAP_OUTPUT);
683fe0f0bbbSJung-uk Kim         AslCompilerFileHeader (ASL_FILE_MAP_OUTPUT);
684fe0f0bbbSJung-uk Kim     }
685fe0f0bbbSJung-uk Kim 
6869c48c75eSJung-uk Kim     /* All done for disassembler */
6879c48c75eSJung-uk Kim 
688f8146b88SJung-uk Kim     if (Gbl_FileType == ASL_INPUT_TYPE_BINARY_ACPI_TABLE)
6899c48c75eSJung-uk Kim     {
6909c48c75eSJung-uk Kim         return (AE_OK);
6919c48c75eSJung-uk Kim     }
6929c48c75eSJung-uk Kim 
693a88e22b7SJung-uk Kim     /* Create/Open a hex output file if asked */
694a88e22b7SJung-uk Kim 
695a88e22b7SJung-uk Kim     if (Gbl_HexOutputFlag)
696a88e22b7SJung-uk Kim     {
697a88e22b7SJung-uk Kim         Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_HEX_DUMP);
698a88e22b7SJung-uk Kim         if (!Filename)
699a88e22b7SJung-uk Kim         {
700a88e22b7SJung-uk Kim             AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME,
701a88e22b7SJung-uk Kim                 0, 0, 0, 0, NULL, NULL);
702a88e22b7SJung-uk Kim             return (AE_ERROR);
703a88e22b7SJung-uk Kim         }
704a88e22b7SJung-uk Kim 
705a88e22b7SJung-uk Kim         /* Open the hex file, text mode */
706a88e22b7SJung-uk Kim 
707f38b0f21SJung-uk Kim         FlOpenFile (ASL_FILE_HEX_OUTPUT, Filename, "w+t");
708a88e22b7SJung-uk Kim 
709a88e22b7SJung-uk Kim         AslCompilerSignon (ASL_FILE_HEX_OUTPUT);
710a88e22b7SJung-uk Kim         AslCompilerFileHeader (ASL_FILE_HEX_OUTPUT);
711a88e22b7SJung-uk Kim     }
712a88e22b7SJung-uk Kim 
713a88e22b7SJung-uk Kim     /* Create/Open a debug output file if asked */
714a88e22b7SJung-uk Kim 
715a88e22b7SJung-uk Kim     if (Gbl_DebugFlag)
716a88e22b7SJung-uk Kim     {
717a88e22b7SJung-uk Kim         Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_DEBUG);
718a88e22b7SJung-uk Kim         if (!Filename)
719a88e22b7SJung-uk Kim         {
720a88e22b7SJung-uk Kim             AslCommonError (ASL_ERROR, ASL_MSG_DEBUG_FILENAME,
721a88e22b7SJung-uk Kim                 0, 0, 0, 0, NULL, NULL);
722a88e22b7SJung-uk Kim             return (AE_ERROR);
723a88e22b7SJung-uk Kim         }
724a88e22b7SJung-uk Kim 
725a88e22b7SJung-uk Kim         /* Open the debug file as STDERR, text mode */
726a88e22b7SJung-uk Kim 
727a88e22b7SJung-uk Kim         Gbl_Files[ASL_FILE_DEBUG_OUTPUT].Filename = Filename;
728a88e22b7SJung-uk Kim         Gbl_Files[ASL_FILE_DEBUG_OUTPUT].Handle =
729a88e22b7SJung-uk Kim             freopen (Filename, "w+t", stderr);
730a88e22b7SJung-uk Kim 
7314c52cad2SJung-uk Kim         if (!Gbl_Files[ASL_FILE_DEBUG_OUTPUT].Handle)
7324c52cad2SJung-uk Kim         {
7331c0e1b6dSJung-uk Kim             /*
7345ef50723SJung-uk Kim              * A problem with freopen is that on error, we no longer
7355ef50723SJung-uk Kim              * have stderr and cannot emit normal error messages.
7365ef50723SJung-uk Kim              * Emit error to stdout, close files, and exit.
7371c0e1b6dSJung-uk Kim              */
7385ef50723SJung-uk Kim             fprintf (stdout,
7395ef50723SJung-uk Kim                 "\nCould not open debug output file: %s\n\n", Filename);
7405ef50723SJung-uk Kim 
7415ef50723SJung-uk Kim             CmCleanupAndExit ();
7425ef50723SJung-uk Kim             exit (1);
7434c52cad2SJung-uk Kim         }
7444c52cad2SJung-uk Kim 
745a88e22b7SJung-uk Kim         AslCompilerSignon (ASL_FILE_DEBUG_OUTPUT);
746a88e22b7SJung-uk Kim         AslCompilerFileHeader (ASL_FILE_DEBUG_OUTPUT);
747a88e22b7SJung-uk Kim     }
748a88e22b7SJung-uk Kim 
749f8146b88SJung-uk Kim     /* Create/Open a cross-reference output file if asked */
750f8146b88SJung-uk Kim 
751f8146b88SJung-uk Kim     if (Gbl_CrossReferenceOutput)
752f8146b88SJung-uk Kim     {
753f8146b88SJung-uk Kim         Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_XREF);
754f8146b88SJung-uk Kim         if (!Filename)
755f8146b88SJung-uk Kim         {
756f8146b88SJung-uk Kim             AslCommonError (ASL_ERROR, ASL_MSG_DEBUG_FILENAME,
757f8146b88SJung-uk Kim                 0, 0, 0, 0, NULL, NULL);
758f8146b88SJung-uk Kim             return (AE_ERROR);
759f8146b88SJung-uk Kim         }
760f8146b88SJung-uk Kim 
761f8146b88SJung-uk Kim         FlOpenFile (ASL_FILE_XREF_OUTPUT, Filename, "w+t");
762f8146b88SJung-uk Kim 
763f8146b88SJung-uk Kim         AslCompilerSignon (ASL_FILE_XREF_OUTPUT);
764f8146b88SJung-uk Kim         AslCompilerFileHeader (ASL_FILE_XREF_OUTPUT);
765f8146b88SJung-uk Kim     }
766f8146b88SJung-uk Kim 
767d244b227SJung-uk Kim     /* Create/Open a listing output file if asked */
768d244b227SJung-uk Kim 
769d244b227SJung-uk Kim     if (Gbl_ListingFlag)
770d244b227SJung-uk Kim     {
771d244b227SJung-uk Kim         Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_LISTING);
772d244b227SJung-uk Kim         if (!Filename)
773d244b227SJung-uk Kim         {
774d244b227SJung-uk Kim             AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME,
775d244b227SJung-uk Kim                 0, 0, 0, 0, NULL, NULL);
776d244b227SJung-uk Kim             return (AE_ERROR);
777d244b227SJung-uk Kim         }
778d244b227SJung-uk Kim 
779d244b227SJung-uk Kim         /* Open the listing file, text mode */
780d244b227SJung-uk Kim 
781f38b0f21SJung-uk Kim         FlOpenFile (ASL_FILE_LISTING_OUTPUT, Filename, "w+t");
782d244b227SJung-uk Kim 
783d244b227SJung-uk Kim         AslCompilerSignon (ASL_FILE_LISTING_OUTPUT);
784d244b227SJung-uk Kim         AslCompilerFileHeader (ASL_FILE_LISTING_OUTPUT);
785d244b227SJung-uk Kim     }
786d244b227SJung-uk Kim 
7875ef50723SJung-uk Kim     /* Create the preprocessor output temp file if preprocessor enabled */
7884c52cad2SJung-uk Kim 
789eef1b955SJung-uk Kim     if (Gbl_PreprocessFlag)
790eef1b955SJung-uk Kim     {
7914c52cad2SJung-uk Kim         Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_PREPROCESSOR);
7924c52cad2SJung-uk Kim         if (!Filename)
7934c52cad2SJung-uk Kim         {
7944c52cad2SJung-uk Kim             AslCommonError (ASL_ERROR, ASL_MSG_PREPROCESSOR_FILENAME,
7954c52cad2SJung-uk Kim                 0, 0, 0, 0, NULL, NULL);
7964c52cad2SJung-uk Kim             return (AE_ERROR);
7974c52cad2SJung-uk Kim         }
7984c52cad2SJung-uk Kim 
799f38b0f21SJung-uk Kim         FlOpenFile (ASL_FILE_PREPROCESSOR, Filename, "w+t");
800eef1b955SJung-uk Kim     }
8014c52cad2SJung-uk Kim 
8025ef50723SJung-uk Kim     /*
8035ef50723SJung-uk Kim      * Create the "user" preprocessor output file if -li flag set.
8045ef50723SJung-uk Kim      * Note, this file contains no embedded #line directives.
8055ef50723SJung-uk Kim      */
8065ef50723SJung-uk Kim     if (Gbl_PreprocessorOutputFlag)
8075ef50723SJung-uk Kim     {
8085ef50723SJung-uk Kim         Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_PREPROC_USER);
8095ef50723SJung-uk Kim         if (!Filename)
8105ef50723SJung-uk Kim         {
8115ef50723SJung-uk Kim             AslCommonError (ASL_ERROR, ASL_MSG_PREPROCESSOR_FILENAME,
8125ef50723SJung-uk Kim                 0, 0, 0, 0, NULL, NULL);
8135ef50723SJung-uk Kim             return (AE_ERROR);
8145ef50723SJung-uk Kim         }
8155ef50723SJung-uk Kim 
8165ef50723SJung-uk Kim         FlOpenFile (ASL_FILE_PREPROCESSOR_USER, Filename, "w+t");
8175ef50723SJung-uk Kim     }
8185ef50723SJung-uk Kim 
8194c52cad2SJung-uk Kim     /* All done for data table compiler */
8204c52cad2SJung-uk Kim 
821a88e22b7SJung-uk Kim     if (Gbl_FileType == ASL_INPUT_TYPE_ASCII_DATA)
822a88e22b7SJung-uk Kim     {
823a88e22b7SJung-uk Kim         return (AE_OK);
824a88e22b7SJung-uk Kim     }
825a88e22b7SJung-uk Kim 
826fba7fc7eSJung-uk Kim     /* Create/Open a combined source output file */
827fba7fc7eSJung-uk Kim 
828fba7fc7eSJung-uk Kim     Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_SOURCE);
829fba7fc7eSJung-uk Kim     if (!Filename)
830fba7fc7eSJung-uk Kim     {
831fba7fc7eSJung-uk Kim         AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME,
832fba7fc7eSJung-uk Kim             0, 0, 0, 0, NULL, NULL);
833fba7fc7eSJung-uk Kim         return (AE_ERROR);
834fba7fc7eSJung-uk Kim     }
835fba7fc7eSJung-uk Kim 
836fba7fc7eSJung-uk Kim     /*
837fba7fc7eSJung-uk Kim      * Open the source output file, binary mode (so that LF does not get
838fba7fc7eSJung-uk Kim      * expanded to CR/LF on some systems, messing up our seek
839fba7fc7eSJung-uk Kim      * calculations.)
840fba7fc7eSJung-uk Kim      */
841fba7fc7eSJung-uk Kim     FlOpenFile (ASL_FILE_SOURCE_OUTPUT, Filename, "w+b");
842fba7fc7eSJung-uk Kim 
8434c52cad2SJung-uk Kim /*
8444c52cad2SJung-uk Kim // TBD: TEMP
8454c52cad2SJung-uk Kim //    AslCompilerin = Gbl_Files[ASL_FILE_SOURCE_OUTPUT].Handle;
8464c52cad2SJung-uk Kim */
847fba7fc7eSJung-uk Kim     /* Create/Open a assembly code source output file if asked */
848fba7fc7eSJung-uk Kim 
849fba7fc7eSJung-uk Kim     if (Gbl_AsmOutputFlag)
850fba7fc7eSJung-uk Kim     {
851fba7fc7eSJung-uk Kim         Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_ASM_SOURCE);
852fba7fc7eSJung-uk Kim         if (!Filename)
853fba7fc7eSJung-uk Kim         {
854fba7fc7eSJung-uk Kim             AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME,
855fba7fc7eSJung-uk Kim                 0, 0, 0, 0, NULL, NULL);
856fba7fc7eSJung-uk Kim             return (AE_ERROR);
857fba7fc7eSJung-uk Kim         }
858fba7fc7eSJung-uk Kim 
859fba7fc7eSJung-uk Kim         /* Open the assembly code source file, text mode */
860fba7fc7eSJung-uk Kim 
861f38b0f21SJung-uk Kim         FlOpenFile (ASL_FILE_ASM_SOURCE_OUTPUT, Filename, "w+t");
862fba7fc7eSJung-uk Kim 
863fba7fc7eSJung-uk Kim         AslCompilerSignon (ASL_FILE_ASM_SOURCE_OUTPUT);
864fba7fc7eSJung-uk Kim         AslCompilerFileHeader (ASL_FILE_ASM_SOURCE_OUTPUT);
865fba7fc7eSJung-uk Kim     }
866fba7fc7eSJung-uk Kim 
867fba7fc7eSJung-uk Kim     /* Create/Open a C code source output file if asked */
868fba7fc7eSJung-uk Kim 
869fba7fc7eSJung-uk Kim     if (Gbl_C_OutputFlag)
870fba7fc7eSJung-uk Kim     {
871fba7fc7eSJung-uk Kim         Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_C_SOURCE);
872fba7fc7eSJung-uk Kim         if (!Filename)
873fba7fc7eSJung-uk Kim         {
874fba7fc7eSJung-uk Kim             AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME,
875fba7fc7eSJung-uk Kim                 0, 0, 0, 0, NULL, NULL);
876fba7fc7eSJung-uk Kim             return (AE_ERROR);
877fba7fc7eSJung-uk Kim         }
878fba7fc7eSJung-uk Kim 
879fba7fc7eSJung-uk Kim         /* Open the C code source file, text mode */
880fba7fc7eSJung-uk Kim 
881f38b0f21SJung-uk Kim         FlOpenFile (ASL_FILE_C_SOURCE_OUTPUT, Filename, "w+t");
882fba7fc7eSJung-uk Kim 
883fba7fc7eSJung-uk Kim         FlPrintFile (ASL_FILE_C_SOURCE_OUTPUT, "/*\n");
884fba7fc7eSJung-uk Kim         AslCompilerSignon (ASL_FILE_C_SOURCE_OUTPUT);
885fba7fc7eSJung-uk Kim         AslCompilerFileHeader (ASL_FILE_C_SOURCE_OUTPUT);
886fba7fc7eSJung-uk Kim     }
887fba7fc7eSJung-uk Kim 
8889c7c683cSJung-uk Kim     /* Create/Open a C code source output file for the offset table if asked */
8899c7c683cSJung-uk Kim 
8909c7c683cSJung-uk Kim     if (Gbl_C_OffsetTableFlag)
8919c7c683cSJung-uk Kim     {
8929c7c683cSJung-uk Kim         Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_C_OFFSET);
8939c7c683cSJung-uk Kim         if (!Filename)
8949c7c683cSJung-uk Kim         {
8959c7c683cSJung-uk Kim             AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME,
8969c7c683cSJung-uk Kim                 0, 0, 0, 0, NULL, NULL);
8979c7c683cSJung-uk Kim             return (AE_ERROR);
8989c7c683cSJung-uk Kim         }
8999c7c683cSJung-uk Kim 
9009c7c683cSJung-uk Kim         /* Open the C code source file, text mode */
9019c7c683cSJung-uk Kim 
9029c7c683cSJung-uk Kim         FlOpenFile (ASL_FILE_C_OFFSET_OUTPUT, Filename, "w+t");
9039c7c683cSJung-uk Kim 
9049c7c683cSJung-uk Kim         FlPrintFile (ASL_FILE_C_OFFSET_OUTPUT, "/*\n");
9059c7c683cSJung-uk Kim         AslCompilerSignon (ASL_FILE_C_OFFSET_OUTPUT);
9069c7c683cSJung-uk Kim         AslCompilerFileHeader (ASL_FILE_C_OFFSET_OUTPUT);
9079c7c683cSJung-uk Kim     }
9089c7c683cSJung-uk Kim 
909fba7fc7eSJung-uk Kim     /* Create/Open a assembly include output file if asked */
910fba7fc7eSJung-uk Kim 
911fba7fc7eSJung-uk Kim     if (Gbl_AsmIncludeOutputFlag)
912fba7fc7eSJung-uk Kim     {
913fba7fc7eSJung-uk Kim         Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_ASM_INCLUDE);
914fba7fc7eSJung-uk Kim         if (!Filename)
915fba7fc7eSJung-uk Kim         {
916fba7fc7eSJung-uk Kim             AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME,
917fba7fc7eSJung-uk Kim                 0, 0, 0, 0, NULL, NULL);
918fba7fc7eSJung-uk Kim             return (AE_ERROR);
919fba7fc7eSJung-uk Kim         }
920fba7fc7eSJung-uk Kim 
921fba7fc7eSJung-uk Kim         /* Open the assembly include file, text mode */
922fba7fc7eSJung-uk Kim 
923f38b0f21SJung-uk Kim         FlOpenFile (ASL_FILE_ASM_INCLUDE_OUTPUT, Filename, "w+t");
924fba7fc7eSJung-uk Kim 
925fba7fc7eSJung-uk Kim         AslCompilerSignon (ASL_FILE_ASM_INCLUDE_OUTPUT);
926fba7fc7eSJung-uk Kim         AslCompilerFileHeader (ASL_FILE_ASM_INCLUDE_OUTPUT);
927fba7fc7eSJung-uk Kim     }
928fba7fc7eSJung-uk Kim 
929fba7fc7eSJung-uk Kim     /* Create/Open a C include output file if asked */
930fba7fc7eSJung-uk Kim 
931fba7fc7eSJung-uk Kim     if (Gbl_C_IncludeOutputFlag)
932fba7fc7eSJung-uk Kim     {
933fba7fc7eSJung-uk Kim         Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_C_INCLUDE);
934fba7fc7eSJung-uk Kim         if (!Filename)
935fba7fc7eSJung-uk Kim         {
936fba7fc7eSJung-uk Kim             AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME,
937fba7fc7eSJung-uk Kim                 0, 0, 0, 0, NULL, NULL);
938fba7fc7eSJung-uk Kim             return (AE_ERROR);
939fba7fc7eSJung-uk Kim         }
940fba7fc7eSJung-uk Kim 
941fba7fc7eSJung-uk Kim         /* Open the C include file, text mode */
942fba7fc7eSJung-uk Kim 
943f38b0f21SJung-uk Kim         FlOpenFile (ASL_FILE_C_INCLUDE_OUTPUT, Filename, "w+t");
944fba7fc7eSJung-uk Kim 
945fba7fc7eSJung-uk Kim         FlPrintFile (ASL_FILE_C_INCLUDE_OUTPUT, "/*\n");
946fba7fc7eSJung-uk Kim         AslCompilerSignon (ASL_FILE_C_INCLUDE_OUTPUT);
947fba7fc7eSJung-uk Kim         AslCompilerFileHeader (ASL_FILE_C_INCLUDE_OUTPUT);
948fba7fc7eSJung-uk Kim     }
949fba7fc7eSJung-uk Kim 
950fba7fc7eSJung-uk Kim     /* Create a namespace output file if asked */
951fba7fc7eSJung-uk Kim 
952fba7fc7eSJung-uk Kim     if (Gbl_NsOutputFlag)
953fba7fc7eSJung-uk Kim     {
954fba7fc7eSJung-uk Kim         Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_NAMESPACE);
955fba7fc7eSJung-uk Kim         if (!Filename)
956fba7fc7eSJung-uk Kim         {
957fba7fc7eSJung-uk Kim             AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME,
958fba7fc7eSJung-uk Kim                 0, 0, 0, 0, NULL, NULL);
959fba7fc7eSJung-uk Kim             return (AE_ERROR);
960fba7fc7eSJung-uk Kim         }
961fba7fc7eSJung-uk Kim 
962fba7fc7eSJung-uk Kim         /* Open the namespace file, text mode */
963fba7fc7eSJung-uk Kim 
964f38b0f21SJung-uk Kim         FlOpenFile (ASL_FILE_NAMESPACE_OUTPUT, Filename, "w+t");
965fba7fc7eSJung-uk Kim 
966fba7fc7eSJung-uk Kim         AslCompilerSignon (ASL_FILE_NAMESPACE_OUTPUT);
967fba7fc7eSJung-uk Kim         AslCompilerFileHeader (ASL_FILE_NAMESPACE_OUTPUT);
968fba7fc7eSJung-uk Kim     }
969fba7fc7eSJung-uk Kim 
9700d84335fSJung-uk Kim     /* Create a debug file for the converter */
9710d84335fSJung-uk Kim 
9720d84335fSJung-uk Kim     if (AcpiGbl_DebugAslConversion)
9730d84335fSJung-uk Kim     {
9740d84335fSJung-uk Kim         Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_CONVERT_DEBUG);
9750d84335fSJung-uk Kim         if (!Filename)
9760d84335fSJung-uk Kim         {
9770d84335fSJung-uk Kim             AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME,
9780d84335fSJung-uk Kim                 0, 0, 0, 0, NULL, NULL);
9790d84335fSJung-uk Kim             return (AE_ERROR);
9800d84335fSJung-uk Kim         }
9810d84335fSJung-uk Kim 
9820d84335fSJung-uk Kim         /* Open the converter debug file, text mode */
9830d84335fSJung-uk Kim 
9840d84335fSJung-uk Kim         FlOpenFile (ASL_FILE_CONV_DEBUG_OUTPUT, Filename, "w+t");
9850d84335fSJung-uk Kim 
9860d84335fSJung-uk Kim         AslCompilerSignon (ASL_FILE_CONV_DEBUG_OUTPUT);
9870d84335fSJung-uk Kim         AslCompilerFileHeader (ASL_FILE_CONV_DEBUG_OUTPUT);
9880d84335fSJung-uk Kim 
9890d84335fSJung-uk Kim         AcpiGbl_ConvDebugFile = Gbl_Files[ASL_FILE_CONV_DEBUG_OUTPUT].Handle;
9900d84335fSJung-uk Kim     }
9910d84335fSJung-uk Kim 
992fba7fc7eSJung-uk Kim     return (AE_OK);
993fba7fc7eSJung-uk Kim }
994fba7fc7eSJung-uk Kim 
995fba7fc7eSJung-uk Kim 
996fba7fc7eSJung-uk Kim #ifdef ACPI_OBSOLETE_FUNCTIONS
997fba7fc7eSJung-uk Kim /*******************************************************************************
998fba7fc7eSJung-uk Kim  *
99953289f6aSNate Lawson  * FUNCTION:    FlParseInputPathname
100053289f6aSNate Lawson  *
100153289f6aSNate Lawson  * PARAMETERS:  InputFilename       - The user-specified ASL source file to be
100253289f6aSNate Lawson  *                                    compiled
100353289f6aSNate Lawson  *
100453289f6aSNate Lawson  * RETURN:      Status
100553289f6aSNate Lawson  *
100653289f6aSNate Lawson  * DESCRIPTION: Split the input path into a directory and filename part
100753289f6aSNate Lawson  *              1) Directory part used to open include files
100853289f6aSNate Lawson  *              2) Filename part used to generate output filenames
100953289f6aSNate Lawson  *
101053289f6aSNate Lawson  ******************************************************************************/
101153289f6aSNate Lawson 
101253289f6aSNate Lawson ACPI_STATUS
101353289f6aSNate Lawson FlParseInputPathname (
101453289f6aSNate Lawson     char                    *InputFilename)
101553289f6aSNate Lawson {
101653289f6aSNate Lawson     char                    *Substring;
101753289f6aSNate Lawson 
101853289f6aSNate Lawson 
101953289f6aSNate Lawson     if (!InputFilename)
102053289f6aSNate Lawson     {
102153289f6aSNate Lawson         return (AE_OK);
102253289f6aSNate Lawson     }
102353289f6aSNate Lawson 
102453289f6aSNate Lawson     /* Get the path to the input filename's directory */
102553289f6aSNate Lawson 
102653289f6aSNate Lawson     Gbl_DirectoryPath = strdup (InputFilename);
102753289f6aSNate Lawson     if (!Gbl_DirectoryPath)
102853289f6aSNate Lawson     {
102953289f6aSNate Lawson         return (AE_NO_MEMORY);
103053289f6aSNate Lawson     }
103153289f6aSNate Lawson 
103253289f6aSNate Lawson     Substring = strrchr (Gbl_DirectoryPath, '\\');
103353289f6aSNate Lawson     if (!Substring)
103453289f6aSNate Lawson     {
103553289f6aSNate Lawson         Substring = strrchr (Gbl_DirectoryPath, '/');
103653289f6aSNate Lawson         if (!Substring)
103753289f6aSNate Lawson         {
103853289f6aSNate Lawson             Substring = strrchr (Gbl_DirectoryPath, ':');
103953289f6aSNate Lawson         }
104053289f6aSNate Lawson     }
104153289f6aSNate Lawson 
104253289f6aSNate Lawson     if (!Substring)
104353289f6aSNate Lawson     {
104453289f6aSNate Lawson         Gbl_DirectoryPath[0] = 0;
104553289f6aSNate Lawson         if (Gbl_UseDefaultAmlFilename)
104653289f6aSNate Lawson         {
104753289f6aSNate Lawson             Gbl_OutputFilenamePrefix = strdup (InputFilename);
104853289f6aSNate Lawson         }
104953289f6aSNate Lawson     }
105053289f6aSNate Lawson     else
105153289f6aSNate Lawson     {
105253289f6aSNate Lawson         if (Gbl_UseDefaultAmlFilename)
105353289f6aSNate Lawson         {
105453289f6aSNate Lawson             Gbl_OutputFilenamePrefix = strdup (Substring + 1);
105553289f6aSNate Lawson         }
105653289f6aSNate Lawson         *(Substring+1) = 0;
105753289f6aSNate Lawson     }
105853289f6aSNate Lawson 
1059313a0c13SJung-uk Kim     UtConvertBackslashes (Gbl_OutputFilenamePrefix);
106053289f6aSNate Lawson     return (AE_OK);
106153289f6aSNate Lawson }
1062fba7fc7eSJung-uk Kim #endif
1063