153289f6aSNate Lawson /****************************************************************************** 253289f6aSNate Lawson * 3efcc2a30SJung-uk Kim * Module Name: aslfiles - File support functions 453289f6aSNate Lawson * 553289f6aSNate Lawson *****************************************************************************/ 653289f6aSNate Lawson 70d84335fSJung-uk Kim /****************************************************************************** 80d84335fSJung-uk Kim * 90d84335fSJung-uk Kim * 1. Copyright Notice 100d84335fSJung-uk Kim * 11*804fe266SJung-uk Kim * Some or all of this work - Copyright (c) 1999 - 2024, Intel Corp. 1253289f6aSNate Lawson * All rights reserved. 1353289f6aSNate Lawson * 140d84335fSJung-uk Kim * 2. License 150d84335fSJung-uk Kim * 160d84335fSJung-uk Kim * 2.1. This is your license from Intel Corp. under its intellectual property 170d84335fSJung-uk Kim * rights. You may have additional license terms from the party that provided 180d84335fSJung-uk Kim * you this software, covering your right to use that party's intellectual 190d84335fSJung-uk Kim * property rights. 200d84335fSJung-uk Kim * 210d84335fSJung-uk Kim * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a 220d84335fSJung-uk Kim * copy of the source code appearing in this file ("Covered Code") an 230d84335fSJung-uk Kim * irrevocable, perpetual, worldwide license under Intel's copyrights in the 240d84335fSJung-uk Kim * base code distributed originally by Intel ("Original Intel Code") to copy, 250d84335fSJung-uk Kim * make derivatives, distribute, use and display any portion of the Covered 260d84335fSJung-uk Kim * Code in any form, with the right to sublicense such rights; and 270d84335fSJung-uk Kim * 280d84335fSJung-uk Kim * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent 290d84335fSJung-uk Kim * license (with the right to sublicense), under only those claims of Intel 300d84335fSJung-uk Kim * patents that are infringed by the Original Intel Code, to make, use, sell, 310d84335fSJung-uk Kim * offer to sell, and import the Covered Code and derivative works thereof 320d84335fSJung-uk Kim * solely to the minimum extent necessary to exercise the above copyright 330d84335fSJung-uk Kim * license, and in no event shall the patent license extend to any additions 340d84335fSJung-uk Kim * to or modifications of the Original Intel Code. No other license or right 350d84335fSJung-uk Kim * is granted directly or by implication, estoppel or otherwise; 360d84335fSJung-uk Kim * 370d84335fSJung-uk Kim * The above copyright and patent license is granted only if the following 380d84335fSJung-uk Kim * conditions are met: 390d84335fSJung-uk Kim * 400d84335fSJung-uk Kim * 3. Conditions 410d84335fSJung-uk Kim * 420d84335fSJung-uk Kim * 3.1. Redistribution of Source with Rights to Further Distribute Source. 430d84335fSJung-uk Kim * Redistribution of source code of any substantial portion of the Covered 440d84335fSJung-uk Kim * Code or modification with rights to further distribute source must include 450d84335fSJung-uk Kim * the above Copyright Notice, the above License, this list of Conditions, 460d84335fSJung-uk Kim * and the following Disclaimer and Export Compliance provision. In addition, 470d84335fSJung-uk Kim * Licensee must cause all Covered Code to which Licensee contributes to 480d84335fSJung-uk Kim * contain a file documenting the changes Licensee made to create that Covered 490d84335fSJung-uk Kim * Code and the date of any change. Licensee must include in that file the 500d84335fSJung-uk Kim * documentation of any changes made by any predecessor Licensee. Licensee 510d84335fSJung-uk Kim * must include a prominent statement that the modification is derived, 520d84335fSJung-uk Kim * directly or indirectly, from Original Intel Code. 530d84335fSJung-uk Kim * 540d84335fSJung-uk Kim * 3.2. Redistribution of Source with no Rights to Further Distribute Source. 550d84335fSJung-uk Kim * Redistribution of source code of any substantial portion of the Covered 560d84335fSJung-uk Kim * Code or modification without rights to further distribute source must 570d84335fSJung-uk Kim * include the following Disclaimer and Export Compliance provision in the 580d84335fSJung-uk Kim * documentation and/or other materials provided with distribution. In 590d84335fSJung-uk Kim * addition, Licensee may not authorize further sublicense of source of any 600d84335fSJung-uk Kim * portion of the Covered Code, and must include terms to the effect that the 610d84335fSJung-uk Kim * license from Licensee to its licensee is limited to the intellectual 620d84335fSJung-uk Kim * property embodied in the software Licensee provides to its licensee, and 630d84335fSJung-uk Kim * not to intellectual property embodied in modifications its licensee may 640d84335fSJung-uk Kim * make. 650d84335fSJung-uk Kim * 660d84335fSJung-uk Kim * 3.3. Redistribution of Executable. Redistribution in executable form of any 670d84335fSJung-uk Kim * substantial portion of the Covered Code or modification must reproduce the 680d84335fSJung-uk Kim * above Copyright Notice, and the following Disclaimer and Export Compliance 690d84335fSJung-uk Kim * provision in the documentation and/or other materials provided with the 700d84335fSJung-uk Kim * distribution. 710d84335fSJung-uk Kim * 720d84335fSJung-uk Kim * 3.4. Intel retains all right, title, and interest in and to the Original 730d84335fSJung-uk Kim * Intel Code. 740d84335fSJung-uk Kim * 750d84335fSJung-uk Kim * 3.5. Neither the name Intel nor any other trademark owned or controlled by 760d84335fSJung-uk Kim * Intel shall be used in advertising or otherwise to promote the sale, use or 770d84335fSJung-uk Kim * other dealings in products derived from or relating to the Covered Code 780d84335fSJung-uk Kim * without prior written authorization from Intel. 790d84335fSJung-uk Kim * 800d84335fSJung-uk Kim * 4. Disclaimer and Export Compliance 810d84335fSJung-uk Kim * 820d84335fSJung-uk Kim * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED 830d84335fSJung-uk Kim * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE 840d84335fSJung-uk Kim * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE, 850d84335fSJung-uk Kim * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY 860d84335fSJung-uk Kim * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY 870d84335fSJung-uk Kim * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A 880d84335fSJung-uk Kim * PARTICULAR PURPOSE. 890d84335fSJung-uk Kim * 900d84335fSJung-uk Kim * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES 910d84335fSJung-uk Kim * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR 920d84335fSJung-uk Kim * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT, 930d84335fSJung-uk Kim * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY 940d84335fSJung-uk Kim * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL 950d84335fSJung-uk Kim * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS 960d84335fSJung-uk Kim * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY 970d84335fSJung-uk Kim * LIMITED REMEDY. 980d84335fSJung-uk Kim * 990d84335fSJung-uk Kim * 4.3. Licensee shall not export, either directly or indirectly, any of this 1000d84335fSJung-uk Kim * software or system incorporating such software without first obtaining any 1010d84335fSJung-uk Kim * required license or other approval from the U. S. Department of Commerce or 1020d84335fSJung-uk Kim * any other agency or department of the United States Government. In the 1030d84335fSJung-uk Kim * event Licensee exports any such software from the United States or 1040d84335fSJung-uk Kim * re-exports any such software from a foreign destination, Licensee shall 1050d84335fSJung-uk Kim * ensure that the distribution and export/re-export of the software is in 1060d84335fSJung-uk Kim * compliance with all laws, regulations, orders, or other restrictions of the 1070d84335fSJung-uk Kim * U.S. Export Administration Regulations. Licensee agrees that neither it nor 1080d84335fSJung-uk Kim * any of its subsidiaries will export/re-export any technical data, process, 1090d84335fSJung-uk Kim * software, or service, directly or indirectly, to any country for which the 1100d84335fSJung-uk Kim * United States government or any agency thereof requires an export license, 1110d84335fSJung-uk Kim * other governmental approval, or letter of assurance, without first obtaining 1120d84335fSJung-uk Kim * such license, approval or letter. 1130d84335fSJung-uk Kim * 1140d84335fSJung-uk Kim ***************************************************************************** 1150d84335fSJung-uk Kim * 1160d84335fSJung-uk Kim * Alternatively, you may choose to be licensed under the terms of the 1170d84335fSJung-uk Kim * following license: 1180d84335fSJung-uk Kim * 119d244b227SJung-uk Kim * Redistribution and use in source and binary forms, with or without 120d244b227SJung-uk Kim * modification, are permitted provided that the following conditions 121d244b227SJung-uk Kim * are met: 122d244b227SJung-uk Kim * 1. Redistributions of source code must retain the above copyright 123d244b227SJung-uk Kim * notice, this list of conditions, and the following disclaimer, 124d244b227SJung-uk Kim * without modification. 125d244b227SJung-uk Kim * 2. Redistributions in binary form must reproduce at minimum a disclaimer 126d244b227SJung-uk Kim * substantially similar to the "NO WARRANTY" disclaimer below 127d244b227SJung-uk Kim * ("Disclaimer") and any redistribution must be conditioned upon 128d244b227SJung-uk Kim * including a substantially similar Disclaimer requirement for further 129d244b227SJung-uk Kim * binary redistribution. 130d244b227SJung-uk Kim * 3. Neither the names of the above-listed copyright holders nor the names 131d244b227SJung-uk Kim * of any contributors may be used to endorse or promote products derived 132d244b227SJung-uk Kim * from this software without specific prior written permission. 13353289f6aSNate Lawson * 1340d84335fSJung-uk Kim * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 1350d84335fSJung-uk Kim * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 1360d84335fSJung-uk Kim * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 1370d84335fSJung-uk Kim * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 1380d84335fSJung-uk Kim * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 1390d84335fSJung-uk Kim * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 1400d84335fSJung-uk Kim * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 1410d84335fSJung-uk Kim * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 1420d84335fSJung-uk Kim * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 1430d84335fSJung-uk Kim * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 1440d84335fSJung-uk Kim * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 1450d84335fSJung-uk Kim * 1460d84335fSJung-uk Kim * Alternatively, you may choose to be licensed under the terms of the 147d244b227SJung-uk Kim * GNU General Public License ("GPL") version 2 as published by the Free 148d244b227SJung-uk Kim * Software Foundation. 14953289f6aSNate Lawson * 1500d84335fSJung-uk Kim *****************************************************************************/ 15153289f6aSNate Lawson 152ab6f3bf9SJung-uk Kim #include <contrib/dev/acpica/compiler/aslcompiler.h> 153ab6f3bf9SJung-uk Kim #include <contrib/dev/acpica/include/acapps.h> 15453289f6aSNate Lawson 15553289f6aSNate Lawson #define _COMPONENT ACPI_COMPILER 15653289f6aSNate Lawson ACPI_MODULE_NAME ("aslfiles") 15753289f6aSNate Lawson 158fba7fc7eSJung-uk Kim /* Local prototypes */ 159fba7fc7eSJung-uk Kim 160a371a5fdSJung-uk Kim static FILE * 161d6dd1baeSJung-uk Kim FlOpenIncludeWithPrefix ( 162d6dd1baeSJung-uk Kim char *PrefixDir, 163a371a5fdSJung-uk Kim ACPI_PARSE_OBJECT *Op, 164d6dd1baeSJung-uk Kim char *Filename); 165d6dd1baeSJung-uk Kim 1669ad8b64eSJung-uk Kim static BOOLEAN 1679ad8b64eSJung-uk Kim FlInputFileExists ( 1689ad8b64eSJung-uk Kim char *InputFilename); 1699ad8b64eSJung-uk Kim 170fba7fc7eSJung-uk Kim #ifdef ACPI_OBSOLETE_FUNCTIONS 171fba7fc7eSJung-uk Kim ACPI_STATUS 172fba7fc7eSJung-uk Kim FlParseInputPathname ( 173fba7fc7eSJung-uk Kim char *InputFilename); 174fba7fc7eSJung-uk Kim #endif 175fba7fc7eSJung-uk Kim 17653289f6aSNate Lawson 17753289f6aSNate Lawson /******************************************************************************* 17853289f6aSNate Lawson * 17944b0f624SJung-uk Kim * FUNCTION: FlInitOneFile 18044b0f624SJung-uk Kim * 18144b0f624SJung-uk Kim * PARAMETERS: InputFilename - The user-specified ASL source file to be 18244b0f624SJung-uk Kim * compiled 18344b0f624SJung-uk Kim * 18444b0f624SJung-uk Kim * RETURN: Status 18544b0f624SJung-uk Kim * 18644b0f624SJung-uk Kim * DESCRIPTION: Initialize global file structure for one input file. This file 18744b0f624SJung-uk Kim * structure contains references to input, output, debugging, and 18844b0f624SJung-uk Kim * other miscellaneous files that are associated for a single 18944b0f624SJung-uk Kim * input ASL file. 19044b0f624SJung-uk Kim * 19144b0f624SJung-uk Kim ******************************************************************************/ 19244b0f624SJung-uk Kim 19344b0f624SJung-uk Kim ACPI_STATUS 19444b0f624SJung-uk Kim FlInitOneFile ( 19544b0f624SJung-uk Kim char *InputFilename) 19644b0f624SJung-uk Kim { 19744b0f624SJung-uk Kim UINT32 i; 19844b0f624SJung-uk Kim ASL_GLOBAL_FILE_NODE *NewFileNode; 19944b0f624SJung-uk Kim 20044b0f624SJung-uk Kim 20144b0f624SJung-uk Kim if (FlInputFileExists (InputFilename)) 20244b0f624SJung-uk Kim { 20344b0f624SJung-uk Kim AslError (ASL_ERROR, ASL_MSG_DUPLICATE_INPUT_FILE, NULL, InputFilename); 20444b0f624SJung-uk Kim return (AE_ALREADY_EXISTS); 20544b0f624SJung-uk Kim } 20644b0f624SJung-uk Kim 20744b0f624SJung-uk Kim NewFileNode = ACPI_CAST_PTR (ASL_GLOBAL_FILE_NODE, 20844b0f624SJung-uk Kim UtLocalCacheCalloc (sizeof (ASL_GLOBAL_FILE_NODE))); 20944b0f624SJung-uk Kim 21044b0f624SJung-uk Kim NewFileNode->ParserErrorDetected = FALSE; 21144b0f624SJung-uk Kim NewFileNode->Next = AslGbl_FilesList; 21244b0f624SJung-uk Kim 21344b0f624SJung-uk Kim AslGbl_FilesList = NewFileNode; 21444b0f624SJung-uk Kim AslGbl_Files = NewFileNode->Files; 21544b0f624SJung-uk Kim 21644b0f624SJung-uk Kim for (i = 0; i < ASL_NUM_FILES; i++) 21744b0f624SJung-uk Kim { 21844b0f624SJung-uk Kim AslGbl_Files[i].Handle = NULL; 21944b0f624SJung-uk Kim AslGbl_Files[i].Filename = NULL; 22044b0f624SJung-uk Kim } 22144b0f624SJung-uk Kim 22244b0f624SJung-uk Kim AslGbl_Files[ASL_FILE_STDOUT].Handle = stdout; 22344b0f624SJung-uk Kim AslGbl_Files[ASL_FILE_STDOUT].Filename = "STDOUT"; 22444b0f624SJung-uk Kim 22544b0f624SJung-uk Kim if (AslGbl_VerboseErrors) 22644b0f624SJung-uk Kim { 22744b0f624SJung-uk Kim AslGbl_Files[ASL_FILE_STDERR].Handle = stderr; 22844b0f624SJung-uk Kim } 22944b0f624SJung-uk Kim else 23044b0f624SJung-uk Kim { 23144b0f624SJung-uk Kim AslGbl_Files[ASL_FILE_STDERR].Handle = stdout; 23244b0f624SJung-uk Kim } 23344b0f624SJung-uk Kim 23444b0f624SJung-uk Kim AslGbl_Files[ASL_FILE_STDERR].Filename = "STDERR"; 23544b0f624SJung-uk Kim return (AE_OK); 23644b0f624SJung-uk Kim } 23744b0f624SJung-uk Kim 23844b0f624SJung-uk Kim 23944b0f624SJung-uk Kim /******************************************************************************* 24044b0f624SJung-uk Kim * 24144b0f624SJung-uk Kim * FUNCTION: FlInputFileExists 24244b0f624SJung-uk Kim * 24344b0f624SJung-uk Kim * PARAMETERS: Filename - File name to be searched 24444b0f624SJung-uk Kim * 24544b0f624SJung-uk Kim * RETURN: Status 24644b0f624SJung-uk Kim * 24744b0f624SJung-uk Kim * DESCRIPTION: Returns true if the file name already exists. 24844b0f624SJung-uk Kim * 24944b0f624SJung-uk Kim ******************************************************************************/ 25044b0f624SJung-uk Kim 2519ad8b64eSJung-uk Kim static BOOLEAN 25244b0f624SJung-uk Kim FlInputFileExists ( 25344b0f624SJung-uk Kim char *Filename) 25444b0f624SJung-uk Kim { 25544b0f624SJung-uk Kim ASL_GLOBAL_FILE_NODE *Current = AslGbl_FilesList; 25644b0f624SJung-uk Kim 25744b0f624SJung-uk Kim 25844b0f624SJung-uk Kim while (Current) 25944b0f624SJung-uk Kim { 26044b0f624SJung-uk Kim if (!strcmp (Filename, Current->Files[ASL_FILE_INPUT].Filename)) 26144b0f624SJung-uk Kim { 26244b0f624SJung-uk Kim return (TRUE); 26344b0f624SJung-uk Kim } 26444b0f624SJung-uk Kim 26544b0f624SJung-uk Kim Current = Current->Next; 26644b0f624SJung-uk Kim } 26744b0f624SJung-uk Kim 26844b0f624SJung-uk Kim return (FALSE); 26944b0f624SJung-uk Kim } 27044b0f624SJung-uk Kim 27144b0f624SJung-uk Kim 27244b0f624SJung-uk Kim /******************************************************************************* 27344b0f624SJung-uk Kim * 27444b0f624SJung-uk Kim * FUNCTION: FlSwitchFileSet 27544b0f624SJung-uk Kim * 27644b0f624SJung-uk Kim * PARAMETERS: Op - Parse node for the LINE asl statement 27744b0f624SJung-uk Kim * 27844b0f624SJung-uk Kim * RETURN: None. 27944b0f624SJung-uk Kim * 28044b0f624SJung-uk Kim * DESCRIPTION: Set the current line number 28144b0f624SJung-uk Kim * 28244b0f624SJung-uk Kim ******************************************************************************/ 28344b0f624SJung-uk Kim 28444b0f624SJung-uk Kim ASL_FILE_SWITCH_STATUS 28544b0f624SJung-uk Kim FlSwitchFileSet ( 28644b0f624SJung-uk Kim char *InputFilename) 28744b0f624SJung-uk Kim { 28844b0f624SJung-uk Kim ASL_GLOBAL_FILE_NODE *Current = AslGbl_FilesList; 28944b0f624SJung-uk Kim char *PrevFilename = Current->Files[ASL_FILE_INPUT].Filename; 29044b0f624SJung-uk Kim 29144b0f624SJung-uk Kim 29244b0f624SJung-uk Kim while (Current) 29344b0f624SJung-uk Kim { 29444b0f624SJung-uk Kim if (!strcmp(Current->Files[ASL_FILE_INPUT].Filename, InputFilename)) 29544b0f624SJung-uk Kim { 29644b0f624SJung-uk Kim AslGbl_Files = Current->Files; 29744b0f624SJung-uk Kim AslGbl_TableSignature = Current->TableSignature; 29844b0f624SJung-uk Kim AslGbl_TableId = Current->TableId; 29944b0f624SJung-uk Kim 30044b0f624SJung-uk Kim if (!strcmp (InputFilename, PrevFilename)) 30144b0f624SJung-uk Kim { 30244b0f624SJung-uk Kim return (SWITCH_TO_SAME_FILE); 30344b0f624SJung-uk Kim } 30444b0f624SJung-uk Kim else 30544b0f624SJung-uk Kim { 30644b0f624SJung-uk Kim return (SWITCH_TO_DIFFERENT_FILE); 30744b0f624SJung-uk Kim } 30844b0f624SJung-uk Kim } 30944b0f624SJung-uk Kim 31044b0f624SJung-uk Kim Current = Current->Next; 31144b0f624SJung-uk Kim } 31244b0f624SJung-uk Kim 31344b0f624SJung-uk Kim return (FILE_NOT_FOUND); 31444b0f624SJung-uk Kim } 31544b0f624SJung-uk Kim 31644b0f624SJung-uk Kim 31744b0f624SJung-uk Kim /******************************************************************************* 31844b0f624SJung-uk Kim * 31944b0f624SJung-uk Kim * FUNCTION: FlGetFileHandle 32044b0f624SJung-uk Kim * 32144b0f624SJung-uk Kim * PARAMETERS: OutFileId - denotes file type of output handle 32244b0f624SJung-uk Kim * InFileId - denotes file type of the input Filename 32344b0f624SJung-uk Kim * Filename 32444b0f624SJung-uk Kim * 32544b0f624SJung-uk Kim * RETURN: File handle 32644b0f624SJung-uk Kim * 32744b0f624SJung-uk Kim * DESCRIPTION: Get the file handle for a particular filename/FileId. This 32844b0f624SJung-uk Kim * function also allows the caller to specify the file Id of the 32944b0f624SJung-uk Kim * desired type. 33044b0f624SJung-uk Kim * 33144b0f624SJung-uk Kim ******************************************************************************/ 33244b0f624SJung-uk Kim 33344b0f624SJung-uk Kim FILE * 33444b0f624SJung-uk Kim FlGetFileHandle ( 33544b0f624SJung-uk Kim UINT32 OutFileId, 33644b0f624SJung-uk Kim UINT32 InFileId, 33744b0f624SJung-uk Kim char *Filename) 33844b0f624SJung-uk Kim { 33944b0f624SJung-uk Kim ASL_GLOBAL_FILE_NODE *Current = AslGbl_FilesList; 34044b0f624SJung-uk Kim 34144b0f624SJung-uk Kim 34244b0f624SJung-uk Kim if (!Filename) 34344b0f624SJung-uk Kim { 34444b0f624SJung-uk Kim return (NULL); 34544b0f624SJung-uk Kim } 34644b0f624SJung-uk Kim 34744b0f624SJung-uk Kim while (Current) 34844b0f624SJung-uk Kim { 349*804fe266SJung-uk Kim if (!((Current->FileType == ASL_INPUT_TYPE_ASCII_DATA) && 350*804fe266SJung-uk Kim (InFileId == ASL_FILE_SOURCE_OUTPUT)) && 351*804fe266SJung-uk Kim !strcmp (Current->Files[InFileId].Filename, Filename)) 35244b0f624SJung-uk Kim { 35344b0f624SJung-uk Kim return (Current->Files[OutFileId].Handle); 35444b0f624SJung-uk Kim } 35544b0f624SJung-uk Kim 35644b0f624SJung-uk Kim Current = Current->Next; 35744b0f624SJung-uk Kim } 35844b0f624SJung-uk Kim 35944b0f624SJung-uk Kim return (NULL); 36044b0f624SJung-uk Kim } 36144b0f624SJung-uk Kim 36244b0f624SJung-uk Kim 36344b0f624SJung-uk Kim /******************************************************************************* 36444b0f624SJung-uk Kim * 36544b0f624SJung-uk Kim * FUNCTION: FlGetFileNode 36644b0f624SJung-uk Kim * 36744b0f624SJung-uk Kim * PARAMETERS: FileId - File type (ID) of the input Filename 36844b0f624SJung-uk Kim * Filename - File to search for 36944b0f624SJung-uk Kim * 37044b0f624SJung-uk Kim * RETURN: A global file node 37144b0f624SJung-uk Kim * 37244b0f624SJung-uk Kim * DESCRIPTION: Get the file node for a particular filename/FileId. 37344b0f624SJung-uk Kim * 37444b0f624SJung-uk Kim ******************************************************************************/ 37544b0f624SJung-uk Kim 37644b0f624SJung-uk Kim ASL_GLOBAL_FILE_NODE * 37744b0f624SJung-uk Kim FlGetFileNode ( 37844b0f624SJung-uk Kim UINT32 FileId, 37944b0f624SJung-uk Kim char *Filename) 38044b0f624SJung-uk Kim { 38144b0f624SJung-uk Kim ASL_GLOBAL_FILE_NODE *Current = AslGbl_FilesList; 38244b0f624SJung-uk Kim 38344b0f624SJung-uk Kim 38444b0f624SJung-uk Kim if (!Filename) 38544b0f624SJung-uk Kim { 38644b0f624SJung-uk Kim return (NULL); 38744b0f624SJung-uk Kim } 38844b0f624SJung-uk Kim 38944b0f624SJung-uk Kim while (Current) 39044b0f624SJung-uk Kim { 39144b0f624SJung-uk Kim if (!strcmp (Current->Files[FileId].Filename, Filename)) 39244b0f624SJung-uk Kim { 39344b0f624SJung-uk Kim return (Current); 39444b0f624SJung-uk Kim } 39544b0f624SJung-uk Kim 39644b0f624SJung-uk Kim Current = Current->Next; 39744b0f624SJung-uk Kim } 39844b0f624SJung-uk Kim 39944b0f624SJung-uk Kim return (NULL); 40044b0f624SJung-uk Kim } 40144b0f624SJung-uk Kim 40244b0f624SJung-uk Kim 40344b0f624SJung-uk Kim /******************************************************************************* 40444b0f624SJung-uk Kim * 40544b0f624SJung-uk Kim * FUNCTION: FlGetCurrentFileNode 40644b0f624SJung-uk Kim * 40744b0f624SJung-uk Kim * PARAMETERS: None 40844b0f624SJung-uk Kim * 40944b0f624SJung-uk Kim * RETURN: Global file node 41044b0f624SJung-uk Kim * 41144b0f624SJung-uk Kim * DESCRIPTION: Get the current input file node 41244b0f624SJung-uk Kim * 41344b0f624SJung-uk Kim ******************************************************************************/ 41444b0f624SJung-uk Kim 41544b0f624SJung-uk Kim ASL_GLOBAL_FILE_NODE * 41644b0f624SJung-uk Kim FlGetCurrentFileNode ( 41744b0f624SJung-uk Kim void) 41844b0f624SJung-uk Kim { 419f9a6772eSJung-uk Kim ASL_GLOBAL_FILE_NODE *FileNode = 420f9a6772eSJung-uk Kim FlGetFileNode (ASL_FILE_INPUT,AslGbl_Files[ASL_FILE_INPUT].Filename); 421f9a6772eSJung-uk Kim 422f9a6772eSJung-uk Kim 423f9a6772eSJung-uk Kim if (!FileNode) 424f9a6772eSJung-uk Kim { 425f9a6772eSJung-uk Kim /* 426f9a6772eSJung-uk Kim * If the current file node does not exist after initializing the file 427f9a6772eSJung-uk Kim * node structures, something went wrong and this is an unrecoverable 428f9a6772eSJung-uk Kim * condition. 429f9a6772eSJung-uk Kim */ 430f9a6772eSJung-uk Kim FlFileError (ASL_FILE_INPUT, ASL_MSG_COMPILER_INTERNAL); 431f9a6772eSJung-uk Kim AslAbort (); 432f9a6772eSJung-uk Kim } 433f9a6772eSJung-uk Kim 434f9a6772eSJung-uk Kim return (FileNode); 43544b0f624SJung-uk Kim } 43644b0f624SJung-uk Kim 43744b0f624SJung-uk Kim 43844b0f624SJung-uk Kim /******************************************************************************* 43944b0f624SJung-uk Kim * 44053289f6aSNate Lawson * FUNCTION: FlSetLineNumber 44153289f6aSNate Lawson * 44253289f6aSNate Lawson * PARAMETERS: Op - Parse node for the LINE asl statement 44353289f6aSNate Lawson * 44453289f6aSNate Lawson * RETURN: None. 44553289f6aSNate Lawson * 44653289f6aSNate Lawson * DESCRIPTION: Set the current line number 44753289f6aSNate Lawson * 44853289f6aSNate Lawson ******************************************************************************/ 44953289f6aSNate Lawson 45053289f6aSNate Lawson void 45153289f6aSNate Lawson FlSetLineNumber ( 452eef1b955SJung-uk Kim UINT32 LineNumber) 45353289f6aSNate Lawson { 45453289f6aSNate Lawson 455eef1b955SJung-uk Kim DbgPrint (ASL_PARSE_OUTPUT, "\n#line: New line number %u (old %u)\n", 4566f1f1a63SJung-uk Kim LineNumber, AslGbl_LogicalLineNumber); 457eef1b955SJung-uk Kim 4586f1f1a63SJung-uk Kim AslGbl_CurrentLineNumber = LineNumber; 459eef1b955SJung-uk Kim } 460eef1b955SJung-uk Kim 461eef1b955SJung-uk Kim 462eef1b955SJung-uk Kim /******************************************************************************* 463eef1b955SJung-uk Kim * 464eef1b955SJung-uk Kim * FUNCTION: FlSetFilename 465eef1b955SJung-uk Kim * 466eef1b955SJung-uk Kim * PARAMETERS: Op - Parse node for the LINE asl statement 467eef1b955SJung-uk Kim * 468eef1b955SJung-uk Kim * RETURN: None. 469eef1b955SJung-uk Kim * 470eef1b955SJung-uk Kim * DESCRIPTION: Set the current filename 471eef1b955SJung-uk Kim * 472eef1b955SJung-uk Kim ******************************************************************************/ 473eef1b955SJung-uk Kim 474eef1b955SJung-uk Kim void 475eef1b955SJung-uk Kim FlSetFilename ( 476eef1b955SJung-uk Kim char *Filename) 477eef1b955SJung-uk Kim { 478eef1b955SJung-uk Kim 479eef1b955SJung-uk Kim DbgPrint (ASL_PARSE_OUTPUT, "\n#line: New filename %s (old %s)\n", 4806f1f1a63SJung-uk Kim Filename, AslGbl_Files[ASL_FILE_INPUT].Filename); 481eef1b955SJung-uk Kim 482313a0c13SJung-uk Kim /* No need to free any existing filename */ 483313a0c13SJung-uk Kim 4846f1f1a63SJung-uk Kim AslGbl_Files[ASL_FILE_INPUT].Filename = Filename; 48553289f6aSNate Lawson } 48653289f6aSNate Lawson 48753289f6aSNate Lawson 48853289f6aSNate Lawson /******************************************************************************* 48953289f6aSNate Lawson * 490d6dd1baeSJung-uk Kim * FUNCTION: FlAddIncludeDirectory 491d6dd1baeSJung-uk Kim * 492d6dd1baeSJung-uk Kim * PARAMETERS: Dir - Directory pathname string 493d6dd1baeSJung-uk Kim * 494d6dd1baeSJung-uk Kim * RETURN: None 495d6dd1baeSJung-uk Kim * 496d6dd1baeSJung-uk Kim * DESCRIPTION: Add a directory the list of include prefix directories. 497d6dd1baeSJung-uk Kim * 498d6dd1baeSJung-uk Kim ******************************************************************************/ 499d6dd1baeSJung-uk Kim 500d6dd1baeSJung-uk Kim void 501d6dd1baeSJung-uk Kim FlAddIncludeDirectory ( 502d6dd1baeSJung-uk Kim char *Dir) 503d6dd1baeSJung-uk Kim { 504d6dd1baeSJung-uk Kim ASL_INCLUDE_DIR *NewDir; 505d6dd1baeSJung-uk Kim ASL_INCLUDE_DIR *NextDir; 506d6dd1baeSJung-uk Kim ASL_INCLUDE_DIR *PrevDir = NULL; 507d6dd1baeSJung-uk Kim UINT32 NeedsSeparator = 0; 508d6dd1baeSJung-uk Kim size_t DirLength; 509d6dd1baeSJung-uk Kim 510d6dd1baeSJung-uk Kim 511d6dd1baeSJung-uk Kim DirLength = strlen (Dir); 512d6dd1baeSJung-uk Kim if (!DirLength) 513d6dd1baeSJung-uk Kim { 514d6dd1baeSJung-uk Kim return; 515d6dd1baeSJung-uk Kim } 516d6dd1baeSJung-uk Kim 517d6dd1baeSJung-uk Kim /* Make sure that the pathname ends with a path separator */ 518d6dd1baeSJung-uk Kim 519d6dd1baeSJung-uk Kim if ((Dir[DirLength-1] != '/') && 520d6dd1baeSJung-uk Kim (Dir[DirLength-1] != '\\')) 521d6dd1baeSJung-uk Kim { 522d6dd1baeSJung-uk Kim NeedsSeparator = 1; 523d6dd1baeSJung-uk Kim } 524d6dd1baeSJung-uk Kim 5256f1f1a63SJung-uk Kim NewDir = ACPI_CAST_PTR (ASL_INCLUDE_DIR, 5266f1f1a63SJung-uk Kim UtLocalCacheCalloc (sizeof (ASL_INCLUDE_DIR))); 5276f1f1a63SJung-uk Kim NewDir->Dir = UtLocalCacheCalloc (DirLength + 1 + NeedsSeparator); 528d6dd1baeSJung-uk Kim strcpy (NewDir->Dir, Dir); 529d6dd1baeSJung-uk Kim if (NeedsSeparator) 530d6dd1baeSJung-uk Kim { 531d6dd1baeSJung-uk Kim strcat (NewDir->Dir, "/"); 532d6dd1baeSJung-uk Kim } 533d6dd1baeSJung-uk Kim 534d6dd1baeSJung-uk Kim /* 535d6dd1baeSJung-uk Kim * Preserve command line ordering of -I options by adding new elements 536d6dd1baeSJung-uk Kim * at the end of the list 537d6dd1baeSJung-uk Kim */ 5386f1f1a63SJung-uk Kim NextDir = AslGbl_IncludeDirList; 539d6dd1baeSJung-uk Kim while (NextDir) 540d6dd1baeSJung-uk Kim { 541d6dd1baeSJung-uk Kim PrevDir = NextDir; 542d6dd1baeSJung-uk Kim NextDir = NextDir->Next; 543d6dd1baeSJung-uk Kim } 544d6dd1baeSJung-uk Kim 545d6dd1baeSJung-uk Kim if (PrevDir) 546d6dd1baeSJung-uk Kim { 547d6dd1baeSJung-uk Kim PrevDir->Next = NewDir; 548d6dd1baeSJung-uk Kim } 549d6dd1baeSJung-uk Kim else 550d6dd1baeSJung-uk Kim { 5516f1f1a63SJung-uk Kim AslGbl_IncludeDirList = NewDir; 552d6dd1baeSJung-uk Kim } 553d6dd1baeSJung-uk Kim } 554d6dd1baeSJung-uk Kim 555d6dd1baeSJung-uk Kim 556d6dd1baeSJung-uk Kim /******************************************************************************* 557d6dd1baeSJung-uk Kim * 558a7a3b383SJung-uk Kim * FUNCTION: FlMergePathnames 559a7a3b383SJung-uk Kim * 560a7a3b383SJung-uk Kim * PARAMETERS: PrefixDir - Prefix directory pathname. Can be NULL or 561a7a3b383SJung-uk Kim * a zero length string. 562a7a3b383SJung-uk Kim * FilePathname - The include filename from the source ASL. 563a7a3b383SJung-uk Kim * 564a7a3b383SJung-uk Kim * RETURN: Merged pathname string 565a7a3b383SJung-uk Kim * 566a7a3b383SJung-uk Kim * DESCRIPTION: Merge two pathnames that (probably) have common elements, to 567a7a3b383SJung-uk Kim * arrive at a minimal length string. Merge can occur if the 568a7a3b383SJung-uk Kim * FilePathname is relative to the PrefixDir. 569a7a3b383SJung-uk Kim * 570a7a3b383SJung-uk Kim ******************************************************************************/ 571a7a3b383SJung-uk Kim 572a7a3b383SJung-uk Kim char * 573a7a3b383SJung-uk Kim FlMergePathnames ( 574a7a3b383SJung-uk Kim char *PrefixDir, 575a7a3b383SJung-uk Kim char *FilePathname) 576a7a3b383SJung-uk Kim { 577a7a3b383SJung-uk Kim char *CommonPath; 578a7a3b383SJung-uk Kim char *Pathname; 579a7a3b383SJung-uk Kim char *LastElement; 580a7a3b383SJung-uk Kim 581a7a3b383SJung-uk Kim 582a7a3b383SJung-uk Kim DbgPrint (ASL_PARSE_OUTPUT, "Include: Prefix path - \"%s\"\n" 583a7a3b383SJung-uk Kim "Include: FilePathname - \"%s\"\n", 584a7a3b383SJung-uk Kim PrefixDir, FilePathname); 585a7a3b383SJung-uk Kim 586a7a3b383SJung-uk Kim /* 587a7a3b383SJung-uk Kim * If there is no prefix directory or if the file pathname is absolute, 588a7a3b383SJung-uk Kim * just return the original file pathname 589a7a3b383SJung-uk Kim */ 590a7a3b383SJung-uk Kim if (!PrefixDir || (!*PrefixDir) || 591a7a3b383SJung-uk Kim (*FilePathname == '/') || 592a7a3b383SJung-uk Kim (FilePathname[1] == ':')) 593a7a3b383SJung-uk Kim { 59467d9aa44SJung-uk Kim Pathname = UtLocalCacheCalloc (strlen (FilePathname) + 1); 595a7a3b383SJung-uk Kim strcpy (Pathname, FilePathname); 596a7a3b383SJung-uk Kim goto ConvertBackslashes; 597a7a3b383SJung-uk Kim } 598a7a3b383SJung-uk Kim 599a7a3b383SJung-uk Kim /* Need a local copy of the prefix directory path */ 600a7a3b383SJung-uk Kim 60167d9aa44SJung-uk Kim CommonPath = UtLocalCacheCalloc (strlen (PrefixDir) + 1); 602a7a3b383SJung-uk Kim strcpy (CommonPath, PrefixDir); 603a7a3b383SJung-uk Kim 604a7a3b383SJung-uk Kim /* 605a7a3b383SJung-uk Kim * Walk forward through the file path, and simultaneously backward 606a7a3b383SJung-uk Kim * through the prefix directory path until there are no more 607a7a3b383SJung-uk Kim * relative references at the start of the file path. 608a7a3b383SJung-uk Kim */ 609a7a3b383SJung-uk Kim while (*FilePathname && (!strncmp (FilePathname, "../", 3))) 610a7a3b383SJung-uk Kim { 611a7a3b383SJung-uk Kim /* Remove last element of the prefix directory path */ 612a7a3b383SJung-uk Kim 613a7a3b383SJung-uk Kim LastElement = strrchr (CommonPath, '/'); 614a7a3b383SJung-uk Kim if (!LastElement) 615a7a3b383SJung-uk Kim { 616a7a3b383SJung-uk Kim goto ConcatenatePaths; 617a7a3b383SJung-uk Kim } 618a7a3b383SJung-uk Kim 619a7a3b383SJung-uk Kim *LastElement = 0; /* Terminate CommonPath string */ 620a7a3b383SJung-uk Kim FilePathname += 3; /* Point to next path element */ 621a7a3b383SJung-uk Kim } 622a7a3b383SJung-uk Kim 623a7a3b383SJung-uk Kim /* 624a7a3b383SJung-uk Kim * Remove the last element of the prefix directory path (it is the same as 625a7a3b383SJung-uk Kim * the first element of the file pathname), and build the final merged 626a7a3b383SJung-uk Kim * pathname. 627a7a3b383SJung-uk Kim */ 628a7a3b383SJung-uk Kim LastElement = strrchr (CommonPath, '/'); 629a7a3b383SJung-uk Kim if (LastElement) 630a7a3b383SJung-uk Kim { 631a7a3b383SJung-uk Kim *LastElement = 0; 632a7a3b383SJung-uk Kim } 633a7a3b383SJung-uk Kim 634a7a3b383SJung-uk Kim /* Build the final merged pathname */ 635a7a3b383SJung-uk Kim 636a7a3b383SJung-uk Kim ConcatenatePaths: 63767d9aa44SJung-uk Kim Pathname = UtLocalCacheCalloc ( 638f8146b88SJung-uk Kim strlen (CommonPath) + strlen (FilePathname) + 2); 639a7a3b383SJung-uk Kim if (LastElement && *CommonPath) 640a7a3b383SJung-uk Kim { 641a7a3b383SJung-uk Kim strcpy (Pathname, CommonPath); 642a7a3b383SJung-uk Kim strcat (Pathname, "/"); 643a7a3b383SJung-uk Kim } 644a7a3b383SJung-uk Kim strcat (Pathname, FilePathname); 645a7a3b383SJung-uk Kim 646a7a3b383SJung-uk Kim /* Convert all backslashes to normal slashes */ 647a7a3b383SJung-uk Kim 648a7a3b383SJung-uk Kim ConvertBackslashes: 649a7a3b383SJung-uk Kim UtConvertBackslashes (Pathname); 650a7a3b383SJung-uk Kim 651a7a3b383SJung-uk Kim DbgPrint (ASL_PARSE_OUTPUT, "Include: Merged Pathname - \"%s\"\n", 652a7a3b383SJung-uk Kim Pathname); 653a7a3b383SJung-uk Kim return (Pathname); 654a7a3b383SJung-uk Kim } 655a7a3b383SJung-uk Kim 656a7a3b383SJung-uk Kim 657a7a3b383SJung-uk Kim /******************************************************************************* 658a7a3b383SJung-uk Kim * 659d6dd1baeSJung-uk Kim * FUNCTION: FlOpenIncludeWithPrefix 660d6dd1baeSJung-uk Kim * 661d6dd1baeSJung-uk Kim * PARAMETERS: PrefixDir - Prefix directory pathname. Can be a zero 662d6dd1baeSJung-uk Kim * length string. 663d6dd1baeSJung-uk Kim * Filename - The include filename from the source ASL. 664d6dd1baeSJung-uk Kim * 665d6dd1baeSJung-uk Kim * RETURN: Valid file descriptor if successful. Null otherwise. 666d6dd1baeSJung-uk Kim * 667d6dd1baeSJung-uk Kim * DESCRIPTION: Open an include file and push it on the input file stack. 668d6dd1baeSJung-uk Kim * 669d6dd1baeSJung-uk Kim ******************************************************************************/ 670d6dd1baeSJung-uk Kim 671a371a5fdSJung-uk Kim static FILE * 672d6dd1baeSJung-uk Kim FlOpenIncludeWithPrefix ( 673d6dd1baeSJung-uk Kim char *PrefixDir, 674a371a5fdSJung-uk Kim ACPI_PARSE_OBJECT *Op, 675d6dd1baeSJung-uk Kim char *Filename) 676d6dd1baeSJung-uk Kim { 677d6dd1baeSJung-uk Kim FILE *IncludeFile; 678d6dd1baeSJung-uk Kim char *Pathname; 6795ef50723SJung-uk Kim UINT32 OriginalLineNumber; 680d6dd1baeSJung-uk Kim 681d6dd1baeSJung-uk Kim 682d6dd1baeSJung-uk Kim /* Build the full pathname to the file */ 683d6dd1baeSJung-uk Kim 684a7a3b383SJung-uk Kim Pathname = FlMergePathnames (PrefixDir, Filename); 685d6dd1baeSJung-uk Kim 686a7a3b383SJung-uk Kim DbgPrint (ASL_PARSE_OUTPUT, "Include: Opening file - \"%s\"\n\n", 687d6dd1baeSJung-uk Kim Pathname); 688d6dd1baeSJung-uk Kim 689d6dd1baeSJung-uk Kim /* Attempt to open the file, push if successful */ 690d6dd1baeSJung-uk Kim 691d6dd1baeSJung-uk Kim IncludeFile = fopen (Pathname, "r"); 692ed17e06eSJung-uk Kim if (!IncludeFile) 693d6dd1baeSJung-uk Kim { 694ed17e06eSJung-uk Kim return (NULL); 695ed17e06eSJung-uk Kim } 696ed17e06eSJung-uk Kim 697a371a5fdSJung-uk Kim /* 6985ef50723SJung-uk Kim * Check the entire include file for any # preprocessor directives. 699a371a5fdSJung-uk Kim * This is because there may be some confusion between the #include 7005ef50723SJung-uk Kim * preprocessor directive and the ASL Include statement. A file included 7015ef50723SJung-uk Kim * by the ASL include cannot contain preprocessor directives because 7025ef50723SJung-uk Kim * the preprocessor has already run by the time the ASL include is 7035ef50723SJung-uk Kim * recognized (by the compiler, not the preprocessor.) 7045ef50723SJung-uk Kim * 7055ef50723SJung-uk Kim * Note: DtGetNextLine strips/ignores comments. 7065ef50723SJung-uk Kim * Save current line number since DtGetNextLine modifies it. 707a371a5fdSJung-uk Kim */ 7086f1f1a63SJung-uk Kim AslGbl_CurrentLineNumber--; 7096f1f1a63SJung-uk Kim OriginalLineNumber = AslGbl_CurrentLineNumber; 710f8146b88SJung-uk Kim 7115ef50723SJung-uk Kim while (DtGetNextLine (IncludeFile, DT_ALLOW_MULTILINE_QUOTES) != ASL_EOF) 712a371a5fdSJung-uk Kim { 7136f1f1a63SJung-uk Kim if (AslGbl_CurrentLineBuffer[0] == '#') 714a371a5fdSJung-uk Kim { 715a371a5fdSJung-uk Kim AslError (ASL_ERROR, ASL_MSG_INCLUDE_FILE, 716a371a5fdSJung-uk Kim Op, "use #include instead"); 717a371a5fdSJung-uk Kim } 718a371a5fdSJung-uk Kim } 719f8146b88SJung-uk Kim 7206f1f1a63SJung-uk Kim AslGbl_CurrentLineNumber = OriginalLineNumber; 721a371a5fdSJung-uk Kim 722a371a5fdSJung-uk Kim /* Must seek back to the start of the file */ 723a371a5fdSJung-uk Kim 724a371a5fdSJung-uk Kim fseek (IncludeFile, 0, SEEK_SET); 725a371a5fdSJung-uk Kim 726d6dd1baeSJung-uk Kim /* Push the include file on the open input file stack */ 727d6dd1baeSJung-uk Kim 728d6dd1baeSJung-uk Kim AslPushInputFileStack (IncludeFile, Pathname); 729d6dd1baeSJung-uk Kim return (IncludeFile); 730d6dd1baeSJung-uk Kim } 731d6dd1baeSJung-uk Kim 732d6dd1baeSJung-uk Kim 733d6dd1baeSJung-uk Kim /******************************************************************************* 734d6dd1baeSJung-uk Kim * 73553289f6aSNate Lawson * FUNCTION: FlOpenIncludeFile 73653289f6aSNate Lawson * 73753289f6aSNate Lawson * PARAMETERS: Op - Parse node for the INCLUDE ASL statement 73853289f6aSNate Lawson * 73953289f6aSNate Lawson * RETURN: None. 74053289f6aSNate Lawson * 74153289f6aSNate Lawson * DESCRIPTION: Open an include file and push it on the input file stack. 74253289f6aSNate Lawson * 74353289f6aSNate Lawson ******************************************************************************/ 74453289f6aSNate Lawson 74553289f6aSNate Lawson void 74653289f6aSNate Lawson FlOpenIncludeFile ( 74753289f6aSNate Lawson ACPI_PARSE_OBJECT *Op) 74853289f6aSNate Lawson { 749d6dd1baeSJung-uk Kim FILE *IncludeFile; 750d6dd1baeSJung-uk Kim ASL_INCLUDE_DIR *NextDir; 75153289f6aSNate Lawson 75253289f6aSNate Lawson 75353289f6aSNate Lawson /* Op must be valid */ 75453289f6aSNate Lawson 75553289f6aSNate Lawson if (!Op) 75653289f6aSNate Lawson { 75753289f6aSNate Lawson AslCommonError (ASL_ERROR, ASL_MSG_INCLUDE_FILE_OPEN, 7586f1f1a63SJung-uk Kim AslGbl_CurrentLineNumber, AslGbl_LogicalLineNumber, 7596f1f1a63SJung-uk Kim AslGbl_InputByteCount, AslGbl_CurrentColumn, 7606f1f1a63SJung-uk Kim AslGbl_Files[ASL_FILE_INPUT].Filename, " - Null parse node"); 76153289f6aSNate Lawson 76253289f6aSNate Lawson return; 76353289f6aSNate Lawson } 76453289f6aSNate Lawson 76553289f6aSNate Lawson /* 76653289f6aSNate Lawson * Flush out the "include ()" statement on this line, start 76753289f6aSNate Lawson * the actual include file on the next line 76853289f6aSNate Lawson */ 769eef1b955SJung-uk Kim AslResetCurrentLineBuffer (); 77053289f6aSNate Lawson FlPrintFile (ASL_FILE_SOURCE_OUTPUT, "\n"); 7716f1f1a63SJung-uk Kim AslGbl_CurrentLineOffset++; 77253289f6aSNate Lawson 77353289f6aSNate Lawson 774d6dd1baeSJung-uk Kim /* Attempt to open the include file */ 775d6dd1baeSJung-uk Kim 776d6dd1baeSJung-uk Kim /* If the file specifies an absolute path, just open it */ 777d6dd1baeSJung-uk Kim 778d6dd1baeSJung-uk Kim if ((Op->Asl.Value.String[0] == '/') || 779d6dd1baeSJung-uk Kim (Op->Asl.Value.String[0] == '\\') || 780d6dd1baeSJung-uk Kim (Op->Asl.Value.String[1] == ':')) 78153289f6aSNate Lawson { 782a371a5fdSJung-uk Kim IncludeFile = FlOpenIncludeWithPrefix ("", Op, Op->Asl.Value.String); 783d6dd1baeSJung-uk Kim if (!IncludeFile) 784d6dd1baeSJung-uk Kim { 785d6dd1baeSJung-uk Kim goto ErrorExit; 786d6dd1baeSJung-uk Kim } 78753289f6aSNate Lawson return; 78853289f6aSNate Lawson } 78953289f6aSNate Lawson 790d6dd1baeSJung-uk Kim /* 791d6dd1baeSJung-uk Kim * The include filename is not an absolute path. 792d6dd1baeSJung-uk Kim * 793d6dd1baeSJung-uk Kim * First, search for the file within the "local" directory -- meaning 794d6dd1baeSJung-uk Kim * the same directory that contains the source file. 795d6dd1baeSJung-uk Kim * 796d6dd1baeSJung-uk Kim * Construct the file pathname from the global directory name. 797d6dd1baeSJung-uk Kim */ 798f8146b88SJung-uk Kim IncludeFile = FlOpenIncludeWithPrefix ( 7996f1f1a63SJung-uk Kim AslGbl_DirectoryPath, Op, Op->Asl.Value.String); 800d6dd1baeSJung-uk Kim if (IncludeFile) 801d6dd1baeSJung-uk Kim { 802d6dd1baeSJung-uk Kim return; 803d6dd1baeSJung-uk Kim } 80453289f6aSNate Lawson 805d6dd1baeSJung-uk Kim /* 806d6dd1baeSJung-uk Kim * Second, search for the file within the (possibly multiple) directories 807d6dd1baeSJung-uk Kim * specified by the -I option on the command line. 808d6dd1baeSJung-uk Kim */ 8096f1f1a63SJung-uk Kim NextDir = AslGbl_IncludeDirList; 810d6dd1baeSJung-uk Kim while (NextDir) 811d6dd1baeSJung-uk Kim { 812f8146b88SJung-uk Kim IncludeFile = FlOpenIncludeWithPrefix ( 813f8146b88SJung-uk Kim NextDir->Dir, Op, Op->Asl.Value.String); 814d6dd1baeSJung-uk Kim if (IncludeFile) 815d6dd1baeSJung-uk Kim { 816d6dd1baeSJung-uk Kim return; 817d6dd1baeSJung-uk Kim } 818d6dd1baeSJung-uk Kim 819d6dd1baeSJung-uk Kim NextDir = NextDir->Next; 820d6dd1baeSJung-uk Kim } 821d6dd1baeSJung-uk Kim 822d6dd1baeSJung-uk Kim /* We could not open the include file after trying very hard */ 823d6dd1baeSJung-uk Kim 824d6dd1baeSJung-uk Kim ErrorExit: 8256f1f1a63SJung-uk Kim sprintf (AslGbl_MsgBuffer, "%s, %s", Op->Asl.Value.String, strerror (errno)); 8266f1f1a63SJung-uk Kim AslError (ASL_ERROR, ASL_MSG_INCLUDE_FILE_OPEN, Op, AslGbl_MsgBuffer); 82753289f6aSNate Lawson } 82853289f6aSNate Lawson 82953289f6aSNate Lawson 83053289f6aSNate Lawson /******************************************************************************* 83153289f6aSNate Lawson * 832fba7fc7eSJung-uk Kim * FUNCTION: FlOpenInputFile 833fba7fc7eSJung-uk Kim * 834fba7fc7eSJung-uk Kim * PARAMETERS: InputFilename - The user-specified ASL source file to be 835fba7fc7eSJung-uk Kim * compiled 836fba7fc7eSJung-uk Kim * 837fba7fc7eSJung-uk Kim * RETURN: Status 838fba7fc7eSJung-uk Kim * 839fba7fc7eSJung-uk Kim * DESCRIPTION: Open the specified input file, and save the directory path to 840ab71bbb7SJung-uk Kim * the file so that include files can be opened in the same 841ab71bbb7SJung-uk Kim * directory. NOTE: File is opened in text mode. 842fba7fc7eSJung-uk Kim * 843fba7fc7eSJung-uk Kim ******************************************************************************/ 844fba7fc7eSJung-uk Kim 845fba7fc7eSJung-uk Kim ACPI_STATUS 846fba7fc7eSJung-uk Kim FlOpenInputFile ( 847fba7fc7eSJung-uk Kim char *InputFilename) 848fba7fc7eSJung-uk Kim { 849fba7fc7eSJung-uk Kim 850fba7fc7eSJung-uk Kim /* Open the input ASL file, text mode */ 851fba7fc7eSJung-uk Kim 852f38b0f21SJung-uk Kim FlOpenFile (ASL_FILE_INPUT, InputFilename, "rt"); 8536f1f1a63SJung-uk Kim AslCompilerin = AslGbl_Files[ASL_FILE_INPUT].Handle; 854fba7fc7eSJung-uk Kim 855fba7fc7eSJung-uk Kim return (AE_OK); 856fba7fc7eSJung-uk Kim } 857fba7fc7eSJung-uk Kim 858fba7fc7eSJung-uk Kim 859fba7fc7eSJung-uk Kim /******************************************************************************* 860fba7fc7eSJung-uk Kim * 861fba7fc7eSJung-uk Kim * FUNCTION: FlOpenAmlOutputFile 862fba7fc7eSJung-uk Kim * 863fba7fc7eSJung-uk Kim * PARAMETERS: FilenamePrefix - The user-specified ASL source file 864fba7fc7eSJung-uk Kim * 865fba7fc7eSJung-uk Kim * RETURN: Status 866fba7fc7eSJung-uk Kim * 867fba7fc7eSJung-uk Kim * DESCRIPTION: Create the output filename (*.AML) and open the file. The file 868fba7fc7eSJung-uk Kim * is created in the same directory as the parent input file. 869fba7fc7eSJung-uk Kim * 870fba7fc7eSJung-uk Kim ******************************************************************************/ 871fba7fc7eSJung-uk Kim 872fba7fc7eSJung-uk Kim ACPI_STATUS 873fba7fc7eSJung-uk Kim FlOpenAmlOutputFile ( 874fba7fc7eSJung-uk Kim char *FilenamePrefix) 875fba7fc7eSJung-uk Kim { 876fba7fc7eSJung-uk Kim char *Filename; 877fba7fc7eSJung-uk Kim 878fba7fc7eSJung-uk Kim 879fba7fc7eSJung-uk Kim /* Output filename usually comes from the ASL itself */ 880fba7fc7eSJung-uk Kim 8816f1f1a63SJung-uk Kim Filename = AslGbl_Files[ASL_FILE_AML_OUTPUT].Filename; 882fba7fc7eSJung-uk Kim if (!Filename) 883fba7fc7eSJung-uk Kim { 884fba7fc7eSJung-uk Kim /* Create the output AML filename */ 885f1db5ef7SJung-uk Kim if (!AcpiGbl_CaptureComments) 8860d84335fSJung-uk Kim { 887fba7fc7eSJung-uk Kim Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_AML_CODE); 8880d84335fSJung-uk Kim } 8890d84335fSJung-uk Kim else 8900d84335fSJung-uk Kim { 8910d84335fSJung-uk Kim Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_CONVERT_AML); 8920d84335fSJung-uk Kim } 893fba7fc7eSJung-uk Kim if (!Filename) 894fba7fc7eSJung-uk Kim { 895fba7fc7eSJung-uk Kim AslCommonError (ASL_ERROR, ASL_MSG_OUTPUT_FILENAME, 896fba7fc7eSJung-uk Kim 0, 0, 0, 0, NULL, NULL); 897fba7fc7eSJung-uk Kim return (AE_ERROR); 898fba7fc7eSJung-uk Kim } 8991c0e1b6dSJung-uk Kim 9006f1f1a63SJung-uk Kim AslGbl_Files[ASL_FILE_AML_OUTPUT].Filename = Filename; 901fba7fc7eSJung-uk Kim } 902fba7fc7eSJung-uk Kim 903fba7fc7eSJung-uk Kim /* Open the output AML file in binary mode */ 904fba7fc7eSJung-uk Kim 905fba7fc7eSJung-uk Kim FlOpenFile (ASL_FILE_AML_OUTPUT, Filename, "w+b"); 906fba7fc7eSJung-uk Kim return (AE_OK); 907fba7fc7eSJung-uk Kim } 908fba7fc7eSJung-uk Kim 909fba7fc7eSJung-uk Kim 910fba7fc7eSJung-uk Kim /******************************************************************************* 911fba7fc7eSJung-uk Kim * 912fba7fc7eSJung-uk Kim * FUNCTION: FlOpenMiscOutputFiles 913fba7fc7eSJung-uk Kim * 914fba7fc7eSJung-uk Kim * PARAMETERS: FilenamePrefix - The user-specified ASL source file 915fba7fc7eSJung-uk Kim * 916fba7fc7eSJung-uk Kim * RETURN: Status 917fba7fc7eSJung-uk Kim * 918fba7fc7eSJung-uk Kim * DESCRIPTION: Create and open the various output files needed, depending on 919fba7fc7eSJung-uk Kim * the command line options 920fba7fc7eSJung-uk Kim * 921fba7fc7eSJung-uk Kim ******************************************************************************/ 922fba7fc7eSJung-uk Kim 923fba7fc7eSJung-uk Kim ACPI_STATUS 924fba7fc7eSJung-uk Kim FlOpenMiscOutputFiles ( 925fba7fc7eSJung-uk Kim char *FilenamePrefix) 926fba7fc7eSJung-uk Kim { 927fba7fc7eSJung-uk Kim char *Filename; 928fba7fc7eSJung-uk Kim 929fba7fc7eSJung-uk Kim 930fe0f0bbbSJung-uk Kim /* Create/Open a map file if requested */ 931fe0f0bbbSJung-uk Kim 9326f1f1a63SJung-uk Kim if (AslGbl_MapfileFlag) 933fe0f0bbbSJung-uk Kim { 934fe0f0bbbSJung-uk Kim Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_MAP); 935fe0f0bbbSJung-uk Kim if (!Filename) 936fe0f0bbbSJung-uk Kim { 937fe0f0bbbSJung-uk Kim AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME, 938fe0f0bbbSJung-uk Kim 0, 0, 0, 0, NULL, NULL); 939fe0f0bbbSJung-uk Kim return (AE_ERROR); 940fe0f0bbbSJung-uk Kim } 941fe0f0bbbSJung-uk Kim 942fe0f0bbbSJung-uk Kim /* Open the hex file, text mode (closed at compiler exit) */ 943fe0f0bbbSJung-uk Kim 944fe0f0bbbSJung-uk Kim FlOpenFile (ASL_FILE_MAP_OUTPUT, Filename, "w+t"); 945fe0f0bbbSJung-uk Kim 946fe0f0bbbSJung-uk Kim AslCompilerSignon (ASL_FILE_MAP_OUTPUT); 947fe0f0bbbSJung-uk Kim AslCompilerFileHeader (ASL_FILE_MAP_OUTPUT); 948fe0f0bbbSJung-uk Kim } 949fe0f0bbbSJung-uk Kim 9509c48c75eSJung-uk Kim /* All done for disassembler */ 9519c48c75eSJung-uk Kim 9526f1f1a63SJung-uk Kim if (AslGbl_FileType == ASL_INPUT_TYPE_BINARY_ACPI_TABLE) 9539c48c75eSJung-uk Kim { 9549c48c75eSJung-uk Kim return (AE_OK); 9559c48c75eSJung-uk Kim } 9569c48c75eSJung-uk Kim 957a88e22b7SJung-uk Kim /* Create/Open a hex output file if asked */ 958a88e22b7SJung-uk Kim 9596f1f1a63SJung-uk Kim if (AslGbl_HexOutputFlag) 960a88e22b7SJung-uk Kim { 961a88e22b7SJung-uk Kim Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_HEX_DUMP); 962a88e22b7SJung-uk Kim if (!Filename) 963a88e22b7SJung-uk Kim { 964a88e22b7SJung-uk Kim AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME, 965a88e22b7SJung-uk Kim 0, 0, 0, 0, NULL, NULL); 966a88e22b7SJung-uk Kim return (AE_ERROR); 967a88e22b7SJung-uk Kim } 968a88e22b7SJung-uk Kim 969a88e22b7SJung-uk Kim /* Open the hex file, text mode */ 970a88e22b7SJung-uk Kim 971f38b0f21SJung-uk Kim FlOpenFile (ASL_FILE_HEX_OUTPUT, Filename, "w+t"); 972a88e22b7SJung-uk Kim 973a88e22b7SJung-uk Kim AslCompilerSignon (ASL_FILE_HEX_OUTPUT); 974a88e22b7SJung-uk Kim AslCompilerFileHeader (ASL_FILE_HEX_OUTPUT); 975a88e22b7SJung-uk Kim } 976a88e22b7SJung-uk Kim 977a88e22b7SJung-uk Kim /* Create/Open a debug output file if asked */ 978a88e22b7SJung-uk Kim 9796f1f1a63SJung-uk Kim if (AslGbl_DebugFlag) 980a88e22b7SJung-uk Kim { 981a88e22b7SJung-uk Kim Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_DEBUG); 982a88e22b7SJung-uk Kim if (!Filename) 983a88e22b7SJung-uk Kim { 984a88e22b7SJung-uk Kim AslCommonError (ASL_ERROR, ASL_MSG_DEBUG_FILENAME, 985a88e22b7SJung-uk Kim 0, 0, 0, 0, NULL, NULL); 986a88e22b7SJung-uk Kim return (AE_ERROR); 987a88e22b7SJung-uk Kim } 988a88e22b7SJung-uk Kim 989a88e22b7SJung-uk Kim /* Open the debug file as STDERR, text mode */ 990a88e22b7SJung-uk Kim 9916f1f1a63SJung-uk Kim AslGbl_Files[ASL_FILE_DEBUG_OUTPUT].Filename = Filename; 9926f1f1a63SJung-uk Kim AslGbl_Files[ASL_FILE_DEBUG_OUTPUT].Handle = 993a88e22b7SJung-uk Kim freopen (Filename, "w+t", stderr); 994a88e22b7SJung-uk Kim 9956f1f1a63SJung-uk Kim if (!AslGbl_Files[ASL_FILE_DEBUG_OUTPUT].Handle) 9964c52cad2SJung-uk Kim { 9971c0e1b6dSJung-uk Kim /* 9985ef50723SJung-uk Kim * A problem with freopen is that on error, we no longer 9995ef50723SJung-uk Kim * have stderr and cannot emit normal error messages. 10005ef50723SJung-uk Kim * Emit error to stdout, close files, and exit. 10011c0e1b6dSJung-uk Kim */ 10025ef50723SJung-uk Kim fprintf (stdout, 10035ef50723SJung-uk Kim "\nCould not open debug output file: %s\n\n", Filename); 10045ef50723SJung-uk Kim 10055ef50723SJung-uk Kim CmCleanupAndExit (); 10065ef50723SJung-uk Kim exit (1); 10074c52cad2SJung-uk Kim } 10084c52cad2SJung-uk Kim 1009a88e22b7SJung-uk Kim AslCompilerSignon (ASL_FILE_DEBUG_OUTPUT); 1010a88e22b7SJung-uk Kim AslCompilerFileHeader (ASL_FILE_DEBUG_OUTPUT); 1011a88e22b7SJung-uk Kim } 1012a88e22b7SJung-uk Kim 1013f8146b88SJung-uk Kim /* Create/Open a cross-reference output file if asked */ 1014f8146b88SJung-uk Kim 10156f1f1a63SJung-uk Kim if (AslGbl_CrossReferenceOutput) 1016f8146b88SJung-uk Kim { 1017f8146b88SJung-uk Kim Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_XREF); 1018f8146b88SJung-uk Kim if (!Filename) 1019f8146b88SJung-uk Kim { 1020f8146b88SJung-uk Kim AslCommonError (ASL_ERROR, ASL_MSG_DEBUG_FILENAME, 1021f8146b88SJung-uk Kim 0, 0, 0, 0, NULL, NULL); 1022f8146b88SJung-uk Kim return (AE_ERROR); 1023f8146b88SJung-uk Kim } 1024f8146b88SJung-uk Kim 1025f8146b88SJung-uk Kim FlOpenFile (ASL_FILE_XREF_OUTPUT, Filename, "w+t"); 1026f8146b88SJung-uk Kim 1027f8146b88SJung-uk Kim AslCompilerSignon (ASL_FILE_XREF_OUTPUT); 1028f8146b88SJung-uk Kim AslCompilerFileHeader (ASL_FILE_XREF_OUTPUT); 1029f8146b88SJung-uk Kim } 1030f8146b88SJung-uk Kim 1031d244b227SJung-uk Kim /* Create/Open a listing output file if asked */ 1032d244b227SJung-uk Kim 10336f1f1a63SJung-uk Kim if (AslGbl_ListingFlag) 1034d244b227SJung-uk Kim { 1035d244b227SJung-uk Kim Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_LISTING); 1036d244b227SJung-uk Kim if (!Filename) 1037d244b227SJung-uk Kim { 1038d244b227SJung-uk Kim AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME, 1039d244b227SJung-uk Kim 0, 0, 0, 0, NULL, NULL); 1040d244b227SJung-uk Kim return (AE_ERROR); 1041d244b227SJung-uk Kim } 1042d244b227SJung-uk Kim 1043d244b227SJung-uk Kim /* Open the listing file, text mode */ 1044d244b227SJung-uk Kim 1045f38b0f21SJung-uk Kim FlOpenFile (ASL_FILE_LISTING_OUTPUT, Filename, "w+t"); 1046d244b227SJung-uk Kim 1047d244b227SJung-uk Kim AslCompilerSignon (ASL_FILE_LISTING_OUTPUT); 1048d244b227SJung-uk Kim AslCompilerFileHeader (ASL_FILE_LISTING_OUTPUT); 1049d244b227SJung-uk Kim } 1050d244b227SJung-uk Kim 10515ef50723SJung-uk Kim /* Create the preprocessor output temp file if preprocessor enabled */ 10524c52cad2SJung-uk Kim 10536f1f1a63SJung-uk Kim if (AslGbl_PreprocessFlag) 1054eef1b955SJung-uk Kim { 10554c52cad2SJung-uk Kim Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_PREPROCESSOR); 10564c52cad2SJung-uk Kim if (!Filename) 10574c52cad2SJung-uk Kim { 10584c52cad2SJung-uk Kim AslCommonError (ASL_ERROR, ASL_MSG_PREPROCESSOR_FILENAME, 10594c52cad2SJung-uk Kim 0, 0, 0, 0, NULL, NULL); 10604c52cad2SJung-uk Kim return (AE_ERROR); 10614c52cad2SJung-uk Kim } 10624c52cad2SJung-uk Kim 1063f38b0f21SJung-uk Kim FlOpenFile (ASL_FILE_PREPROCESSOR, Filename, "w+t"); 1064eef1b955SJung-uk Kim } 10654c52cad2SJung-uk Kim 10665ef50723SJung-uk Kim /* 10675ef50723SJung-uk Kim * Create the "user" preprocessor output file if -li flag set. 10685ef50723SJung-uk Kim * Note, this file contains no embedded #line directives. 10695ef50723SJung-uk Kim */ 10706f1f1a63SJung-uk Kim if (AslGbl_PreprocessorOutputFlag) 10715ef50723SJung-uk Kim { 10725ef50723SJung-uk Kim Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_PREPROC_USER); 10735ef50723SJung-uk Kim if (!Filename) 10745ef50723SJung-uk Kim { 10755ef50723SJung-uk Kim AslCommonError (ASL_ERROR, ASL_MSG_PREPROCESSOR_FILENAME, 10765ef50723SJung-uk Kim 0, 0, 0, 0, NULL, NULL); 10775ef50723SJung-uk Kim return (AE_ERROR); 10785ef50723SJung-uk Kim } 10795ef50723SJung-uk Kim 10805ef50723SJung-uk Kim FlOpenFile (ASL_FILE_PREPROCESSOR_USER, Filename, "w+t"); 10815ef50723SJung-uk Kim } 10825ef50723SJung-uk Kim 10834c52cad2SJung-uk Kim /* All done for data table compiler */ 10844c52cad2SJung-uk Kim 10856f1f1a63SJung-uk Kim if (AslGbl_FileType == ASL_INPUT_TYPE_ASCII_DATA) 1086a88e22b7SJung-uk Kim { 1087a88e22b7SJung-uk Kim return (AE_OK); 1088a88e22b7SJung-uk Kim } 1089a88e22b7SJung-uk Kim 1090fba7fc7eSJung-uk Kim /* Create/Open a combined source output file */ 1091fba7fc7eSJung-uk Kim 1092fba7fc7eSJung-uk Kim Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_SOURCE); 1093fba7fc7eSJung-uk Kim if (!Filename) 1094fba7fc7eSJung-uk Kim { 1095fba7fc7eSJung-uk Kim AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME, 1096fba7fc7eSJung-uk Kim 0, 0, 0, 0, NULL, NULL); 1097fba7fc7eSJung-uk Kim return (AE_ERROR); 1098fba7fc7eSJung-uk Kim } 1099fba7fc7eSJung-uk Kim 1100fba7fc7eSJung-uk Kim /* 1101fba7fc7eSJung-uk Kim * Open the source output file, binary mode (so that LF does not get 1102fba7fc7eSJung-uk Kim * expanded to CR/LF on some systems, messing up our seek 1103fba7fc7eSJung-uk Kim * calculations.) 1104fba7fc7eSJung-uk Kim */ 1105fba7fc7eSJung-uk Kim FlOpenFile (ASL_FILE_SOURCE_OUTPUT, Filename, "w+b"); 1106fba7fc7eSJung-uk Kim 11074c52cad2SJung-uk Kim /* 11084c52cad2SJung-uk Kim // TBD: TEMP 11096f1f1a63SJung-uk Kim // AslCompilerin = AslGbl_Files[ASL_FILE_SOURCE_OUTPUT].Handle; 11104c52cad2SJung-uk Kim */ 1111fba7fc7eSJung-uk Kim /* Create/Open a assembly code source output file if asked */ 1112fba7fc7eSJung-uk Kim 11136f1f1a63SJung-uk Kim if (AslGbl_AsmOutputFlag) 1114fba7fc7eSJung-uk Kim { 1115fba7fc7eSJung-uk Kim Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_ASM_SOURCE); 1116fba7fc7eSJung-uk Kim if (!Filename) 1117fba7fc7eSJung-uk Kim { 1118fba7fc7eSJung-uk Kim AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME, 1119fba7fc7eSJung-uk Kim 0, 0, 0, 0, NULL, NULL); 1120fba7fc7eSJung-uk Kim return (AE_ERROR); 1121fba7fc7eSJung-uk Kim } 1122fba7fc7eSJung-uk Kim 1123fba7fc7eSJung-uk Kim /* Open the assembly code source file, text mode */ 1124fba7fc7eSJung-uk Kim 1125f38b0f21SJung-uk Kim FlOpenFile (ASL_FILE_ASM_SOURCE_OUTPUT, Filename, "w+t"); 1126fba7fc7eSJung-uk Kim 1127fba7fc7eSJung-uk Kim AslCompilerSignon (ASL_FILE_ASM_SOURCE_OUTPUT); 1128fba7fc7eSJung-uk Kim AslCompilerFileHeader (ASL_FILE_ASM_SOURCE_OUTPUT); 1129fba7fc7eSJung-uk Kim } 1130fba7fc7eSJung-uk Kim 1131fba7fc7eSJung-uk Kim /* Create/Open a C code source output file if asked */ 1132fba7fc7eSJung-uk Kim 11336f1f1a63SJung-uk Kim if (AslGbl_C_OutputFlag) 1134fba7fc7eSJung-uk Kim { 1135fba7fc7eSJung-uk Kim Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_C_SOURCE); 1136fba7fc7eSJung-uk Kim if (!Filename) 1137fba7fc7eSJung-uk Kim { 1138fba7fc7eSJung-uk Kim AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME, 1139fba7fc7eSJung-uk Kim 0, 0, 0, 0, NULL, NULL); 1140fba7fc7eSJung-uk Kim return (AE_ERROR); 1141fba7fc7eSJung-uk Kim } 1142fba7fc7eSJung-uk Kim 1143fba7fc7eSJung-uk Kim /* Open the C code source file, text mode */ 1144fba7fc7eSJung-uk Kim 1145f38b0f21SJung-uk Kim FlOpenFile (ASL_FILE_C_SOURCE_OUTPUT, Filename, "w+t"); 1146fba7fc7eSJung-uk Kim 1147fba7fc7eSJung-uk Kim FlPrintFile (ASL_FILE_C_SOURCE_OUTPUT, "/*\n"); 1148fba7fc7eSJung-uk Kim AslCompilerSignon (ASL_FILE_C_SOURCE_OUTPUT); 1149fba7fc7eSJung-uk Kim AslCompilerFileHeader (ASL_FILE_C_SOURCE_OUTPUT); 1150fba7fc7eSJung-uk Kim } 1151fba7fc7eSJung-uk Kim 11529c7c683cSJung-uk Kim /* Create/Open a C code source output file for the offset table if asked */ 11539c7c683cSJung-uk Kim 11546f1f1a63SJung-uk Kim if (AslGbl_C_OffsetTableFlag) 11559c7c683cSJung-uk Kim { 11569c7c683cSJung-uk Kim Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_C_OFFSET); 11579c7c683cSJung-uk Kim if (!Filename) 11589c7c683cSJung-uk Kim { 11599c7c683cSJung-uk Kim AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME, 11609c7c683cSJung-uk Kim 0, 0, 0, 0, NULL, NULL); 11619c7c683cSJung-uk Kim return (AE_ERROR); 11629c7c683cSJung-uk Kim } 11639c7c683cSJung-uk Kim 11649c7c683cSJung-uk Kim /* Open the C code source file, text mode */ 11659c7c683cSJung-uk Kim 11669c7c683cSJung-uk Kim FlOpenFile (ASL_FILE_C_OFFSET_OUTPUT, Filename, "w+t"); 11679c7c683cSJung-uk Kim 11689c7c683cSJung-uk Kim FlPrintFile (ASL_FILE_C_OFFSET_OUTPUT, "/*\n"); 11699c7c683cSJung-uk Kim AslCompilerSignon (ASL_FILE_C_OFFSET_OUTPUT); 11709c7c683cSJung-uk Kim AslCompilerFileHeader (ASL_FILE_C_OFFSET_OUTPUT); 11719c7c683cSJung-uk Kim } 11729c7c683cSJung-uk Kim 1173fba7fc7eSJung-uk Kim /* Create/Open a assembly include output file if asked */ 1174fba7fc7eSJung-uk Kim 11756f1f1a63SJung-uk Kim if (AslGbl_AsmIncludeOutputFlag) 1176fba7fc7eSJung-uk Kim { 1177fba7fc7eSJung-uk Kim Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_ASM_INCLUDE); 1178fba7fc7eSJung-uk Kim if (!Filename) 1179fba7fc7eSJung-uk Kim { 1180fba7fc7eSJung-uk Kim AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME, 1181fba7fc7eSJung-uk Kim 0, 0, 0, 0, NULL, NULL); 1182fba7fc7eSJung-uk Kim return (AE_ERROR); 1183fba7fc7eSJung-uk Kim } 1184fba7fc7eSJung-uk Kim 1185fba7fc7eSJung-uk Kim /* Open the assembly include file, text mode */ 1186fba7fc7eSJung-uk Kim 1187f38b0f21SJung-uk Kim FlOpenFile (ASL_FILE_ASM_INCLUDE_OUTPUT, Filename, "w+t"); 1188fba7fc7eSJung-uk Kim 1189fba7fc7eSJung-uk Kim AslCompilerSignon (ASL_FILE_ASM_INCLUDE_OUTPUT); 1190fba7fc7eSJung-uk Kim AslCompilerFileHeader (ASL_FILE_ASM_INCLUDE_OUTPUT); 1191fba7fc7eSJung-uk Kim } 1192fba7fc7eSJung-uk Kim 1193fba7fc7eSJung-uk Kim /* Create/Open a C include output file if asked */ 1194fba7fc7eSJung-uk Kim 11956f1f1a63SJung-uk Kim if (AslGbl_C_IncludeOutputFlag) 1196fba7fc7eSJung-uk Kim { 1197fba7fc7eSJung-uk Kim Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_C_INCLUDE); 1198fba7fc7eSJung-uk Kim if (!Filename) 1199fba7fc7eSJung-uk Kim { 1200fba7fc7eSJung-uk Kim AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME, 1201fba7fc7eSJung-uk Kim 0, 0, 0, 0, NULL, NULL); 1202fba7fc7eSJung-uk Kim return (AE_ERROR); 1203fba7fc7eSJung-uk Kim } 1204fba7fc7eSJung-uk Kim 1205fba7fc7eSJung-uk Kim /* Open the C include file, text mode */ 1206fba7fc7eSJung-uk Kim 1207f38b0f21SJung-uk Kim FlOpenFile (ASL_FILE_C_INCLUDE_OUTPUT, Filename, "w+t"); 1208fba7fc7eSJung-uk Kim 1209fba7fc7eSJung-uk Kim FlPrintFile (ASL_FILE_C_INCLUDE_OUTPUT, "/*\n"); 1210fba7fc7eSJung-uk Kim AslCompilerSignon (ASL_FILE_C_INCLUDE_OUTPUT); 1211fba7fc7eSJung-uk Kim AslCompilerFileHeader (ASL_FILE_C_INCLUDE_OUTPUT); 1212fba7fc7eSJung-uk Kim } 1213fba7fc7eSJung-uk Kim 1214fba7fc7eSJung-uk Kim /* Create a namespace output file if asked */ 1215fba7fc7eSJung-uk Kim 12166f1f1a63SJung-uk Kim if (AslGbl_NsOutputFlag) 1217fba7fc7eSJung-uk Kim { 1218fba7fc7eSJung-uk Kim Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_NAMESPACE); 1219fba7fc7eSJung-uk Kim if (!Filename) 1220fba7fc7eSJung-uk Kim { 1221fba7fc7eSJung-uk Kim AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME, 1222fba7fc7eSJung-uk Kim 0, 0, 0, 0, NULL, NULL); 1223fba7fc7eSJung-uk Kim return (AE_ERROR); 1224fba7fc7eSJung-uk Kim } 1225fba7fc7eSJung-uk Kim 1226fba7fc7eSJung-uk Kim /* Open the namespace file, text mode */ 1227fba7fc7eSJung-uk Kim 1228f38b0f21SJung-uk Kim FlOpenFile (ASL_FILE_NAMESPACE_OUTPUT, Filename, "w+t"); 1229fba7fc7eSJung-uk Kim 1230fba7fc7eSJung-uk Kim AslCompilerSignon (ASL_FILE_NAMESPACE_OUTPUT); 1231fba7fc7eSJung-uk Kim AslCompilerFileHeader (ASL_FILE_NAMESPACE_OUTPUT); 1232fba7fc7eSJung-uk Kim } 1233fba7fc7eSJung-uk Kim 12340d84335fSJung-uk Kim /* Create a debug file for the converter */ 12350d84335fSJung-uk Kim 12360d84335fSJung-uk Kim if (AcpiGbl_DebugAslConversion) 12370d84335fSJung-uk Kim { 12380d84335fSJung-uk Kim Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_CONVERT_DEBUG); 12390d84335fSJung-uk Kim if (!Filename) 12400d84335fSJung-uk Kim { 12410d84335fSJung-uk Kim AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME, 12420d84335fSJung-uk Kim 0, 0, 0, 0, NULL, NULL); 12430d84335fSJung-uk Kim return (AE_ERROR); 12440d84335fSJung-uk Kim } 12450d84335fSJung-uk Kim 12460d84335fSJung-uk Kim /* Open the converter debug file, text mode */ 12470d84335fSJung-uk Kim 12480d84335fSJung-uk Kim FlOpenFile (ASL_FILE_CONV_DEBUG_OUTPUT, Filename, "w+t"); 12490d84335fSJung-uk Kim 12500d84335fSJung-uk Kim AslCompilerSignon (ASL_FILE_CONV_DEBUG_OUTPUT); 12510d84335fSJung-uk Kim AslCompilerFileHeader (ASL_FILE_CONV_DEBUG_OUTPUT); 12520d84335fSJung-uk Kim 12536f1f1a63SJung-uk Kim AcpiGbl_ConvDebugFile = AslGbl_Files[ASL_FILE_CONV_DEBUG_OUTPUT].Handle; 12540d84335fSJung-uk Kim } 12550d84335fSJung-uk Kim 1256fba7fc7eSJung-uk Kim return (AE_OK); 1257fba7fc7eSJung-uk Kim } 1258fba7fc7eSJung-uk Kim 1259fba7fc7eSJung-uk Kim 1260fba7fc7eSJung-uk Kim #ifdef ACPI_OBSOLETE_FUNCTIONS 1261fba7fc7eSJung-uk Kim /******************************************************************************* 1262fba7fc7eSJung-uk Kim * 126353289f6aSNate Lawson * FUNCTION: FlParseInputPathname 126453289f6aSNate Lawson * 126553289f6aSNate Lawson * PARAMETERS: InputFilename - The user-specified ASL source file to be 126653289f6aSNate Lawson * compiled 126753289f6aSNate Lawson * 126853289f6aSNate Lawson * RETURN: Status 126953289f6aSNate Lawson * 127053289f6aSNate Lawson * DESCRIPTION: Split the input path into a directory and filename part 127153289f6aSNate Lawson * 1) Directory part used to open include files 127253289f6aSNate Lawson * 2) Filename part used to generate output filenames 127353289f6aSNate Lawson * 127453289f6aSNate Lawson ******************************************************************************/ 127553289f6aSNate Lawson 127653289f6aSNate Lawson ACPI_STATUS 127753289f6aSNate Lawson FlParseInputPathname ( 127853289f6aSNate Lawson char *InputFilename) 127953289f6aSNate Lawson { 128053289f6aSNate Lawson char *Substring; 128153289f6aSNate Lawson 128253289f6aSNate Lawson 128353289f6aSNate Lawson if (!InputFilename) 128453289f6aSNate Lawson { 128553289f6aSNate Lawson return (AE_OK); 128653289f6aSNate Lawson } 128753289f6aSNate Lawson 128853289f6aSNate Lawson /* Get the path to the input filename's directory */ 128953289f6aSNate Lawson 12906f1f1a63SJung-uk Kim AslGbl_DirectoryPath = strdup (InputFilename); 12916f1f1a63SJung-uk Kim if (!AslGbl_DirectoryPath) 129253289f6aSNate Lawson { 129353289f6aSNate Lawson return (AE_NO_MEMORY); 129453289f6aSNate Lawson } 129553289f6aSNate Lawson 12966f1f1a63SJung-uk Kim Substring = strrchr (AslGbl_DirectoryPath, '\\'); 129753289f6aSNate Lawson if (!Substring) 129853289f6aSNate Lawson { 12996f1f1a63SJung-uk Kim Substring = strrchr (AslGbl_DirectoryPath, '/'); 130053289f6aSNate Lawson if (!Substring) 130153289f6aSNate Lawson { 13026f1f1a63SJung-uk Kim Substring = strrchr (AslGbl_DirectoryPath, ':'); 130353289f6aSNate Lawson } 130453289f6aSNate Lawson } 130553289f6aSNate Lawson 130653289f6aSNate Lawson if (!Substring) 130753289f6aSNate Lawson { 13086f1f1a63SJung-uk Kim AslGbl_DirectoryPath[0] = 0; 13096f1f1a63SJung-uk Kim if (AslGbl_UseDefaultAmlFilename) 131053289f6aSNate Lawson { 13116f1f1a63SJung-uk Kim AslGbl_OutputFilenamePrefix = strdup (InputFilename); 131253289f6aSNate Lawson } 131353289f6aSNate Lawson } 131453289f6aSNate Lawson else 131553289f6aSNate Lawson { 13166f1f1a63SJung-uk Kim if (AslGbl_UseDefaultAmlFilename) 131753289f6aSNate Lawson { 13186f1f1a63SJung-uk Kim AslGbl_OutputFilenamePrefix = strdup (Substring + 1); 131953289f6aSNate Lawson } 132053289f6aSNate Lawson *(Substring+1) = 0; 132153289f6aSNate Lawson } 132253289f6aSNate Lawson 13236f1f1a63SJung-uk Kim UtConvertBackslashes (AslGbl_OutputFilenamePrefix); 132453289f6aSNate Lawson return (AE_OK); 132553289f6aSNate Lawson } 1326fba7fc7eSJung-uk Kim #endif 1327