153289f6aSNate Lawson 
253289f6aSNate Lawson /******************************************************************************
353289f6aSNate Lawson  *
453289f6aSNate Lawson  * Module Name: aslfiles - file I/O suppoert
553289f6aSNate Lawson  *
653289f6aSNate Lawson  *****************************************************************************/
753289f6aSNate Lawson 
8d244b227SJung-uk Kim /*
9d244b227SJung-uk Kim  * Copyright (C) 2000 - 2011, Intel Corp.
1053289f6aSNate Lawson  * All rights reserved.
1153289f6aSNate Lawson  *
12d244b227SJung-uk Kim  * Redistribution and use in source and binary forms, with or without
13d244b227SJung-uk Kim  * modification, are permitted provided that the following conditions
14d244b227SJung-uk Kim  * are met:
15d244b227SJung-uk Kim  * 1. Redistributions of source code must retain the above copyright
16d244b227SJung-uk Kim  *    notice, this list of conditions, and the following disclaimer,
17d244b227SJung-uk Kim  *    without modification.
18d244b227SJung-uk Kim  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
19d244b227SJung-uk Kim  *    substantially similar to the "NO WARRANTY" disclaimer below
20d244b227SJung-uk Kim  *    ("Disclaimer") and any redistribution must be conditioned upon
21d244b227SJung-uk Kim  *    including a substantially similar Disclaimer requirement for further
22d244b227SJung-uk Kim  *    binary redistribution.
23d244b227SJung-uk Kim  * 3. Neither the names of the above-listed copyright holders nor the names
24d244b227SJung-uk Kim  *    of any contributors may be used to endorse or promote products derived
25d244b227SJung-uk Kim  *    from this software without specific prior written permission.
2653289f6aSNate Lawson  *
27d244b227SJung-uk Kim  * Alternatively, this software may be distributed under the terms of the
28d244b227SJung-uk Kim  * GNU General Public License ("GPL") version 2 as published by the Free
29d244b227SJung-uk Kim  * Software Foundation.
3053289f6aSNate Lawson  *
31d244b227SJung-uk Kim  * NO WARRANTY
32d244b227SJung-uk Kim  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
33d244b227SJung-uk Kim  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
34d244b227SJung-uk Kim  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
35d244b227SJung-uk Kim  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
36d244b227SJung-uk Kim  * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
37d244b227SJung-uk Kim  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
38d244b227SJung-uk Kim  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
39d244b227SJung-uk Kim  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
40d244b227SJung-uk Kim  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
41d244b227SJung-uk Kim  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
42d244b227SJung-uk Kim  * POSSIBILITY OF SUCH DAMAGES.
43d244b227SJung-uk Kim  */
4453289f6aSNate Lawson 
45ab6f3bf9SJung-uk Kim #include <contrib/dev/acpica/compiler/aslcompiler.h>
46ab6f3bf9SJung-uk Kim #include <contrib/dev/acpica/include/acapps.h>
4753289f6aSNate Lawson 
4853289f6aSNate Lawson #define _COMPONENT          ACPI_COMPILER
4953289f6aSNate Lawson         ACPI_MODULE_NAME    ("aslfiles")
5053289f6aSNate Lawson 
51fba7fc7eSJung-uk Kim /* Local prototypes */
52fba7fc7eSJung-uk Kim 
5342fecd12SJung-uk Kim static FILE *
54d6dd1baeSJung-uk Kim FlOpenIncludeWithPrefix (
55d6dd1baeSJung-uk Kim     char                    *PrefixDir,
56d6dd1baeSJung-uk Kim     char                    *Filename);
57d6dd1baeSJung-uk Kim 
58fba7fc7eSJung-uk Kim 
59fba7fc7eSJung-uk Kim #ifdef ACPI_OBSOLETE_FUNCTIONS
60fba7fc7eSJung-uk Kim ACPI_STATUS
61fba7fc7eSJung-uk Kim FlParseInputPathname (
62fba7fc7eSJung-uk Kim     char                    *InputFilename);
63fba7fc7eSJung-uk Kim #endif
64fba7fc7eSJung-uk Kim 
6553289f6aSNate Lawson 
6653289f6aSNate Lawson /*******************************************************************************
6753289f6aSNate Lawson  *
6853289f6aSNate Lawson  * FUNCTION:    AslAbort
6953289f6aSNate Lawson  *
7053289f6aSNate Lawson  * PARAMETERS:  None
7153289f6aSNate Lawson  *
7253289f6aSNate Lawson  * RETURN:      None
7353289f6aSNate Lawson  *
7453289f6aSNate Lawson  * DESCRIPTION: Dump the error log and abort the compiler.  Used for serious
7553289f6aSNate Lawson  *              I/O errors
7653289f6aSNate Lawson  *
7753289f6aSNate Lawson  ******************************************************************************/
7853289f6aSNate Lawson 
7953289f6aSNate Lawson void
80fba7fc7eSJung-uk Kim AslAbort (
81fba7fc7eSJung-uk Kim     void)
8253289f6aSNate Lawson {
8353289f6aSNate Lawson 
8453289f6aSNate Lawson     AePrintErrorLog (ASL_FILE_STDOUT);
8553289f6aSNate Lawson     if (Gbl_DebugFlag)
8653289f6aSNate Lawson     {
8753289f6aSNate Lawson         /* Print error summary to the debug file */
8853289f6aSNate Lawson 
8953289f6aSNate Lawson         AePrintErrorLog (ASL_FILE_STDERR);
9053289f6aSNate Lawson     }
9153289f6aSNate Lawson 
92fba7fc7eSJung-uk Kim     exit (1);
9353289f6aSNate Lawson }
9453289f6aSNate Lawson 
9553289f6aSNate Lawson 
9653289f6aSNate Lawson /*******************************************************************************
9753289f6aSNate Lawson  *
9853289f6aSNate Lawson  * FUNCTION:    FlFileError
9953289f6aSNate Lawson  *
10053289f6aSNate Lawson  * PARAMETERS:  FileId              - Index into file info array
10153289f6aSNate Lawson  *              ErrorId             - Index into error message array
10253289f6aSNate Lawson  *
10353289f6aSNate Lawson  * RETURN:      None
10453289f6aSNate Lawson  *
10553289f6aSNate Lawson  * DESCRIPTION: Decode errno to an error message and add the entire error
10653289f6aSNate Lawson  *              to the error log.
10753289f6aSNate Lawson  *
10853289f6aSNate Lawson  ******************************************************************************/
10953289f6aSNate Lawson 
11053289f6aSNate Lawson void
11153289f6aSNate Lawson FlFileError (
11253289f6aSNate Lawson     UINT32                  FileId,
11353289f6aSNate Lawson     UINT8                   ErrorId)
11453289f6aSNate Lawson {
11553289f6aSNate Lawson 
116fba7fc7eSJung-uk Kim     sprintf (MsgBuffer, "\"%s\" (%s)", Gbl_Files[FileId].Filename,
117fba7fc7eSJung-uk Kim         strerror (errno));
11853289f6aSNate Lawson     AslCommonError (ASL_ERROR, ErrorId, 0, 0, 0, 0, NULL, MsgBuffer);
11953289f6aSNate Lawson }
12053289f6aSNate Lawson 
12153289f6aSNate Lawson 
12253289f6aSNate Lawson /*******************************************************************************
12353289f6aSNate Lawson  *
12453289f6aSNate Lawson  * FUNCTION:    FlOpenFile
12553289f6aSNate Lawson  *
12653289f6aSNate Lawson  * PARAMETERS:  FileId              - Index into file info array
12753289f6aSNate Lawson  *              Filename            - file pathname to open
12853289f6aSNate Lawson  *              Mode                - Open mode for fopen
12953289f6aSNate Lawson  *
130fba7fc7eSJung-uk Kim  * RETURN:      None
13153289f6aSNate Lawson  *
13253289f6aSNate Lawson  * DESCRIPTION: Open a file.
13353289f6aSNate Lawson  *              NOTE: Aborts compiler on any error.
13453289f6aSNate Lawson  *
13553289f6aSNate Lawson  ******************************************************************************/
13653289f6aSNate Lawson 
137a88e22b7SJung-uk Kim void
13853289f6aSNate Lawson FlOpenFile (
13953289f6aSNate Lawson     UINT32                  FileId,
14053289f6aSNate Lawson     char                    *Filename,
14153289f6aSNate Lawson     char                    *Mode)
14253289f6aSNate Lawson {
14353289f6aSNate Lawson     FILE                    *File;
14453289f6aSNate Lawson 
14553289f6aSNate Lawson 
14653289f6aSNate Lawson     File = fopen (Filename, Mode);
14753289f6aSNate Lawson 
14853289f6aSNate Lawson     Gbl_Files[FileId].Filename = Filename;
14953289f6aSNate Lawson     Gbl_Files[FileId].Handle   = File;
15053289f6aSNate Lawson 
15153289f6aSNate Lawson     if (!File)
15253289f6aSNate Lawson     {
15353289f6aSNate Lawson         FlFileError (FileId, ASL_MSG_OPEN);
15453289f6aSNate Lawson         AslAbort ();
15553289f6aSNate Lawson     }
15653289f6aSNate Lawson }
15753289f6aSNate Lawson 
15853289f6aSNate Lawson 
15953289f6aSNate Lawson /*******************************************************************************
16053289f6aSNate Lawson  *
1613f5e024cSJung-uk Kim  * FUNCTION:    FlGetFileSize
1623f5e024cSJung-uk Kim  *
1633f5e024cSJung-uk Kim  * PARAMETERS:  FileId              - Index into file info array
1643f5e024cSJung-uk Kim  *
1653f5e024cSJung-uk Kim  * RETURN:      File Size
1663f5e024cSJung-uk Kim  *
1673f5e024cSJung-uk Kim  * DESCRIPTION: Get current file size. Uses seek-to-EOF. File must be open.
1683f5e024cSJung-uk Kim  *
1693f5e024cSJung-uk Kim  ******************************************************************************/
1703f5e024cSJung-uk Kim 
1713f5e024cSJung-uk Kim UINT32
1723f5e024cSJung-uk Kim FlGetFileSize (
1733f5e024cSJung-uk Kim     UINT32                  FileId)
1743f5e024cSJung-uk Kim {
1753f5e024cSJung-uk Kim     FILE                    *fp;
1763f5e024cSJung-uk Kim     UINT32                  FileSize;
1773f5e024cSJung-uk Kim 
1783f5e024cSJung-uk Kim 
1793f5e024cSJung-uk Kim     fp = Gbl_Files[FileId].Handle;
1803f5e024cSJung-uk Kim 
1813f5e024cSJung-uk Kim     fseek (fp, 0, SEEK_END);
1823f5e024cSJung-uk Kim     FileSize = (UINT32) ftell (fp);
1833f5e024cSJung-uk Kim     fseek (fp, 0, SEEK_SET);
1843f5e024cSJung-uk Kim 
1853f5e024cSJung-uk Kim     return (FileSize);
1863f5e024cSJung-uk Kim }
1873f5e024cSJung-uk Kim 
1883f5e024cSJung-uk Kim 
1893f5e024cSJung-uk Kim /*******************************************************************************
1903f5e024cSJung-uk Kim  *
19153289f6aSNate Lawson  * FUNCTION:    FlReadFile
19253289f6aSNate Lawson  *
19353289f6aSNate Lawson  * PARAMETERS:  FileId              - Index into file info array
19453289f6aSNate Lawson  *              Buffer              - Where to place the data
19553289f6aSNate Lawson  *              Length              - Amount to read
19653289f6aSNate Lawson  *
19753289f6aSNate Lawson  * RETURN:      Status.  AE_ERROR indicates EOF.
19853289f6aSNate Lawson  *
19953289f6aSNate Lawson  * DESCRIPTION: Read data from an open file.
20053289f6aSNate Lawson  *              NOTE: Aborts compiler on any error.
20153289f6aSNate Lawson  *
20253289f6aSNate Lawson  ******************************************************************************/
20353289f6aSNate Lawson 
20453289f6aSNate Lawson ACPI_STATUS
20553289f6aSNate Lawson FlReadFile (
20653289f6aSNate Lawson     UINT32                  FileId,
20753289f6aSNate Lawson     void                    *Buffer,
20853289f6aSNate Lawson     UINT32                  Length)
20953289f6aSNate Lawson {
21053289f6aSNate Lawson     UINT32                  Actual;
21153289f6aSNate Lawson 
21253289f6aSNate Lawson 
21353289f6aSNate Lawson     /* Read and check for error */
21453289f6aSNate Lawson 
21553289f6aSNate Lawson     Actual = fread (Buffer, 1, Length, Gbl_Files[FileId].Handle);
21653289f6aSNate Lawson     if (Actual != Length)
21753289f6aSNate Lawson     {
21853289f6aSNate Lawson         if (feof (Gbl_Files[FileId].Handle))
21953289f6aSNate Lawson         {
22053289f6aSNate Lawson             /* End-of-file, just return error */
22153289f6aSNate Lawson 
22253289f6aSNate Lawson             return (AE_ERROR);
22353289f6aSNate Lawson         }
22453289f6aSNate Lawson 
22553289f6aSNate Lawson         FlFileError (FileId, ASL_MSG_READ);
22653289f6aSNate Lawson         AslAbort ();
22753289f6aSNate Lawson     }
22853289f6aSNate Lawson 
22953289f6aSNate Lawson     return (AE_OK);
23053289f6aSNate Lawson }
23153289f6aSNate Lawson 
23253289f6aSNate Lawson 
23353289f6aSNate Lawson /*******************************************************************************
23453289f6aSNate Lawson  *
23553289f6aSNate Lawson  * FUNCTION:    FlWriteFile
23653289f6aSNate Lawson  *
23753289f6aSNate Lawson  * PARAMETERS:  FileId              - Index into file info array
23853289f6aSNate Lawson  *              Buffer              - Data to write
23953289f6aSNate Lawson  *              Length              - Amount of data to write
24053289f6aSNate Lawson  *
241fba7fc7eSJung-uk Kim  * RETURN:      None
24253289f6aSNate Lawson  *
24353289f6aSNate Lawson  * DESCRIPTION: Write data to an open file.
24453289f6aSNate Lawson  *              NOTE: Aborts compiler on any error.
24553289f6aSNate Lawson  *
24653289f6aSNate Lawson  ******************************************************************************/
24753289f6aSNate Lawson 
24853289f6aSNate Lawson void
24953289f6aSNate Lawson FlWriteFile (
25053289f6aSNate Lawson     UINT32                  FileId,
25153289f6aSNate Lawson     void                    *Buffer,
25253289f6aSNate Lawson     UINT32                  Length)
25353289f6aSNate Lawson {
25453289f6aSNate Lawson     UINT32                  Actual;
25553289f6aSNate Lawson 
25653289f6aSNate Lawson 
25753289f6aSNate Lawson     /* Write and check for error */
25853289f6aSNate Lawson 
25953289f6aSNate Lawson     Actual = fwrite ((char *) Buffer, 1, Length, Gbl_Files[FileId].Handle);
26053289f6aSNate Lawson     if (Actual != Length)
26153289f6aSNate Lawson     {
26253289f6aSNate Lawson         FlFileError (FileId, ASL_MSG_WRITE);
26353289f6aSNate Lawson         AslAbort ();
26453289f6aSNate Lawson     }
26553289f6aSNate Lawson }
26653289f6aSNate Lawson 
26753289f6aSNate Lawson 
26853289f6aSNate Lawson /*******************************************************************************
26953289f6aSNate Lawson  *
27053289f6aSNate Lawson  * FUNCTION:    FlPrintFile
27153289f6aSNate Lawson  *
27253289f6aSNate Lawson  * PARAMETERS:  FileId              - Index into file info array
27353289f6aSNate Lawson  *              Format              - Printf format string
27453289f6aSNate Lawson  *              ...                 - Printf arguments
27553289f6aSNate Lawson  *
27653289f6aSNate Lawson  * RETURN:      None
27753289f6aSNate Lawson  *
27853289f6aSNate Lawson  * DESCRIPTION: Formatted write to an open file.
27953289f6aSNate Lawson  *              NOTE: Aborts compiler on any error.
28053289f6aSNate Lawson  *
28153289f6aSNate Lawson  ******************************************************************************/
28253289f6aSNate Lawson 
28353289f6aSNate Lawson void
28453289f6aSNate Lawson FlPrintFile (
28553289f6aSNate Lawson     UINT32                  FileId,
28653289f6aSNate Lawson     char                    *Format,
28753289f6aSNate Lawson     ...)
28853289f6aSNate Lawson {
28953289f6aSNate Lawson     INT32                   Actual;
29053289f6aSNate Lawson     va_list                 Args;
29153289f6aSNate Lawson 
29253289f6aSNate Lawson 
29353289f6aSNate Lawson     va_start (Args, Format);
29453289f6aSNate Lawson 
29553289f6aSNate Lawson     Actual = vfprintf (Gbl_Files[FileId].Handle, Format, Args);
296a9f12690SJung-uk Kim     va_end (Args);
297a9f12690SJung-uk Kim 
29853289f6aSNate Lawson     if (Actual == -1)
29953289f6aSNate Lawson     {
30053289f6aSNate Lawson         FlFileError (FileId, ASL_MSG_WRITE);
30153289f6aSNate Lawson         AslAbort ();
30253289f6aSNate Lawson     }
30353289f6aSNate Lawson }
30453289f6aSNate Lawson 
30553289f6aSNate Lawson 
30653289f6aSNate Lawson /*******************************************************************************
30753289f6aSNate Lawson  *
30853289f6aSNate Lawson  * FUNCTION:    FlSeekFile
30953289f6aSNate Lawson  *
31053289f6aSNate Lawson  * PARAMETERS:  FileId              - Index into file info array
31153289f6aSNate Lawson  *              Offset              - Absolute byte offset in file
31253289f6aSNate Lawson  *
313fba7fc7eSJung-uk Kim  * RETURN:      None
31453289f6aSNate Lawson  *
31553289f6aSNate Lawson  * DESCRIPTION: Seek to absolute offset
31653289f6aSNate Lawson  *              NOTE: Aborts compiler on any error.
31753289f6aSNate Lawson  *
31853289f6aSNate Lawson  ******************************************************************************/
31953289f6aSNate Lawson 
32053289f6aSNate Lawson void
32153289f6aSNate Lawson FlSeekFile (
32253289f6aSNate Lawson     UINT32                  FileId,
32353289f6aSNate Lawson     long                    Offset)
32453289f6aSNate Lawson {
32553289f6aSNate Lawson     int                     Error;
32653289f6aSNate Lawson 
32753289f6aSNate Lawson 
32853289f6aSNate Lawson     Error = fseek (Gbl_Files[FileId].Handle, Offset, SEEK_SET);
32953289f6aSNate Lawson     if (Error)
33053289f6aSNate Lawson     {
33153289f6aSNate Lawson         FlFileError (FileId, ASL_MSG_SEEK);
33253289f6aSNate Lawson         AslAbort ();
33353289f6aSNate Lawson     }
33453289f6aSNate Lawson }
33553289f6aSNate Lawson 
33653289f6aSNate Lawson 
33753289f6aSNate Lawson /*******************************************************************************
33853289f6aSNate Lawson  *
33953289f6aSNate Lawson  * FUNCTION:    FlCloseFile
34053289f6aSNate Lawson  *
34153289f6aSNate Lawson  * PARAMETERS:  FileId              - Index into file info array
34253289f6aSNate Lawson  *
343fba7fc7eSJung-uk Kim  * RETURN:      None
34453289f6aSNate Lawson  *
34553289f6aSNate Lawson  * DESCRIPTION: Close an open file.  Aborts compiler on error
34653289f6aSNate Lawson  *
34753289f6aSNate Lawson  ******************************************************************************/
34853289f6aSNate Lawson 
34953289f6aSNate Lawson void
35053289f6aSNate Lawson FlCloseFile (
35153289f6aSNate Lawson     UINT32                  FileId)
35253289f6aSNate Lawson {
35353289f6aSNate Lawson     int                     Error;
35453289f6aSNate Lawson 
35553289f6aSNate Lawson 
35653289f6aSNate Lawson     if (!Gbl_Files[FileId].Handle)
35753289f6aSNate Lawson     {
35853289f6aSNate Lawson         return;
35953289f6aSNate Lawson     }
36053289f6aSNate Lawson 
36153289f6aSNate Lawson     Error = fclose (Gbl_Files[FileId].Handle);
36253289f6aSNate Lawson     Gbl_Files[FileId].Handle = NULL;
36353289f6aSNate Lawson 
36453289f6aSNate Lawson     if (Error)
36553289f6aSNate Lawson     {
36653289f6aSNate Lawson         FlFileError (FileId, ASL_MSG_CLOSE);
36753289f6aSNate Lawson         AslAbort ();
36853289f6aSNate Lawson     }
36953289f6aSNate Lawson 
37053289f6aSNate Lawson     return;
37153289f6aSNate Lawson }
37253289f6aSNate Lawson 
37353289f6aSNate Lawson 
37453289f6aSNate Lawson /*******************************************************************************
37553289f6aSNate Lawson  *
37653289f6aSNate Lawson  * FUNCTION:    FlSetLineNumber
37753289f6aSNate Lawson  *
37853289f6aSNate Lawson  * PARAMETERS:  Op        - Parse node for the LINE asl statement
37953289f6aSNate Lawson  *
38053289f6aSNate Lawson  * RETURN:      None.
38153289f6aSNate Lawson  *
38253289f6aSNate Lawson  * DESCRIPTION: Set the current line number
38353289f6aSNate Lawson  *
38453289f6aSNate Lawson  ******************************************************************************/
38553289f6aSNate Lawson 
38653289f6aSNate Lawson void
38753289f6aSNate Lawson FlSetLineNumber (
38853289f6aSNate Lawson     ACPI_PARSE_OBJECT       *Op)
38953289f6aSNate Lawson {
39053289f6aSNate Lawson 
39153289f6aSNate Lawson     Gbl_CurrentLineNumber = (UINT32) Op->Asl.Value.Integer;
39253289f6aSNate Lawson     Gbl_LogicalLineNumber = (UINT32) Op->Asl.Value.Integer;
39353289f6aSNate Lawson }
39453289f6aSNate Lawson 
39553289f6aSNate Lawson 
39653289f6aSNate Lawson /*******************************************************************************
39753289f6aSNate Lawson  *
398d6dd1baeSJung-uk Kim  * FUNCTION:    FlAddIncludeDirectory
399d6dd1baeSJung-uk Kim  *
400d6dd1baeSJung-uk Kim  * PARAMETERS:  Dir             - Directory pathname string
401d6dd1baeSJung-uk Kim  *
402d6dd1baeSJung-uk Kim  * RETURN:      None
403d6dd1baeSJung-uk Kim  *
404d6dd1baeSJung-uk Kim  * DESCRIPTION: Add a directory the list of include prefix directories.
405d6dd1baeSJung-uk Kim  *
406d6dd1baeSJung-uk Kim  ******************************************************************************/
407d6dd1baeSJung-uk Kim 
408d6dd1baeSJung-uk Kim void
409d6dd1baeSJung-uk Kim FlAddIncludeDirectory (
410d6dd1baeSJung-uk Kim     char                    *Dir)
411d6dd1baeSJung-uk Kim {
412d6dd1baeSJung-uk Kim     ASL_INCLUDE_DIR         *NewDir;
413d6dd1baeSJung-uk Kim     ASL_INCLUDE_DIR         *NextDir;
414d6dd1baeSJung-uk Kim     ASL_INCLUDE_DIR         *PrevDir = NULL;
415d6dd1baeSJung-uk Kim     UINT32                  NeedsSeparator = 0;
416d6dd1baeSJung-uk Kim     size_t                  DirLength;
417d6dd1baeSJung-uk Kim 
418d6dd1baeSJung-uk Kim 
419d6dd1baeSJung-uk Kim     DirLength = strlen (Dir);
420d6dd1baeSJung-uk Kim     if (!DirLength)
421d6dd1baeSJung-uk Kim     {
422d6dd1baeSJung-uk Kim         return;
423d6dd1baeSJung-uk Kim     }
424d6dd1baeSJung-uk Kim 
425d6dd1baeSJung-uk Kim     /* Make sure that the pathname ends with a path separator */
426d6dd1baeSJung-uk Kim 
427d6dd1baeSJung-uk Kim     if ((Dir[DirLength-1] != '/') &&
428d6dd1baeSJung-uk Kim         (Dir[DirLength-1] != '\\'))
429d6dd1baeSJung-uk Kim     {
430d6dd1baeSJung-uk Kim         NeedsSeparator = 1;
431d6dd1baeSJung-uk Kim     }
432d6dd1baeSJung-uk Kim 
433d6dd1baeSJung-uk Kim     NewDir = ACPI_ALLOCATE_ZEROED (sizeof (ASL_INCLUDE_DIR));
434d6dd1baeSJung-uk Kim     NewDir->Dir = ACPI_ALLOCATE (DirLength + 1 + NeedsSeparator);
435d6dd1baeSJung-uk Kim     strcpy (NewDir->Dir, Dir);
436d6dd1baeSJung-uk Kim     if (NeedsSeparator)
437d6dd1baeSJung-uk Kim     {
438d6dd1baeSJung-uk Kim         strcat (NewDir->Dir, "/");
439d6dd1baeSJung-uk Kim     }
440d6dd1baeSJung-uk Kim 
441d6dd1baeSJung-uk Kim     /*
442d6dd1baeSJung-uk Kim      * Preserve command line ordering of -I options by adding new elements
443d6dd1baeSJung-uk Kim      * at the end of the list
444d6dd1baeSJung-uk Kim      */
445d6dd1baeSJung-uk Kim     NextDir = Gbl_IncludeDirList;
446d6dd1baeSJung-uk Kim     while (NextDir)
447d6dd1baeSJung-uk Kim     {
448d6dd1baeSJung-uk Kim         PrevDir = NextDir;
449d6dd1baeSJung-uk Kim         NextDir = NextDir->Next;
450d6dd1baeSJung-uk Kim     }
451d6dd1baeSJung-uk Kim 
452d6dd1baeSJung-uk Kim     if (PrevDir)
453d6dd1baeSJung-uk Kim     {
454d6dd1baeSJung-uk Kim         PrevDir->Next = NewDir;
455d6dd1baeSJung-uk Kim     }
456d6dd1baeSJung-uk Kim     else
457d6dd1baeSJung-uk Kim     {
458d6dd1baeSJung-uk Kim         Gbl_IncludeDirList = NewDir;
459d6dd1baeSJung-uk Kim     }
460d6dd1baeSJung-uk Kim }
461d6dd1baeSJung-uk Kim 
462d6dd1baeSJung-uk Kim 
463d6dd1baeSJung-uk Kim /*******************************************************************************
464d6dd1baeSJung-uk Kim  *
465d6dd1baeSJung-uk Kim  * FUNCTION:    FlOpenIncludeWithPrefix
466d6dd1baeSJung-uk Kim  *
467d6dd1baeSJung-uk Kim  * PARAMETERS:  PrefixDir       - Prefix directory pathname. Can be a zero
468d6dd1baeSJung-uk Kim  *                                length string.
469d6dd1baeSJung-uk Kim  *              Filename        - The include filename from the source ASL.
470d6dd1baeSJung-uk Kim  *
471d6dd1baeSJung-uk Kim  * RETURN:      Valid file descriptor if successful. Null otherwise.
472d6dd1baeSJung-uk Kim  *
473d6dd1baeSJung-uk Kim  * DESCRIPTION: Open an include file and push it on the input file stack.
474d6dd1baeSJung-uk Kim  *
475d6dd1baeSJung-uk Kim  ******************************************************************************/
476d6dd1baeSJung-uk Kim 
47742fecd12SJung-uk Kim static FILE *
478d6dd1baeSJung-uk Kim FlOpenIncludeWithPrefix (
479d6dd1baeSJung-uk Kim     char                    *PrefixDir,
480d6dd1baeSJung-uk Kim     char                    *Filename)
481d6dd1baeSJung-uk Kim {
482d6dd1baeSJung-uk Kim     FILE                    *IncludeFile;
483d6dd1baeSJung-uk Kim     char                    *Pathname;
484d6dd1baeSJung-uk Kim 
485d6dd1baeSJung-uk Kim 
486d6dd1baeSJung-uk Kim     /* Build the full pathname to the file */
487d6dd1baeSJung-uk Kim 
488d6dd1baeSJung-uk Kim     Pathname = ACPI_ALLOCATE (strlen (PrefixDir) + strlen (Filename) + 1);
489d6dd1baeSJung-uk Kim 
490d6dd1baeSJung-uk Kim     strcpy (Pathname, PrefixDir);
491d6dd1baeSJung-uk Kim     strcat (Pathname, Filename);
492d6dd1baeSJung-uk Kim 
493d6dd1baeSJung-uk Kim     DbgPrint (ASL_PARSE_OUTPUT, "\nAttempt to open include file: path %s\n\n",
494d6dd1baeSJung-uk Kim         Pathname);
495d6dd1baeSJung-uk Kim 
496d6dd1baeSJung-uk Kim     /* Attempt to open the file, push if successful */
497d6dd1baeSJung-uk Kim 
498d6dd1baeSJung-uk Kim     IncludeFile = fopen (Pathname, "r");
499d6dd1baeSJung-uk Kim     if (IncludeFile)
500d6dd1baeSJung-uk Kim     {
501d6dd1baeSJung-uk Kim         /* Push the include file on the open input file stack */
502d6dd1baeSJung-uk Kim 
503d6dd1baeSJung-uk Kim         AslPushInputFileStack (IncludeFile, Pathname);
504d6dd1baeSJung-uk Kim         return (IncludeFile);
505d6dd1baeSJung-uk Kim     }
506d6dd1baeSJung-uk Kim 
507d6dd1baeSJung-uk Kim     ACPI_FREE (Pathname);
508d6dd1baeSJung-uk Kim     return (NULL);
509d6dd1baeSJung-uk Kim }
510d6dd1baeSJung-uk Kim 
511d6dd1baeSJung-uk Kim 
512d6dd1baeSJung-uk Kim /*******************************************************************************
513d6dd1baeSJung-uk Kim  *
51453289f6aSNate Lawson  * FUNCTION:    FlOpenIncludeFile
51553289f6aSNate Lawson  *
51653289f6aSNate Lawson  * PARAMETERS:  Op        - Parse node for the INCLUDE ASL statement
51753289f6aSNate Lawson  *
51853289f6aSNate Lawson  * RETURN:      None.
51953289f6aSNate Lawson  *
52053289f6aSNate Lawson  * DESCRIPTION: Open an include file and push it on the input file stack.
52153289f6aSNate Lawson  *
52253289f6aSNate Lawson  ******************************************************************************/
52353289f6aSNate Lawson 
52453289f6aSNate Lawson void
52553289f6aSNate Lawson FlOpenIncludeFile (
52653289f6aSNate Lawson     ACPI_PARSE_OBJECT       *Op)
52753289f6aSNate Lawson {
528d6dd1baeSJung-uk Kim     FILE                    *IncludeFile;
529d6dd1baeSJung-uk Kim     ASL_INCLUDE_DIR         *NextDir;
53053289f6aSNate Lawson 
53153289f6aSNate Lawson 
53253289f6aSNate Lawson     /* Op must be valid */
53353289f6aSNate Lawson 
53453289f6aSNate Lawson     if (!Op)
53553289f6aSNate Lawson     {
53653289f6aSNate Lawson         AslCommonError (ASL_ERROR, ASL_MSG_INCLUDE_FILE_OPEN,
53753289f6aSNate Lawson             Gbl_CurrentLineNumber, Gbl_LogicalLineNumber,
53853289f6aSNate Lawson             Gbl_InputByteCount, Gbl_CurrentColumn,
53953289f6aSNate Lawson             Gbl_Files[ASL_FILE_INPUT].Filename, " - Null parse node");
54053289f6aSNate Lawson 
54153289f6aSNate Lawson         return;
54253289f6aSNate Lawson     }
54353289f6aSNate Lawson 
54453289f6aSNate Lawson     /*
54553289f6aSNate Lawson      * Flush out the "include ()" statement on this line, start
54653289f6aSNate Lawson      * the actual include file on the next line
54753289f6aSNate Lawson      */
54853289f6aSNate Lawson     ResetCurrentLineBuffer ();
54953289f6aSNate Lawson     FlPrintFile (ASL_FILE_SOURCE_OUTPUT, "\n");
55053289f6aSNate Lawson     Gbl_CurrentLineOffset++;
55153289f6aSNate Lawson 
55253289f6aSNate Lawson 
553d6dd1baeSJung-uk Kim     /* Attempt to open the include file */
554d6dd1baeSJung-uk Kim 
555d6dd1baeSJung-uk Kim     /* If the file specifies an absolute path, just open it */
556d6dd1baeSJung-uk Kim 
557d6dd1baeSJung-uk Kim     if ((Op->Asl.Value.String[0] == '/')  ||
558d6dd1baeSJung-uk Kim         (Op->Asl.Value.String[0] == '\\') ||
559d6dd1baeSJung-uk Kim         (Op->Asl.Value.String[1] == ':'))
56053289f6aSNate Lawson     {
561d6dd1baeSJung-uk Kim         IncludeFile = FlOpenIncludeWithPrefix ("", Op->Asl.Value.String);
562d6dd1baeSJung-uk Kim         if (!IncludeFile)
563d6dd1baeSJung-uk Kim         {
564d6dd1baeSJung-uk Kim             goto ErrorExit;
565d6dd1baeSJung-uk Kim         }
56653289f6aSNate Lawson         return;
56753289f6aSNate Lawson     }
56853289f6aSNate Lawson 
569d6dd1baeSJung-uk Kim     /*
570d6dd1baeSJung-uk Kim      * The include filename is not an absolute path.
571d6dd1baeSJung-uk Kim      *
572d6dd1baeSJung-uk Kim      * First, search for the file within the "local" directory -- meaning
573d6dd1baeSJung-uk Kim      * the same directory that contains the source file.
574d6dd1baeSJung-uk Kim      *
575d6dd1baeSJung-uk Kim      * Construct the file pathname from the global directory name.
576d6dd1baeSJung-uk Kim      */
577d6dd1baeSJung-uk Kim     IncludeFile = FlOpenIncludeWithPrefix (Gbl_DirectoryPath, Op->Asl.Value.String);
578d6dd1baeSJung-uk Kim     if (IncludeFile)
579d6dd1baeSJung-uk Kim     {
580d6dd1baeSJung-uk Kim         return;
581d6dd1baeSJung-uk Kim     }
58253289f6aSNate Lawson 
583d6dd1baeSJung-uk Kim     /*
584d6dd1baeSJung-uk Kim      * Second, search for the file within the (possibly multiple) directories
585d6dd1baeSJung-uk Kim      * specified by the -I option on the command line.
586d6dd1baeSJung-uk Kim      */
587d6dd1baeSJung-uk Kim     NextDir = Gbl_IncludeDirList;
588d6dd1baeSJung-uk Kim     while (NextDir)
589d6dd1baeSJung-uk Kim     {
590d6dd1baeSJung-uk Kim         IncludeFile = FlOpenIncludeWithPrefix (NextDir->Dir, Op->Asl.Value.String);
591d6dd1baeSJung-uk Kim         if (IncludeFile)
592d6dd1baeSJung-uk Kim         {
593d6dd1baeSJung-uk Kim             return;
594d6dd1baeSJung-uk Kim         }
595d6dd1baeSJung-uk Kim 
596d6dd1baeSJung-uk Kim         NextDir = NextDir->Next;
597d6dd1baeSJung-uk Kim     }
598d6dd1baeSJung-uk Kim 
599d6dd1baeSJung-uk Kim     /* We could not open the include file after trying very hard */
600d6dd1baeSJung-uk Kim 
601d6dd1baeSJung-uk Kim ErrorExit:
602d6dd1baeSJung-uk Kim     sprintf (MsgBuffer, "%s, %s", Op->Asl.Value.String, strerror (errno));
603d6dd1baeSJung-uk Kim     AslError (ASL_ERROR, ASL_MSG_INCLUDE_FILE_OPEN, Op, MsgBuffer);
60453289f6aSNate Lawson }
60553289f6aSNate Lawson 
60653289f6aSNate Lawson 
60753289f6aSNate Lawson /*******************************************************************************
60853289f6aSNate Lawson  *
609fba7fc7eSJung-uk Kim  * FUNCTION:    FlOpenInputFile
610fba7fc7eSJung-uk Kim  *
611fba7fc7eSJung-uk Kim  * PARAMETERS:  InputFilename       - The user-specified ASL source file to be
612fba7fc7eSJung-uk Kim  *                                    compiled
613fba7fc7eSJung-uk Kim  *
614fba7fc7eSJung-uk Kim  * RETURN:      Status
615fba7fc7eSJung-uk Kim  *
616fba7fc7eSJung-uk Kim  * DESCRIPTION: Open the specified input file, and save the directory path to
617fba7fc7eSJung-uk Kim  *              the file so that include files can be opened in
618fba7fc7eSJung-uk Kim  *              the same directory.
619fba7fc7eSJung-uk Kim  *
620fba7fc7eSJung-uk Kim  ******************************************************************************/
621fba7fc7eSJung-uk Kim 
622fba7fc7eSJung-uk Kim ACPI_STATUS
623fba7fc7eSJung-uk Kim FlOpenInputFile (
624fba7fc7eSJung-uk Kim     char                    *InputFilename)
625fba7fc7eSJung-uk Kim {
626fba7fc7eSJung-uk Kim 
627fba7fc7eSJung-uk Kim     /* Open the input ASL file, text mode */
628fba7fc7eSJung-uk Kim 
629fba7fc7eSJung-uk Kim     FlOpenFile (ASL_FILE_INPUT, InputFilename, "r");
630fba7fc7eSJung-uk Kim     AslCompilerin = Gbl_Files[ASL_FILE_INPUT].Handle;
631fba7fc7eSJung-uk Kim 
632fba7fc7eSJung-uk Kim     return (AE_OK);
633fba7fc7eSJung-uk Kim }
634fba7fc7eSJung-uk Kim 
635fba7fc7eSJung-uk Kim 
636fba7fc7eSJung-uk Kim /*******************************************************************************
637fba7fc7eSJung-uk Kim  *
638fba7fc7eSJung-uk Kim  * FUNCTION:    FlOpenAmlOutputFile
639fba7fc7eSJung-uk Kim  *
640fba7fc7eSJung-uk Kim  * PARAMETERS:  FilenamePrefix       - The user-specified ASL source file
641fba7fc7eSJung-uk Kim  *
642fba7fc7eSJung-uk Kim  * RETURN:      Status
643fba7fc7eSJung-uk Kim  *
644fba7fc7eSJung-uk Kim  * DESCRIPTION: Create the output filename (*.AML) and open the file.  The file
645fba7fc7eSJung-uk Kim  *              is created in the same directory as the parent input file.
646fba7fc7eSJung-uk Kim  *
647fba7fc7eSJung-uk Kim  ******************************************************************************/
648fba7fc7eSJung-uk Kim 
649fba7fc7eSJung-uk Kim ACPI_STATUS
650fba7fc7eSJung-uk Kim FlOpenAmlOutputFile (
651fba7fc7eSJung-uk Kim     char                    *FilenamePrefix)
652fba7fc7eSJung-uk Kim {
653fba7fc7eSJung-uk Kim     char                    *Filename;
654fba7fc7eSJung-uk Kim 
655fba7fc7eSJung-uk Kim 
656fba7fc7eSJung-uk Kim     /* Output filename usually comes from the ASL itself */
657fba7fc7eSJung-uk Kim 
658fba7fc7eSJung-uk Kim     Filename = Gbl_Files[ASL_FILE_AML_OUTPUT].Filename;
659fba7fc7eSJung-uk Kim     if (!Filename)
660fba7fc7eSJung-uk Kim     {
661fba7fc7eSJung-uk Kim         /* Create the output AML filename */
662fba7fc7eSJung-uk Kim 
663fba7fc7eSJung-uk Kim         Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_AML_CODE);
664fba7fc7eSJung-uk Kim         if (!Filename)
665fba7fc7eSJung-uk Kim         {
666fba7fc7eSJung-uk Kim             AslCommonError (ASL_ERROR, ASL_MSG_OUTPUT_FILENAME,
667fba7fc7eSJung-uk Kim                 0, 0, 0, 0, NULL, NULL);
668fba7fc7eSJung-uk Kim             return (AE_ERROR);
669fba7fc7eSJung-uk Kim         }
670fba7fc7eSJung-uk Kim     }
671fba7fc7eSJung-uk Kim 
672fba7fc7eSJung-uk Kim     /* Open the output AML file in binary mode */
673fba7fc7eSJung-uk Kim 
674fba7fc7eSJung-uk Kim     FlOpenFile (ASL_FILE_AML_OUTPUT, Filename, "w+b");
675fba7fc7eSJung-uk Kim     return (AE_OK);
676fba7fc7eSJung-uk Kim }
677fba7fc7eSJung-uk Kim 
678fba7fc7eSJung-uk Kim 
679fba7fc7eSJung-uk Kim /*******************************************************************************
680fba7fc7eSJung-uk Kim  *
681fba7fc7eSJung-uk Kim  * FUNCTION:    FlOpenMiscOutputFiles
682fba7fc7eSJung-uk Kim  *
683fba7fc7eSJung-uk Kim  * PARAMETERS:  FilenamePrefix       - The user-specified ASL source file
684fba7fc7eSJung-uk Kim  *
685fba7fc7eSJung-uk Kim  * RETURN:      Status
686fba7fc7eSJung-uk Kim  *
687fba7fc7eSJung-uk Kim  * DESCRIPTION: Create and open the various output files needed, depending on
688fba7fc7eSJung-uk Kim  *              the command line options
689fba7fc7eSJung-uk Kim  *
690fba7fc7eSJung-uk Kim  ******************************************************************************/
691fba7fc7eSJung-uk Kim 
692fba7fc7eSJung-uk Kim ACPI_STATUS
693fba7fc7eSJung-uk Kim FlOpenMiscOutputFiles (
694fba7fc7eSJung-uk Kim     char                    *FilenamePrefix)
695fba7fc7eSJung-uk Kim {
696fba7fc7eSJung-uk Kim     char                    *Filename;
697fba7fc7eSJung-uk Kim 
698fba7fc7eSJung-uk Kim 
699a88e22b7SJung-uk Kim     /* Create/Open a hex output file if asked */
700a88e22b7SJung-uk Kim 
701a88e22b7SJung-uk Kim     if (Gbl_HexOutputFlag)
702a88e22b7SJung-uk Kim     {
703a88e22b7SJung-uk Kim         Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_HEX_DUMP);
704a88e22b7SJung-uk Kim         if (!Filename)
705a88e22b7SJung-uk Kim         {
706a88e22b7SJung-uk Kim             AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME,
707a88e22b7SJung-uk Kim                 0, 0, 0, 0, NULL, NULL);
708a88e22b7SJung-uk Kim             return (AE_ERROR);
709a88e22b7SJung-uk Kim         }
710a88e22b7SJung-uk Kim 
711a88e22b7SJung-uk Kim         /* Open the hex file, text mode */
712a88e22b7SJung-uk Kim 
713a88e22b7SJung-uk Kim         FlOpenFile (ASL_FILE_HEX_OUTPUT, Filename, "w+");
714a88e22b7SJung-uk Kim 
715a88e22b7SJung-uk Kim         AslCompilerSignon (ASL_FILE_HEX_OUTPUT);
716a88e22b7SJung-uk Kim         AslCompilerFileHeader (ASL_FILE_HEX_OUTPUT);
717a88e22b7SJung-uk Kim     }
718a88e22b7SJung-uk Kim 
719a88e22b7SJung-uk Kim     /* Create/Open a debug output file if asked */
720a88e22b7SJung-uk Kim 
721a88e22b7SJung-uk Kim     if (Gbl_DebugFlag)
722a88e22b7SJung-uk Kim     {
723a88e22b7SJung-uk Kim         Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_DEBUG);
724a88e22b7SJung-uk Kim         if (!Filename)
725a88e22b7SJung-uk Kim         {
726a88e22b7SJung-uk Kim             AslCommonError (ASL_ERROR, ASL_MSG_DEBUG_FILENAME,
727a88e22b7SJung-uk Kim                 0, 0, 0, 0, NULL, NULL);
728a88e22b7SJung-uk Kim             return (AE_ERROR);
729a88e22b7SJung-uk Kim         }
730a88e22b7SJung-uk Kim 
731a88e22b7SJung-uk Kim         /* Open the debug file as STDERR, text mode */
732a88e22b7SJung-uk Kim 
733a88e22b7SJung-uk Kim         /* TBD: hide this behind a FlReopenFile function */
734a88e22b7SJung-uk Kim 
735a88e22b7SJung-uk Kim         Gbl_Files[ASL_FILE_DEBUG_OUTPUT].Filename = Filename;
736a88e22b7SJung-uk Kim         Gbl_Files[ASL_FILE_DEBUG_OUTPUT].Handle =
737a88e22b7SJung-uk Kim             freopen (Filename, "w+t", stderr);
738a88e22b7SJung-uk Kim 
739a88e22b7SJung-uk Kim         AslCompilerSignon (ASL_FILE_DEBUG_OUTPUT);
740a88e22b7SJung-uk Kim         AslCompilerFileHeader (ASL_FILE_DEBUG_OUTPUT);
741a88e22b7SJung-uk Kim     }
742a88e22b7SJung-uk Kim 
743d244b227SJung-uk Kim     /* Create/Open a listing output file if asked */
744d244b227SJung-uk Kim 
745d244b227SJung-uk Kim     if (Gbl_ListingFlag)
746d244b227SJung-uk Kim     {
747d244b227SJung-uk Kim         Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_LISTING);
748d244b227SJung-uk Kim         if (!Filename)
749d244b227SJung-uk Kim         {
750d244b227SJung-uk Kim             AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME,
751d244b227SJung-uk Kim                 0, 0, 0, 0, NULL, NULL);
752d244b227SJung-uk Kim             return (AE_ERROR);
753d244b227SJung-uk Kim         }
754d244b227SJung-uk Kim 
755d244b227SJung-uk Kim         /* Open the listing file, text mode */
756d244b227SJung-uk Kim 
757d244b227SJung-uk Kim         FlOpenFile (ASL_FILE_LISTING_OUTPUT, Filename, "w+");
758d244b227SJung-uk Kim 
759d244b227SJung-uk Kim         AslCompilerSignon (ASL_FILE_LISTING_OUTPUT);
760d244b227SJung-uk Kim         AslCompilerFileHeader (ASL_FILE_LISTING_OUTPUT);
761d244b227SJung-uk Kim     }
762d244b227SJung-uk Kim 
763a88e22b7SJung-uk Kim     if (Gbl_FileType == ASL_INPUT_TYPE_ASCII_DATA)
764a88e22b7SJung-uk Kim     {
765a88e22b7SJung-uk Kim         return (AE_OK);
766a88e22b7SJung-uk Kim     }
767a88e22b7SJung-uk Kim 
768fba7fc7eSJung-uk Kim     /* Create/Open a combined source output file */
769fba7fc7eSJung-uk Kim 
770fba7fc7eSJung-uk Kim     Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_SOURCE);
771fba7fc7eSJung-uk Kim     if (!Filename)
772fba7fc7eSJung-uk Kim     {
773fba7fc7eSJung-uk Kim         AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME,
774fba7fc7eSJung-uk Kim             0, 0, 0, 0, NULL, NULL);
775fba7fc7eSJung-uk Kim         return (AE_ERROR);
776fba7fc7eSJung-uk Kim     }
777fba7fc7eSJung-uk Kim 
778fba7fc7eSJung-uk Kim     /*
779fba7fc7eSJung-uk Kim      * Open the source output file, binary mode (so that LF does not get
780fba7fc7eSJung-uk Kim      * expanded to CR/LF on some systems, messing up our seek
781fba7fc7eSJung-uk Kim      * calculations.)
782fba7fc7eSJung-uk Kim      */
783fba7fc7eSJung-uk Kim     FlOpenFile (ASL_FILE_SOURCE_OUTPUT, Filename, "w+b");
784fba7fc7eSJung-uk Kim 
785fba7fc7eSJung-uk Kim     /* Create/Open a assembly code source output file if asked */
786fba7fc7eSJung-uk Kim 
787fba7fc7eSJung-uk Kim     if (Gbl_AsmOutputFlag)
788fba7fc7eSJung-uk Kim     {
789fba7fc7eSJung-uk Kim         Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_ASM_SOURCE);
790fba7fc7eSJung-uk Kim         if (!Filename)
791fba7fc7eSJung-uk Kim         {
792fba7fc7eSJung-uk Kim             AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME,
793fba7fc7eSJung-uk Kim                 0, 0, 0, 0, NULL, NULL);
794fba7fc7eSJung-uk Kim             return (AE_ERROR);
795fba7fc7eSJung-uk Kim         }
796fba7fc7eSJung-uk Kim 
797fba7fc7eSJung-uk Kim         /* Open the assembly code source file, text mode */
798fba7fc7eSJung-uk Kim 
799fba7fc7eSJung-uk Kim         FlOpenFile (ASL_FILE_ASM_SOURCE_OUTPUT, Filename, "w+");
800fba7fc7eSJung-uk Kim 
801fba7fc7eSJung-uk Kim         AslCompilerSignon (ASL_FILE_ASM_SOURCE_OUTPUT);
802fba7fc7eSJung-uk Kim         AslCompilerFileHeader (ASL_FILE_ASM_SOURCE_OUTPUT);
803fba7fc7eSJung-uk Kim     }
804fba7fc7eSJung-uk Kim 
805fba7fc7eSJung-uk Kim     /* Create/Open a C code source output file if asked */
806fba7fc7eSJung-uk Kim 
807fba7fc7eSJung-uk Kim     if (Gbl_C_OutputFlag)
808fba7fc7eSJung-uk Kim     {
809fba7fc7eSJung-uk Kim         Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_C_SOURCE);
810fba7fc7eSJung-uk Kim         if (!Filename)
811fba7fc7eSJung-uk Kim         {
812fba7fc7eSJung-uk Kim             AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME,
813fba7fc7eSJung-uk Kim                 0, 0, 0, 0, NULL, NULL);
814fba7fc7eSJung-uk Kim             return (AE_ERROR);
815fba7fc7eSJung-uk Kim         }
816fba7fc7eSJung-uk Kim 
817fba7fc7eSJung-uk Kim         /* Open the C code source file, text mode */
818fba7fc7eSJung-uk Kim 
819fba7fc7eSJung-uk Kim         FlOpenFile (ASL_FILE_C_SOURCE_OUTPUT, Filename, "w+");
820fba7fc7eSJung-uk Kim 
821fba7fc7eSJung-uk Kim         FlPrintFile (ASL_FILE_C_SOURCE_OUTPUT, "/*\n");
822fba7fc7eSJung-uk Kim         AslCompilerSignon (ASL_FILE_C_SOURCE_OUTPUT);
823fba7fc7eSJung-uk Kim         AslCompilerFileHeader (ASL_FILE_C_SOURCE_OUTPUT);
824fba7fc7eSJung-uk Kim     }
825fba7fc7eSJung-uk Kim 
826fba7fc7eSJung-uk Kim     /* Create/Open a assembly include output file if asked */
827fba7fc7eSJung-uk Kim 
828fba7fc7eSJung-uk Kim     if (Gbl_AsmIncludeOutputFlag)
829fba7fc7eSJung-uk Kim     {
830fba7fc7eSJung-uk Kim         Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_ASM_INCLUDE);
831fba7fc7eSJung-uk Kim         if (!Filename)
832fba7fc7eSJung-uk Kim         {
833fba7fc7eSJung-uk Kim             AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME,
834fba7fc7eSJung-uk Kim                 0, 0, 0, 0, NULL, NULL);
835fba7fc7eSJung-uk Kim             return (AE_ERROR);
836fba7fc7eSJung-uk Kim         }
837fba7fc7eSJung-uk Kim 
838fba7fc7eSJung-uk Kim         /* Open the assembly include file, text mode */
839fba7fc7eSJung-uk Kim 
840fba7fc7eSJung-uk Kim         FlOpenFile (ASL_FILE_ASM_INCLUDE_OUTPUT, Filename, "w+");
841fba7fc7eSJung-uk Kim 
842fba7fc7eSJung-uk Kim         AslCompilerSignon (ASL_FILE_ASM_INCLUDE_OUTPUT);
843fba7fc7eSJung-uk Kim         AslCompilerFileHeader (ASL_FILE_ASM_INCLUDE_OUTPUT);
844fba7fc7eSJung-uk Kim     }
845fba7fc7eSJung-uk Kim 
846fba7fc7eSJung-uk Kim     /* Create/Open a C include output file if asked */
847fba7fc7eSJung-uk Kim 
848fba7fc7eSJung-uk Kim     if (Gbl_C_IncludeOutputFlag)
849fba7fc7eSJung-uk Kim     {
850fba7fc7eSJung-uk Kim         Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_C_INCLUDE);
851fba7fc7eSJung-uk Kim         if (!Filename)
852fba7fc7eSJung-uk Kim         {
853fba7fc7eSJung-uk Kim             AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME,
854fba7fc7eSJung-uk Kim                 0, 0, 0, 0, NULL, NULL);
855fba7fc7eSJung-uk Kim             return (AE_ERROR);
856fba7fc7eSJung-uk Kim         }
857fba7fc7eSJung-uk Kim 
858fba7fc7eSJung-uk Kim         /* Open the C include file, text mode */
859fba7fc7eSJung-uk Kim 
860fba7fc7eSJung-uk Kim         FlOpenFile (ASL_FILE_C_INCLUDE_OUTPUT, Filename, "w+");
861fba7fc7eSJung-uk Kim 
862fba7fc7eSJung-uk Kim         FlPrintFile (ASL_FILE_C_INCLUDE_OUTPUT, "/*\n");
863fba7fc7eSJung-uk Kim         AslCompilerSignon (ASL_FILE_C_INCLUDE_OUTPUT);
864fba7fc7eSJung-uk Kim         AslCompilerFileHeader (ASL_FILE_C_INCLUDE_OUTPUT);
865fba7fc7eSJung-uk Kim     }
866fba7fc7eSJung-uk Kim 
867fba7fc7eSJung-uk Kim     /* Create a namespace output file if asked */
868fba7fc7eSJung-uk Kim 
869fba7fc7eSJung-uk Kim     if (Gbl_NsOutputFlag)
870fba7fc7eSJung-uk Kim     {
871fba7fc7eSJung-uk Kim         Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_NAMESPACE);
872fba7fc7eSJung-uk Kim         if (!Filename)
873fba7fc7eSJung-uk Kim         {
874fba7fc7eSJung-uk Kim             AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME,
875fba7fc7eSJung-uk Kim                 0, 0, 0, 0, NULL, NULL);
876fba7fc7eSJung-uk Kim             return (AE_ERROR);
877fba7fc7eSJung-uk Kim         }
878fba7fc7eSJung-uk Kim 
879fba7fc7eSJung-uk Kim         /* Open the namespace file, text mode */
880fba7fc7eSJung-uk Kim 
881fba7fc7eSJung-uk Kim         FlOpenFile (ASL_FILE_NAMESPACE_OUTPUT, Filename, "w+");
882fba7fc7eSJung-uk Kim 
883fba7fc7eSJung-uk Kim         AslCompilerSignon (ASL_FILE_NAMESPACE_OUTPUT);
884fba7fc7eSJung-uk Kim         AslCompilerFileHeader (ASL_FILE_NAMESPACE_OUTPUT);
885fba7fc7eSJung-uk Kim     }
886fba7fc7eSJung-uk Kim 
887fba7fc7eSJung-uk Kim     return (AE_OK);
888fba7fc7eSJung-uk Kim }
889fba7fc7eSJung-uk Kim 
890fba7fc7eSJung-uk Kim 
891fba7fc7eSJung-uk Kim #ifdef ACPI_OBSOLETE_FUNCTIONS
892fba7fc7eSJung-uk Kim /*******************************************************************************
893fba7fc7eSJung-uk Kim  *
89453289f6aSNate Lawson  * FUNCTION:    FlParseInputPathname
89553289f6aSNate Lawson  *
89653289f6aSNate Lawson  * PARAMETERS:  InputFilename       - The user-specified ASL source file to be
89753289f6aSNate Lawson  *                                    compiled
89853289f6aSNate Lawson  *
89953289f6aSNate Lawson  * RETURN:      Status
90053289f6aSNate Lawson  *
90153289f6aSNate Lawson  * DESCRIPTION: Split the input path into a directory and filename part
90253289f6aSNate Lawson  *              1) Directory part used to open include files
90353289f6aSNate Lawson  *              2) Filename part used to generate output filenames
90453289f6aSNate Lawson  *
90553289f6aSNate Lawson  ******************************************************************************/
90653289f6aSNate Lawson 
90753289f6aSNate Lawson ACPI_STATUS
90853289f6aSNate Lawson FlParseInputPathname (
90953289f6aSNate Lawson     char                    *InputFilename)
91053289f6aSNate Lawson {
91153289f6aSNate Lawson     char                    *Substring;
91253289f6aSNate Lawson 
91353289f6aSNate Lawson 
91453289f6aSNate Lawson     if (!InputFilename)
91553289f6aSNate Lawson     {
91653289f6aSNate Lawson         return (AE_OK);
91753289f6aSNate Lawson     }
91853289f6aSNate Lawson 
91953289f6aSNate Lawson     /* Get the path to the input filename's directory */
92053289f6aSNate Lawson 
92153289f6aSNate Lawson     Gbl_DirectoryPath = strdup (InputFilename);
92253289f6aSNate Lawson     if (!Gbl_DirectoryPath)
92353289f6aSNate Lawson     {
92453289f6aSNate Lawson         return (AE_NO_MEMORY);
92553289f6aSNate Lawson     }
92653289f6aSNate Lawson 
92753289f6aSNate Lawson     Substring = strrchr (Gbl_DirectoryPath, '\\');
92853289f6aSNate Lawson     if (!Substring)
92953289f6aSNate Lawson     {
93053289f6aSNate Lawson         Substring = strrchr (Gbl_DirectoryPath, '/');
93153289f6aSNate Lawson         if (!Substring)
93253289f6aSNate Lawson         {
93353289f6aSNate Lawson             Substring = strrchr (Gbl_DirectoryPath, ':');
93453289f6aSNate Lawson         }
93553289f6aSNate Lawson     }
93653289f6aSNate Lawson 
93753289f6aSNate Lawson     if (!Substring)
93853289f6aSNate Lawson     {
93953289f6aSNate Lawson         Gbl_DirectoryPath[0] = 0;
94053289f6aSNate Lawson         if (Gbl_UseDefaultAmlFilename)
94153289f6aSNate Lawson         {
94253289f6aSNate Lawson             Gbl_OutputFilenamePrefix = strdup (InputFilename);
94353289f6aSNate Lawson         }
94453289f6aSNate Lawson     }
94553289f6aSNate Lawson     else
94653289f6aSNate Lawson     {
94753289f6aSNate Lawson         if (Gbl_UseDefaultAmlFilename)
94853289f6aSNate Lawson         {
94953289f6aSNate Lawson             Gbl_OutputFilenamePrefix = strdup (Substring + 1);
95053289f6aSNate Lawson         }
95153289f6aSNate Lawson         *(Substring+1) = 0;
95253289f6aSNate Lawson     }
95353289f6aSNate Lawson 
95453289f6aSNate Lawson     return (AE_OK);
95553289f6aSNate Lawson }
956fba7fc7eSJung-uk Kim #endif
95753289f6aSNate Lawson 
95853289f6aSNate Lawson 
959