1118611Snjl/****************************************************************************** 2118611Snjl * 3245582Sjkim * Module Name: aslfiles - File support functions 4118611Snjl * 5118611Snjl *****************************************************************************/ 6118611Snjl 7217365Sjkim/* 8245582Sjkim * Copyright (C) 2000 - 2013, Intel Corp. 9118611Snjl * All rights reserved. 10118611Snjl * 11217365Sjkim * Redistribution and use in source and binary forms, with or without 12217365Sjkim * modification, are permitted provided that the following conditions 13217365Sjkim * are met: 14217365Sjkim * 1. Redistributions of source code must retain the above copyright 15217365Sjkim * notice, this list of conditions, and the following disclaimer, 16217365Sjkim * without modification. 17217365Sjkim * 2. Redistributions in binary form must reproduce at minimum a disclaimer 18217365Sjkim * substantially similar to the "NO WARRANTY" disclaimer below 19217365Sjkim * ("Disclaimer") and any redistribution must be conditioned upon 20217365Sjkim * including a substantially similar Disclaimer requirement for further 21217365Sjkim * binary redistribution. 22217365Sjkim * 3. Neither the names of the above-listed copyright holders nor the names 23217365Sjkim * of any contributors may be used to endorse or promote products derived 24217365Sjkim * from this software without specific prior written permission. 25118611Snjl * 26217365Sjkim * Alternatively, this software may be distributed under the terms of the 27217365Sjkim * GNU General Public License ("GPL") version 2 as published by the Free 28217365Sjkim * Software Foundation. 29118611Snjl * 30217365Sjkim * NO WARRANTY 31217365Sjkim * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 32217365Sjkim * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 33217365Sjkim * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR 34217365Sjkim * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 35217365Sjkim * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 36217365Sjkim * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 37217365Sjkim * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 38217365Sjkim * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 39217365Sjkim * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 40217365Sjkim * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 41217365Sjkim * POSSIBILITY OF SUCH DAMAGES. 42217365Sjkim */ 43118611Snjl 44151937Sjkim#include <contrib/dev/acpica/compiler/aslcompiler.h> 45193529Sjkim#include <contrib/dev/acpica/include/acapps.h> 46118611Snjl 47118611Snjl#define _COMPONENT ACPI_COMPILER 48118611Snjl ACPI_MODULE_NAME ("aslfiles") 49118611Snjl 50151937Sjkim/* Local prototypes */ 51118611Snjl 52233250SjkimFILE * 53197104SjkimFlOpenIncludeWithPrefix ( 54197104Sjkim char *PrefixDir, 55197104Sjkim char *Filename); 56151937Sjkim 57197104Sjkim 58151937Sjkim#ifdef ACPI_OBSOLETE_FUNCTIONS 59151937SjkimACPI_STATUS 60151937SjkimFlParseInputPathname ( 61151937Sjkim char *InputFilename); 62151937Sjkim#endif 63151937Sjkim 64151937Sjkim 65118611Snjl/******************************************************************************* 66118611Snjl * 67118611Snjl * FUNCTION: FlSetLineNumber 68118611Snjl * 69118611Snjl * PARAMETERS: Op - Parse node for the LINE asl statement 70118611Snjl * 71118611Snjl * RETURN: None. 72118611Snjl * 73118611Snjl * DESCRIPTION: Set the current line number 74118611Snjl * 75118611Snjl ******************************************************************************/ 76118611Snjl 77118611Snjlvoid 78118611SnjlFlSetLineNumber ( 79234623Sjkim UINT32 LineNumber) 80118611Snjl{ 81118611Snjl 82234623Sjkim DbgPrint (ASL_PARSE_OUTPUT, "\n#line: New line number %u (old %u)\n", 83234623Sjkim LineNumber, Gbl_LogicalLineNumber); 84234623Sjkim 85234623Sjkim Gbl_CurrentLineNumber = LineNumber; 86234623Sjkim Gbl_LogicalLineNumber = LineNumber; 87118611Snjl} 88118611Snjl 89118611Snjl 90118611Snjl/******************************************************************************* 91118611Snjl * 92234623Sjkim * FUNCTION: FlSetFilename 93234623Sjkim * 94234623Sjkim * PARAMETERS: Op - Parse node for the LINE asl statement 95234623Sjkim * 96234623Sjkim * RETURN: None. 97234623Sjkim * 98234623Sjkim * DESCRIPTION: Set the current filename 99234623Sjkim * 100234623Sjkim ******************************************************************************/ 101234623Sjkim 102234623Sjkimvoid 103234623SjkimFlSetFilename ( 104234623Sjkim char *Filename) 105234623Sjkim{ 106234623Sjkim 107234623Sjkim DbgPrint (ASL_PARSE_OUTPUT, "\n#line: New filename %s (old %s)\n", 108234623Sjkim Filename, Gbl_Files[ASL_FILE_INPUT].Filename); 109234623Sjkim 110234623Sjkim Gbl_Files[ASL_FILE_INPUT].Filename = Filename; 111234623Sjkim} 112234623Sjkim 113234623Sjkim 114234623Sjkim/******************************************************************************* 115234623Sjkim * 116197104Sjkim * FUNCTION: FlAddIncludeDirectory 117197104Sjkim * 118197104Sjkim * PARAMETERS: Dir - Directory pathname string 119197104Sjkim * 120197104Sjkim * RETURN: None 121197104Sjkim * 122197104Sjkim * DESCRIPTION: Add a directory the list of include prefix directories. 123197104Sjkim * 124197104Sjkim ******************************************************************************/ 125197104Sjkim 126197104Sjkimvoid 127197104SjkimFlAddIncludeDirectory ( 128197104Sjkim char *Dir) 129197104Sjkim{ 130197104Sjkim ASL_INCLUDE_DIR *NewDir; 131197104Sjkim ASL_INCLUDE_DIR *NextDir; 132197104Sjkim ASL_INCLUDE_DIR *PrevDir = NULL; 133197104Sjkim UINT32 NeedsSeparator = 0; 134197104Sjkim size_t DirLength; 135197104Sjkim 136197104Sjkim 137197104Sjkim DirLength = strlen (Dir); 138197104Sjkim if (!DirLength) 139197104Sjkim { 140197104Sjkim return; 141197104Sjkim } 142197104Sjkim 143197104Sjkim /* Make sure that the pathname ends with a path separator */ 144197104Sjkim 145197104Sjkim if ((Dir[DirLength-1] != '/') && 146197104Sjkim (Dir[DirLength-1] != '\\')) 147197104Sjkim { 148197104Sjkim NeedsSeparator = 1; 149197104Sjkim } 150197104Sjkim 151197104Sjkim NewDir = ACPI_ALLOCATE_ZEROED (sizeof (ASL_INCLUDE_DIR)); 152197104Sjkim NewDir->Dir = ACPI_ALLOCATE (DirLength + 1 + NeedsSeparator); 153197104Sjkim strcpy (NewDir->Dir, Dir); 154197104Sjkim if (NeedsSeparator) 155197104Sjkim { 156197104Sjkim strcat (NewDir->Dir, "/"); 157197104Sjkim } 158197104Sjkim 159197104Sjkim /* 160197104Sjkim * Preserve command line ordering of -I options by adding new elements 161197104Sjkim * at the end of the list 162197104Sjkim */ 163197104Sjkim NextDir = Gbl_IncludeDirList; 164197104Sjkim while (NextDir) 165197104Sjkim { 166197104Sjkim PrevDir = NextDir; 167197104Sjkim NextDir = NextDir->Next; 168197104Sjkim } 169197104Sjkim 170197104Sjkim if (PrevDir) 171197104Sjkim { 172197104Sjkim PrevDir->Next = NewDir; 173197104Sjkim } 174197104Sjkim else 175197104Sjkim { 176197104Sjkim Gbl_IncludeDirList = NewDir; 177197104Sjkim } 178197104Sjkim} 179197104Sjkim 180197104Sjkim 181197104Sjkim/******************************************************************************* 182197104Sjkim * 183235945Sjkim * FUNCTION: FlMergePathnames 184235945Sjkim * 185235945Sjkim * PARAMETERS: PrefixDir - Prefix directory pathname. Can be NULL or 186235945Sjkim * a zero length string. 187235945Sjkim * FilePathname - The include filename from the source ASL. 188235945Sjkim * 189235945Sjkim * RETURN: Merged pathname string 190235945Sjkim * 191235945Sjkim * DESCRIPTION: Merge two pathnames that (probably) have common elements, to 192235945Sjkim * arrive at a minimal length string. Merge can occur if the 193235945Sjkim * FilePathname is relative to the PrefixDir. 194235945Sjkim * 195235945Sjkim ******************************************************************************/ 196235945Sjkim 197235945Sjkimchar * 198235945SjkimFlMergePathnames ( 199235945Sjkim char *PrefixDir, 200235945Sjkim char *FilePathname) 201235945Sjkim{ 202235945Sjkim char *CommonPath; 203235945Sjkim char *Pathname; 204235945Sjkim char *LastElement; 205235945Sjkim 206235945Sjkim 207235945Sjkim DbgPrint (ASL_PARSE_OUTPUT, "Include: Prefix path - \"%s\"\n" 208235945Sjkim "Include: FilePathname - \"%s\"\n", 209235945Sjkim PrefixDir, FilePathname); 210235945Sjkim 211235945Sjkim /* 212235945Sjkim * If there is no prefix directory or if the file pathname is absolute, 213235945Sjkim * just return the original file pathname 214235945Sjkim */ 215235945Sjkim if (!PrefixDir || (!*PrefixDir) || 216235945Sjkim (*FilePathname == '/') || 217235945Sjkim (FilePathname[1] == ':')) 218235945Sjkim { 219235945Sjkim Pathname = ACPI_ALLOCATE (strlen (FilePathname) + 1); 220235945Sjkim strcpy (Pathname, FilePathname); 221235945Sjkim goto ConvertBackslashes; 222235945Sjkim } 223235945Sjkim 224235945Sjkim /* Need a local copy of the prefix directory path */ 225235945Sjkim 226235945Sjkim CommonPath = ACPI_ALLOCATE (strlen (PrefixDir) + 1); 227235945Sjkim strcpy (CommonPath, PrefixDir); 228235945Sjkim 229235945Sjkim /* 230235945Sjkim * Walk forward through the file path, and simultaneously backward 231235945Sjkim * through the prefix directory path until there are no more 232235945Sjkim * relative references at the start of the file path. 233235945Sjkim */ 234235945Sjkim while (*FilePathname && (!strncmp (FilePathname, "../", 3))) 235235945Sjkim { 236235945Sjkim /* Remove last element of the prefix directory path */ 237235945Sjkim 238235945Sjkim LastElement = strrchr (CommonPath, '/'); 239235945Sjkim if (!LastElement) 240235945Sjkim { 241235945Sjkim goto ConcatenatePaths; 242235945Sjkim } 243235945Sjkim 244235945Sjkim *LastElement = 0; /* Terminate CommonPath string */ 245235945Sjkim FilePathname += 3; /* Point to next path element */ 246235945Sjkim } 247235945Sjkim 248235945Sjkim /* 249235945Sjkim * Remove the last element of the prefix directory path (it is the same as 250235945Sjkim * the first element of the file pathname), and build the final merged 251235945Sjkim * pathname. 252235945Sjkim */ 253235945Sjkim LastElement = strrchr (CommonPath, '/'); 254235945Sjkim if (LastElement) 255235945Sjkim { 256235945Sjkim *LastElement = 0; 257235945Sjkim } 258235945Sjkim 259235945Sjkim /* Build the final merged pathname */ 260235945Sjkim 261235945SjkimConcatenatePaths: 262235945Sjkim Pathname = ACPI_ALLOCATE_ZEROED (strlen (CommonPath) + strlen (FilePathname) + 2); 263235945Sjkim if (LastElement && *CommonPath) 264235945Sjkim { 265235945Sjkim strcpy (Pathname, CommonPath); 266235945Sjkim strcat (Pathname, "/"); 267235945Sjkim } 268235945Sjkim strcat (Pathname, FilePathname); 269235945Sjkim ACPI_FREE (CommonPath); 270235945Sjkim 271235945Sjkim /* Convert all backslashes to normal slashes */ 272235945Sjkim 273235945SjkimConvertBackslashes: 274235945Sjkim UtConvertBackslashes (Pathname); 275235945Sjkim 276235945Sjkim DbgPrint (ASL_PARSE_OUTPUT, "Include: Merged Pathname - \"%s\"\n", 277235945Sjkim Pathname); 278235945Sjkim return (Pathname); 279235945Sjkim} 280235945Sjkim 281235945Sjkim 282235945Sjkim/******************************************************************************* 283235945Sjkim * 284197104Sjkim * FUNCTION: FlOpenIncludeWithPrefix 285197104Sjkim * 286197104Sjkim * PARAMETERS: PrefixDir - Prefix directory pathname. Can be a zero 287197104Sjkim * length string. 288197104Sjkim * Filename - The include filename from the source ASL. 289197104Sjkim * 290197104Sjkim * RETURN: Valid file descriptor if successful. Null otherwise. 291197104Sjkim * 292197104Sjkim * DESCRIPTION: Open an include file and push it on the input file stack. 293197104Sjkim * 294197104Sjkim ******************************************************************************/ 295197104Sjkim 296233250SjkimFILE * 297197104SjkimFlOpenIncludeWithPrefix ( 298197104Sjkim char *PrefixDir, 299197104Sjkim char *Filename) 300197104Sjkim{ 301197104Sjkim FILE *IncludeFile; 302197104Sjkim char *Pathname; 303197104Sjkim 304197104Sjkim 305197104Sjkim /* Build the full pathname to the file */ 306197104Sjkim 307235945Sjkim Pathname = FlMergePathnames (PrefixDir, Filename); 308197104Sjkim 309235945Sjkim DbgPrint (ASL_PARSE_OUTPUT, "Include: Opening file - \"%s\"\n\n", 310197104Sjkim Pathname); 311197104Sjkim 312197104Sjkim /* Attempt to open the file, push if successful */ 313197104Sjkim 314197104Sjkim IncludeFile = fopen (Pathname, "r"); 315243347Sjkim if (!IncludeFile) 316197104Sjkim { 317243347Sjkim fprintf (stderr, "Could not open include file %s\n", Pathname); 318243347Sjkim ACPI_FREE (Pathname); 319243347Sjkim return (NULL); 320197104Sjkim } 321197104Sjkim 322243347Sjkim /* Push the include file on the open input file stack */ 323243347Sjkim 324243347Sjkim AslPushInputFileStack (IncludeFile, Pathname); 325243347Sjkim return (IncludeFile); 326197104Sjkim} 327197104Sjkim 328197104Sjkim 329197104Sjkim/******************************************************************************* 330197104Sjkim * 331118611Snjl * FUNCTION: FlOpenIncludeFile 332118611Snjl * 333118611Snjl * PARAMETERS: Op - Parse node for the INCLUDE ASL statement 334118611Snjl * 335118611Snjl * RETURN: None. 336118611Snjl * 337118611Snjl * DESCRIPTION: Open an include file and push it on the input file stack. 338118611Snjl * 339118611Snjl ******************************************************************************/ 340118611Snjl 341118611Snjlvoid 342118611SnjlFlOpenIncludeFile ( 343118611Snjl ACPI_PARSE_OBJECT *Op) 344118611Snjl{ 345197104Sjkim FILE *IncludeFile; 346197104Sjkim ASL_INCLUDE_DIR *NextDir; 347118611Snjl 348118611Snjl 349118611Snjl /* Op must be valid */ 350118611Snjl 351118611Snjl if (!Op) 352118611Snjl { 353118611Snjl AslCommonError (ASL_ERROR, ASL_MSG_INCLUDE_FILE_OPEN, 354118611Snjl Gbl_CurrentLineNumber, Gbl_LogicalLineNumber, 355118611Snjl Gbl_InputByteCount, Gbl_CurrentColumn, 356118611Snjl Gbl_Files[ASL_FILE_INPUT].Filename, " - Null parse node"); 357118611Snjl 358118611Snjl return; 359118611Snjl } 360118611Snjl 361118611Snjl /* 362118611Snjl * Flush out the "include ()" statement on this line, start 363118611Snjl * the actual include file on the next line 364118611Snjl */ 365234623Sjkim AslResetCurrentLineBuffer (); 366118611Snjl FlPrintFile (ASL_FILE_SOURCE_OUTPUT, "\n"); 367118611Snjl Gbl_CurrentLineOffset++; 368118611Snjl 369118611Snjl 370197104Sjkim /* Attempt to open the include file */ 371197104Sjkim 372197104Sjkim /* If the file specifies an absolute path, just open it */ 373197104Sjkim 374197104Sjkim if ((Op->Asl.Value.String[0] == '/') || 375197104Sjkim (Op->Asl.Value.String[0] == '\\') || 376197104Sjkim (Op->Asl.Value.String[1] == ':')) 377118611Snjl { 378197104Sjkim IncludeFile = FlOpenIncludeWithPrefix ("", Op->Asl.Value.String); 379197104Sjkim if (!IncludeFile) 380197104Sjkim { 381197104Sjkim goto ErrorExit; 382197104Sjkim } 383118611Snjl return; 384118611Snjl } 385118611Snjl 386197104Sjkim /* 387197104Sjkim * The include filename is not an absolute path. 388197104Sjkim * 389197104Sjkim * First, search for the file within the "local" directory -- meaning 390197104Sjkim * the same directory that contains the source file. 391197104Sjkim * 392197104Sjkim * Construct the file pathname from the global directory name. 393197104Sjkim */ 394197104Sjkim IncludeFile = FlOpenIncludeWithPrefix (Gbl_DirectoryPath, Op->Asl.Value.String); 395197104Sjkim if (IncludeFile) 396197104Sjkim { 397197104Sjkim return; 398197104Sjkim } 399118611Snjl 400197104Sjkim /* 401197104Sjkim * Second, search for the file within the (possibly multiple) directories 402197104Sjkim * specified by the -I option on the command line. 403197104Sjkim */ 404197104Sjkim NextDir = Gbl_IncludeDirList; 405197104Sjkim while (NextDir) 406197104Sjkim { 407197104Sjkim IncludeFile = FlOpenIncludeWithPrefix (NextDir->Dir, Op->Asl.Value.String); 408197104Sjkim if (IncludeFile) 409197104Sjkim { 410197104Sjkim return; 411197104Sjkim } 412197104Sjkim 413197104Sjkim NextDir = NextDir->Next; 414197104Sjkim } 415197104Sjkim 416197104Sjkim /* We could not open the include file after trying very hard */ 417197104Sjkim 418197104SjkimErrorExit: 419197104Sjkim sprintf (MsgBuffer, "%s, %s", Op->Asl.Value.String, strerror (errno)); 420197104Sjkim AslError (ASL_ERROR, ASL_MSG_INCLUDE_FILE_OPEN, Op, MsgBuffer); 421118611Snjl} 422118611Snjl 423118611Snjl 424118611Snjl/******************************************************************************* 425118611Snjl * 426118611Snjl * FUNCTION: FlOpenInputFile 427118611Snjl * 428118611Snjl * PARAMETERS: InputFilename - The user-specified ASL source file to be 429118611Snjl * compiled 430118611Snjl * 431118611Snjl * RETURN: Status 432118611Snjl * 433118611Snjl * DESCRIPTION: Open the specified input file, and save the directory path to 434118611Snjl * the file so that include files can be opened in 435118611Snjl * the same directory. 436118611Snjl * 437118611Snjl ******************************************************************************/ 438118611Snjl 439118611SnjlACPI_STATUS 440118611SnjlFlOpenInputFile ( 441118611Snjl char *InputFilename) 442118611Snjl{ 443118611Snjl 444118611Snjl /* Open the input ASL file, text mode */ 445118611Snjl 446237412Sjkim FlOpenFile (ASL_FILE_INPUT, InputFilename, "rt"); 447118611Snjl AslCompilerin = Gbl_Files[ASL_FILE_INPUT].Handle; 448118611Snjl 449118611Snjl return (AE_OK); 450118611Snjl} 451118611Snjl 452118611Snjl 453118611Snjl/******************************************************************************* 454118611Snjl * 455118611Snjl * FUNCTION: FlOpenAmlOutputFile 456118611Snjl * 457118611Snjl * PARAMETERS: FilenamePrefix - The user-specified ASL source file 458118611Snjl * 459118611Snjl * RETURN: Status 460118611Snjl * 461241973Sjkim * DESCRIPTION: Create the output filename (*.AML) and open the file. The file 462118611Snjl * is created in the same directory as the parent input file. 463118611Snjl * 464118611Snjl ******************************************************************************/ 465118611Snjl 466118611SnjlACPI_STATUS 467118611SnjlFlOpenAmlOutputFile ( 468118611Snjl char *FilenamePrefix) 469118611Snjl{ 470118611Snjl char *Filename; 471118611Snjl 472118611Snjl 473118611Snjl /* Output filename usually comes from the ASL itself */ 474118611Snjl 475118611Snjl Filename = Gbl_Files[ASL_FILE_AML_OUTPUT].Filename; 476118611Snjl if (!Filename) 477118611Snjl { 478118611Snjl /* Create the output AML filename */ 479118611Snjl 480118611Snjl Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_AML_CODE); 481118611Snjl if (!Filename) 482118611Snjl { 483151937Sjkim AslCommonError (ASL_ERROR, ASL_MSG_OUTPUT_FILENAME, 484151937Sjkim 0, 0, 0, 0, NULL, NULL); 485118611Snjl return (AE_ERROR); 486118611Snjl } 487118611Snjl } 488118611Snjl 489118611Snjl /* Open the output AML file in binary mode */ 490118611Snjl 491118611Snjl FlOpenFile (ASL_FILE_AML_OUTPUT, Filename, "w+b"); 492118611Snjl return (AE_OK); 493118611Snjl} 494118611Snjl 495118611Snjl 496118611Snjl/******************************************************************************* 497118611Snjl * 498118611Snjl * FUNCTION: FlOpenMiscOutputFiles 499118611Snjl * 500118611Snjl * PARAMETERS: FilenamePrefix - The user-specified ASL source file 501118611Snjl * 502118611Snjl * RETURN: Status 503118611Snjl * 504118611Snjl * DESCRIPTION: Create and open the various output files needed, depending on 505118611Snjl * the command line options 506118611Snjl * 507118611Snjl ******************************************************************************/ 508118611Snjl 509118611SnjlACPI_STATUS 510118611SnjlFlOpenMiscOutputFiles ( 511118611Snjl char *FilenamePrefix) 512118611Snjl{ 513118611Snjl char *Filename; 514118611Snjl 515118611Snjl 516246849Sjkim /* All done for disassembler */ 517246849Sjkim 518246849Sjkim if (Gbl_FileType == ASL_INPUT_TYPE_ACPI_TABLE) 519246849Sjkim { 520246849Sjkim return (AE_OK); 521246849Sjkim } 522246849Sjkim 523209746Sjkim /* Create/Open a hex output file if asked */ 524209746Sjkim 525209746Sjkim if (Gbl_HexOutputFlag) 526209746Sjkim { 527209746Sjkim Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_HEX_DUMP); 528209746Sjkim if (!Filename) 529209746Sjkim { 530209746Sjkim AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME, 531209746Sjkim 0, 0, 0, 0, NULL, NULL); 532209746Sjkim return (AE_ERROR); 533209746Sjkim } 534209746Sjkim 535209746Sjkim /* Open the hex file, text mode */ 536209746Sjkim 537237412Sjkim FlOpenFile (ASL_FILE_HEX_OUTPUT, Filename, "w+t"); 538209746Sjkim 539209746Sjkim AslCompilerSignon (ASL_FILE_HEX_OUTPUT); 540209746Sjkim AslCompilerFileHeader (ASL_FILE_HEX_OUTPUT); 541209746Sjkim } 542209746Sjkim 543209746Sjkim /* Create/Open a debug output file if asked */ 544209746Sjkim 545209746Sjkim if (Gbl_DebugFlag) 546209746Sjkim { 547209746Sjkim Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_DEBUG); 548209746Sjkim if (!Filename) 549209746Sjkim { 550209746Sjkim AslCommonError (ASL_ERROR, ASL_MSG_DEBUG_FILENAME, 551209746Sjkim 0, 0, 0, 0, NULL, NULL); 552209746Sjkim return (AE_ERROR); 553209746Sjkim } 554209746Sjkim 555209746Sjkim /* Open the debug file as STDERR, text mode */ 556209746Sjkim 557209746Sjkim /* TBD: hide this behind a FlReopenFile function */ 558209746Sjkim 559209746Sjkim Gbl_Files[ASL_FILE_DEBUG_OUTPUT].Filename = Filename; 560209746Sjkim Gbl_Files[ASL_FILE_DEBUG_OUTPUT].Handle = 561209746Sjkim freopen (Filename, "w+t", stderr); 562209746Sjkim 563233250Sjkim if (!Gbl_Files[ASL_FILE_DEBUG_OUTPUT].Handle) 564233250Sjkim { 565233250Sjkim AslCommonError (ASL_ERROR, ASL_MSG_DEBUG_FILENAME, 566233250Sjkim 0, 0, 0, 0, NULL, NULL); 567233250Sjkim return (AE_ERROR); 568233250Sjkim } 569233250Sjkim 570209746Sjkim AslCompilerSignon (ASL_FILE_DEBUG_OUTPUT); 571209746Sjkim AslCompilerFileHeader (ASL_FILE_DEBUG_OUTPUT); 572209746Sjkim } 573209746Sjkim 574217365Sjkim /* Create/Open a listing output file if asked */ 575217365Sjkim 576217365Sjkim if (Gbl_ListingFlag) 577217365Sjkim { 578217365Sjkim Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_LISTING); 579217365Sjkim if (!Filename) 580217365Sjkim { 581217365Sjkim AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME, 582217365Sjkim 0, 0, 0, 0, NULL, NULL); 583217365Sjkim return (AE_ERROR); 584217365Sjkim } 585217365Sjkim 586217365Sjkim /* Open the listing file, text mode */ 587217365Sjkim 588237412Sjkim FlOpenFile (ASL_FILE_LISTING_OUTPUT, Filename, "w+t"); 589217365Sjkim 590217365Sjkim AslCompilerSignon (ASL_FILE_LISTING_OUTPUT); 591217365Sjkim AslCompilerFileHeader (ASL_FILE_LISTING_OUTPUT); 592217365Sjkim } 593217365Sjkim 594234623Sjkim /* Create the preprocessor output file if preprocessor enabled */ 595233250Sjkim 596234623Sjkim if (Gbl_PreprocessFlag) 597233250Sjkim { 598234623Sjkim Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_PREPROCESSOR); 599234623Sjkim if (!Filename) 600234623Sjkim { 601234623Sjkim AslCommonError (ASL_ERROR, ASL_MSG_PREPROCESSOR_FILENAME, 602234623Sjkim 0, 0, 0, 0, NULL, NULL); 603234623Sjkim return (AE_ERROR); 604234623Sjkim } 605234623Sjkim 606237412Sjkim FlOpenFile (ASL_FILE_PREPROCESSOR, Filename, "w+t"); 607233250Sjkim } 608233250Sjkim 609233250Sjkim /* All done for data table compiler */ 610233250Sjkim 611209746Sjkim if (Gbl_FileType == ASL_INPUT_TYPE_ASCII_DATA) 612209746Sjkim { 613209746Sjkim return (AE_OK); 614209746Sjkim } 615209746Sjkim 616243347Sjkim /* Create/Open a combined source output file */ 617118611Snjl 618118611Snjl Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_SOURCE); 619118611Snjl if (!Filename) 620118611Snjl { 621151937Sjkim AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME, 622151937Sjkim 0, 0, 0, 0, NULL, NULL); 623118611Snjl return (AE_ERROR); 624118611Snjl } 625118611Snjl 626118611Snjl /* 627118611Snjl * Open the source output file, binary mode (so that LF does not get 628118611Snjl * expanded to CR/LF on some systems, messing up our seek 629118611Snjl * calculations.) 630118611Snjl */ 631118611Snjl FlOpenFile (ASL_FILE_SOURCE_OUTPUT, Filename, "w+b"); 632118611Snjl 633233250Sjkim/* 634233250Sjkim// TBD: TEMP 635233250Sjkim// AslCompilerin = Gbl_Files[ASL_FILE_SOURCE_OUTPUT].Handle; 636233250Sjkim*/ 637118611Snjl /* Create/Open a assembly code source output file if asked */ 638118611Snjl 639118611Snjl if (Gbl_AsmOutputFlag) 640118611Snjl { 641118611Snjl Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_ASM_SOURCE); 642118611Snjl if (!Filename) 643118611Snjl { 644151937Sjkim AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME, 645151937Sjkim 0, 0, 0, 0, NULL, NULL); 646118611Snjl return (AE_ERROR); 647118611Snjl } 648118611Snjl 649118611Snjl /* Open the assembly code source file, text mode */ 650118611Snjl 651237412Sjkim FlOpenFile (ASL_FILE_ASM_SOURCE_OUTPUT, Filename, "w+t"); 652118611Snjl 653118611Snjl AslCompilerSignon (ASL_FILE_ASM_SOURCE_OUTPUT); 654118611Snjl AslCompilerFileHeader (ASL_FILE_ASM_SOURCE_OUTPUT); 655118611Snjl } 656118611Snjl 657118611Snjl /* Create/Open a C code source output file if asked */ 658118611Snjl 659118611Snjl if (Gbl_C_OutputFlag) 660118611Snjl { 661118611Snjl Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_C_SOURCE); 662118611Snjl if (!Filename) 663118611Snjl { 664151937Sjkim AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME, 665151937Sjkim 0, 0, 0, 0, NULL, NULL); 666118611Snjl return (AE_ERROR); 667118611Snjl } 668118611Snjl 669118611Snjl /* Open the C code source file, text mode */ 670118611Snjl 671237412Sjkim FlOpenFile (ASL_FILE_C_SOURCE_OUTPUT, Filename, "w+t"); 672118611Snjl 673118611Snjl FlPrintFile (ASL_FILE_C_SOURCE_OUTPUT, "/*\n"); 674118611Snjl AslCompilerSignon (ASL_FILE_C_SOURCE_OUTPUT); 675118611Snjl AslCompilerFileHeader (ASL_FILE_C_SOURCE_OUTPUT); 676118611Snjl } 677118611Snjl 678249112Sjkim /* Create/Open a C code source output file for the offset table if asked */ 679249112Sjkim 680249112Sjkim if (Gbl_C_OffsetTableFlag) 681249112Sjkim { 682249112Sjkim Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_C_OFFSET); 683249112Sjkim if (!Filename) 684249112Sjkim { 685249112Sjkim AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME, 686249112Sjkim 0, 0, 0, 0, NULL, NULL); 687249112Sjkim return (AE_ERROR); 688249112Sjkim } 689249112Sjkim 690249112Sjkim /* Open the C code source file, text mode */ 691249112Sjkim 692249112Sjkim FlOpenFile (ASL_FILE_C_OFFSET_OUTPUT, Filename, "w+t"); 693249112Sjkim 694249112Sjkim FlPrintFile (ASL_FILE_C_OFFSET_OUTPUT, "/*\n"); 695249112Sjkim AslCompilerSignon (ASL_FILE_C_OFFSET_OUTPUT); 696249112Sjkim AslCompilerFileHeader (ASL_FILE_C_OFFSET_OUTPUT); 697249112Sjkim } 698249112Sjkim 699118611Snjl /* Create/Open a assembly include output file if asked */ 700118611Snjl 701118611Snjl if (Gbl_AsmIncludeOutputFlag) 702118611Snjl { 703118611Snjl Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_ASM_INCLUDE); 704118611Snjl if (!Filename) 705118611Snjl { 706151937Sjkim AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME, 707151937Sjkim 0, 0, 0, 0, NULL, NULL); 708118611Snjl return (AE_ERROR); 709118611Snjl } 710118611Snjl 711118611Snjl /* Open the assembly include file, text mode */ 712118611Snjl 713237412Sjkim FlOpenFile (ASL_FILE_ASM_INCLUDE_OUTPUT, Filename, "w+t"); 714118611Snjl 715118611Snjl AslCompilerSignon (ASL_FILE_ASM_INCLUDE_OUTPUT); 716118611Snjl AslCompilerFileHeader (ASL_FILE_ASM_INCLUDE_OUTPUT); 717118611Snjl } 718118611Snjl 719118611Snjl /* Create/Open a C include output file if asked */ 720118611Snjl 721118611Snjl if (Gbl_C_IncludeOutputFlag) 722118611Snjl { 723118611Snjl Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_C_INCLUDE); 724118611Snjl if (!Filename) 725118611Snjl { 726151937Sjkim AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME, 727151937Sjkim 0, 0, 0, 0, NULL, NULL); 728118611Snjl return (AE_ERROR); 729118611Snjl } 730118611Snjl 731118611Snjl /* Open the C include file, text mode */ 732118611Snjl 733237412Sjkim FlOpenFile (ASL_FILE_C_INCLUDE_OUTPUT, Filename, "w+t"); 734118611Snjl 735118611Snjl FlPrintFile (ASL_FILE_C_INCLUDE_OUTPUT, "/*\n"); 736118611Snjl AslCompilerSignon (ASL_FILE_C_INCLUDE_OUTPUT); 737118611Snjl AslCompilerFileHeader (ASL_FILE_C_INCLUDE_OUTPUT); 738118611Snjl } 739118611Snjl 740118611Snjl /* Create a namespace output file if asked */ 741118611Snjl 742118611Snjl if (Gbl_NsOutputFlag) 743118611Snjl { 744118611Snjl Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_NAMESPACE); 745118611Snjl if (!Filename) 746118611Snjl { 747151937Sjkim AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME, 748151937Sjkim 0, 0, 0, 0, NULL, NULL); 749118611Snjl return (AE_ERROR); 750118611Snjl } 751118611Snjl 752118611Snjl /* Open the namespace file, text mode */ 753118611Snjl 754237412Sjkim FlOpenFile (ASL_FILE_NAMESPACE_OUTPUT, Filename, "w+t"); 755118611Snjl 756118611Snjl AslCompilerSignon (ASL_FILE_NAMESPACE_OUTPUT); 757118611Snjl AslCompilerFileHeader (ASL_FILE_NAMESPACE_OUTPUT); 758118611Snjl } 759118611Snjl 760118611Snjl return (AE_OK); 761118611Snjl} 762118611Snjl 763118611Snjl 764151937Sjkim#ifdef ACPI_OBSOLETE_FUNCTIONS 765151937Sjkim/******************************************************************************* 766151937Sjkim * 767151937Sjkim * FUNCTION: FlParseInputPathname 768151937Sjkim * 769151937Sjkim * PARAMETERS: InputFilename - The user-specified ASL source file to be 770151937Sjkim * compiled 771151937Sjkim * 772151937Sjkim * RETURN: Status 773151937Sjkim * 774151937Sjkim * DESCRIPTION: Split the input path into a directory and filename part 775151937Sjkim * 1) Directory part used to open include files 776151937Sjkim * 2) Filename part used to generate output filenames 777151937Sjkim * 778151937Sjkim ******************************************************************************/ 779151937Sjkim 780151937SjkimACPI_STATUS 781151937SjkimFlParseInputPathname ( 782151937Sjkim char *InputFilename) 783151937Sjkim{ 784151937Sjkim char *Substring; 785151937Sjkim 786151937Sjkim 787151937Sjkim if (!InputFilename) 788151937Sjkim { 789151937Sjkim return (AE_OK); 790151937Sjkim } 791151937Sjkim 792151937Sjkim /* Get the path to the input filename's directory */ 793151937Sjkim 794151937Sjkim Gbl_DirectoryPath = strdup (InputFilename); 795151937Sjkim if (!Gbl_DirectoryPath) 796151937Sjkim { 797151937Sjkim return (AE_NO_MEMORY); 798151937Sjkim } 799151937Sjkim 800151937Sjkim Substring = strrchr (Gbl_DirectoryPath, '\\'); 801151937Sjkim if (!Substring) 802151937Sjkim { 803151937Sjkim Substring = strrchr (Gbl_DirectoryPath, '/'); 804151937Sjkim if (!Substring) 805151937Sjkim { 806151937Sjkim Substring = strrchr (Gbl_DirectoryPath, ':'); 807151937Sjkim } 808151937Sjkim } 809151937Sjkim 810151937Sjkim if (!Substring) 811151937Sjkim { 812151937Sjkim Gbl_DirectoryPath[0] = 0; 813151937Sjkim if (Gbl_UseDefaultAmlFilename) 814151937Sjkim { 815151937Sjkim Gbl_OutputFilenamePrefix = strdup (InputFilename); 816151937Sjkim } 817151937Sjkim } 818151937Sjkim else 819151937Sjkim { 820151937Sjkim if (Gbl_UseDefaultAmlFilename) 821151937Sjkim { 822151937Sjkim Gbl_OutputFilenamePrefix = strdup (Substring + 1); 823151937Sjkim } 824151937Sjkim *(Substring+1) = 0; 825151937Sjkim } 826151937Sjkim 827151937Sjkim return (AE_OK); 828151937Sjkim} 829151937Sjkim#endif 830