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