153289f6aSNate Lawson 253289f6aSNate Lawson /****************************************************************************** 353289f6aSNate Lawson * 453289f6aSNate Lawson * Module Name: aslfiles - file I/O suppoert 553289f6aSNate Lawson * 653289f6aSNate Lawson *****************************************************************************/ 753289f6aSNate Lawson 8d244b227SJung-uk Kim /* 9ec3fc72fSJung-uk Kim * Copyright (C) 2000 - 2012, 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 534c52cad2SJung-uk Kim 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 84eef1b955SJung-uk Kim AePrintErrorLog (ASL_FILE_STDERR); 8553289f6aSNate Lawson if (Gbl_DebugFlag) 8653289f6aSNate Lawson { 87eef1b955SJung-uk Kim /* Print error summary to stdout also */ 8853289f6aSNate Lawson 89eef1b955SJung-uk Kim AePrintErrorLog (ASL_FILE_STDOUT); 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; 1773f0275a0SJung-uk Kim long Offset; 1783f5e024cSJung-uk Kim 1793f5e024cSJung-uk Kim 1803f5e024cSJung-uk Kim fp = Gbl_Files[FileId].Handle; 1813f0275a0SJung-uk Kim Offset = ftell (fp); 1823f5e024cSJung-uk Kim 1833f5e024cSJung-uk Kim fseek (fp, 0, SEEK_END); 1843f5e024cSJung-uk Kim FileSize = (UINT32) ftell (fp); 1853f5e024cSJung-uk Kim 1863f0275a0SJung-uk Kim /* Restore file pointer */ 1873f0275a0SJung-uk Kim 1883f0275a0SJung-uk Kim fseek (fp, Offset, SEEK_SET); 1893f5e024cSJung-uk Kim return (FileSize); 1903f5e024cSJung-uk Kim } 1913f5e024cSJung-uk Kim 1923f5e024cSJung-uk Kim 1933f5e024cSJung-uk Kim /******************************************************************************* 1943f5e024cSJung-uk Kim * 19553289f6aSNate Lawson * FUNCTION: FlReadFile 19653289f6aSNate Lawson * 19753289f6aSNate Lawson * PARAMETERS: FileId - Index into file info array 19853289f6aSNate Lawson * Buffer - Where to place the data 19953289f6aSNate Lawson * Length - Amount to read 20053289f6aSNate Lawson * 20153289f6aSNate Lawson * RETURN: Status. AE_ERROR indicates EOF. 20253289f6aSNate Lawson * 20353289f6aSNate Lawson * DESCRIPTION: Read data from an open file. 20453289f6aSNate Lawson * NOTE: Aborts compiler on any error. 20553289f6aSNate Lawson * 20653289f6aSNate Lawson ******************************************************************************/ 20753289f6aSNate Lawson 20853289f6aSNate Lawson ACPI_STATUS 20953289f6aSNate Lawson FlReadFile ( 21053289f6aSNate Lawson UINT32 FileId, 21153289f6aSNate Lawson void *Buffer, 21253289f6aSNate Lawson UINT32 Length) 21353289f6aSNate Lawson { 21453289f6aSNate Lawson UINT32 Actual; 21553289f6aSNate Lawson 21653289f6aSNate Lawson 21753289f6aSNate Lawson /* Read and check for error */ 21853289f6aSNate Lawson 21953289f6aSNate Lawson Actual = fread (Buffer, 1, Length, Gbl_Files[FileId].Handle); 22053289f6aSNate Lawson if (Actual != Length) 22153289f6aSNate Lawson { 22253289f6aSNate Lawson if (feof (Gbl_Files[FileId].Handle)) 22353289f6aSNate Lawson { 22453289f6aSNate Lawson /* End-of-file, just return error */ 22553289f6aSNate Lawson 22653289f6aSNate Lawson return (AE_ERROR); 22753289f6aSNate Lawson } 22853289f6aSNate Lawson 22953289f6aSNate Lawson FlFileError (FileId, ASL_MSG_READ); 23053289f6aSNate Lawson AslAbort (); 23153289f6aSNate Lawson } 23253289f6aSNate Lawson 23353289f6aSNate Lawson return (AE_OK); 23453289f6aSNate Lawson } 23553289f6aSNate Lawson 23653289f6aSNate Lawson 23753289f6aSNate Lawson /******************************************************************************* 23853289f6aSNate Lawson * 23953289f6aSNate Lawson * FUNCTION: FlWriteFile 24053289f6aSNate Lawson * 24153289f6aSNate Lawson * PARAMETERS: FileId - Index into file info array 24253289f6aSNate Lawson * Buffer - Data to write 24353289f6aSNate Lawson * Length - Amount of data to write 24453289f6aSNate Lawson * 245fba7fc7eSJung-uk Kim * RETURN: None 24653289f6aSNate Lawson * 24753289f6aSNate Lawson * DESCRIPTION: Write data to an open file. 24853289f6aSNate Lawson * NOTE: Aborts compiler on any error. 24953289f6aSNate Lawson * 25053289f6aSNate Lawson ******************************************************************************/ 25153289f6aSNate Lawson 25253289f6aSNate Lawson void 25353289f6aSNate Lawson FlWriteFile ( 25453289f6aSNate Lawson UINT32 FileId, 25553289f6aSNate Lawson void *Buffer, 25653289f6aSNate Lawson UINT32 Length) 25753289f6aSNate Lawson { 25853289f6aSNate Lawson UINT32 Actual; 25953289f6aSNate Lawson 26053289f6aSNate Lawson 26153289f6aSNate Lawson /* Write and check for error */ 26253289f6aSNate Lawson 26353289f6aSNate Lawson Actual = fwrite ((char *) Buffer, 1, Length, Gbl_Files[FileId].Handle); 26453289f6aSNate Lawson if (Actual != Length) 26553289f6aSNate Lawson { 26653289f6aSNate Lawson FlFileError (FileId, ASL_MSG_WRITE); 26753289f6aSNate Lawson AslAbort (); 26853289f6aSNate Lawson } 26953289f6aSNate Lawson } 27053289f6aSNate Lawson 27153289f6aSNate Lawson 27253289f6aSNate Lawson /******************************************************************************* 27353289f6aSNate Lawson * 27453289f6aSNate Lawson * FUNCTION: FlPrintFile 27553289f6aSNate Lawson * 27653289f6aSNate Lawson * PARAMETERS: FileId - Index into file info array 27753289f6aSNate Lawson * Format - Printf format string 27853289f6aSNate Lawson * ... - Printf arguments 27953289f6aSNate Lawson * 28053289f6aSNate Lawson * RETURN: None 28153289f6aSNate Lawson * 28253289f6aSNate Lawson * DESCRIPTION: Formatted write to an open file. 28353289f6aSNate Lawson * NOTE: Aborts compiler on any error. 28453289f6aSNate Lawson * 28553289f6aSNate Lawson ******************************************************************************/ 28653289f6aSNate Lawson 28753289f6aSNate Lawson void 28853289f6aSNate Lawson FlPrintFile ( 28953289f6aSNate Lawson UINT32 FileId, 29053289f6aSNate Lawson char *Format, 29153289f6aSNate Lawson ...) 29253289f6aSNate Lawson { 29353289f6aSNate Lawson INT32 Actual; 29453289f6aSNate Lawson va_list Args; 29553289f6aSNate Lawson 29653289f6aSNate Lawson 29753289f6aSNate Lawson va_start (Args, Format); 29853289f6aSNate Lawson 29953289f6aSNate Lawson Actual = vfprintf (Gbl_Files[FileId].Handle, Format, Args); 300a9f12690SJung-uk Kim va_end (Args); 301a9f12690SJung-uk Kim 30253289f6aSNate Lawson if (Actual == -1) 30353289f6aSNate Lawson { 30453289f6aSNate Lawson FlFileError (FileId, ASL_MSG_WRITE); 30553289f6aSNate Lawson AslAbort (); 30653289f6aSNate Lawson } 30753289f6aSNate Lawson } 30853289f6aSNate Lawson 30953289f6aSNate Lawson 31053289f6aSNate Lawson /******************************************************************************* 31153289f6aSNate Lawson * 31253289f6aSNate Lawson * FUNCTION: FlSeekFile 31353289f6aSNate Lawson * 31453289f6aSNate Lawson * PARAMETERS: FileId - Index into file info array 31553289f6aSNate Lawson * Offset - Absolute byte offset in file 31653289f6aSNate Lawson * 317fba7fc7eSJung-uk Kim * RETURN: None 31853289f6aSNate Lawson * 31953289f6aSNate Lawson * DESCRIPTION: Seek to absolute offset 32053289f6aSNate Lawson * NOTE: Aborts compiler on any error. 32153289f6aSNate Lawson * 32253289f6aSNate Lawson ******************************************************************************/ 32353289f6aSNate Lawson 32453289f6aSNate Lawson void 32553289f6aSNate Lawson FlSeekFile ( 32653289f6aSNate Lawson UINT32 FileId, 32753289f6aSNate Lawson long Offset) 32853289f6aSNate Lawson { 32953289f6aSNate Lawson int Error; 33053289f6aSNate Lawson 33153289f6aSNate Lawson 33253289f6aSNate Lawson Error = fseek (Gbl_Files[FileId].Handle, Offset, SEEK_SET); 33353289f6aSNate Lawson if (Error) 33453289f6aSNate Lawson { 33553289f6aSNate Lawson FlFileError (FileId, ASL_MSG_SEEK); 33653289f6aSNate Lawson AslAbort (); 33753289f6aSNate Lawson } 33853289f6aSNate Lawson } 33953289f6aSNate Lawson 34053289f6aSNate Lawson 34153289f6aSNate Lawson /******************************************************************************* 34253289f6aSNate Lawson * 34353289f6aSNate Lawson * FUNCTION: FlCloseFile 34453289f6aSNate Lawson * 34553289f6aSNate Lawson * PARAMETERS: FileId - Index into file info array 34653289f6aSNate Lawson * 347fba7fc7eSJung-uk Kim * RETURN: None 34853289f6aSNate Lawson * 34953289f6aSNate Lawson * DESCRIPTION: Close an open file. Aborts compiler on error 35053289f6aSNate Lawson * 35153289f6aSNate Lawson ******************************************************************************/ 35253289f6aSNate Lawson 35353289f6aSNate Lawson void 35453289f6aSNate Lawson FlCloseFile ( 35553289f6aSNate Lawson UINT32 FileId) 35653289f6aSNate Lawson { 35753289f6aSNate Lawson int Error; 35853289f6aSNate Lawson 35953289f6aSNate Lawson 36053289f6aSNate Lawson if (!Gbl_Files[FileId].Handle) 36153289f6aSNate Lawson { 36253289f6aSNate Lawson return; 36353289f6aSNate Lawson } 36453289f6aSNate Lawson 36553289f6aSNate Lawson Error = fclose (Gbl_Files[FileId].Handle); 36653289f6aSNate Lawson if (Error) 36753289f6aSNate Lawson { 36853289f6aSNate Lawson FlFileError (FileId, ASL_MSG_CLOSE); 36953289f6aSNate Lawson AslAbort (); 37053289f6aSNate Lawson } 37153289f6aSNate Lawson 3724c52cad2SJung-uk Kim Gbl_Files[FileId].Handle = NULL; 37353289f6aSNate Lawson return; 37453289f6aSNate Lawson } 37553289f6aSNate Lawson 37653289f6aSNate Lawson 37753289f6aSNate Lawson /******************************************************************************* 37853289f6aSNate Lawson * 37953289f6aSNate Lawson * FUNCTION: FlSetLineNumber 38053289f6aSNate Lawson * 38153289f6aSNate Lawson * PARAMETERS: Op - Parse node for the LINE asl statement 38253289f6aSNate Lawson * 38353289f6aSNate Lawson * RETURN: None. 38453289f6aSNate Lawson * 38553289f6aSNate Lawson * DESCRIPTION: Set the current line number 38653289f6aSNate Lawson * 38753289f6aSNate Lawson ******************************************************************************/ 38853289f6aSNate Lawson 38953289f6aSNate Lawson void 39053289f6aSNate Lawson FlSetLineNumber ( 391eef1b955SJung-uk Kim UINT32 LineNumber) 39253289f6aSNate Lawson { 39353289f6aSNate Lawson 394eef1b955SJung-uk Kim DbgPrint (ASL_PARSE_OUTPUT, "\n#line: New line number %u (old %u)\n", 395eef1b955SJung-uk Kim LineNumber, Gbl_LogicalLineNumber); 396eef1b955SJung-uk Kim 397eef1b955SJung-uk Kim Gbl_CurrentLineNumber = LineNumber; 398eef1b955SJung-uk Kim Gbl_LogicalLineNumber = LineNumber; 399eef1b955SJung-uk Kim } 400eef1b955SJung-uk Kim 401eef1b955SJung-uk Kim 402eef1b955SJung-uk Kim /******************************************************************************* 403eef1b955SJung-uk Kim * 404eef1b955SJung-uk Kim * FUNCTION: FlSetFilename 405eef1b955SJung-uk Kim * 406eef1b955SJung-uk Kim * PARAMETERS: Op - Parse node for the LINE asl statement 407eef1b955SJung-uk Kim * 408eef1b955SJung-uk Kim * RETURN: None. 409eef1b955SJung-uk Kim * 410eef1b955SJung-uk Kim * DESCRIPTION: Set the current filename 411eef1b955SJung-uk Kim * 412eef1b955SJung-uk Kim ******************************************************************************/ 413eef1b955SJung-uk Kim 414eef1b955SJung-uk Kim void 415eef1b955SJung-uk Kim FlSetFilename ( 416eef1b955SJung-uk Kim char *Filename) 417eef1b955SJung-uk Kim { 418eef1b955SJung-uk Kim 419eef1b955SJung-uk Kim DbgPrint (ASL_PARSE_OUTPUT, "\n#line: New filename %s (old %s)\n", 420eef1b955SJung-uk Kim Filename, Gbl_Files[ASL_FILE_INPUT].Filename); 421eef1b955SJung-uk Kim 422eef1b955SJung-uk Kim Gbl_Files[ASL_FILE_INPUT].Filename = Filename; 42353289f6aSNate Lawson } 42453289f6aSNate Lawson 42553289f6aSNate Lawson 42653289f6aSNate Lawson /******************************************************************************* 42753289f6aSNate Lawson * 428d6dd1baeSJung-uk Kim * FUNCTION: FlAddIncludeDirectory 429d6dd1baeSJung-uk Kim * 430d6dd1baeSJung-uk Kim * PARAMETERS: Dir - Directory pathname string 431d6dd1baeSJung-uk Kim * 432d6dd1baeSJung-uk Kim * RETURN: None 433d6dd1baeSJung-uk Kim * 434d6dd1baeSJung-uk Kim * DESCRIPTION: Add a directory the list of include prefix directories. 435d6dd1baeSJung-uk Kim * 436d6dd1baeSJung-uk Kim ******************************************************************************/ 437d6dd1baeSJung-uk Kim 438d6dd1baeSJung-uk Kim void 439d6dd1baeSJung-uk Kim FlAddIncludeDirectory ( 440d6dd1baeSJung-uk Kim char *Dir) 441d6dd1baeSJung-uk Kim { 442d6dd1baeSJung-uk Kim ASL_INCLUDE_DIR *NewDir; 443d6dd1baeSJung-uk Kim ASL_INCLUDE_DIR *NextDir; 444d6dd1baeSJung-uk Kim ASL_INCLUDE_DIR *PrevDir = NULL; 445d6dd1baeSJung-uk Kim UINT32 NeedsSeparator = 0; 446d6dd1baeSJung-uk Kim size_t DirLength; 447d6dd1baeSJung-uk Kim 448d6dd1baeSJung-uk Kim 449d6dd1baeSJung-uk Kim DirLength = strlen (Dir); 450d6dd1baeSJung-uk Kim if (!DirLength) 451d6dd1baeSJung-uk Kim { 452d6dd1baeSJung-uk Kim return; 453d6dd1baeSJung-uk Kim } 454d6dd1baeSJung-uk Kim 455d6dd1baeSJung-uk Kim /* Make sure that the pathname ends with a path separator */ 456d6dd1baeSJung-uk Kim 457d6dd1baeSJung-uk Kim if ((Dir[DirLength-1] != '/') && 458d6dd1baeSJung-uk Kim (Dir[DirLength-1] != '\\')) 459d6dd1baeSJung-uk Kim { 460d6dd1baeSJung-uk Kim NeedsSeparator = 1; 461d6dd1baeSJung-uk Kim } 462d6dd1baeSJung-uk Kim 463d6dd1baeSJung-uk Kim NewDir = ACPI_ALLOCATE_ZEROED (sizeof (ASL_INCLUDE_DIR)); 464d6dd1baeSJung-uk Kim NewDir->Dir = ACPI_ALLOCATE (DirLength + 1 + NeedsSeparator); 465d6dd1baeSJung-uk Kim strcpy (NewDir->Dir, Dir); 466d6dd1baeSJung-uk Kim if (NeedsSeparator) 467d6dd1baeSJung-uk Kim { 468d6dd1baeSJung-uk Kim strcat (NewDir->Dir, "/"); 469d6dd1baeSJung-uk Kim } 470d6dd1baeSJung-uk Kim 471d6dd1baeSJung-uk Kim /* 472d6dd1baeSJung-uk Kim * Preserve command line ordering of -I options by adding new elements 473d6dd1baeSJung-uk Kim * at the end of the list 474d6dd1baeSJung-uk Kim */ 475d6dd1baeSJung-uk Kim NextDir = Gbl_IncludeDirList; 476d6dd1baeSJung-uk Kim while (NextDir) 477d6dd1baeSJung-uk Kim { 478d6dd1baeSJung-uk Kim PrevDir = NextDir; 479d6dd1baeSJung-uk Kim NextDir = NextDir->Next; 480d6dd1baeSJung-uk Kim } 481d6dd1baeSJung-uk Kim 482d6dd1baeSJung-uk Kim if (PrevDir) 483d6dd1baeSJung-uk Kim { 484d6dd1baeSJung-uk Kim PrevDir->Next = NewDir; 485d6dd1baeSJung-uk Kim } 486d6dd1baeSJung-uk Kim else 487d6dd1baeSJung-uk Kim { 488d6dd1baeSJung-uk Kim Gbl_IncludeDirList = NewDir; 489d6dd1baeSJung-uk Kim } 490d6dd1baeSJung-uk Kim } 491d6dd1baeSJung-uk Kim 492d6dd1baeSJung-uk Kim 493d6dd1baeSJung-uk Kim /******************************************************************************* 494d6dd1baeSJung-uk Kim * 495a7a3b383SJung-uk Kim * FUNCTION: FlMergePathnames 496a7a3b383SJung-uk Kim * 497a7a3b383SJung-uk Kim * PARAMETERS: PrefixDir - Prefix directory pathname. Can be NULL or 498a7a3b383SJung-uk Kim * a zero length string. 499a7a3b383SJung-uk Kim * FilePathname - The include filename from the source ASL. 500a7a3b383SJung-uk Kim * 501a7a3b383SJung-uk Kim * RETURN: Merged pathname string 502a7a3b383SJung-uk Kim * 503a7a3b383SJung-uk Kim * DESCRIPTION: Merge two pathnames that (probably) have common elements, to 504a7a3b383SJung-uk Kim * arrive at a minimal length string. Merge can occur if the 505a7a3b383SJung-uk Kim * FilePathname is relative to the PrefixDir. 506a7a3b383SJung-uk Kim * 507a7a3b383SJung-uk Kim ******************************************************************************/ 508a7a3b383SJung-uk Kim 509a7a3b383SJung-uk Kim char * 510a7a3b383SJung-uk Kim FlMergePathnames ( 511a7a3b383SJung-uk Kim char *PrefixDir, 512a7a3b383SJung-uk Kim char *FilePathname) 513a7a3b383SJung-uk Kim { 514a7a3b383SJung-uk Kim char *CommonPath; 515a7a3b383SJung-uk Kim char *Pathname; 516a7a3b383SJung-uk Kim char *LastElement; 517a7a3b383SJung-uk Kim 518a7a3b383SJung-uk Kim 519a7a3b383SJung-uk Kim DbgPrint (ASL_PARSE_OUTPUT, "Include: Prefix path - \"%s\"\n" 520a7a3b383SJung-uk Kim "Include: FilePathname - \"%s\"\n", 521a7a3b383SJung-uk Kim PrefixDir, FilePathname); 522a7a3b383SJung-uk Kim 523a7a3b383SJung-uk Kim /* 524a7a3b383SJung-uk Kim * If there is no prefix directory or if the file pathname is absolute, 525a7a3b383SJung-uk Kim * just return the original file pathname 526a7a3b383SJung-uk Kim */ 527a7a3b383SJung-uk Kim if (!PrefixDir || (!*PrefixDir) || 528a7a3b383SJung-uk Kim (*FilePathname == '/') || 529a7a3b383SJung-uk Kim (FilePathname[1] == ':')) 530a7a3b383SJung-uk Kim { 531a7a3b383SJung-uk Kim Pathname = ACPI_ALLOCATE (strlen (FilePathname) + 1); 532a7a3b383SJung-uk Kim strcpy (Pathname, FilePathname); 533a7a3b383SJung-uk Kim goto ConvertBackslashes; 534a7a3b383SJung-uk Kim } 535a7a3b383SJung-uk Kim 536a7a3b383SJung-uk Kim /* Need a local copy of the prefix directory path */ 537a7a3b383SJung-uk Kim 538a7a3b383SJung-uk Kim CommonPath = ACPI_ALLOCATE (strlen (PrefixDir) + 1); 539a7a3b383SJung-uk Kim strcpy (CommonPath, PrefixDir); 540a7a3b383SJung-uk Kim 541a7a3b383SJung-uk Kim /* 542a7a3b383SJung-uk Kim * Walk forward through the file path, and simultaneously backward 543a7a3b383SJung-uk Kim * through the prefix directory path until there are no more 544a7a3b383SJung-uk Kim * relative references at the start of the file path. 545a7a3b383SJung-uk Kim */ 546a7a3b383SJung-uk Kim while (*FilePathname && (!strncmp (FilePathname, "../", 3))) 547a7a3b383SJung-uk Kim { 548a7a3b383SJung-uk Kim /* Remove last element of the prefix directory path */ 549a7a3b383SJung-uk Kim 550a7a3b383SJung-uk Kim LastElement = strrchr (CommonPath, '/'); 551a7a3b383SJung-uk Kim if (!LastElement) 552a7a3b383SJung-uk Kim { 553a7a3b383SJung-uk Kim goto ConcatenatePaths; 554a7a3b383SJung-uk Kim } 555a7a3b383SJung-uk Kim 556a7a3b383SJung-uk Kim *LastElement = 0; /* Terminate CommonPath string */ 557a7a3b383SJung-uk Kim FilePathname += 3; /* Point to next path element */ 558a7a3b383SJung-uk Kim } 559a7a3b383SJung-uk Kim 560a7a3b383SJung-uk Kim /* 561a7a3b383SJung-uk Kim * Remove the last element of the prefix directory path (it is the same as 562a7a3b383SJung-uk Kim * the first element of the file pathname), and build the final merged 563a7a3b383SJung-uk Kim * pathname. 564a7a3b383SJung-uk Kim */ 565a7a3b383SJung-uk Kim LastElement = strrchr (CommonPath, '/'); 566a7a3b383SJung-uk Kim if (LastElement) 567a7a3b383SJung-uk Kim { 568a7a3b383SJung-uk Kim *LastElement = 0; 569a7a3b383SJung-uk Kim } 570a7a3b383SJung-uk Kim 571a7a3b383SJung-uk Kim /* Build the final merged pathname */ 572a7a3b383SJung-uk Kim 573a7a3b383SJung-uk Kim ConcatenatePaths: 574a7a3b383SJung-uk Kim Pathname = ACPI_ALLOCATE_ZEROED (strlen (CommonPath) + strlen (FilePathname) + 2); 575a7a3b383SJung-uk Kim if (LastElement && *CommonPath) 576a7a3b383SJung-uk Kim { 577a7a3b383SJung-uk Kim strcpy (Pathname, CommonPath); 578a7a3b383SJung-uk Kim strcat (Pathname, "/"); 579a7a3b383SJung-uk Kim } 580a7a3b383SJung-uk Kim strcat (Pathname, FilePathname); 581a7a3b383SJung-uk Kim ACPI_FREE (CommonPath); 582a7a3b383SJung-uk Kim 583a7a3b383SJung-uk Kim /* Convert all backslashes to normal slashes */ 584a7a3b383SJung-uk Kim 585a7a3b383SJung-uk Kim ConvertBackslashes: 586a7a3b383SJung-uk Kim UtConvertBackslashes (Pathname); 587a7a3b383SJung-uk Kim 588a7a3b383SJung-uk Kim DbgPrint (ASL_PARSE_OUTPUT, "Include: Merged Pathname - \"%s\"\n", 589a7a3b383SJung-uk Kim Pathname); 590a7a3b383SJung-uk Kim return (Pathname); 591a7a3b383SJung-uk Kim } 592a7a3b383SJung-uk Kim 593a7a3b383SJung-uk Kim 594a7a3b383SJung-uk Kim /******************************************************************************* 595a7a3b383SJung-uk Kim * 596d6dd1baeSJung-uk Kim * FUNCTION: FlOpenIncludeWithPrefix 597d6dd1baeSJung-uk Kim * 598d6dd1baeSJung-uk Kim * PARAMETERS: PrefixDir - Prefix directory pathname. Can be a zero 599d6dd1baeSJung-uk Kim * length string. 600d6dd1baeSJung-uk Kim * Filename - The include filename from the source ASL. 601d6dd1baeSJung-uk Kim * 602d6dd1baeSJung-uk Kim * RETURN: Valid file descriptor if successful. Null otherwise. 603d6dd1baeSJung-uk Kim * 604d6dd1baeSJung-uk Kim * DESCRIPTION: Open an include file and push it on the input file stack. 605d6dd1baeSJung-uk Kim * 606d6dd1baeSJung-uk Kim ******************************************************************************/ 607d6dd1baeSJung-uk Kim 6084c52cad2SJung-uk Kim FILE * 609d6dd1baeSJung-uk Kim FlOpenIncludeWithPrefix ( 610d6dd1baeSJung-uk Kim char *PrefixDir, 611d6dd1baeSJung-uk Kim char *Filename) 612d6dd1baeSJung-uk Kim { 613d6dd1baeSJung-uk Kim FILE *IncludeFile; 614d6dd1baeSJung-uk Kim char *Pathname; 615d6dd1baeSJung-uk Kim 616d6dd1baeSJung-uk Kim 617d6dd1baeSJung-uk Kim /* Build the full pathname to the file */ 618d6dd1baeSJung-uk Kim 619a7a3b383SJung-uk Kim Pathname = FlMergePathnames (PrefixDir, Filename); 620d6dd1baeSJung-uk Kim 621a7a3b383SJung-uk Kim DbgPrint (ASL_PARSE_OUTPUT, "Include: Opening file - \"%s\"\n\n", 622d6dd1baeSJung-uk Kim Pathname); 623d6dd1baeSJung-uk Kim 624d6dd1baeSJung-uk Kim /* Attempt to open the file, push if successful */ 625d6dd1baeSJung-uk Kim 626d6dd1baeSJung-uk Kim IncludeFile = fopen (Pathname, "r"); 627d6dd1baeSJung-uk Kim if (IncludeFile) 628d6dd1baeSJung-uk Kim { 629d6dd1baeSJung-uk Kim /* Push the include file on the open input file stack */ 630d6dd1baeSJung-uk Kim 631d6dd1baeSJung-uk Kim AslPushInputFileStack (IncludeFile, Pathname); 632d6dd1baeSJung-uk Kim return (IncludeFile); 633d6dd1baeSJung-uk Kim } 634d6dd1baeSJung-uk Kim 635d6dd1baeSJung-uk Kim ACPI_FREE (Pathname); 636d6dd1baeSJung-uk Kim return (NULL); 637d6dd1baeSJung-uk Kim } 638d6dd1baeSJung-uk Kim 639d6dd1baeSJung-uk Kim 640d6dd1baeSJung-uk Kim /******************************************************************************* 641d6dd1baeSJung-uk Kim * 64253289f6aSNate Lawson * FUNCTION: FlOpenIncludeFile 64353289f6aSNate Lawson * 64453289f6aSNate Lawson * PARAMETERS: Op - Parse node for the INCLUDE ASL statement 64553289f6aSNate Lawson * 64653289f6aSNate Lawson * RETURN: None. 64753289f6aSNate Lawson * 64853289f6aSNate Lawson * DESCRIPTION: Open an include file and push it on the input file stack. 64953289f6aSNate Lawson * 65053289f6aSNate Lawson ******************************************************************************/ 65153289f6aSNate Lawson 65253289f6aSNate Lawson void 65353289f6aSNate Lawson FlOpenIncludeFile ( 65453289f6aSNate Lawson ACPI_PARSE_OBJECT *Op) 65553289f6aSNate Lawson { 656d6dd1baeSJung-uk Kim FILE *IncludeFile; 657d6dd1baeSJung-uk Kim ASL_INCLUDE_DIR *NextDir; 65853289f6aSNate Lawson 65953289f6aSNate Lawson 66053289f6aSNate Lawson /* Op must be valid */ 66153289f6aSNate Lawson 66253289f6aSNate Lawson if (!Op) 66353289f6aSNate Lawson { 66453289f6aSNate Lawson AslCommonError (ASL_ERROR, ASL_MSG_INCLUDE_FILE_OPEN, 66553289f6aSNate Lawson Gbl_CurrentLineNumber, Gbl_LogicalLineNumber, 66653289f6aSNate Lawson Gbl_InputByteCount, Gbl_CurrentColumn, 66753289f6aSNate Lawson Gbl_Files[ASL_FILE_INPUT].Filename, " - Null parse node"); 66853289f6aSNate Lawson 66953289f6aSNate Lawson return; 67053289f6aSNate Lawson } 67153289f6aSNate Lawson 67253289f6aSNate Lawson /* 67353289f6aSNate Lawson * Flush out the "include ()" statement on this line, start 67453289f6aSNate Lawson * the actual include file on the next line 67553289f6aSNate Lawson */ 676eef1b955SJung-uk Kim AslResetCurrentLineBuffer (); 67753289f6aSNate Lawson FlPrintFile (ASL_FILE_SOURCE_OUTPUT, "\n"); 67853289f6aSNate Lawson Gbl_CurrentLineOffset++; 67953289f6aSNate Lawson 68053289f6aSNate Lawson 681d6dd1baeSJung-uk Kim /* Attempt to open the include file */ 682d6dd1baeSJung-uk Kim 683d6dd1baeSJung-uk Kim /* If the file specifies an absolute path, just open it */ 684d6dd1baeSJung-uk Kim 685d6dd1baeSJung-uk Kim if ((Op->Asl.Value.String[0] == '/') || 686d6dd1baeSJung-uk Kim (Op->Asl.Value.String[0] == '\\') || 687d6dd1baeSJung-uk Kim (Op->Asl.Value.String[1] == ':')) 68853289f6aSNate Lawson { 689d6dd1baeSJung-uk Kim IncludeFile = FlOpenIncludeWithPrefix ("", Op->Asl.Value.String); 690d6dd1baeSJung-uk Kim if (!IncludeFile) 691d6dd1baeSJung-uk Kim { 692d6dd1baeSJung-uk Kim goto ErrorExit; 693d6dd1baeSJung-uk Kim } 69453289f6aSNate Lawson return; 69553289f6aSNate Lawson } 69653289f6aSNate Lawson 697d6dd1baeSJung-uk Kim /* 698d6dd1baeSJung-uk Kim * The include filename is not an absolute path. 699d6dd1baeSJung-uk Kim * 700d6dd1baeSJung-uk Kim * First, search for the file within the "local" directory -- meaning 701d6dd1baeSJung-uk Kim * the same directory that contains the source file. 702d6dd1baeSJung-uk Kim * 703d6dd1baeSJung-uk Kim * Construct the file pathname from the global directory name. 704d6dd1baeSJung-uk Kim */ 705d6dd1baeSJung-uk Kim IncludeFile = FlOpenIncludeWithPrefix (Gbl_DirectoryPath, Op->Asl.Value.String); 706d6dd1baeSJung-uk Kim if (IncludeFile) 707d6dd1baeSJung-uk Kim { 708d6dd1baeSJung-uk Kim return; 709d6dd1baeSJung-uk Kim } 71053289f6aSNate Lawson 711d6dd1baeSJung-uk Kim /* 712d6dd1baeSJung-uk Kim * Second, search for the file within the (possibly multiple) directories 713d6dd1baeSJung-uk Kim * specified by the -I option on the command line. 714d6dd1baeSJung-uk Kim */ 715d6dd1baeSJung-uk Kim NextDir = Gbl_IncludeDirList; 716d6dd1baeSJung-uk Kim while (NextDir) 717d6dd1baeSJung-uk Kim { 718d6dd1baeSJung-uk Kim IncludeFile = FlOpenIncludeWithPrefix (NextDir->Dir, Op->Asl.Value.String); 719d6dd1baeSJung-uk Kim if (IncludeFile) 720d6dd1baeSJung-uk Kim { 721d6dd1baeSJung-uk Kim return; 722d6dd1baeSJung-uk Kim } 723d6dd1baeSJung-uk Kim 724d6dd1baeSJung-uk Kim NextDir = NextDir->Next; 725d6dd1baeSJung-uk Kim } 726d6dd1baeSJung-uk Kim 727d6dd1baeSJung-uk Kim /* We could not open the include file after trying very hard */ 728d6dd1baeSJung-uk Kim 729d6dd1baeSJung-uk Kim ErrorExit: 730d6dd1baeSJung-uk Kim sprintf (MsgBuffer, "%s, %s", Op->Asl.Value.String, strerror (errno)); 731d6dd1baeSJung-uk Kim AslError (ASL_ERROR, ASL_MSG_INCLUDE_FILE_OPEN, Op, MsgBuffer); 73253289f6aSNate Lawson } 73353289f6aSNate Lawson 73453289f6aSNate Lawson 73553289f6aSNate Lawson /******************************************************************************* 73653289f6aSNate Lawson * 737fba7fc7eSJung-uk Kim * FUNCTION: FlOpenInputFile 738fba7fc7eSJung-uk Kim * 739fba7fc7eSJung-uk Kim * PARAMETERS: InputFilename - The user-specified ASL source file to be 740fba7fc7eSJung-uk Kim * compiled 741fba7fc7eSJung-uk Kim * 742fba7fc7eSJung-uk Kim * RETURN: Status 743fba7fc7eSJung-uk Kim * 744fba7fc7eSJung-uk Kim * DESCRIPTION: Open the specified input file, and save the directory path to 745fba7fc7eSJung-uk Kim * the file so that include files can be opened in 746fba7fc7eSJung-uk Kim * the same directory. 747fba7fc7eSJung-uk Kim * 748fba7fc7eSJung-uk Kim ******************************************************************************/ 749fba7fc7eSJung-uk Kim 750fba7fc7eSJung-uk Kim ACPI_STATUS 751fba7fc7eSJung-uk Kim FlOpenInputFile ( 752fba7fc7eSJung-uk Kim char *InputFilename) 753fba7fc7eSJung-uk Kim { 754fba7fc7eSJung-uk Kim 755fba7fc7eSJung-uk Kim /* Open the input ASL file, text mode */ 756fba7fc7eSJung-uk Kim 757fba7fc7eSJung-uk Kim FlOpenFile (ASL_FILE_INPUT, InputFilename, "r"); 758fba7fc7eSJung-uk Kim AslCompilerin = Gbl_Files[ASL_FILE_INPUT].Handle; 759fba7fc7eSJung-uk Kim 760fba7fc7eSJung-uk Kim return (AE_OK); 761fba7fc7eSJung-uk Kim } 762fba7fc7eSJung-uk Kim 763fba7fc7eSJung-uk Kim 764fba7fc7eSJung-uk Kim /******************************************************************************* 765fba7fc7eSJung-uk Kim * 766fba7fc7eSJung-uk Kim * FUNCTION: FlOpenAmlOutputFile 767fba7fc7eSJung-uk Kim * 768fba7fc7eSJung-uk Kim * PARAMETERS: FilenamePrefix - The user-specified ASL source file 769fba7fc7eSJung-uk Kim * 770fba7fc7eSJung-uk Kim * RETURN: Status 771fba7fc7eSJung-uk Kim * 772fba7fc7eSJung-uk Kim * DESCRIPTION: Create the output filename (*.AML) and open the file. The file 773fba7fc7eSJung-uk Kim * is created in the same directory as the parent input file. 774fba7fc7eSJung-uk Kim * 775fba7fc7eSJung-uk Kim ******************************************************************************/ 776fba7fc7eSJung-uk Kim 777fba7fc7eSJung-uk Kim ACPI_STATUS 778fba7fc7eSJung-uk Kim FlOpenAmlOutputFile ( 779fba7fc7eSJung-uk Kim char *FilenamePrefix) 780fba7fc7eSJung-uk Kim { 781fba7fc7eSJung-uk Kim char *Filename; 782fba7fc7eSJung-uk Kim 783fba7fc7eSJung-uk Kim 784fba7fc7eSJung-uk Kim /* Output filename usually comes from the ASL itself */ 785fba7fc7eSJung-uk Kim 786fba7fc7eSJung-uk Kim Filename = Gbl_Files[ASL_FILE_AML_OUTPUT].Filename; 787fba7fc7eSJung-uk Kim if (!Filename) 788fba7fc7eSJung-uk Kim { 789fba7fc7eSJung-uk Kim /* Create the output AML filename */ 790fba7fc7eSJung-uk Kim 791fba7fc7eSJung-uk Kim Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_AML_CODE); 792fba7fc7eSJung-uk Kim if (!Filename) 793fba7fc7eSJung-uk Kim { 794fba7fc7eSJung-uk Kim AslCommonError (ASL_ERROR, ASL_MSG_OUTPUT_FILENAME, 795fba7fc7eSJung-uk Kim 0, 0, 0, 0, NULL, NULL); 796fba7fc7eSJung-uk Kim return (AE_ERROR); 797fba7fc7eSJung-uk Kim } 798fba7fc7eSJung-uk Kim } 799fba7fc7eSJung-uk Kim 800fba7fc7eSJung-uk Kim /* Open the output AML file in binary mode */ 801fba7fc7eSJung-uk Kim 802fba7fc7eSJung-uk Kim FlOpenFile (ASL_FILE_AML_OUTPUT, Filename, "w+b"); 803fba7fc7eSJung-uk Kim return (AE_OK); 804fba7fc7eSJung-uk Kim } 805fba7fc7eSJung-uk Kim 806fba7fc7eSJung-uk Kim 807fba7fc7eSJung-uk Kim /******************************************************************************* 808fba7fc7eSJung-uk Kim * 809fba7fc7eSJung-uk Kim * FUNCTION: FlOpenMiscOutputFiles 810fba7fc7eSJung-uk Kim * 811fba7fc7eSJung-uk Kim * PARAMETERS: FilenamePrefix - The user-specified ASL source file 812fba7fc7eSJung-uk Kim * 813fba7fc7eSJung-uk Kim * RETURN: Status 814fba7fc7eSJung-uk Kim * 815fba7fc7eSJung-uk Kim * DESCRIPTION: Create and open the various output files needed, depending on 816fba7fc7eSJung-uk Kim * the command line options 817fba7fc7eSJung-uk Kim * 818fba7fc7eSJung-uk Kim ******************************************************************************/ 819fba7fc7eSJung-uk Kim 820fba7fc7eSJung-uk Kim ACPI_STATUS 821fba7fc7eSJung-uk Kim FlOpenMiscOutputFiles ( 822fba7fc7eSJung-uk Kim char *FilenamePrefix) 823fba7fc7eSJung-uk Kim { 824fba7fc7eSJung-uk Kim char *Filename; 825fba7fc7eSJung-uk Kim 826fba7fc7eSJung-uk Kim 827a88e22b7SJung-uk Kim /* Create/Open a hex output file if asked */ 828a88e22b7SJung-uk Kim 829a88e22b7SJung-uk Kim if (Gbl_HexOutputFlag) 830a88e22b7SJung-uk Kim { 831a88e22b7SJung-uk Kim Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_HEX_DUMP); 832a88e22b7SJung-uk Kim if (!Filename) 833a88e22b7SJung-uk Kim { 834a88e22b7SJung-uk Kim AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME, 835a88e22b7SJung-uk Kim 0, 0, 0, 0, NULL, NULL); 836a88e22b7SJung-uk Kim return (AE_ERROR); 837a88e22b7SJung-uk Kim } 838a88e22b7SJung-uk Kim 839a88e22b7SJung-uk Kim /* Open the hex file, text mode */ 840a88e22b7SJung-uk Kim 841a88e22b7SJung-uk Kim FlOpenFile (ASL_FILE_HEX_OUTPUT, Filename, "w+"); 842a88e22b7SJung-uk Kim 843a88e22b7SJung-uk Kim AslCompilerSignon (ASL_FILE_HEX_OUTPUT); 844a88e22b7SJung-uk Kim AslCompilerFileHeader (ASL_FILE_HEX_OUTPUT); 845a88e22b7SJung-uk Kim } 846a88e22b7SJung-uk Kim 847a88e22b7SJung-uk Kim /* Create/Open a debug output file if asked */ 848a88e22b7SJung-uk Kim 849a88e22b7SJung-uk Kim if (Gbl_DebugFlag) 850a88e22b7SJung-uk Kim { 851a88e22b7SJung-uk Kim Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_DEBUG); 852a88e22b7SJung-uk Kim if (!Filename) 853a88e22b7SJung-uk Kim { 854a88e22b7SJung-uk Kim AslCommonError (ASL_ERROR, ASL_MSG_DEBUG_FILENAME, 855a88e22b7SJung-uk Kim 0, 0, 0, 0, NULL, NULL); 856a88e22b7SJung-uk Kim return (AE_ERROR); 857a88e22b7SJung-uk Kim } 858a88e22b7SJung-uk Kim 859a88e22b7SJung-uk Kim /* Open the debug file as STDERR, text mode */ 860a88e22b7SJung-uk Kim 861a88e22b7SJung-uk Kim /* TBD: hide this behind a FlReopenFile function */ 862a88e22b7SJung-uk Kim 863a88e22b7SJung-uk Kim Gbl_Files[ASL_FILE_DEBUG_OUTPUT].Filename = Filename; 864a88e22b7SJung-uk Kim Gbl_Files[ASL_FILE_DEBUG_OUTPUT].Handle = 865a88e22b7SJung-uk Kim freopen (Filename, "w+t", stderr); 866a88e22b7SJung-uk Kim 8674c52cad2SJung-uk Kim if (!Gbl_Files[ASL_FILE_DEBUG_OUTPUT].Handle) 8684c52cad2SJung-uk Kim { 8694c52cad2SJung-uk Kim AslCommonError (ASL_ERROR, ASL_MSG_DEBUG_FILENAME, 8704c52cad2SJung-uk Kim 0, 0, 0, 0, NULL, NULL); 8714c52cad2SJung-uk Kim return (AE_ERROR); 8724c52cad2SJung-uk Kim } 8734c52cad2SJung-uk Kim 874a88e22b7SJung-uk Kim AslCompilerSignon (ASL_FILE_DEBUG_OUTPUT); 875a88e22b7SJung-uk Kim AslCompilerFileHeader (ASL_FILE_DEBUG_OUTPUT); 876a88e22b7SJung-uk Kim } 877a88e22b7SJung-uk Kim 878d244b227SJung-uk Kim /* Create/Open a listing output file if asked */ 879d244b227SJung-uk Kim 880d244b227SJung-uk Kim if (Gbl_ListingFlag) 881d244b227SJung-uk Kim { 882d244b227SJung-uk Kim Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_LISTING); 883d244b227SJung-uk Kim if (!Filename) 884d244b227SJung-uk Kim { 885d244b227SJung-uk Kim AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME, 886d244b227SJung-uk Kim 0, 0, 0, 0, NULL, NULL); 887d244b227SJung-uk Kim return (AE_ERROR); 888d244b227SJung-uk Kim } 889d244b227SJung-uk Kim 890d244b227SJung-uk Kim /* Open the listing file, text mode */ 891d244b227SJung-uk Kim 892d244b227SJung-uk Kim FlOpenFile (ASL_FILE_LISTING_OUTPUT, Filename, "w+"); 893d244b227SJung-uk Kim 894d244b227SJung-uk Kim AslCompilerSignon (ASL_FILE_LISTING_OUTPUT); 895d244b227SJung-uk Kim AslCompilerFileHeader (ASL_FILE_LISTING_OUTPUT); 896d244b227SJung-uk Kim } 897d244b227SJung-uk Kim 898eef1b955SJung-uk Kim /* Create the preprocessor output file if preprocessor enabled */ 8994c52cad2SJung-uk Kim 900eef1b955SJung-uk Kim if (Gbl_PreprocessFlag) 901eef1b955SJung-uk Kim { 9024c52cad2SJung-uk Kim Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_PREPROCESSOR); 9034c52cad2SJung-uk Kim if (!Filename) 9044c52cad2SJung-uk Kim { 9054c52cad2SJung-uk Kim AslCommonError (ASL_ERROR, ASL_MSG_PREPROCESSOR_FILENAME, 9064c52cad2SJung-uk Kim 0, 0, 0, 0, NULL, NULL); 9074c52cad2SJung-uk Kim return (AE_ERROR); 9084c52cad2SJung-uk Kim } 9094c52cad2SJung-uk Kim 9104c52cad2SJung-uk Kim FlOpenFile (ASL_FILE_PREPROCESSOR, Filename, "w+b"); 911eef1b955SJung-uk Kim } 9124c52cad2SJung-uk Kim 9134c52cad2SJung-uk Kim /* All done for data table compiler */ 9144c52cad2SJung-uk Kim 915a88e22b7SJung-uk Kim if (Gbl_FileType == ASL_INPUT_TYPE_ASCII_DATA) 916a88e22b7SJung-uk Kim { 917a88e22b7SJung-uk Kim return (AE_OK); 918a88e22b7SJung-uk Kim } 919a88e22b7SJung-uk Kim 920fba7fc7eSJung-uk Kim /* Create/Open a combined source output file */ 921fba7fc7eSJung-uk Kim 922fba7fc7eSJung-uk Kim Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_SOURCE); 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 /* 931fba7fc7eSJung-uk Kim * Open the source output file, binary mode (so that LF does not get 932fba7fc7eSJung-uk Kim * expanded to CR/LF on some systems, messing up our seek 933fba7fc7eSJung-uk Kim * calculations.) 934fba7fc7eSJung-uk Kim */ 935fba7fc7eSJung-uk Kim FlOpenFile (ASL_FILE_SOURCE_OUTPUT, Filename, "w+b"); 936fba7fc7eSJung-uk Kim 9374c52cad2SJung-uk Kim /* 9384c52cad2SJung-uk Kim // TBD: TEMP 9394c52cad2SJung-uk Kim // AslCompilerin = Gbl_Files[ASL_FILE_SOURCE_OUTPUT].Handle; 9404c52cad2SJung-uk Kim */ 941fba7fc7eSJung-uk Kim /* Create/Open a assembly code source output file if asked */ 942fba7fc7eSJung-uk Kim 943fba7fc7eSJung-uk Kim if (Gbl_AsmOutputFlag) 944fba7fc7eSJung-uk Kim { 945fba7fc7eSJung-uk Kim Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_ASM_SOURCE); 946fba7fc7eSJung-uk Kim if (!Filename) 947fba7fc7eSJung-uk Kim { 948fba7fc7eSJung-uk Kim AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME, 949fba7fc7eSJung-uk Kim 0, 0, 0, 0, NULL, NULL); 950fba7fc7eSJung-uk Kim return (AE_ERROR); 951fba7fc7eSJung-uk Kim } 952fba7fc7eSJung-uk Kim 953fba7fc7eSJung-uk Kim /* Open the assembly code source file, text mode */ 954fba7fc7eSJung-uk Kim 955fba7fc7eSJung-uk Kim FlOpenFile (ASL_FILE_ASM_SOURCE_OUTPUT, Filename, "w+"); 956fba7fc7eSJung-uk Kim 957fba7fc7eSJung-uk Kim AslCompilerSignon (ASL_FILE_ASM_SOURCE_OUTPUT); 958fba7fc7eSJung-uk Kim AslCompilerFileHeader (ASL_FILE_ASM_SOURCE_OUTPUT); 959fba7fc7eSJung-uk Kim } 960fba7fc7eSJung-uk Kim 961fba7fc7eSJung-uk Kim /* Create/Open a C code source output file if asked */ 962fba7fc7eSJung-uk Kim 963fba7fc7eSJung-uk Kim if (Gbl_C_OutputFlag) 964fba7fc7eSJung-uk Kim { 965fba7fc7eSJung-uk Kim Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_C_SOURCE); 966fba7fc7eSJung-uk Kim if (!Filename) 967fba7fc7eSJung-uk Kim { 968fba7fc7eSJung-uk Kim AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME, 969fba7fc7eSJung-uk Kim 0, 0, 0, 0, NULL, NULL); 970fba7fc7eSJung-uk Kim return (AE_ERROR); 971fba7fc7eSJung-uk Kim } 972fba7fc7eSJung-uk Kim 973fba7fc7eSJung-uk Kim /* Open the C code source file, text mode */ 974fba7fc7eSJung-uk Kim 975fba7fc7eSJung-uk Kim FlOpenFile (ASL_FILE_C_SOURCE_OUTPUT, Filename, "w+"); 976fba7fc7eSJung-uk Kim 977fba7fc7eSJung-uk Kim FlPrintFile (ASL_FILE_C_SOURCE_OUTPUT, "/*\n"); 978fba7fc7eSJung-uk Kim AslCompilerSignon (ASL_FILE_C_SOURCE_OUTPUT); 979fba7fc7eSJung-uk Kim AslCompilerFileHeader (ASL_FILE_C_SOURCE_OUTPUT); 980fba7fc7eSJung-uk Kim } 981fba7fc7eSJung-uk Kim 982fba7fc7eSJung-uk Kim /* Create/Open a assembly include output file if asked */ 983fba7fc7eSJung-uk Kim 984fba7fc7eSJung-uk Kim if (Gbl_AsmIncludeOutputFlag) 985fba7fc7eSJung-uk Kim { 986fba7fc7eSJung-uk Kim Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_ASM_INCLUDE); 987fba7fc7eSJung-uk Kim if (!Filename) 988fba7fc7eSJung-uk Kim { 989fba7fc7eSJung-uk Kim AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME, 990fba7fc7eSJung-uk Kim 0, 0, 0, 0, NULL, NULL); 991fba7fc7eSJung-uk Kim return (AE_ERROR); 992fba7fc7eSJung-uk Kim } 993fba7fc7eSJung-uk Kim 994fba7fc7eSJung-uk Kim /* Open the assembly include file, text mode */ 995fba7fc7eSJung-uk Kim 996fba7fc7eSJung-uk Kim FlOpenFile (ASL_FILE_ASM_INCLUDE_OUTPUT, Filename, "w+"); 997fba7fc7eSJung-uk Kim 998fba7fc7eSJung-uk Kim AslCompilerSignon (ASL_FILE_ASM_INCLUDE_OUTPUT); 999fba7fc7eSJung-uk Kim AslCompilerFileHeader (ASL_FILE_ASM_INCLUDE_OUTPUT); 1000fba7fc7eSJung-uk Kim } 1001fba7fc7eSJung-uk Kim 1002fba7fc7eSJung-uk Kim /* Create/Open a C include output file if asked */ 1003fba7fc7eSJung-uk Kim 1004fba7fc7eSJung-uk Kim if (Gbl_C_IncludeOutputFlag) 1005fba7fc7eSJung-uk Kim { 1006fba7fc7eSJung-uk Kim Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_C_INCLUDE); 1007fba7fc7eSJung-uk Kim if (!Filename) 1008fba7fc7eSJung-uk Kim { 1009fba7fc7eSJung-uk Kim AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME, 1010fba7fc7eSJung-uk Kim 0, 0, 0, 0, NULL, NULL); 1011fba7fc7eSJung-uk Kim return (AE_ERROR); 1012fba7fc7eSJung-uk Kim } 1013fba7fc7eSJung-uk Kim 1014fba7fc7eSJung-uk Kim /* Open the C include file, text mode */ 1015fba7fc7eSJung-uk Kim 1016fba7fc7eSJung-uk Kim FlOpenFile (ASL_FILE_C_INCLUDE_OUTPUT, Filename, "w+"); 1017fba7fc7eSJung-uk Kim 1018fba7fc7eSJung-uk Kim FlPrintFile (ASL_FILE_C_INCLUDE_OUTPUT, "/*\n"); 1019fba7fc7eSJung-uk Kim AslCompilerSignon (ASL_FILE_C_INCLUDE_OUTPUT); 1020fba7fc7eSJung-uk Kim AslCompilerFileHeader (ASL_FILE_C_INCLUDE_OUTPUT); 1021fba7fc7eSJung-uk Kim } 1022fba7fc7eSJung-uk Kim 1023fba7fc7eSJung-uk Kim /* Create a namespace output file if asked */ 1024fba7fc7eSJung-uk Kim 1025fba7fc7eSJung-uk Kim if (Gbl_NsOutputFlag) 1026fba7fc7eSJung-uk Kim { 1027fba7fc7eSJung-uk Kim Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_NAMESPACE); 1028fba7fc7eSJung-uk Kim if (!Filename) 1029fba7fc7eSJung-uk Kim { 1030fba7fc7eSJung-uk Kim AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME, 1031fba7fc7eSJung-uk Kim 0, 0, 0, 0, NULL, NULL); 1032fba7fc7eSJung-uk Kim return (AE_ERROR); 1033fba7fc7eSJung-uk Kim } 1034fba7fc7eSJung-uk Kim 1035fba7fc7eSJung-uk Kim /* Open the namespace file, text mode */ 1036fba7fc7eSJung-uk Kim 1037fba7fc7eSJung-uk Kim FlOpenFile (ASL_FILE_NAMESPACE_OUTPUT, Filename, "w+"); 1038fba7fc7eSJung-uk Kim 1039fba7fc7eSJung-uk Kim AslCompilerSignon (ASL_FILE_NAMESPACE_OUTPUT); 1040fba7fc7eSJung-uk Kim AslCompilerFileHeader (ASL_FILE_NAMESPACE_OUTPUT); 1041fba7fc7eSJung-uk Kim } 1042fba7fc7eSJung-uk Kim 1043fba7fc7eSJung-uk Kim return (AE_OK); 1044fba7fc7eSJung-uk Kim } 1045fba7fc7eSJung-uk Kim 1046fba7fc7eSJung-uk Kim 1047fba7fc7eSJung-uk Kim #ifdef ACPI_OBSOLETE_FUNCTIONS 1048fba7fc7eSJung-uk Kim /******************************************************************************* 1049fba7fc7eSJung-uk Kim * 105053289f6aSNate Lawson * FUNCTION: FlParseInputPathname 105153289f6aSNate Lawson * 105253289f6aSNate Lawson * PARAMETERS: InputFilename - The user-specified ASL source file to be 105353289f6aSNate Lawson * compiled 105453289f6aSNate Lawson * 105553289f6aSNate Lawson * RETURN: Status 105653289f6aSNate Lawson * 105753289f6aSNate Lawson * DESCRIPTION: Split the input path into a directory and filename part 105853289f6aSNate Lawson * 1) Directory part used to open include files 105953289f6aSNate Lawson * 2) Filename part used to generate output filenames 106053289f6aSNate Lawson * 106153289f6aSNate Lawson ******************************************************************************/ 106253289f6aSNate Lawson 106353289f6aSNate Lawson ACPI_STATUS 106453289f6aSNate Lawson FlParseInputPathname ( 106553289f6aSNate Lawson char *InputFilename) 106653289f6aSNate Lawson { 106753289f6aSNate Lawson char *Substring; 106853289f6aSNate Lawson 106953289f6aSNate Lawson 107053289f6aSNate Lawson if (!InputFilename) 107153289f6aSNate Lawson { 107253289f6aSNate Lawson return (AE_OK); 107353289f6aSNate Lawson } 107453289f6aSNate Lawson 107553289f6aSNate Lawson /* Get the path to the input filename's directory */ 107653289f6aSNate Lawson 107753289f6aSNate Lawson Gbl_DirectoryPath = strdup (InputFilename); 107853289f6aSNate Lawson if (!Gbl_DirectoryPath) 107953289f6aSNate Lawson { 108053289f6aSNate Lawson return (AE_NO_MEMORY); 108153289f6aSNate Lawson } 108253289f6aSNate Lawson 108353289f6aSNate Lawson Substring = strrchr (Gbl_DirectoryPath, '\\'); 108453289f6aSNate Lawson if (!Substring) 108553289f6aSNate Lawson { 108653289f6aSNate Lawson Substring = strrchr (Gbl_DirectoryPath, '/'); 108753289f6aSNate Lawson if (!Substring) 108853289f6aSNate Lawson { 108953289f6aSNate Lawson Substring = strrchr (Gbl_DirectoryPath, ':'); 109053289f6aSNate Lawson } 109153289f6aSNate Lawson } 109253289f6aSNate Lawson 109353289f6aSNate Lawson if (!Substring) 109453289f6aSNate Lawson { 109553289f6aSNate Lawson Gbl_DirectoryPath[0] = 0; 109653289f6aSNate Lawson if (Gbl_UseDefaultAmlFilename) 109753289f6aSNate Lawson { 109853289f6aSNate Lawson Gbl_OutputFilenamePrefix = strdup (InputFilename); 109953289f6aSNate Lawson } 110053289f6aSNate Lawson } 110153289f6aSNate Lawson else 110253289f6aSNate Lawson { 110353289f6aSNate Lawson if (Gbl_UseDefaultAmlFilename) 110453289f6aSNate Lawson { 110553289f6aSNate Lawson Gbl_OutputFilenamePrefix = strdup (Substring + 1); 110653289f6aSNate Lawson } 110753289f6aSNate Lawson *(Substring+1) = 0; 110853289f6aSNate Lawson } 110953289f6aSNate Lawson 111053289f6aSNate Lawson return (AE_OK); 111153289f6aSNate Lawson } 1112fba7fc7eSJung-uk Kim #endif 111353289f6aSNate Lawson 111453289f6aSNate Lawson 1115