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 * 110d84335fSJung-uk Kim * Some or all of this work - Copyright (c) 1999 - 2017, 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 166fba7fc7eSJung-uk Kim #ifdef ACPI_OBSOLETE_FUNCTIONS 167fba7fc7eSJung-uk Kim ACPI_STATUS 168fba7fc7eSJung-uk Kim FlParseInputPathname ( 169fba7fc7eSJung-uk Kim char *InputFilename); 170fba7fc7eSJung-uk Kim #endif 171fba7fc7eSJung-uk Kim 17253289f6aSNate Lawson 17353289f6aSNate Lawson /******************************************************************************* 17453289f6aSNate Lawson * 17553289f6aSNate Lawson * FUNCTION: FlSetLineNumber 17653289f6aSNate Lawson * 17753289f6aSNate Lawson * PARAMETERS: Op - Parse node for the LINE asl statement 17853289f6aSNate Lawson * 17953289f6aSNate Lawson * RETURN: None. 18053289f6aSNate Lawson * 18153289f6aSNate Lawson * DESCRIPTION: Set the current line number 18253289f6aSNate Lawson * 18353289f6aSNate Lawson ******************************************************************************/ 18453289f6aSNate Lawson 18553289f6aSNate Lawson void 18653289f6aSNate Lawson FlSetLineNumber ( 187eef1b955SJung-uk Kim UINT32 LineNumber) 18853289f6aSNate Lawson { 18953289f6aSNate Lawson 190eef1b955SJung-uk Kim DbgPrint (ASL_PARSE_OUTPUT, "\n#line: New line number %u (old %u)\n", 191eef1b955SJung-uk Kim LineNumber, Gbl_LogicalLineNumber); 192eef1b955SJung-uk Kim 193eef1b955SJung-uk Kim Gbl_CurrentLineNumber = LineNumber; 194eef1b955SJung-uk Kim } 195eef1b955SJung-uk Kim 196eef1b955SJung-uk Kim 197eef1b955SJung-uk Kim /******************************************************************************* 198eef1b955SJung-uk Kim * 199eef1b955SJung-uk Kim * FUNCTION: FlSetFilename 200eef1b955SJung-uk Kim * 201eef1b955SJung-uk Kim * PARAMETERS: Op - Parse node for the LINE asl statement 202eef1b955SJung-uk Kim * 203eef1b955SJung-uk Kim * RETURN: None. 204eef1b955SJung-uk Kim * 205eef1b955SJung-uk Kim * DESCRIPTION: Set the current filename 206eef1b955SJung-uk Kim * 207eef1b955SJung-uk Kim ******************************************************************************/ 208eef1b955SJung-uk Kim 209eef1b955SJung-uk Kim void 210eef1b955SJung-uk Kim FlSetFilename ( 211eef1b955SJung-uk Kim char *Filename) 212eef1b955SJung-uk Kim { 213eef1b955SJung-uk Kim 214eef1b955SJung-uk Kim DbgPrint (ASL_PARSE_OUTPUT, "\n#line: New filename %s (old %s)\n", 215eef1b955SJung-uk Kim Filename, Gbl_Files[ASL_FILE_INPUT].Filename); 216eef1b955SJung-uk Kim 217313a0c13SJung-uk Kim /* No need to free any existing filename */ 218313a0c13SJung-uk Kim 219eef1b955SJung-uk Kim Gbl_Files[ASL_FILE_INPUT].Filename = Filename; 22053289f6aSNate Lawson } 22153289f6aSNate Lawson 22253289f6aSNate Lawson 22353289f6aSNate Lawson /******************************************************************************* 22453289f6aSNate Lawson * 225d6dd1baeSJung-uk Kim * FUNCTION: FlAddIncludeDirectory 226d6dd1baeSJung-uk Kim * 227d6dd1baeSJung-uk Kim * PARAMETERS: Dir - Directory pathname string 228d6dd1baeSJung-uk Kim * 229d6dd1baeSJung-uk Kim * RETURN: None 230d6dd1baeSJung-uk Kim * 231d6dd1baeSJung-uk Kim * DESCRIPTION: Add a directory the list of include prefix directories. 232d6dd1baeSJung-uk Kim * 233d6dd1baeSJung-uk Kim ******************************************************************************/ 234d6dd1baeSJung-uk Kim 235d6dd1baeSJung-uk Kim void 236d6dd1baeSJung-uk Kim FlAddIncludeDirectory ( 237d6dd1baeSJung-uk Kim char *Dir) 238d6dd1baeSJung-uk Kim { 239d6dd1baeSJung-uk Kim ASL_INCLUDE_DIR *NewDir; 240d6dd1baeSJung-uk Kim ASL_INCLUDE_DIR *NextDir; 241d6dd1baeSJung-uk Kim ASL_INCLUDE_DIR *PrevDir = NULL; 242d6dd1baeSJung-uk Kim UINT32 NeedsSeparator = 0; 243d6dd1baeSJung-uk Kim size_t DirLength; 244d6dd1baeSJung-uk Kim 245d6dd1baeSJung-uk Kim 246d6dd1baeSJung-uk Kim DirLength = strlen (Dir); 247d6dd1baeSJung-uk Kim if (!DirLength) 248d6dd1baeSJung-uk Kim { 249d6dd1baeSJung-uk Kim return; 250d6dd1baeSJung-uk Kim } 251d6dd1baeSJung-uk Kim 252d6dd1baeSJung-uk Kim /* Make sure that the pathname ends with a path separator */ 253d6dd1baeSJung-uk Kim 254d6dd1baeSJung-uk Kim if ((Dir[DirLength-1] != '/') && 255d6dd1baeSJung-uk Kim (Dir[DirLength-1] != '\\')) 256d6dd1baeSJung-uk Kim { 257d6dd1baeSJung-uk Kim NeedsSeparator = 1; 258d6dd1baeSJung-uk Kim } 259d6dd1baeSJung-uk Kim 260d6dd1baeSJung-uk Kim NewDir = ACPI_ALLOCATE_ZEROED (sizeof (ASL_INCLUDE_DIR)); 261d6dd1baeSJung-uk Kim NewDir->Dir = ACPI_ALLOCATE (DirLength + 1 + NeedsSeparator); 262d6dd1baeSJung-uk Kim strcpy (NewDir->Dir, Dir); 263d6dd1baeSJung-uk Kim if (NeedsSeparator) 264d6dd1baeSJung-uk Kim { 265d6dd1baeSJung-uk Kim strcat (NewDir->Dir, "/"); 266d6dd1baeSJung-uk Kim } 267d6dd1baeSJung-uk Kim 268d6dd1baeSJung-uk Kim /* 269d6dd1baeSJung-uk Kim * Preserve command line ordering of -I options by adding new elements 270d6dd1baeSJung-uk Kim * at the end of the list 271d6dd1baeSJung-uk Kim */ 272d6dd1baeSJung-uk Kim NextDir = Gbl_IncludeDirList; 273d6dd1baeSJung-uk Kim while (NextDir) 274d6dd1baeSJung-uk Kim { 275d6dd1baeSJung-uk Kim PrevDir = NextDir; 276d6dd1baeSJung-uk Kim NextDir = NextDir->Next; 277d6dd1baeSJung-uk Kim } 278d6dd1baeSJung-uk Kim 279d6dd1baeSJung-uk Kim if (PrevDir) 280d6dd1baeSJung-uk Kim { 281d6dd1baeSJung-uk Kim PrevDir->Next = NewDir; 282d6dd1baeSJung-uk Kim } 283d6dd1baeSJung-uk Kim else 284d6dd1baeSJung-uk Kim { 285d6dd1baeSJung-uk Kim Gbl_IncludeDirList = NewDir; 286d6dd1baeSJung-uk Kim } 287d6dd1baeSJung-uk Kim } 288d6dd1baeSJung-uk Kim 289d6dd1baeSJung-uk Kim 290d6dd1baeSJung-uk Kim /******************************************************************************* 291d6dd1baeSJung-uk Kim * 292a7a3b383SJung-uk Kim * FUNCTION: FlMergePathnames 293a7a3b383SJung-uk Kim * 294a7a3b383SJung-uk Kim * PARAMETERS: PrefixDir - Prefix directory pathname. Can be NULL or 295a7a3b383SJung-uk Kim * a zero length string. 296a7a3b383SJung-uk Kim * FilePathname - The include filename from the source ASL. 297a7a3b383SJung-uk Kim * 298a7a3b383SJung-uk Kim * RETURN: Merged pathname string 299a7a3b383SJung-uk Kim * 300a7a3b383SJung-uk Kim * DESCRIPTION: Merge two pathnames that (probably) have common elements, to 301a7a3b383SJung-uk Kim * arrive at a minimal length string. Merge can occur if the 302a7a3b383SJung-uk Kim * FilePathname is relative to the PrefixDir. 303a7a3b383SJung-uk Kim * 304a7a3b383SJung-uk Kim ******************************************************************************/ 305a7a3b383SJung-uk Kim 306a7a3b383SJung-uk Kim char * 307a7a3b383SJung-uk Kim FlMergePathnames ( 308a7a3b383SJung-uk Kim char *PrefixDir, 309a7a3b383SJung-uk Kim char *FilePathname) 310a7a3b383SJung-uk Kim { 311a7a3b383SJung-uk Kim char *CommonPath; 312a7a3b383SJung-uk Kim char *Pathname; 313a7a3b383SJung-uk Kim char *LastElement; 314a7a3b383SJung-uk Kim 315a7a3b383SJung-uk Kim 316a7a3b383SJung-uk Kim DbgPrint (ASL_PARSE_OUTPUT, "Include: Prefix path - \"%s\"\n" 317a7a3b383SJung-uk Kim "Include: FilePathname - \"%s\"\n", 318a7a3b383SJung-uk Kim PrefixDir, FilePathname); 319a7a3b383SJung-uk Kim 320a7a3b383SJung-uk Kim /* 321a7a3b383SJung-uk Kim * If there is no prefix directory or if the file pathname is absolute, 322a7a3b383SJung-uk Kim * just return the original file pathname 323a7a3b383SJung-uk Kim */ 324a7a3b383SJung-uk Kim if (!PrefixDir || (!*PrefixDir) || 325a7a3b383SJung-uk Kim (*FilePathname == '/') || 326a7a3b383SJung-uk Kim (FilePathname[1] == ':')) 327a7a3b383SJung-uk Kim { 32867d9aa44SJung-uk Kim Pathname = UtLocalCacheCalloc (strlen (FilePathname) + 1); 329a7a3b383SJung-uk Kim strcpy (Pathname, FilePathname); 330a7a3b383SJung-uk Kim goto ConvertBackslashes; 331a7a3b383SJung-uk Kim } 332a7a3b383SJung-uk Kim 333a7a3b383SJung-uk Kim /* Need a local copy of the prefix directory path */ 334a7a3b383SJung-uk Kim 33567d9aa44SJung-uk Kim CommonPath = UtLocalCacheCalloc (strlen (PrefixDir) + 1); 336a7a3b383SJung-uk Kim strcpy (CommonPath, PrefixDir); 337a7a3b383SJung-uk Kim 338a7a3b383SJung-uk Kim /* 339a7a3b383SJung-uk Kim * Walk forward through the file path, and simultaneously backward 340a7a3b383SJung-uk Kim * through the prefix directory path until there are no more 341a7a3b383SJung-uk Kim * relative references at the start of the file path. 342a7a3b383SJung-uk Kim */ 343a7a3b383SJung-uk Kim while (*FilePathname && (!strncmp (FilePathname, "../", 3))) 344a7a3b383SJung-uk Kim { 345a7a3b383SJung-uk Kim /* Remove last element of the prefix directory path */ 346a7a3b383SJung-uk Kim 347a7a3b383SJung-uk Kim LastElement = strrchr (CommonPath, '/'); 348a7a3b383SJung-uk Kim if (!LastElement) 349a7a3b383SJung-uk Kim { 350a7a3b383SJung-uk Kim goto ConcatenatePaths; 351a7a3b383SJung-uk Kim } 352a7a3b383SJung-uk Kim 353a7a3b383SJung-uk Kim *LastElement = 0; /* Terminate CommonPath string */ 354a7a3b383SJung-uk Kim FilePathname += 3; /* Point to next path element */ 355a7a3b383SJung-uk Kim } 356a7a3b383SJung-uk Kim 357a7a3b383SJung-uk Kim /* 358a7a3b383SJung-uk Kim * Remove the last element of the prefix directory path (it is the same as 359a7a3b383SJung-uk Kim * the first element of the file pathname), and build the final merged 360a7a3b383SJung-uk Kim * pathname. 361a7a3b383SJung-uk Kim */ 362a7a3b383SJung-uk Kim LastElement = strrchr (CommonPath, '/'); 363a7a3b383SJung-uk Kim if (LastElement) 364a7a3b383SJung-uk Kim { 365a7a3b383SJung-uk Kim *LastElement = 0; 366a7a3b383SJung-uk Kim } 367a7a3b383SJung-uk Kim 368a7a3b383SJung-uk Kim /* Build the final merged pathname */ 369a7a3b383SJung-uk Kim 370a7a3b383SJung-uk Kim ConcatenatePaths: 37167d9aa44SJung-uk Kim Pathname = UtLocalCacheCalloc ( 372f8146b88SJung-uk Kim strlen (CommonPath) + strlen (FilePathname) + 2); 373a7a3b383SJung-uk Kim if (LastElement && *CommonPath) 374a7a3b383SJung-uk Kim { 375a7a3b383SJung-uk Kim strcpy (Pathname, CommonPath); 376a7a3b383SJung-uk Kim strcat (Pathname, "/"); 377a7a3b383SJung-uk Kim } 378a7a3b383SJung-uk Kim strcat (Pathname, FilePathname); 379a7a3b383SJung-uk Kim 380a7a3b383SJung-uk Kim /* Convert all backslashes to normal slashes */ 381a7a3b383SJung-uk Kim 382a7a3b383SJung-uk Kim ConvertBackslashes: 383a7a3b383SJung-uk Kim UtConvertBackslashes (Pathname); 384a7a3b383SJung-uk Kim 385a7a3b383SJung-uk Kim DbgPrint (ASL_PARSE_OUTPUT, "Include: Merged Pathname - \"%s\"\n", 386a7a3b383SJung-uk Kim Pathname); 387a7a3b383SJung-uk Kim return (Pathname); 388a7a3b383SJung-uk Kim } 389a7a3b383SJung-uk Kim 390a7a3b383SJung-uk Kim 391a7a3b383SJung-uk Kim /******************************************************************************* 392a7a3b383SJung-uk Kim * 393d6dd1baeSJung-uk Kim * FUNCTION: FlOpenIncludeWithPrefix 394d6dd1baeSJung-uk Kim * 395d6dd1baeSJung-uk Kim * PARAMETERS: PrefixDir - Prefix directory pathname. Can be a zero 396d6dd1baeSJung-uk Kim * length string. 397d6dd1baeSJung-uk Kim * Filename - The include filename from the source ASL. 398d6dd1baeSJung-uk Kim * 399d6dd1baeSJung-uk Kim * RETURN: Valid file descriptor if successful. Null otherwise. 400d6dd1baeSJung-uk Kim * 401d6dd1baeSJung-uk Kim * DESCRIPTION: Open an include file and push it on the input file stack. 402d6dd1baeSJung-uk Kim * 403d6dd1baeSJung-uk Kim ******************************************************************************/ 404d6dd1baeSJung-uk Kim 405a371a5fdSJung-uk Kim static FILE * 406d6dd1baeSJung-uk Kim FlOpenIncludeWithPrefix ( 407d6dd1baeSJung-uk Kim char *PrefixDir, 408a371a5fdSJung-uk Kim ACPI_PARSE_OBJECT *Op, 409d6dd1baeSJung-uk Kim char *Filename) 410d6dd1baeSJung-uk Kim { 411d6dd1baeSJung-uk Kim FILE *IncludeFile; 412d6dd1baeSJung-uk Kim char *Pathname; 4135ef50723SJung-uk Kim UINT32 OriginalLineNumber; 414d6dd1baeSJung-uk Kim 415d6dd1baeSJung-uk Kim 416d6dd1baeSJung-uk Kim /* Build the full pathname to the file */ 417d6dd1baeSJung-uk Kim 418a7a3b383SJung-uk Kim Pathname = FlMergePathnames (PrefixDir, Filename); 419d6dd1baeSJung-uk Kim 420a7a3b383SJung-uk Kim DbgPrint (ASL_PARSE_OUTPUT, "Include: Opening file - \"%s\"\n\n", 421d6dd1baeSJung-uk Kim Pathname); 422d6dd1baeSJung-uk Kim 423d6dd1baeSJung-uk Kim /* Attempt to open the file, push if successful */ 424d6dd1baeSJung-uk Kim 425d6dd1baeSJung-uk Kim IncludeFile = fopen (Pathname, "r"); 426ed17e06eSJung-uk Kim if (!IncludeFile) 427d6dd1baeSJung-uk Kim { 428ed17e06eSJung-uk Kim fprintf (stderr, "Could not open include file %s\n", Pathname); 429ed17e06eSJung-uk Kim ACPI_FREE (Pathname); 430ed17e06eSJung-uk Kim return (NULL); 431ed17e06eSJung-uk Kim } 432ed17e06eSJung-uk Kim 433a371a5fdSJung-uk Kim /* 4345ef50723SJung-uk Kim * Check the entire include file for any # preprocessor directives. 435a371a5fdSJung-uk Kim * This is because there may be some confusion between the #include 4365ef50723SJung-uk Kim * preprocessor directive and the ASL Include statement. A file included 4375ef50723SJung-uk Kim * by the ASL include cannot contain preprocessor directives because 4385ef50723SJung-uk Kim * the preprocessor has already run by the time the ASL include is 4395ef50723SJung-uk Kim * recognized (by the compiler, not the preprocessor.) 4405ef50723SJung-uk Kim * 4415ef50723SJung-uk Kim * Note: DtGetNextLine strips/ignores comments. 4425ef50723SJung-uk Kim * Save current line number since DtGetNextLine modifies it. 443a371a5fdSJung-uk Kim */ 4445ef50723SJung-uk Kim Gbl_CurrentLineNumber--; 4455ef50723SJung-uk Kim OriginalLineNumber = Gbl_CurrentLineNumber; 446f8146b88SJung-uk Kim 4475ef50723SJung-uk Kim while (DtGetNextLine (IncludeFile, DT_ALLOW_MULTILINE_QUOTES) != ASL_EOF) 448a371a5fdSJung-uk Kim { 449a371a5fdSJung-uk Kim if (Gbl_CurrentLineBuffer[0] == '#') 450a371a5fdSJung-uk Kim { 451a371a5fdSJung-uk Kim AslError (ASL_ERROR, ASL_MSG_INCLUDE_FILE, 452a371a5fdSJung-uk Kim Op, "use #include instead"); 453a371a5fdSJung-uk Kim } 454a371a5fdSJung-uk Kim } 455f8146b88SJung-uk Kim 4565ef50723SJung-uk Kim Gbl_CurrentLineNumber = OriginalLineNumber; 457a371a5fdSJung-uk Kim 458a371a5fdSJung-uk Kim /* Must seek back to the start of the file */ 459a371a5fdSJung-uk Kim 460a371a5fdSJung-uk Kim fseek (IncludeFile, 0, SEEK_SET); 461a371a5fdSJung-uk Kim 462d6dd1baeSJung-uk Kim /* Push the include file on the open input file stack */ 463d6dd1baeSJung-uk Kim 464d6dd1baeSJung-uk Kim AslPushInputFileStack (IncludeFile, Pathname); 465d6dd1baeSJung-uk Kim return (IncludeFile); 466d6dd1baeSJung-uk Kim } 467d6dd1baeSJung-uk Kim 468d6dd1baeSJung-uk Kim 469d6dd1baeSJung-uk Kim /******************************************************************************* 470d6dd1baeSJung-uk Kim * 47153289f6aSNate Lawson * FUNCTION: FlOpenIncludeFile 47253289f6aSNate Lawson * 47353289f6aSNate Lawson * PARAMETERS: Op - Parse node for the INCLUDE ASL statement 47453289f6aSNate Lawson * 47553289f6aSNate Lawson * RETURN: None. 47653289f6aSNate Lawson * 47753289f6aSNate Lawson * DESCRIPTION: Open an include file and push it on the input file stack. 47853289f6aSNate Lawson * 47953289f6aSNate Lawson ******************************************************************************/ 48053289f6aSNate Lawson 48153289f6aSNate Lawson void 48253289f6aSNate Lawson FlOpenIncludeFile ( 48353289f6aSNate Lawson ACPI_PARSE_OBJECT *Op) 48453289f6aSNate Lawson { 485d6dd1baeSJung-uk Kim FILE *IncludeFile; 486d6dd1baeSJung-uk Kim ASL_INCLUDE_DIR *NextDir; 48753289f6aSNate Lawson 48853289f6aSNate Lawson 48953289f6aSNate Lawson /* Op must be valid */ 49053289f6aSNate Lawson 49153289f6aSNate Lawson if (!Op) 49253289f6aSNate Lawson { 49353289f6aSNate Lawson AslCommonError (ASL_ERROR, ASL_MSG_INCLUDE_FILE_OPEN, 49453289f6aSNate Lawson Gbl_CurrentLineNumber, Gbl_LogicalLineNumber, 49553289f6aSNate Lawson Gbl_InputByteCount, Gbl_CurrentColumn, 49653289f6aSNate Lawson Gbl_Files[ASL_FILE_INPUT].Filename, " - Null parse node"); 49753289f6aSNate Lawson 49853289f6aSNate Lawson return; 49953289f6aSNate Lawson } 50053289f6aSNate Lawson 50153289f6aSNate Lawson /* 50253289f6aSNate Lawson * Flush out the "include ()" statement on this line, start 50353289f6aSNate Lawson * the actual include file on the next line 50453289f6aSNate Lawson */ 505eef1b955SJung-uk Kim AslResetCurrentLineBuffer (); 50653289f6aSNate Lawson FlPrintFile (ASL_FILE_SOURCE_OUTPUT, "\n"); 50753289f6aSNate Lawson Gbl_CurrentLineOffset++; 50853289f6aSNate Lawson 50953289f6aSNate Lawson 510d6dd1baeSJung-uk Kim /* Attempt to open the include file */ 511d6dd1baeSJung-uk Kim 512d6dd1baeSJung-uk Kim /* If the file specifies an absolute path, just open it */ 513d6dd1baeSJung-uk Kim 514d6dd1baeSJung-uk Kim if ((Op->Asl.Value.String[0] == '/') || 515d6dd1baeSJung-uk Kim (Op->Asl.Value.String[0] == '\\') || 516d6dd1baeSJung-uk Kim (Op->Asl.Value.String[1] == ':')) 51753289f6aSNate Lawson { 518a371a5fdSJung-uk Kim IncludeFile = FlOpenIncludeWithPrefix ("", Op, Op->Asl.Value.String); 519d6dd1baeSJung-uk Kim if (!IncludeFile) 520d6dd1baeSJung-uk Kim { 521d6dd1baeSJung-uk Kim goto ErrorExit; 522d6dd1baeSJung-uk Kim } 52353289f6aSNate Lawson return; 52453289f6aSNate Lawson } 52553289f6aSNate Lawson 526d6dd1baeSJung-uk Kim /* 527d6dd1baeSJung-uk Kim * The include filename is not an absolute path. 528d6dd1baeSJung-uk Kim * 529d6dd1baeSJung-uk Kim * First, search for the file within the "local" directory -- meaning 530d6dd1baeSJung-uk Kim * the same directory that contains the source file. 531d6dd1baeSJung-uk Kim * 532d6dd1baeSJung-uk Kim * Construct the file pathname from the global directory name. 533d6dd1baeSJung-uk Kim */ 534f8146b88SJung-uk Kim IncludeFile = FlOpenIncludeWithPrefix ( 535f8146b88SJung-uk Kim Gbl_DirectoryPath, Op, Op->Asl.Value.String); 536d6dd1baeSJung-uk Kim if (IncludeFile) 537d6dd1baeSJung-uk Kim { 538d6dd1baeSJung-uk Kim return; 539d6dd1baeSJung-uk Kim } 54053289f6aSNate Lawson 541d6dd1baeSJung-uk Kim /* 542d6dd1baeSJung-uk Kim * Second, search for the file within the (possibly multiple) directories 543d6dd1baeSJung-uk Kim * specified by the -I option on the command line. 544d6dd1baeSJung-uk Kim */ 545d6dd1baeSJung-uk Kim NextDir = Gbl_IncludeDirList; 546d6dd1baeSJung-uk Kim while (NextDir) 547d6dd1baeSJung-uk Kim { 548f8146b88SJung-uk Kim IncludeFile = FlOpenIncludeWithPrefix ( 549f8146b88SJung-uk Kim NextDir->Dir, Op, Op->Asl.Value.String); 550d6dd1baeSJung-uk Kim if (IncludeFile) 551d6dd1baeSJung-uk Kim { 552d6dd1baeSJung-uk Kim return; 553d6dd1baeSJung-uk Kim } 554d6dd1baeSJung-uk Kim 555d6dd1baeSJung-uk Kim NextDir = NextDir->Next; 556d6dd1baeSJung-uk Kim } 557d6dd1baeSJung-uk Kim 558d6dd1baeSJung-uk Kim /* We could not open the include file after trying very hard */ 559d6dd1baeSJung-uk Kim 560d6dd1baeSJung-uk Kim ErrorExit: 561d6dd1baeSJung-uk Kim sprintf (MsgBuffer, "%s, %s", Op->Asl.Value.String, strerror (errno)); 562d6dd1baeSJung-uk Kim AslError (ASL_ERROR, ASL_MSG_INCLUDE_FILE_OPEN, Op, MsgBuffer); 56353289f6aSNate Lawson } 56453289f6aSNate Lawson 56553289f6aSNate Lawson 56653289f6aSNate Lawson /******************************************************************************* 56753289f6aSNate Lawson * 568fba7fc7eSJung-uk Kim * FUNCTION: FlOpenInputFile 569fba7fc7eSJung-uk Kim * 570fba7fc7eSJung-uk Kim * PARAMETERS: InputFilename - The user-specified ASL source file to be 571fba7fc7eSJung-uk Kim * compiled 572fba7fc7eSJung-uk Kim * 573fba7fc7eSJung-uk Kim * RETURN: Status 574fba7fc7eSJung-uk Kim * 575fba7fc7eSJung-uk Kim * DESCRIPTION: Open the specified input file, and save the directory path to 576fba7fc7eSJung-uk Kim * the file so that include files can be opened in 577fba7fc7eSJung-uk Kim * the same directory. 578fba7fc7eSJung-uk Kim * 579fba7fc7eSJung-uk Kim ******************************************************************************/ 580fba7fc7eSJung-uk Kim 581fba7fc7eSJung-uk Kim ACPI_STATUS 582fba7fc7eSJung-uk Kim FlOpenInputFile ( 583fba7fc7eSJung-uk Kim char *InputFilename) 584fba7fc7eSJung-uk Kim { 585fba7fc7eSJung-uk Kim 586fba7fc7eSJung-uk Kim /* Open the input ASL file, text mode */ 587fba7fc7eSJung-uk Kim 588f38b0f21SJung-uk Kim FlOpenFile (ASL_FILE_INPUT, InputFilename, "rt"); 589fba7fc7eSJung-uk Kim AslCompilerin = Gbl_Files[ASL_FILE_INPUT].Handle; 590fba7fc7eSJung-uk Kim 591fba7fc7eSJung-uk Kim return (AE_OK); 592fba7fc7eSJung-uk Kim } 593fba7fc7eSJung-uk Kim 594fba7fc7eSJung-uk Kim 595fba7fc7eSJung-uk Kim /******************************************************************************* 596fba7fc7eSJung-uk Kim * 597fba7fc7eSJung-uk Kim * FUNCTION: FlOpenAmlOutputFile 598fba7fc7eSJung-uk Kim * 599fba7fc7eSJung-uk Kim * PARAMETERS: FilenamePrefix - The user-specified ASL source file 600fba7fc7eSJung-uk Kim * 601fba7fc7eSJung-uk Kim * RETURN: Status 602fba7fc7eSJung-uk Kim * 603fba7fc7eSJung-uk Kim * DESCRIPTION: Create the output filename (*.AML) and open the file. The file 604fba7fc7eSJung-uk Kim * is created in the same directory as the parent input file. 605fba7fc7eSJung-uk Kim * 606fba7fc7eSJung-uk Kim ******************************************************************************/ 607fba7fc7eSJung-uk Kim 608fba7fc7eSJung-uk Kim ACPI_STATUS 609fba7fc7eSJung-uk Kim FlOpenAmlOutputFile ( 610fba7fc7eSJung-uk Kim char *FilenamePrefix) 611fba7fc7eSJung-uk Kim { 612fba7fc7eSJung-uk Kim char *Filename; 613fba7fc7eSJung-uk Kim 614fba7fc7eSJung-uk Kim 615fba7fc7eSJung-uk Kim /* Output filename usually comes from the ASL itself */ 616fba7fc7eSJung-uk Kim 617fba7fc7eSJung-uk Kim Filename = Gbl_Files[ASL_FILE_AML_OUTPUT].Filename; 618fba7fc7eSJung-uk Kim if (!Filename) 619fba7fc7eSJung-uk Kim { 620fba7fc7eSJung-uk Kim /* Create the output AML filename */ 621f1db5ef7SJung-uk Kim if (!AcpiGbl_CaptureComments) 6220d84335fSJung-uk Kim { 623fba7fc7eSJung-uk Kim Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_AML_CODE); 6240d84335fSJung-uk Kim } 6250d84335fSJung-uk Kim else 6260d84335fSJung-uk Kim { 6270d84335fSJung-uk Kim Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_CONVERT_AML); 6280d84335fSJung-uk Kim } 629fba7fc7eSJung-uk Kim if (!Filename) 630fba7fc7eSJung-uk Kim { 631fba7fc7eSJung-uk Kim AslCommonError (ASL_ERROR, ASL_MSG_OUTPUT_FILENAME, 632fba7fc7eSJung-uk Kim 0, 0, 0, 0, NULL, NULL); 633fba7fc7eSJung-uk Kim return (AE_ERROR); 634fba7fc7eSJung-uk Kim } 6351c0e1b6dSJung-uk Kim 6361c0e1b6dSJung-uk Kim Gbl_Files[ASL_FILE_AML_OUTPUT].Filename = Filename; 637fba7fc7eSJung-uk Kim } 638fba7fc7eSJung-uk Kim 639fba7fc7eSJung-uk Kim /* Open the output AML file in binary mode */ 640fba7fc7eSJung-uk Kim 641fba7fc7eSJung-uk Kim FlOpenFile (ASL_FILE_AML_OUTPUT, Filename, "w+b"); 642fba7fc7eSJung-uk Kim return (AE_OK); 643fba7fc7eSJung-uk Kim } 644fba7fc7eSJung-uk Kim 645fba7fc7eSJung-uk Kim 646fba7fc7eSJung-uk Kim /******************************************************************************* 647fba7fc7eSJung-uk Kim * 648fba7fc7eSJung-uk Kim * FUNCTION: FlOpenMiscOutputFiles 649fba7fc7eSJung-uk Kim * 650fba7fc7eSJung-uk Kim * PARAMETERS: FilenamePrefix - The user-specified ASL source file 651fba7fc7eSJung-uk Kim * 652fba7fc7eSJung-uk Kim * RETURN: Status 653fba7fc7eSJung-uk Kim * 654fba7fc7eSJung-uk Kim * DESCRIPTION: Create and open the various output files needed, depending on 655fba7fc7eSJung-uk Kim * the command line options 656fba7fc7eSJung-uk Kim * 657fba7fc7eSJung-uk Kim ******************************************************************************/ 658fba7fc7eSJung-uk Kim 659fba7fc7eSJung-uk Kim ACPI_STATUS 660fba7fc7eSJung-uk Kim FlOpenMiscOutputFiles ( 661fba7fc7eSJung-uk Kim char *FilenamePrefix) 662fba7fc7eSJung-uk Kim { 663fba7fc7eSJung-uk Kim char *Filename; 664fba7fc7eSJung-uk Kim 665fba7fc7eSJung-uk Kim 666fe0f0bbbSJung-uk Kim /* Create/Open a map file if requested */ 667fe0f0bbbSJung-uk Kim 668fe0f0bbbSJung-uk Kim if (Gbl_MapfileFlag) 669fe0f0bbbSJung-uk Kim { 670fe0f0bbbSJung-uk Kim Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_MAP); 671fe0f0bbbSJung-uk Kim if (!Filename) 672fe0f0bbbSJung-uk Kim { 673fe0f0bbbSJung-uk Kim AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME, 674fe0f0bbbSJung-uk Kim 0, 0, 0, 0, NULL, NULL); 675fe0f0bbbSJung-uk Kim return (AE_ERROR); 676fe0f0bbbSJung-uk Kim } 677fe0f0bbbSJung-uk Kim 678fe0f0bbbSJung-uk Kim /* Open the hex file, text mode (closed at compiler exit) */ 679fe0f0bbbSJung-uk Kim 680fe0f0bbbSJung-uk Kim FlOpenFile (ASL_FILE_MAP_OUTPUT, Filename, "w+t"); 681fe0f0bbbSJung-uk Kim 682fe0f0bbbSJung-uk Kim AslCompilerSignon (ASL_FILE_MAP_OUTPUT); 683fe0f0bbbSJung-uk Kim AslCompilerFileHeader (ASL_FILE_MAP_OUTPUT); 684fe0f0bbbSJung-uk Kim } 685fe0f0bbbSJung-uk Kim 6869c48c75eSJung-uk Kim /* All done for disassembler */ 6879c48c75eSJung-uk Kim 688f8146b88SJung-uk Kim if (Gbl_FileType == ASL_INPUT_TYPE_BINARY_ACPI_TABLE) 6899c48c75eSJung-uk Kim { 6909c48c75eSJung-uk Kim return (AE_OK); 6919c48c75eSJung-uk Kim } 6929c48c75eSJung-uk Kim 693a88e22b7SJung-uk Kim /* Create/Open a hex output file if asked */ 694a88e22b7SJung-uk Kim 695a88e22b7SJung-uk Kim if (Gbl_HexOutputFlag) 696a88e22b7SJung-uk Kim { 697a88e22b7SJung-uk Kim Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_HEX_DUMP); 698a88e22b7SJung-uk Kim if (!Filename) 699a88e22b7SJung-uk Kim { 700a88e22b7SJung-uk Kim AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME, 701a88e22b7SJung-uk Kim 0, 0, 0, 0, NULL, NULL); 702a88e22b7SJung-uk Kim return (AE_ERROR); 703a88e22b7SJung-uk Kim } 704a88e22b7SJung-uk Kim 705a88e22b7SJung-uk Kim /* Open the hex file, text mode */ 706a88e22b7SJung-uk Kim 707f38b0f21SJung-uk Kim FlOpenFile (ASL_FILE_HEX_OUTPUT, Filename, "w+t"); 708a88e22b7SJung-uk Kim 709a88e22b7SJung-uk Kim AslCompilerSignon (ASL_FILE_HEX_OUTPUT); 710a88e22b7SJung-uk Kim AslCompilerFileHeader (ASL_FILE_HEX_OUTPUT); 711a88e22b7SJung-uk Kim } 712a88e22b7SJung-uk Kim 713a88e22b7SJung-uk Kim /* Create/Open a debug output file if asked */ 714a88e22b7SJung-uk Kim 715a88e22b7SJung-uk Kim if (Gbl_DebugFlag) 716a88e22b7SJung-uk Kim { 717a88e22b7SJung-uk Kim Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_DEBUG); 718a88e22b7SJung-uk Kim if (!Filename) 719a88e22b7SJung-uk Kim { 720a88e22b7SJung-uk Kim AslCommonError (ASL_ERROR, ASL_MSG_DEBUG_FILENAME, 721a88e22b7SJung-uk Kim 0, 0, 0, 0, NULL, NULL); 722a88e22b7SJung-uk Kim return (AE_ERROR); 723a88e22b7SJung-uk Kim } 724a88e22b7SJung-uk Kim 725a88e22b7SJung-uk Kim /* Open the debug file as STDERR, text mode */ 726a88e22b7SJung-uk Kim 727a88e22b7SJung-uk Kim Gbl_Files[ASL_FILE_DEBUG_OUTPUT].Filename = Filename; 728a88e22b7SJung-uk Kim Gbl_Files[ASL_FILE_DEBUG_OUTPUT].Handle = 729a88e22b7SJung-uk Kim freopen (Filename, "w+t", stderr); 730a88e22b7SJung-uk Kim 7314c52cad2SJung-uk Kim if (!Gbl_Files[ASL_FILE_DEBUG_OUTPUT].Handle) 7324c52cad2SJung-uk Kim { 7331c0e1b6dSJung-uk Kim /* 7345ef50723SJung-uk Kim * A problem with freopen is that on error, we no longer 7355ef50723SJung-uk Kim * have stderr and cannot emit normal error messages. 7365ef50723SJung-uk Kim * Emit error to stdout, close files, and exit. 7371c0e1b6dSJung-uk Kim */ 7385ef50723SJung-uk Kim fprintf (stdout, 7395ef50723SJung-uk Kim "\nCould not open debug output file: %s\n\n", Filename); 7405ef50723SJung-uk Kim 7415ef50723SJung-uk Kim CmCleanupAndExit (); 7425ef50723SJung-uk Kim exit (1); 7434c52cad2SJung-uk Kim } 7444c52cad2SJung-uk Kim 745a88e22b7SJung-uk Kim AslCompilerSignon (ASL_FILE_DEBUG_OUTPUT); 746a88e22b7SJung-uk Kim AslCompilerFileHeader (ASL_FILE_DEBUG_OUTPUT); 747a88e22b7SJung-uk Kim } 748a88e22b7SJung-uk Kim 749f8146b88SJung-uk Kim /* Create/Open a cross-reference output file if asked */ 750f8146b88SJung-uk Kim 751f8146b88SJung-uk Kim if (Gbl_CrossReferenceOutput) 752f8146b88SJung-uk Kim { 753f8146b88SJung-uk Kim Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_XREF); 754f8146b88SJung-uk Kim if (!Filename) 755f8146b88SJung-uk Kim { 756f8146b88SJung-uk Kim AslCommonError (ASL_ERROR, ASL_MSG_DEBUG_FILENAME, 757f8146b88SJung-uk Kim 0, 0, 0, 0, NULL, NULL); 758f8146b88SJung-uk Kim return (AE_ERROR); 759f8146b88SJung-uk Kim } 760f8146b88SJung-uk Kim 761f8146b88SJung-uk Kim FlOpenFile (ASL_FILE_XREF_OUTPUT, Filename, "w+t"); 762f8146b88SJung-uk Kim 763f8146b88SJung-uk Kim AslCompilerSignon (ASL_FILE_XREF_OUTPUT); 764f8146b88SJung-uk Kim AslCompilerFileHeader (ASL_FILE_XREF_OUTPUT); 765f8146b88SJung-uk Kim } 766f8146b88SJung-uk Kim 767d244b227SJung-uk Kim /* Create/Open a listing output file if asked */ 768d244b227SJung-uk Kim 769d244b227SJung-uk Kim if (Gbl_ListingFlag) 770d244b227SJung-uk Kim { 771d244b227SJung-uk Kim Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_LISTING); 772d244b227SJung-uk Kim if (!Filename) 773d244b227SJung-uk Kim { 774d244b227SJung-uk Kim AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME, 775d244b227SJung-uk Kim 0, 0, 0, 0, NULL, NULL); 776d244b227SJung-uk Kim return (AE_ERROR); 777d244b227SJung-uk Kim } 778d244b227SJung-uk Kim 779d244b227SJung-uk Kim /* Open the listing file, text mode */ 780d244b227SJung-uk Kim 781f38b0f21SJung-uk Kim FlOpenFile (ASL_FILE_LISTING_OUTPUT, Filename, "w+t"); 782d244b227SJung-uk Kim 783d244b227SJung-uk Kim AslCompilerSignon (ASL_FILE_LISTING_OUTPUT); 784d244b227SJung-uk Kim AslCompilerFileHeader (ASL_FILE_LISTING_OUTPUT); 785d244b227SJung-uk Kim } 786d244b227SJung-uk Kim 7875ef50723SJung-uk Kim /* Create the preprocessor output temp file if preprocessor enabled */ 7884c52cad2SJung-uk Kim 789eef1b955SJung-uk Kim if (Gbl_PreprocessFlag) 790eef1b955SJung-uk Kim { 7914c52cad2SJung-uk Kim Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_PREPROCESSOR); 7924c52cad2SJung-uk Kim if (!Filename) 7934c52cad2SJung-uk Kim { 7944c52cad2SJung-uk Kim AslCommonError (ASL_ERROR, ASL_MSG_PREPROCESSOR_FILENAME, 7954c52cad2SJung-uk Kim 0, 0, 0, 0, NULL, NULL); 7964c52cad2SJung-uk Kim return (AE_ERROR); 7974c52cad2SJung-uk Kim } 7984c52cad2SJung-uk Kim 799f38b0f21SJung-uk Kim FlOpenFile (ASL_FILE_PREPROCESSOR, Filename, "w+t"); 800eef1b955SJung-uk Kim } 8014c52cad2SJung-uk Kim 8025ef50723SJung-uk Kim /* 8035ef50723SJung-uk Kim * Create the "user" preprocessor output file if -li flag set. 8045ef50723SJung-uk Kim * Note, this file contains no embedded #line directives. 8055ef50723SJung-uk Kim */ 8065ef50723SJung-uk Kim if (Gbl_PreprocessorOutputFlag) 8075ef50723SJung-uk Kim { 8085ef50723SJung-uk Kim Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_PREPROC_USER); 8095ef50723SJung-uk Kim if (!Filename) 8105ef50723SJung-uk Kim { 8115ef50723SJung-uk Kim AslCommonError (ASL_ERROR, ASL_MSG_PREPROCESSOR_FILENAME, 8125ef50723SJung-uk Kim 0, 0, 0, 0, NULL, NULL); 8135ef50723SJung-uk Kim return (AE_ERROR); 8145ef50723SJung-uk Kim } 8155ef50723SJung-uk Kim 8165ef50723SJung-uk Kim FlOpenFile (ASL_FILE_PREPROCESSOR_USER, Filename, "w+t"); 8175ef50723SJung-uk Kim } 8185ef50723SJung-uk Kim 8194c52cad2SJung-uk Kim /* All done for data table compiler */ 8204c52cad2SJung-uk Kim 821a88e22b7SJung-uk Kim if (Gbl_FileType == ASL_INPUT_TYPE_ASCII_DATA) 822a88e22b7SJung-uk Kim { 823a88e22b7SJung-uk Kim return (AE_OK); 824a88e22b7SJung-uk Kim } 825a88e22b7SJung-uk Kim 826fba7fc7eSJung-uk Kim /* Create/Open a combined source output file */ 827fba7fc7eSJung-uk Kim 828fba7fc7eSJung-uk Kim Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_SOURCE); 829fba7fc7eSJung-uk Kim if (!Filename) 830fba7fc7eSJung-uk Kim { 831fba7fc7eSJung-uk Kim AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME, 832fba7fc7eSJung-uk Kim 0, 0, 0, 0, NULL, NULL); 833fba7fc7eSJung-uk Kim return (AE_ERROR); 834fba7fc7eSJung-uk Kim } 835fba7fc7eSJung-uk Kim 836fba7fc7eSJung-uk Kim /* 837fba7fc7eSJung-uk Kim * Open the source output file, binary mode (so that LF does not get 838fba7fc7eSJung-uk Kim * expanded to CR/LF on some systems, messing up our seek 839fba7fc7eSJung-uk Kim * calculations.) 840fba7fc7eSJung-uk Kim */ 841fba7fc7eSJung-uk Kim FlOpenFile (ASL_FILE_SOURCE_OUTPUT, Filename, "w+b"); 842fba7fc7eSJung-uk Kim 8434c52cad2SJung-uk Kim /* 8444c52cad2SJung-uk Kim // TBD: TEMP 8454c52cad2SJung-uk Kim // AslCompilerin = Gbl_Files[ASL_FILE_SOURCE_OUTPUT].Handle; 8464c52cad2SJung-uk Kim */ 847fba7fc7eSJung-uk Kim /* Create/Open a assembly code source output file if asked */ 848fba7fc7eSJung-uk Kim 849fba7fc7eSJung-uk Kim if (Gbl_AsmOutputFlag) 850fba7fc7eSJung-uk Kim { 851fba7fc7eSJung-uk Kim Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_ASM_SOURCE); 852fba7fc7eSJung-uk Kim if (!Filename) 853fba7fc7eSJung-uk Kim { 854fba7fc7eSJung-uk Kim AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME, 855fba7fc7eSJung-uk Kim 0, 0, 0, 0, NULL, NULL); 856fba7fc7eSJung-uk Kim return (AE_ERROR); 857fba7fc7eSJung-uk Kim } 858fba7fc7eSJung-uk Kim 859fba7fc7eSJung-uk Kim /* Open the assembly code source file, text mode */ 860fba7fc7eSJung-uk Kim 861f38b0f21SJung-uk Kim FlOpenFile (ASL_FILE_ASM_SOURCE_OUTPUT, Filename, "w+t"); 862fba7fc7eSJung-uk Kim 863fba7fc7eSJung-uk Kim AslCompilerSignon (ASL_FILE_ASM_SOURCE_OUTPUT); 864fba7fc7eSJung-uk Kim AslCompilerFileHeader (ASL_FILE_ASM_SOURCE_OUTPUT); 865fba7fc7eSJung-uk Kim } 866fba7fc7eSJung-uk Kim 867fba7fc7eSJung-uk Kim /* Create/Open a C code source output file if asked */ 868fba7fc7eSJung-uk Kim 869fba7fc7eSJung-uk Kim if (Gbl_C_OutputFlag) 870fba7fc7eSJung-uk Kim { 871fba7fc7eSJung-uk Kim Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_C_SOURCE); 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 C code source file, text mode */ 880fba7fc7eSJung-uk Kim 881f38b0f21SJung-uk Kim FlOpenFile (ASL_FILE_C_SOURCE_OUTPUT, Filename, "w+t"); 882fba7fc7eSJung-uk Kim 883fba7fc7eSJung-uk Kim FlPrintFile (ASL_FILE_C_SOURCE_OUTPUT, "/*\n"); 884fba7fc7eSJung-uk Kim AslCompilerSignon (ASL_FILE_C_SOURCE_OUTPUT); 885fba7fc7eSJung-uk Kim AslCompilerFileHeader (ASL_FILE_C_SOURCE_OUTPUT); 886fba7fc7eSJung-uk Kim } 887fba7fc7eSJung-uk Kim 8889c7c683cSJung-uk Kim /* Create/Open a C code source output file for the offset table if asked */ 8899c7c683cSJung-uk Kim 8909c7c683cSJung-uk Kim if (Gbl_C_OffsetTableFlag) 8919c7c683cSJung-uk Kim { 8929c7c683cSJung-uk Kim Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_C_OFFSET); 8939c7c683cSJung-uk Kim if (!Filename) 8949c7c683cSJung-uk Kim { 8959c7c683cSJung-uk Kim AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME, 8969c7c683cSJung-uk Kim 0, 0, 0, 0, NULL, NULL); 8979c7c683cSJung-uk Kim return (AE_ERROR); 8989c7c683cSJung-uk Kim } 8999c7c683cSJung-uk Kim 9009c7c683cSJung-uk Kim /* Open the C code source file, text mode */ 9019c7c683cSJung-uk Kim 9029c7c683cSJung-uk Kim FlOpenFile (ASL_FILE_C_OFFSET_OUTPUT, Filename, "w+t"); 9039c7c683cSJung-uk Kim 9049c7c683cSJung-uk Kim FlPrintFile (ASL_FILE_C_OFFSET_OUTPUT, "/*\n"); 9059c7c683cSJung-uk Kim AslCompilerSignon (ASL_FILE_C_OFFSET_OUTPUT); 9069c7c683cSJung-uk Kim AslCompilerFileHeader (ASL_FILE_C_OFFSET_OUTPUT); 9079c7c683cSJung-uk Kim } 9089c7c683cSJung-uk Kim 909fba7fc7eSJung-uk Kim /* Create/Open a assembly include output file if asked */ 910fba7fc7eSJung-uk Kim 911fba7fc7eSJung-uk Kim if (Gbl_AsmIncludeOutputFlag) 912fba7fc7eSJung-uk Kim { 913fba7fc7eSJung-uk Kim Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_ASM_INCLUDE); 914fba7fc7eSJung-uk Kim if (!Filename) 915fba7fc7eSJung-uk Kim { 916fba7fc7eSJung-uk Kim AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME, 917fba7fc7eSJung-uk Kim 0, 0, 0, 0, NULL, NULL); 918fba7fc7eSJung-uk Kim return (AE_ERROR); 919fba7fc7eSJung-uk Kim } 920fba7fc7eSJung-uk Kim 921fba7fc7eSJung-uk Kim /* Open the assembly include file, text mode */ 922fba7fc7eSJung-uk Kim 923f38b0f21SJung-uk Kim FlOpenFile (ASL_FILE_ASM_INCLUDE_OUTPUT, Filename, "w+t"); 924fba7fc7eSJung-uk Kim 925fba7fc7eSJung-uk Kim AslCompilerSignon (ASL_FILE_ASM_INCLUDE_OUTPUT); 926fba7fc7eSJung-uk Kim AslCompilerFileHeader (ASL_FILE_ASM_INCLUDE_OUTPUT); 927fba7fc7eSJung-uk Kim } 928fba7fc7eSJung-uk Kim 929fba7fc7eSJung-uk Kim /* Create/Open a C include output file if asked */ 930fba7fc7eSJung-uk Kim 931fba7fc7eSJung-uk Kim if (Gbl_C_IncludeOutputFlag) 932fba7fc7eSJung-uk Kim { 933fba7fc7eSJung-uk Kim Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_C_INCLUDE); 934fba7fc7eSJung-uk Kim if (!Filename) 935fba7fc7eSJung-uk Kim { 936fba7fc7eSJung-uk Kim AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME, 937fba7fc7eSJung-uk Kim 0, 0, 0, 0, NULL, NULL); 938fba7fc7eSJung-uk Kim return (AE_ERROR); 939fba7fc7eSJung-uk Kim } 940fba7fc7eSJung-uk Kim 941fba7fc7eSJung-uk Kim /* Open the C include file, text mode */ 942fba7fc7eSJung-uk Kim 943f38b0f21SJung-uk Kim FlOpenFile (ASL_FILE_C_INCLUDE_OUTPUT, Filename, "w+t"); 944fba7fc7eSJung-uk Kim 945fba7fc7eSJung-uk Kim FlPrintFile (ASL_FILE_C_INCLUDE_OUTPUT, "/*\n"); 946fba7fc7eSJung-uk Kim AslCompilerSignon (ASL_FILE_C_INCLUDE_OUTPUT); 947fba7fc7eSJung-uk Kim AslCompilerFileHeader (ASL_FILE_C_INCLUDE_OUTPUT); 948fba7fc7eSJung-uk Kim } 949fba7fc7eSJung-uk Kim 950fba7fc7eSJung-uk Kim /* Create a namespace output file if asked */ 951fba7fc7eSJung-uk Kim 952fba7fc7eSJung-uk Kim if (Gbl_NsOutputFlag) 953fba7fc7eSJung-uk Kim { 954fba7fc7eSJung-uk Kim Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_NAMESPACE); 955fba7fc7eSJung-uk Kim if (!Filename) 956fba7fc7eSJung-uk Kim { 957fba7fc7eSJung-uk Kim AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME, 958fba7fc7eSJung-uk Kim 0, 0, 0, 0, NULL, NULL); 959fba7fc7eSJung-uk Kim return (AE_ERROR); 960fba7fc7eSJung-uk Kim } 961fba7fc7eSJung-uk Kim 962fba7fc7eSJung-uk Kim /* Open the namespace file, text mode */ 963fba7fc7eSJung-uk Kim 964f38b0f21SJung-uk Kim FlOpenFile (ASL_FILE_NAMESPACE_OUTPUT, Filename, "w+t"); 965fba7fc7eSJung-uk Kim 966fba7fc7eSJung-uk Kim AslCompilerSignon (ASL_FILE_NAMESPACE_OUTPUT); 967fba7fc7eSJung-uk Kim AslCompilerFileHeader (ASL_FILE_NAMESPACE_OUTPUT); 968fba7fc7eSJung-uk Kim } 969fba7fc7eSJung-uk Kim 9700d84335fSJung-uk Kim /* Create a debug file for the converter */ 9710d84335fSJung-uk Kim 9720d84335fSJung-uk Kim if (AcpiGbl_DebugAslConversion) 9730d84335fSJung-uk Kim { 9740d84335fSJung-uk Kim Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_CONVERT_DEBUG); 9750d84335fSJung-uk Kim if (!Filename) 9760d84335fSJung-uk Kim { 9770d84335fSJung-uk Kim AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME, 9780d84335fSJung-uk Kim 0, 0, 0, 0, NULL, NULL); 9790d84335fSJung-uk Kim return (AE_ERROR); 9800d84335fSJung-uk Kim } 9810d84335fSJung-uk Kim 9820d84335fSJung-uk Kim /* Open the converter debug file, text mode */ 9830d84335fSJung-uk Kim 9840d84335fSJung-uk Kim FlOpenFile (ASL_FILE_CONV_DEBUG_OUTPUT, Filename, "w+t"); 9850d84335fSJung-uk Kim 9860d84335fSJung-uk Kim AslCompilerSignon (ASL_FILE_CONV_DEBUG_OUTPUT); 9870d84335fSJung-uk Kim AslCompilerFileHeader (ASL_FILE_CONV_DEBUG_OUTPUT); 9880d84335fSJung-uk Kim 9890d84335fSJung-uk Kim AcpiGbl_ConvDebugFile = Gbl_Files[ASL_FILE_CONV_DEBUG_OUTPUT].Handle; 9900d84335fSJung-uk Kim } 9910d84335fSJung-uk Kim 992fba7fc7eSJung-uk Kim return (AE_OK); 993fba7fc7eSJung-uk Kim } 994fba7fc7eSJung-uk Kim 995fba7fc7eSJung-uk Kim 996fba7fc7eSJung-uk Kim #ifdef ACPI_OBSOLETE_FUNCTIONS 997fba7fc7eSJung-uk Kim /******************************************************************************* 998fba7fc7eSJung-uk Kim * 99953289f6aSNate Lawson * FUNCTION: FlParseInputPathname 100053289f6aSNate Lawson * 100153289f6aSNate Lawson * PARAMETERS: InputFilename - The user-specified ASL source file to be 100253289f6aSNate Lawson * compiled 100353289f6aSNate Lawson * 100453289f6aSNate Lawson * RETURN: Status 100553289f6aSNate Lawson * 100653289f6aSNate Lawson * DESCRIPTION: Split the input path into a directory and filename part 100753289f6aSNate Lawson * 1) Directory part used to open include files 100853289f6aSNate Lawson * 2) Filename part used to generate output filenames 100953289f6aSNate Lawson * 101053289f6aSNate Lawson ******************************************************************************/ 101153289f6aSNate Lawson 101253289f6aSNate Lawson ACPI_STATUS 101353289f6aSNate Lawson FlParseInputPathname ( 101453289f6aSNate Lawson char *InputFilename) 101553289f6aSNate Lawson { 101653289f6aSNate Lawson char *Substring; 101753289f6aSNate Lawson 101853289f6aSNate Lawson 101953289f6aSNate Lawson if (!InputFilename) 102053289f6aSNate Lawson { 102153289f6aSNate Lawson return (AE_OK); 102253289f6aSNate Lawson } 102353289f6aSNate Lawson 102453289f6aSNate Lawson /* Get the path to the input filename's directory */ 102553289f6aSNate Lawson 102653289f6aSNate Lawson Gbl_DirectoryPath = strdup (InputFilename); 102753289f6aSNate Lawson if (!Gbl_DirectoryPath) 102853289f6aSNate Lawson { 102953289f6aSNate Lawson return (AE_NO_MEMORY); 103053289f6aSNate Lawson } 103153289f6aSNate Lawson 103253289f6aSNate Lawson Substring = strrchr (Gbl_DirectoryPath, '\\'); 103353289f6aSNate Lawson if (!Substring) 103453289f6aSNate Lawson { 103553289f6aSNate Lawson Substring = strrchr (Gbl_DirectoryPath, '/'); 103653289f6aSNate Lawson if (!Substring) 103753289f6aSNate Lawson { 103853289f6aSNate Lawson Substring = strrchr (Gbl_DirectoryPath, ':'); 103953289f6aSNate Lawson } 104053289f6aSNate Lawson } 104153289f6aSNate Lawson 104253289f6aSNate Lawson if (!Substring) 104353289f6aSNate Lawson { 104453289f6aSNate Lawson Gbl_DirectoryPath[0] = 0; 104553289f6aSNate Lawson if (Gbl_UseDefaultAmlFilename) 104653289f6aSNate Lawson { 104753289f6aSNate Lawson Gbl_OutputFilenamePrefix = strdup (InputFilename); 104853289f6aSNate Lawson } 104953289f6aSNate Lawson } 105053289f6aSNate Lawson else 105153289f6aSNate Lawson { 105253289f6aSNate Lawson if (Gbl_UseDefaultAmlFilename) 105353289f6aSNate Lawson { 105453289f6aSNate Lawson Gbl_OutputFilenamePrefix = strdup (Substring + 1); 105553289f6aSNate Lawson } 105653289f6aSNate Lawson *(Substring+1) = 0; 105753289f6aSNate Lawson } 105853289f6aSNate Lawson 1059313a0c13SJung-uk Kim UtConvertBackslashes (Gbl_OutputFilenamePrefix); 106053289f6aSNate Lawson return (AE_OK); 106153289f6aSNate Lawson } 1062fba7fc7eSJung-uk Kim #endif 1063