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