153289f6aSNate Lawson /******************************************************************************
253289f6aSNate Lawson  *
353289f6aSNate Lawson  * Module Name: aslfiles - file I/O suppoert
453289f6aSNate Lawson  *
553289f6aSNate Lawson  *****************************************************************************/
653289f6aSNate Lawson 
7d244b227SJung-uk Kim /*
8ec3fc72fSJung-uk Kim  * Copyright (C) 2000 - 2012, Intel Corp.
953289f6aSNate Lawson  * All rights reserved.
1053289f6aSNate Lawson  *
11d244b227SJung-uk Kim  * Redistribution and use in source and binary forms, with or without
12d244b227SJung-uk Kim  * modification, are permitted provided that the following conditions
13d244b227SJung-uk Kim  * are met:
14d244b227SJung-uk Kim  * 1. Redistributions of source code must retain the above copyright
15d244b227SJung-uk Kim  *    notice, this list of conditions, and the following disclaimer,
16d244b227SJung-uk Kim  *    without modification.
17d244b227SJung-uk Kim  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
18d244b227SJung-uk Kim  *    substantially similar to the "NO WARRANTY" disclaimer below
19d244b227SJung-uk Kim  *    ("Disclaimer") and any redistribution must be conditioned upon
20d244b227SJung-uk Kim  *    including a substantially similar Disclaimer requirement for further
21d244b227SJung-uk Kim  *    binary redistribution.
22d244b227SJung-uk Kim  * 3. Neither the names of the above-listed copyright holders nor the names
23d244b227SJung-uk Kim  *    of any contributors may be used to endorse or promote products derived
24d244b227SJung-uk Kim  *    from this software without specific prior written permission.
2553289f6aSNate Lawson  *
26d244b227SJung-uk Kim  * Alternatively, this software may be distributed under the terms of the
27d244b227SJung-uk Kim  * GNU General Public License ("GPL") version 2 as published by the Free
28d244b227SJung-uk Kim  * Software Foundation.
2953289f6aSNate Lawson  *
30d244b227SJung-uk Kim  * NO WARRANTY
31d244b227SJung-uk Kim  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
32d244b227SJung-uk Kim  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
33d244b227SJung-uk Kim  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
34d244b227SJung-uk Kim  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
35d244b227SJung-uk Kim  * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
36d244b227SJung-uk Kim  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
37d244b227SJung-uk Kim  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
38d244b227SJung-uk Kim  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
39d244b227SJung-uk Kim  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
40d244b227SJung-uk Kim  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
41d244b227SJung-uk Kim  * POSSIBILITY OF SUCH DAMAGES.
42d244b227SJung-uk Kim  */
4353289f6aSNate Lawson 
44ab6f3bf9SJung-uk Kim #include <contrib/dev/acpica/compiler/aslcompiler.h>
45ab6f3bf9SJung-uk Kim #include <contrib/dev/acpica/include/acapps.h>
4653289f6aSNate Lawson 
4753289f6aSNate Lawson #define _COMPONENT          ACPI_COMPILER
4853289f6aSNate Lawson         ACPI_MODULE_NAME    ("aslfiles")
4953289f6aSNate Lawson 
50fba7fc7eSJung-uk Kim /* Local prototypes */
51fba7fc7eSJung-uk Kim 
524c52cad2SJung-uk Kim FILE *
53d6dd1baeSJung-uk Kim FlOpenIncludeWithPrefix (
54d6dd1baeSJung-uk Kim     char                    *PrefixDir,
55d6dd1baeSJung-uk Kim     char                    *Filename);
56d6dd1baeSJung-uk Kim 
57fba7fc7eSJung-uk Kim 
58fba7fc7eSJung-uk Kim #ifdef ACPI_OBSOLETE_FUNCTIONS
59fba7fc7eSJung-uk Kim ACPI_STATUS
60fba7fc7eSJung-uk Kim FlParseInputPathname (
61fba7fc7eSJung-uk Kim     char                    *InputFilename);
62fba7fc7eSJung-uk Kim #endif
63fba7fc7eSJung-uk Kim 
6453289f6aSNate Lawson 
6553289f6aSNate Lawson /*******************************************************************************
6653289f6aSNate Lawson  *
6753289f6aSNate Lawson  * FUNCTION:    AslAbort
6853289f6aSNate Lawson  *
6953289f6aSNate Lawson  * PARAMETERS:  None
7053289f6aSNate Lawson  *
7153289f6aSNate Lawson  * RETURN:      None
7253289f6aSNate Lawson  *
7353289f6aSNate Lawson  * DESCRIPTION: Dump the error log and abort the compiler. Used for serious
7453289f6aSNate Lawson  *              I/O errors
7553289f6aSNate Lawson  *
7653289f6aSNate Lawson  ******************************************************************************/
7753289f6aSNate Lawson 
7853289f6aSNate Lawson void
79fba7fc7eSJung-uk Kim AslAbort (
80fba7fc7eSJung-uk Kim     void)
8153289f6aSNate Lawson {
8253289f6aSNate Lawson 
83eef1b955SJung-uk Kim     AePrintErrorLog (ASL_FILE_STDERR);
8453289f6aSNate Lawson     if (Gbl_DebugFlag)
8553289f6aSNate Lawson     {
86eef1b955SJung-uk Kim         /* Print error summary to stdout also */
8753289f6aSNate Lawson 
88eef1b955SJung-uk Kim         AePrintErrorLog (ASL_FILE_STDOUT);
8953289f6aSNate Lawson     }
9053289f6aSNate Lawson 
91fba7fc7eSJung-uk Kim     exit (1);
9253289f6aSNate Lawson }
9353289f6aSNate Lawson 
9453289f6aSNate Lawson 
9553289f6aSNate Lawson /*******************************************************************************
9653289f6aSNate Lawson  *
9753289f6aSNate Lawson  * FUNCTION:    FlFileError
9853289f6aSNate Lawson  *
9953289f6aSNate Lawson  * PARAMETERS:  FileId              - Index into file info array
10053289f6aSNate Lawson  *              ErrorId             - Index into error message array
10153289f6aSNate Lawson  *
10253289f6aSNate Lawson  * RETURN:      None
10353289f6aSNate Lawson  *
10453289f6aSNate Lawson  * DESCRIPTION: Decode errno to an error message and add the entire error
10553289f6aSNate Lawson  *              to the error log.
10653289f6aSNate Lawson  *
10753289f6aSNate Lawson  ******************************************************************************/
10853289f6aSNate Lawson 
10953289f6aSNate Lawson void
11053289f6aSNate Lawson FlFileError (
11153289f6aSNate Lawson     UINT32                  FileId,
11253289f6aSNate Lawson     UINT8                   ErrorId)
11353289f6aSNate Lawson {
11453289f6aSNate Lawson 
115fba7fc7eSJung-uk Kim     sprintf (MsgBuffer, "\"%s\" (%s)", Gbl_Files[FileId].Filename,
116fba7fc7eSJung-uk Kim         strerror (errno));
11753289f6aSNate Lawson     AslCommonError (ASL_ERROR, ErrorId, 0, 0, 0, 0, NULL, MsgBuffer);
11853289f6aSNate Lawson }
11953289f6aSNate Lawson 
12053289f6aSNate Lawson 
12153289f6aSNate Lawson /*******************************************************************************
12253289f6aSNate Lawson  *
12353289f6aSNate Lawson  * FUNCTION:    FlOpenFile
12453289f6aSNate Lawson  *
12553289f6aSNate Lawson  * PARAMETERS:  FileId              - Index into file info array
12653289f6aSNate Lawson  *              Filename            - file pathname to open
12753289f6aSNate Lawson  *              Mode                - Open mode for fopen
12853289f6aSNate Lawson  *
129fba7fc7eSJung-uk Kim  * RETURN:      None
13053289f6aSNate Lawson  *
13153289f6aSNate Lawson  * DESCRIPTION: Open a file.
13253289f6aSNate Lawson  *              NOTE: Aborts compiler on any error.
13353289f6aSNate Lawson  *
13453289f6aSNate Lawson  ******************************************************************************/
13553289f6aSNate Lawson 
136a88e22b7SJung-uk Kim void
13753289f6aSNate Lawson FlOpenFile (
13853289f6aSNate Lawson     UINT32                  FileId,
13953289f6aSNate Lawson     char                    *Filename,
14053289f6aSNate Lawson     char                    *Mode)
14153289f6aSNate Lawson {
14253289f6aSNate Lawson     FILE                    *File;
14353289f6aSNate Lawson 
14453289f6aSNate Lawson 
14553289f6aSNate Lawson     File = fopen (Filename, Mode);
14653289f6aSNate Lawson     if (!File)
14753289f6aSNate Lawson     {
14853289f6aSNate Lawson         FlFileError (FileId, ASL_MSG_OPEN);
14953289f6aSNate Lawson         AslAbort ();
15053289f6aSNate Lawson     }
151ed17e06eSJung-uk Kim 
152ed17e06eSJung-uk Kim     Gbl_Files[FileId].Filename = Filename;
153ed17e06eSJung-uk Kim     Gbl_Files[FileId].Handle   = File;
15453289f6aSNate Lawson }
15553289f6aSNate Lawson 
15653289f6aSNate Lawson 
15753289f6aSNate Lawson /*******************************************************************************
15853289f6aSNate Lawson  *
1593f5e024cSJung-uk Kim  * FUNCTION:    FlGetFileSize
1603f5e024cSJung-uk Kim  *
1613f5e024cSJung-uk Kim  * PARAMETERS:  FileId              - Index into file info array
1623f5e024cSJung-uk Kim  *
1633f5e024cSJung-uk Kim  * RETURN:      File Size
1643f5e024cSJung-uk Kim  *
1653f5e024cSJung-uk Kim  * DESCRIPTION: Get current file size. Uses seek-to-EOF. File must be open.
1663f5e024cSJung-uk Kim  *
1673f5e024cSJung-uk Kim  ******************************************************************************/
1683f5e024cSJung-uk Kim 
1693f5e024cSJung-uk Kim UINT32
1703f5e024cSJung-uk Kim FlGetFileSize (
1713f5e024cSJung-uk Kim     UINT32                  FileId)
1723f5e024cSJung-uk Kim {
1733f5e024cSJung-uk Kim     FILE                    *fp;
1743f5e024cSJung-uk Kim     UINT32                  FileSize;
1753f0275a0SJung-uk Kim     long                    Offset;
1763f5e024cSJung-uk Kim 
1773f5e024cSJung-uk Kim 
1783f5e024cSJung-uk Kim     fp = Gbl_Files[FileId].Handle;
1793f0275a0SJung-uk Kim     Offset = ftell (fp);
1803f5e024cSJung-uk Kim 
1813f5e024cSJung-uk Kim     fseek (fp, 0, SEEK_END);
1823f5e024cSJung-uk Kim     FileSize = (UINT32) ftell (fp);
1833f5e024cSJung-uk Kim 
1843f0275a0SJung-uk Kim     /* Restore file pointer */
1853f0275a0SJung-uk Kim 
1863f0275a0SJung-uk Kim     fseek (fp, Offset, SEEK_SET);
1873f5e024cSJung-uk Kim     return (FileSize);
1883f5e024cSJung-uk Kim }
1893f5e024cSJung-uk Kim 
1903f5e024cSJung-uk Kim 
1913f5e024cSJung-uk Kim /*******************************************************************************
1923f5e024cSJung-uk Kim  *
19353289f6aSNate Lawson  * FUNCTION:    FlReadFile
19453289f6aSNate Lawson  *
19553289f6aSNate Lawson  * PARAMETERS:  FileId              - Index into file info array
19653289f6aSNate Lawson  *              Buffer              - Where to place the data
19753289f6aSNate Lawson  *              Length              - Amount to read
19853289f6aSNate Lawson  *
19953289f6aSNate Lawson  * RETURN:      Status. AE_ERROR indicates EOF.
20053289f6aSNate Lawson  *
20153289f6aSNate Lawson  * DESCRIPTION: Read data from an open file.
20253289f6aSNate Lawson  *              NOTE: Aborts compiler on any error.
20353289f6aSNate Lawson  *
20453289f6aSNate Lawson  ******************************************************************************/
20553289f6aSNate Lawson 
20653289f6aSNate Lawson ACPI_STATUS
20753289f6aSNate Lawson FlReadFile (
20853289f6aSNate Lawson     UINT32                  FileId,
20953289f6aSNate Lawson     void                    *Buffer,
21053289f6aSNate Lawson     UINT32                  Length)
21153289f6aSNate Lawson {
21253289f6aSNate Lawson     UINT32                  Actual;
21353289f6aSNate Lawson 
21453289f6aSNate Lawson 
21553289f6aSNate Lawson     /* Read and check for error */
21653289f6aSNate Lawson 
21753289f6aSNate Lawson     Actual = fread (Buffer, 1, Length, Gbl_Files[FileId].Handle);
218ed17e06eSJung-uk Kim     if (Actual < Length)
21953289f6aSNate Lawson     {
22053289f6aSNate Lawson         if (feof (Gbl_Files[FileId].Handle))
22153289f6aSNate Lawson         {
22253289f6aSNate Lawson             /* End-of-file, just return error */
22353289f6aSNate Lawson 
22453289f6aSNate Lawson             return (AE_ERROR);
22553289f6aSNate Lawson         }
22653289f6aSNate Lawson 
22753289f6aSNate Lawson         FlFileError (FileId, ASL_MSG_READ);
22853289f6aSNate Lawson         AslAbort ();
22953289f6aSNate Lawson     }
23053289f6aSNate Lawson 
23153289f6aSNate Lawson     return (AE_OK);
23253289f6aSNate Lawson }
23353289f6aSNate Lawson 
23453289f6aSNate Lawson 
23553289f6aSNate Lawson /*******************************************************************************
23653289f6aSNate Lawson  *
23753289f6aSNate Lawson  * FUNCTION:    FlWriteFile
23853289f6aSNate Lawson  *
23953289f6aSNate Lawson  * PARAMETERS:  FileId              - Index into file info array
24053289f6aSNate Lawson  *              Buffer              - Data to write
24153289f6aSNate Lawson  *              Length              - Amount of data to write
24253289f6aSNate Lawson  *
243fba7fc7eSJung-uk Kim  * RETURN:      None
24453289f6aSNate Lawson  *
24553289f6aSNate Lawson  * DESCRIPTION: Write data to an open file.
24653289f6aSNate Lawson  *              NOTE: Aborts compiler on any error.
24753289f6aSNate Lawson  *
24853289f6aSNate Lawson  ******************************************************************************/
24953289f6aSNate Lawson 
25053289f6aSNate Lawson void
25153289f6aSNate Lawson FlWriteFile (
25253289f6aSNate Lawson     UINT32                  FileId,
25353289f6aSNate Lawson     void                    *Buffer,
25453289f6aSNate Lawson     UINT32                  Length)
25553289f6aSNate Lawson {
25653289f6aSNate Lawson     UINT32                  Actual;
25753289f6aSNate Lawson 
25853289f6aSNate Lawson 
25953289f6aSNate Lawson     /* Write and check for error */
26053289f6aSNate Lawson 
26153289f6aSNate Lawson     Actual = fwrite ((char *) Buffer, 1, Length, Gbl_Files[FileId].Handle);
26253289f6aSNate Lawson     if (Actual != Length)
26353289f6aSNate Lawson     {
26453289f6aSNate Lawson         FlFileError (FileId, ASL_MSG_WRITE);
26553289f6aSNate Lawson         AslAbort ();
26653289f6aSNate Lawson     }
26753289f6aSNate Lawson }
26853289f6aSNate Lawson 
26953289f6aSNate Lawson 
27053289f6aSNate Lawson /*******************************************************************************
27153289f6aSNate Lawson  *
27253289f6aSNate Lawson  * FUNCTION:    FlPrintFile
27353289f6aSNate Lawson  *
27453289f6aSNate Lawson  * PARAMETERS:  FileId              - Index into file info array
27553289f6aSNate Lawson  *              Format              - Printf format string
27653289f6aSNate Lawson  *              ...                 - Printf arguments
27753289f6aSNate Lawson  *
27853289f6aSNate Lawson  * RETURN:      None
27953289f6aSNate Lawson  *
28053289f6aSNate Lawson  * DESCRIPTION: Formatted write to an open file.
28153289f6aSNate Lawson  *              NOTE: Aborts compiler on any error.
28253289f6aSNate Lawson  *
28353289f6aSNate Lawson  ******************************************************************************/
28453289f6aSNate Lawson 
28553289f6aSNate Lawson void
28653289f6aSNate Lawson FlPrintFile (
28753289f6aSNate Lawson     UINT32                  FileId,
28853289f6aSNate Lawson     char                    *Format,
28953289f6aSNate Lawson     ...)
29053289f6aSNate Lawson {
29153289f6aSNate Lawson     INT32                   Actual;
29253289f6aSNate Lawson     va_list                 Args;
29353289f6aSNate Lawson 
29453289f6aSNate Lawson 
29553289f6aSNate Lawson     va_start (Args, Format);
29653289f6aSNate Lawson 
29753289f6aSNate Lawson     Actual = vfprintf (Gbl_Files[FileId].Handle, Format, Args);
298a9f12690SJung-uk Kim     va_end (Args);
299a9f12690SJung-uk Kim 
30053289f6aSNate Lawson     if (Actual == -1)
30153289f6aSNate Lawson     {
30253289f6aSNate Lawson         FlFileError (FileId, ASL_MSG_WRITE);
30353289f6aSNate Lawson         AslAbort ();
30453289f6aSNate Lawson     }
30553289f6aSNate Lawson }
30653289f6aSNate Lawson 
30753289f6aSNate Lawson 
30853289f6aSNate Lawson /*******************************************************************************
30953289f6aSNate Lawson  *
31053289f6aSNate Lawson  * FUNCTION:    FlSeekFile
31153289f6aSNate Lawson  *
31253289f6aSNate Lawson  * PARAMETERS:  FileId              - Index into file info array
31353289f6aSNate Lawson  *              Offset              - Absolute byte offset in file
31453289f6aSNate Lawson  *
315fba7fc7eSJung-uk Kim  * RETURN:      None
31653289f6aSNate Lawson  *
31753289f6aSNate Lawson  * DESCRIPTION: Seek to absolute offset
31853289f6aSNate Lawson  *              NOTE: Aborts compiler on any error.
31953289f6aSNate Lawson  *
32053289f6aSNate Lawson  ******************************************************************************/
32153289f6aSNate Lawson 
32253289f6aSNate Lawson void
32353289f6aSNate Lawson FlSeekFile (
32453289f6aSNate Lawson     UINT32                  FileId,
32553289f6aSNate Lawson     long                    Offset)
32653289f6aSNate Lawson {
32753289f6aSNate Lawson     int                     Error;
32853289f6aSNate Lawson 
32953289f6aSNate Lawson 
33053289f6aSNate Lawson     Error = fseek (Gbl_Files[FileId].Handle, Offset, SEEK_SET);
33153289f6aSNate Lawson     if (Error)
33253289f6aSNate Lawson     {
33353289f6aSNate Lawson         FlFileError (FileId, ASL_MSG_SEEK);
33453289f6aSNate Lawson         AslAbort ();
33553289f6aSNate Lawson     }
33653289f6aSNate Lawson }
33753289f6aSNate Lawson 
33853289f6aSNate Lawson 
33953289f6aSNate Lawson /*******************************************************************************
34053289f6aSNate Lawson  *
34153289f6aSNate Lawson  * FUNCTION:    FlCloseFile
34253289f6aSNate Lawson  *
34353289f6aSNate Lawson  * PARAMETERS:  FileId              - Index into file info array
34453289f6aSNate Lawson  *
345fba7fc7eSJung-uk Kim  * RETURN:      None
34653289f6aSNate Lawson  *
34753289f6aSNate Lawson  * DESCRIPTION: Close an open file. Aborts compiler on error
34853289f6aSNate Lawson  *
34953289f6aSNate Lawson  ******************************************************************************/
35053289f6aSNate Lawson 
35153289f6aSNate Lawson void
35253289f6aSNate Lawson FlCloseFile (
35353289f6aSNate Lawson     UINT32                  FileId)
35453289f6aSNate Lawson {
35553289f6aSNate Lawson     int                     Error;
35653289f6aSNate Lawson 
35753289f6aSNate Lawson 
35853289f6aSNate Lawson     if (!Gbl_Files[FileId].Handle)
35953289f6aSNate Lawson     {
36053289f6aSNate Lawson         return;
36153289f6aSNate Lawson     }
36253289f6aSNate Lawson 
36353289f6aSNate Lawson     Error = fclose (Gbl_Files[FileId].Handle);
36453289f6aSNate Lawson     if (Error)
36553289f6aSNate Lawson     {
36653289f6aSNate Lawson         FlFileError (FileId, ASL_MSG_CLOSE);
36753289f6aSNate Lawson         AslAbort ();
36853289f6aSNate Lawson     }
36953289f6aSNate Lawson 
3704c52cad2SJung-uk Kim     Gbl_Files[FileId].Handle = NULL;
37153289f6aSNate Lawson     return;
37253289f6aSNate Lawson }
37353289f6aSNate Lawson 
37453289f6aSNate Lawson 
37553289f6aSNate Lawson /*******************************************************************************
37653289f6aSNate Lawson  *
377042ff955SJung-uk Kim  * FUNCTION:    FlDeleteFile
378042ff955SJung-uk Kim  *
379042ff955SJung-uk Kim  * PARAMETERS:  FileId              - Index into file info array
380042ff955SJung-uk Kim  *
381042ff955SJung-uk Kim  * RETURN:      None
382042ff955SJung-uk Kim  *
383042ff955SJung-uk Kim  * DESCRIPTION: Delete a file.
384042ff955SJung-uk Kim  *
385042ff955SJung-uk Kim  ******************************************************************************/
386042ff955SJung-uk Kim 
387042ff955SJung-uk Kim void
388042ff955SJung-uk Kim FlDeleteFile (
389042ff955SJung-uk Kim     UINT32                  FileId)
390042ff955SJung-uk Kim {
391042ff955SJung-uk Kim     ASL_FILE_INFO           *Info = &Gbl_Files[FileId];
392042ff955SJung-uk Kim 
393042ff955SJung-uk Kim 
394042ff955SJung-uk Kim     if (!Info->Filename)
395042ff955SJung-uk Kim     {
396042ff955SJung-uk Kim         return;
397042ff955SJung-uk Kim     }
398042ff955SJung-uk Kim 
399042ff955SJung-uk Kim     if (remove (Info->Filename))
400042ff955SJung-uk Kim     {
401042ff955SJung-uk Kim         printf ("%s (%s file) ",
402042ff955SJung-uk Kim             Info->Filename, Info->Description);
403042ff955SJung-uk Kim         perror ("Could not delete");
404042ff955SJung-uk Kim     }
405042ff955SJung-uk Kim 
406042ff955SJung-uk Kim     Info->Filename = NULL;
407042ff955SJung-uk Kim     return;
408042ff955SJung-uk Kim }
409042ff955SJung-uk Kim 
410042ff955SJung-uk Kim 
411042ff955SJung-uk Kim /*******************************************************************************
412042ff955SJung-uk Kim  *
41353289f6aSNate Lawson  * FUNCTION:    FlSetLineNumber
41453289f6aSNate Lawson  *
41553289f6aSNate Lawson  * PARAMETERS:  Op        - Parse node for the LINE asl statement
41653289f6aSNate Lawson  *
41753289f6aSNate Lawson  * RETURN:      None.
41853289f6aSNate Lawson  *
41953289f6aSNate Lawson  * DESCRIPTION: Set the current line number
42053289f6aSNate Lawson  *
42153289f6aSNate Lawson  ******************************************************************************/
42253289f6aSNate Lawson 
42353289f6aSNate Lawson void
42453289f6aSNate Lawson FlSetLineNumber (
425eef1b955SJung-uk Kim     UINT32                  LineNumber)
42653289f6aSNate Lawson {
42753289f6aSNate Lawson 
428eef1b955SJung-uk Kim     DbgPrint (ASL_PARSE_OUTPUT, "\n#line: New line number %u (old %u)\n",
429eef1b955SJung-uk Kim          LineNumber, Gbl_LogicalLineNumber);
430eef1b955SJung-uk Kim 
431eef1b955SJung-uk Kim     Gbl_CurrentLineNumber = LineNumber;
432eef1b955SJung-uk Kim     Gbl_LogicalLineNumber = LineNumber;
433eef1b955SJung-uk Kim }
434eef1b955SJung-uk Kim 
435eef1b955SJung-uk Kim 
436eef1b955SJung-uk Kim /*******************************************************************************
437eef1b955SJung-uk Kim  *
438eef1b955SJung-uk Kim  * FUNCTION:    FlSetFilename
439eef1b955SJung-uk Kim  *
440eef1b955SJung-uk Kim  * PARAMETERS:  Op        - Parse node for the LINE asl statement
441eef1b955SJung-uk Kim  *
442eef1b955SJung-uk Kim  * RETURN:      None.
443eef1b955SJung-uk Kim  *
444eef1b955SJung-uk Kim  * DESCRIPTION: Set the current filename
445eef1b955SJung-uk Kim  *
446eef1b955SJung-uk Kim  ******************************************************************************/
447eef1b955SJung-uk Kim 
448eef1b955SJung-uk Kim void
449eef1b955SJung-uk Kim FlSetFilename (
450eef1b955SJung-uk Kim     char                    *Filename)
451eef1b955SJung-uk Kim {
452eef1b955SJung-uk Kim 
453eef1b955SJung-uk Kim     DbgPrint (ASL_PARSE_OUTPUT, "\n#line: New filename %s (old %s)\n",
454eef1b955SJung-uk Kim          Filename, Gbl_Files[ASL_FILE_INPUT].Filename);
455eef1b955SJung-uk Kim 
456eef1b955SJung-uk Kim     Gbl_Files[ASL_FILE_INPUT].Filename = Filename;
45753289f6aSNate Lawson }
45853289f6aSNate Lawson 
45953289f6aSNate Lawson 
46053289f6aSNate Lawson /*******************************************************************************
46153289f6aSNate Lawson  *
462d6dd1baeSJung-uk Kim  * FUNCTION:    FlAddIncludeDirectory
463d6dd1baeSJung-uk Kim  *
464d6dd1baeSJung-uk Kim  * PARAMETERS:  Dir             - Directory pathname string
465d6dd1baeSJung-uk Kim  *
466d6dd1baeSJung-uk Kim  * RETURN:      None
467d6dd1baeSJung-uk Kim  *
468d6dd1baeSJung-uk Kim  * DESCRIPTION: Add a directory the list of include prefix directories.
469d6dd1baeSJung-uk Kim  *
470d6dd1baeSJung-uk Kim  ******************************************************************************/
471d6dd1baeSJung-uk Kim 
472d6dd1baeSJung-uk Kim void
473d6dd1baeSJung-uk Kim FlAddIncludeDirectory (
474d6dd1baeSJung-uk Kim     char                    *Dir)
475d6dd1baeSJung-uk Kim {
476d6dd1baeSJung-uk Kim     ASL_INCLUDE_DIR         *NewDir;
477d6dd1baeSJung-uk Kim     ASL_INCLUDE_DIR         *NextDir;
478d6dd1baeSJung-uk Kim     ASL_INCLUDE_DIR         *PrevDir = NULL;
479d6dd1baeSJung-uk Kim     UINT32                  NeedsSeparator = 0;
480d6dd1baeSJung-uk Kim     size_t                  DirLength;
481d6dd1baeSJung-uk Kim 
482d6dd1baeSJung-uk Kim 
483d6dd1baeSJung-uk Kim     DirLength = strlen (Dir);
484d6dd1baeSJung-uk Kim     if (!DirLength)
485d6dd1baeSJung-uk Kim     {
486d6dd1baeSJung-uk Kim         return;
487d6dd1baeSJung-uk Kim     }
488d6dd1baeSJung-uk Kim 
489d6dd1baeSJung-uk Kim     /* Make sure that the pathname ends with a path separator */
490d6dd1baeSJung-uk Kim 
491d6dd1baeSJung-uk Kim     if ((Dir[DirLength-1] != '/') &&
492d6dd1baeSJung-uk Kim         (Dir[DirLength-1] != '\\'))
493d6dd1baeSJung-uk Kim     {
494d6dd1baeSJung-uk Kim         NeedsSeparator = 1;
495d6dd1baeSJung-uk Kim     }
496d6dd1baeSJung-uk Kim 
497d6dd1baeSJung-uk Kim     NewDir = ACPI_ALLOCATE_ZEROED (sizeof (ASL_INCLUDE_DIR));
498d6dd1baeSJung-uk Kim     NewDir->Dir = ACPI_ALLOCATE (DirLength + 1 + NeedsSeparator);
499d6dd1baeSJung-uk Kim     strcpy (NewDir->Dir, Dir);
500d6dd1baeSJung-uk Kim     if (NeedsSeparator)
501d6dd1baeSJung-uk Kim     {
502d6dd1baeSJung-uk Kim         strcat (NewDir->Dir, "/");
503d6dd1baeSJung-uk Kim     }
504d6dd1baeSJung-uk Kim 
505d6dd1baeSJung-uk Kim     /*
506d6dd1baeSJung-uk Kim      * Preserve command line ordering of -I options by adding new elements
507d6dd1baeSJung-uk Kim      * at the end of the list
508d6dd1baeSJung-uk Kim      */
509d6dd1baeSJung-uk Kim     NextDir = Gbl_IncludeDirList;
510d6dd1baeSJung-uk Kim     while (NextDir)
511d6dd1baeSJung-uk Kim     {
512d6dd1baeSJung-uk Kim         PrevDir = NextDir;
513d6dd1baeSJung-uk Kim         NextDir = NextDir->Next;
514d6dd1baeSJung-uk Kim     }
515d6dd1baeSJung-uk Kim 
516d6dd1baeSJung-uk Kim     if (PrevDir)
517d6dd1baeSJung-uk Kim     {
518d6dd1baeSJung-uk Kim         PrevDir->Next = NewDir;
519d6dd1baeSJung-uk Kim     }
520d6dd1baeSJung-uk Kim     else
521d6dd1baeSJung-uk Kim     {
522d6dd1baeSJung-uk Kim         Gbl_IncludeDirList = NewDir;
523d6dd1baeSJung-uk Kim     }
524d6dd1baeSJung-uk Kim }
525d6dd1baeSJung-uk Kim 
526d6dd1baeSJung-uk Kim 
527d6dd1baeSJung-uk Kim /*******************************************************************************
528d6dd1baeSJung-uk Kim  *
529a7a3b383SJung-uk Kim  * FUNCTION:    FlMergePathnames
530a7a3b383SJung-uk Kim  *
531a7a3b383SJung-uk Kim  * PARAMETERS:  PrefixDir       - Prefix directory pathname. Can be NULL or
532a7a3b383SJung-uk Kim  *                                a zero length string.
533a7a3b383SJung-uk Kim  *              FilePathname    - The include filename from the source ASL.
534a7a3b383SJung-uk Kim  *
535a7a3b383SJung-uk Kim  * RETURN:      Merged pathname string
536a7a3b383SJung-uk Kim  *
537a7a3b383SJung-uk Kim  * DESCRIPTION: Merge two pathnames that (probably) have common elements, to
538a7a3b383SJung-uk Kim  *              arrive at a minimal length string. Merge can occur if the
539a7a3b383SJung-uk Kim  *              FilePathname is relative to the PrefixDir.
540a7a3b383SJung-uk Kim  *
541a7a3b383SJung-uk Kim  ******************************************************************************/
542a7a3b383SJung-uk Kim 
543a7a3b383SJung-uk Kim char *
544a7a3b383SJung-uk Kim FlMergePathnames (
545a7a3b383SJung-uk Kim     char                    *PrefixDir,
546a7a3b383SJung-uk Kim     char                    *FilePathname)
547a7a3b383SJung-uk Kim {
548a7a3b383SJung-uk Kim     char                    *CommonPath;
549a7a3b383SJung-uk Kim     char                    *Pathname;
550a7a3b383SJung-uk Kim     char                    *LastElement;
551a7a3b383SJung-uk Kim 
552a7a3b383SJung-uk Kim 
553a7a3b383SJung-uk Kim     DbgPrint (ASL_PARSE_OUTPUT, "Include: Prefix path - \"%s\"\n"
554a7a3b383SJung-uk Kim         "Include: FilePathname - \"%s\"\n",
555a7a3b383SJung-uk Kim          PrefixDir, FilePathname);
556a7a3b383SJung-uk Kim 
557a7a3b383SJung-uk Kim     /*
558a7a3b383SJung-uk Kim      * If there is no prefix directory or if the file pathname is absolute,
559a7a3b383SJung-uk Kim      * just return the original file pathname
560a7a3b383SJung-uk Kim      */
561a7a3b383SJung-uk Kim     if (!PrefixDir || (!*PrefixDir) ||
562a7a3b383SJung-uk Kim         (*FilePathname == '/') ||
563a7a3b383SJung-uk Kim          (FilePathname[1] == ':'))
564a7a3b383SJung-uk Kim     {
565a7a3b383SJung-uk Kim         Pathname = ACPI_ALLOCATE (strlen (FilePathname) + 1);
566a7a3b383SJung-uk Kim         strcpy (Pathname, FilePathname);
567a7a3b383SJung-uk Kim         goto ConvertBackslashes;
568a7a3b383SJung-uk Kim     }
569a7a3b383SJung-uk Kim 
570a7a3b383SJung-uk Kim     /* Need a local copy of the prefix directory path */
571a7a3b383SJung-uk Kim 
572a7a3b383SJung-uk Kim     CommonPath = ACPI_ALLOCATE (strlen (PrefixDir) + 1);
573a7a3b383SJung-uk Kim     strcpy (CommonPath, PrefixDir);
574a7a3b383SJung-uk Kim 
575a7a3b383SJung-uk Kim     /*
576a7a3b383SJung-uk Kim      * Walk forward through the file path, and simultaneously backward
577a7a3b383SJung-uk Kim      * through the prefix directory path until there are no more
578a7a3b383SJung-uk Kim      * relative references at the start of the file path.
579a7a3b383SJung-uk Kim      */
580a7a3b383SJung-uk Kim     while (*FilePathname && (!strncmp (FilePathname, "../", 3)))
581a7a3b383SJung-uk Kim     {
582a7a3b383SJung-uk Kim         /* Remove last element of the prefix directory path */
583a7a3b383SJung-uk Kim 
584a7a3b383SJung-uk Kim         LastElement = strrchr (CommonPath, '/');
585a7a3b383SJung-uk Kim         if (!LastElement)
586a7a3b383SJung-uk Kim         {
587a7a3b383SJung-uk Kim             goto ConcatenatePaths;
588a7a3b383SJung-uk Kim         }
589a7a3b383SJung-uk Kim 
590a7a3b383SJung-uk Kim         *LastElement = 0;   /* Terminate CommonPath string */
591a7a3b383SJung-uk Kim         FilePathname += 3;  /* Point to next path element */
592a7a3b383SJung-uk Kim     }
593a7a3b383SJung-uk Kim 
594a7a3b383SJung-uk Kim     /*
595a7a3b383SJung-uk Kim      * Remove the last element of the prefix directory path (it is the same as
596a7a3b383SJung-uk Kim      * the first element of the file pathname), and build the final merged
597a7a3b383SJung-uk Kim      * pathname.
598a7a3b383SJung-uk Kim      */
599a7a3b383SJung-uk Kim     LastElement = strrchr (CommonPath, '/');
600a7a3b383SJung-uk Kim     if (LastElement)
601a7a3b383SJung-uk Kim     {
602a7a3b383SJung-uk Kim         *LastElement = 0;
603a7a3b383SJung-uk Kim     }
604a7a3b383SJung-uk Kim 
605a7a3b383SJung-uk Kim     /* Build the final merged pathname */
606a7a3b383SJung-uk Kim 
607a7a3b383SJung-uk Kim ConcatenatePaths:
608a7a3b383SJung-uk Kim     Pathname = ACPI_ALLOCATE_ZEROED (strlen (CommonPath) + strlen (FilePathname) + 2);
609a7a3b383SJung-uk Kim     if (LastElement && *CommonPath)
610a7a3b383SJung-uk Kim     {
611a7a3b383SJung-uk Kim         strcpy (Pathname, CommonPath);
612a7a3b383SJung-uk Kim         strcat (Pathname, "/");
613a7a3b383SJung-uk Kim     }
614a7a3b383SJung-uk Kim     strcat (Pathname, FilePathname);
615a7a3b383SJung-uk Kim     ACPI_FREE (CommonPath);
616a7a3b383SJung-uk Kim 
617a7a3b383SJung-uk Kim     /* Convert all backslashes to normal slashes */
618a7a3b383SJung-uk Kim 
619a7a3b383SJung-uk Kim ConvertBackslashes:
620a7a3b383SJung-uk Kim     UtConvertBackslashes (Pathname);
621a7a3b383SJung-uk Kim 
622a7a3b383SJung-uk Kim     DbgPrint (ASL_PARSE_OUTPUT, "Include: Merged Pathname - \"%s\"\n",
623a7a3b383SJung-uk Kim          Pathname);
624a7a3b383SJung-uk Kim     return (Pathname);
625a7a3b383SJung-uk Kim }
626a7a3b383SJung-uk Kim 
627a7a3b383SJung-uk Kim 
628a7a3b383SJung-uk Kim /*******************************************************************************
629a7a3b383SJung-uk Kim  *
630d6dd1baeSJung-uk Kim  * FUNCTION:    FlOpenIncludeWithPrefix
631d6dd1baeSJung-uk Kim  *
632d6dd1baeSJung-uk Kim  * PARAMETERS:  PrefixDir       - Prefix directory pathname. Can be a zero
633d6dd1baeSJung-uk Kim  *                                length string.
634d6dd1baeSJung-uk Kim  *              Filename        - The include filename from the source ASL.
635d6dd1baeSJung-uk Kim  *
636d6dd1baeSJung-uk Kim  * RETURN:      Valid file descriptor if successful. Null otherwise.
637d6dd1baeSJung-uk Kim  *
638d6dd1baeSJung-uk Kim  * DESCRIPTION: Open an include file and push it on the input file stack.
639d6dd1baeSJung-uk Kim  *
640d6dd1baeSJung-uk Kim  ******************************************************************************/
641d6dd1baeSJung-uk Kim 
6424c52cad2SJung-uk Kim FILE *
643d6dd1baeSJung-uk Kim FlOpenIncludeWithPrefix (
644d6dd1baeSJung-uk Kim     char                    *PrefixDir,
645d6dd1baeSJung-uk Kim     char                    *Filename)
646d6dd1baeSJung-uk Kim {
647d6dd1baeSJung-uk Kim     FILE                    *IncludeFile;
648d6dd1baeSJung-uk Kim     char                    *Pathname;
649d6dd1baeSJung-uk Kim 
650d6dd1baeSJung-uk Kim 
651d6dd1baeSJung-uk Kim     /* Build the full pathname to the file */
652d6dd1baeSJung-uk Kim 
653a7a3b383SJung-uk Kim     Pathname = FlMergePathnames (PrefixDir, Filename);
654d6dd1baeSJung-uk Kim 
655a7a3b383SJung-uk Kim     DbgPrint (ASL_PARSE_OUTPUT, "Include: Opening file - \"%s\"\n\n",
656d6dd1baeSJung-uk Kim         Pathname);
657d6dd1baeSJung-uk Kim 
658d6dd1baeSJung-uk Kim     /* Attempt to open the file, push if successful */
659d6dd1baeSJung-uk Kim 
660d6dd1baeSJung-uk Kim     IncludeFile = fopen (Pathname, "r");
661ed17e06eSJung-uk Kim     if (!IncludeFile)
662d6dd1baeSJung-uk Kim     {
663ed17e06eSJung-uk Kim         fprintf (stderr, "Could not open include file %s\n", Pathname);
664ed17e06eSJung-uk Kim         ACPI_FREE (Pathname);
665ed17e06eSJung-uk Kim         return (NULL);
666ed17e06eSJung-uk Kim     }
667ed17e06eSJung-uk Kim 
668d6dd1baeSJung-uk Kim     /* Push the include file on the open input file stack */
669d6dd1baeSJung-uk Kim 
670d6dd1baeSJung-uk Kim     AslPushInputFileStack (IncludeFile, Pathname);
671d6dd1baeSJung-uk Kim     return (IncludeFile);
672d6dd1baeSJung-uk Kim }
673d6dd1baeSJung-uk Kim 
674d6dd1baeSJung-uk Kim 
675d6dd1baeSJung-uk Kim /*******************************************************************************
676d6dd1baeSJung-uk Kim  *
67753289f6aSNate Lawson  * FUNCTION:    FlOpenIncludeFile
67853289f6aSNate Lawson  *
67953289f6aSNate Lawson  * PARAMETERS:  Op        - Parse node for the INCLUDE ASL statement
68053289f6aSNate Lawson  *
68153289f6aSNate Lawson  * RETURN:      None.
68253289f6aSNate Lawson  *
68353289f6aSNate Lawson  * DESCRIPTION: Open an include file and push it on the input file stack.
68453289f6aSNate Lawson  *
68553289f6aSNate Lawson  ******************************************************************************/
68653289f6aSNate Lawson 
68753289f6aSNate Lawson void
68853289f6aSNate Lawson FlOpenIncludeFile (
68953289f6aSNate Lawson     ACPI_PARSE_OBJECT       *Op)
69053289f6aSNate Lawson {
691d6dd1baeSJung-uk Kim     FILE                    *IncludeFile;
692d6dd1baeSJung-uk Kim     ASL_INCLUDE_DIR         *NextDir;
69353289f6aSNate Lawson 
69453289f6aSNate Lawson 
69553289f6aSNate Lawson     /* Op must be valid */
69653289f6aSNate Lawson 
69753289f6aSNate Lawson     if (!Op)
69853289f6aSNate Lawson     {
69953289f6aSNate Lawson         AslCommonError (ASL_ERROR, ASL_MSG_INCLUDE_FILE_OPEN,
70053289f6aSNate Lawson             Gbl_CurrentLineNumber, Gbl_LogicalLineNumber,
70153289f6aSNate Lawson             Gbl_InputByteCount, Gbl_CurrentColumn,
70253289f6aSNate Lawson             Gbl_Files[ASL_FILE_INPUT].Filename, " - Null parse node");
70353289f6aSNate Lawson 
70453289f6aSNate Lawson         return;
70553289f6aSNate Lawson     }
70653289f6aSNate Lawson 
70753289f6aSNate Lawson     /*
70853289f6aSNate Lawson      * Flush out the "include ()" statement on this line, start
70953289f6aSNate Lawson      * the actual include file on the next line
71053289f6aSNate Lawson      */
711eef1b955SJung-uk Kim     AslResetCurrentLineBuffer ();
71253289f6aSNate Lawson     FlPrintFile (ASL_FILE_SOURCE_OUTPUT, "\n");
71353289f6aSNate Lawson     Gbl_CurrentLineOffset++;
71453289f6aSNate Lawson 
71553289f6aSNate Lawson 
716d6dd1baeSJung-uk Kim     /* Attempt to open the include file */
717d6dd1baeSJung-uk Kim 
718d6dd1baeSJung-uk Kim     /* If the file specifies an absolute path, just open it */
719d6dd1baeSJung-uk Kim 
720d6dd1baeSJung-uk Kim     if ((Op->Asl.Value.String[0] == '/')  ||
721d6dd1baeSJung-uk Kim         (Op->Asl.Value.String[0] == '\\') ||
722d6dd1baeSJung-uk Kim         (Op->Asl.Value.String[1] == ':'))
72353289f6aSNate Lawson     {
724d6dd1baeSJung-uk Kim         IncludeFile = FlOpenIncludeWithPrefix ("", Op->Asl.Value.String);
725d6dd1baeSJung-uk Kim         if (!IncludeFile)
726d6dd1baeSJung-uk Kim         {
727d6dd1baeSJung-uk Kim             goto ErrorExit;
728d6dd1baeSJung-uk Kim         }
72953289f6aSNate Lawson         return;
73053289f6aSNate Lawson     }
73153289f6aSNate Lawson 
732d6dd1baeSJung-uk Kim     /*
733d6dd1baeSJung-uk Kim      * The include filename is not an absolute path.
734d6dd1baeSJung-uk Kim      *
735d6dd1baeSJung-uk Kim      * First, search for the file within the "local" directory -- meaning
736d6dd1baeSJung-uk Kim      * the same directory that contains the source file.
737d6dd1baeSJung-uk Kim      *
738d6dd1baeSJung-uk Kim      * Construct the file pathname from the global directory name.
739d6dd1baeSJung-uk Kim      */
740d6dd1baeSJung-uk Kim     IncludeFile = FlOpenIncludeWithPrefix (Gbl_DirectoryPath, Op->Asl.Value.String);
741d6dd1baeSJung-uk Kim     if (IncludeFile)
742d6dd1baeSJung-uk Kim     {
743d6dd1baeSJung-uk Kim         return;
744d6dd1baeSJung-uk Kim     }
74553289f6aSNate Lawson 
746d6dd1baeSJung-uk Kim     /*
747d6dd1baeSJung-uk Kim      * Second, search for the file within the (possibly multiple) directories
748d6dd1baeSJung-uk Kim      * specified by the -I option on the command line.
749d6dd1baeSJung-uk Kim      */
750d6dd1baeSJung-uk Kim     NextDir = Gbl_IncludeDirList;
751d6dd1baeSJung-uk Kim     while (NextDir)
752d6dd1baeSJung-uk Kim     {
753d6dd1baeSJung-uk Kim         IncludeFile = FlOpenIncludeWithPrefix (NextDir->Dir, Op->Asl.Value.String);
754d6dd1baeSJung-uk Kim         if (IncludeFile)
755d6dd1baeSJung-uk Kim         {
756d6dd1baeSJung-uk Kim             return;
757d6dd1baeSJung-uk Kim         }
758d6dd1baeSJung-uk Kim 
759d6dd1baeSJung-uk Kim         NextDir = NextDir->Next;
760d6dd1baeSJung-uk Kim     }
761d6dd1baeSJung-uk Kim 
762d6dd1baeSJung-uk Kim     /* We could not open the include file after trying very hard */
763d6dd1baeSJung-uk Kim 
764d6dd1baeSJung-uk Kim ErrorExit:
765d6dd1baeSJung-uk Kim     sprintf (MsgBuffer, "%s, %s", Op->Asl.Value.String, strerror (errno));
766d6dd1baeSJung-uk Kim     AslError (ASL_ERROR, ASL_MSG_INCLUDE_FILE_OPEN, Op, MsgBuffer);
76753289f6aSNate Lawson }
76853289f6aSNate Lawson 
76953289f6aSNate Lawson 
77053289f6aSNate Lawson /*******************************************************************************
77153289f6aSNate Lawson  *
772fba7fc7eSJung-uk Kim  * FUNCTION:    FlOpenInputFile
773fba7fc7eSJung-uk Kim  *
774fba7fc7eSJung-uk Kim  * PARAMETERS:  InputFilename       - The user-specified ASL source file to be
775fba7fc7eSJung-uk Kim  *                                    compiled
776fba7fc7eSJung-uk Kim  *
777fba7fc7eSJung-uk Kim  * RETURN:      Status
778fba7fc7eSJung-uk Kim  *
779fba7fc7eSJung-uk Kim  * DESCRIPTION: Open the specified input file, and save the directory path to
780fba7fc7eSJung-uk Kim  *              the file so that include files can be opened in
781fba7fc7eSJung-uk Kim  *              the same directory.
782fba7fc7eSJung-uk Kim  *
783fba7fc7eSJung-uk Kim  ******************************************************************************/
784fba7fc7eSJung-uk Kim 
785fba7fc7eSJung-uk Kim ACPI_STATUS
786fba7fc7eSJung-uk Kim FlOpenInputFile (
787fba7fc7eSJung-uk Kim     char                    *InputFilename)
788fba7fc7eSJung-uk Kim {
789fba7fc7eSJung-uk Kim 
790fba7fc7eSJung-uk Kim     /* Open the input ASL file, text mode */
791fba7fc7eSJung-uk Kim 
792f38b0f21SJung-uk Kim     FlOpenFile (ASL_FILE_INPUT, InputFilename, "rt");
793fba7fc7eSJung-uk Kim     AslCompilerin = Gbl_Files[ASL_FILE_INPUT].Handle;
794fba7fc7eSJung-uk Kim 
795fba7fc7eSJung-uk Kim     return (AE_OK);
796fba7fc7eSJung-uk Kim }
797fba7fc7eSJung-uk Kim 
798fba7fc7eSJung-uk Kim 
799fba7fc7eSJung-uk Kim /*******************************************************************************
800fba7fc7eSJung-uk Kim  *
801fba7fc7eSJung-uk Kim  * FUNCTION:    FlOpenAmlOutputFile
802fba7fc7eSJung-uk Kim  *
803fba7fc7eSJung-uk Kim  * PARAMETERS:  FilenamePrefix       - The user-specified ASL source file
804fba7fc7eSJung-uk Kim  *
805fba7fc7eSJung-uk Kim  * RETURN:      Status
806fba7fc7eSJung-uk Kim  *
807fba7fc7eSJung-uk Kim  * DESCRIPTION: Create the output filename (*.AML) and open the file. The file
808fba7fc7eSJung-uk Kim  *              is created in the same directory as the parent input file.
809fba7fc7eSJung-uk Kim  *
810fba7fc7eSJung-uk Kim  ******************************************************************************/
811fba7fc7eSJung-uk Kim 
812fba7fc7eSJung-uk Kim ACPI_STATUS
813fba7fc7eSJung-uk Kim FlOpenAmlOutputFile (
814fba7fc7eSJung-uk Kim     char                    *FilenamePrefix)
815fba7fc7eSJung-uk Kim {
816fba7fc7eSJung-uk Kim     char                    *Filename;
817fba7fc7eSJung-uk Kim 
818fba7fc7eSJung-uk Kim 
819fba7fc7eSJung-uk Kim     /* Output filename usually comes from the ASL itself */
820fba7fc7eSJung-uk Kim 
821fba7fc7eSJung-uk Kim     Filename = Gbl_Files[ASL_FILE_AML_OUTPUT].Filename;
822fba7fc7eSJung-uk Kim     if (!Filename)
823fba7fc7eSJung-uk Kim     {
824fba7fc7eSJung-uk Kim         /* Create the output AML filename */
825fba7fc7eSJung-uk Kim 
826fba7fc7eSJung-uk Kim         Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_AML_CODE);
827fba7fc7eSJung-uk Kim         if (!Filename)
828fba7fc7eSJung-uk Kim         {
829fba7fc7eSJung-uk Kim             AslCommonError (ASL_ERROR, ASL_MSG_OUTPUT_FILENAME,
830fba7fc7eSJung-uk Kim                 0, 0, 0, 0, NULL, NULL);
831fba7fc7eSJung-uk Kim             return (AE_ERROR);
832fba7fc7eSJung-uk Kim         }
833fba7fc7eSJung-uk Kim     }
834fba7fc7eSJung-uk Kim 
835fba7fc7eSJung-uk Kim     /* Open the output AML file in binary mode */
836fba7fc7eSJung-uk Kim 
837fba7fc7eSJung-uk Kim     FlOpenFile (ASL_FILE_AML_OUTPUT, Filename, "w+b");
838fba7fc7eSJung-uk Kim     return (AE_OK);
839fba7fc7eSJung-uk Kim }
840fba7fc7eSJung-uk Kim 
841fba7fc7eSJung-uk Kim 
842fba7fc7eSJung-uk Kim /*******************************************************************************
843fba7fc7eSJung-uk Kim  *
844fba7fc7eSJung-uk Kim  * FUNCTION:    FlOpenMiscOutputFiles
845fba7fc7eSJung-uk Kim  *
846fba7fc7eSJung-uk Kim  * PARAMETERS:  FilenamePrefix       - The user-specified ASL source file
847fba7fc7eSJung-uk Kim  *
848fba7fc7eSJung-uk Kim  * RETURN:      Status
849fba7fc7eSJung-uk Kim  *
850fba7fc7eSJung-uk Kim  * DESCRIPTION: Create and open the various output files needed, depending on
851fba7fc7eSJung-uk Kim  *              the command line options
852fba7fc7eSJung-uk Kim  *
853fba7fc7eSJung-uk Kim  ******************************************************************************/
854fba7fc7eSJung-uk Kim 
855fba7fc7eSJung-uk Kim ACPI_STATUS
856fba7fc7eSJung-uk Kim FlOpenMiscOutputFiles (
857fba7fc7eSJung-uk Kim     char                    *FilenamePrefix)
858fba7fc7eSJung-uk Kim {
859fba7fc7eSJung-uk Kim     char                    *Filename;
860fba7fc7eSJung-uk Kim 
861fba7fc7eSJung-uk Kim 
862a88e22b7SJung-uk Kim     /* Create/Open a hex output file if asked */
863a88e22b7SJung-uk Kim 
864a88e22b7SJung-uk Kim     if (Gbl_HexOutputFlag)
865a88e22b7SJung-uk Kim     {
866a88e22b7SJung-uk Kim         Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_HEX_DUMP);
867a88e22b7SJung-uk Kim         if (!Filename)
868a88e22b7SJung-uk Kim         {
869a88e22b7SJung-uk Kim             AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME,
870a88e22b7SJung-uk Kim                 0, 0, 0, 0, NULL, NULL);
871a88e22b7SJung-uk Kim             return (AE_ERROR);
872a88e22b7SJung-uk Kim         }
873a88e22b7SJung-uk Kim 
874a88e22b7SJung-uk Kim         /* Open the hex file, text mode */
875a88e22b7SJung-uk Kim 
876f38b0f21SJung-uk Kim         FlOpenFile (ASL_FILE_HEX_OUTPUT, Filename, "w+t");
877a88e22b7SJung-uk Kim 
878a88e22b7SJung-uk Kim         AslCompilerSignon (ASL_FILE_HEX_OUTPUT);
879a88e22b7SJung-uk Kim         AslCompilerFileHeader (ASL_FILE_HEX_OUTPUT);
880a88e22b7SJung-uk Kim     }
881a88e22b7SJung-uk Kim 
882a88e22b7SJung-uk Kim     /* Create/Open a debug output file if asked */
883a88e22b7SJung-uk Kim 
884a88e22b7SJung-uk Kim     if (Gbl_DebugFlag)
885a88e22b7SJung-uk Kim     {
886a88e22b7SJung-uk Kim         Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_DEBUG);
887a88e22b7SJung-uk Kim         if (!Filename)
888a88e22b7SJung-uk Kim         {
889a88e22b7SJung-uk Kim             AslCommonError (ASL_ERROR, ASL_MSG_DEBUG_FILENAME,
890a88e22b7SJung-uk Kim                 0, 0, 0, 0, NULL, NULL);
891a88e22b7SJung-uk Kim             return (AE_ERROR);
892a88e22b7SJung-uk Kim         }
893a88e22b7SJung-uk Kim 
894a88e22b7SJung-uk Kim         /* Open the debug file as STDERR, text mode */
895a88e22b7SJung-uk Kim 
896a88e22b7SJung-uk Kim         /* TBD: hide this behind a FlReopenFile function */
897a88e22b7SJung-uk Kim 
898a88e22b7SJung-uk Kim         Gbl_Files[ASL_FILE_DEBUG_OUTPUT].Filename = Filename;
899a88e22b7SJung-uk Kim         Gbl_Files[ASL_FILE_DEBUG_OUTPUT].Handle =
900a88e22b7SJung-uk Kim             freopen (Filename, "w+t", stderr);
901a88e22b7SJung-uk Kim 
9024c52cad2SJung-uk Kim         if (!Gbl_Files[ASL_FILE_DEBUG_OUTPUT].Handle)
9034c52cad2SJung-uk Kim         {
9044c52cad2SJung-uk Kim             AslCommonError (ASL_ERROR, ASL_MSG_DEBUG_FILENAME,
9054c52cad2SJung-uk Kim                 0, 0, 0, 0, NULL, NULL);
9064c52cad2SJung-uk Kim             return (AE_ERROR);
9074c52cad2SJung-uk Kim         }
9084c52cad2SJung-uk Kim 
909a88e22b7SJung-uk Kim         AslCompilerSignon (ASL_FILE_DEBUG_OUTPUT);
910a88e22b7SJung-uk Kim         AslCompilerFileHeader (ASL_FILE_DEBUG_OUTPUT);
911a88e22b7SJung-uk Kim     }
912a88e22b7SJung-uk Kim 
913d244b227SJung-uk Kim     /* Create/Open a listing output file if asked */
914d244b227SJung-uk Kim 
915d244b227SJung-uk Kim     if (Gbl_ListingFlag)
916d244b227SJung-uk Kim     {
917d244b227SJung-uk Kim         Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_LISTING);
918d244b227SJung-uk Kim         if (!Filename)
919d244b227SJung-uk Kim         {
920d244b227SJung-uk Kim             AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME,
921d244b227SJung-uk Kim                 0, 0, 0, 0, NULL, NULL);
922d244b227SJung-uk Kim             return (AE_ERROR);
923d244b227SJung-uk Kim         }
924d244b227SJung-uk Kim 
925d244b227SJung-uk Kim         /* Open the listing file, text mode */
926d244b227SJung-uk Kim 
927f38b0f21SJung-uk Kim         FlOpenFile (ASL_FILE_LISTING_OUTPUT, Filename, "w+t");
928d244b227SJung-uk Kim 
929d244b227SJung-uk Kim         AslCompilerSignon (ASL_FILE_LISTING_OUTPUT);
930d244b227SJung-uk Kim         AslCompilerFileHeader (ASL_FILE_LISTING_OUTPUT);
931d244b227SJung-uk Kim     }
932d244b227SJung-uk Kim 
933eef1b955SJung-uk Kim     /* Create the preprocessor output file if preprocessor enabled */
9344c52cad2SJung-uk Kim 
935eef1b955SJung-uk Kim     if (Gbl_PreprocessFlag)
936eef1b955SJung-uk Kim     {
9374c52cad2SJung-uk Kim         Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_PREPROCESSOR);
9384c52cad2SJung-uk Kim         if (!Filename)
9394c52cad2SJung-uk Kim         {
9404c52cad2SJung-uk Kim             AslCommonError (ASL_ERROR, ASL_MSG_PREPROCESSOR_FILENAME,
9414c52cad2SJung-uk Kim                 0, 0, 0, 0, NULL, NULL);
9424c52cad2SJung-uk Kim             return (AE_ERROR);
9434c52cad2SJung-uk Kim         }
9444c52cad2SJung-uk Kim 
945f38b0f21SJung-uk Kim         FlOpenFile (ASL_FILE_PREPROCESSOR, Filename, "w+t");
946eef1b955SJung-uk Kim     }
9474c52cad2SJung-uk Kim 
9484c52cad2SJung-uk Kim     /* All done for data table compiler */
9494c52cad2SJung-uk Kim 
950a88e22b7SJung-uk Kim     if (Gbl_FileType == ASL_INPUT_TYPE_ASCII_DATA)
951a88e22b7SJung-uk Kim     {
952a88e22b7SJung-uk Kim         return (AE_OK);
953a88e22b7SJung-uk Kim     }
954a88e22b7SJung-uk Kim 
955fba7fc7eSJung-uk Kim     /* Create/Open a combined source output file */
956fba7fc7eSJung-uk Kim 
957fba7fc7eSJung-uk Kim     Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_SOURCE);
958fba7fc7eSJung-uk Kim     if (!Filename)
959fba7fc7eSJung-uk Kim     {
960fba7fc7eSJung-uk Kim         AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME,
961fba7fc7eSJung-uk Kim             0, 0, 0, 0, NULL, NULL);
962fba7fc7eSJung-uk Kim         return (AE_ERROR);
963fba7fc7eSJung-uk Kim     }
964fba7fc7eSJung-uk Kim 
965fba7fc7eSJung-uk Kim     /*
966fba7fc7eSJung-uk Kim      * Open the source output file, binary mode (so that LF does not get
967fba7fc7eSJung-uk Kim      * expanded to CR/LF on some systems, messing up our seek
968fba7fc7eSJung-uk Kim      * calculations.)
969fba7fc7eSJung-uk Kim      */
970fba7fc7eSJung-uk Kim     FlOpenFile (ASL_FILE_SOURCE_OUTPUT, Filename, "w+b");
971fba7fc7eSJung-uk Kim 
9724c52cad2SJung-uk Kim /*
9734c52cad2SJung-uk Kim // TBD: TEMP
9744c52cad2SJung-uk Kim //    AslCompilerin = Gbl_Files[ASL_FILE_SOURCE_OUTPUT].Handle;
9754c52cad2SJung-uk Kim */
976fba7fc7eSJung-uk Kim     /* Create/Open a assembly code source output file if asked */
977fba7fc7eSJung-uk Kim 
978fba7fc7eSJung-uk Kim     if (Gbl_AsmOutputFlag)
979fba7fc7eSJung-uk Kim     {
980fba7fc7eSJung-uk Kim         Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_ASM_SOURCE);
981fba7fc7eSJung-uk Kim         if (!Filename)
982fba7fc7eSJung-uk Kim         {
983fba7fc7eSJung-uk Kim             AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME,
984fba7fc7eSJung-uk Kim                 0, 0, 0, 0, NULL, NULL);
985fba7fc7eSJung-uk Kim             return (AE_ERROR);
986fba7fc7eSJung-uk Kim         }
987fba7fc7eSJung-uk Kim 
988fba7fc7eSJung-uk Kim         /* Open the assembly code source file, text mode */
989fba7fc7eSJung-uk Kim 
990f38b0f21SJung-uk Kim         FlOpenFile (ASL_FILE_ASM_SOURCE_OUTPUT, Filename, "w+t");
991fba7fc7eSJung-uk Kim 
992fba7fc7eSJung-uk Kim         AslCompilerSignon (ASL_FILE_ASM_SOURCE_OUTPUT);
993fba7fc7eSJung-uk Kim         AslCompilerFileHeader (ASL_FILE_ASM_SOURCE_OUTPUT);
994fba7fc7eSJung-uk Kim     }
995fba7fc7eSJung-uk Kim 
996fba7fc7eSJung-uk Kim     /* Create/Open a C code source output file if asked */
997fba7fc7eSJung-uk Kim 
998fba7fc7eSJung-uk Kim     if (Gbl_C_OutputFlag)
999fba7fc7eSJung-uk Kim     {
1000fba7fc7eSJung-uk Kim         Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_C_SOURCE);
1001fba7fc7eSJung-uk Kim         if (!Filename)
1002fba7fc7eSJung-uk Kim         {
1003fba7fc7eSJung-uk Kim             AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME,
1004fba7fc7eSJung-uk Kim                 0, 0, 0, 0, NULL, NULL);
1005fba7fc7eSJung-uk Kim             return (AE_ERROR);
1006fba7fc7eSJung-uk Kim         }
1007fba7fc7eSJung-uk Kim 
1008fba7fc7eSJung-uk Kim         /* Open the C code source file, text mode */
1009fba7fc7eSJung-uk Kim 
1010f38b0f21SJung-uk Kim         FlOpenFile (ASL_FILE_C_SOURCE_OUTPUT, Filename, "w+t");
1011fba7fc7eSJung-uk Kim 
1012fba7fc7eSJung-uk Kim         FlPrintFile (ASL_FILE_C_SOURCE_OUTPUT, "/*\n");
1013fba7fc7eSJung-uk Kim         AslCompilerSignon (ASL_FILE_C_SOURCE_OUTPUT);
1014fba7fc7eSJung-uk Kim         AslCompilerFileHeader (ASL_FILE_C_SOURCE_OUTPUT);
1015fba7fc7eSJung-uk Kim     }
1016fba7fc7eSJung-uk Kim 
1017fba7fc7eSJung-uk Kim     /* Create/Open a assembly include output file if asked */
1018fba7fc7eSJung-uk Kim 
1019fba7fc7eSJung-uk Kim     if (Gbl_AsmIncludeOutputFlag)
1020fba7fc7eSJung-uk Kim     {
1021fba7fc7eSJung-uk Kim         Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_ASM_INCLUDE);
1022fba7fc7eSJung-uk Kim         if (!Filename)
1023fba7fc7eSJung-uk Kim         {
1024fba7fc7eSJung-uk Kim             AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME,
1025fba7fc7eSJung-uk Kim                 0, 0, 0, 0, NULL, NULL);
1026fba7fc7eSJung-uk Kim             return (AE_ERROR);
1027fba7fc7eSJung-uk Kim         }
1028fba7fc7eSJung-uk Kim 
1029fba7fc7eSJung-uk Kim         /* Open the assembly include file, text mode */
1030fba7fc7eSJung-uk Kim 
1031f38b0f21SJung-uk Kim         FlOpenFile (ASL_FILE_ASM_INCLUDE_OUTPUT, Filename, "w+t");
1032fba7fc7eSJung-uk Kim 
1033fba7fc7eSJung-uk Kim         AslCompilerSignon (ASL_FILE_ASM_INCLUDE_OUTPUT);
1034fba7fc7eSJung-uk Kim         AslCompilerFileHeader (ASL_FILE_ASM_INCLUDE_OUTPUT);
1035fba7fc7eSJung-uk Kim     }
1036fba7fc7eSJung-uk Kim 
1037fba7fc7eSJung-uk Kim     /* Create/Open a C include output file if asked */
1038fba7fc7eSJung-uk Kim 
1039fba7fc7eSJung-uk Kim     if (Gbl_C_IncludeOutputFlag)
1040fba7fc7eSJung-uk Kim     {
1041fba7fc7eSJung-uk Kim         Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_C_INCLUDE);
1042fba7fc7eSJung-uk Kim         if (!Filename)
1043fba7fc7eSJung-uk Kim         {
1044fba7fc7eSJung-uk Kim             AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME,
1045fba7fc7eSJung-uk Kim                 0, 0, 0, 0, NULL, NULL);
1046fba7fc7eSJung-uk Kim             return (AE_ERROR);
1047fba7fc7eSJung-uk Kim         }
1048fba7fc7eSJung-uk Kim 
1049fba7fc7eSJung-uk Kim         /* Open the C include file, text mode */
1050fba7fc7eSJung-uk Kim 
1051f38b0f21SJung-uk Kim         FlOpenFile (ASL_FILE_C_INCLUDE_OUTPUT, Filename, "w+t");
1052fba7fc7eSJung-uk Kim 
1053fba7fc7eSJung-uk Kim         FlPrintFile (ASL_FILE_C_INCLUDE_OUTPUT, "/*\n");
1054fba7fc7eSJung-uk Kim         AslCompilerSignon (ASL_FILE_C_INCLUDE_OUTPUT);
1055fba7fc7eSJung-uk Kim         AslCompilerFileHeader (ASL_FILE_C_INCLUDE_OUTPUT);
1056fba7fc7eSJung-uk Kim     }
1057fba7fc7eSJung-uk Kim 
1058fba7fc7eSJung-uk Kim     /* Create a namespace output file if asked */
1059fba7fc7eSJung-uk Kim 
1060fba7fc7eSJung-uk Kim     if (Gbl_NsOutputFlag)
1061fba7fc7eSJung-uk Kim     {
1062fba7fc7eSJung-uk Kim         Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_NAMESPACE);
1063fba7fc7eSJung-uk Kim         if (!Filename)
1064fba7fc7eSJung-uk Kim         {
1065fba7fc7eSJung-uk Kim             AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME,
1066fba7fc7eSJung-uk Kim                 0, 0, 0, 0, NULL, NULL);
1067fba7fc7eSJung-uk Kim             return (AE_ERROR);
1068fba7fc7eSJung-uk Kim         }
1069fba7fc7eSJung-uk Kim 
1070fba7fc7eSJung-uk Kim         /* Open the namespace file, text mode */
1071fba7fc7eSJung-uk Kim 
1072f38b0f21SJung-uk Kim         FlOpenFile (ASL_FILE_NAMESPACE_OUTPUT, Filename, "w+t");
1073fba7fc7eSJung-uk Kim 
1074fba7fc7eSJung-uk Kim         AslCompilerSignon (ASL_FILE_NAMESPACE_OUTPUT);
1075fba7fc7eSJung-uk Kim         AslCompilerFileHeader (ASL_FILE_NAMESPACE_OUTPUT);
1076fba7fc7eSJung-uk Kim     }
1077fba7fc7eSJung-uk Kim 
1078fba7fc7eSJung-uk Kim     return (AE_OK);
1079fba7fc7eSJung-uk Kim }
1080fba7fc7eSJung-uk Kim 
1081fba7fc7eSJung-uk Kim 
1082fba7fc7eSJung-uk Kim #ifdef ACPI_OBSOLETE_FUNCTIONS
1083fba7fc7eSJung-uk Kim /*******************************************************************************
1084fba7fc7eSJung-uk Kim  *
108553289f6aSNate Lawson  * FUNCTION:    FlParseInputPathname
108653289f6aSNate Lawson  *
108753289f6aSNate Lawson  * PARAMETERS:  InputFilename       - The user-specified ASL source file to be
108853289f6aSNate Lawson  *                                    compiled
108953289f6aSNate Lawson  *
109053289f6aSNate Lawson  * RETURN:      Status
109153289f6aSNate Lawson  *
109253289f6aSNate Lawson  * DESCRIPTION: Split the input path into a directory and filename part
109353289f6aSNate Lawson  *              1) Directory part used to open include files
109453289f6aSNate Lawson  *              2) Filename part used to generate output filenames
109553289f6aSNate Lawson  *
109653289f6aSNate Lawson  ******************************************************************************/
109753289f6aSNate Lawson 
109853289f6aSNate Lawson ACPI_STATUS
109953289f6aSNate Lawson FlParseInputPathname (
110053289f6aSNate Lawson     char                    *InputFilename)
110153289f6aSNate Lawson {
110253289f6aSNate Lawson     char                    *Substring;
110353289f6aSNate Lawson 
110453289f6aSNate Lawson 
110553289f6aSNate Lawson     if (!InputFilename)
110653289f6aSNate Lawson     {
110753289f6aSNate Lawson         return (AE_OK);
110853289f6aSNate Lawson     }
110953289f6aSNate Lawson 
111053289f6aSNate Lawson     /* Get the path to the input filename's directory */
111153289f6aSNate Lawson 
111253289f6aSNate Lawson     Gbl_DirectoryPath = strdup (InputFilename);
111353289f6aSNate Lawson     if (!Gbl_DirectoryPath)
111453289f6aSNate Lawson     {
111553289f6aSNate Lawson         return (AE_NO_MEMORY);
111653289f6aSNate Lawson     }
111753289f6aSNate Lawson 
111853289f6aSNate Lawson     Substring = strrchr (Gbl_DirectoryPath, '\\');
111953289f6aSNate Lawson     if (!Substring)
112053289f6aSNate Lawson     {
112153289f6aSNate Lawson         Substring = strrchr (Gbl_DirectoryPath, '/');
112253289f6aSNate Lawson         if (!Substring)
112353289f6aSNate Lawson         {
112453289f6aSNate Lawson             Substring = strrchr (Gbl_DirectoryPath, ':');
112553289f6aSNate Lawson         }
112653289f6aSNate Lawson     }
112753289f6aSNate Lawson 
112853289f6aSNate Lawson     if (!Substring)
112953289f6aSNate Lawson     {
113053289f6aSNate Lawson         Gbl_DirectoryPath[0] = 0;
113153289f6aSNate Lawson         if (Gbl_UseDefaultAmlFilename)
113253289f6aSNate Lawson         {
113353289f6aSNate Lawson             Gbl_OutputFilenamePrefix = strdup (InputFilename);
113453289f6aSNate Lawson         }
113553289f6aSNate Lawson     }
113653289f6aSNate Lawson     else
113753289f6aSNate Lawson     {
113853289f6aSNate Lawson         if (Gbl_UseDefaultAmlFilename)
113953289f6aSNate Lawson         {
114053289f6aSNate Lawson             Gbl_OutputFilenamePrefix = strdup (Substring + 1);
114153289f6aSNate Lawson         }
114253289f6aSNate Lawson         *(Substring+1) = 0;
114353289f6aSNate Lawson     }
114453289f6aSNate Lawson 
114553289f6aSNate Lawson     return (AE_OK);
114653289f6aSNate Lawson }
1147fba7fc7eSJung-uk Kim #endif
1148