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