1 /****************************************************************************** 2 * 3 * Module Name: aslfiles - File support functions 4 * 5 *****************************************************************************/ 6 7 /* 8 * Copyright (C) 2000 - 2015, Intel Corp. 9 * All rights reserved. 10 * 11 * Redistribution and use in source and binary forms, with or without 12 * modification, are permitted provided that the following conditions 13 * are met: 14 * 1. Redistributions of source code must retain the above copyright 15 * notice, this list of conditions, and the following disclaimer, 16 * without modification. 17 * 2. Redistributions in binary form must reproduce at minimum a disclaimer 18 * substantially similar to the "NO WARRANTY" disclaimer below 19 * ("Disclaimer") and any redistribution must be conditioned upon 20 * including a substantially similar Disclaimer requirement for further 21 * binary redistribution. 22 * 3. Neither the names of the above-listed copyright holders nor the names 23 * of any contributors may be used to endorse or promote products derived 24 * from this software without specific prior written permission. 25 * 26 * Alternatively, this software may be distributed under the terms of the 27 * GNU General Public License ("GPL") version 2 as published by the Free 28 * Software Foundation. 29 * 30 * NO WARRANTY 31 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 32 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 33 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR 34 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 35 * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 36 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 37 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 38 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 39 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 40 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 41 * POSSIBILITY OF SUCH DAMAGES. 42 */ 43 44 #include <contrib/dev/acpica/compiler/aslcompiler.h> 45 #include <contrib/dev/acpica/include/acapps.h> 46 47 #define _COMPONENT ACPI_COMPILER 48 ACPI_MODULE_NAME ("aslfiles") 49 50 /* Local prototypes */ 51 52 FILE * 53 FlOpenIncludeWithPrefix ( 54 char *PrefixDir, 55 char *Filename); 56 57 58 #ifdef ACPI_OBSOLETE_FUNCTIONS 59 ACPI_STATUS 60 FlParseInputPathname ( 61 char *InputFilename); 62 #endif 63 64 65 /******************************************************************************* 66 * 67 * FUNCTION: FlSetLineNumber 68 * 69 * PARAMETERS: Op - Parse node for the LINE asl statement 70 * 71 * RETURN: None. 72 * 73 * DESCRIPTION: Set the current line number 74 * 75 ******************************************************************************/ 76 77 void 78 FlSetLineNumber ( 79 UINT32 LineNumber) 80 { 81 82 DbgPrint (ASL_PARSE_OUTPUT, "\n#line: New line number %u (old %u)\n", 83 LineNumber, Gbl_LogicalLineNumber); 84 85 Gbl_CurrentLineNumber = LineNumber; 86 Gbl_LogicalLineNumber = LineNumber; 87 } 88 89 90 /******************************************************************************* 91 * 92 * FUNCTION: FlSetFilename 93 * 94 * PARAMETERS: Op - Parse node for the LINE asl statement 95 * 96 * RETURN: None. 97 * 98 * DESCRIPTION: Set the current filename 99 * 100 ******************************************************************************/ 101 102 void 103 FlSetFilename ( 104 char *Filename) 105 { 106 107 DbgPrint (ASL_PARSE_OUTPUT, "\n#line: New filename %s (old %s)\n", 108 Filename, Gbl_Files[ASL_FILE_INPUT].Filename); 109 110 /* No need to free any existing filename */ 111 112 Gbl_Files[ASL_FILE_INPUT].Filename = Filename; 113 } 114 115 116 /******************************************************************************* 117 * 118 * FUNCTION: FlAddIncludeDirectory 119 * 120 * PARAMETERS: Dir - Directory pathname string 121 * 122 * RETURN: None 123 * 124 * DESCRIPTION: Add a directory the list of include prefix directories. 125 * 126 ******************************************************************************/ 127 128 void 129 FlAddIncludeDirectory ( 130 char *Dir) 131 { 132 ASL_INCLUDE_DIR *NewDir; 133 ASL_INCLUDE_DIR *NextDir; 134 ASL_INCLUDE_DIR *PrevDir = NULL; 135 UINT32 NeedsSeparator = 0; 136 size_t DirLength; 137 138 139 DirLength = strlen (Dir); 140 if (!DirLength) 141 { 142 return; 143 } 144 145 /* Make sure that the pathname ends with a path separator */ 146 147 if ((Dir[DirLength-1] != '/') && 148 (Dir[DirLength-1] != '\\')) 149 { 150 NeedsSeparator = 1; 151 } 152 153 NewDir = ACPI_ALLOCATE_ZEROED (sizeof (ASL_INCLUDE_DIR)); 154 NewDir->Dir = ACPI_ALLOCATE (DirLength + 1 + NeedsSeparator); 155 strcpy (NewDir->Dir, Dir); 156 if (NeedsSeparator) 157 { 158 strcat (NewDir->Dir, "/"); 159 } 160 161 /* 162 * Preserve command line ordering of -I options by adding new elements 163 * at the end of the list 164 */ 165 NextDir = Gbl_IncludeDirList; 166 while (NextDir) 167 { 168 PrevDir = NextDir; 169 NextDir = NextDir->Next; 170 } 171 172 if (PrevDir) 173 { 174 PrevDir->Next = NewDir; 175 } 176 else 177 { 178 Gbl_IncludeDirList = NewDir; 179 } 180 } 181 182 183 /******************************************************************************* 184 * 185 * FUNCTION: FlMergePathnames 186 * 187 * PARAMETERS: PrefixDir - Prefix directory pathname. Can be NULL or 188 * a zero length string. 189 * FilePathname - The include filename from the source ASL. 190 * 191 * RETURN: Merged pathname string 192 * 193 * DESCRIPTION: Merge two pathnames that (probably) have common elements, to 194 * arrive at a minimal length string. Merge can occur if the 195 * FilePathname is relative to the PrefixDir. 196 * 197 ******************************************************************************/ 198 199 char * 200 FlMergePathnames ( 201 char *PrefixDir, 202 char *FilePathname) 203 { 204 char *CommonPath; 205 char *Pathname; 206 char *LastElement; 207 208 209 DbgPrint (ASL_PARSE_OUTPUT, "Include: Prefix path - \"%s\"\n" 210 "Include: FilePathname - \"%s\"\n", 211 PrefixDir, FilePathname); 212 213 /* 214 * If there is no prefix directory or if the file pathname is absolute, 215 * just return the original file pathname 216 */ 217 if (!PrefixDir || (!*PrefixDir) || 218 (*FilePathname == '/') || 219 (FilePathname[1] == ':')) 220 { 221 Pathname = UtStringCacheCalloc (strlen (FilePathname) + 1); 222 strcpy (Pathname, FilePathname); 223 goto ConvertBackslashes; 224 } 225 226 /* Need a local copy of the prefix directory path */ 227 228 CommonPath = UtStringCacheCalloc (strlen (PrefixDir) + 1); 229 strcpy (CommonPath, PrefixDir); 230 231 /* 232 * Walk forward through the file path, and simultaneously backward 233 * through the prefix directory path until there are no more 234 * relative references at the start of the file path. 235 */ 236 while (*FilePathname && (!strncmp (FilePathname, "../", 3))) 237 { 238 /* Remove last element of the prefix directory path */ 239 240 LastElement = strrchr (CommonPath, '/'); 241 if (!LastElement) 242 { 243 goto ConcatenatePaths; 244 } 245 246 *LastElement = 0; /* Terminate CommonPath string */ 247 FilePathname += 3; /* Point to next path element */ 248 } 249 250 /* 251 * Remove the last element of the prefix directory path (it is the same as 252 * the first element of the file pathname), and build the final merged 253 * pathname. 254 */ 255 LastElement = strrchr (CommonPath, '/'); 256 if (LastElement) 257 { 258 *LastElement = 0; 259 } 260 261 /* Build the final merged pathname */ 262 263 ConcatenatePaths: 264 Pathname = UtStringCacheCalloc (strlen (CommonPath) + strlen (FilePathname) + 2); 265 if (LastElement && *CommonPath) 266 { 267 strcpy (Pathname, CommonPath); 268 strcat (Pathname, "/"); 269 } 270 strcat (Pathname, FilePathname); 271 272 /* Convert all backslashes to normal slashes */ 273 274 ConvertBackslashes: 275 UtConvertBackslashes (Pathname); 276 277 DbgPrint (ASL_PARSE_OUTPUT, "Include: Merged Pathname - \"%s\"\n", 278 Pathname); 279 return (Pathname); 280 } 281 282 283 /******************************************************************************* 284 * 285 * FUNCTION: FlOpenIncludeWithPrefix 286 * 287 * PARAMETERS: PrefixDir - Prefix directory pathname. Can be a zero 288 * length string. 289 * Filename - The include filename from the source ASL. 290 * 291 * RETURN: Valid file descriptor if successful. Null otherwise. 292 * 293 * DESCRIPTION: Open an include file and push it on the input file stack. 294 * 295 ******************************************************************************/ 296 297 FILE * 298 FlOpenIncludeWithPrefix ( 299 char *PrefixDir, 300 char *Filename) 301 { 302 FILE *IncludeFile; 303 char *Pathname; 304 305 306 /* Build the full pathname to the file */ 307 308 Pathname = FlMergePathnames (PrefixDir, Filename); 309 310 DbgPrint (ASL_PARSE_OUTPUT, "Include: Opening file - \"%s\"\n\n", 311 Pathname); 312 313 /* Attempt to open the file, push if successful */ 314 315 IncludeFile = fopen (Pathname, "r"); 316 if (!IncludeFile) 317 { 318 fprintf (stderr, "Could not open include file %s\n", Pathname); 319 ACPI_FREE (Pathname); 320 return (NULL); 321 } 322 323 /* Push the include file on the open input file stack */ 324 325 AslPushInputFileStack (IncludeFile, Pathname); 326 return (IncludeFile); 327 } 328 329 330 /******************************************************************************* 331 * 332 * FUNCTION: FlOpenIncludeFile 333 * 334 * PARAMETERS: Op - Parse node for the INCLUDE ASL statement 335 * 336 * RETURN: None. 337 * 338 * DESCRIPTION: Open an include file and push it on the input file stack. 339 * 340 ******************************************************************************/ 341 342 void 343 FlOpenIncludeFile ( 344 ACPI_PARSE_OBJECT *Op) 345 { 346 FILE *IncludeFile; 347 ASL_INCLUDE_DIR *NextDir; 348 349 350 /* Op must be valid */ 351 352 if (!Op) 353 { 354 AslCommonError (ASL_ERROR, ASL_MSG_INCLUDE_FILE_OPEN, 355 Gbl_CurrentLineNumber, Gbl_LogicalLineNumber, 356 Gbl_InputByteCount, Gbl_CurrentColumn, 357 Gbl_Files[ASL_FILE_INPUT].Filename, " - Null parse node"); 358 359 return; 360 } 361 362 /* 363 * Flush out the "include ()" statement on this line, start 364 * the actual include file on the next line 365 */ 366 AslResetCurrentLineBuffer (); 367 FlPrintFile (ASL_FILE_SOURCE_OUTPUT, "\n"); 368 Gbl_CurrentLineOffset++; 369 370 371 /* Attempt to open the include file */ 372 373 /* If the file specifies an absolute path, just open it */ 374 375 if ((Op->Asl.Value.String[0] == '/') || 376 (Op->Asl.Value.String[0] == '\\') || 377 (Op->Asl.Value.String[1] == ':')) 378 { 379 IncludeFile = FlOpenIncludeWithPrefix ("", Op->Asl.Value.String); 380 if (!IncludeFile) 381 { 382 goto ErrorExit; 383 } 384 return; 385 } 386 387 /* 388 * The include filename is not an absolute path. 389 * 390 * First, search for the file within the "local" directory -- meaning 391 * the same directory that contains the source file. 392 * 393 * Construct the file pathname from the global directory name. 394 */ 395 IncludeFile = FlOpenIncludeWithPrefix (Gbl_DirectoryPath, Op->Asl.Value.String); 396 if (IncludeFile) 397 { 398 return; 399 } 400 401 /* 402 * Second, search for the file within the (possibly multiple) directories 403 * specified by the -I option on the command line. 404 */ 405 NextDir = Gbl_IncludeDirList; 406 while (NextDir) 407 { 408 IncludeFile = FlOpenIncludeWithPrefix (NextDir->Dir, Op->Asl.Value.String); 409 if (IncludeFile) 410 { 411 return; 412 } 413 414 NextDir = NextDir->Next; 415 } 416 417 /* We could not open the include file after trying very hard */ 418 419 ErrorExit: 420 sprintf (MsgBuffer, "%s, %s", Op->Asl.Value.String, strerror (errno)); 421 AslError (ASL_ERROR, ASL_MSG_INCLUDE_FILE_OPEN, Op, MsgBuffer); 422 } 423 424 425 /******************************************************************************* 426 * 427 * FUNCTION: FlOpenInputFile 428 * 429 * PARAMETERS: InputFilename - The user-specified ASL source file to be 430 * compiled 431 * 432 * RETURN: Status 433 * 434 * DESCRIPTION: Open the specified input file, and save the directory path to 435 * the file so that include files can be opened in 436 * the same directory. 437 * 438 ******************************************************************************/ 439 440 ACPI_STATUS 441 FlOpenInputFile ( 442 char *InputFilename) 443 { 444 445 /* Open the input ASL file, text mode */ 446 447 FlOpenFile (ASL_FILE_INPUT, InputFilename, "rt"); 448 AslCompilerin = Gbl_Files[ASL_FILE_INPUT].Handle; 449 450 return (AE_OK); 451 } 452 453 454 /******************************************************************************* 455 * 456 * FUNCTION: FlOpenAmlOutputFile 457 * 458 * PARAMETERS: FilenamePrefix - The user-specified ASL source file 459 * 460 * RETURN: Status 461 * 462 * DESCRIPTION: Create the output filename (*.AML) and open the file. The file 463 * is created in the same directory as the parent input file. 464 * 465 ******************************************************************************/ 466 467 ACPI_STATUS 468 FlOpenAmlOutputFile ( 469 char *FilenamePrefix) 470 { 471 char *Filename; 472 473 474 /* Output filename usually comes from the ASL itself */ 475 476 Filename = Gbl_Files[ASL_FILE_AML_OUTPUT].Filename; 477 if (!Filename) 478 { 479 /* Create the output AML filename */ 480 481 Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_AML_CODE); 482 if (!Filename) 483 { 484 AslCommonError (ASL_ERROR, ASL_MSG_OUTPUT_FILENAME, 485 0, 0, 0, 0, NULL, NULL); 486 return (AE_ERROR); 487 } 488 489 Gbl_Files[ASL_FILE_AML_OUTPUT].Filename = Filename; 490 } 491 492 /* Open the output AML file in binary mode */ 493 494 FlOpenFile (ASL_FILE_AML_OUTPUT, Filename, "w+b"); 495 return (AE_OK); 496 } 497 498 499 /******************************************************************************* 500 * 501 * FUNCTION: FlOpenMiscOutputFiles 502 * 503 * PARAMETERS: FilenamePrefix - The user-specified ASL source file 504 * 505 * RETURN: Status 506 * 507 * DESCRIPTION: Create and open the various output files needed, depending on 508 * the command line options 509 * 510 ******************************************************************************/ 511 512 ACPI_STATUS 513 FlOpenMiscOutputFiles ( 514 char *FilenamePrefix) 515 { 516 char *Filename; 517 518 519 /* All done for disassembler */ 520 521 if (Gbl_FileType == ASL_INPUT_TYPE_ACPI_TABLE) 522 { 523 return (AE_OK); 524 } 525 526 /* Create/Open a hex output file if asked */ 527 528 if (Gbl_HexOutputFlag) 529 { 530 Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_HEX_DUMP); 531 if (!Filename) 532 { 533 AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME, 534 0, 0, 0, 0, NULL, NULL); 535 return (AE_ERROR); 536 } 537 538 /* Open the hex file, text mode */ 539 540 FlOpenFile (ASL_FILE_HEX_OUTPUT, Filename, "w+t"); 541 542 AslCompilerSignon (ASL_FILE_HEX_OUTPUT); 543 AslCompilerFileHeader (ASL_FILE_HEX_OUTPUT); 544 } 545 546 /* Create/Open a debug output file if asked */ 547 548 if (Gbl_DebugFlag) 549 { 550 Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_DEBUG); 551 if (!Filename) 552 { 553 AslCommonError (ASL_ERROR, ASL_MSG_DEBUG_FILENAME, 554 0, 0, 0, 0, NULL, NULL); 555 return (AE_ERROR); 556 } 557 558 /* Open the debug file as STDERR, text mode */ 559 560 /* TBD: hide this behind a FlReopenFile function */ 561 562 Gbl_Files[ASL_FILE_DEBUG_OUTPUT].Filename = Filename; 563 Gbl_Files[ASL_FILE_DEBUG_OUTPUT].Handle = 564 freopen (Filename, "w+t", stderr); 565 566 if (!Gbl_Files[ASL_FILE_DEBUG_OUTPUT].Handle) 567 { 568 /* 569 * A problem with freopen is that on error, 570 * we no longer have stderr. 571 */ 572 Gbl_DebugFlag = FALSE; 573 memcpy (stderr, stdout, sizeof (FILE)); 574 FlFileError (ASL_FILE_DEBUG_OUTPUT, ASL_MSG_DEBUG_FILENAME); 575 AslAbort (); 576 } 577 578 AslCompilerSignon (ASL_FILE_DEBUG_OUTPUT); 579 AslCompilerFileHeader (ASL_FILE_DEBUG_OUTPUT); 580 } 581 582 /* Create/Open a listing output file if asked */ 583 584 if (Gbl_ListingFlag) 585 { 586 Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_LISTING); 587 if (!Filename) 588 { 589 AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME, 590 0, 0, 0, 0, NULL, NULL); 591 return (AE_ERROR); 592 } 593 594 /* Open the listing file, text mode */ 595 596 FlOpenFile (ASL_FILE_LISTING_OUTPUT, Filename, "w+t"); 597 598 AslCompilerSignon (ASL_FILE_LISTING_OUTPUT); 599 AslCompilerFileHeader (ASL_FILE_LISTING_OUTPUT); 600 } 601 602 /* Create the preprocessor output file if preprocessor enabled */ 603 604 if (Gbl_PreprocessFlag) 605 { 606 Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_PREPROCESSOR); 607 if (!Filename) 608 { 609 AslCommonError (ASL_ERROR, ASL_MSG_PREPROCESSOR_FILENAME, 610 0, 0, 0, 0, NULL, NULL); 611 return (AE_ERROR); 612 } 613 614 FlOpenFile (ASL_FILE_PREPROCESSOR, Filename, "w+t"); 615 } 616 617 /* All done for data table compiler */ 618 619 if (Gbl_FileType == ASL_INPUT_TYPE_ASCII_DATA) 620 { 621 return (AE_OK); 622 } 623 624 /* Create/Open a combined source output file */ 625 626 Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_SOURCE); 627 if (!Filename) 628 { 629 AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME, 630 0, 0, 0, 0, NULL, NULL); 631 return (AE_ERROR); 632 } 633 634 /* 635 * Open the source output file, binary mode (so that LF does not get 636 * expanded to CR/LF on some systems, messing up our seek 637 * calculations.) 638 */ 639 FlOpenFile (ASL_FILE_SOURCE_OUTPUT, Filename, "w+b"); 640 641 /* 642 // TBD: TEMP 643 // AslCompilerin = Gbl_Files[ASL_FILE_SOURCE_OUTPUT].Handle; 644 */ 645 /* Create/Open a assembly code source output file if asked */ 646 647 if (Gbl_AsmOutputFlag) 648 { 649 Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_ASM_SOURCE); 650 if (!Filename) 651 { 652 AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME, 653 0, 0, 0, 0, NULL, NULL); 654 return (AE_ERROR); 655 } 656 657 /* Open the assembly code source file, text mode */ 658 659 FlOpenFile (ASL_FILE_ASM_SOURCE_OUTPUT, Filename, "w+t"); 660 661 AslCompilerSignon (ASL_FILE_ASM_SOURCE_OUTPUT); 662 AslCompilerFileHeader (ASL_FILE_ASM_SOURCE_OUTPUT); 663 } 664 665 /* Create/Open a C code source output file if asked */ 666 667 if (Gbl_C_OutputFlag) 668 { 669 Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_C_SOURCE); 670 if (!Filename) 671 { 672 AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME, 673 0, 0, 0, 0, NULL, NULL); 674 return (AE_ERROR); 675 } 676 677 /* Open the C code source file, text mode */ 678 679 FlOpenFile (ASL_FILE_C_SOURCE_OUTPUT, Filename, "w+t"); 680 681 FlPrintFile (ASL_FILE_C_SOURCE_OUTPUT, "/*\n"); 682 AslCompilerSignon (ASL_FILE_C_SOURCE_OUTPUT); 683 AslCompilerFileHeader (ASL_FILE_C_SOURCE_OUTPUT); 684 } 685 686 /* Create/Open a C code source output file for the offset table if asked */ 687 688 if (Gbl_C_OffsetTableFlag) 689 { 690 Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_C_OFFSET); 691 if (!Filename) 692 { 693 AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME, 694 0, 0, 0, 0, NULL, NULL); 695 return (AE_ERROR); 696 } 697 698 /* Open the C code source file, text mode */ 699 700 FlOpenFile (ASL_FILE_C_OFFSET_OUTPUT, Filename, "w+t"); 701 702 FlPrintFile (ASL_FILE_C_OFFSET_OUTPUT, "/*\n"); 703 AslCompilerSignon (ASL_FILE_C_OFFSET_OUTPUT); 704 AslCompilerFileHeader (ASL_FILE_C_OFFSET_OUTPUT); 705 } 706 707 /* Create/Open a assembly include output file if asked */ 708 709 if (Gbl_AsmIncludeOutputFlag) 710 { 711 Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_ASM_INCLUDE); 712 if (!Filename) 713 { 714 AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME, 715 0, 0, 0, 0, NULL, NULL); 716 return (AE_ERROR); 717 } 718 719 /* Open the assembly include file, text mode */ 720 721 FlOpenFile (ASL_FILE_ASM_INCLUDE_OUTPUT, Filename, "w+t"); 722 723 AslCompilerSignon (ASL_FILE_ASM_INCLUDE_OUTPUT); 724 AslCompilerFileHeader (ASL_FILE_ASM_INCLUDE_OUTPUT); 725 } 726 727 /* Create/Open a C include output file if asked */ 728 729 if (Gbl_C_IncludeOutputFlag) 730 { 731 Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_C_INCLUDE); 732 if (!Filename) 733 { 734 AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME, 735 0, 0, 0, 0, NULL, NULL); 736 return (AE_ERROR); 737 } 738 739 /* Open the C include file, text mode */ 740 741 FlOpenFile (ASL_FILE_C_INCLUDE_OUTPUT, Filename, "w+t"); 742 743 FlPrintFile (ASL_FILE_C_INCLUDE_OUTPUT, "/*\n"); 744 AslCompilerSignon (ASL_FILE_C_INCLUDE_OUTPUT); 745 AslCompilerFileHeader (ASL_FILE_C_INCLUDE_OUTPUT); 746 } 747 748 /* Create a namespace output file if asked */ 749 750 if (Gbl_NsOutputFlag) 751 { 752 Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_NAMESPACE); 753 if (!Filename) 754 { 755 AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME, 756 0, 0, 0, 0, NULL, NULL); 757 return (AE_ERROR); 758 } 759 760 /* Open the namespace file, text mode */ 761 762 FlOpenFile (ASL_FILE_NAMESPACE_OUTPUT, Filename, "w+t"); 763 764 AslCompilerSignon (ASL_FILE_NAMESPACE_OUTPUT); 765 AslCompilerFileHeader (ASL_FILE_NAMESPACE_OUTPUT); 766 } 767 768 /* Create/Open a map file if requested */ 769 770 if (Gbl_MapfileFlag) 771 { 772 Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_MAP); 773 if (!Filename) 774 { 775 AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME, 776 0, 0, 0, 0, NULL, NULL); 777 return (AE_ERROR); 778 } 779 780 /* Open the hex file, text mode (closed at compiler exit) */ 781 782 FlOpenFile (ASL_FILE_MAP_OUTPUT, Filename, "w+t"); 783 784 AslCompilerSignon (ASL_FILE_MAP_OUTPUT); 785 AslCompilerFileHeader (ASL_FILE_MAP_OUTPUT); 786 } 787 788 return (AE_OK); 789 } 790 791 792 #ifdef ACPI_OBSOLETE_FUNCTIONS 793 /******************************************************************************* 794 * 795 * FUNCTION: FlParseInputPathname 796 * 797 * PARAMETERS: InputFilename - The user-specified ASL source file to be 798 * compiled 799 * 800 * RETURN: Status 801 * 802 * DESCRIPTION: Split the input path into a directory and filename part 803 * 1) Directory part used to open include files 804 * 2) Filename part used to generate output filenames 805 * 806 ******************************************************************************/ 807 808 ACPI_STATUS 809 FlParseInputPathname ( 810 char *InputFilename) 811 { 812 char *Substring; 813 814 815 if (!InputFilename) 816 { 817 return (AE_OK); 818 } 819 820 /* Get the path to the input filename's directory */ 821 822 Gbl_DirectoryPath = strdup (InputFilename); 823 if (!Gbl_DirectoryPath) 824 { 825 return (AE_NO_MEMORY); 826 } 827 828 Substring = strrchr (Gbl_DirectoryPath, '\\'); 829 if (!Substring) 830 { 831 Substring = strrchr (Gbl_DirectoryPath, '/'); 832 if (!Substring) 833 { 834 Substring = strrchr (Gbl_DirectoryPath, ':'); 835 } 836 } 837 838 if (!Substring) 839 { 840 Gbl_DirectoryPath[0] = 0; 841 if (Gbl_UseDefaultAmlFilename) 842 { 843 Gbl_OutputFilenamePrefix = strdup (InputFilename); 844 } 845 } 846 else 847 { 848 if (Gbl_UseDefaultAmlFilename) 849 { 850 Gbl_OutputFilenamePrefix = strdup (Substring + 1); 851 } 852 *(Substring+1) = 0; 853 } 854 855 UtConvertBackslashes (Gbl_OutputFilenamePrefix); 856 return (AE_OK); 857 } 858 #endif 859