1 1.1 jruoho /****************************************************************************** 2 1.1 jruoho * 3 1.2 christos * Module Name: aslfiles - File support functions 4 1.1 jruoho * 5 1.1 jruoho *****************************************************************************/ 6 1.1 jruoho 7 1.22 christos /****************************************************************************** 8 1.22 christos * 9 1.22 christos * 1. Copyright Notice 10 1.22 christos * 11 1.23 christos * Some or all of this work - Copyright (c) 1999 - 2025, Intel Corp. 12 1.1 jruoho * All rights reserved. 13 1.1 jruoho * 14 1.22 christos * 2. License 15 1.22 christos * 16 1.22 christos * 2.1. This is your license from Intel Corp. under its intellectual property 17 1.22 christos * rights. You may have additional license terms from the party that provided 18 1.22 christos * you this software, covering your right to use that party's intellectual 19 1.22 christos * property rights. 20 1.22 christos * 21 1.22 christos * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a 22 1.22 christos * copy of the source code appearing in this file ("Covered Code") an 23 1.22 christos * irrevocable, perpetual, worldwide license under Intel's copyrights in the 24 1.22 christos * base code distributed originally by Intel ("Original Intel Code") to copy, 25 1.22 christos * make derivatives, distribute, use and display any portion of the Covered 26 1.22 christos * Code in any form, with the right to sublicense such rights; and 27 1.22 christos * 28 1.22 christos * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent 29 1.22 christos * license (with the right to sublicense), under only those claims of Intel 30 1.22 christos * patents that are infringed by the Original Intel Code, to make, use, sell, 31 1.22 christos * offer to sell, and import the Covered Code and derivative works thereof 32 1.22 christos * solely to the minimum extent necessary to exercise the above copyright 33 1.22 christos * license, and in no event shall the patent license extend to any additions 34 1.22 christos * to or modifications of the Original Intel Code. No other license or right 35 1.22 christos * is granted directly or by implication, estoppel or otherwise; 36 1.22 christos * 37 1.22 christos * The above copyright and patent license is granted only if the following 38 1.22 christos * conditions are met: 39 1.22 christos * 40 1.22 christos * 3. Conditions 41 1.22 christos * 42 1.22 christos * 3.1. Redistribution of Source with Rights to Further Distribute Source. 43 1.22 christos * Redistribution of source code of any substantial portion of the Covered 44 1.22 christos * Code or modification with rights to further distribute source must include 45 1.22 christos * the above Copyright Notice, the above License, this list of Conditions, 46 1.22 christos * and the following Disclaimer and Export Compliance provision. In addition, 47 1.22 christos * Licensee must cause all Covered Code to which Licensee contributes to 48 1.22 christos * contain a file documenting the changes Licensee made to create that Covered 49 1.22 christos * Code and the date of any change. Licensee must include in that file the 50 1.22 christos * documentation of any changes made by any predecessor Licensee. Licensee 51 1.22 christos * must include a prominent statement that the modification is derived, 52 1.22 christos * directly or indirectly, from Original Intel Code. 53 1.22 christos * 54 1.22 christos * 3.2. Redistribution of Source with no Rights to Further Distribute Source. 55 1.22 christos * Redistribution of source code of any substantial portion of the Covered 56 1.22 christos * Code or modification without rights to further distribute source must 57 1.22 christos * include the following Disclaimer and Export Compliance provision in the 58 1.22 christos * documentation and/or other materials provided with distribution. In 59 1.22 christos * addition, Licensee may not authorize further sublicense of source of any 60 1.22 christos * portion of the Covered Code, and must include terms to the effect that the 61 1.22 christos * license from Licensee to its licensee is limited to the intellectual 62 1.22 christos * property embodied in the software Licensee provides to its licensee, and 63 1.22 christos * not to intellectual property embodied in modifications its licensee may 64 1.22 christos * make. 65 1.22 christos * 66 1.22 christos * 3.3. Redistribution of Executable. Redistribution in executable form of any 67 1.22 christos * substantial portion of the Covered Code or modification must reproduce the 68 1.22 christos * above Copyright Notice, and the following Disclaimer and Export Compliance 69 1.22 christos * provision in the documentation and/or other materials provided with the 70 1.22 christos * distribution. 71 1.22 christos * 72 1.22 christos * 3.4. Intel retains all right, title, and interest in and to the Original 73 1.22 christos * Intel Code. 74 1.22 christos * 75 1.22 christos * 3.5. Neither the name Intel nor any other trademark owned or controlled by 76 1.22 christos * Intel shall be used in advertising or otherwise to promote the sale, use or 77 1.22 christos * other dealings in products derived from or relating to the Covered Code 78 1.22 christos * without prior written authorization from Intel. 79 1.22 christos * 80 1.22 christos * 4. Disclaimer and Export Compliance 81 1.22 christos * 82 1.22 christos * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED 83 1.22 christos * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE 84 1.22 christos * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE, 85 1.22 christos * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY 86 1.22 christos * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY 87 1.22 christos * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A 88 1.22 christos * PARTICULAR PURPOSE. 89 1.22 christos * 90 1.22 christos * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES 91 1.22 christos * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR 92 1.22 christos * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT, 93 1.22 christos * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY 94 1.22 christos * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL 95 1.22 christos * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS 96 1.22 christos * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY 97 1.22 christos * LIMITED REMEDY. 98 1.22 christos * 99 1.22 christos * 4.3. Licensee shall not export, either directly or indirectly, any of this 100 1.22 christos * software or system incorporating such software without first obtaining any 101 1.22 christos * required license or other approval from the U. S. Department of Commerce or 102 1.22 christos * any other agency or department of the United States Government. In the 103 1.22 christos * event Licensee exports any such software from the United States or 104 1.22 christos * re-exports any such software from a foreign destination, Licensee shall 105 1.22 christos * ensure that the distribution and export/re-export of the software is in 106 1.22 christos * compliance with all laws, regulations, orders, or other restrictions of the 107 1.22 christos * U.S. Export Administration Regulations. Licensee agrees that neither it nor 108 1.22 christos * any of its subsidiaries will export/re-export any technical data, process, 109 1.22 christos * software, or service, directly or indirectly, to any country for which the 110 1.22 christos * United States government or any agency thereof requires an export license, 111 1.22 christos * other governmental approval, or letter of assurance, without first obtaining 112 1.22 christos * such license, approval or letter. 113 1.22 christos * 114 1.22 christos ***************************************************************************** 115 1.22 christos * 116 1.22 christos * Alternatively, you may choose to be licensed under the terms of the 117 1.22 christos * following license: 118 1.22 christos * 119 1.2 christos * Redistribution and use in source and binary forms, with or without 120 1.2 christos * modification, are permitted provided that the following conditions 121 1.2 christos * are met: 122 1.2 christos * 1. Redistributions of source code must retain the above copyright 123 1.2 christos * notice, this list of conditions, and the following disclaimer, 124 1.2 christos * without modification. 125 1.2 christos * 2. Redistributions in binary form must reproduce at minimum a disclaimer 126 1.2 christos * substantially similar to the "NO WARRANTY" disclaimer below 127 1.2 christos * ("Disclaimer") and any redistribution must be conditioned upon 128 1.2 christos * including a substantially similar Disclaimer requirement for further 129 1.2 christos * binary redistribution. 130 1.2 christos * 3. Neither the names of the above-listed copyright holders nor the names 131 1.2 christos * of any contributors may be used to endorse or promote products derived 132 1.2 christos * from this software without specific prior written permission. 133 1.2 christos * 134 1.2 christos * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 135 1.2 christos * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 136 1.17 christos * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 137 1.2 christos * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 138 1.22 christos * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 139 1.22 christos * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 140 1.22 christos * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 141 1.22 christos * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 142 1.22 christos * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 143 1.22 christos * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 144 1.22 christos * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 145 1.22 christos * 146 1.22 christos * Alternatively, you may choose to be licensed under the terms of the 147 1.22 christos * GNU General Public License ("GPL") version 2 as published by the Free 148 1.22 christos * Software Foundation. 149 1.22 christos * 150 1.22 christos *****************************************************************************/ 151 1.1 jruoho 152 1.1 jruoho #include "aslcompiler.h" 153 1.1 jruoho #include "acapps.h" 154 1.1 jruoho 155 1.1 jruoho #define _COMPONENT ACPI_COMPILER 156 1.1 jruoho ACPI_MODULE_NAME ("aslfiles") 157 1.1 jruoho 158 1.1 jruoho /* Local prototypes */ 159 1.1 jruoho 160 1.5 christos static FILE * 161 1.1 jruoho FlOpenIncludeWithPrefix ( 162 1.1 jruoho char *PrefixDir, 163 1.5 christos ACPI_PARSE_OBJECT *Op, 164 1.1 jruoho char *Filename); 165 1.1 jruoho 166 1.14 christos static BOOLEAN 167 1.14 christos FlInputFileExists ( 168 1.14 christos char *InputFilename); 169 1.14 christos 170 1.1 jruoho #ifdef ACPI_OBSOLETE_FUNCTIONS 171 1.1 jruoho ACPI_STATUS 172 1.1 jruoho FlParseInputPathname ( 173 1.1 jruoho char *InputFilename); 174 1.1 jruoho #endif 175 1.1 jruoho 176 1.1 jruoho 177 1.1 jruoho /******************************************************************************* 178 1.1 jruoho * 179 1.13 christos * FUNCTION: FlInitOneFile 180 1.13 christos * 181 1.13 christos * PARAMETERS: InputFilename - The user-specified ASL source file to be 182 1.13 christos * compiled 183 1.13 christos * 184 1.13 christos * RETURN: Status 185 1.13 christos * 186 1.13 christos * DESCRIPTION: Initialize global file structure for one input file. This file 187 1.13 christos * structure contains references to input, output, debugging, and 188 1.13 christos * other miscellaneous files that are associated for a single 189 1.13 christos * input ASL file. 190 1.13 christos * 191 1.13 christos ******************************************************************************/ 192 1.13 christos 193 1.13 christos ACPI_STATUS 194 1.13 christos FlInitOneFile ( 195 1.13 christos char *InputFilename) 196 1.13 christos { 197 1.13 christos UINT32 i; 198 1.13 christos ASL_GLOBAL_FILE_NODE *NewFileNode; 199 1.13 christos 200 1.13 christos 201 1.13 christos if (FlInputFileExists (InputFilename)) 202 1.13 christos { 203 1.13 christos AslError (ASL_ERROR, ASL_MSG_DUPLICATE_INPUT_FILE, NULL, InputFilename); 204 1.13 christos return (AE_ALREADY_EXISTS); 205 1.13 christos } 206 1.13 christos 207 1.13 christos NewFileNode = ACPI_CAST_PTR (ASL_GLOBAL_FILE_NODE, 208 1.13 christos UtLocalCacheCalloc (sizeof (ASL_GLOBAL_FILE_NODE))); 209 1.13 christos 210 1.13 christos NewFileNode->ParserErrorDetected = FALSE; 211 1.13 christos NewFileNode->Next = AslGbl_FilesList; 212 1.13 christos 213 1.13 christos AslGbl_FilesList = NewFileNode; 214 1.13 christos AslGbl_Files = NewFileNode->Files; 215 1.13 christos 216 1.13 christos for (i = 0; i < ASL_NUM_FILES; i++) 217 1.13 christos { 218 1.13 christos AslGbl_Files[i].Handle = NULL; 219 1.13 christos AslGbl_Files[i].Filename = NULL; 220 1.13 christos } 221 1.13 christos 222 1.13 christos AslGbl_Files[ASL_FILE_STDOUT].Handle = stdout; 223 1.13 christos AslGbl_Files[ASL_FILE_STDOUT].Filename = "STDOUT"; 224 1.13 christos 225 1.13 christos if (AslGbl_VerboseErrors) 226 1.13 christos { 227 1.13 christos AslGbl_Files[ASL_FILE_STDERR].Handle = stderr; 228 1.13 christos } 229 1.13 christos else 230 1.13 christos { 231 1.13 christos AslGbl_Files[ASL_FILE_STDERR].Handle = stdout; 232 1.13 christos } 233 1.13 christos 234 1.13 christos AslGbl_Files[ASL_FILE_STDERR].Filename = "STDERR"; 235 1.13 christos return (AE_OK); 236 1.13 christos } 237 1.13 christos 238 1.13 christos 239 1.13 christos /******************************************************************************* 240 1.13 christos * 241 1.13 christos * FUNCTION: FlInputFileExists 242 1.13 christos * 243 1.13 christos * PARAMETERS: Filename - File name to be searched 244 1.13 christos * 245 1.13 christos * RETURN: Status 246 1.13 christos * 247 1.13 christos * DESCRIPTION: Returns true if the file name already exists. 248 1.13 christos * 249 1.13 christos ******************************************************************************/ 250 1.13 christos 251 1.14 christos static BOOLEAN 252 1.13 christos FlInputFileExists ( 253 1.13 christos char *Filename) 254 1.13 christos { 255 1.13 christos ASL_GLOBAL_FILE_NODE *Current = AslGbl_FilesList; 256 1.13 christos 257 1.13 christos 258 1.13 christos while (Current) 259 1.13 christos { 260 1.13 christos if (!strcmp (Filename, Current->Files[ASL_FILE_INPUT].Filename)) 261 1.13 christos { 262 1.13 christos return (TRUE); 263 1.13 christos } 264 1.13 christos 265 1.13 christos Current = Current->Next; 266 1.13 christos } 267 1.13 christos 268 1.13 christos return (FALSE); 269 1.13 christos } 270 1.13 christos 271 1.13 christos 272 1.13 christos /******************************************************************************* 273 1.13 christos * 274 1.13 christos * FUNCTION: FlSwitchFileSet 275 1.13 christos * 276 1.13 christos * PARAMETERS: Op - Parse node for the LINE asl statement 277 1.13 christos * 278 1.13 christos * RETURN: None. 279 1.13 christos * 280 1.13 christos * DESCRIPTION: Set the current line number 281 1.13 christos * 282 1.13 christos ******************************************************************************/ 283 1.13 christos 284 1.13 christos ASL_FILE_SWITCH_STATUS 285 1.13 christos FlSwitchFileSet ( 286 1.13 christos char *InputFilename) 287 1.13 christos { 288 1.13 christos ASL_GLOBAL_FILE_NODE *Current = AslGbl_FilesList; 289 1.13 christos char *PrevFilename = Current->Files[ASL_FILE_INPUT].Filename; 290 1.13 christos 291 1.13 christos 292 1.13 christos while (Current) 293 1.13 christos { 294 1.13 christos if (!strcmp(Current->Files[ASL_FILE_INPUT].Filename, InputFilename)) 295 1.13 christos { 296 1.13 christos AslGbl_Files = Current->Files; 297 1.13 christos AslGbl_TableSignature = Current->TableSignature; 298 1.13 christos AslGbl_TableId = Current->TableId; 299 1.13 christos 300 1.13 christos if (!strcmp (InputFilename, PrevFilename)) 301 1.13 christos { 302 1.13 christos return (SWITCH_TO_SAME_FILE); 303 1.13 christos } 304 1.13 christos else 305 1.13 christos { 306 1.13 christos return (SWITCH_TO_DIFFERENT_FILE); 307 1.13 christos } 308 1.13 christos } 309 1.13 christos 310 1.13 christos Current = Current->Next; 311 1.13 christos } 312 1.13 christos 313 1.13 christos return (FILE_NOT_FOUND); 314 1.13 christos } 315 1.13 christos 316 1.13 christos 317 1.13 christos /******************************************************************************* 318 1.13 christos * 319 1.13 christos * FUNCTION: FlGetFileHandle 320 1.13 christos * 321 1.13 christos * PARAMETERS: OutFileId - denotes file type of output handle 322 1.13 christos * InFileId - denotes file type of the input Filename 323 1.13 christos * Filename 324 1.13 christos * 325 1.13 christos * RETURN: File handle 326 1.13 christos * 327 1.13 christos * DESCRIPTION: Get the file handle for a particular filename/FileId. This 328 1.13 christos * function also allows the caller to specify the file Id of the 329 1.13 christos * desired type. 330 1.13 christos * 331 1.13 christos ******************************************************************************/ 332 1.13 christos 333 1.13 christos FILE * 334 1.13 christos FlGetFileHandle ( 335 1.13 christos UINT32 OutFileId, 336 1.13 christos UINT32 InFileId, 337 1.13 christos char *Filename) 338 1.13 christos { 339 1.13 christos ASL_GLOBAL_FILE_NODE *Current = AslGbl_FilesList; 340 1.13 christos 341 1.13 christos 342 1.13 christos if (!Filename) 343 1.13 christos { 344 1.13 christos return (NULL); 345 1.13 christos } 346 1.13 christos 347 1.13 christos while (Current) 348 1.13 christos { 349 1.22 christos if (!strcmp (Current->Files[InFileId].Filename, Filename)) 350 1.13 christos { 351 1.13 christos return (Current->Files[OutFileId].Handle); 352 1.13 christos } 353 1.13 christos 354 1.13 christos Current = Current->Next; 355 1.13 christos } 356 1.13 christos 357 1.13 christos return (NULL); 358 1.13 christos } 359 1.13 christos 360 1.13 christos 361 1.13 christos /******************************************************************************* 362 1.13 christos * 363 1.13 christos * FUNCTION: FlGetFileNode 364 1.13 christos * 365 1.13 christos * PARAMETERS: FileId - File type (ID) of the input Filename 366 1.13 christos * Filename - File to search for 367 1.13 christos * 368 1.13 christos * RETURN: A global file node 369 1.13 christos * 370 1.13 christos * DESCRIPTION: Get the file node for a particular filename/FileId. 371 1.13 christos * 372 1.13 christos ******************************************************************************/ 373 1.13 christos 374 1.13 christos ASL_GLOBAL_FILE_NODE * 375 1.13 christos FlGetFileNode ( 376 1.13 christos UINT32 FileId, 377 1.13 christos char *Filename) 378 1.13 christos { 379 1.13 christos ASL_GLOBAL_FILE_NODE *Current = AslGbl_FilesList; 380 1.13 christos 381 1.13 christos 382 1.13 christos if (!Filename) 383 1.13 christos { 384 1.13 christos return (NULL); 385 1.13 christos } 386 1.13 christos 387 1.13 christos while (Current) 388 1.13 christos { 389 1.13 christos if (!strcmp (Current->Files[FileId].Filename, Filename)) 390 1.13 christos { 391 1.13 christos return (Current); 392 1.13 christos } 393 1.13 christos 394 1.13 christos Current = Current->Next; 395 1.13 christos } 396 1.13 christos 397 1.13 christos return (NULL); 398 1.13 christos } 399 1.13 christos 400 1.13 christos 401 1.13 christos /******************************************************************************* 402 1.13 christos * 403 1.13 christos * FUNCTION: FlGetCurrentFileNode 404 1.13 christos * 405 1.13 christos * PARAMETERS: None 406 1.13 christos * 407 1.13 christos * RETURN: Global file node 408 1.13 christos * 409 1.13 christos * DESCRIPTION: Get the current input file node 410 1.13 christos * 411 1.13 christos ******************************************************************************/ 412 1.13 christos 413 1.13 christos ASL_GLOBAL_FILE_NODE * 414 1.13 christos FlGetCurrentFileNode ( 415 1.13 christos void) 416 1.13 christos { 417 1.15 christos ASL_GLOBAL_FILE_NODE *FileNode = 418 1.15 christos FlGetFileNode (ASL_FILE_INPUT,AslGbl_Files[ASL_FILE_INPUT].Filename); 419 1.15 christos 420 1.15 christos 421 1.15 christos if (!FileNode) 422 1.15 christos { 423 1.15 christos /* 424 1.15 christos * If the current file node does not exist after initializing the file 425 1.15 christos * node structures, something went wrong and this is an unrecoverable 426 1.15 christos * condition. 427 1.15 christos */ 428 1.15 christos FlFileError (ASL_FILE_INPUT, ASL_MSG_COMPILER_INTERNAL); 429 1.15 christos AslAbort (); 430 1.15 christos } 431 1.15 christos 432 1.15 christos return (FileNode); 433 1.13 christos } 434 1.13 christos 435 1.13 christos 436 1.13 christos /******************************************************************************* 437 1.13 christos * 438 1.2 christos * FUNCTION: FlSetLineNumber 439 1.1 jruoho * 440 1.2 christos * PARAMETERS: Op - Parse node for the LINE asl statement 441 1.1 jruoho * 442 1.2 christos * RETURN: None. 443 1.1 jruoho * 444 1.2 christos * DESCRIPTION: Set the current line number 445 1.1 jruoho * 446 1.1 jruoho ******************************************************************************/ 447 1.1 jruoho 448 1.1 jruoho void 449 1.2 christos FlSetLineNumber ( 450 1.2 christos UINT32 LineNumber) 451 1.1 jruoho { 452 1.1 jruoho 453 1.2 christos DbgPrint (ASL_PARSE_OUTPUT, "\n#line: New line number %u (old %u)\n", 454 1.12 christos LineNumber, AslGbl_LogicalLineNumber); 455 1.1 jruoho 456 1.12 christos AslGbl_CurrentLineNumber = LineNumber; 457 1.1 jruoho } 458 1.1 jruoho 459 1.1 jruoho 460 1.1 jruoho /******************************************************************************* 461 1.1 jruoho * 462 1.2 christos * FUNCTION: FlSetFilename 463 1.1 jruoho * 464 1.1 jruoho * PARAMETERS: Op - Parse node for the LINE asl statement 465 1.1 jruoho * 466 1.1 jruoho * RETURN: None. 467 1.1 jruoho * 468 1.2 christos * DESCRIPTION: Set the current filename 469 1.1 jruoho * 470 1.1 jruoho ******************************************************************************/ 471 1.1 jruoho 472 1.1 jruoho void 473 1.2 christos FlSetFilename ( 474 1.2 christos char *Filename) 475 1.1 jruoho { 476 1.1 jruoho 477 1.2 christos DbgPrint (ASL_PARSE_OUTPUT, "\n#line: New filename %s (old %s)\n", 478 1.12 christos Filename, AslGbl_Files[ASL_FILE_INPUT].Filename); 479 1.2 christos 480 1.3 christos /* No need to free any existing filename */ 481 1.3 christos 482 1.12 christos AslGbl_Files[ASL_FILE_INPUT].Filename = Filename; 483 1.1 jruoho } 484 1.1 jruoho 485 1.1 jruoho 486 1.1 jruoho /******************************************************************************* 487 1.1 jruoho * 488 1.1 jruoho * FUNCTION: FlAddIncludeDirectory 489 1.1 jruoho * 490 1.1 jruoho * PARAMETERS: Dir - Directory pathname string 491 1.1 jruoho * 492 1.1 jruoho * RETURN: None 493 1.1 jruoho * 494 1.1 jruoho * DESCRIPTION: Add a directory the list of include prefix directories. 495 1.1 jruoho * 496 1.1 jruoho ******************************************************************************/ 497 1.1 jruoho 498 1.1 jruoho void 499 1.1 jruoho FlAddIncludeDirectory ( 500 1.1 jruoho char *Dir) 501 1.1 jruoho { 502 1.1 jruoho ASL_INCLUDE_DIR *NewDir; 503 1.1 jruoho ASL_INCLUDE_DIR *NextDir; 504 1.1 jruoho ASL_INCLUDE_DIR *PrevDir = NULL; 505 1.1 jruoho UINT32 NeedsSeparator = 0; 506 1.1 jruoho size_t DirLength; 507 1.1 jruoho 508 1.1 jruoho 509 1.1 jruoho DirLength = strlen (Dir); 510 1.1 jruoho if (!DirLength) 511 1.1 jruoho { 512 1.1 jruoho return; 513 1.1 jruoho } 514 1.1 jruoho 515 1.1 jruoho /* Make sure that the pathname ends with a path separator */ 516 1.1 jruoho 517 1.1 jruoho if ((Dir[DirLength-1] != '/') && 518 1.1 jruoho (Dir[DirLength-1] != '\\')) 519 1.1 jruoho { 520 1.1 jruoho NeedsSeparator = 1; 521 1.1 jruoho } 522 1.1 jruoho 523 1.12 christos NewDir = ACPI_CAST_PTR (ASL_INCLUDE_DIR, 524 1.12 christos UtLocalCacheCalloc (sizeof (ASL_INCLUDE_DIR))); 525 1.12 christos NewDir->Dir = UtLocalCacheCalloc (DirLength + 1 + NeedsSeparator); 526 1.1 jruoho strcpy (NewDir->Dir, Dir); 527 1.1 jruoho if (NeedsSeparator) 528 1.1 jruoho { 529 1.1 jruoho strcat (NewDir->Dir, "/"); 530 1.1 jruoho } 531 1.1 jruoho 532 1.1 jruoho /* 533 1.1 jruoho * Preserve command line ordering of -I options by adding new elements 534 1.1 jruoho * at the end of the list 535 1.1 jruoho */ 536 1.12 christos NextDir = AslGbl_IncludeDirList; 537 1.1 jruoho while (NextDir) 538 1.1 jruoho { 539 1.1 jruoho PrevDir = NextDir; 540 1.1 jruoho NextDir = NextDir->Next; 541 1.1 jruoho } 542 1.1 jruoho 543 1.1 jruoho if (PrevDir) 544 1.1 jruoho { 545 1.1 jruoho PrevDir->Next = NewDir; 546 1.1 jruoho } 547 1.1 jruoho else 548 1.1 jruoho { 549 1.12 christos AslGbl_IncludeDirList = NewDir; 550 1.1 jruoho } 551 1.1 jruoho } 552 1.1 jruoho 553 1.1 jruoho 554 1.1 jruoho /******************************************************************************* 555 1.1 jruoho * 556 1.2 christos * FUNCTION: FlMergePathnames 557 1.2 christos * 558 1.2 christos * PARAMETERS: PrefixDir - Prefix directory pathname. Can be NULL or 559 1.2 christos * a zero length string. 560 1.2 christos * FilePathname - The include filename from the source ASL. 561 1.2 christos * 562 1.2 christos * RETURN: Merged pathname string 563 1.2 christos * 564 1.2 christos * DESCRIPTION: Merge two pathnames that (probably) have common elements, to 565 1.2 christos * arrive at a minimal length string. Merge can occur if the 566 1.2 christos * FilePathname is relative to the PrefixDir. 567 1.2 christos * 568 1.2 christos ******************************************************************************/ 569 1.2 christos 570 1.2 christos char * 571 1.2 christos FlMergePathnames ( 572 1.2 christos char *PrefixDir, 573 1.2 christos char *FilePathname) 574 1.2 christos { 575 1.2 christos char *CommonPath; 576 1.2 christos char *Pathname; 577 1.2 christos char *LastElement; 578 1.2 christos 579 1.2 christos 580 1.2 christos DbgPrint (ASL_PARSE_OUTPUT, "Include: Prefix path - \"%s\"\n" 581 1.2 christos "Include: FilePathname - \"%s\"\n", 582 1.2 christos PrefixDir, FilePathname); 583 1.2 christos 584 1.2 christos /* 585 1.2 christos * If there is no prefix directory or if the file pathname is absolute, 586 1.2 christos * just return the original file pathname 587 1.2 christos */ 588 1.2 christos if (!PrefixDir || (!*PrefixDir) || 589 1.2 christos (*FilePathname == '/') || 590 1.2 christos (FilePathname[1] == ':')) 591 1.2 christos { 592 1.10 christos Pathname = UtLocalCacheCalloc (strlen (FilePathname) + 1); 593 1.2 christos strcpy (Pathname, FilePathname); 594 1.2 christos goto ConvertBackslashes; 595 1.2 christos } 596 1.2 christos 597 1.2 christos /* Need a local copy of the prefix directory path */ 598 1.2 christos 599 1.10 christos CommonPath = UtLocalCacheCalloc (strlen (PrefixDir) + 1); 600 1.2 christos strcpy (CommonPath, PrefixDir); 601 1.2 christos 602 1.2 christos /* 603 1.2 christos * Walk forward through the file path, and simultaneously backward 604 1.2 christos * through the prefix directory path until there are no more 605 1.2 christos * relative references at the start of the file path. 606 1.2 christos */ 607 1.2 christos while (*FilePathname && (!strncmp (FilePathname, "../", 3))) 608 1.2 christos { 609 1.2 christos /* Remove last element of the prefix directory path */ 610 1.2 christos 611 1.2 christos LastElement = strrchr (CommonPath, '/'); 612 1.2 christos if (!LastElement) 613 1.2 christos { 614 1.2 christos goto ConcatenatePaths; 615 1.2 christos } 616 1.2 christos 617 1.2 christos *LastElement = 0; /* Terminate CommonPath string */ 618 1.2 christos FilePathname += 3; /* Point to next path element */ 619 1.2 christos } 620 1.2 christos 621 1.2 christos /* 622 1.2 christos * Remove the last element of the prefix directory path (it is the same as 623 1.2 christos * the first element of the file pathname), and build the final merged 624 1.2 christos * pathname. 625 1.2 christos */ 626 1.2 christos LastElement = strrchr (CommonPath, '/'); 627 1.2 christos if (LastElement) 628 1.2 christos { 629 1.2 christos *LastElement = 0; 630 1.2 christos } 631 1.2 christos 632 1.2 christos /* Build the final merged pathname */ 633 1.2 christos 634 1.2 christos ConcatenatePaths: 635 1.10 christos Pathname = UtLocalCacheCalloc ( 636 1.6 christos strlen (CommonPath) + strlen (FilePathname) + 2); 637 1.2 christos if (LastElement && *CommonPath) 638 1.2 christos { 639 1.2 christos strcpy (Pathname, CommonPath); 640 1.2 christos strcat (Pathname, "/"); 641 1.2 christos } 642 1.2 christos strcat (Pathname, FilePathname); 643 1.2 christos 644 1.2 christos /* Convert all backslashes to normal slashes */ 645 1.2 christos 646 1.2 christos ConvertBackslashes: 647 1.2 christos UtConvertBackslashes (Pathname); 648 1.2 christos 649 1.2 christos DbgPrint (ASL_PARSE_OUTPUT, "Include: Merged Pathname - \"%s\"\n", 650 1.2 christos Pathname); 651 1.2 christos return (Pathname); 652 1.2 christos } 653 1.2 christos 654 1.2 christos 655 1.2 christos /******************************************************************************* 656 1.2 christos * 657 1.1 jruoho * FUNCTION: FlOpenIncludeWithPrefix 658 1.1 jruoho * 659 1.1 jruoho * PARAMETERS: PrefixDir - Prefix directory pathname. Can be a zero 660 1.1 jruoho * length string. 661 1.1 jruoho * Filename - The include filename from the source ASL. 662 1.1 jruoho * 663 1.1 jruoho * RETURN: Valid file descriptor if successful. Null otherwise. 664 1.1 jruoho * 665 1.1 jruoho * DESCRIPTION: Open an include file and push it on the input file stack. 666 1.1 jruoho * 667 1.1 jruoho ******************************************************************************/ 668 1.1 jruoho 669 1.5 christos static FILE * 670 1.1 jruoho FlOpenIncludeWithPrefix ( 671 1.1 jruoho char *PrefixDir, 672 1.5 christos ACPI_PARSE_OBJECT *Op, 673 1.1 jruoho char *Filename) 674 1.1 jruoho { 675 1.1 jruoho FILE *IncludeFile; 676 1.1 jruoho char *Pathname; 677 1.5 christos UINT32 OriginalLineNumber; 678 1.1 jruoho 679 1.1 jruoho 680 1.1 jruoho /* Build the full pathname to the file */ 681 1.1 jruoho 682 1.2 christos Pathname = FlMergePathnames (PrefixDir, Filename); 683 1.1 jruoho 684 1.2 christos DbgPrint (ASL_PARSE_OUTPUT, "Include: Opening file - \"%s\"\n\n", 685 1.1 jruoho Pathname); 686 1.1 jruoho 687 1.1 jruoho /* Attempt to open the file, push if successful */ 688 1.1 jruoho 689 1.1 jruoho IncludeFile = fopen (Pathname, "r"); 690 1.2 christos if (!IncludeFile) 691 1.1 jruoho { 692 1.2 christos return (NULL); 693 1.2 christos } 694 1.1 jruoho 695 1.5 christos /* 696 1.5 christos * Check the entire include file for any # preprocessor directives. 697 1.5 christos * This is because there may be some confusion between the #include 698 1.5 christos * preprocessor directive and the ASL Include statement. A file included 699 1.5 christos * by the ASL include cannot contain preprocessor directives because 700 1.5 christos * the preprocessor has already run by the time the ASL include is 701 1.5 christos * recognized (by the compiler, not the preprocessor.) 702 1.5 christos * 703 1.5 christos * Note: DtGetNextLine strips/ignores comments. 704 1.5 christos * Save current line number since DtGetNextLine modifies it. 705 1.5 christos */ 706 1.12 christos AslGbl_CurrentLineNumber--; 707 1.12 christos OriginalLineNumber = AslGbl_CurrentLineNumber; 708 1.6 christos 709 1.5 christos while (DtGetNextLine (IncludeFile, DT_ALLOW_MULTILINE_QUOTES) != ASL_EOF) 710 1.5 christos { 711 1.12 christos if (AslGbl_CurrentLineBuffer[0] == '#') 712 1.5 christos { 713 1.5 christos AslError (ASL_ERROR, ASL_MSG_INCLUDE_FILE, 714 1.5 christos Op, "use #include instead"); 715 1.5 christos } 716 1.5 christos } 717 1.6 christos 718 1.12 christos AslGbl_CurrentLineNumber = OriginalLineNumber; 719 1.5 christos 720 1.5 christos /* Must seek back to the start of the file */ 721 1.5 christos 722 1.5 christos fseek (IncludeFile, 0, SEEK_SET); 723 1.5 christos 724 1.2 christos /* Push the include file on the open input file stack */ 725 1.1 jruoho 726 1.2 christos AslPushInputFileStack (IncludeFile, Pathname); 727 1.2 christos return (IncludeFile); 728 1.1 jruoho } 729 1.1 jruoho 730 1.1 jruoho 731 1.1 jruoho /******************************************************************************* 732 1.1 jruoho * 733 1.1 jruoho * FUNCTION: FlOpenIncludeFile 734 1.1 jruoho * 735 1.1 jruoho * PARAMETERS: Op - Parse node for the INCLUDE ASL statement 736 1.1 jruoho * 737 1.1 jruoho * RETURN: None. 738 1.1 jruoho * 739 1.1 jruoho * DESCRIPTION: Open an include file and push it on the input file stack. 740 1.1 jruoho * 741 1.1 jruoho ******************************************************************************/ 742 1.1 jruoho 743 1.1 jruoho void 744 1.1 jruoho FlOpenIncludeFile ( 745 1.1 jruoho ACPI_PARSE_OBJECT *Op) 746 1.1 jruoho { 747 1.1 jruoho FILE *IncludeFile; 748 1.1 jruoho ASL_INCLUDE_DIR *NextDir; 749 1.1 jruoho 750 1.1 jruoho 751 1.1 jruoho /* Op must be valid */ 752 1.1 jruoho 753 1.1 jruoho if (!Op) 754 1.1 jruoho { 755 1.1 jruoho AslCommonError (ASL_ERROR, ASL_MSG_INCLUDE_FILE_OPEN, 756 1.12 christos AslGbl_CurrentLineNumber, AslGbl_LogicalLineNumber, 757 1.12 christos AslGbl_InputByteCount, AslGbl_CurrentColumn, 758 1.12 christos AslGbl_Files[ASL_FILE_INPUT].Filename, " - Null parse node"); 759 1.1 jruoho 760 1.1 jruoho return; 761 1.1 jruoho } 762 1.1 jruoho 763 1.1 jruoho /* 764 1.1 jruoho * Flush out the "include ()" statement on this line, start 765 1.1 jruoho * the actual include file on the next line 766 1.1 jruoho */ 767 1.2 christos AslResetCurrentLineBuffer (); 768 1.1 jruoho FlPrintFile (ASL_FILE_SOURCE_OUTPUT, "\n"); 769 1.12 christos AslGbl_CurrentLineOffset++; 770 1.1 jruoho 771 1.1 jruoho 772 1.1 jruoho /* Attempt to open the include file */ 773 1.1 jruoho 774 1.1 jruoho /* If the file specifies an absolute path, just open it */ 775 1.1 jruoho 776 1.1 jruoho if ((Op->Asl.Value.String[0] == '/') || 777 1.1 jruoho (Op->Asl.Value.String[0] == '\\') || 778 1.1 jruoho (Op->Asl.Value.String[1] == ':')) 779 1.1 jruoho { 780 1.5 christos IncludeFile = FlOpenIncludeWithPrefix ("", Op, Op->Asl.Value.String); 781 1.1 jruoho if (!IncludeFile) 782 1.1 jruoho { 783 1.1 jruoho goto ErrorExit; 784 1.1 jruoho } 785 1.1 jruoho return; 786 1.1 jruoho } 787 1.1 jruoho 788 1.1 jruoho /* 789 1.1 jruoho * The include filename is not an absolute path. 790 1.1 jruoho * 791 1.1 jruoho * First, search for the file within the "local" directory -- meaning 792 1.1 jruoho * the same directory that contains the source file. 793 1.1 jruoho * 794 1.1 jruoho * Construct the file pathname from the global directory name. 795 1.1 jruoho */ 796 1.6 christos IncludeFile = FlOpenIncludeWithPrefix ( 797 1.12 christos AslGbl_DirectoryPath, Op, Op->Asl.Value.String); 798 1.1 jruoho if (IncludeFile) 799 1.1 jruoho { 800 1.1 jruoho return; 801 1.1 jruoho } 802 1.1 jruoho 803 1.1 jruoho /* 804 1.1 jruoho * Second, search for the file within the (possibly multiple) directories 805 1.1 jruoho * specified by the -I option on the command line. 806 1.1 jruoho */ 807 1.12 christos NextDir = AslGbl_IncludeDirList; 808 1.1 jruoho while (NextDir) 809 1.1 jruoho { 810 1.6 christos IncludeFile = FlOpenIncludeWithPrefix ( 811 1.6 christos NextDir->Dir, Op, Op->Asl.Value.String); 812 1.1 jruoho if (IncludeFile) 813 1.1 jruoho { 814 1.1 jruoho return; 815 1.1 jruoho } 816 1.1 jruoho 817 1.1 jruoho NextDir = NextDir->Next; 818 1.1 jruoho } 819 1.1 jruoho 820 1.1 jruoho /* We could not open the include file after trying very hard */ 821 1.1 jruoho 822 1.1 jruoho ErrorExit: 823 1.12 christos snprintf (AslGbl_MsgBuffer, sizeof(AslGbl_MsgBuffer), "%s, %s", Op->Asl.Value.String, strerror (errno)); 824 1.12 christos AslError (ASL_ERROR, ASL_MSG_INCLUDE_FILE_OPEN, Op, AslGbl_MsgBuffer); 825 1.1 jruoho } 826 1.1 jruoho 827 1.1 jruoho 828 1.1 jruoho /******************************************************************************* 829 1.1 jruoho * 830 1.1 jruoho * FUNCTION: FlOpenInputFile 831 1.1 jruoho * 832 1.1 jruoho * PARAMETERS: InputFilename - The user-specified ASL source file to be 833 1.1 jruoho * compiled 834 1.1 jruoho * 835 1.1 jruoho * RETURN: Status 836 1.1 jruoho * 837 1.1 jruoho * DESCRIPTION: Open the specified input file, and save the directory path to 838 1.18 christos * the file so that include files can be opened in the same 839 1.18 christos * directory. NOTE: File is opened in text mode. 840 1.1 jruoho * 841 1.1 jruoho ******************************************************************************/ 842 1.1 jruoho 843 1.1 jruoho ACPI_STATUS 844 1.1 jruoho FlOpenInputFile ( 845 1.1 jruoho char *InputFilename) 846 1.1 jruoho { 847 1.1 jruoho 848 1.1 jruoho /* Open the input ASL file, text mode */ 849 1.1 jruoho 850 1.2 christos FlOpenFile (ASL_FILE_INPUT, InputFilename, "rt"); 851 1.12 christos AslCompilerin = AslGbl_Files[ASL_FILE_INPUT].Handle; 852 1.1 jruoho 853 1.1 jruoho return (AE_OK); 854 1.1 jruoho } 855 1.1 jruoho 856 1.1 jruoho 857 1.1 jruoho /******************************************************************************* 858 1.1 jruoho * 859 1.1 jruoho * FUNCTION: FlOpenAmlOutputFile 860 1.1 jruoho * 861 1.1 jruoho * PARAMETERS: FilenamePrefix - The user-specified ASL source file 862 1.1 jruoho * 863 1.1 jruoho * RETURN: Status 864 1.1 jruoho * 865 1.2 christos * DESCRIPTION: Create the output filename (*.AML) and open the file. The file 866 1.1 jruoho * is created in the same directory as the parent input file. 867 1.1 jruoho * 868 1.1 jruoho ******************************************************************************/ 869 1.1 jruoho 870 1.1 jruoho ACPI_STATUS 871 1.1 jruoho FlOpenAmlOutputFile ( 872 1.1 jruoho char *FilenamePrefix) 873 1.1 jruoho { 874 1.1 jruoho char *Filename; 875 1.1 jruoho 876 1.1 jruoho 877 1.1 jruoho /* Output filename usually comes from the ASL itself */ 878 1.1 jruoho 879 1.12 christos Filename = AslGbl_Files[ASL_FILE_AML_OUTPUT].Filename; 880 1.1 jruoho if (!Filename) 881 1.1 jruoho { 882 1.1 jruoho /* Create the output AML filename */ 883 1.11 christos if (!AcpiGbl_CaptureComments) 884 1.9 christos { 885 1.9 christos Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_AML_CODE); 886 1.9 christos } 887 1.9 christos else 888 1.9 christos { 889 1.9 christos Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_CONVERT_AML); 890 1.9 christos } 891 1.1 jruoho if (!Filename) 892 1.1 jruoho { 893 1.1 jruoho AslCommonError (ASL_ERROR, ASL_MSG_OUTPUT_FILENAME, 894 1.1 jruoho 0, 0, 0, 0, NULL, NULL); 895 1.1 jruoho return (AE_ERROR); 896 1.1 jruoho } 897 1.4 christos 898 1.12 christos AslGbl_Files[ASL_FILE_AML_OUTPUT].Filename = Filename; 899 1.1 jruoho } 900 1.1 jruoho 901 1.1 jruoho /* Open the output AML file in binary mode */ 902 1.1 jruoho 903 1.1 jruoho FlOpenFile (ASL_FILE_AML_OUTPUT, Filename, "w+b"); 904 1.1 jruoho return (AE_OK); 905 1.1 jruoho } 906 1.1 jruoho 907 1.1 jruoho 908 1.1 jruoho /******************************************************************************* 909 1.1 jruoho * 910 1.1 jruoho * FUNCTION: FlOpenMiscOutputFiles 911 1.1 jruoho * 912 1.1 jruoho * PARAMETERS: FilenamePrefix - The user-specified ASL source file 913 1.1 jruoho * 914 1.1 jruoho * RETURN: Status 915 1.1 jruoho * 916 1.1 jruoho * DESCRIPTION: Create and open the various output files needed, depending on 917 1.1 jruoho * the command line options 918 1.1 jruoho * 919 1.1 jruoho ******************************************************************************/ 920 1.1 jruoho 921 1.1 jruoho ACPI_STATUS 922 1.1 jruoho FlOpenMiscOutputFiles ( 923 1.1 jruoho char *FilenamePrefix) 924 1.1 jruoho { 925 1.1 jruoho char *Filename; 926 1.1 jruoho 927 1.1 jruoho 928 1.5 christos /* Create/Open a map file if requested */ 929 1.5 christos 930 1.12 christos if (AslGbl_MapfileFlag) 931 1.5 christos { 932 1.5 christos Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_MAP); 933 1.5 christos if (!Filename) 934 1.5 christos { 935 1.5 christos AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME, 936 1.5 christos 0, 0, 0, 0, NULL, NULL); 937 1.5 christos return (AE_ERROR); 938 1.5 christos } 939 1.5 christos 940 1.5 christos /* Open the hex file, text mode (closed at compiler exit) */ 941 1.5 christos 942 1.5 christos FlOpenFile (ASL_FILE_MAP_OUTPUT, Filename, "w+t"); 943 1.5 christos 944 1.5 christos AslCompilerSignon (ASL_FILE_MAP_OUTPUT); 945 1.5 christos AslCompilerFileHeader (ASL_FILE_MAP_OUTPUT); 946 1.5 christos } 947 1.5 christos 948 1.2 christos /* All done for disassembler */ 949 1.2 christos 950 1.12 christos if (AslGbl_FileType == ASL_INPUT_TYPE_BINARY_ACPI_TABLE) 951 1.2 christos { 952 1.2 christos return (AE_OK); 953 1.2 christos } 954 1.2 christos 955 1.2 christos /* Create/Open a hex output file if asked */ 956 1.1 jruoho 957 1.12 christos if (AslGbl_HexOutputFlag) 958 1.1 jruoho { 959 1.2 christos Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_HEX_DUMP); 960 1.2 christos if (!Filename) 961 1.2 christos { 962 1.2 christos AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME, 963 1.2 christos 0, 0, 0, 0, NULL, NULL); 964 1.2 christos return (AE_ERROR); 965 1.2 christos } 966 1.2 christos 967 1.2 christos /* Open the hex file, text mode */ 968 1.2 christos 969 1.2 christos FlOpenFile (ASL_FILE_HEX_OUTPUT, Filename, "w+t"); 970 1.2 christos 971 1.2 christos AslCompilerSignon (ASL_FILE_HEX_OUTPUT); 972 1.2 christos AslCompilerFileHeader (ASL_FILE_HEX_OUTPUT); 973 1.1 jruoho } 974 1.1 jruoho 975 1.2 christos /* Create/Open a debug output file if asked */ 976 1.2 christos 977 1.12 christos if (AslGbl_DebugFlag) 978 1.2 christos { 979 1.2 christos Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_DEBUG); 980 1.2 christos if (!Filename) 981 1.2 christos { 982 1.2 christos AslCommonError (ASL_ERROR, ASL_MSG_DEBUG_FILENAME, 983 1.2 christos 0, 0, 0, 0, NULL, NULL); 984 1.2 christos return (AE_ERROR); 985 1.2 christos } 986 1.2 christos 987 1.2 christos /* Open the debug file as STDERR, text mode */ 988 1.2 christos 989 1.12 christos AslGbl_Files[ASL_FILE_DEBUG_OUTPUT].Filename = Filename; 990 1.12 christos AslGbl_Files[ASL_FILE_DEBUG_OUTPUT].Handle = 991 1.2 christos freopen (Filename, "w+t", stderr); 992 1.2 christos 993 1.12 christos if (!AslGbl_Files[ASL_FILE_DEBUG_OUTPUT].Handle) 994 1.2 christos { 995 1.4 christos /* 996 1.5 christos * A problem with freopen is that on error, we no longer 997 1.5 christos * have stderr and cannot emit normal error messages. 998 1.5 christos * Emit error to stdout, close files, and exit. 999 1.4 christos */ 1000 1.5 christos fprintf (stdout, 1001 1.5 christos "\nCould not open debug output file: %s\n\n", Filename); 1002 1.5 christos 1003 1.5 christos CmCleanupAndExit (); 1004 1.5 christos exit (1); 1005 1.2 christos } 1006 1.2 christos 1007 1.2 christos AslCompilerSignon (ASL_FILE_DEBUG_OUTPUT); 1008 1.2 christos AslCompilerFileHeader (ASL_FILE_DEBUG_OUTPUT); 1009 1.2 christos } 1010 1.1 jruoho 1011 1.7 christos /* Create/Open a cross-reference output file if asked */ 1012 1.7 christos 1013 1.12 christos if (AslGbl_CrossReferenceOutput) 1014 1.7 christos { 1015 1.7 christos Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_XREF); 1016 1.7 christos if (!Filename) 1017 1.7 christos { 1018 1.7 christos AslCommonError (ASL_ERROR, ASL_MSG_DEBUG_FILENAME, 1019 1.7 christos 0, 0, 0, 0, NULL, NULL); 1020 1.7 christos return (AE_ERROR); 1021 1.7 christos } 1022 1.7 christos 1023 1.7 christos FlOpenFile (ASL_FILE_XREF_OUTPUT, Filename, "w+t"); 1024 1.7 christos 1025 1.7 christos AslCompilerSignon (ASL_FILE_XREF_OUTPUT); 1026 1.7 christos AslCompilerFileHeader (ASL_FILE_XREF_OUTPUT); 1027 1.7 christos } 1028 1.7 christos 1029 1.1 jruoho /* Create/Open a listing output file if asked */ 1030 1.1 jruoho 1031 1.12 christos if (AslGbl_ListingFlag) 1032 1.1 jruoho { 1033 1.1 jruoho Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_LISTING); 1034 1.1 jruoho if (!Filename) 1035 1.1 jruoho { 1036 1.1 jruoho AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME, 1037 1.1 jruoho 0, 0, 0, 0, NULL, NULL); 1038 1.1 jruoho return (AE_ERROR); 1039 1.1 jruoho } 1040 1.1 jruoho 1041 1.1 jruoho /* Open the listing file, text mode */ 1042 1.1 jruoho 1043 1.2 christos FlOpenFile (ASL_FILE_LISTING_OUTPUT, Filename, "w+t"); 1044 1.1 jruoho 1045 1.1 jruoho AslCompilerSignon (ASL_FILE_LISTING_OUTPUT); 1046 1.1 jruoho AslCompilerFileHeader (ASL_FILE_LISTING_OUTPUT); 1047 1.1 jruoho } 1048 1.1 jruoho 1049 1.5 christos /* Create the preprocessor output temp file if preprocessor enabled */ 1050 1.2 christos 1051 1.12 christos if (AslGbl_PreprocessFlag) 1052 1.2 christos { 1053 1.2 christos Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_PREPROCESSOR); 1054 1.2 christos if (!Filename) 1055 1.2 christos { 1056 1.2 christos AslCommonError (ASL_ERROR, ASL_MSG_PREPROCESSOR_FILENAME, 1057 1.2 christos 0, 0, 0, 0, NULL, NULL); 1058 1.2 christos return (AE_ERROR); 1059 1.2 christos } 1060 1.2 christos 1061 1.2 christos FlOpenFile (ASL_FILE_PREPROCESSOR, Filename, "w+t"); 1062 1.2 christos } 1063 1.2 christos 1064 1.5 christos /* 1065 1.5 christos * Create the "user" preprocessor output file if -li flag set. 1066 1.5 christos * Note, this file contains no embedded #line directives. 1067 1.5 christos */ 1068 1.12 christos if (AslGbl_PreprocessorOutputFlag) 1069 1.5 christos { 1070 1.5 christos Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_PREPROC_USER); 1071 1.5 christos if (!Filename) 1072 1.5 christos { 1073 1.5 christos AslCommonError (ASL_ERROR, ASL_MSG_PREPROCESSOR_FILENAME, 1074 1.5 christos 0, 0, 0, 0, NULL, NULL); 1075 1.5 christos return (AE_ERROR); 1076 1.5 christos } 1077 1.5 christos 1078 1.5 christos FlOpenFile (ASL_FILE_PREPROCESSOR_USER, Filename, "w+t"); 1079 1.5 christos } 1080 1.5 christos 1081 1.2 christos /* All done for data table compiler */ 1082 1.2 christos 1083 1.12 christos if (AslGbl_FileType == ASL_INPUT_TYPE_ASCII_DATA) 1084 1.2 christos { 1085 1.2 christos return (AE_OK); 1086 1.2 christos } 1087 1.2 christos 1088 1.2 christos /* Create/Open a combined source output file */ 1089 1.2 christos 1090 1.2 christos Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_SOURCE); 1091 1.2 christos if (!Filename) 1092 1.2 christos { 1093 1.2 christos AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME, 1094 1.2 christos 0, 0, 0, 0, NULL, NULL); 1095 1.2 christos return (AE_ERROR); 1096 1.2 christos } 1097 1.2 christos 1098 1.2 christos /* 1099 1.2 christos * Open the source output file, binary mode (so that LF does not get 1100 1.2 christos * expanded to CR/LF on some systems, messing up our seek 1101 1.2 christos * calculations.) 1102 1.2 christos */ 1103 1.2 christos FlOpenFile (ASL_FILE_SOURCE_OUTPUT, Filename, "w+b"); 1104 1.2 christos 1105 1.2 christos /* 1106 1.2 christos // TBD: TEMP 1107 1.12 christos // AslCompilerin = AslGbl_Files[ASL_FILE_SOURCE_OUTPUT].Handle; 1108 1.2 christos */ 1109 1.1 jruoho /* Create/Open a assembly code source output file if asked */ 1110 1.1 jruoho 1111 1.12 christos if (AslGbl_AsmOutputFlag) 1112 1.1 jruoho { 1113 1.1 jruoho Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_ASM_SOURCE); 1114 1.1 jruoho if (!Filename) 1115 1.1 jruoho { 1116 1.1 jruoho AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME, 1117 1.1 jruoho 0, 0, 0, 0, NULL, NULL); 1118 1.1 jruoho return (AE_ERROR); 1119 1.1 jruoho } 1120 1.1 jruoho 1121 1.1 jruoho /* Open the assembly code source file, text mode */ 1122 1.1 jruoho 1123 1.2 christos FlOpenFile (ASL_FILE_ASM_SOURCE_OUTPUT, Filename, "w+t"); 1124 1.1 jruoho 1125 1.1 jruoho AslCompilerSignon (ASL_FILE_ASM_SOURCE_OUTPUT); 1126 1.1 jruoho AslCompilerFileHeader (ASL_FILE_ASM_SOURCE_OUTPUT); 1127 1.1 jruoho } 1128 1.1 jruoho 1129 1.1 jruoho /* Create/Open a C code source output file if asked */ 1130 1.1 jruoho 1131 1.12 christos if (AslGbl_C_OutputFlag) 1132 1.1 jruoho { 1133 1.1 jruoho Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_C_SOURCE); 1134 1.1 jruoho if (!Filename) 1135 1.1 jruoho { 1136 1.1 jruoho AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME, 1137 1.1 jruoho 0, 0, 0, 0, NULL, NULL); 1138 1.1 jruoho return (AE_ERROR); 1139 1.1 jruoho } 1140 1.1 jruoho 1141 1.1 jruoho /* Open the C code source file, text mode */ 1142 1.1 jruoho 1143 1.2 christos FlOpenFile (ASL_FILE_C_SOURCE_OUTPUT, Filename, "w+t"); 1144 1.1 jruoho 1145 1.1 jruoho FlPrintFile (ASL_FILE_C_SOURCE_OUTPUT, "/*\n"); 1146 1.1 jruoho AslCompilerSignon (ASL_FILE_C_SOURCE_OUTPUT); 1147 1.1 jruoho AslCompilerFileHeader (ASL_FILE_C_SOURCE_OUTPUT); 1148 1.1 jruoho } 1149 1.1 jruoho 1150 1.2 christos /* Create/Open a C code source output file for the offset table if asked */ 1151 1.2 christos 1152 1.12 christos if (AslGbl_C_OffsetTableFlag) 1153 1.2 christos { 1154 1.2 christos Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_C_OFFSET); 1155 1.2 christos if (!Filename) 1156 1.2 christos { 1157 1.2 christos AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME, 1158 1.2 christos 0, 0, 0, 0, NULL, NULL); 1159 1.2 christos return (AE_ERROR); 1160 1.2 christos } 1161 1.2 christos 1162 1.2 christos /* Open the C code source file, text mode */ 1163 1.2 christos 1164 1.2 christos FlOpenFile (ASL_FILE_C_OFFSET_OUTPUT, Filename, "w+t"); 1165 1.2 christos 1166 1.2 christos FlPrintFile (ASL_FILE_C_OFFSET_OUTPUT, "/*\n"); 1167 1.2 christos AslCompilerSignon (ASL_FILE_C_OFFSET_OUTPUT); 1168 1.2 christos AslCompilerFileHeader (ASL_FILE_C_OFFSET_OUTPUT); 1169 1.2 christos } 1170 1.2 christos 1171 1.1 jruoho /* Create/Open a assembly include output file if asked */ 1172 1.1 jruoho 1173 1.12 christos if (AslGbl_AsmIncludeOutputFlag) 1174 1.1 jruoho { 1175 1.1 jruoho Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_ASM_INCLUDE); 1176 1.1 jruoho if (!Filename) 1177 1.1 jruoho { 1178 1.1 jruoho AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME, 1179 1.1 jruoho 0, 0, 0, 0, NULL, NULL); 1180 1.1 jruoho return (AE_ERROR); 1181 1.1 jruoho } 1182 1.1 jruoho 1183 1.1 jruoho /* Open the assembly include file, text mode */ 1184 1.1 jruoho 1185 1.2 christos FlOpenFile (ASL_FILE_ASM_INCLUDE_OUTPUT, Filename, "w+t"); 1186 1.1 jruoho 1187 1.1 jruoho AslCompilerSignon (ASL_FILE_ASM_INCLUDE_OUTPUT); 1188 1.1 jruoho AslCompilerFileHeader (ASL_FILE_ASM_INCLUDE_OUTPUT); 1189 1.1 jruoho } 1190 1.1 jruoho 1191 1.1 jruoho /* Create/Open a C include output file if asked */ 1192 1.1 jruoho 1193 1.12 christos if (AslGbl_C_IncludeOutputFlag) 1194 1.1 jruoho { 1195 1.1 jruoho Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_C_INCLUDE); 1196 1.1 jruoho if (!Filename) 1197 1.1 jruoho { 1198 1.1 jruoho AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME, 1199 1.1 jruoho 0, 0, 0, 0, NULL, NULL); 1200 1.1 jruoho return (AE_ERROR); 1201 1.1 jruoho } 1202 1.1 jruoho 1203 1.1 jruoho /* Open the C include file, text mode */ 1204 1.1 jruoho 1205 1.2 christos FlOpenFile (ASL_FILE_C_INCLUDE_OUTPUT, Filename, "w+t"); 1206 1.1 jruoho 1207 1.1 jruoho FlPrintFile (ASL_FILE_C_INCLUDE_OUTPUT, "/*\n"); 1208 1.1 jruoho AslCompilerSignon (ASL_FILE_C_INCLUDE_OUTPUT); 1209 1.1 jruoho AslCompilerFileHeader (ASL_FILE_C_INCLUDE_OUTPUT); 1210 1.1 jruoho } 1211 1.1 jruoho 1212 1.1 jruoho /* Create a namespace output file if asked */ 1213 1.1 jruoho 1214 1.12 christos if (AslGbl_NsOutputFlag) 1215 1.1 jruoho { 1216 1.1 jruoho Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_NAMESPACE); 1217 1.1 jruoho if (!Filename) 1218 1.1 jruoho { 1219 1.1 jruoho AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME, 1220 1.1 jruoho 0, 0, 0, 0, NULL, NULL); 1221 1.1 jruoho return (AE_ERROR); 1222 1.1 jruoho } 1223 1.1 jruoho 1224 1.1 jruoho /* Open the namespace file, text mode */ 1225 1.1 jruoho 1226 1.2 christos FlOpenFile (ASL_FILE_NAMESPACE_OUTPUT, Filename, "w+t"); 1227 1.1 jruoho 1228 1.1 jruoho AslCompilerSignon (ASL_FILE_NAMESPACE_OUTPUT); 1229 1.1 jruoho AslCompilerFileHeader (ASL_FILE_NAMESPACE_OUTPUT); 1230 1.1 jruoho } 1231 1.1 jruoho 1232 1.9 christos /* Create a debug file for the converter */ 1233 1.9 christos 1234 1.9 christos if (AcpiGbl_DebugAslConversion) 1235 1.9 christos { 1236 1.9 christos Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_CONVERT_DEBUG); 1237 1.9 christos if (!Filename) 1238 1.9 christos { 1239 1.9 christos AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME, 1240 1.9 christos 0, 0, 0, 0, NULL, NULL); 1241 1.9 christos return (AE_ERROR); 1242 1.9 christos } 1243 1.9 christos 1244 1.9 christos /* Open the converter debug file, text mode */ 1245 1.9 christos 1246 1.9 christos FlOpenFile (ASL_FILE_CONV_DEBUG_OUTPUT, Filename, "w+t"); 1247 1.9 christos 1248 1.9 christos AslCompilerSignon (ASL_FILE_CONV_DEBUG_OUTPUT); 1249 1.9 christos AslCompilerFileHeader (ASL_FILE_CONV_DEBUG_OUTPUT); 1250 1.9 christos 1251 1.12 christos AcpiGbl_ConvDebugFile = AslGbl_Files[ASL_FILE_CONV_DEBUG_OUTPUT].Handle; 1252 1.9 christos } 1253 1.9 christos 1254 1.1 jruoho return (AE_OK); 1255 1.1 jruoho } 1256 1.1 jruoho 1257 1.1 jruoho 1258 1.1 jruoho #ifdef ACPI_OBSOLETE_FUNCTIONS 1259 1.1 jruoho /******************************************************************************* 1260 1.1 jruoho * 1261 1.1 jruoho * FUNCTION: FlParseInputPathname 1262 1.1 jruoho * 1263 1.1 jruoho * PARAMETERS: InputFilename - The user-specified ASL source file to be 1264 1.1 jruoho * compiled 1265 1.1 jruoho * 1266 1.1 jruoho * RETURN: Status 1267 1.1 jruoho * 1268 1.1 jruoho * DESCRIPTION: Split the input path into a directory and filename part 1269 1.1 jruoho * 1) Directory part used to open include files 1270 1.1 jruoho * 2) Filename part used to generate output filenames 1271 1.1 jruoho * 1272 1.1 jruoho ******************************************************************************/ 1273 1.1 jruoho 1274 1.1 jruoho ACPI_STATUS 1275 1.1 jruoho FlParseInputPathname ( 1276 1.1 jruoho char *InputFilename) 1277 1.1 jruoho { 1278 1.1 jruoho char *Substring; 1279 1.1 jruoho 1280 1.1 jruoho 1281 1.1 jruoho if (!InputFilename) 1282 1.1 jruoho { 1283 1.1 jruoho return (AE_OK); 1284 1.1 jruoho } 1285 1.1 jruoho 1286 1.1 jruoho /* Get the path to the input filename's directory */ 1287 1.1 jruoho 1288 1.12 christos AslGbl_DirectoryPath = strdup (InputFilename); 1289 1.12 christos if (!AslGbl_DirectoryPath) 1290 1.1 jruoho { 1291 1.1 jruoho return (AE_NO_MEMORY); 1292 1.1 jruoho } 1293 1.1 jruoho 1294 1.12 christos Substring = strrchr (AslGbl_DirectoryPath, '\\'); 1295 1.1 jruoho if (!Substring) 1296 1.1 jruoho { 1297 1.12 christos Substring = strrchr (AslGbl_DirectoryPath, '/'); 1298 1.1 jruoho if (!Substring) 1299 1.1 jruoho { 1300 1.12 christos Substring = strrchr (AslGbl_DirectoryPath, ':'); 1301 1.1 jruoho } 1302 1.1 jruoho } 1303 1.1 jruoho 1304 1.1 jruoho if (!Substring) 1305 1.1 jruoho { 1306 1.12 christos AslGbl_DirectoryPath[0] = 0; 1307 1.12 christos if (AslGbl_UseDefaultAmlFilename) 1308 1.1 jruoho { 1309 1.12 christos AslGbl_OutputFilenamePrefix = strdup (InputFilename); 1310 1.1 jruoho } 1311 1.1 jruoho } 1312 1.1 jruoho else 1313 1.1 jruoho { 1314 1.12 christos if (AslGbl_UseDefaultAmlFilename) 1315 1.1 jruoho { 1316 1.12 christos AslGbl_OutputFilenamePrefix = strdup (Substring + 1); 1317 1.1 jruoho } 1318 1.1 jruoho *(Substring+1) = 0; 1319 1.1 jruoho } 1320 1.1 jruoho 1321 1.12 christos UtConvertBackslashes (AslGbl_OutputFilenamePrefix); 1322 1.1 jruoho return (AE_OK); 1323 1.1 jruoho } 1324 1.1 jruoho #endif 1325