aslfiles.c revision 249112
155714Skris/****************************************************************************** 255714Skris * 355714Skris * Module Name: aslfiles - File support functions 455714Skris * 555714Skris *****************************************************************************/ 655714Skris 755714Skris/* 855714Skris * Copyright (C) 2000 - 2013, Intel Corp. 9280304Sjkim * All rights reserved. 1055714Skris * 1155714Skris * Redistribution and use in source and binary forms, with or without 1255714Skris * modification, are permitted provided that the following conditions 1355714Skris * are met: 1455714Skris * 1. Redistributions of source code must retain the above copyright 1555714Skris * notice, this list of conditions, and the following disclaimer, 1655714Skris * without modification. 1755714Skris * 2. Redistributions in binary form must reproduce at minimum a disclaimer 1855714Skris * substantially similar to the "NO WARRANTY" disclaimer below 1955714Skris * ("Disclaimer") and any redistribution must be conditioned upon 2055714Skris * including a substantially similar Disclaimer requirement for further 2155714Skris * binary redistribution. 2255714Skris * 3. Neither the names of the above-listed copyright holders nor the names 2355714Skris * of any contributors may be used to endorse or promote products derived 2455714Skris * from this software without specific prior written permission. 2555714Skris * 2655714Skris * Alternatively, this software may be distributed under the terms of the 2755714Skris * GNU General Public License ("GPL") version 2 as published by the Free 2855714Skris * Software Foundation. 2955714Skris * 3055714Skris * NO WARRANTY 3155714Skris * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 3255714Skris * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 3355714Skris * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR 3455714Skris * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 3555714Skris * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 3655714Skris * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 3755714Skris * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 3855714Skris * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 3955714Skris * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 4055714Skris * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 4155714Skris * POSSIBILITY OF SUCH DAMAGES. 4255714Skris */ 4355714Skris 4455714Skris#include <contrib/dev/acpica/compiler/aslcompiler.h> 4555714Skris#include <contrib/dev/acpica/include/acapps.h> 4655714Skris 4755714Skris#define _COMPONENT ACPI_COMPILER 4855714Skris ACPI_MODULE_NAME ("aslfiles") 4955714Skris 5055714Skris/* Local prototypes */ 5155714Skris 5255714SkrisFILE * 5355714SkrisFlOpenIncludeWithPrefix ( 5455714Skris char *PrefixDir, 5555714Skris char *Filename); 56280304Sjkim 5755714Skris 58280304Sjkim#ifdef ACPI_OBSOLETE_FUNCTIONS 5955714SkrisACPI_STATUS 60273149SjkimFlParseInputPathname ( 61273149Sjkim char *InputFilename); 62273149Sjkim#endif 63273149Sjkim 64280304Sjkim 65280304Sjkim/******************************************************************************* 66194206Ssimon * 67280304Sjkim * FUNCTION: FlSetLineNumber 68194206Ssimon * 69280304Sjkim * PARAMETERS: Op - Parse node for the LINE asl statement 70280304Sjkim * 71280304Sjkim * RETURN: None. 72280304Sjkim * 73238405Sjkim * DESCRIPTION: Set the current line number 74238405Sjkim * 75280304Sjkim ******************************************************************************/ 76238405Sjkim 77238405Sjkimvoid 78280304SjkimFlSetLineNumber ( 79194206Ssimon UINT32 LineNumber) 80194206Ssimon{ 81280304Sjkim 82238405Sjkim DbgPrint (ASL_PARSE_OUTPUT, "\n#line: New line number %u (old %u)\n", 83238405Sjkim LineNumber, Gbl_LogicalLineNumber); 84280304Sjkim 85238405Sjkim Gbl_CurrentLineNumber = LineNumber; 86280304Sjkim Gbl_LogicalLineNumber = LineNumber; 87194206Ssimon} 88280304Sjkim 89280304Sjkim 9068651Skris/******************************************************************************* 91280304Sjkim * 9268651Skris * FUNCTION: FlSetFilename 9355714Skris * 94238405Sjkim * PARAMETERS: Op - Parse node for the LINE asl statement 9568651Skris * 96280304Sjkim * RETURN: None. 97238405Sjkim * 98238405Sjkim * DESCRIPTION: Set the current filename 99238405Sjkim * 100238405Sjkim ******************************************************************************/ 10155714Skris 102280304Sjkimvoid 103280304SjkimFlSetFilename ( 10455714Skris char *Filename) 105280304Sjkim{ 106280304Sjkim 107238405Sjkim DbgPrint (ASL_PARSE_OUTPUT, "\n#line: New filename %s (old %s)\n", 108238405Sjkim Filename, Gbl_Files[ASL_FILE_INPUT].Filename); 109238405Sjkim 110238405Sjkim Gbl_Files[ASL_FILE_INPUT].Filename = Filename; 111238405Sjkim} 112238405Sjkim 113238405Sjkim 114238405Sjkim/******************************************************************************* 115280304Sjkim * 116238405Sjkim * FUNCTION: FlAddIncludeDirectory 117238405Sjkim * 118238405Sjkim * PARAMETERS: Dir - Directory pathname string 119238405Sjkim * 120238405Sjkim * RETURN: None 121238405Sjkim * 122238405Sjkim * DESCRIPTION: Add a directory the list of include prefix directories. 123280304Sjkim * 124280304Sjkim ******************************************************************************/ 125280304Sjkim 126280304Sjkimvoid 127280304SjkimFlAddIncludeDirectory ( 128280304Sjkim char *Dir) 129238405Sjkim{ 130238405Sjkim ASL_INCLUDE_DIR *NewDir; 131238405Sjkim ASL_INCLUDE_DIR *NextDir; 132238405Sjkim ASL_INCLUDE_DIR *PrevDir = NULL; 133280304Sjkim UINT32 NeedsSeparator = 0; 134280304Sjkim size_t DirLength; 135280304Sjkim 136280304Sjkim 137238405Sjkim DirLength = strlen (Dir); 138238405Sjkim if (!DirLength) 139238405Sjkim { 140280304Sjkim return; 141280304Sjkim } 142280304Sjkim 143280304Sjkim /* Make sure that the pathname ends with a path separator */ 144280304Sjkim 145280304Sjkim if ((Dir[DirLength-1] != '/') && 146280304Sjkim (Dir[DirLength-1] != '\\')) 147280304Sjkim { 148280304Sjkim NeedsSeparator = 1; 149280304Sjkim } 150280304Sjkim 151280304Sjkim NewDir = ACPI_ALLOCATE_ZEROED (sizeof (ASL_INCLUDE_DIR)); 152280304Sjkim NewDir->Dir = ACPI_ALLOCATE (DirLength + 1 + NeedsSeparator); 153280304Sjkim strcpy (NewDir->Dir, Dir); 154280304Sjkim if (NeedsSeparator) 155280304Sjkim { 156280304Sjkim strcat (NewDir->Dir, "/"); 157280304Sjkim } 158280304Sjkim 159280304Sjkim /* 160280304Sjkim * Preserve command line ordering of -I options by adding new elements 161280304Sjkim * at the end of the list 162280304Sjkim */ 163280304Sjkim NextDir = Gbl_IncludeDirList; 164280304Sjkim while (NextDir) 165280304Sjkim { 166280304Sjkim PrevDir = NextDir; 167280304Sjkim NextDir = NextDir->Next; 168280304Sjkim } 169280304Sjkim 170280304Sjkim if (PrevDir) 171280304Sjkim { 172280304Sjkim PrevDir->Next = NewDir; 173280304Sjkim } 174280304Sjkim else 175280304Sjkim { 176280304Sjkim Gbl_IncludeDirList = NewDir; 177280304Sjkim } 178280304Sjkim} 179280304Sjkim 180280304Sjkim 181280304Sjkim/******************************************************************************* 182280304Sjkim * 183280304Sjkim * FUNCTION: FlMergePathnames 184280304Sjkim * 185280304Sjkim * PARAMETERS: PrefixDir - Prefix directory pathname. Can be NULL or 186280304Sjkim * a zero length string. 187280304Sjkim * FilePathname - The include filename from the source ASL. 188280304Sjkim * 189238405Sjkim * RETURN: Merged pathname string 190280304Sjkim * 191280304Sjkim * DESCRIPTION: Merge two pathnames that (probably) have common elements, to 192280304Sjkim * arrive at a minimal length string. Merge can occur if the 193280304Sjkim * FilePathname is relative to the PrefixDir. 194280304Sjkim * 195280304Sjkim ******************************************************************************/ 196238405Sjkim 197280304Sjkimchar * 198280304SjkimFlMergePathnames ( 199280304Sjkim char *PrefixDir, 200280304Sjkim char *FilePathname) 201280304Sjkim{ 202280304Sjkim char *CommonPath; 203280304Sjkim char *Pathname; 204280304Sjkim char *LastElement; 205280304Sjkim 206280304Sjkim 207280304Sjkim DbgPrint (ASL_PARSE_OUTPUT, "Include: Prefix path - \"%s\"\n" 208280304Sjkim "Include: FilePathname - \"%s\"\n", 209280304Sjkim PrefixDir, FilePathname); 210280304Sjkim 211280304Sjkim /* 212280304Sjkim * If there is no prefix directory or if the file pathname is absolute, 213280304Sjkim * just return the original file pathname 214280304Sjkim */ 215280304Sjkim if (!PrefixDir || (!*PrefixDir) || 216280304Sjkim (*FilePathname == '/') || 217280304Sjkim (FilePathname[1] == ':')) 218280304Sjkim { 219280304Sjkim Pathname = ACPI_ALLOCATE (strlen (FilePathname) + 1); 220280304Sjkim strcpy (Pathname, FilePathname); 221280304Sjkim goto ConvertBackslashes; 222280304Sjkim } 223280304Sjkim 224280304Sjkim /* Need a local copy of the prefix directory path */ 225280304Sjkim 226280304Sjkim CommonPath = ACPI_ALLOCATE (strlen (PrefixDir) + 1); 227280304Sjkim strcpy (CommonPath, PrefixDir); 228280304Sjkim 229280304Sjkim /* 230280304Sjkim * Walk forward through the file path, and simultaneously backward 231280304Sjkim * through the prefix directory path until there are no more 232280304Sjkim * relative references at the start of the file path. 233280304Sjkim */ 234280304Sjkim while (*FilePathname && (!strncmp (FilePathname, "../", 3))) 235280304Sjkim { 236280304Sjkim /* Remove last element of the prefix directory path */ 237280304Sjkim 238280304Sjkim LastElement = strrchr (CommonPath, '/'); 239280304Sjkim if (!LastElement) 240280304Sjkim { 241280304Sjkim goto ConcatenatePaths; 242280304Sjkim } 243280304Sjkim 244280304Sjkim *LastElement = 0; /* Terminate CommonPath string */ 245280304Sjkim FilePathname += 3; /* Point to next path element */ 246280304Sjkim } 247280304Sjkim 248280304Sjkim /* 249280304Sjkim * Remove the last element of the prefix directory path (it is the same as 250280304Sjkim * the first element of the file pathname), and build the final merged 251280304Sjkim * pathname. 252280304Sjkim */ 253280304Sjkim LastElement = strrchr (CommonPath, '/'); 254280304Sjkim if (LastElement) 255280304Sjkim { 256280304Sjkim *LastElement = 0; 257280304Sjkim } 258280304Sjkim 259280304Sjkim /* Build the final merged pathname */ 260280304Sjkim 261280304SjkimConcatenatePaths: 262280304Sjkim Pathname = ACPI_ALLOCATE_ZEROED (strlen (CommonPath) + strlen (FilePathname) + 2); 263280304Sjkim if (LastElement && *CommonPath) 264280304Sjkim { 265280304Sjkim strcpy (Pathname, CommonPath); 266280304Sjkim strcat (Pathname, "/"); 267280304Sjkim } 268280304Sjkim strcat (Pathname, FilePathname); 269280304Sjkim ACPI_FREE (CommonPath); 270280304Sjkim 271280304Sjkim /* Convert all backslashes to normal slashes */ 272280304Sjkim 273280304SjkimConvertBackslashes: 274280304Sjkim UtConvertBackslashes (Pathname); 275280304Sjkim 276280304Sjkim DbgPrint (ASL_PARSE_OUTPUT, "Include: Merged Pathname - \"%s\"\n", 277280304Sjkim Pathname); 278280304Sjkim return (Pathname); 279280304Sjkim} 280280304Sjkim 281280304Sjkim 282280304Sjkim/******************************************************************************* 283280304Sjkim * 284280304Sjkim * FUNCTION: FlOpenIncludeWithPrefix 285280304Sjkim * 286280304Sjkim * PARAMETERS: PrefixDir - Prefix directory pathname. Can be a zero 287280304Sjkim * length string. 288280304Sjkim * Filename - The include filename from the source ASL. 289280304Sjkim * 290280304Sjkim * RETURN: Valid file descriptor if successful. Null otherwise. 291280304Sjkim * 292280304Sjkim * DESCRIPTION: Open an include file and push it on the input file stack. 293280304Sjkim * 294280304Sjkim ******************************************************************************/ 295280304Sjkim 296280304SjkimFILE * 297280304SjkimFlOpenIncludeWithPrefix ( 298280304Sjkim char *PrefixDir, 299280304Sjkim char *Filename) 300280304Sjkim{ 301280304Sjkim FILE *IncludeFile; 302280304Sjkim char *Pathname; 303280304Sjkim 304280304Sjkim 305280304Sjkim /* Build the full pathname to the file */ 306280304Sjkim 307280304Sjkim Pathname = FlMergePathnames (PrefixDir, Filename); 308280304Sjkim 309280304Sjkim DbgPrint (ASL_PARSE_OUTPUT, "Include: Opening file - \"%s\"\n\n", 310280304Sjkim Pathname); 311280304Sjkim 312280304Sjkim /* Attempt to open the file, push if successful */ 313280304Sjkim 314280304Sjkim IncludeFile = fopen (Pathname, "r"); 315280304Sjkim if (!IncludeFile) 316280304Sjkim { 317280304Sjkim fprintf (stderr, "Could not open include file %s\n", Pathname); 318280304Sjkim ACPI_FREE (Pathname); 319280304Sjkim return (NULL); 320280304Sjkim } 321280304Sjkim 322280304Sjkim /* Push the include file on the open input file stack */ 323280304Sjkim 324280304Sjkim AslPushInputFileStack (IncludeFile, Pathname); 325280304Sjkim return (IncludeFile); 326280304Sjkim} 327280304Sjkim 328280304Sjkim 329280304Sjkim/******************************************************************************* 330280304Sjkim * 331280304Sjkim * FUNCTION: FlOpenIncludeFile 332280304Sjkim * 333280304Sjkim * PARAMETERS: Op - Parse node for the INCLUDE ASL statement 334280304Sjkim * 335280304Sjkim * RETURN: None. 336280304Sjkim * 337280304Sjkim * DESCRIPTION: Open an include file and push it on the input file stack. 338280304Sjkim * 339280304Sjkim ******************************************************************************/ 340280304Sjkim 341280304Sjkimvoid 342280304SjkimFlOpenIncludeFile ( 343280304Sjkim ACPI_PARSE_OBJECT *Op) 344280304Sjkim{ 345280304Sjkim FILE *IncludeFile; 346280304Sjkim ASL_INCLUDE_DIR *NextDir; 347280304Sjkim 348280304Sjkim 349280304Sjkim /* Op must be valid */ 350280304Sjkim 351280304Sjkim if (!Op) 352280304Sjkim { 353280304Sjkim AslCommonError (ASL_ERROR, ASL_MSG_INCLUDE_FILE_OPEN, 354280304Sjkim Gbl_CurrentLineNumber, Gbl_LogicalLineNumber, 355280304Sjkim Gbl_InputByteCount, Gbl_CurrentColumn, 356280304Sjkim Gbl_Files[ASL_FILE_INPUT].Filename, " - Null parse node"); 357280304Sjkim 358280304Sjkim return; 359280304Sjkim } 360280304Sjkim 361280304Sjkim /* 362280304Sjkim * Flush out the "include ()" statement on this line, start 363280304Sjkim * the actual include file on the next line 364280304Sjkim */ 365280304Sjkim AslResetCurrentLineBuffer (); 366280304Sjkim FlPrintFile (ASL_FILE_SOURCE_OUTPUT, "\n"); 367280304Sjkim Gbl_CurrentLineOffset++; 368280304Sjkim 369280304Sjkim 370280304Sjkim /* Attempt to open the include file */ 371280304Sjkim 372280304Sjkim /* If the file specifies an absolute path, just open it */ 373280304Sjkim 374280304Sjkim if ((Op->Asl.Value.String[0] == '/') || 375280304Sjkim (Op->Asl.Value.String[0] == '\\') || 376280304Sjkim (Op->Asl.Value.String[1] == ':')) 377280304Sjkim { 378280304Sjkim IncludeFile = FlOpenIncludeWithPrefix ("", Op->Asl.Value.String); 379280304Sjkim if (!IncludeFile) 380280304Sjkim { 381280304Sjkim goto ErrorExit; 382280304Sjkim } 383280304Sjkim return; 384280304Sjkim } 385280304Sjkim 386280304Sjkim /* 387280304Sjkim * The include filename is not an absolute path. 388280304Sjkim * 389280304Sjkim * First, search for the file within the "local" directory -- meaning 390280304Sjkim * the same directory that contains the source file. 391280304Sjkim * 392280304Sjkim * Construct the file pathname from the global directory name. 393280304Sjkim */ 394280304Sjkim IncludeFile = FlOpenIncludeWithPrefix (Gbl_DirectoryPath, Op->Asl.Value.String); 395280304Sjkim if (IncludeFile) 396280304Sjkim { 397280304Sjkim return; 398280304Sjkim } 399280304Sjkim 400280304Sjkim /* 401280304Sjkim * Second, search for the file within the (possibly multiple) directories 402280304Sjkim * specified by the -I option on the command line. 403280304Sjkim */ 404280304Sjkim NextDir = Gbl_IncludeDirList; 405280304Sjkim while (NextDir) 406280304Sjkim { 407280304Sjkim IncludeFile = FlOpenIncludeWithPrefix (NextDir->Dir, Op->Asl.Value.String); 408280304Sjkim if (IncludeFile) 409280304Sjkim { 410280304Sjkim return; 411280304Sjkim } 412280304Sjkim 413280304Sjkim NextDir = NextDir->Next; 414280304Sjkim } 415280304Sjkim 416280304Sjkim /* We could not open the include file after trying very hard */ 417280304Sjkim 418280304SjkimErrorExit: 419280304Sjkim sprintf (MsgBuffer, "%s, %s", Op->Asl.Value.String, strerror (errno)); 420280304Sjkim AslError (ASL_ERROR, ASL_MSG_INCLUDE_FILE_OPEN, Op, MsgBuffer); 421280304Sjkim} 422280304Sjkim 423280304Sjkim 424280304Sjkim/******************************************************************************* 425280304Sjkim * 426280304Sjkim * FUNCTION: FlOpenInputFile 427280304Sjkim * 428280304Sjkim * PARAMETERS: InputFilename - The user-specified ASL source file to be 429280304Sjkim * compiled 430280304Sjkim * 431280304Sjkim * RETURN: Status 432280304Sjkim * 433280304Sjkim * DESCRIPTION: Open the specified input file, and save the directory path to 434280304Sjkim * the file so that include files can be opened in 435280304Sjkim * the same directory. 436280304Sjkim * 437280304Sjkim ******************************************************************************/ 438280304Sjkim 439280304SjkimACPI_STATUS 440280304SjkimFlOpenInputFile ( 441280304Sjkim char *InputFilename) 442280304Sjkim{ 443280304Sjkim 444280304Sjkim /* Open the input ASL file, text mode */ 445280304Sjkim 446280304Sjkim FlOpenFile (ASL_FILE_INPUT, InputFilename, "rt"); 447280304Sjkim AslCompilerin = Gbl_Files[ASL_FILE_INPUT].Handle; 448280304Sjkim 449280304Sjkim return (AE_OK); 450280304Sjkim} 451280304Sjkim 452280304Sjkim 453280304Sjkim/******************************************************************************* 454280304Sjkim * 455280304Sjkim * FUNCTION: FlOpenAmlOutputFile 456280304Sjkim * 457280304Sjkim * PARAMETERS: FilenamePrefix - The user-specified ASL source file 458280304Sjkim * 459280304Sjkim * RETURN: Status 460280304Sjkim * 461280304Sjkim * DESCRIPTION: Create the output filename (*.AML) and open the file. The file 462280304Sjkim * is created in the same directory as the parent input file. 463280304Sjkim * 464280304Sjkim ******************************************************************************/ 465280304Sjkim 466280304SjkimACPI_STATUS 467280304SjkimFlOpenAmlOutputFile ( 468280304Sjkim char *FilenamePrefix) 469280304Sjkim{ 470280304Sjkim char *Filename; 471280304Sjkim 472280304Sjkim 473280304Sjkim /* Output filename usually comes from the ASL itself */ 474280304Sjkim 475280304Sjkim Filename = Gbl_Files[ASL_FILE_AML_OUTPUT].Filename; 476280304Sjkim if (!Filename) 477280304Sjkim { 478280304Sjkim /* Create the output AML filename */ 479280304Sjkim 480280304Sjkim Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_AML_CODE); 481280304Sjkim if (!Filename) 482280304Sjkim { 483280304Sjkim AslCommonError (ASL_ERROR, ASL_MSG_OUTPUT_FILENAME, 484280304Sjkim 0, 0, 0, 0, NULL, NULL); 485280304Sjkim return (AE_ERROR); 486280304Sjkim } 487280304Sjkim } 488280304Sjkim 489280304Sjkim /* Open the output AML file in binary mode */ 490280304Sjkim 491280304Sjkim FlOpenFile (ASL_FILE_AML_OUTPUT, Filename, "w+b"); 492280304Sjkim return (AE_OK); 493280304Sjkim} 494280304Sjkim 495280304Sjkim 496280304Sjkim/******************************************************************************* 497280304Sjkim * 498280304Sjkim * FUNCTION: FlOpenMiscOutputFiles 499280304Sjkim * 500280304Sjkim * PARAMETERS: FilenamePrefix - The user-specified ASL source file 501280304Sjkim * 502280304Sjkim * RETURN: Status 503280304Sjkim * 504280304Sjkim * DESCRIPTION: Create and open the various output files needed, depending on 505280304Sjkim * the command line options 506280304Sjkim * 507280304Sjkim ******************************************************************************/ 508280304Sjkim 509280304SjkimACPI_STATUS 510280304SjkimFlOpenMiscOutputFiles ( 511280304Sjkim char *FilenamePrefix) 512280304Sjkim{ 513280304Sjkim char *Filename; 514280304Sjkim 515280304Sjkim 516280304Sjkim /* All done for disassembler */ 517280304Sjkim 518280304Sjkim if (Gbl_FileType == ASL_INPUT_TYPE_ACPI_TABLE) 519280304Sjkim { 520280304Sjkim return (AE_OK); 521280304Sjkim } 522280304Sjkim 523280304Sjkim /* Create/Open a hex output file if asked */ 524280304Sjkim 525280304Sjkim if (Gbl_HexOutputFlag) 526280304Sjkim { 527280304Sjkim Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_HEX_DUMP); 528280304Sjkim if (!Filename) 529280304Sjkim { 530280304Sjkim AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME, 531280304Sjkim 0, 0, 0, 0, NULL, NULL); 532280304Sjkim return (AE_ERROR); 533280304Sjkim } 534280304Sjkim 535280304Sjkim /* Open the hex file, text mode */ 536280304Sjkim 537280304Sjkim FlOpenFile (ASL_FILE_HEX_OUTPUT, Filename, "w+t"); 538280304Sjkim 539280304Sjkim AslCompilerSignon (ASL_FILE_HEX_OUTPUT); 540280304Sjkim AslCompilerFileHeader (ASL_FILE_HEX_OUTPUT); 541280304Sjkim } 542280304Sjkim 543280304Sjkim /* Create/Open a debug output file if asked */ 544280304Sjkim 545280304Sjkim if (Gbl_DebugFlag) 546280304Sjkim { 547280304Sjkim Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_DEBUG); 548280304Sjkim if (!Filename) 549280304Sjkim { 550280304Sjkim AslCommonError (ASL_ERROR, ASL_MSG_DEBUG_FILENAME, 551280304Sjkim 0, 0, 0, 0, NULL, NULL); 552280304Sjkim return (AE_ERROR); 553280304Sjkim } 554280304Sjkim 555280304Sjkim /* Open the debug file as STDERR, text mode */ 556280304Sjkim 557280304Sjkim /* TBD: hide this behind a FlReopenFile function */ 558280304Sjkim 559280304Sjkim Gbl_Files[ASL_FILE_DEBUG_OUTPUT].Filename = Filename; 560280304Sjkim Gbl_Files[ASL_FILE_DEBUG_OUTPUT].Handle = 561280304Sjkim freopen (Filename, "w+t", stderr); 562280304Sjkim 563280304Sjkim if (!Gbl_Files[ASL_FILE_DEBUG_OUTPUT].Handle) 564280304Sjkim { 565280304Sjkim AslCommonError (ASL_ERROR, ASL_MSG_DEBUG_FILENAME, 566280304Sjkim 0, 0, 0, 0, NULL, NULL); 567280304Sjkim return (AE_ERROR); 568280304Sjkim } 569280304Sjkim 570280304Sjkim AslCompilerSignon (ASL_FILE_DEBUG_OUTPUT); 571280304Sjkim AslCompilerFileHeader (ASL_FILE_DEBUG_OUTPUT); 572280304Sjkim } 573280304Sjkim 574280304Sjkim /* Create/Open a listing output file if asked */ 575280304Sjkim 576280304Sjkim if (Gbl_ListingFlag) 577280304Sjkim { 578280304Sjkim Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_LISTING); 579280304Sjkim if (!Filename) 580280304Sjkim { 581280304Sjkim AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME, 582280304Sjkim 0, 0, 0, 0, NULL, NULL); 583280304Sjkim return (AE_ERROR); 584280304Sjkim } 585280304Sjkim 586280304Sjkim /* Open the listing file, text mode */ 587280304Sjkim 588280304Sjkim FlOpenFile (ASL_FILE_LISTING_OUTPUT, Filename, "w+t"); 589280304Sjkim 590280304Sjkim AslCompilerSignon (ASL_FILE_LISTING_OUTPUT); 591280304Sjkim AslCompilerFileHeader (ASL_FILE_LISTING_OUTPUT); 592280304Sjkim } 593280304Sjkim 594280304Sjkim /* Create the preprocessor output file if preprocessor enabled */ 595280304Sjkim 596280304Sjkim if (Gbl_PreprocessFlag) 597280304Sjkim { 598280304Sjkim Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_PREPROCESSOR); 599280304Sjkim if (!Filename) 600280304Sjkim { 601280304Sjkim AslCommonError (ASL_ERROR, ASL_MSG_PREPROCESSOR_FILENAME, 602280304Sjkim 0, 0, 0, 0, NULL, NULL); 603280304Sjkim return (AE_ERROR); 604280304Sjkim } 605280304Sjkim 606280304Sjkim FlOpenFile (ASL_FILE_PREPROCESSOR, Filename, "w+t"); 607280304Sjkim } 608280304Sjkim 609280304Sjkim /* All done for data table compiler */ 610280304Sjkim 611280304Sjkim if (Gbl_FileType == ASL_INPUT_TYPE_ASCII_DATA) 612280304Sjkim { 613280304Sjkim return (AE_OK); 614280304Sjkim } 615280304Sjkim 616280304Sjkim /* Create/Open a combined source output file */ 617280304Sjkim 618280304Sjkim Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_SOURCE); 619280304Sjkim if (!Filename) 620280304Sjkim { 621280304Sjkim AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME, 622280304Sjkim 0, 0, 0, 0, NULL, NULL); 623280304Sjkim return (AE_ERROR); 624280304Sjkim } 625280304Sjkim 626280304Sjkim /* 627280304Sjkim * Open the source output file, binary mode (so that LF does not get 628280304Sjkim * expanded to CR/LF on some systems, messing up our seek 629280304Sjkim * calculations.) 630280304Sjkim */ 631280304Sjkim FlOpenFile (ASL_FILE_SOURCE_OUTPUT, Filename, "w+b"); 632280304Sjkim 633280304Sjkim/* 634280304Sjkim// TBD: TEMP 635280304Sjkim// AslCompilerin = Gbl_Files[ASL_FILE_SOURCE_OUTPUT].Handle; 636280304Sjkim*/ 637280304Sjkim /* Create/Open a assembly code source output file if asked */ 638280304Sjkim 639280304Sjkim if (Gbl_AsmOutputFlag) 640280304Sjkim { 641280304Sjkim Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_ASM_SOURCE); 642280304Sjkim if (!Filename) 643280304Sjkim { 644280304Sjkim AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME, 645280304Sjkim 0, 0, 0, 0, NULL, NULL); 646280304Sjkim return (AE_ERROR); 647280304Sjkim } 648280304Sjkim 649280304Sjkim /* Open the assembly code source file, text mode */ 650280304Sjkim 651280304Sjkim FlOpenFile (ASL_FILE_ASM_SOURCE_OUTPUT, Filename, "w+t"); 652280304Sjkim 653280304Sjkim AslCompilerSignon (ASL_FILE_ASM_SOURCE_OUTPUT); 654280304Sjkim AslCompilerFileHeader (ASL_FILE_ASM_SOURCE_OUTPUT); 655280304Sjkim } 656280304Sjkim 657280304Sjkim /* Create/Open a C code source output file if asked */ 658280304Sjkim 659280304Sjkim if (Gbl_C_OutputFlag) 660280304Sjkim { 661280304Sjkim Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_C_SOURCE); 662280304Sjkim if (!Filename) 663280304Sjkim { 664280304Sjkim AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME, 665280304Sjkim 0, 0, 0, 0, NULL, NULL); 666280304Sjkim return (AE_ERROR); 667280304Sjkim } 668280304Sjkim 669280304Sjkim /* Open the C code source file, text mode */ 670280304Sjkim 671280304Sjkim FlOpenFile (ASL_FILE_C_SOURCE_OUTPUT, Filename, "w+t"); 672280304Sjkim 673280304Sjkim FlPrintFile (ASL_FILE_C_SOURCE_OUTPUT, "/*\n"); 674280304Sjkim AslCompilerSignon (ASL_FILE_C_SOURCE_OUTPUT); 675280304Sjkim AslCompilerFileHeader (ASL_FILE_C_SOURCE_OUTPUT); 676280304Sjkim } 677280304Sjkim 678280304Sjkim /* Create/Open a C code source output file for the offset table if asked */ 679280304Sjkim 680280304Sjkim if (Gbl_C_OffsetTableFlag) 681280304Sjkim { 682280304Sjkim Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_C_OFFSET); 683280304Sjkim if (!Filename) 684280304Sjkim { 685280304Sjkim AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME, 686280304Sjkim 0, 0, 0, 0, NULL, NULL); 687280304Sjkim return (AE_ERROR); 688280304Sjkim } 689280304Sjkim 690280304Sjkim /* Open the C code source file, text mode */ 691280304Sjkim 692280304Sjkim FlOpenFile (ASL_FILE_C_OFFSET_OUTPUT, Filename, "w+t"); 693280304Sjkim 694280304Sjkim FlPrintFile (ASL_FILE_C_OFFSET_OUTPUT, "/*\n"); 695280304Sjkim AslCompilerSignon (ASL_FILE_C_OFFSET_OUTPUT); 696280304Sjkim AslCompilerFileHeader (ASL_FILE_C_OFFSET_OUTPUT); 697280304Sjkim } 698280304Sjkim 699280304Sjkim /* Create/Open a assembly include output file if asked */ 700280304Sjkim 701280304Sjkim if (Gbl_AsmIncludeOutputFlag) 702280304Sjkim { 703280304Sjkim Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_ASM_INCLUDE); 704280304Sjkim if (!Filename) 705280304Sjkim { 706280304Sjkim AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME, 707280304Sjkim 0, 0, 0, 0, NULL, NULL); 708280304Sjkim return (AE_ERROR); 709280304Sjkim } 710280304Sjkim 711280304Sjkim /* Open the assembly include file, text mode */ 712280304Sjkim 713280304Sjkim FlOpenFile (ASL_FILE_ASM_INCLUDE_OUTPUT, Filename, "w+t"); 714280304Sjkim 715280304Sjkim AslCompilerSignon (ASL_FILE_ASM_INCLUDE_OUTPUT); 716280304Sjkim AslCompilerFileHeader (ASL_FILE_ASM_INCLUDE_OUTPUT); 717280304Sjkim } 718280304Sjkim 719280304Sjkim /* Create/Open a C include output file if asked */ 720280304Sjkim 721280304Sjkim if (Gbl_C_IncludeOutputFlag) 722280304Sjkim { 723280304Sjkim Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_C_INCLUDE); 724280304Sjkim if (!Filename) 725280304Sjkim { 726280304Sjkim AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME, 727280304Sjkim 0, 0, 0, 0, NULL, NULL); 728280304Sjkim return (AE_ERROR); 729280304Sjkim } 730280304Sjkim 731280304Sjkim /* Open the C include file, text mode */ 732280304Sjkim 733280304Sjkim FlOpenFile (ASL_FILE_C_INCLUDE_OUTPUT, Filename, "w+t"); 734280304Sjkim 735280304Sjkim FlPrintFile (ASL_FILE_C_INCLUDE_OUTPUT, "/*\n"); 736280304Sjkim AslCompilerSignon (ASL_FILE_C_INCLUDE_OUTPUT); 737280304Sjkim AslCompilerFileHeader (ASL_FILE_C_INCLUDE_OUTPUT); 738280304Sjkim } 739280304Sjkim 740280304Sjkim /* Create a namespace output file if asked */ 741280304Sjkim 742280304Sjkim if (Gbl_NsOutputFlag) 743280304Sjkim { 744280304Sjkim Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_NAMESPACE); 745280304Sjkim if (!Filename) 746280304Sjkim { 747280304Sjkim AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME, 748280304Sjkim 0, 0, 0, 0, NULL, NULL); 749280304Sjkim return (AE_ERROR); 750280304Sjkim } 751280304Sjkim 752280304Sjkim /* Open the namespace file, text mode */ 753280304Sjkim 754280304Sjkim FlOpenFile (ASL_FILE_NAMESPACE_OUTPUT, Filename, "w+t"); 755280304Sjkim 756280304Sjkim AslCompilerSignon (ASL_FILE_NAMESPACE_OUTPUT); 757280304Sjkim AslCompilerFileHeader (ASL_FILE_NAMESPACE_OUTPUT); 758280304Sjkim } 759280304Sjkim 760280304Sjkim return (AE_OK); 761280304Sjkim} 762280304Sjkim 763280304Sjkim 764280304Sjkim#ifdef ACPI_OBSOLETE_FUNCTIONS 765280304Sjkim/******************************************************************************* 766280304Sjkim * 767280304Sjkim * FUNCTION: FlParseInputPathname 768280304Sjkim * 769280304Sjkim * PARAMETERS: InputFilename - The user-specified ASL source file to be 770280304Sjkim * compiled 771280304Sjkim * 772280304Sjkim * RETURN: Status 773280304Sjkim * 774280304Sjkim * DESCRIPTION: Split the input path into a directory and filename part 775280304Sjkim * 1) Directory part used to open include files 776280304Sjkim * 2) Filename part used to generate output filenames 777280304Sjkim * 778280304Sjkim ******************************************************************************/ 779280304Sjkim 780280304SjkimACPI_STATUS 781280304SjkimFlParseInputPathname ( 782280304Sjkim char *InputFilename) 783280304Sjkim{ 784280304Sjkim char *Substring; 785280304Sjkim 786280304Sjkim 787280304Sjkim if (!InputFilename) 788280304Sjkim { 789280304Sjkim return (AE_OK); 790280304Sjkim } 791280304Sjkim 792280304Sjkim /* Get the path to the input filename's directory */ 793280304Sjkim 794280304Sjkim Gbl_DirectoryPath = strdup (InputFilename); 795280304Sjkim if (!Gbl_DirectoryPath) 796280304Sjkim { 797280304Sjkim return (AE_NO_MEMORY); 798280304Sjkim } 799280304Sjkim 800280304Sjkim Substring = strrchr (Gbl_DirectoryPath, '\\'); 801280304Sjkim if (!Substring) 802280304Sjkim { 803280304Sjkim Substring = strrchr (Gbl_DirectoryPath, '/'); 804280304Sjkim if (!Substring) 805280304Sjkim { 806280304Sjkim Substring = strrchr (Gbl_DirectoryPath, ':'); 807280304Sjkim } 808280304Sjkim } 809280304Sjkim 810280304Sjkim if (!Substring) 811280304Sjkim { 812280304Sjkim Gbl_DirectoryPath[0] = 0; 813280304Sjkim if (Gbl_UseDefaultAmlFilename) 814280304Sjkim { 815280304Sjkim Gbl_OutputFilenamePrefix = strdup (InputFilename); 816280304Sjkim } 817280304Sjkim } 818280304Sjkim else 819280304Sjkim { 820280304Sjkim if (Gbl_UseDefaultAmlFilename) 821280304Sjkim { 822280304Sjkim Gbl_OutputFilenamePrefix = strdup (Substring + 1); 823280304Sjkim } 824280304Sjkim *(Substring+1) = 0; 825280304Sjkim } 826280304Sjkim 827280304Sjkim return (AE_OK); 828280304Sjkim} 829280304Sjkim#endif 830280304Sjkim