aslfiles.c revision 1.1 1
2 /******************************************************************************
3 *
4 * Module Name: aslfiles - file I/O suppoert
5 *
6 *****************************************************************************/
7
8 /******************************************************************************
9 *
10 * 1. Copyright Notice
11 *
12 * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp.
13 * All rights reserved.
14 *
15 * 2. License
16 *
17 * 2.1. This is your license from Intel Corp. under its intellectual property
18 * rights. You may have additional license terms from the party that provided
19 * you this software, covering your right to use that party's intellectual
20 * property rights.
21 *
22 * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
23 * copy of the source code appearing in this file ("Covered Code") an
24 * irrevocable, perpetual, worldwide license under Intel's copyrights in the
25 * base code distributed originally by Intel ("Original Intel Code") to copy,
26 * make derivatives, distribute, use and display any portion of the Covered
27 * Code in any form, with the right to sublicense such rights; and
28 *
29 * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
30 * license (with the right to sublicense), under only those claims of Intel
31 * patents that are infringed by the Original Intel Code, to make, use, sell,
32 * offer to sell, and import the Covered Code and derivative works thereof
33 * solely to the minimum extent necessary to exercise the above copyright
34 * license, and in no event shall the patent license extend to any additions
35 * to or modifications of the Original Intel Code. No other license or right
36 * is granted directly or by implication, estoppel or otherwise;
37 *
38 * The above copyright and patent license is granted only if the following
39 * conditions are met:
40 *
41 * 3. Conditions
42 *
43 * 3.1. Redistribution of Source with Rights to Further Distribute Source.
44 * Redistribution of source code of any substantial portion of the Covered
45 * Code or modification with rights to further distribute source must include
46 * the above Copyright Notice, the above License, this list of Conditions,
47 * and the following Disclaimer and Export Compliance provision. In addition,
48 * Licensee must cause all Covered Code to which Licensee contributes to
49 * contain a file documenting the changes Licensee made to create that Covered
50 * Code and the date of any change. Licensee must include in that file the
51 * documentation of any changes made by any predecessor Licensee. Licensee
52 * must include a prominent statement that the modification is derived,
53 * directly or indirectly, from Original Intel Code.
54 *
55 * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
56 * Redistribution of source code of any substantial portion of the Covered
57 * Code or modification without rights to further distribute source must
58 * include the following Disclaimer and Export Compliance provision in the
59 * documentation and/or other materials provided with distribution. In
60 * addition, Licensee may not authorize further sublicense of source of any
61 * portion of the Covered Code, and must include terms to the effect that the
62 * license from Licensee to its licensee is limited to the intellectual
63 * property embodied in the software Licensee provides to its licensee, and
64 * not to intellectual property embodied in modifications its licensee may
65 * make.
66 *
67 * 3.3. Redistribution of Executable. Redistribution in executable form of any
68 * substantial portion of the Covered Code or modification must reproduce the
69 * above Copyright Notice, and the following Disclaimer and Export Compliance
70 * provision in the documentation and/or other materials provided with the
71 * distribution.
72 *
73 * 3.4. Intel retains all right, title, and interest in and to the Original
74 * Intel Code.
75 *
76 * 3.5. Neither the name Intel nor any other trademark owned or controlled by
77 * Intel shall be used in advertising or otherwise to promote the sale, use or
78 * other dealings in products derived from or relating to the Covered Code
79 * without prior written authorization from Intel.
80 *
81 * 4. Disclaimer and Export Compliance
82 *
83 * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
84 * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
85 * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
86 * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
87 * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
88 * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
89 * PARTICULAR PURPOSE.
90 *
91 * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
92 * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
93 * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
94 * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
95 * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
96 * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
97 * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
98 * LIMITED REMEDY.
99 *
100 * 4.3. Licensee shall not export, either directly or indirectly, any of this
101 * software or system incorporating such software without first obtaining any
102 * required license or other approval from the U. S. Department of Commerce or
103 * any other agency or department of the United States Government. In the
104 * event Licensee exports any such software from the United States or
105 * re-exports any such software from a foreign destination, Licensee shall
106 * ensure that the distribution and export/re-export of the software is in
107 * compliance with all laws, regulations, orders, or other restrictions of the
108 * U.S. Export Administration Regulations. Licensee agrees that neither it nor
109 * any of its subsidiaries will export/re-export any technical data, process,
110 * software, or service, directly or indirectly, to any country for which the
111 * United States government or any agency thereof requires an export license,
112 * other governmental approval, or letter of assurance, without first obtaining
113 * such license, approval or letter.
114 *
115 *****************************************************************************/
116
117 #include "aslcompiler.h"
118 #include "acapps.h"
119
120 #define _COMPONENT ACPI_COMPILER
121 ACPI_MODULE_NAME ("aslfiles")
122
123 /* Local prototypes */
124
125 FILE *
126 FlOpenIncludeWithPrefix (
127 char *PrefixDir,
128 char *Filename);
129
130
131 #ifdef ACPI_OBSOLETE_FUNCTIONS
132 ACPI_STATUS
133 FlParseInputPathname (
134 char *InputFilename);
135 #endif
136
137
138 /*******************************************************************************
139 *
140 * FUNCTION: AslAbort
141 *
142 * PARAMETERS: None
143 *
144 * RETURN: None
145 *
146 * DESCRIPTION: Dump the error log and abort the compiler. Used for serious
147 * I/O errors
148 *
149 ******************************************************************************/
150
151 void
152 AslAbort (
153 void)
154 {
155
156 AePrintErrorLog (ASL_FILE_STDOUT);
157 if (Gbl_DebugFlag)
158 {
159 /* Print error summary to the debug file */
160
161 AePrintErrorLog (ASL_FILE_STDERR);
162 }
163
164 exit (1);
165 }
166
167
168 /*******************************************************************************
169 *
170 * FUNCTION: FlFileError
171 *
172 * PARAMETERS: FileId - Index into file info array
173 * ErrorId - Index into error message array
174 *
175 * RETURN: None
176 *
177 * DESCRIPTION: Decode errno to an error message and add the entire error
178 * to the error log.
179 *
180 ******************************************************************************/
181
182 void
183 FlFileError (
184 UINT32 FileId,
185 UINT8 ErrorId)
186 {
187
188 sprintf (MsgBuffer, "\"%s\" (%s)", Gbl_Files[FileId].Filename,
189 strerror (errno));
190 AslCommonError (ASL_ERROR, ErrorId, 0, 0, 0, 0, NULL, MsgBuffer);
191 }
192
193
194 /*******************************************************************************
195 *
196 * FUNCTION: FlOpenFile
197 *
198 * PARAMETERS: FileId - Index into file info array
199 * Filename - file pathname to open
200 * Mode - Open mode for fopen
201 *
202 * RETURN: None
203 *
204 * DESCRIPTION: Open a file.
205 * NOTE: Aborts compiler on any error.
206 *
207 ******************************************************************************/
208
209 void
210 FlOpenFile (
211 UINT32 FileId,
212 char *Filename,
213 char *Mode)
214 {
215 FILE *File;
216
217
218 File = fopen (Filename, Mode);
219
220 Gbl_Files[FileId].Filename = Filename;
221 Gbl_Files[FileId].Handle = File;
222
223 if (!File)
224 {
225 FlFileError (FileId, ASL_MSG_OPEN);
226 AslAbort ();
227 }
228 }
229
230
231 /*******************************************************************************
232 *
233 * FUNCTION: FlGetFileSize
234 *
235 * PARAMETERS: FileId - Index into file info array
236 *
237 * RETURN: File Size
238 *
239 * DESCRIPTION: Get current file size. Uses seek-to-EOF. File must be open.
240 *
241 ******************************************************************************/
242
243 UINT32
244 FlGetFileSize (
245 UINT32 FileId)
246 {
247 FILE *fp;
248 UINT32 FileSize;
249
250
251 fp = Gbl_Files[FileId].Handle;
252
253 fseek (fp, 0, SEEK_END);
254 FileSize = (UINT32) ftell (fp);
255 fseek (fp, 0, SEEK_SET);
256
257 return (FileSize);
258 }
259
260
261 /*******************************************************************************
262 *
263 * FUNCTION: FlReadFile
264 *
265 * PARAMETERS: FileId - Index into file info array
266 * Buffer - Where to place the data
267 * Length - Amount to read
268 *
269 * RETURN: Status. AE_ERROR indicates EOF.
270 *
271 * DESCRIPTION: Read data from an open file.
272 * NOTE: Aborts compiler on any error.
273 *
274 ******************************************************************************/
275
276 ACPI_STATUS
277 FlReadFile (
278 UINT32 FileId,
279 void *Buffer,
280 UINT32 Length)
281 {
282 UINT32 Actual;
283
284
285 /* Read and check for error */
286
287 Actual = fread (Buffer, 1, Length, Gbl_Files[FileId].Handle);
288 if (Actual != Length)
289 {
290 if (feof (Gbl_Files[FileId].Handle))
291 {
292 /* End-of-file, just return error */
293
294 return (AE_ERROR);
295 }
296
297 FlFileError (FileId, ASL_MSG_READ);
298 AslAbort ();
299 }
300
301 return (AE_OK);
302 }
303
304
305 /*******************************************************************************
306 *
307 * FUNCTION: FlWriteFile
308 *
309 * PARAMETERS: FileId - Index into file info array
310 * Buffer - Data to write
311 * Length - Amount of data to write
312 *
313 * RETURN: None
314 *
315 * DESCRIPTION: Write data to an open file.
316 * NOTE: Aborts compiler on any error.
317 *
318 ******************************************************************************/
319
320 void
321 FlWriteFile (
322 UINT32 FileId,
323 void *Buffer,
324 UINT32 Length)
325 {
326 UINT32 Actual;
327
328
329 /* Write and check for error */
330
331 Actual = fwrite ((char *) Buffer, 1, Length, Gbl_Files[FileId].Handle);
332 if (Actual != Length)
333 {
334 FlFileError (FileId, ASL_MSG_WRITE);
335 AslAbort ();
336 }
337 }
338
339
340 /*******************************************************************************
341 *
342 * FUNCTION: FlPrintFile
343 *
344 * PARAMETERS: FileId - Index into file info array
345 * Format - Printf format string
346 * ... - Printf arguments
347 *
348 * RETURN: None
349 *
350 * DESCRIPTION: Formatted write to an open file.
351 * NOTE: Aborts compiler on any error.
352 *
353 ******************************************************************************/
354
355 void
356 FlPrintFile (
357 UINT32 FileId,
358 char *Format,
359 ...)
360 {
361 INT32 Actual;
362 va_list Args;
363
364
365 va_start (Args, Format);
366
367 Actual = vfprintf (Gbl_Files[FileId].Handle, Format, Args);
368 va_end (Args);
369
370 if (Actual == -1)
371 {
372 FlFileError (FileId, ASL_MSG_WRITE);
373 AslAbort ();
374 }
375 }
376
377
378 /*******************************************************************************
379 *
380 * FUNCTION: FlSeekFile
381 *
382 * PARAMETERS: FileId - Index into file info array
383 * Offset - Absolute byte offset in file
384 *
385 * RETURN: None
386 *
387 * DESCRIPTION: Seek to absolute offset
388 * NOTE: Aborts compiler on any error.
389 *
390 ******************************************************************************/
391
392 void
393 FlSeekFile (
394 UINT32 FileId,
395 long Offset)
396 {
397 int Error;
398
399
400 Error = fseek (Gbl_Files[FileId].Handle, Offset, SEEK_SET);
401 if (Error)
402 {
403 FlFileError (FileId, ASL_MSG_SEEK);
404 AslAbort ();
405 }
406 }
407
408
409 /*******************************************************************************
410 *
411 * FUNCTION: FlCloseFile
412 *
413 * PARAMETERS: FileId - Index into file info array
414 *
415 * RETURN: None
416 *
417 * DESCRIPTION: Close an open file. Aborts compiler on error
418 *
419 ******************************************************************************/
420
421 void
422 FlCloseFile (
423 UINT32 FileId)
424 {
425 int Error;
426
427
428 if (!Gbl_Files[FileId].Handle)
429 {
430 return;
431 }
432
433 Error = fclose (Gbl_Files[FileId].Handle);
434 Gbl_Files[FileId].Handle = NULL;
435
436 if (Error)
437 {
438 FlFileError (FileId, ASL_MSG_CLOSE);
439 AslAbort ();
440 }
441
442 return;
443 }
444
445
446 /*******************************************************************************
447 *
448 * FUNCTION: FlSetLineNumber
449 *
450 * PARAMETERS: Op - Parse node for the LINE asl statement
451 *
452 * RETURN: None.
453 *
454 * DESCRIPTION: Set the current line number
455 *
456 ******************************************************************************/
457
458 void
459 FlSetLineNumber (
460 ACPI_PARSE_OBJECT *Op)
461 {
462
463 Gbl_CurrentLineNumber = (UINT32) Op->Asl.Value.Integer;
464 Gbl_LogicalLineNumber = (UINT32) Op->Asl.Value.Integer;
465 }
466
467
468 /*******************************************************************************
469 *
470 * FUNCTION: FlAddIncludeDirectory
471 *
472 * PARAMETERS: Dir - Directory pathname string
473 *
474 * RETURN: None
475 *
476 * DESCRIPTION: Add a directory the list of include prefix directories.
477 *
478 ******************************************************************************/
479
480 void
481 FlAddIncludeDirectory (
482 char *Dir)
483 {
484 ASL_INCLUDE_DIR *NewDir;
485 ASL_INCLUDE_DIR *NextDir;
486 ASL_INCLUDE_DIR *PrevDir = NULL;
487 UINT32 NeedsSeparator = 0;
488 size_t DirLength;
489
490
491 DirLength = strlen (Dir);
492 if (!DirLength)
493 {
494 return;
495 }
496
497 /* Make sure that the pathname ends with a path separator */
498
499 if ((Dir[DirLength-1] != '/') &&
500 (Dir[DirLength-1] != '\\'))
501 {
502 NeedsSeparator = 1;
503 }
504
505 NewDir = ACPI_ALLOCATE_ZEROED (sizeof (ASL_INCLUDE_DIR));
506 NewDir->Dir = ACPI_ALLOCATE (DirLength + 1 + NeedsSeparator);
507 strcpy (NewDir->Dir, Dir);
508 if (NeedsSeparator)
509 {
510 strcat (NewDir->Dir, "/");
511 }
512
513 /*
514 * Preserve command line ordering of -I options by adding new elements
515 * at the end of the list
516 */
517 NextDir = Gbl_IncludeDirList;
518 while (NextDir)
519 {
520 PrevDir = NextDir;
521 NextDir = NextDir->Next;
522 }
523
524 if (PrevDir)
525 {
526 PrevDir->Next = NewDir;
527 }
528 else
529 {
530 Gbl_IncludeDirList = NewDir;
531 }
532 }
533
534
535 /*******************************************************************************
536 *
537 * FUNCTION: FlOpenIncludeWithPrefix
538 *
539 * PARAMETERS: PrefixDir - Prefix directory pathname. Can be a zero
540 * length string.
541 * Filename - The include filename from the source ASL.
542 *
543 * RETURN: Valid file descriptor if successful. Null otherwise.
544 *
545 * DESCRIPTION: Open an include file and push it on the input file stack.
546 *
547 ******************************************************************************/
548
549 FILE *
550 FlOpenIncludeWithPrefix (
551 char *PrefixDir,
552 char *Filename)
553 {
554 FILE *IncludeFile;
555 char *Pathname;
556
557
558 /* Build the full pathname to the file */
559
560 Pathname = ACPI_ALLOCATE (strlen (PrefixDir) + strlen (Filename) + 1);
561
562 strcpy (Pathname, PrefixDir);
563 strcat (Pathname, Filename);
564
565 DbgPrint (ASL_PARSE_OUTPUT, "\nAttempt to open include file: path %s\n\n",
566 Pathname);
567
568 /* Attempt to open the file, push if successful */
569
570 IncludeFile = fopen (Pathname, "r");
571 if (IncludeFile)
572 {
573 /* Push the include file on the open input file stack */
574
575 AslPushInputFileStack (IncludeFile, Pathname);
576 return (IncludeFile);
577 }
578
579 ACPI_FREE (Pathname);
580 return (NULL);
581 }
582
583
584 /*******************************************************************************
585 *
586 * FUNCTION: FlOpenIncludeFile
587 *
588 * PARAMETERS: Op - Parse node for the INCLUDE ASL statement
589 *
590 * RETURN: None.
591 *
592 * DESCRIPTION: Open an include file and push it on the input file stack.
593 *
594 ******************************************************************************/
595
596 void
597 FlOpenIncludeFile (
598 ACPI_PARSE_OBJECT *Op)
599 {
600 FILE *IncludeFile;
601 ASL_INCLUDE_DIR *NextDir;
602
603
604 /* Op must be valid */
605
606 if (!Op)
607 {
608 AslCommonError (ASL_ERROR, ASL_MSG_INCLUDE_FILE_OPEN,
609 Gbl_CurrentLineNumber, Gbl_LogicalLineNumber,
610 Gbl_InputByteCount, Gbl_CurrentColumn,
611 Gbl_Files[ASL_FILE_INPUT].Filename, " - Null parse node");
612
613 return;
614 }
615
616 /*
617 * Flush out the "include ()" statement on this line, start
618 * the actual include file on the next line
619 */
620 ResetCurrentLineBuffer ();
621 FlPrintFile (ASL_FILE_SOURCE_OUTPUT, "\n");
622 Gbl_CurrentLineOffset++;
623
624
625 /* Attempt to open the include file */
626
627 /* If the file specifies an absolute path, just open it */
628
629 if ((Op->Asl.Value.String[0] == '/') ||
630 (Op->Asl.Value.String[0] == '\\') ||
631 (Op->Asl.Value.String[1] == ':'))
632 {
633 IncludeFile = FlOpenIncludeWithPrefix ("", Op->Asl.Value.String);
634 if (!IncludeFile)
635 {
636 goto ErrorExit;
637 }
638 return;
639 }
640
641 /*
642 * The include filename is not an absolute path.
643 *
644 * First, search for the file within the "local" directory -- meaning
645 * the same directory that contains the source file.
646 *
647 * Construct the file pathname from the global directory name.
648 */
649 IncludeFile = FlOpenIncludeWithPrefix (Gbl_DirectoryPath, Op->Asl.Value.String);
650 if (IncludeFile)
651 {
652 return;
653 }
654
655 /*
656 * Second, search for the file within the (possibly multiple) directories
657 * specified by the -I option on the command line.
658 */
659 NextDir = Gbl_IncludeDirList;
660 while (NextDir)
661 {
662 IncludeFile = FlOpenIncludeWithPrefix (NextDir->Dir, Op->Asl.Value.String);
663 if (IncludeFile)
664 {
665 return;
666 }
667
668 NextDir = NextDir->Next;
669 }
670
671 /* We could not open the include file after trying very hard */
672
673 ErrorExit:
674 sprintf (MsgBuffer, "%s, %s", Op->Asl.Value.String, strerror (errno));
675 AslError (ASL_ERROR, ASL_MSG_INCLUDE_FILE_OPEN, Op, MsgBuffer);
676 }
677
678
679 /*******************************************************************************
680 *
681 * FUNCTION: FlOpenInputFile
682 *
683 * PARAMETERS: InputFilename - The user-specified ASL source file to be
684 * compiled
685 *
686 * RETURN: Status
687 *
688 * DESCRIPTION: Open the specified input file, and save the directory path to
689 * the file so that include files can be opened in
690 * the same directory.
691 *
692 ******************************************************************************/
693
694 ACPI_STATUS
695 FlOpenInputFile (
696 char *InputFilename)
697 {
698
699 /* Open the input ASL file, text mode */
700
701 FlOpenFile (ASL_FILE_INPUT, InputFilename, "r");
702 AslCompilerin = Gbl_Files[ASL_FILE_INPUT].Handle;
703
704 return (AE_OK);
705 }
706
707
708 /*******************************************************************************
709 *
710 * FUNCTION: FlOpenAmlOutputFile
711 *
712 * PARAMETERS: FilenamePrefix - The user-specified ASL source file
713 *
714 * RETURN: Status
715 *
716 * DESCRIPTION: Create the output filename (*.AML) and open the file. The file
717 * is created in the same directory as the parent input file.
718 *
719 ******************************************************************************/
720
721 ACPI_STATUS
722 FlOpenAmlOutputFile (
723 char *FilenamePrefix)
724 {
725 char *Filename;
726
727
728 /* Output filename usually comes from the ASL itself */
729
730 Filename = Gbl_Files[ASL_FILE_AML_OUTPUT].Filename;
731 if (!Filename)
732 {
733 /* Create the output AML filename */
734
735 Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_AML_CODE);
736 if (!Filename)
737 {
738 AslCommonError (ASL_ERROR, ASL_MSG_OUTPUT_FILENAME,
739 0, 0, 0, 0, NULL, NULL);
740 return (AE_ERROR);
741 }
742 }
743
744 /* Open the output AML file in binary mode */
745
746 FlOpenFile (ASL_FILE_AML_OUTPUT, Filename, "w+b");
747 return (AE_OK);
748 }
749
750
751 /*******************************************************************************
752 *
753 * FUNCTION: FlOpenMiscOutputFiles
754 *
755 * PARAMETERS: FilenamePrefix - The user-specified ASL source file
756 *
757 * RETURN: Status
758 *
759 * DESCRIPTION: Create and open the various output files needed, depending on
760 * the command line options
761 *
762 ******************************************************************************/
763
764 ACPI_STATUS
765 FlOpenMiscOutputFiles (
766 char *FilenamePrefix)
767 {
768 char *Filename;
769
770
771 /* Create/Open a combined source output file */
772
773 Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_SOURCE);
774 if (!Filename)
775 {
776 AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME,
777 0, 0, 0, 0, NULL, NULL);
778 return (AE_ERROR);
779 }
780
781 /*
782 * Open the source output file, binary mode (so that LF does not get
783 * expanded to CR/LF on some systems, messing up our seek
784 * calculations.)
785 */
786 FlOpenFile (ASL_FILE_SOURCE_OUTPUT, Filename, "w+b");
787
788 /* Create/Open a listing output file if asked */
789
790 if (Gbl_ListingFlag)
791 {
792 Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_LISTING);
793 if (!Filename)
794 {
795 AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME,
796 0, 0, 0, 0, NULL, NULL);
797 return (AE_ERROR);
798 }
799
800 /* Open the listing file, text mode */
801
802 FlOpenFile (ASL_FILE_LISTING_OUTPUT, Filename, "w+");
803
804 AslCompilerSignon (ASL_FILE_LISTING_OUTPUT);
805 AslCompilerFileHeader (ASL_FILE_LISTING_OUTPUT);
806 }
807
808 /* Create/Open a assembly code source output file if asked */
809
810 if (Gbl_AsmOutputFlag)
811 {
812 Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_ASM_SOURCE);
813 if (!Filename)
814 {
815 AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME,
816 0, 0, 0, 0, NULL, NULL);
817 return (AE_ERROR);
818 }
819
820 /* Open the assembly code source file, text mode */
821
822 FlOpenFile (ASL_FILE_ASM_SOURCE_OUTPUT, Filename, "w+");
823
824 AslCompilerSignon (ASL_FILE_ASM_SOURCE_OUTPUT);
825 AslCompilerFileHeader (ASL_FILE_ASM_SOURCE_OUTPUT);
826 }
827
828 /* Create/Open a C code source output file if asked */
829
830 if (Gbl_C_OutputFlag)
831 {
832 Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_C_SOURCE);
833 if (!Filename)
834 {
835 AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME,
836 0, 0, 0, 0, NULL, NULL);
837 return (AE_ERROR);
838 }
839
840 /* Open the C code source file, text mode */
841
842 FlOpenFile (ASL_FILE_C_SOURCE_OUTPUT, Filename, "w+");
843
844 FlPrintFile (ASL_FILE_C_SOURCE_OUTPUT, "/*\n");
845 AslCompilerSignon (ASL_FILE_C_SOURCE_OUTPUT);
846 AslCompilerFileHeader (ASL_FILE_C_SOURCE_OUTPUT);
847 }
848
849 /* Create/Open a assembly include output file if asked */
850
851 if (Gbl_AsmIncludeOutputFlag)
852 {
853 Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_ASM_INCLUDE);
854 if (!Filename)
855 {
856 AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME,
857 0, 0, 0, 0, NULL, NULL);
858 return (AE_ERROR);
859 }
860
861 /* Open the assembly include file, text mode */
862
863 FlOpenFile (ASL_FILE_ASM_INCLUDE_OUTPUT, Filename, "w+");
864
865 AslCompilerSignon (ASL_FILE_ASM_INCLUDE_OUTPUT);
866 AslCompilerFileHeader (ASL_FILE_ASM_INCLUDE_OUTPUT);
867 }
868
869 /* Create/Open a C include output file if asked */
870
871 if (Gbl_C_IncludeOutputFlag)
872 {
873 Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_C_INCLUDE);
874 if (!Filename)
875 {
876 AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME,
877 0, 0, 0, 0, NULL, NULL);
878 return (AE_ERROR);
879 }
880
881 /* Open the C include file, text mode */
882
883 FlOpenFile (ASL_FILE_C_INCLUDE_OUTPUT, Filename, "w+");
884
885 FlPrintFile (ASL_FILE_C_INCLUDE_OUTPUT, "/*\n");
886 AslCompilerSignon (ASL_FILE_C_INCLUDE_OUTPUT);
887 AslCompilerFileHeader (ASL_FILE_C_INCLUDE_OUTPUT);
888 }
889
890 /* Create/Open a hex output file if asked */
891
892 if (Gbl_HexOutputFlag)
893 {
894 Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_HEX_DUMP);
895 if (!Filename)
896 {
897 AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME,
898 0, 0, 0, 0, NULL, NULL);
899 return (AE_ERROR);
900 }
901
902 /* Open the hex file, text mode */
903
904 FlOpenFile (ASL_FILE_HEX_OUTPUT, Filename, "w+");
905
906 AslCompilerSignon (ASL_FILE_HEX_OUTPUT);
907 AslCompilerFileHeader (ASL_FILE_HEX_OUTPUT);
908 }
909
910 /* Create a namespace output file if asked */
911
912 if (Gbl_NsOutputFlag)
913 {
914 Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_NAMESPACE);
915 if (!Filename)
916 {
917 AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME,
918 0, 0, 0, 0, NULL, NULL);
919 return (AE_ERROR);
920 }
921
922 /* Open the namespace file, text mode */
923
924 FlOpenFile (ASL_FILE_NAMESPACE_OUTPUT, Filename, "w+");
925
926 AslCompilerSignon (ASL_FILE_NAMESPACE_OUTPUT);
927 AslCompilerFileHeader (ASL_FILE_NAMESPACE_OUTPUT);
928 }
929
930 /* Create/Open a debug output file if asked */
931
932 if (Gbl_DebugFlag)
933 {
934 Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_DEBUG);
935 if (!Filename)
936 {
937 AslCommonError (ASL_ERROR, ASL_MSG_DEBUG_FILENAME,
938 0, 0, 0, 0, NULL, NULL);
939 return (AE_ERROR);
940 }
941
942 /* Open the debug file as STDERR, text mode */
943
944 /* TBD: hide this behind a FlReopenFile function */
945
946 Gbl_Files[ASL_FILE_DEBUG_OUTPUT].Filename = Filename;
947 Gbl_Files[ASL_FILE_DEBUG_OUTPUT].Handle =
948 freopen (Filename, "w+t", stderr);
949
950 AslCompilerSignon (ASL_FILE_DEBUG_OUTPUT);
951 AslCompilerFileHeader (ASL_FILE_DEBUG_OUTPUT);
952 }
953
954 return (AE_OK);
955 }
956
957
958 #ifdef ACPI_OBSOLETE_FUNCTIONS
959 /*******************************************************************************
960 *
961 * FUNCTION: FlParseInputPathname
962 *
963 * PARAMETERS: InputFilename - The user-specified ASL source file to be
964 * compiled
965 *
966 * RETURN: Status
967 *
968 * DESCRIPTION: Split the input path into a directory and filename part
969 * 1) Directory part used to open include files
970 * 2) Filename part used to generate output filenames
971 *
972 ******************************************************************************/
973
974 ACPI_STATUS
975 FlParseInputPathname (
976 char *InputFilename)
977 {
978 char *Substring;
979
980
981 if (!InputFilename)
982 {
983 return (AE_OK);
984 }
985
986 /* Get the path to the input filename's directory */
987
988 Gbl_DirectoryPath = strdup (InputFilename);
989 if (!Gbl_DirectoryPath)
990 {
991 return (AE_NO_MEMORY);
992 }
993
994 Substring = strrchr (Gbl_DirectoryPath, '\\');
995 if (!Substring)
996 {
997 Substring = strrchr (Gbl_DirectoryPath, '/');
998 if (!Substring)
999 {
1000 Substring = strrchr (Gbl_DirectoryPath, ':');
1001 }
1002 }
1003
1004 if (!Substring)
1005 {
1006 Gbl_DirectoryPath[0] = 0;
1007 if (Gbl_UseDefaultAmlFilename)
1008 {
1009 Gbl_OutputFilenamePrefix = strdup (InputFilename);
1010 }
1011 }
1012 else
1013 {
1014 if (Gbl_UseDefaultAmlFilename)
1015 {
1016 Gbl_OutputFilenamePrefix = strdup (Substring + 1);
1017 }
1018 *(Substring+1) = 0;
1019 }
1020
1021 return (AE_OK);
1022 }
1023 #endif
1024
1025
1026