xref: /netbsd-src/sys/external/bsd/acpica/dist/compiler/aslfiles.c (revision 796c32c94f6e154afc9de0f63da35c91bb739b45)
1 /******************************************************************************
2  *
3  * Module Name: aslfiles - File support functions
4  *
5  *****************************************************************************/
6 
7 /*
8  * Copyright (C) 2000 - 2017, 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 "aslcompiler.h"
45 #include "acapps.h"
46 
47 #define _COMPONENT          ACPI_COMPILER
48         ACPI_MODULE_NAME    ("aslfiles")
49 
50 /* Local prototypes */
51 
52 static FILE *
53 FlOpenIncludeWithPrefix (
54     char                    *PrefixDir,
55     ACPI_PARSE_OBJECT       *Op,
56     char                    *Filename);
57 
58 #ifdef ACPI_OBSOLETE_FUNCTIONS
59 ACPI_STATUS
60 FlParseInputPathname (
61     char                    *InputFilename);
62 #endif
63 
64 
65 /*******************************************************************************
66  *
67  * FUNCTION:    FlSetLineNumber
68  *
69  * PARAMETERS:  Op        - Parse node for the LINE asl statement
70  *
71  * RETURN:      None.
72  *
73  * DESCRIPTION: Set the current line number
74  *
75  ******************************************************************************/
76 
77 void
78 FlSetLineNumber (
79     UINT32                  LineNumber)
80 {
81 
82     DbgPrint (ASL_PARSE_OUTPUT, "\n#line: New line number %u (old %u)\n",
83          LineNumber, Gbl_LogicalLineNumber);
84 
85     Gbl_CurrentLineNumber = LineNumber;
86 }
87 
88 
89 /*******************************************************************************
90  *
91  * FUNCTION:    FlSetFilename
92  *
93  * PARAMETERS:  Op        - Parse node for the LINE asl statement
94  *
95  * RETURN:      None.
96  *
97  * DESCRIPTION: Set the current filename
98  *
99  ******************************************************************************/
100 
101 void
102 FlSetFilename (
103     char                    *Filename)
104 {
105 
106     DbgPrint (ASL_PARSE_OUTPUT, "\n#line: New filename %s (old %s)\n",
107          Filename, Gbl_Files[ASL_FILE_INPUT].Filename);
108 
109     /* No need to free any existing filename */
110 
111     Gbl_Files[ASL_FILE_INPUT].Filename = Filename;
112 }
113 
114 
115 /*******************************************************************************
116  *
117  * FUNCTION:    FlAddIncludeDirectory
118  *
119  * PARAMETERS:  Dir             - Directory pathname string
120  *
121  * RETURN:      None
122  *
123  * DESCRIPTION: Add a directory the list of include prefix directories.
124  *
125  ******************************************************************************/
126 
127 void
128 FlAddIncludeDirectory (
129     char                    *Dir)
130 {
131     ASL_INCLUDE_DIR         *NewDir;
132     ASL_INCLUDE_DIR         *NextDir;
133     ASL_INCLUDE_DIR         *PrevDir = NULL;
134     UINT32                  NeedsSeparator = 0;
135     size_t                  DirLength;
136 
137 
138     DirLength = strlen (Dir);
139     if (!DirLength)
140     {
141         return;
142     }
143 
144     /* Make sure that the pathname ends with a path separator */
145 
146     if ((Dir[DirLength-1] != '/') &&
147         (Dir[DirLength-1] != '\\'))
148     {
149         NeedsSeparator = 1;
150     }
151 
152     NewDir = ACPI_ALLOCATE_ZEROED (sizeof (ASL_INCLUDE_DIR));
153     NewDir->Dir = ACPI_ALLOCATE (DirLength + 1 + NeedsSeparator);
154     strcpy (NewDir->Dir, Dir);
155     if (NeedsSeparator)
156     {
157         strcat (NewDir->Dir, "/");
158     }
159 
160     /*
161      * Preserve command line ordering of -I options by adding new elements
162      * at the end of the list
163      */
164     NextDir = Gbl_IncludeDirList;
165     while (NextDir)
166     {
167         PrevDir = NextDir;
168         NextDir = NextDir->Next;
169     }
170 
171     if (PrevDir)
172     {
173         PrevDir->Next = NewDir;
174     }
175     else
176     {
177         Gbl_IncludeDirList = NewDir;
178     }
179 }
180 
181 
182 /*******************************************************************************
183  *
184  * FUNCTION:    FlMergePathnames
185  *
186  * PARAMETERS:  PrefixDir       - Prefix directory pathname. Can be NULL or
187  *                                a zero length string.
188  *              FilePathname    - The include filename from the source ASL.
189  *
190  * RETURN:      Merged pathname string
191  *
192  * DESCRIPTION: Merge two pathnames that (probably) have common elements, to
193  *              arrive at a minimal length string. Merge can occur if the
194  *              FilePathname is relative to the PrefixDir.
195  *
196  ******************************************************************************/
197 
198 char *
199 FlMergePathnames (
200     char                    *PrefixDir,
201     char                    *FilePathname)
202 {
203     char                    *CommonPath;
204     char                    *Pathname;
205     char                    *LastElement;
206 
207 
208     DbgPrint (ASL_PARSE_OUTPUT, "Include: Prefix path - \"%s\"\n"
209         "Include: FilePathname - \"%s\"\n",
210          PrefixDir, FilePathname);
211 
212     /*
213      * If there is no prefix directory or if the file pathname is absolute,
214      * just return the original file pathname
215      */
216     if (!PrefixDir || (!*PrefixDir) ||
217         (*FilePathname == '/') ||
218          (FilePathname[1] == ':'))
219     {
220         Pathname = UtLocalCacheCalloc (strlen (FilePathname) + 1);
221         strcpy (Pathname, FilePathname);
222         goto ConvertBackslashes;
223     }
224 
225     /* Need a local copy of the prefix directory path */
226 
227     CommonPath = UtLocalCacheCalloc (strlen (PrefixDir) + 1);
228     strcpy (CommonPath, PrefixDir);
229 
230     /*
231      * Walk forward through the file path, and simultaneously backward
232      * through the prefix directory path until there are no more
233      * relative references at the start of the file path.
234      */
235     while (*FilePathname && (!strncmp (FilePathname, "../", 3)))
236     {
237         /* Remove last element of the prefix directory path */
238 
239         LastElement = strrchr (CommonPath, '/');
240         if (!LastElement)
241         {
242             goto ConcatenatePaths;
243         }
244 
245         *LastElement = 0;   /* Terminate CommonPath string */
246         FilePathname += 3;  /* Point to next path element */
247     }
248 
249     /*
250      * Remove the last element of the prefix directory path (it is the same as
251      * the first element of the file pathname), and build the final merged
252      * pathname.
253      */
254     LastElement = strrchr (CommonPath, '/');
255     if (LastElement)
256     {
257         *LastElement = 0;
258     }
259 
260     /* Build the final merged pathname */
261 
262 ConcatenatePaths:
263     Pathname = UtLocalCacheCalloc (
264         strlen (CommonPath) + strlen (FilePathname) + 2);
265     if (LastElement && *CommonPath)
266     {
267         strcpy (Pathname, CommonPath);
268         strcat (Pathname, "/");
269     }
270     strcat (Pathname, FilePathname);
271 
272     /* Convert all backslashes to normal slashes */
273 
274 ConvertBackslashes:
275     UtConvertBackslashes (Pathname);
276 
277     DbgPrint (ASL_PARSE_OUTPUT, "Include: Merged Pathname - \"%s\"\n",
278          Pathname);
279     return (Pathname);
280 }
281 
282 
283 /*******************************************************************************
284  *
285  * FUNCTION:    FlOpenIncludeWithPrefix
286  *
287  * PARAMETERS:  PrefixDir       - Prefix directory pathname. Can be a zero
288  *                                length string.
289  *              Filename        - The include filename from the source ASL.
290  *
291  * RETURN:      Valid file descriptor if successful. Null otherwise.
292  *
293  * DESCRIPTION: Open an include file and push it on the input file stack.
294  *
295  ******************************************************************************/
296 
297 static FILE *
298 FlOpenIncludeWithPrefix (
299     char                    *PrefixDir,
300     ACPI_PARSE_OBJECT       *Op,
301     char                    *Filename)
302 {
303     FILE                    *IncludeFile;
304     char                    *Pathname;
305     UINT32                  OriginalLineNumber;
306 
307 
308     /* Build the full pathname to the file */
309 
310     Pathname = FlMergePathnames (PrefixDir, Filename);
311 
312     DbgPrint (ASL_PARSE_OUTPUT, "Include: Opening file - \"%s\"\n\n",
313         Pathname);
314 
315     /* Attempt to open the file, push if successful */
316 
317     IncludeFile = fopen (Pathname, "r");
318     if (!IncludeFile)
319     {
320         fprintf (stderr, "Could not open include file %s\n", Pathname);
321         ACPI_FREE (Pathname);
322         return (NULL);
323     }
324 
325     /*
326      * Check the entire include file for any # preprocessor directives.
327      * This is because there may be some confusion between the #include
328      * preprocessor directive and the ASL Include statement. A file included
329      * by the ASL include cannot contain preprocessor directives because
330      * the preprocessor has already run by the time the ASL include is
331      * recognized (by the compiler, not the preprocessor.)
332      *
333      * Note: DtGetNextLine strips/ignores comments.
334      * Save current line number since DtGetNextLine modifies it.
335      */
336     Gbl_CurrentLineNumber--;
337     OriginalLineNumber = Gbl_CurrentLineNumber;
338 
339     while (DtGetNextLine (IncludeFile, DT_ALLOW_MULTILINE_QUOTES) != ASL_EOF)
340     {
341         if (Gbl_CurrentLineBuffer[0] == '#')
342         {
343             AslError (ASL_ERROR, ASL_MSG_INCLUDE_FILE,
344                 Op, "use #include instead");
345         }
346     }
347 
348     Gbl_CurrentLineNumber = OriginalLineNumber;
349 
350     /* Must seek back to the start of the file */
351 
352     fseek (IncludeFile, 0, SEEK_SET);
353 
354     /* Push the include file on the open input file stack */
355 
356     AslPushInputFileStack (IncludeFile, Pathname);
357     return (IncludeFile);
358 }
359 
360 
361 /*******************************************************************************
362  *
363  * FUNCTION:    FlOpenIncludeFile
364  *
365  * PARAMETERS:  Op        - Parse node for the INCLUDE ASL statement
366  *
367  * RETURN:      None.
368  *
369  * DESCRIPTION: Open an include file and push it on the input file stack.
370  *
371  ******************************************************************************/
372 
373 void
374 FlOpenIncludeFile (
375     ACPI_PARSE_OBJECT       *Op)
376 {
377     FILE                    *IncludeFile;
378     ASL_INCLUDE_DIR         *NextDir;
379 
380 
381     /* Op must be valid */
382 
383     if (!Op)
384     {
385         AslCommonError (ASL_ERROR, ASL_MSG_INCLUDE_FILE_OPEN,
386             Gbl_CurrentLineNumber, Gbl_LogicalLineNumber,
387             Gbl_InputByteCount, Gbl_CurrentColumn,
388             Gbl_Files[ASL_FILE_INPUT].Filename, " - Null parse node");
389 
390         return;
391     }
392 
393     /*
394      * Flush out the "include ()" statement on this line, start
395      * the actual include file on the next line
396      */
397     AslResetCurrentLineBuffer ();
398     FlPrintFile (ASL_FILE_SOURCE_OUTPUT, "\n");
399     Gbl_CurrentLineOffset++;
400 
401 
402     /* Attempt to open the include file */
403 
404     /* If the file specifies an absolute path, just open it */
405 
406     if ((Op->Asl.Value.String[0] == '/')  ||
407         (Op->Asl.Value.String[0] == '\\') ||
408         (Op->Asl.Value.String[1] == ':'))
409     {
410         IncludeFile = FlOpenIncludeWithPrefix ("", Op, Op->Asl.Value.String);
411         if (!IncludeFile)
412         {
413             goto ErrorExit;
414         }
415         return;
416     }
417 
418     /*
419      * The include filename is not an absolute path.
420      *
421      * First, search for the file within the "local" directory -- meaning
422      * the same directory that contains the source file.
423      *
424      * Construct the file pathname from the global directory name.
425      */
426     IncludeFile = FlOpenIncludeWithPrefix (
427         Gbl_DirectoryPath, Op, Op->Asl.Value.String);
428     if (IncludeFile)
429     {
430         return;
431     }
432 
433     /*
434      * Second, search for the file within the (possibly multiple) directories
435      * specified by the -I option on the command line.
436      */
437     NextDir = Gbl_IncludeDirList;
438     while (NextDir)
439     {
440         IncludeFile = FlOpenIncludeWithPrefix (
441             NextDir->Dir, Op, Op->Asl.Value.String);
442         if (IncludeFile)
443         {
444             return;
445         }
446 
447         NextDir = NextDir->Next;
448     }
449 
450     /* We could not open the include file after trying very hard */
451 
452 ErrorExit:
453     snprintf (MsgBuffer, sizeof(MsgBuffer), "%s, %s", Op->Asl.Value.String, strerror (errno));
454     AslError (ASL_ERROR, ASL_MSG_INCLUDE_FILE_OPEN, Op, MsgBuffer);
455 }
456 
457 
458 /*******************************************************************************
459  *
460  * FUNCTION:    FlOpenInputFile
461  *
462  * PARAMETERS:  InputFilename       - The user-specified ASL source file to be
463  *                                    compiled
464  *
465  * RETURN:      Status
466  *
467  * DESCRIPTION: Open the specified input file, and save the directory path to
468  *              the file so that include files can be opened in
469  *              the same directory.
470  *
471  ******************************************************************************/
472 
473 ACPI_STATUS
474 FlOpenInputFile (
475     char                    *InputFilename)
476 {
477 
478     /* Open the input ASL file, text mode */
479 
480     FlOpenFile (ASL_FILE_INPUT, InputFilename, "rt");
481     AslCompilerin = Gbl_Files[ASL_FILE_INPUT].Handle;
482 
483     return (AE_OK);
484 }
485 
486 
487 /*******************************************************************************
488  *
489  * FUNCTION:    FlOpenAmlOutputFile
490  *
491  * PARAMETERS:  FilenamePrefix       - The user-specified ASL source file
492  *
493  * RETURN:      Status
494  *
495  * DESCRIPTION: Create the output filename (*.AML) and open the file. The file
496  *              is created in the same directory as the parent input file.
497  *
498  ******************************************************************************/
499 
500 ACPI_STATUS
501 FlOpenAmlOutputFile (
502     char                    *FilenamePrefix)
503 {
504     char                    *Filename;
505 
506 
507     /* Output filename usually comes from the ASL itself */
508 
509     Filename = Gbl_Files[ASL_FILE_AML_OUTPUT].Filename;
510     if (!Filename)
511     {
512         /* Create the output AML filename */
513         if (!Gbl_CaptureComments)
514         {
515             Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_AML_CODE);
516         }
517         else
518         {
519             Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_CONVERT_AML);
520         }
521         if (!Filename)
522         {
523             AslCommonError (ASL_ERROR, ASL_MSG_OUTPUT_FILENAME,
524                 0, 0, 0, 0, NULL, NULL);
525             return (AE_ERROR);
526         }
527 
528         Gbl_Files[ASL_FILE_AML_OUTPUT].Filename = Filename;
529     }
530 
531     /* Open the output AML file in binary mode */
532 
533     FlOpenFile (ASL_FILE_AML_OUTPUT, Filename, "w+b");
534     return (AE_OK);
535 }
536 
537 
538 /*******************************************************************************
539  *
540  * FUNCTION:    FlOpenMiscOutputFiles
541  *
542  * PARAMETERS:  FilenamePrefix       - The user-specified ASL source file
543  *
544  * RETURN:      Status
545  *
546  * DESCRIPTION: Create and open the various output files needed, depending on
547  *              the command line options
548  *
549  ******************************************************************************/
550 
551 ACPI_STATUS
552 FlOpenMiscOutputFiles (
553     char                    *FilenamePrefix)
554 {
555     char                    *Filename;
556 
557 
558      /* Create/Open a map file if requested */
559 
560     if (Gbl_MapfileFlag)
561     {
562         Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_MAP);
563         if (!Filename)
564         {
565             AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME,
566                 0, 0, 0, 0, NULL, NULL);
567             return (AE_ERROR);
568         }
569 
570         /* Open the hex file, text mode (closed at compiler exit) */
571 
572         FlOpenFile (ASL_FILE_MAP_OUTPUT, Filename, "w+t");
573 
574         AslCompilerSignon (ASL_FILE_MAP_OUTPUT);
575         AslCompilerFileHeader (ASL_FILE_MAP_OUTPUT);
576     }
577 
578     /* All done for disassembler */
579 
580     if (Gbl_FileType == ASL_INPUT_TYPE_BINARY_ACPI_TABLE)
581     {
582         return (AE_OK);
583     }
584 
585     /* Create/Open a hex output file if asked */
586 
587     if (Gbl_HexOutputFlag)
588     {
589         Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_HEX_DUMP);
590         if (!Filename)
591         {
592             AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME,
593                 0, 0, 0, 0, NULL, NULL);
594             return (AE_ERROR);
595         }
596 
597         /* Open the hex file, text mode */
598 
599         FlOpenFile (ASL_FILE_HEX_OUTPUT, Filename, "w+t");
600 
601         AslCompilerSignon (ASL_FILE_HEX_OUTPUT);
602         AslCompilerFileHeader (ASL_FILE_HEX_OUTPUT);
603     }
604 
605     /* Create/Open a debug output file if asked */
606 
607     if (Gbl_DebugFlag)
608     {
609         Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_DEBUG);
610         if (!Filename)
611         {
612             AslCommonError (ASL_ERROR, ASL_MSG_DEBUG_FILENAME,
613                 0, 0, 0, 0, NULL, NULL);
614             return (AE_ERROR);
615         }
616 
617         /* Open the debug file as STDERR, text mode */
618 
619         Gbl_Files[ASL_FILE_DEBUG_OUTPUT].Filename = Filename;
620         Gbl_Files[ASL_FILE_DEBUG_OUTPUT].Handle =
621             freopen (Filename, "w+t", stderr);
622 
623         if (!Gbl_Files[ASL_FILE_DEBUG_OUTPUT].Handle)
624         {
625             /*
626              * A problem with freopen is that on error, we no longer
627              * have stderr and cannot emit normal error messages.
628              * Emit error to stdout, close files, and exit.
629              */
630             fprintf (stdout,
631                 "\nCould not open debug output file: %s\n\n", Filename);
632 
633             CmCleanupAndExit ();
634             exit (1);
635         }
636 
637         AslCompilerSignon (ASL_FILE_DEBUG_OUTPUT);
638         AslCompilerFileHeader (ASL_FILE_DEBUG_OUTPUT);
639     }
640 
641     /* Create/Open a cross-reference output file if asked */
642 
643     if (Gbl_CrossReferenceOutput)
644     {
645         Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_XREF);
646         if (!Filename)
647         {
648             AslCommonError (ASL_ERROR, ASL_MSG_DEBUG_FILENAME,
649                 0, 0, 0, 0, NULL, NULL);
650             return (AE_ERROR);
651         }
652 
653         FlOpenFile (ASL_FILE_XREF_OUTPUT, Filename, "w+t");
654 
655         AslCompilerSignon (ASL_FILE_XREF_OUTPUT);
656         AslCompilerFileHeader (ASL_FILE_XREF_OUTPUT);
657     }
658 
659     /* Create/Open a listing output file if asked */
660 
661     if (Gbl_ListingFlag)
662     {
663         Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_LISTING);
664         if (!Filename)
665         {
666             AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME,
667                 0, 0, 0, 0, NULL, NULL);
668             return (AE_ERROR);
669         }
670 
671         /* Open the listing file, text mode */
672 
673         FlOpenFile (ASL_FILE_LISTING_OUTPUT, Filename, "w+t");
674 
675         AslCompilerSignon (ASL_FILE_LISTING_OUTPUT);
676         AslCompilerFileHeader (ASL_FILE_LISTING_OUTPUT);
677     }
678 
679     /* Create the preprocessor output temp file if preprocessor enabled */
680 
681     if (Gbl_PreprocessFlag)
682     {
683         Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_PREPROCESSOR);
684         if (!Filename)
685         {
686             AslCommonError (ASL_ERROR, ASL_MSG_PREPROCESSOR_FILENAME,
687                 0, 0, 0, 0, NULL, NULL);
688             return (AE_ERROR);
689         }
690 
691         FlOpenFile (ASL_FILE_PREPROCESSOR, Filename, "w+t");
692     }
693 
694     /*
695      * Create the "user" preprocessor output file if -li flag set.
696      * Note, this file contains no embedded #line directives.
697      */
698     if (Gbl_PreprocessorOutputFlag)
699     {
700         Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_PREPROC_USER);
701         if (!Filename)
702         {
703             AslCommonError (ASL_ERROR, ASL_MSG_PREPROCESSOR_FILENAME,
704                 0, 0, 0, 0, NULL, NULL);
705             return (AE_ERROR);
706         }
707 
708         FlOpenFile (ASL_FILE_PREPROCESSOR_USER, Filename, "w+t");
709     }
710 
711     /* All done for data table compiler */
712 
713     if (Gbl_FileType == ASL_INPUT_TYPE_ASCII_DATA)
714     {
715         return (AE_OK);
716     }
717 
718     /* Create/Open a combined source output file */
719 
720     Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_SOURCE);
721     if (!Filename)
722     {
723         AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME,
724             0, 0, 0, 0, NULL, NULL);
725         return (AE_ERROR);
726     }
727 
728     /*
729      * Open the source output file, binary mode (so that LF does not get
730      * expanded to CR/LF on some systems, messing up our seek
731      * calculations.)
732      */
733     FlOpenFile (ASL_FILE_SOURCE_OUTPUT, Filename, "w+b");
734 
735 /*
736 // TBD: TEMP
737 //    AslCompilerin = Gbl_Files[ASL_FILE_SOURCE_OUTPUT].Handle;
738 */
739     /* Create/Open a assembly code source output file if asked */
740 
741     if (Gbl_AsmOutputFlag)
742     {
743         Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_ASM_SOURCE);
744         if (!Filename)
745         {
746             AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME,
747                 0, 0, 0, 0, NULL, NULL);
748             return (AE_ERROR);
749         }
750 
751         /* Open the assembly code source file, text mode */
752 
753         FlOpenFile (ASL_FILE_ASM_SOURCE_OUTPUT, Filename, "w+t");
754 
755         AslCompilerSignon (ASL_FILE_ASM_SOURCE_OUTPUT);
756         AslCompilerFileHeader (ASL_FILE_ASM_SOURCE_OUTPUT);
757     }
758 
759     /* Create/Open a C code source output file if asked */
760 
761     if (Gbl_C_OutputFlag)
762     {
763         Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_C_SOURCE);
764         if (!Filename)
765         {
766             AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME,
767                 0, 0, 0, 0, NULL, NULL);
768             return (AE_ERROR);
769         }
770 
771         /* Open the C code source file, text mode */
772 
773         FlOpenFile (ASL_FILE_C_SOURCE_OUTPUT, Filename, "w+t");
774 
775         FlPrintFile (ASL_FILE_C_SOURCE_OUTPUT, "/*\n");
776         AslCompilerSignon (ASL_FILE_C_SOURCE_OUTPUT);
777         AslCompilerFileHeader (ASL_FILE_C_SOURCE_OUTPUT);
778     }
779 
780     /* Create/Open a C code source output file for the offset table if asked */
781 
782     if (Gbl_C_OffsetTableFlag)
783     {
784         Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_C_OFFSET);
785         if (!Filename)
786         {
787             AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME,
788                 0, 0, 0, 0, NULL, NULL);
789             return (AE_ERROR);
790         }
791 
792         /* Open the C code source file, text mode */
793 
794         FlOpenFile (ASL_FILE_C_OFFSET_OUTPUT, Filename, "w+t");
795 
796         FlPrintFile (ASL_FILE_C_OFFSET_OUTPUT, "/*\n");
797         AslCompilerSignon (ASL_FILE_C_OFFSET_OUTPUT);
798         AslCompilerFileHeader (ASL_FILE_C_OFFSET_OUTPUT);
799     }
800 
801     /* Create/Open a assembly include output file if asked */
802 
803     if (Gbl_AsmIncludeOutputFlag)
804     {
805         Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_ASM_INCLUDE);
806         if (!Filename)
807         {
808             AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME,
809                 0, 0, 0, 0, NULL, NULL);
810             return (AE_ERROR);
811         }
812 
813         /* Open the assembly include file, text mode */
814 
815         FlOpenFile (ASL_FILE_ASM_INCLUDE_OUTPUT, Filename, "w+t");
816 
817         AslCompilerSignon (ASL_FILE_ASM_INCLUDE_OUTPUT);
818         AslCompilerFileHeader (ASL_FILE_ASM_INCLUDE_OUTPUT);
819     }
820 
821     /* Create/Open a C include output file if asked */
822 
823     if (Gbl_C_IncludeOutputFlag)
824     {
825         Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_C_INCLUDE);
826         if (!Filename)
827         {
828             AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME,
829                 0, 0, 0, 0, NULL, NULL);
830             return (AE_ERROR);
831         }
832 
833         /* Open the C include file, text mode */
834 
835         FlOpenFile (ASL_FILE_C_INCLUDE_OUTPUT, Filename, "w+t");
836 
837         FlPrintFile (ASL_FILE_C_INCLUDE_OUTPUT, "/*\n");
838         AslCompilerSignon (ASL_FILE_C_INCLUDE_OUTPUT);
839         AslCompilerFileHeader (ASL_FILE_C_INCLUDE_OUTPUT);
840     }
841 
842     /* Create a namespace output file if asked */
843 
844     if (Gbl_NsOutputFlag)
845     {
846         Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_NAMESPACE);
847         if (!Filename)
848         {
849             AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME,
850                 0, 0, 0, 0, NULL, NULL);
851             return (AE_ERROR);
852         }
853 
854         /* Open the namespace file, text mode */
855 
856         FlOpenFile (ASL_FILE_NAMESPACE_OUTPUT, Filename, "w+t");
857 
858         AslCompilerSignon (ASL_FILE_NAMESPACE_OUTPUT);
859         AslCompilerFileHeader (ASL_FILE_NAMESPACE_OUTPUT);
860     }
861 
862     /* Create a debug file for the converter */
863 
864     if (AcpiGbl_DebugAslConversion)
865     {
866         Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_CONVERT_DEBUG);
867         if (!Filename)
868         {
869             AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME,
870                 0, 0, 0, 0, NULL, NULL);
871             return (AE_ERROR);
872         }
873 
874         /* Open the converter debug file, text mode */
875 
876         FlOpenFile (ASL_FILE_CONV_DEBUG_OUTPUT, Filename, "w+t");
877 
878         AslCompilerSignon (ASL_FILE_CONV_DEBUG_OUTPUT);
879         AslCompilerFileHeader (ASL_FILE_CONV_DEBUG_OUTPUT);
880 
881         AcpiGbl_ConvDebugFile = Gbl_Files[ASL_FILE_CONV_DEBUG_OUTPUT].Handle;
882     }
883 
884     return (AE_OK);
885 }
886 
887 
888 #ifdef ACPI_OBSOLETE_FUNCTIONS
889 /*******************************************************************************
890  *
891  * FUNCTION:    FlParseInputPathname
892  *
893  * PARAMETERS:  InputFilename       - The user-specified ASL source file to be
894  *                                    compiled
895  *
896  * RETURN:      Status
897  *
898  * DESCRIPTION: Split the input path into a directory and filename part
899  *              1) Directory part used to open include files
900  *              2) Filename part used to generate output filenames
901  *
902  ******************************************************************************/
903 
904 ACPI_STATUS
905 FlParseInputPathname (
906     char                    *InputFilename)
907 {
908     char                    *Substring;
909 
910 
911     if (!InputFilename)
912     {
913         return (AE_OK);
914     }
915 
916     /* Get the path to the input filename's directory */
917 
918     Gbl_DirectoryPath = strdup (InputFilename);
919     if (!Gbl_DirectoryPath)
920     {
921         return (AE_NO_MEMORY);
922     }
923 
924     Substring = strrchr (Gbl_DirectoryPath, '\\');
925     if (!Substring)
926     {
927         Substring = strrchr (Gbl_DirectoryPath, '/');
928         if (!Substring)
929         {
930             Substring = strrchr (Gbl_DirectoryPath, ':');
931         }
932     }
933 
934     if (!Substring)
935     {
936         Gbl_DirectoryPath[0] = 0;
937         if (Gbl_UseDefaultAmlFilename)
938         {
939             Gbl_OutputFilenamePrefix = strdup (InputFilename);
940         }
941     }
942     else
943     {
944         if (Gbl_UseDefaultAmlFilename)
945         {
946             Gbl_OutputFilenamePrefix = strdup (Substring + 1);
947         }
948         *(Substring+1) = 0;
949     }
950 
951     UtConvertBackslashes (Gbl_OutputFilenamePrefix);
952     return (AE_OK);
953 }
954 #endif
955