153289f6aSNate Lawson 
253289f6aSNate Lawson /******************************************************************************
353289f6aSNate Lawson  *
453289f6aSNate Lawson  * Module Name: aslfiles - file I/O suppoert
553289f6aSNate Lawson  *
653289f6aSNate Lawson  *****************************************************************************/
753289f6aSNate Lawson 
853289f6aSNate Lawson /******************************************************************************
953289f6aSNate Lawson  *
1053289f6aSNate Lawson  * 1. Copyright Notice
1153289f6aSNate Lawson  *
129a179dd8SJung-uk Kim  * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp.
1353289f6aSNate Lawson  * All rights reserved.
1453289f6aSNate Lawson  *
1553289f6aSNate Lawson  * 2. License
1653289f6aSNate Lawson  *
1753289f6aSNate Lawson  * 2.1. This is your license from Intel Corp. under its intellectual property
1853289f6aSNate Lawson  * rights.  You may have additional license terms from the party that provided
1953289f6aSNate Lawson  * you this software, covering your right to use that party's intellectual
2053289f6aSNate Lawson  * property rights.
2153289f6aSNate Lawson  *
2253289f6aSNate Lawson  * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
2353289f6aSNate Lawson  * copy of the source code appearing in this file ("Covered Code") an
2453289f6aSNate Lawson  * irrevocable, perpetual, worldwide license under Intel's copyrights in the
2553289f6aSNate Lawson  * base code distributed originally by Intel ("Original Intel Code") to copy,
2653289f6aSNate Lawson  * make derivatives, distribute, use and display any portion of the Covered
2753289f6aSNate Lawson  * Code in any form, with the right to sublicense such rights; and
2853289f6aSNate Lawson  *
2953289f6aSNate Lawson  * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
3053289f6aSNate Lawson  * license (with the right to sublicense), under only those claims of Intel
3153289f6aSNate Lawson  * patents that are infringed by the Original Intel Code, to make, use, sell,
3253289f6aSNate Lawson  * offer to sell, and import the Covered Code and derivative works thereof
3353289f6aSNate Lawson  * solely to the minimum extent necessary to exercise the above copyright
3453289f6aSNate Lawson  * license, and in no event shall the patent license extend to any additions
3553289f6aSNate Lawson  * to or modifications of the Original Intel Code.  No other license or right
3653289f6aSNate Lawson  * is granted directly or by implication, estoppel or otherwise;
3753289f6aSNate Lawson  *
3853289f6aSNate Lawson  * The above copyright and patent license is granted only if the following
3953289f6aSNate Lawson  * conditions are met:
4053289f6aSNate Lawson  *
4153289f6aSNate Lawson  * 3. Conditions
4253289f6aSNate Lawson  *
4353289f6aSNate Lawson  * 3.1. Redistribution of Source with Rights to Further Distribute Source.
4453289f6aSNate Lawson  * Redistribution of source code of any substantial portion of the Covered
4553289f6aSNate Lawson  * Code or modification with rights to further distribute source must include
4653289f6aSNate Lawson  * the above Copyright Notice, the above License, this list of Conditions,
4753289f6aSNate Lawson  * and the following Disclaimer and Export Compliance provision.  In addition,
4853289f6aSNate Lawson  * Licensee must cause all Covered Code to which Licensee contributes to
4953289f6aSNate Lawson  * contain a file documenting the changes Licensee made to create that Covered
5053289f6aSNate Lawson  * Code and the date of any change.  Licensee must include in that file the
5153289f6aSNate Lawson  * documentation of any changes made by any predecessor Licensee.  Licensee
5253289f6aSNate Lawson  * must include a prominent statement that the modification is derived,
5353289f6aSNate Lawson  * directly or indirectly, from Original Intel Code.
5453289f6aSNate Lawson  *
5553289f6aSNate Lawson  * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
5653289f6aSNate Lawson  * Redistribution of source code of any substantial portion of the Covered
5753289f6aSNate Lawson  * Code or modification without rights to further distribute source must
5853289f6aSNate Lawson  * include the following Disclaimer and Export Compliance provision in the
5953289f6aSNate Lawson  * documentation and/or other materials provided with distribution.  In
6053289f6aSNate Lawson  * addition, Licensee may not authorize further sublicense of source of any
6153289f6aSNate Lawson  * portion of the Covered Code, and must include terms to the effect that the
6253289f6aSNate Lawson  * license from Licensee to its licensee is limited to the intellectual
6353289f6aSNate Lawson  * property embodied in the software Licensee provides to its licensee, and
6453289f6aSNate Lawson  * not to intellectual property embodied in modifications its licensee may
6553289f6aSNate Lawson  * make.
6653289f6aSNate Lawson  *
6753289f6aSNate Lawson  * 3.3. Redistribution of Executable. Redistribution in executable form of any
6853289f6aSNate Lawson  * substantial portion of the Covered Code or modification must reproduce the
6953289f6aSNate Lawson  * above Copyright Notice, and the following Disclaimer and Export Compliance
7053289f6aSNate Lawson  * provision in the documentation and/or other materials provided with the
7153289f6aSNate Lawson  * distribution.
7253289f6aSNate Lawson  *
7353289f6aSNate Lawson  * 3.4. Intel retains all right, title, and interest in and to the Original
7453289f6aSNate Lawson  * Intel Code.
7553289f6aSNate Lawson  *
7653289f6aSNate Lawson  * 3.5. Neither the name Intel nor any other trademark owned or controlled by
7753289f6aSNate Lawson  * Intel shall be used in advertising or otherwise to promote the sale, use or
7853289f6aSNate Lawson  * other dealings in products derived from or relating to the Covered Code
7953289f6aSNate Lawson  * without prior written authorization from Intel.
8053289f6aSNate Lawson  *
8153289f6aSNate Lawson  * 4. Disclaimer and Export Compliance
8253289f6aSNate Lawson  *
8353289f6aSNate Lawson  * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
8453289f6aSNate Lawson  * HERE.  ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
8553289f6aSNate Lawson  * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT,  ASSISTANCE,
8653289f6aSNate Lawson  * INSTALLATION, TRAINING OR OTHER SERVICES.  INTEL WILL NOT PROVIDE ANY
8753289f6aSNate Lawson  * UPDATES, ENHANCEMENTS OR EXTENSIONS.  INTEL SPECIFICALLY DISCLAIMS ANY
8853289f6aSNate Lawson  * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
8953289f6aSNate Lawson  * PARTICULAR PURPOSE.
9053289f6aSNate Lawson  *
9153289f6aSNate Lawson  * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
9253289f6aSNate Lawson  * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
9353289f6aSNate Lawson  * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
9453289f6aSNate Lawson  * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
9553289f6aSNate Lawson  * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
9653289f6aSNate Lawson  * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES.  THESE LIMITATIONS
9753289f6aSNate Lawson  * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
9853289f6aSNate Lawson  * LIMITED REMEDY.
9953289f6aSNate Lawson  *
10053289f6aSNate Lawson  * 4.3. Licensee shall not export, either directly or indirectly, any of this
10153289f6aSNate Lawson  * software or system incorporating such software without first obtaining any
10253289f6aSNate Lawson  * required license or other approval from the U. S. Department of Commerce or
10353289f6aSNate Lawson  * any other agency or department of the United States Government.  In the
10453289f6aSNate Lawson  * event Licensee exports any such software from the United States or
10553289f6aSNate Lawson  * re-exports any such software from a foreign destination, Licensee shall
10653289f6aSNate Lawson  * ensure that the distribution and export/re-export of the software is in
10753289f6aSNate Lawson  * compliance with all laws, regulations, orders, or other restrictions of the
10853289f6aSNate Lawson  * U.S. Export Administration Regulations. Licensee agrees that neither it nor
10953289f6aSNate Lawson  * any of its subsidiaries will export/re-export any technical data, process,
11053289f6aSNate Lawson  * software, or service, directly or indirectly, to any country for which the
11153289f6aSNate Lawson  * United States government or any agency thereof requires an export license,
11253289f6aSNate Lawson  * other governmental approval, or letter of assurance, without first obtaining
11353289f6aSNate Lawson  * such license, approval or letter.
11453289f6aSNate Lawson  *
11553289f6aSNate Lawson  *****************************************************************************/
11653289f6aSNate Lawson 
117ab6f3bf9SJung-uk Kim #include <contrib/dev/acpica/compiler/aslcompiler.h>
118ab6f3bf9SJung-uk Kim #include <contrib/dev/acpica/include/acapps.h>
11953289f6aSNate Lawson 
12053289f6aSNate Lawson #define _COMPONENT          ACPI_COMPILER
12153289f6aSNate Lawson         ACPI_MODULE_NAME    ("aslfiles")
12253289f6aSNate Lawson 
123fba7fc7eSJung-uk Kim /* Local prototypes */
124fba7fc7eSJung-uk Kim 
125d6dd1baeSJung-uk Kim FILE *
126d6dd1baeSJung-uk Kim FlOpenIncludeWithPrefix (
127d6dd1baeSJung-uk Kim     char                    *PrefixDir,
128d6dd1baeSJung-uk Kim     char                    *Filename);
129d6dd1baeSJung-uk Kim 
130fba7fc7eSJung-uk Kim 
131fba7fc7eSJung-uk Kim #ifdef ACPI_OBSOLETE_FUNCTIONS
132fba7fc7eSJung-uk Kim ACPI_STATUS
133fba7fc7eSJung-uk Kim FlParseInputPathname (
134fba7fc7eSJung-uk Kim     char                    *InputFilename);
135fba7fc7eSJung-uk Kim #endif
136fba7fc7eSJung-uk Kim 
13753289f6aSNate Lawson 
13853289f6aSNate Lawson /*******************************************************************************
13953289f6aSNate Lawson  *
14053289f6aSNate Lawson  * FUNCTION:    AslAbort
14153289f6aSNate Lawson  *
14253289f6aSNate Lawson  * PARAMETERS:  None
14353289f6aSNate Lawson  *
14453289f6aSNate Lawson  * RETURN:      None
14553289f6aSNate Lawson  *
14653289f6aSNate Lawson  * DESCRIPTION: Dump the error log and abort the compiler.  Used for serious
14753289f6aSNate Lawson  *              I/O errors
14853289f6aSNate Lawson  *
14953289f6aSNate Lawson  ******************************************************************************/
15053289f6aSNate Lawson 
15153289f6aSNate Lawson void
152fba7fc7eSJung-uk Kim AslAbort (
153fba7fc7eSJung-uk Kim     void)
15453289f6aSNate Lawson {
15553289f6aSNate Lawson 
15653289f6aSNate Lawson     AePrintErrorLog (ASL_FILE_STDOUT);
15753289f6aSNate Lawson     if (Gbl_DebugFlag)
15853289f6aSNate Lawson     {
15953289f6aSNate Lawson         /* Print error summary to the debug file */
16053289f6aSNate Lawson 
16153289f6aSNate Lawson         AePrintErrorLog (ASL_FILE_STDERR);
16253289f6aSNate Lawson     }
16353289f6aSNate Lawson 
164fba7fc7eSJung-uk Kim     exit (1);
16553289f6aSNate Lawson }
16653289f6aSNate Lawson 
16753289f6aSNate Lawson 
16853289f6aSNate Lawson /*******************************************************************************
16953289f6aSNate Lawson  *
17053289f6aSNate Lawson  * FUNCTION:    FlFileError
17153289f6aSNate Lawson  *
17253289f6aSNate Lawson  * PARAMETERS:  FileId              - Index into file info array
17353289f6aSNate Lawson  *              ErrorId             - Index into error message array
17453289f6aSNate Lawson  *
17553289f6aSNate Lawson  * RETURN:      None
17653289f6aSNate Lawson  *
17753289f6aSNate Lawson  * DESCRIPTION: Decode errno to an error message and add the entire error
17853289f6aSNate Lawson  *              to the error log.
17953289f6aSNate Lawson  *
18053289f6aSNate Lawson  ******************************************************************************/
18153289f6aSNate Lawson 
18253289f6aSNate Lawson void
18353289f6aSNate Lawson FlFileError (
18453289f6aSNate Lawson     UINT32                  FileId,
18553289f6aSNate Lawson     UINT8                   ErrorId)
18653289f6aSNate Lawson {
18753289f6aSNate Lawson 
188fba7fc7eSJung-uk Kim     sprintf (MsgBuffer, "\"%s\" (%s)", Gbl_Files[FileId].Filename,
189fba7fc7eSJung-uk Kim         strerror (errno));
19053289f6aSNate Lawson     AslCommonError (ASL_ERROR, ErrorId, 0, 0, 0, 0, NULL, MsgBuffer);
19153289f6aSNate Lawson }
19253289f6aSNate Lawson 
19353289f6aSNate Lawson 
19453289f6aSNate Lawson /*******************************************************************************
19553289f6aSNate Lawson  *
19653289f6aSNate Lawson  * FUNCTION:    FlOpenFile
19753289f6aSNate Lawson  *
19853289f6aSNate Lawson  * PARAMETERS:  FileId              - Index into file info array
19953289f6aSNate Lawson  *              Filename            - file pathname to open
20053289f6aSNate Lawson  *              Mode                - Open mode for fopen
20153289f6aSNate Lawson  *
202fba7fc7eSJung-uk Kim  * RETURN:      None
20353289f6aSNate Lawson  *
20453289f6aSNate Lawson  * DESCRIPTION: Open a file.
20553289f6aSNate Lawson  *              NOTE: Aborts compiler on any error.
20653289f6aSNate Lawson  *
20753289f6aSNate Lawson  ******************************************************************************/
20853289f6aSNate Lawson 
209a88e22b7SJung-uk Kim void
21053289f6aSNate Lawson FlOpenFile (
21153289f6aSNate Lawson     UINT32                  FileId,
21253289f6aSNate Lawson     char                    *Filename,
21353289f6aSNate Lawson     char                    *Mode)
21453289f6aSNate Lawson {
21553289f6aSNate Lawson     FILE                    *File;
21653289f6aSNate Lawson 
21753289f6aSNate Lawson 
21853289f6aSNate Lawson     File = fopen (Filename, Mode);
21953289f6aSNate Lawson 
22053289f6aSNate Lawson     Gbl_Files[FileId].Filename = Filename;
22153289f6aSNate Lawson     Gbl_Files[FileId].Handle   = File;
22253289f6aSNate Lawson 
22353289f6aSNate Lawson     if (!File)
22453289f6aSNate Lawson     {
22553289f6aSNate Lawson         FlFileError (FileId, ASL_MSG_OPEN);
22653289f6aSNate Lawson         AslAbort ();
22753289f6aSNate Lawson     }
22853289f6aSNate Lawson }
22953289f6aSNate Lawson 
23053289f6aSNate Lawson 
23153289f6aSNate Lawson /*******************************************************************************
23253289f6aSNate Lawson  *
2333f5e024cSJung-uk Kim  * FUNCTION:    FlGetFileSize
2343f5e024cSJung-uk Kim  *
2353f5e024cSJung-uk Kim  * PARAMETERS:  FileId              - Index into file info array
2363f5e024cSJung-uk Kim  *
2373f5e024cSJung-uk Kim  * RETURN:      File Size
2383f5e024cSJung-uk Kim  *
2393f5e024cSJung-uk Kim  * DESCRIPTION: Get current file size. Uses seek-to-EOF. File must be open.
2403f5e024cSJung-uk Kim  *
2413f5e024cSJung-uk Kim  ******************************************************************************/
2423f5e024cSJung-uk Kim 
2433f5e024cSJung-uk Kim UINT32
2443f5e024cSJung-uk Kim FlGetFileSize (
2453f5e024cSJung-uk Kim     UINT32                  FileId)
2463f5e024cSJung-uk Kim {
2473f5e024cSJung-uk Kim     FILE                    *fp;
2483f5e024cSJung-uk Kim     UINT32                  FileSize;
2493f5e024cSJung-uk Kim 
2503f5e024cSJung-uk Kim 
2513f5e024cSJung-uk Kim     fp = Gbl_Files[FileId].Handle;
2523f5e024cSJung-uk Kim 
2533f5e024cSJung-uk Kim     fseek (fp, 0, SEEK_END);
2543f5e024cSJung-uk Kim     FileSize = (UINT32) ftell (fp);
2553f5e024cSJung-uk Kim     fseek (fp, 0, SEEK_SET);
2563f5e024cSJung-uk Kim 
2573f5e024cSJung-uk Kim     return (FileSize);
2583f5e024cSJung-uk Kim }
2593f5e024cSJung-uk Kim 
2603f5e024cSJung-uk Kim 
2613f5e024cSJung-uk Kim /*******************************************************************************
2623f5e024cSJung-uk Kim  *
26353289f6aSNate Lawson  * FUNCTION:    FlReadFile
26453289f6aSNate Lawson  *
26553289f6aSNate Lawson  * PARAMETERS:  FileId              - Index into file info array
26653289f6aSNate Lawson  *              Buffer              - Where to place the data
26753289f6aSNate Lawson  *              Length              - Amount to read
26853289f6aSNate Lawson  *
26953289f6aSNate Lawson  * RETURN:      Status.  AE_ERROR indicates EOF.
27053289f6aSNate Lawson  *
27153289f6aSNate Lawson  * DESCRIPTION: Read data from an open file.
27253289f6aSNate Lawson  *              NOTE: Aborts compiler on any error.
27353289f6aSNate Lawson  *
27453289f6aSNate Lawson  ******************************************************************************/
27553289f6aSNate Lawson 
27653289f6aSNate Lawson ACPI_STATUS
27753289f6aSNate Lawson FlReadFile (
27853289f6aSNate Lawson     UINT32                  FileId,
27953289f6aSNate Lawson     void                    *Buffer,
28053289f6aSNate Lawson     UINT32                  Length)
28153289f6aSNate Lawson {
28253289f6aSNate Lawson     UINT32                  Actual;
28353289f6aSNate Lawson 
28453289f6aSNate Lawson 
28553289f6aSNate Lawson     /* Read and check for error */
28653289f6aSNate Lawson 
28753289f6aSNate Lawson     Actual = fread (Buffer, 1, Length, Gbl_Files[FileId].Handle);
28853289f6aSNate Lawson     if (Actual != Length)
28953289f6aSNate Lawson     {
29053289f6aSNate Lawson         if (feof (Gbl_Files[FileId].Handle))
29153289f6aSNate Lawson         {
29253289f6aSNate Lawson             /* End-of-file, just return error */
29353289f6aSNate Lawson 
29453289f6aSNate Lawson             return (AE_ERROR);
29553289f6aSNate Lawson         }
29653289f6aSNate Lawson 
29753289f6aSNate Lawson         FlFileError (FileId, ASL_MSG_READ);
29853289f6aSNate Lawson         AslAbort ();
29953289f6aSNate Lawson     }
30053289f6aSNate Lawson 
30153289f6aSNate Lawson     return (AE_OK);
30253289f6aSNate Lawson }
30353289f6aSNate Lawson 
30453289f6aSNate Lawson 
30553289f6aSNate Lawson /*******************************************************************************
30653289f6aSNate Lawson  *
30753289f6aSNate Lawson  * FUNCTION:    FlWriteFile
30853289f6aSNate Lawson  *
30953289f6aSNate Lawson  * PARAMETERS:  FileId              - Index into file info array
31053289f6aSNate Lawson  *              Buffer              - Data to write
31153289f6aSNate Lawson  *              Length              - Amount of data to write
31253289f6aSNate Lawson  *
313fba7fc7eSJung-uk Kim  * RETURN:      None
31453289f6aSNate Lawson  *
31553289f6aSNate Lawson  * DESCRIPTION: Write data to an open file.
31653289f6aSNate Lawson  *              NOTE: Aborts compiler on any error.
31753289f6aSNate Lawson  *
31853289f6aSNate Lawson  ******************************************************************************/
31953289f6aSNate Lawson 
32053289f6aSNate Lawson void
32153289f6aSNate Lawson FlWriteFile (
32253289f6aSNate Lawson     UINT32                  FileId,
32353289f6aSNate Lawson     void                    *Buffer,
32453289f6aSNate Lawson     UINT32                  Length)
32553289f6aSNate Lawson {
32653289f6aSNate Lawson     UINT32                  Actual;
32753289f6aSNate Lawson 
32853289f6aSNate Lawson 
32953289f6aSNate Lawson     /* Write and check for error */
33053289f6aSNate Lawson 
33153289f6aSNate Lawson     Actual = fwrite ((char *) Buffer, 1, Length, Gbl_Files[FileId].Handle);
33253289f6aSNate Lawson     if (Actual != Length)
33353289f6aSNate Lawson     {
33453289f6aSNate Lawson         FlFileError (FileId, ASL_MSG_WRITE);
33553289f6aSNate Lawson         AslAbort ();
33653289f6aSNate Lawson     }
33753289f6aSNate Lawson }
33853289f6aSNate Lawson 
33953289f6aSNate Lawson 
34053289f6aSNate Lawson /*******************************************************************************
34153289f6aSNate Lawson  *
34253289f6aSNate Lawson  * FUNCTION:    FlPrintFile
34353289f6aSNate Lawson  *
34453289f6aSNate Lawson  * PARAMETERS:  FileId              - Index into file info array
34553289f6aSNate Lawson  *              Format              - Printf format string
34653289f6aSNate Lawson  *              ...                 - Printf arguments
34753289f6aSNate Lawson  *
34853289f6aSNate Lawson  * RETURN:      None
34953289f6aSNate Lawson  *
35053289f6aSNate Lawson  * DESCRIPTION: Formatted write to an open file.
35153289f6aSNate Lawson  *              NOTE: Aborts compiler on any error.
35253289f6aSNate Lawson  *
35353289f6aSNate Lawson  ******************************************************************************/
35453289f6aSNate Lawson 
35553289f6aSNate Lawson void
35653289f6aSNate Lawson FlPrintFile (
35753289f6aSNate Lawson     UINT32                  FileId,
35853289f6aSNate Lawson     char                    *Format,
35953289f6aSNate Lawson     ...)
36053289f6aSNate Lawson {
36153289f6aSNate Lawson     INT32                   Actual;
36253289f6aSNate Lawson     va_list                 Args;
36353289f6aSNate Lawson 
36453289f6aSNate Lawson 
36553289f6aSNate Lawson     va_start (Args, Format);
36653289f6aSNate Lawson 
36753289f6aSNate Lawson     Actual = vfprintf (Gbl_Files[FileId].Handle, Format, Args);
368a9f12690SJung-uk Kim     va_end (Args);
369a9f12690SJung-uk Kim 
37053289f6aSNate Lawson     if (Actual == -1)
37153289f6aSNate Lawson     {
37253289f6aSNate Lawson         FlFileError (FileId, ASL_MSG_WRITE);
37353289f6aSNate Lawson         AslAbort ();
37453289f6aSNate Lawson     }
37553289f6aSNate Lawson }
37653289f6aSNate Lawson 
37753289f6aSNate Lawson 
37853289f6aSNate Lawson /*******************************************************************************
37953289f6aSNate Lawson  *
38053289f6aSNate Lawson  * FUNCTION:    FlSeekFile
38153289f6aSNate Lawson  *
38253289f6aSNate Lawson  * PARAMETERS:  FileId              - Index into file info array
38353289f6aSNate Lawson  *              Offset              - Absolute byte offset in file
38453289f6aSNate Lawson  *
385fba7fc7eSJung-uk Kim  * RETURN:      None
38653289f6aSNate Lawson  *
38753289f6aSNate Lawson  * DESCRIPTION: Seek to absolute offset
38853289f6aSNate Lawson  *              NOTE: Aborts compiler on any error.
38953289f6aSNate Lawson  *
39053289f6aSNate Lawson  ******************************************************************************/
39153289f6aSNate Lawson 
39253289f6aSNate Lawson void
39353289f6aSNate Lawson FlSeekFile (
39453289f6aSNate Lawson     UINT32                  FileId,
39553289f6aSNate Lawson     long                    Offset)
39653289f6aSNate Lawson {
39753289f6aSNate Lawson     int                     Error;
39853289f6aSNate Lawson 
39953289f6aSNate Lawson 
40053289f6aSNate Lawson     Error = fseek (Gbl_Files[FileId].Handle, Offset, SEEK_SET);
40153289f6aSNate Lawson     if (Error)
40253289f6aSNate Lawson     {
40353289f6aSNate Lawson         FlFileError (FileId, ASL_MSG_SEEK);
40453289f6aSNate Lawson         AslAbort ();
40553289f6aSNate Lawson     }
40653289f6aSNate Lawson }
40753289f6aSNate Lawson 
40853289f6aSNate Lawson 
40953289f6aSNate Lawson /*******************************************************************************
41053289f6aSNate Lawson  *
41153289f6aSNate Lawson  * FUNCTION:    FlCloseFile
41253289f6aSNate Lawson  *
41353289f6aSNate Lawson  * PARAMETERS:  FileId              - Index into file info array
41453289f6aSNate Lawson  *
415fba7fc7eSJung-uk Kim  * RETURN:      None
41653289f6aSNate Lawson  *
41753289f6aSNate Lawson  * DESCRIPTION: Close an open file.  Aborts compiler on error
41853289f6aSNate Lawson  *
41953289f6aSNate Lawson  ******************************************************************************/
42053289f6aSNate Lawson 
42153289f6aSNate Lawson void
42253289f6aSNate Lawson FlCloseFile (
42353289f6aSNate Lawson     UINT32                  FileId)
42453289f6aSNate Lawson {
42553289f6aSNate Lawson     int                     Error;
42653289f6aSNate Lawson 
42753289f6aSNate Lawson 
42853289f6aSNate Lawson     if (!Gbl_Files[FileId].Handle)
42953289f6aSNate Lawson     {
43053289f6aSNate Lawson         return;
43153289f6aSNate Lawson     }
43253289f6aSNate Lawson 
43353289f6aSNate Lawson     Error = fclose (Gbl_Files[FileId].Handle);
43453289f6aSNate Lawson     Gbl_Files[FileId].Handle = NULL;
43553289f6aSNate Lawson 
43653289f6aSNate Lawson     if (Error)
43753289f6aSNate Lawson     {
43853289f6aSNate Lawson         FlFileError (FileId, ASL_MSG_CLOSE);
43953289f6aSNate Lawson         AslAbort ();
44053289f6aSNate Lawson     }
44153289f6aSNate Lawson 
44253289f6aSNate Lawson     return;
44353289f6aSNate Lawson }
44453289f6aSNate Lawson 
44553289f6aSNate Lawson 
44653289f6aSNate Lawson /*******************************************************************************
44753289f6aSNate Lawson  *
44853289f6aSNate Lawson  * FUNCTION:    FlSetLineNumber
44953289f6aSNate Lawson  *
45053289f6aSNate Lawson  * PARAMETERS:  Op        - Parse node for the LINE asl statement
45153289f6aSNate Lawson  *
45253289f6aSNate Lawson  * RETURN:      None.
45353289f6aSNate Lawson  *
45453289f6aSNate Lawson  * DESCRIPTION: Set the current line number
45553289f6aSNate Lawson  *
45653289f6aSNate Lawson  ******************************************************************************/
45753289f6aSNate Lawson 
45853289f6aSNate Lawson void
45953289f6aSNate Lawson FlSetLineNumber (
46053289f6aSNate Lawson     ACPI_PARSE_OBJECT       *Op)
46153289f6aSNate Lawson {
46253289f6aSNate Lawson 
46353289f6aSNate Lawson     Gbl_CurrentLineNumber = (UINT32) Op->Asl.Value.Integer;
46453289f6aSNate Lawson     Gbl_LogicalLineNumber = (UINT32) Op->Asl.Value.Integer;
46553289f6aSNate Lawson }
46653289f6aSNate Lawson 
46753289f6aSNate Lawson 
46853289f6aSNate Lawson /*******************************************************************************
46953289f6aSNate Lawson  *
470d6dd1baeSJung-uk Kim  * FUNCTION:    FlAddIncludeDirectory
471d6dd1baeSJung-uk Kim  *
472d6dd1baeSJung-uk Kim  * PARAMETERS:  Dir             - Directory pathname string
473d6dd1baeSJung-uk Kim  *
474d6dd1baeSJung-uk Kim  * RETURN:      None
475d6dd1baeSJung-uk Kim  *
476d6dd1baeSJung-uk Kim  * DESCRIPTION: Add a directory the list of include prefix directories.
477d6dd1baeSJung-uk Kim  *
478d6dd1baeSJung-uk Kim  ******************************************************************************/
479d6dd1baeSJung-uk Kim 
480d6dd1baeSJung-uk Kim void
481d6dd1baeSJung-uk Kim FlAddIncludeDirectory (
482d6dd1baeSJung-uk Kim     char                    *Dir)
483d6dd1baeSJung-uk Kim {
484d6dd1baeSJung-uk Kim     ASL_INCLUDE_DIR         *NewDir;
485d6dd1baeSJung-uk Kim     ASL_INCLUDE_DIR         *NextDir;
486d6dd1baeSJung-uk Kim     ASL_INCLUDE_DIR         *PrevDir = NULL;
487d6dd1baeSJung-uk Kim     UINT32                  NeedsSeparator = 0;
488d6dd1baeSJung-uk Kim     size_t                  DirLength;
489d6dd1baeSJung-uk Kim 
490d6dd1baeSJung-uk Kim 
491d6dd1baeSJung-uk Kim     DirLength = strlen (Dir);
492d6dd1baeSJung-uk Kim     if (!DirLength)
493d6dd1baeSJung-uk Kim     {
494d6dd1baeSJung-uk Kim         return;
495d6dd1baeSJung-uk Kim     }
496d6dd1baeSJung-uk Kim 
497d6dd1baeSJung-uk Kim     /* Make sure that the pathname ends with a path separator */
498d6dd1baeSJung-uk Kim 
499d6dd1baeSJung-uk Kim     if ((Dir[DirLength-1] != '/') &&
500d6dd1baeSJung-uk Kim         (Dir[DirLength-1] != '\\'))
501d6dd1baeSJung-uk Kim     {
502d6dd1baeSJung-uk Kim         NeedsSeparator = 1;
503d6dd1baeSJung-uk Kim     }
504d6dd1baeSJung-uk Kim 
505d6dd1baeSJung-uk Kim     NewDir = ACPI_ALLOCATE_ZEROED (sizeof (ASL_INCLUDE_DIR));
506d6dd1baeSJung-uk Kim     NewDir->Dir = ACPI_ALLOCATE (DirLength + 1 + NeedsSeparator);
507d6dd1baeSJung-uk Kim     strcpy (NewDir->Dir, Dir);
508d6dd1baeSJung-uk Kim     if (NeedsSeparator)
509d6dd1baeSJung-uk Kim     {
510d6dd1baeSJung-uk Kim         strcat (NewDir->Dir, "/");
511d6dd1baeSJung-uk Kim     }
512d6dd1baeSJung-uk Kim 
513d6dd1baeSJung-uk Kim     /*
514d6dd1baeSJung-uk Kim      * Preserve command line ordering of -I options by adding new elements
515d6dd1baeSJung-uk Kim      * at the end of the list
516d6dd1baeSJung-uk Kim      */
517d6dd1baeSJung-uk Kim     NextDir = Gbl_IncludeDirList;
518d6dd1baeSJung-uk Kim     while (NextDir)
519d6dd1baeSJung-uk Kim     {
520d6dd1baeSJung-uk Kim         PrevDir = NextDir;
521d6dd1baeSJung-uk Kim         NextDir = NextDir->Next;
522d6dd1baeSJung-uk Kim     }
523d6dd1baeSJung-uk Kim 
524d6dd1baeSJung-uk Kim     if (PrevDir)
525d6dd1baeSJung-uk Kim     {
526d6dd1baeSJung-uk Kim         PrevDir->Next = NewDir;
527d6dd1baeSJung-uk Kim     }
528d6dd1baeSJung-uk Kim     else
529d6dd1baeSJung-uk Kim     {
530d6dd1baeSJung-uk Kim         Gbl_IncludeDirList = NewDir;
531d6dd1baeSJung-uk Kim     }
532d6dd1baeSJung-uk Kim }
533d6dd1baeSJung-uk Kim 
534d6dd1baeSJung-uk Kim 
535d6dd1baeSJung-uk Kim /*******************************************************************************
536d6dd1baeSJung-uk Kim  *
537d6dd1baeSJung-uk Kim  * FUNCTION:    FlOpenIncludeWithPrefix
538d6dd1baeSJung-uk Kim  *
539d6dd1baeSJung-uk Kim  * PARAMETERS:  PrefixDir       - Prefix directory pathname. Can be a zero
540d6dd1baeSJung-uk Kim  *                                length string.
541d6dd1baeSJung-uk Kim  *              Filename        - The include filename from the source ASL.
542d6dd1baeSJung-uk Kim  *
543d6dd1baeSJung-uk Kim  * RETURN:      Valid file descriptor if successful. Null otherwise.
544d6dd1baeSJung-uk Kim  *
545d6dd1baeSJung-uk Kim  * DESCRIPTION: Open an include file and push it on the input file stack.
546d6dd1baeSJung-uk Kim  *
547d6dd1baeSJung-uk Kim  ******************************************************************************/
548d6dd1baeSJung-uk Kim 
549d6dd1baeSJung-uk Kim FILE *
550d6dd1baeSJung-uk Kim FlOpenIncludeWithPrefix (
551d6dd1baeSJung-uk Kim     char                    *PrefixDir,
552d6dd1baeSJung-uk Kim     char                    *Filename)
553d6dd1baeSJung-uk Kim {
554d6dd1baeSJung-uk Kim     FILE                    *IncludeFile;
555d6dd1baeSJung-uk Kim     char                    *Pathname;
556d6dd1baeSJung-uk Kim 
557d6dd1baeSJung-uk Kim 
558d6dd1baeSJung-uk Kim     /* Build the full pathname to the file */
559d6dd1baeSJung-uk Kim 
560d6dd1baeSJung-uk Kim     Pathname = ACPI_ALLOCATE (strlen (PrefixDir) + strlen (Filename) + 1);
561d6dd1baeSJung-uk Kim 
562d6dd1baeSJung-uk Kim     strcpy (Pathname, PrefixDir);
563d6dd1baeSJung-uk Kim     strcat (Pathname, Filename);
564d6dd1baeSJung-uk Kim 
565d6dd1baeSJung-uk Kim     DbgPrint (ASL_PARSE_OUTPUT, "\nAttempt to open include file: path %s\n\n",
566d6dd1baeSJung-uk Kim         Pathname);
567d6dd1baeSJung-uk Kim 
568d6dd1baeSJung-uk Kim     /* Attempt to open the file, push if successful */
569d6dd1baeSJung-uk Kim 
570d6dd1baeSJung-uk Kim     IncludeFile = fopen (Pathname, "r");
571d6dd1baeSJung-uk Kim     if (IncludeFile)
572d6dd1baeSJung-uk Kim     {
573d6dd1baeSJung-uk Kim         /* Push the include file on the open input file stack */
574d6dd1baeSJung-uk Kim 
575d6dd1baeSJung-uk Kim         AslPushInputFileStack (IncludeFile, Pathname);
576d6dd1baeSJung-uk Kim         return (IncludeFile);
577d6dd1baeSJung-uk Kim     }
578d6dd1baeSJung-uk Kim 
579d6dd1baeSJung-uk Kim     ACPI_FREE (Pathname);
580d6dd1baeSJung-uk Kim     return (NULL);
581d6dd1baeSJung-uk Kim }
582d6dd1baeSJung-uk Kim 
583d6dd1baeSJung-uk Kim 
584d6dd1baeSJung-uk Kim /*******************************************************************************
585d6dd1baeSJung-uk Kim  *
58653289f6aSNate Lawson  * FUNCTION:    FlOpenIncludeFile
58753289f6aSNate Lawson  *
58853289f6aSNate Lawson  * PARAMETERS:  Op        - Parse node for the INCLUDE ASL statement
58953289f6aSNate Lawson  *
59053289f6aSNate Lawson  * RETURN:      None.
59153289f6aSNate Lawson  *
59253289f6aSNate Lawson  * DESCRIPTION: Open an include file and push it on the input file stack.
59353289f6aSNate Lawson  *
59453289f6aSNate Lawson  ******************************************************************************/
59553289f6aSNate Lawson 
59653289f6aSNate Lawson void
59753289f6aSNate Lawson FlOpenIncludeFile (
59853289f6aSNate Lawson     ACPI_PARSE_OBJECT       *Op)
59953289f6aSNate Lawson {
600d6dd1baeSJung-uk Kim     FILE                    *IncludeFile;
601d6dd1baeSJung-uk Kim     ASL_INCLUDE_DIR         *NextDir;
60253289f6aSNate Lawson 
60353289f6aSNate Lawson 
60453289f6aSNate Lawson     /* Op must be valid */
60553289f6aSNate Lawson 
60653289f6aSNate Lawson     if (!Op)
60753289f6aSNate Lawson     {
60853289f6aSNate Lawson         AslCommonError (ASL_ERROR, ASL_MSG_INCLUDE_FILE_OPEN,
60953289f6aSNate Lawson             Gbl_CurrentLineNumber, Gbl_LogicalLineNumber,
61053289f6aSNate Lawson             Gbl_InputByteCount, Gbl_CurrentColumn,
61153289f6aSNate Lawson             Gbl_Files[ASL_FILE_INPUT].Filename, " - Null parse node");
61253289f6aSNate Lawson 
61353289f6aSNate Lawson         return;
61453289f6aSNate Lawson     }
61553289f6aSNate Lawson 
61653289f6aSNate Lawson     /*
61753289f6aSNate Lawson      * Flush out the "include ()" statement on this line, start
61853289f6aSNate Lawson      * the actual include file on the next line
61953289f6aSNate Lawson      */
62053289f6aSNate Lawson     ResetCurrentLineBuffer ();
62153289f6aSNate Lawson     FlPrintFile (ASL_FILE_SOURCE_OUTPUT, "\n");
62253289f6aSNate Lawson     Gbl_CurrentLineOffset++;
62353289f6aSNate Lawson 
62453289f6aSNate Lawson 
625d6dd1baeSJung-uk Kim     /* Attempt to open the include file */
626d6dd1baeSJung-uk Kim 
627d6dd1baeSJung-uk Kim     /* If the file specifies an absolute path, just open it */
628d6dd1baeSJung-uk Kim 
629d6dd1baeSJung-uk Kim     if ((Op->Asl.Value.String[0] == '/')  ||
630d6dd1baeSJung-uk Kim         (Op->Asl.Value.String[0] == '\\') ||
631d6dd1baeSJung-uk Kim         (Op->Asl.Value.String[1] == ':'))
63253289f6aSNate Lawson     {
633d6dd1baeSJung-uk Kim         IncludeFile = FlOpenIncludeWithPrefix ("", Op->Asl.Value.String);
634d6dd1baeSJung-uk Kim         if (!IncludeFile)
635d6dd1baeSJung-uk Kim         {
636d6dd1baeSJung-uk Kim             goto ErrorExit;
637d6dd1baeSJung-uk Kim         }
63853289f6aSNate Lawson         return;
63953289f6aSNate Lawson     }
64053289f6aSNate Lawson 
641d6dd1baeSJung-uk Kim     /*
642d6dd1baeSJung-uk Kim      * The include filename is not an absolute path.
643d6dd1baeSJung-uk Kim      *
644d6dd1baeSJung-uk Kim      * First, search for the file within the "local" directory -- meaning
645d6dd1baeSJung-uk Kim      * the same directory that contains the source file.
646d6dd1baeSJung-uk Kim      *
647d6dd1baeSJung-uk Kim      * Construct the file pathname from the global directory name.
648d6dd1baeSJung-uk Kim      */
649d6dd1baeSJung-uk Kim     IncludeFile = FlOpenIncludeWithPrefix (Gbl_DirectoryPath, Op->Asl.Value.String);
650d6dd1baeSJung-uk Kim     if (IncludeFile)
651d6dd1baeSJung-uk Kim     {
652d6dd1baeSJung-uk Kim         return;
653d6dd1baeSJung-uk Kim     }
65453289f6aSNate Lawson 
655d6dd1baeSJung-uk Kim     /*
656d6dd1baeSJung-uk Kim      * Second, search for the file within the (possibly multiple) directories
657d6dd1baeSJung-uk Kim      * specified by the -I option on the command line.
658d6dd1baeSJung-uk Kim      */
659d6dd1baeSJung-uk Kim     NextDir = Gbl_IncludeDirList;
660d6dd1baeSJung-uk Kim     while (NextDir)
661d6dd1baeSJung-uk Kim     {
662d6dd1baeSJung-uk Kim         IncludeFile = FlOpenIncludeWithPrefix (NextDir->Dir, Op->Asl.Value.String);
663d6dd1baeSJung-uk Kim         if (IncludeFile)
664d6dd1baeSJung-uk Kim         {
665d6dd1baeSJung-uk Kim             return;
666d6dd1baeSJung-uk Kim         }
667d6dd1baeSJung-uk Kim 
668d6dd1baeSJung-uk Kim         NextDir = NextDir->Next;
669d6dd1baeSJung-uk Kim     }
670d6dd1baeSJung-uk Kim 
671d6dd1baeSJung-uk Kim     /* We could not open the include file after trying very hard */
672d6dd1baeSJung-uk Kim 
673d6dd1baeSJung-uk Kim ErrorExit:
674d6dd1baeSJung-uk Kim     sprintf (MsgBuffer, "%s, %s", Op->Asl.Value.String, strerror (errno));
675d6dd1baeSJung-uk Kim     AslError (ASL_ERROR, ASL_MSG_INCLUDE_FILE_OPEN, Op, MsgBuffer);
67653289f6aSNate Lawson }
67753289f6aSNate Lawson 
67853289f6aSNate Lawson 
67953289f6aSNate Lawson /*******************************************************************************
68053289f6aSNate Lawson  *
681fba7fc7eSJung-uk Kim  * FUNCTION:    FlOpenInputFile
682fba7fc7eSJung-uk Kim  *
683fba7fc7eSJung-uk Kim  * PARAMETERS:  InputFilename       - The user-specified ASL source file to be
684fba7fc7eSJung-uk Kim  *                                    compiled
685fba7fc7eSJung-uk Kim  *
686fba7fc7eSJung-uk Kim  * RETURN:      Status
687fba7fc7eSJung-uk Kim  *
688fba7fc7eSJung-uk Kim  * DESCRIPTION: Open the specified input file, and save the directory path to
689fba7fc7eSJung-uk Kim  *              the file so that include files can be opened in
690fba7fc7eSJung-uk Kim  *              the same directory.
691fba7fc7eSJung-uk Kim  *
692fba7fc7eSJung-uk Kim  ******************************************************************************/
693fba7fc7eSJung-uk Kim 
694fba7fc7eSJung-uk Kim ACPI_STATUS
695fba7fc7eSJung-uk Kim FlOpenInputFile (
696fba7fc7eSJung-uk Kim     char                    *InputFilename)
697fba7fc7eSJung-uk Kim {
698fba7fc7eSJung-uk Kim 
699fba7fc7eSJung-uk Kim     /* Open the input ASL file, text mode */
700fba7fc7eSJung-uk Kim 
701fba7fc7eSJung-uk Kim     FlOpenFile (ASL_FILE_INPUT, InputFilename, "r");
702fba7fc7eSJung-uk Kim     AslCompilerin = Gbl_Files[ASL_FILE_INPUT].Handle;
703fba7fc7eSJung-uk Kim 
704fba7fc7eSJung-uk Kim     return (AE_OK);
705fba7fc7eSJung-uk Kim }
706fba7fc7eSJung-uk Kim 
707fba7fc7eSJung-uk Kim 
708fba7fc7eSJung-uk Kim /*******************************************************************************
709fba7fc7eSJung-uk Kim  *
710fba7fc7eSJung-uk Kim  * FUNCTION:    FlOpenAmlOutputFile
711fba7fc7eSJung-uk Kim  *
712fba7fc7eSJung-uk Kim  * PARAMETERS:  FilenamePrefix       - The user-specified ASL source file
713fba7fc7eSJung-uk Kim  *
714fba7fc7eSJung-uk Kim  * RETURN:      Status
715fba7fc7eSJung-uk Kim  *
716fba7fc7eSJung-uk Kim  * DESCRIPTION: Create the output filename (*.AML) and open the file.  The file
717fba7fc7eSJung-uk Kim  *              is created in the same directory as the parent input file.
718fba7fc7eSJung-uk Kim  *
719fba7fc7eSJung-uk Kim  ******************************************************************************/
720fba7fc7eSJung-uk Kim 
721fba7fc7eSJung-uk Kim ACPI_STATUS
722fba7fc7eSJung-uk Kim FlOpenAmlOutputFile (
723fba7fc7eSJung-uk Kim     char                    *FilenamePrefix)
724fba7fc7eSJung-uk Kim {
725fba7fc7eSJung-uk Kim     char                    *Filename;
726fba7fc7eSJung-uk Kim 
727fba7fc7eSJung-uk Kim 
728fba7fc7eSJung-uk Kim     /* Output filename usually comes from the ASL itself */
729fba7fc7eSJung-uk Kim 
730fba7fc7eSJung-uk Kim     Filename = Gbl_Files[ASL_FILE_AML_OUTPUT].Filename;
731fba7fc7eSJung-uk Kim     if (!Filename)
732fba7fc7eSJung-uk Kim     {
733fba7fc7eSJung-uk Kim         /* Create the output AML filename */
734fba7fc7eSJung-uk Kim 
735fba7fc7eSJung-uk Kim         Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_AML_CODE);
736fba7fc7eSJung-uk Kim         if (!Filename)
737fba7fc7eSJung-uk Kim         {
738fba7fc7eSJung-uk Kim             AslCommonError (ASL_ERROR, ASL_MSG_OUTPUT_FILENAME,
739fba7fc7eSJung-uk Kim                 0, 0, 0, 0, NULL, NULL);
740fba7fc7eSJung-uk Kim             return (AE_ERROR);
741fba7fc7eSJung-uk Kim         }
742fba7fc7eSJung-uk Kim     }
743fba7fc7eSJung-uk Kim 
744fba7fc7eSJung-uk Kim     /* Open the output AML file in binary mode */
745fba7fc7eSJung-uk Kim 
746fba7fc7eSJung-uk Kim     FlOpenFile (ASL_FILE_AML_OUTPUT, Filename, "w+b");
747fba7fc7eSJung-uk Kim     return (AE_OK);
748fba7fc7eSJung-uk Kim }
749fba7fc7eSJung-uk Kim 
750fba7fc7eSJung-uk Kim 
751fba7fc7eSJung-uk Kim /*******************************************************************************
752fba7fc7eSJung-uk Kim  *
753fba7fc7eSJung-uk Kim  * FUNCTION:    FlOpenMiscOutputFiles
754fba7fc7eSJung-uk Kim  *
755fba7fc7eSJung-uk Kim  * PARAMETERS:  FilenamePrefix       - The user-specified ASL source file
756fba7fc7eSJung-uk Kim  *
757fba7fc7eSJung-uk Kim  * RETURN:      Status
758fba7fc7eSJung-uk Kim  *
759fba7fc7eSJung-uk Kim  * DESCRIPTION: Create and open the various output files needed, depending on
760fba7fc7eSJung-uk Kim  *              the command line options
761fba7fc7eSJung-uk Kim  *
762fba7fc7eSJung-uk Kim  ******************************************************************************/
763fba7fc7eSJung-uk Kim 
764fba7fc7eSJung-uk Kim ACPI_STATUS
765fba7fc7eSJung-uk Kim FlOpenMiscOutputFiles (
766fba7fc7eSJung-uk Kim     char                    *FilenamePrefix)
767fba7fc7eSJung-uk Kim {
768fba7fc7eSJung-uk Kim     char                    *Filename;
769fba7fc7eSJung-uk Kim 
770fba7fc7eSJung-uk Kim 
771a88e22b7SJung-uk Kim     /* Create/Open a hex output file if asked */
772a88e22b7SJung-uk Kim 
773a88e22b7SJung-uk Kim     if (Gbl_HexOutputFlag)
774a88e22b7SJung-uk Kim     {
775a88e22b7SJung-uk Kim         Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_HEX_DUMP);
776a88e22b7SJung-uk Kim         if (!Filename)
777a88e22b7SJung-uk Kim         {
778a88e22b7SJung-uk Kim             AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME,
779a88e22b7SJung-uk Kim                 0, 0, 0, 0, NULL, NULL);
780a88e22b7SJung-uk Kim             return (AE_ERROR);
781a88e22b7SJung-uk Kim         }
782a88e22b7SJung-uk Kim 
783a88e22b7SJung-uk Kim         /* Open the hex file, text mode */
784a88e22b7SJung-uk Kim 
785a88e22b7SJung-uk Kim         FlOpenFile (ASL_FILE_HEX_OUTPUT, Filename, "w+");
786a88e22b7SJung-uk Kim 
787a88e22b7SJung-uk Kim         AslCompilerSignon (ASL_FILE_HEX_OUTPUT);
788a88e22b7SJung-uk Kim         AslCompilerFileHeader (ASL_FILE_HEX_OUTPUT);
789a88e22b7SJung-uk Kim     }
790a88e22b7SJung-uk Kim 
791a88e22b7SJung-uk Kim     /* Create/Open a debug output file if asked */
792a88e22b7SJung-uk Kim 
793a88e22b7SJung-uk Kim     if (Gbl_DebugFlag)
794a88e22b7SJung-uk Kim     {
795a88e22b7SJung-uk Kim         Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_DEBUG);
796a88e22b7SJung-uk Kim         if (!Filename)
797a88e22b7SJung-uk Kim         {
798a88e22b7SJung-uk Kim             AslCommonError (ASL_ERROR, ASL_MSG_DEBUG_FILENAME,
799a88e22b7SJung-uk Kim                 0, 0, 0, 0, NULL, NULL);
800a88e22b7SJung-uk Kim             return (AE_ERROR);
801a88e22b7SJung-uk Kim         }
802a88e22b7SJung-uk Kim 
803a88e22b7SJung-uk Kim         /* Open the debug file as STDERR, text mode */
804a88e22b7SJung-uk Kim 
805a88e22b7SJung-uk Kim         /* TBD: hide this behind a FlReopenFile function */
806a88e22b7SJung-uk Kim 
807a88e22b7SJung-uk Kim         Gbl_Files[ASL_FILE_DEBUG_OUTPUT].Filename = Filename;
808a88e22b7SJung-uk Kim         Gbl_Files[ASL_FILE_DEBUG_OUTPUT].Handle =
809a88e22b7SJung-uk Kim             freopen (Filename, "w+t", stderr);
810a88e22b7SJung-uk Kim 
811a88e22b7SJung-uk Kim         AslCompilerSignon (ASL_FILE_DEBUG_OUTPUT);
812a88e22b7SJung-uk Kim         AslCompilerFileHeader (ASL_FILE_DEBUG_OUTPUT);
813a88e22b7SJung-uk Kim     }
814a88e22b7SJung-uk Kim 
815a88e22b7SJung-uk Kim     if (Gbl_FileType == ASL_INPUT_TYPE_ASCII_DATA)
816a88e22b7SJung-uk Kim     {
817a88e22b7SJung-uk Kim         return (AE_OK);
818a88e22b7SJung-uk Kim     }
819a88e22b7SJung-uk Kim 
820fba7fc7eSJung-uk Kim     /* Create/Open a combined source output file */
821fba7fc7eSJung-uk Kim 
822fba7fc7eSJung-uk Kim     Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_SOURCE);
823fba7fc7eSJung-uk Kim     if (!Filename)
824fba7fc7eSJung-uk Kim     {
825fba7fc7eSJung-uk Kim         AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME,
826fba7fc7eSJung-uk Kim             0, 0, 0, 0, NULL, NULL);
827fba7fc7eSJung-uk Kim         return (AE_ERROR);
828fba7fc7eSJung-uk Kim     }
829fba7fc7eSJung-uk Kim 
830fba7fc7eSJung-uk Kim     /*
831fba7fc7eSJung-uk Kim      * Open the source output file, binary mode (so that LF does not get
832fba7fc7eSJung-uk Kim      * expanded to CR/LF on some systems, messing up our seek
833fba7fc7eSJung-uk Kim      * calculations.)
834fba7fc7eSJung-uk Kim      */
835fba7fc7eSJung-uk Kim     FlOpenFile (ASL_FILE_SOURCE_OUTPUT, Filename, "w+b");
836fba7fc7eSJung-uk Kim 
837fba7fc7eSJung-uk Kim     /* Create/Open a listing output file if asked */
838fba7fc7eSJung-uk Kim 
839fba7fc7eSJung-uk Kim     if (Gbl_ListingFlag)
840fba7fc7eSJung-uk Kim     {
841fba7fc7eSJung-uk Kim         Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_LISTING);
842fba7fc7eSJung-uk Kim         if (!Filename)
843fba7fc7eSJung-uk Kim         {
844fba7fc7eSJung-uk Kim             AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME,
845fba7fc7eSJung-uk Kim                 0, 0, 0, 0, NULL, NULL);
846fba7fc7eSJung-uk Kim             return (AE_ERROR);
847fba7fc7eSJung-uk Kim         }
848fba7fc7eSJung-uk Kim 
849fba7fc7eSJung-uk Kim         /* Open the listing file, text mode */
850fba7fc7eSJung-uk Kim 
851fba7fc7eSJung-uk Kim         FlOpenFile (ASL_FILE_LISTING_OUTPUT, Filename, "w+");
852fba7fc7eSJung-uk Kim 
853fba7fc7eSJung-uk Kim         AslCompilerSignon (ASL_FILE_LISTING_OUTPUT);
854fba7fc7eSJung-uk Kim         AslCompilerFileHeader (ASL_FILE_LISTING_OUTPUT);
855fba7fc7eSJung-uk Kim     }
856fba7fc7eSJung-uk Kim 
857fba7fc7eSJung-uk Kim     /* Create/Open a assembly code source output file if asked */
858fba7fc7eSJung-uk Kim 
859fba7fc7eSJung-uk Kim     if (Gbl_AsmOutputFlag)
860fba7fc7eSJung-uk Kim     {
861fba7fc7eSJung-uk Kim         Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_ASM_SOURCE);
862fba7fc7eSJung-uk Kim         if (!Filename)
863fba7fc7eSJung-uk Kim         {
864fba7fc7eSJung-uk Kim             AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME,
865fba7fc7eSJung-uk Kim                 0, 0, 0, 0, NULL, NULL);
866fba7fc7eSJung-uk Kim             return (AE_ERROR);
867fba7fc7eSJung-uk Kim         }
868fba7fc7eSJung-uk Kim 
869fba7fc7eSJung-uk Kim         /* Open the assembly code source file, text mode */
870fba7fc7eSJung-uk Kim 
871fba7fc7eSJung-uk Kim         FlOpenFile (ASL_FILE_ASM_SOURCE_OUTPUT, Filename, "w+");
872fba7fc7eSJung-uk Kim 
873fba7fc7eSJung-uk Kim         AslCompilerSignon (ASL_FILE_ASM_SOURCE_OUTPUT);
874fba7fc7eSJung-uk Kim         AslCompilerFileHeader (ASL_FILE_ASM_SOURCE_OUTPUT);
875fba7fc7eSJung-uk Kim     }
876fba7fc7eSJung-uk Kim 
877fba7fc7eSJung-uk Kim     /* Create/Open a C code source output file if asked */
878fba7fc7eSJung-uk Kim 
879fba7fc7eSJung-uk Kim     if (Gbl_C_OutputFlag)
880fba7fc7eSJung-uk Kim     {
881fba7fc7eSJung-uk Kim         Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_C_SOURCE);
882fba7fc7eSJung-uk Kim         if (!Filename)
883fba7fc7eSJung-uk Kim         {
884fba7fc7eSJung-uk Kim             AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME,
885fba7fc7eSJung-uk Kim                 0, 0, 0, 0, NULL, NULL);
886fba7fc7eSJung-uk Kim             return (AE_ERROR);
887fba7fc7eSJung-uk Kim         }
888fba7fc7eSJung-uk Kim 
889fba7fc7eSJung-uk Kim         /* Open the C code source file, text mode */
890fba7fc7eSJung-uk Kim 
891fba7fc7eSJung-uk Kim         FlOpenFile (ASL_FILE_C_SOURCE_OUTPUT, Filename, "w+");
892fba7fc7eSJung-uk Kim 
893fba7fc7eSJung-uk Kim         FlPrintFile (ASL_FILE_C_SOURCE_OUTPUT, "/*\n");
894fba7fc7eSJung-uk Kim         AslCompilerSignon (ASL_FILE_C_SOURCE_OUTPUT);
895fba7fc7eSJung-uk Kim         AslCompilerFileHeader (ASL_FILE_C_SOURCE_OUTPUT);
896fba7fc7eSJung-uk Kim     }
897fba7fc7eSJung-uk Kim 
898fba7fc7eSJung-uk Kim     /* Create/Open a assembly include output file if asked */
899fba7fc7eSJung-uk Kim 
900fba7fc7eSJung-uk Kim     if (Gbl_AsmIncludeOutputFlag)
901fba7fc7eSJung-uk Kim     {
902fba7fc7eSJung-uk Kim         Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_ASM_INCLUDE);
903fba7fc7eSJung-uk Kim         if (!Filename)
904fba7fc7eSJung-uk Kim         {
905fba7fc7eSJung-uk Kim             AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME,
906fba7fc7eSJung-uk Kim                 0, 0, 0, 0, NULL, NULL);
907fba7fc7eSJung-uk Kim             return (AE_ERROR);
908fba7fc7eSJung-uk Kim         }
909fba7fc7eSJung-uk Kim 
910fba7fc7eSJung-uk Kim         /* Open the assembly include file, text mode */
911fba7fc7eSJung-uk Kim 
912fba7fc7eSJung-uk Kim         FlOpenFile (ASL_FILE_ASM_INCLUDE_OUTPUT, Filename, "w+");
913fba7fc7eSJung-uk Kim 
914fba7fc7eSJung-uk Kim         AslCompilerSignon (ASL_FILE_ASM_INCLUDE_OUTPUT);
915fba7fc7eSJung-uk Kim         AslCompilerFileHeader (ASL_FILE_ASM_INCLUDE_OUTPUT);
916fba7fc7eSJung-uk Kim     }
917fba7fc7eSJung-uk Kim 
918fba7fc7eSJung-uk Kim     /* Create/Open a C include output file if asked */
919fba7fc7eSJung-uk Kim 
920fba7fc7eSJung-uk Kim     if (Gbl_C_IncludeOutputFlag)
921fba7fc7eSJung-uk Kim     {
922fba7fc7eSJung-uk Kim         Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_C_INCLUDE);
923fba7fc7eSJung-uk Kim         if (!Filename)
924fba7fc7eSJung-uk Kim         {
925fba7fc7eSJung-uk Kim             AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME,
926fba7fc7eSJung-uk Kim                 0, 0, 0, 0, NULL, NULL);
927fba7fc7eSJung-uk Kim             return (AE_ERROR);
928fba7fc7eSJung-uk Kim         }
929fba7fc7eSJung-uk Kim 
930fba7fc7eSJung-uk Kim         /* Open the C include file, text mode */
931fba7fc7eSJung-uk Kim 
932fba7fc7eSJung-uk Kim         FlOpenFile (ASL_FILE_C_INCLUDE_OUTPUT, Filename, "w+");
933fba7fc7eSJung-uk Kim 
934fba7fc7eSJung-uk Kim         FlPrintFile (ASL_FILE_C_INCLUDE_OUTPUT, "/*\n");
935fba7fc7eSJung-uk Kim         AslCompilerSignon (ASL_FILE_C_INCLUDE_OUTPUT);
936fba7fc7eSJung-uk Kim         AslCompilerFileHeader (ASL_FILE_C_INCLUDE_OUTPUT);
937fba7fc7eSJung-uk Kim     }
938fba7fc7eSJung-uk Kim 
939fba7fc7eSJung-uk Kim     /* Create a namespace output file if asked */
940fba7fc7eSJung-uk Kim 
941fba7fc7eSJung-uk Kim     if (Gbl_NsOutputFlag)
942fba7fc7eSJung-uk Kim     {
943fba7fc7eSJung-uk Kim         Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_NAMESPACE);
944fba7fc7eSJung-uk Kim         if (!Filename)
945fba7fc7eSJung-uk Kim         {
946fba7fc7eSJung-uk Kim             AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME,
947fba7fc7eSJung-uk Kim                 0, 0, 0, 0, NULL, NULL);
948fba7fc7eSJung-uk Kim             return (AE_ERROR);
949fba7fc7eSJung-uk Kim         }
950fba7fc7eSJung-uk Kim 
951fba7fc7eSJung-uk Kim         /* Open the namespace file, text mode */
952fba7fc7eSJung-uk Kim 
953fba7fc7eSJung-uk Kim         FlOpenFile (ASL_FILE_NAMESPACE_OUTPUT, Filename, "w+");
954fba7fc7eSJung-uk Kim 
955fba7fc7eSJung-uk Kim         AslCompilerSignon (ASL_FILE_NAMESPACE_OUTPUT);
956fba7fc7eSJung-uk Kim         AslCompilerFileHeader (ASL_FILE_NAMESPACE_OUTPUT);
957fba7fc7eSJung-uk Kim     }
958fba7fc7eSJung-uk Kim 
959fba7fc7eSJung-uk Kim     return (AE_OK);
960fba7fc7eSJung-uk Kim }
961fba7fc7eSJung-uk Kim 
962fba7fc7eSJung-uk Kim 
963fba7fc7eSJung-uk Kim #ifdef ACPI_OBSOLETE_FUNCTIONS
964fba7fc7eSJung-uk Kim /*******************************************************************************
965fba7fc7eSJung-uk Kim  *
96653289f6aSNate Lawson  * FUNCTION:    FlParseInputPathname
96753289f6aSNate Lawson  *
96853289f6aSNate Lawson  * PARAMETERS:  InputFilename       - The user-specified ASL source file to be
96953289f6aSNate Lawson  *                                    compiled
97053289f6aSNate Lawson  *
97153289f6aSNate Lawson  * RETURN:      Status
97253289f6aSNate Lawson  *
97353289f6aSNate Lawson  * DESCRIPTION: Split the input path into a directory and filename part
97453289f6aSNate Lawson  *              1) Directory part used to open include files
97553289f6aSNate Lawson  *              2) Filename part used to generate output filenames
97653289f6aSNate Lawson  *
97753289f6aSNate Lawson  ******************************************************************************/
97853289f6aSNate Lawson 
97953289f6aSNate Lawson ACPI_STATUS
98053289f6aSNate Lawson FlParseInputPathname (
98153289f6aSNate Lawson     char                    *InputFilename)
98253289f6aSNate Lawson {
98353289f6aSNate Lawson     char                    *Substring;
98453289f6aSNate Lawson 
98553289f6aSNate Lawson 
98653289f6aSNate Lawson     if (!InputFilename)
98753289f6aSNate Lawson     {
98853289f6aSNate Lawson         return (AE_OK);
98953289f6aSNate Lawson     }
99053289f6aSNate Lawson 
99153289f6aSNate Lawson     /* Get the path to the input filename's directory */
99253289f6aSNate Lawson 
99353289f6aSNate Lawson     Gbl_DirectoryPath = strdup (InputFilename);
99453289f6aSNate Lawson     if (!Gbl_DirectoryPath)
99553289f6aSNate Lawson     {
99653289f6aSNate Lawson         return (AE_NO_MEMORY);
99753289f6aSNate Lawson     }
99853289f6aSNate Lawson 
99953289f6aSNate Lawson     Substring = strrchr (Gbl_DirectoryPath, '\\');
100053289f6aSNate Lawson     if (!Substring)
100153289f6aSNate Lawson     {
100253289f6aSNate Lawson         Substring = strrchr (Gbl_DirectoryPath, '/');
100353289f6aSNate Lawson         if (!Substring)
100453289f6aSNate Lawson         {
100553289f6aSNate Lawson             Substring = strrchr (Gbl_DirectoryPath, ':');
100653289f6aSNate Lawson         }
100753289f6aSNate Lawson     }
100853289f6aSNate Lawson 
100953289f6aSNate Lawson     if (!Substring)
101053289f6aSNate Lawson     {
101153289f6aSNate Lawson         Gbl_DirectoryPath[0] = 0;
101253289f6aSNate Lawson         if (Gbl_UseDefaultAmlFilename)
101353289f6aSNate Lawson         {
101453289f6aSNate Lawson             Gbl_OutputFilenamePrefix = strdup (InputFilename);
101553289f6aSNate Lawson         }
101653289f6aSNate Lawson     }
101753289f6aSNate Lawson     else
101853289f6aSNate Lawson     {
101953289f6aSNate Lawson         if (Gbl_UseDefaultAmlFilename)
102053289f6aSNate Lawson         {
102153289f6aSNate Lawson             Gbl_OutputFilenamePrefix = strdup (Substring + 1);
102253289f6aSNate Lawson         }
102353289f6aSNate Lawson         *(Substring+1) = 0;
102453289f6aSNate Lawson     }
102553289f6aSNate Lawson 
102653289f6aSNate Lawson     return (AE_OK);
102753289f6aSNate Lawson }
1028fba7fc7eSJung-uk Kim #endif
102953289f6aSNate Lawson 
103053289f6aSNate Lawson 
1031