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