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