aslfiles.c revision 245582
1/****************************************************************************** 2 * 3 * Module Name: aslfiles - File support functions 4 * 5 *****************************************************************************/ 6 7/* 8 * Copyright (C) 2000 - 2013, 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 52FILE * 53FlOpenIncludeWithPrefix ( 54 char *PrefixDir, 55 char *Filename); 56 57 58#ifdef ACPI_OBSOLETE_FUNCTIONS 59ACPI_STATUS 60FlParseInputPathname ( 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 77void 78FlSetLineNumber ( 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 102void 103FlSetFilename ( 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 Gbl_Files[ASL_FILE_INPUT].Filename = Filename; 111} 112 113 114/******************************************************************************* 115 * 116 * FUNCTION: FlAddIncludeDirectory 117 * 118 * PARAMETERS: Dir - Directory pathname string 119 * 120 * RETURN: None 121 * 122 * DESCRIPTION: Add a directory the list of include prefix directories. 123 * 124 ******************************************************************************/ 125 126void 127FlAddIncludeDirectory ( 128 char *Dir) 129{ 130 ASL_INCLUDE_DIR *NewDir; 131 ASL_INCLUDE_DIR *NextDir; 132 ASL_INCLUDE_DIR *PrevDir = NULL; 133 UINT32 NeedsSeparator = 0; 134 size_t DirLength; 135 136 137 DirLength = strlen (Dir); 138 if (!DirLength) 139 { 140 return; 141 } 142 143 /* Make sure that the pathname ends with a path separator */ 144 145 if ((Dir[DirLength-1] != '/') && 146 (Dir[DirLength-1] != '\\')) 147 { 148 NeedsSeparator = 1; 149 } 150 151 NewDir = ACPI_ALLOCATE_ZEROED (sizeof (ASL_INCLUDE_DIR)); 152 NewDir->Dir = ACPI_ALLOCATE (DirLength + 1 + NeedsSeparator); 153 strcpy (NewDir->Dir, Dir); 154 if (NeedsSeparator) 155 { 156 strcat (NewDir->Dir, "/"); 157 } 158 159 /* 160 * Preserve command line ordering of -I options by adding new elements 161 * at the end of the list 162 */ 163 NextDir = Gbl_IncludeDirList; 164 while (NextDir) 165 { 166 PrevDir = NextDir; 167 NextDir = NextDir->Next; 168 } 169 170 if (PrevDir) 171 { 172 PrevDir->Next = NewDir; 173 } 174 else 175 { 176 Gbl_IncludeDirList = NewDir; 177 } 178} 179 180 181/******************************************************************************* 182 * 183 * FUNCTION: FlMergePathnames 184 * 185 * PARAMETERS: PrefixDir - Prefix directory pathname. Can be NULL or 186 * a zero length string. 187 * FilePathname - The include filename from the source ASL. 188 * 189 * RETURN: Merged pathname string 190 * 191 * DESCRIPTION: Merge two pathnames that (probably) have common elements, to 192 * arrive at a minimal length string. Merge can occur if the 193 * FilePathname is relative to the PrefixDir. 194 * 195 ******************************************************************************/ 196 197char * 198FlMergePathnames ( 199 char *PrefixDir, 200 char *FilePathname) 201{ 202 char *CommonPath; 203 char *Pathname; 204 char *LastElement; 205 206 207 DbgPrint (ASL_PARSE_OUTPUT, "Include: Prefix path - \"%s\"\n" 208 "Include: FilePathname - \"%s\"\n", 209 PrefixDir, FilePathname); 210 211 /* 212 * If there is no prefix directory or if the file pathname is absolute, 213 * just return the original file pathname 214 */ 215 if (!PrefixDir || (!*PrefixDir) || 216 (*FilePathname == '/') || 217 (FilePathname[1] == ':')) 218 { 219 Pathname = ACPI_ALLOCATE (strlen (FilePathname) + 1); 220 strcpy (Pathname, FilePathname); 221 goto ConvertBackslashes; 222 } 223 224 /* Need a local copy of the prefix directory path */ 225 226 CommonPath = ACPI_ALLOCATE (strlen (PrefixDir) + 1); 227 strcpy (CommonPath, PrefixDir); 228 229 /* 230 * Walk forward through the file path, and simultaneously backward 231 * through the prefix directory path until there are no more 232 * relative references at the start of the file path. 233 */ 234 while (*FilePathname && (!strncmp (FilePathname, "../", 3))) 235 { 236 /* Remove last element of the prefix directory path */ 237 238 LastElement = strrchr (CommonPath, '/'); 239 if (!LastElement) 240 { 241 goto ConcatenatePaths; 242 } 243 244 *LastElement = 0; /* Terminate CommonPath string */ 245 FilePathname += 3; /* Point to next path element */ 246 } 247 248 /* 249 * Remove the last element of the prefix directory path (it is the same as 250 * the first element of the file pathname), and build the final merged 251 * pathname. 252 */ 253 LastElement = strrchr (CommonPath, '/'); 254 if (LastElement) 255 { 256 *LastElement = 0; 257 } 258 259 /* Build the final merged pathname */ 260 261ConcatenatePaths: 262 Pathname = ACPI_ALLOCATE_ZEROED (strlen (CommonPath) + strlen (FilePathname) + 2); 263 if (LastElement && *CommonPath) 264 { 265 strcpy (Pathname, CommonPath); 266 strcat (Pathname, "/"); 267 } 268 strcat (Pathname, FilePathname); 269 ACPI_FREE (CommonPath); 270 271 /* Convert all backslashes to normal slashes */ 272 273ConvertBackslashes: 274 UtConvertBackslashes (Pathname); 275 276 DbgPrint (ASL_PARSE_OUTPUT, "Include: Merged Pathname - \"%s\"\n", 277 Pathname); 278 return (Pathname); 279} 280 281 282/******************************************************************************* 283 * 284 * FUNCTION: FlOpenIncludeWithPrefix 285 * 286 * PARAMETERS: PrefixDir - Prefix directory pathname. Can be a zero 287 * length string. 288 * Filename - The include filename from the source ASL. 289 * 290 * RETURN: Valid file descriptor if successful. Null otherwise. 291 * 292 * DESCRIPTION: Open an include file and push it on the input file stack. 293 * 294 ******************************************************************************/ 295 296FILE * 297FlOpenIncludeWithPrefix ( 298 char *PrefixDir, 299 char *Filename) 300{ 301 FILE *IncludeFile; 302 char *Pathname; 303 304 305 /* Build the full pathname to the file */ 306 307 Pathname = FlMergePathnames (PrefixDir, Filename); 308 309 DbgPrint (ASL_PARSE_OUTPUT, "Include: Opening file - \"%s\"\n\n", 310 Pathname); 311 312 /* Attempt to open the file, push if successful */ 313 314 IncludeFile = fopen (Pathname, "r"); 315 if (!IncludeFile) 316 { 317 fprintf (stderr, "Could not open include file %s\n", Pathname); 318 ACPI_FREE (Pathname); 319 return (NULL); 320 } 321 322 /* Push the include file on the open input file stack */ 323 324 AslPushInputFileStack (IncludeFile, Pathname); 325 return (IncludeFile); 326} 327 328 329/******************************************************************************* 330 * 331 * FUNCTION: FlOpenIncludeFile 332 * 333 * PARAMETERS: Op - Parse node for the INCLUDE ASL statement 334 * 335 * RETURN: None. 336 * 337 * DESCRIPTION: Open an include file and push it on the input file stack. 338 * 339 ******************************************************************************/ 340 341void 342FlOpenIncludeFile ( 343 ACPI_PARSE_OBJECT *Op) 344{ 345 FILE *IncludeFile; 346 ASL_INCLUDE_DIR *NextDir; 347 348 349 /* Op must be valid */ 350 351 if (!Op) 352 { 353 AslCommonError (ASL_ERROR, ASL_MSG_INCLUDE_FILE_OPEN, 354 Gbl_CurrentLineNumber, Gbl_LogicalLineNumber, 355 Gbl_InputByteCount, Gbl_CurrentColumn, 356 Gbl_Files[ASL_FILE_INPUT].Filename, " - Null parse node"); 357 358 return; 359 } 360 361 /* 362 * Flush out the "include ()" statement on this line, start 363 * the actual include file on the next line 364 */ 365 AslResetCurrentLineBuffer (); 366 FlPrintFile (ASL_FILE_SOURCE_OUTPUT, "\n"); 367 Gbl_CurrentLineOffset++; 368 369 370 /* Attempt to open the include file */ 371 372 /* If the file specifies an absolute path, just open it */ 373 374 if ((Op->Asl.Value.String[0] == '/') || 375 (Op->Asl.Value.String[0] == '\\') || 376 (Op->Asl.Value.String[1] == ':')) 377 { 378 IncludeFile = FlOpenIncludeWithPrefix ("", Op->Asl.Value.String); 379 if (!IncludeFile) 380 { 381 goto ErrorExit; 382 } 383 return; 384 } 385 386 /* 387 * The include filename is not an absolute path. 388 * 389 * First, search for the file within the "local" directory -- meaning 390 * the same directory that contains the source file. 391 * 392 * Construct the file pathname from the global directory name. 393 */ 394 IncludeFile = FlOpenIncludeWithPrefix (Gbl_DirectoryPath, Op->Asl.Value.String); 395 if (IncludeFile) 396 { 397 return; 398 } 399 400 /* 401 * Second, search for the file within the (possibly multiple) directories 402 * specified by the -I option on the command line. 403 */ 404 NextDir = Gbl_IncludeDirList; 405 while (NextDir) 406 { 407 IncludeFile = FlOpenIncludeWithPrefix (NextDir->Dir, Op->Asl.Value.String); 408 if (IncludeFile) 409 { 410 return; 411 } 412 413 NextDir = NextDir->Next; 414 } 415 416 /* We could not open the include file after trying very hard */ 417 418ErrorExit: 419 sprintf (MsgBuffer, "%s, %s", Op->Asl.Value.String, strerror (errno)); 420 AslError (ASL_ERROR, ASL_MSG_INCLUDE_FILE_OPEN, Op, MsgBuffer); 421} 422 423 424/******************************************************************************* 425 * 426 * FUNCTION: FlOpenInputFile 427 * 428 * PARAMETERS: InputFilename - The user-specified ASL source file to be 429 * compiled 430 * 431 * RETURN: Status 432 * 433 * DESCRIPTION: Open the specified input file, and save the directory path to 434 * the file so that include files can be opened in 435 * the same directory. 436 * 437 ******************************************************************************/ 438 439ACPI_STATUS 440FlOpenInputFile ( 441 char *InputFilename) 442{ 443 444 /* Open the input ASL file, text mode */ 445 446 FlOpenFile (ASL_FILE_INPUT, InputFilename, "rt"); 447 AslCompilerin = Gbl_Files[ASL_FILE_INPUT].Handle; 448 449 return (AE_OK); 450} 451 452 453/******************************************************************************* 454 * 455 * FUNCTION: FlOpenAmlOutputFile 456 * 457 * PARAMETERS: FilenamePrefix - The user-specified ASL source file 458 * 459 * RETURN: Status 460 * 461 * DESCRIPTION: Create the output filename (*.AML) and open the file. The file 462 * is created in the same directory as the parent input file. 463 * 464 ******************************************************************************/ 465 466ACPI_STATUS 467FlOpenAmlOutputFile ( 468 char *FilenamePrefix) 469{ 470 char *Filename; 471 472 473 /* Output filename usually comes from the ASL itself */ 474 475 Filename = Gbl_Files[ASL_FILE_AML_OUTPUT].Filename; 476 if (!Filename) 477 { 478 /* Create the output AML filename */ 479 480 Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_AML_CODE); 481 if (!Filename) 482 { 483 AslCommonError (ASL_ERROR, ASL_MSG_OUTPUT_FILENAME, 484 0, 0, 0, 0, NULL, NULL); 485 return (AE_ERROR); 486 } 487 } 488 489 /* Open the output AML file in binary mode */ 490 491 FlOpenFile (ASL_FILE_AML_OUTPUT, Filename, "w+b"); 492 return (AE_OK); 493} 494 495 496/******************************************************************************* 497 * 498 * FUNCTION: FlOpenMiscOutputFiles 499 * 500 * PARAMETERS: FilenamePrefix - The user-specified ASL source file 501 * 502 * RETURN: Status 503 * 504 * DESCRIPTION: Create and open the various output files needed, depending on 505 * the command line options 506 * 507 ******************************************************************************/ 508 509ACPI_STATUS 510FlOpenMiscOutputFiles ( 511 char *FilenamePrefix) 512{ 513 char *Filename; 514 515 516 /* Create/Open a hex output file if asked */ 517 518 if (Gbl_HexOutputFlag) 519 { 520 Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_HEX_DUMP); 521 if (!Filename) 522 { 523 AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME, 524 0, 0, 0, 0, NULL, NULL); 525 return (AE_ERROR); 526 } 527 528 /* Open the hex file, text mode */ 529 530 FlOpenFile (ASL_FILE_HEX_OUTPUT, Filename, "w+t"); 531 532 AslCompilerSignon (ASL_FILE_HEX_OUTPUT); 533 AslCompilerFileHeader (ASL_FILE_HEX_OUTPUT); 534 } 535 536 /* Create/Open a debug output file if asked */ 537 538 if (Gbl_DebugFlag) 539 { 540 Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_DEBUG); 541 if (!Filename) 542 { 543 AslCommonError (ASL_ERROR, ASL_MSG_DEBUG_FILENAME, 544 0, 0, 0, 0, NULL, NULL); 545 return (AE_ERROR); 546 } 547 548 /* Open the debug file as STDERR, text mode */ 549 550 /* TBD: hide this behind a FlReopenFile function */ 551 552 Gbl_Files[ASL_FILE_DEBUG_OUTPUT].Filename = Filename; 553 Gbl_Files[ASL_FILE_DEBUG_OUTPUT].Handle = 554 freopen (Filename, "w+t", stderr); 555 556 if (!Gbl_Files[ASL_FILE_DEBUG_OUTPUT].Handle) 557 { 558 AslCommonError (ASL_ERROR, ASL_MSG_DEBUG_FILENAME, 559 0, 0, 0, 0, NULL, NULL); 560 return (AE_ERROR); 561 } 562 563 AslCompilerSignon (ASL_FILE_DEBUG_OUTPUT); 564 AslCompilerFileHeader (ASL_FILE_DEBUG_OUTPUT); 565 } 566 567 /* Create/Open a listing output file if asked */ 568 569 if (Gbl_ListingFlag) 570 { 571 Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_LISTING); 572 if (!Filename) 573 { 574 AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME, 575 0, 0, 0, 0, NULL, NULL); 576 return (AE_ERROR); 577 } 578 579 /* Open the listing file, text mode */ 580 581 FlOpenFile (ASL_FILE_LISTING_OUTPUT, Filename, "w+t"); 582 583 AslCompilerSignon (ASL_FILE_LISTING_OUTPUT); 584 AslCompilerFileHeader (ASL_FILE_LISTING_OUTPUT); 585 } 586 587 /* Create the preprocessor output file if preprocessor enabled */ 588 589 if (Gbl_PreprocessFlag) 590 { 591 Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_PREPROCESSOR); 592 if (!Filename) 593 { 594 AslCommonError (ASL_ERROR, ASL_MSG_PREPROCESSOR_FILENAME, 595 0, 0, 0, 0, NULL, NULL); 596 return (AE_ERROR); 597 } 598 599 FlOpenFile (ASL_FILE_PREPROCESSOR, Filename, "w+t"); 600 } 601 602 /* All done for data table compiler */ 603 604 if (Gbl_FileType == ASL_INPUT_TYPE_ASCII_DATA) 605 { 606 return (AE_OK); 607 } 608 609 /* Create/Open a combined source output file */ 610 611 Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_SOURCE); 612 if (!Filename) 613 { 614 AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME, 615 0, 0, 0, 0, NULL, NULL); 616 return (AE_ERROR); 617 } 618 619 /* 620 * Open the source output file, binary mode (so that LF does not get 621 * expanded to CR/LF on some systems, messing up our seek 622 * calculations.) 623 */ 624 FlOpenFile (ASL_FILE_SOURCE_OUTPUT, Filename, "w+b"); 625 626/* 627// TBD: TEMP 628// AslCompilerin = Gbl_Files[ASL_FILE_SOURCE_OUTPUT].Handle; 629*/ 630 /* Create/Open a assembly code source output file if asked */ 631 632 if (Gbl_AsmOutputFlag) 633 { 634 Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_ASM_SOURCE); 635 if (!Filename) 636 { 637 AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME, 638 0, 0, 0, 0, NULL, NULL); 639 return (AE_ERROR); 640 } 641 642 /* Open the assembly code source file, text mode */ 643 644 FlOpenFile (ASL_FILE_ASM_SOURCE_OUTPUT, Filename, "w+t"); 645 646 AslCompilerSignon (ASL_FILE_ASM_SOURCE_OUTPUT); 647 AslCompilerFileHeader (ASL_FILE_ASM_SOURCE_OUTPUT); 648 } 649 650 /* Create/Open a C code source output file if asked */ 651 652 if (Gbl_C_OutputFlag) 653 { 654 Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_C_SOURCE); 655 if (!Filename) 656 { 657 AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME, 658 0, 0, 0, 0, NULL, NULL); 659 return (AE_ERROR); 660 } 661 662 /* Open the C code source file, text mode */ 663 664 FlOpenFile (ASL_FILE_C_SOURCE_OUTPUT, Filename, "w+t"); 665 666 FlPrintFile (ASL_FILE_C_SOURCE_OUTPUT, "/*\n"); 667 AslCompilerSignon (ASL_FILE_C_SOURCE_OUTPUT); 668 AslCompilerFileHeader (ASL_FILE_C_SOURCE_OUTPUT); 669 } 670 671 /* Create/Open a assembly include output file if asked */ 672 673 if (Gbl_AsmIncludeOutputFlag) 674 { 675 Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_ASM_INCLUDE); 676 if (!Filename) 677 { 678 AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME, 679 0, 0, 0, 0, NULL, NULL); 680 return (AE_ERROR); 681 } 682 683 /* Open the assembly include file, text mode */ 684 685 FlOpenFile (ASL_FILE_ASM_INCLUDE_OUTPUT, Filename, "w+t"); 686 687 AslCompilerSignon (ASL_FILE_ASM_INCLUDE_OUTPUT); 688 AslCompilerFileHeader (ASL_FILE_ASM_INCLUDE_OUTPUT); 689 } 690 691 /* Create/Open a C include output file if asked */ 692 693 if (Gbl_C_IncludeOutputFlag) 694 { 695 Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_C_INCLUDE); 696 if (!Filename) 697 { 698 AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME, 699 0, 0, 0, 0, NULL, NULL); 700 return (AE_ERROR); 701 } 702 703 /* Open the C include file, text mode */ 704 705 FlOpenFile (ASL_FILE_C_INCLUDE_OUTPUT, Filename, "w+t"); 706 707 FlPrintFile (ASL_FILE_C_INCLUDE_OUTPUT, "/*\n"); 708 AslCompilerSignon (ASL_FILE_C_INCLUDE_OUTPUT); 709 AslCompilerFileHeader (ASL_FILE_C_INCLUDE_OUTPUT); 710 } 711 712 /* Create a namespace output file if asked */ 713 714 if (Gbl_NsOutputFlag) 715 { 716 Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_NAMESPACE); 717 if (!Filename) 718 { 719 AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME, 720 0, 0, 0, 0, NULL, NULL); 721 return (AE_ERROR); 722 } 723 724 /* Open the namespace file, text mode */ 725 726 FlOpenFile (ASL_FILE_NAMESPACE_OUTPUT, Filename, "w+t"); 727 728 AslCompilerSignon (ASL_FILE_NAMESPACE_OUTPUT); 729 AslCompilerFileHeader (ASL_FILE_NAMESPACE_OUTPUT); 730 } 731 732 return (AE_OK); 733} 734 735 736#ifdef ACPI_OBSOLETE_FUNCTIONS 737/******************************************************************************* 738 * 739 * FUNCTION: FlParseInputPathname 740 * 741 * PARAMETERS: InputFilename - The user-specified ASL source file to be 742 * compiled 743 * 744 * RETURN: Status 745 * 746 * DESCRIPTION: Split the input path into a directory and filename part 747 * 1) Directory part used to open include files 748 * 2) Filename part used to generate output filenames 749 * 750 ******************************************************************************/ 751 752ACPI_STATUS 753FlParseInputPathname ( 754 char *InputFilename) 755{ 756 char *Substring; 757 758 759 if (!InputFilename) 760 { 761 return (AE_OK); 762 } 763 764 /* Get the path to the input filename's directory */ 765 766 Gbl_DirectoryPath = strdup (InputFilename); 767 if (!Gbl_DirectoryPath) 768 { 769 return (AE_NO_MEMORY); 770 } 771 772 Substring = strrchr (Gbl_DirectoryPath, '\\'); 773 if (!Substring) 774 { 775 Substring = strrchr (Gbl_DirectoryPath, '/'); 776 if (!Substring) 777 { 778 Substring = strrchr (Gbl_DirectoryPath, ':'); 779 } 780 } 781 782 if (!Substring) 783 { 784 Gbl_DirectoryPath[0] = 0; 785 if (Gbl_UseDefaultAmlFilename) 786 { 787 Gbl_OutputFilenamePrefix = strdup (InputFilename); 788 } 789 } 790 else 791 { 792 if (Gbl_UseDefaultAmlFilename) 793 { 794 Gbl_OutputFilenamePrefix = strdup (Substring + 1); 795 } 796 *(Substring+1) = 0; 797 } 798 799 return (AE_OK); 800} 801#endif 802