Blame source/compiler/aslfiles.c

Packit Service 1fb00e
/******************************************************************************
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * Module Name: aslfiles - File support functions
Packit Service 1fb00e
 *
Packit Service 1fb00e
 *****************************************************************************/
Packit Service 1fb00e
Packit Service 1fb00e
/*
Packit Service 1fb00e
 * Copyright (C) 2000 - 2018, Intel Corp.
Packit Service 1fb00e
 * All rights reserved.
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * Redistribution and use in source and binary forms, with or without
Packit Service 1fb00e
 * modification, are permitted provided that the following conditions
Packit Service 1fb00e
 * are met:
Packit Service 1fb00e
 * 1. Redistributions of source code must retain the above copyright
Packit Service 1fb00e
 *    notice, this list of conditions, and the following disclaimer,
Packit Service 1fb00e
 *    without modification.
Packit Service 1fb00e
 * 2. Redistributions in binary form must reproduce at minimum a disclaimer
Packit Service 1fb00e
 *    substantially similar to the "NO WARRANTY" disclaimer below
Packit Service 1fb00e
 *    ("Disclaimer") and any redistribution must be conditioned upon
Packit Service 1fb00e
 *    including a substantially similar Disclaimer requirement for further
Packit Service 1fb00e
 *    binary redistribution.
Packit Service 1fb00e
 * 3. Neither the names of the above-listed copyright holders nor the names
Packit Service 1fb00e
 *    of any contributors may be used to endorse or promote products derived
Packit Service 1fb00e
 *    from this software without specific prior written permission.
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * Alternatively, this software may be distributed under the terms of the
Packit Service 1fb00e
 * GNU General Public License ("GPL") version 2 as published by the Free
Packit Service 1fb00e
 * Software Foundation.
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * NO WARRANTY
Packit Service 1fb00e
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
Packit Service 1fb00e
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
Packit Service 1fb00e
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
Packit Service 1fb00e
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
Packit Service 1fb00e
 * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
Packit Service 1fb00e
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
Packit Service 1fb00e
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
Packit Service 1fb00e
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
Packit Service 1fb00e
 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
Packit Service 1fb00e
 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
Packit Service 1fb00e
 * POSSIBILITY OF SUCH DAMAGES.
Packit Service 1fb00e
 */
Packit Service 1fb00e
Packit Service 1fb00e
#include "aslcompiler.h"
Packit Service 1fb00e
#include "acapps.h"
Packit Service 1fb00e
Packit Service 1fb00e
#define _COMPONENT          ACPI_COMPILER
Packit Service 1fb00e
        ACPI_MODULE_NAME    ("aslfiles")
Packit Service 1fb00e
Packit Service 1fb00e
/* Local prototypes */
Packit Service 1fb00e
Packit Service 1fb00e
static FILE *
Packit Service 1fb00e
FlOpenIncludeWithPrefix (
Packit Service 1fb00e
    char                    *PrefixDir,
Packit Service 1fb00e
    ACPI_PARSE_OBJECT       *Op,
Packit Service 1fb00e
    char                    *Filename);
Packit Service 1fb00e
Packit Service 1fb00e
#ifdef ACPI_OBSOLETE_FUNCTIONS
Packit Service 1fb00e
ACPI_STATUS
Packit Service 1fb00e
FlParseInputPathname (
Packit Service 1fb00e
    char                    *InputFilename);
Packit Service 1fb00e
#endif
Packit Service 1fb00e
Packit Service 1fb00e
Packit Service 1fb00e
/*******************************************************************************
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * FUNCTION:    FlSetLineNumber
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * PARAMETERS:  Op        - Parse node for the LINE asl statement
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * RETURN:      None.
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * DESCRIPTION: Set the current line number
Packit Service 1fb00e
 *
Packit Service 1fb00e
 ******************************************************************************/
Packit Service 1fb00e
Packit Service 1fb00e
void
Packit Service 1fb00e
FlSetLineNumber (
Packit Service 1fb00e
    UINT32                  LineNumber)
Packit Service 1fb00e
{
Packit Service 1fb00e
Packit Service 1fb00e
    DbgPrint (ASL_PARSE_OUTPUT, "\n#line: New line number %u (old %u)\n",
Packit Service 1fb00e
         LineNumber, Gbl_LogicalLineNumber);
Packit Service 1fb00e
Packit Service 1fb00e
    Gbl_CurrentLineNumber = LineNumber;
Packit Service 1fb00e
}
Packit Service 1fb00e
Packit Service 1fb00e
Packit Service 1fb00e
/*******************************************************************************
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * FUNCTION:    FlSetFilename
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * PARAMETERS:  Op        - Parse node for the LINE asl statement
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * RETURN:      None.
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * DESCRIPTION: Set the current filename
Packit Service 1fb00e
 *
Packit Service 1fb00e
 ******************************************************************************/
Packit Service 1fb00e
Packit Service 1fb00e
void
Packit Service 1fb00e
FlSetFilename (
Packit Service 1fb00e
    char                    *Filename)
Packit Service 1fb00e
{
Packit Service 1fb00e
Packit Service 1fb00e
    DbgPrint (ASL_PARSE_OUTPUT, "\n#line: New filename %s (old %s)\n",
Packit Service 1fb00e
         Filename, Gbl_Files[ASL_FILE_INPUT].Filename);
Packit Service 1fb00e
Packit Service 1fb00e
    /* No need to free any existing filename */
Packit Service 1fb00e
Packit Service 1fb00e
    Gbl_Files[ASL_FILE_INPUT].Filename = Filename;
Packit Service 1fb00e
}
Packit Service 1fb00e
Packit Service 1fb00e
Packit Service 1fb00e
/*******************************************************************************
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * FUNCTION:    FlAddIncludeDirectory
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * PARAMETERS:  Dir             - Directory pathname string
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * RETURN:      None
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * DESCRIPTION: Add a directory the list of include prefix directories.
Packit Service 1fb00e
 *
Packit Service 1fb00e
 ******************************************************************************/
Packit Service 1fb00e
Packit Service 1fb00e
void
Packit Service 1fb00e
FlAddIncludeDirectory (
Packit Service 1fb00e
    char                    *Dir)
Packit Service 1fb00e
{
Packit Service 1fb00e
    ASL_INCLUDE_DIR         *NewDir;
Packit Service 1fb00e
    ASL_INCLUDE_DIR         *NextDir;
Packit Service 1fb00e
    ASL_INCLUDE_DIR         *PrevDir = NULL;
Packit Service 1fb00e
    UINT32                  NeedsSeparator = 0;
Packit Service 1fb00e
    size_t                  DirLength;
Packit Service 1fb00e
Packit Service 1fb00e
Packit Service 1fb00e
    DirLength = strlen (Dir);
Packit Service 1fb00e
    if (!DirLength)
Packit Service 1fb00e
    {
Packit Service 1fb00e
        return;
Packit Service 1fb00e
    }
Packit Service 1fb00e
Packit Service 1fb00e
    /* Make sure that the pathname ends with a path separator */
Packit Service 1fb00e
Packit Service 1fb00e
    if ((Dir[DirLength-1] != '/') &&
Packit Service 1fb00e
        (Dir[DirLength-1] != '\\'))
Packit Service 1fb00e
    {
Packit Service 1fb00e
        NeedsSeparator = 1;
Packit Service 1fb00e
    }
Packit Service 1fb00e
Packit Service 1fb00e
    NewDir = ACPI_ALLOCATE_ZEROED (sizeof (ASL_INCLUDE_DIR));
Packit Service 1fb00e
    NewDir->Dir = ACPI_ALLOCATE (DirLength + 1 + NeedsSeparator);
Packit Service 1fb00e
    strcpy (NewDir->Dir, Dir);
Packit Service 1fb00e
    if (NeedsSeparator)
Packit Service 1fb00e
    {
Packit Service 1fb00e
        strcat (NewDir->Dir, "/");
Packit Service 1fb00e
    }
Packit Service 1fb00e
Packit Service 1fb00e
    /*
Packit Service 1fb00e
     * Preserve command line ordering of -I options by adding new elements
Packit Service 1fb00e
     * at the end of the list
Packit Service 1fb00e
     */
Packit Service 1fb00e
    NextDir = Gbl_IncludeDirList;
Packit Service 1fb00e
    while (NextDir)
Packit Service 1fb00e
    {
Packit Service 1fb00e
        PrevDir = NextDir;
Packit Service 1fb00e
        NextDir = NextDir->Next;
Packit Service 1fb00e
    }
Packit Service 1fb00e
Packit Service 1fb00e
    if (PrevDir)
Packit Service 1fb00e
    {
Packit Service 1fb00e
        PrevDir->Next = NewDir;
Packit Service 1fb00e
    }
Packit Service 1fb00e
    else
Packit Service 1fb00e
    {
Packit Service 1fb00e
        Gbl_IncludeDirList = NewDir;
Packit Service 1fb00e
    }
Packit Service 1fb00e
}
Packit Service 1fb00e
Packit Service 1fb00e
Packit Service 1fb00e
/*******************************************************************************
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * FUNCTION:    FlMergePathnames
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * PARAMETERS:  PrefixDir       - Prefix directory pathname. Can be NULL or
Packit Service 1fb00e
 *                                a zero length string.
Packit Service 1fb00e
 *              FilePathname    - The include filename from the source ASL.
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * RETURN:      Merged pathname string
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * DESCRIPTION: Merge two pathnames that (probably) have common elements, to
Packit Service 1fb00e
 *              arrive at a minimal length string. Merge can occur if the
Packit Service 1fb00e
 *              FilePathname is relative to the PrefixDir.
Packit Service 1fb00e
 *
Packit Service 1fb00e
 ******************************************************************************/
Packit Service 1fb00e
Packit Service 1fb00e
char *
Packit Service 1fb00e
FlMergePathnames (
Packit Service 1fb00e
    char                    *PrefixDir,
Packit Service 1fb00e
    char                    *FilePathname)
Packit Service 1fb00e
{
Packit Service 1fb00e
    char                    *CommonPath;
Packit Service 1fb00e
    char                    *Pathname;
Packit Service 1fb00e
    char                    *LastElement;
Packit Service 1fb00e
Packit Service 1fb00e
Packit Service 1fb00e
    DbgPrint (ASL_PARSE_OUTPUT, "Include: Prefix path - \"%s\"\n"
Packit Service 1fb00e
        "Include: FilePathname - \"%s\"\n",
Packit Service 1fb00e
         PrefixDir, FilePathname);
Packit Service 1fb00e
Packit Service 1fb00e
    /*
Packit Service 1fb00e
     * If there is no prefix directory or if the file pathname is absolute,
Packit Service 1fb00e
     * just return the original file pathname
Packit Service 1fb00e
     */
Packit Service 1fb00e
    if (!PrefixDir || (!*PrefixDir) ||
Packit Service 1fb00e
        (*FilePathname == '/') ||
Packit Service 1fb00e
         (FilePathname[1] == ':'))
Packit Service 1fb00e
    {
Packit Service 1fb00e
        Pathname = UtLocalCacheCalloc (strlen (FilePathname) + 1);
Packit Service 1fb00e
        strcpy (Pathname, FilePathname);
Packit Service 1fb00e
        goto ConvertBackslashes;
Packit Service 1fb00e
    }
Packit Service 1fb00e
Packit Service 1fb00e
    /* Need a local copy of the prefix directory path */
Packit Service 1fb00e
Packit Service 1fb00e
    CommonPath = UtLocalCacheCalloc (strlen (PrefixDir) + 1);
Packit Service 1fb00e
    strcpy (CommonPath, PrefixDir);
Packit Service 1fb00e
Packit Service 1fb00e
    /*
Packit Service 1fb00e
     * Walk forward through the file path, and simultaneously backward
Packit Service 1fb00e
     * through the prefix directory path until there are no more
Packit Service 1fb00e
     * relative references at the start of the file path.
Packit Service 1fb00e
     */
Packit Service 1fb00e
    while (*FilePathname && (!strncmp (FilePathname, "../", 3)))
Packit Service 1fb00e
    {
Packit Service 1fb00e
        /* Remove last element of the prefix directory path */
Packit Service 1fb00e
Packit Service 1fb00e
        LastElement = strrchr (CommonPath, '/');
Packit Service 1fb00e
        if (!LastElement)
Packit Service 1fb00e
        {
Packit Service 1fb00e
            goto ConcatenatePaths;
Packit Service 1fb00e
        }
Packit Service 1fb00e
Packit Service 1fb00e
        *LastElement = 0;   /* Terminate CommonPath string */
Packit Service 1fb00e
        FilePathname += 3;  /* Point to next path element */
Packit Service 1fb00e
    }
Packit Service 1fb00e
Packit Service 1fb00e
    /*
Packit Service 1fb00e
     * Remove the last element of the prefix directory path (it is the same as
Packit Service 1fb00e
     * the first element of the file pathname), and build the final merged
Packit Service 1fb00e
     * pathname.
Packit Service 1fb00e
     */
Packit Service 1fb00e
    LastElement = strrchr (CommonPath, '/');
Packit Service 1fb00e
    if (LastElement)
Packit Service 1fb00e
    {
Packit Service 1fb00e
        *LastElement = 0;
Packit Service 1fb00e
    }
Packit Service 1fb00e
Packit Service 1fb00e
    /* Build the final merged pathname */
Packit Service 1fb00e
Packit Service 1fb00e
ConcatenatePaths:
Packit Service 1fb00e
    Pathname = UtLocalCacheCalloc (
Packit Service 1fb00e
        strlen (CommonPath) + strlen (FilePathname) + 2);
Packit Service 1fb00e
    if (LastElement && *CommonPath)
Packit Service 1fb00e
    {
Packit Service 1fb00e
        strcpy (Pathname, CommonPath);
Packit Service 1fb00e
        strcat (Pathname, "/");
Packit Service 1fb00e
    }
Packit Service 1fb00e
    strcat (Pathname, FilePathname);
Packit Service 1fb00e
Packit Service 1fb00e
    /* Convert all backslashes to normal slashes */
Packit Service 1fb00e
Packit Service 1fb00e
ConvertBackslashes:
Packit Service 1fb00e
    UtConvertBackslashes (Pathname);
Packit Service 1fb00e
Packit Service 1fb00e
    DbgPrint (ASL_PARSE_OUTPUT, "Include: Merged Pathname - \"%s\"\n",
Packit Service 1fb00e
         Pathname);
Packit Service 1fb00e
    return (Pathname);
Packit Service 1fb00e
}
Packit Service 1fb00e
Packit Service 1fb00e
Packit Service 1fb00e
/*******************************************************************************
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * FUNCTION:    FlOpenIncludeWithPrefix
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * PARAMETERS:  PrefixDir       - Prefix directory pathname. Can be a zero
Packit Service 1fb00e
 *                                length string.
Packit Service 1fb00e
 *              Filename        - The include filename from the source ASL.
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * RETURN:      Valid file descriptor if successful. Null otherwise.
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * DESCRIPTION: Open an include file and push it on the input file stack.
Packit Service 1fb00e
 *
Packit Service 1fb00e
 ******************************************************************************/
Packit Service 1fb00e
Packit Service 1fb00e
static FILE *
Packit Service 1fb00e
FlOpenIncludeWithPrefix (
Packit Service 1fb00e
    char                    *PrefixDir,
Packit Service 1fb00e
    ACPI_PARSE_OBJECT       *Op,
Packit Service 1fb00e
    char                    *Filename)
Packit Service 1fb00e
{
Packit Service 1fb00e
    FILE                    *IncludeFile;
Packit Service 1fb00e
    char                    *Pathname;
Packit Service 1fb00e
    UINT32                  OriginalLineNumber;
Packit Service 1fb00e
Packit Service 1fb00e
Packit Service 1fb00e
    /* Build the full pathname to the file */
Packit Service 1fb00e
Packit Service 1fb00e
    Pathname = FlMergePathnames (PrefixDir, Filename);
Packit Service 1fb00e
Packit Service 1fb00e
    DbgPrint (ASL_PARSE_OUTPUT, "Include: Opening file - \"%s\"\n\n",
Packit Service 1fb00e
        Pathname);
Packit Service 1fb00e
Packit Service 1fb00e
    /* Attempt to open the file, push if successful */
Packit Service 1fb00e
Packit Service 1fb00e
    IncludeFile = fopen (Pathname, "r");
Packit Service 1fb00e
    if (!IncludeFile)
Packit Service 1fb00e
    {
Packit Service 1fb00e
        fprintf (stderr, "Could not open include file %s\n", Pathname);
Packit Service 288b53
        /* ACPI_FREE (Pathname); <-- forces free() segfault */
Packit Service 1fb00e
        return (NULL);
Packit Service 1fb00e
    }
Packit Service 1fb00e
Packit Service 1fb00e
    /*
Packit Service 1fb00e
     * Check the entire include file for any # preprocessor directives.
Packit Service 1fb00e
     * This is because there may be some confusion between the #include
Packit Service 1fb00e
     * preprocessor directive and the ASL Include statement. A file included
Packit Service 1fb00e
     * by the ASL include cannot contain preprocessor directives because
Packit Service 1fb00e
     * the preprocessor has already run by the time the ASL include is
Packit Service 1fb00e
     * recognized (by the compiler, not the preprocessor.)
Packit Service 1fb00e
     *
Packit Service 1fb00e
     * Note: DtGetNextLine strips/ignores comments.
Packit Service 1fb00e
     * Save current line number since DtGetNextLine modifies it.
Packit Service 1fb00e
     */
Packit Service 1fb00e
    Gbl_CurrentLineNumber--;
Packit Service 1fb00e
    OriginalLineNumber = Gbl_CurrentLineNumber;
Packit Service 1fb00e
Packit Service 1fb00e
    while (DtGetNextLine (IncludeFile, DT_ALLOW_MULTILINE_QUOTES) != ASL_EOF)
Packit Service 1fb00e
    {
Packit Service 1fb00e
        if (Gbl_CurrentLineBuffer[0] == '#')
Packit Service 1fb00e
        {
Packit Service 1fb00e
            AslError (ASL_ERROR, ASL_MSG_INCLUDE_FILE,
Packit Service 1fb00e
                Op, "use #include instead");
Packit Service 1fb00e
        }
Packit Service 1fb00e
    }
Packit Service 1fb00e
Packit Service 1fb00e
    Gbl_CurrentLineNumber = OriginalLineNumber;
Packit Service 1fb00e
Packit Service 1fb00e
    /* Must seek back to the start of the file */
Packit Service 1fb00e
Packit Service 1fb00e
    fseek (IncludeFile, 0, SEEK_SET);
Packit Service 1fb00e
Packit Service 1fb00e
    /* Push the include file on the open input file stack */
Packit Service 1fb00e
Packit Service 1fb00e
    AslPushInputFileStack (IncludeFile, Pathname);
Packit Service 1fb00e
    return (IncludeFile);
Packit Service 1fb00e
}
Packit Service 1fb00e
Packit Service 1fb00e
Packit Service 1fb00e
/*******************************************************************************
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * FUNCTION:    FlOpenIncludeFile
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * PARAMETERS:  Op        - Parse node for the INCLUDE ASL statement
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * RETURN:      None.
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * DESCRIPTION: Open an include file and push it on the input file stack.
Packit Service 1fb00e
 *
Packit Service 1fb00e
 ******************************************************************************/
Packit Service 1fb00e
Packit Service 1fb00e
void
Packit Service 1fb00e
FlOpenIncludeFile (
Packit Service 1fb00e
    ACPI_PARSE_OBJECT       *Op)
Packit Service 1fb00e
{
Packit Service 1fb00e
    FILE                    *IncludeFile;
Packit Service 1fb00e
    ASL_INCLUDE_DIR         *NextDir;
Packit Service 1fb00e
Packit Service 1fb00e
Packit Service 1fb00e
    /* Op must be valid */
Packit Service 1fb00e
Packit Service 1fb00e
    if (!Op)
Packit Service 1fb00e
    {
Packit Service 1fb00e
        AslCommonError (ASL_ERROR, ASL_MSG_INCLUDE_FILE_OPEN,
Packit Service 1fb00e
            Gbl_CurrentLineNumber, Gbl_LogicalLineNumber,
Packit Service 1fb00e
            Gbl_InputByteCount, Gbl_CurrentColumn,
Packit Service 1fb00e
            Gbl_Files[ASL_FILE_INPUT].Filename, " - Null parse node");
Packit Service 1fb00e
Packit Service 1fb00e
        return;
Packit Service 1fb00e
    }
Packit Service 1fb00e
Packit Service 1fb00e
    /*
Packit Service 1fb00e
     * Flush out the "include ()" statement on this line, start
Packit Service 1fb00e
     * the actual include file on the next line
Packit Service 1fb00e
     */
Packit Service 1fb00e
    AslResetCurrentLineBuffer ();
Packit Service 1fb00e
    FlPrintFile (ASL_FILE_SOURCE_OUTPUT, "\n");
Packit Service 1fb00e
    Gbl_CurrentLineOffset++;
Packit Service 1fb00e
Packit Service 1fb00e
Packit Service 1fb00e
    /* Attempt to open the include file */
Packit Service 1fb00e
Packit Service 1fb00e
    /* If the file specifies an absolute path, just open it */
Packit Service 1fb00e
Packit Service 1fb00e
    if ((Op->Asl.Value.String[0] == '/')  ||
Packit Service 1fb00e
        (Op->Asl.Value.String[0] == '\\') ||
Packit Service 1fb00e
        (Op->Asl.Value.String[1] == ':'))
Packit Service 1fb00e
    {
Packit Service 1fb00e
        IncludeFile = FlOpenIncludeWithPrefix ("", Op, Op->Asl.Value.String);
Packit Service 1fb00e
        if (!IncludeFile)
Packit Service 1fb00e
        {
Packit Service 1fb00e
            goto ErrorExit;
Packit Service 1fb00e
        }
Packit Service 1fb00e
        return;
Packit Service 1fb00e
    }
Packit Service 1fb00e
Packit Service 1fb00e
    /*
Packit Service 1fb00e
     * The include filename is not an absolute path.
Packit Service 1fb00e
     *
Packit Service 1fb00e
     * First, search for the file within the "local" directory -- meaning
Packit Service 1fb00e
     * the same directory that contains the source file.
Packit Service 1fb00e
     *
Packit Service 1fb00e
     * Construct the file pathname from the global directory name.
Packit Service 1fb00e
     */
Packit Service 1fb00e
    IncludeFile = FlOpenIncludeWithPrefix (
Packit Service 1fb00e
        Gbl_DirectoryPath, Op, Op->Asl.Value.String);
Packit Service 1fb00e
    if (IncludeFile)
Packit Service 1fb00e
    {
Packit Service 1fb00e
        return;
Packit Service 1fb00e
    }
Packit Service 1fb00e
Packit Service 1fb00e
    /*
Packit Service 1fb00e
     * Second, search for the file within the (possibly multiple) directories
Packit Service 1fb00e
     * specified by the -I option on the command line.
Packit Service 1fb00e
     */
Packit Service 1fb00e
    NextDir = Gbl_IncludeDirList;
Packit Service 1fb00e
    while (NextDir)
Packit Service 1fb00e
    {
Packit Service 1fb00e
        IncludeFile = FlOpenIncludeWithPrefix (
Packit Service 1fb00e
            NextDir->Dir, Op, Op->Asl.Value.String);
Packit Service 1fb00e
        if (IncludeFile)
Packit Service 1fb00e
        {
Packit Service 1fb00e
            return;
Packit Service 1fb00e
        }
Packit Service 1fb00e
Packit Service 1fb00e
        NextDir = NextDir->Next;
Packit Service 1fb00e
    }
Packit Service 1fb00e
Packit Service 1fb00e
    /* We could not open the include file after trying very hard */
Packit Service 1fb00e
Packit Service 1fb00e
ErrorExit:
Packit Service 1fb00e
    sprintf (MsgBuffer, "%s, %s", Op->Asl.Value.String, strerror (errno));
Packit Service 1fb00e
    AslError (ASL_ERROR, ASL_MSG_INCLUDE_FILE_OPEN, Op, MsgBuffer);
Packit Service 1fb00e
}
Packit Service 1fb00e
Packit Service 1fb00e
Packit Service 1fb00e
/*******************************************************************************
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * FUNCTION:    FlOpenInputFile
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * PARAMETERS:  InputFilename       - The user-specified ASL source file to be
Packit Service 1fb00e
 *                                    compiled
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * RETURN:      Status
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * DESCRIPTION: Open the specified input file, and save the directory path to
Packit Service 1fb00e
 *              the file so that include files can be opened in
Packit Service 1fb00e
 *              the same directory.
Packit Service 1fb00e
 *
Packit Service 1fb00e
 ******************************************************************************/
Packit Service 1fb00e
Packit Service 1fb00e
ACPI_STATUS
Packit Service 1fb00e
FlOpenInputFile (
Packit Service 1fb00e
    char                    *InputFilename)
Packit Service 1fb00e
{
Packit Service 1fb00e
Packit Service 1fb00e
    /* Open the input ASL file, text mode */
Packit Service 1fb00e
Packit Service 1fb00e
    FlOpenFile (ASL_FILE_INPUT, InputFilename, "rt");
Packit Service 1fb00e
    AslCompilerin = Gbl_Files[ASL_FILE_INPUT].Handle;
Packit Service 1fb00e
Packit Service 1fb00e
    return (AE_OK);
Packit Service 1fb00e
}
Packit Service 1fb00e
Packit Service 1fb00e
Packit Service 1fb00e
/*******************************************************************************
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * FUNCTION:    FlOpenAmlOutputFile
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * PARAMETERS:  FilenamePrefix       - The user-specified ASL source file
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * RETURN:      Status
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * DESCRIPTION: Create the output filename (*.AML) and open the file. The file
Packit Service 1fb00e
 *              is created in the same directory as the parent input file.
Packit Service 1fb00e
 *
Packit Service 1fb00e
 ******************************************************************************/
Packit Service 1fb00e
Packit Service 1fb00e
ACPI_STATUS
Packit Service 1fb00e
FlOpenAmlOutputFile (
Packit Service 1fb00e
    char                    *FilenamePrefix)
Packit Service 1fb00e
{
Packit Service 1fb00e
    char                    *Filename;
Packit Service 1fb00e
Packit Service 1fb00e
Packit Service 1fb00e
    /* Output filename usually comes from the ASL itself */
Packit Service 1fb00e
Packit Service 1fb00e
    Filename = Gbl_Files[ASL_FILE_AML_OUTPUT].Filename;
Packit Service 1fb00e
    if (!Filename)
Packit Service 1fb00e
    {
Packit Service 1fb00e
        /* Create the output AML filename */
Packit Service 1fb00e
        if (!AcpiGbl_CaptureComments)
Packit Service 1fb00e
        {
Packit Service 1fb00e
            Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_AML_CODE);
Packit Service 1fb00e
        }
Packit Service 1fb00e
        else
Packit Service 1fb00e
        {
Packit Service 1fb00e
            Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_CONVERT_AML);
Packit Service 1fb00e
        }
Packit Service 1fb00e
        if (!Filename)
Packit Service 1fb00e
        {
Packit Service 1fb00e
            AslCommonError (ASL_ERROR, ASL_MSG_OUTPUT_FILENAME,
Packit Service 1fb00e
                0, 0, 0, 0, NULL, NULL);
Packit Service 1fb00e
            return (AE_ERROR);
Packit Service 1fb00e
        }
Packit Service 1fb00e
Packit Service 1fb00e
        Gbl_Files[ASL_FILE_AML_OUTPUT].Filename = Filename;
Packit Service 1fb00e
    }
Packit Service 1fb00e
Packit Service 1fb00e
    /* Open the output AML file in binary mode */
Packit Service 1fb00e
Packit Service 1fb00e
    FlOpenFile (ASL_FILE_AML_OUTPUT, Filename, "w+b");
Packit Service 1fb00e
    return (AE_OK);
Packit Service 1fb00e
}
Packit Service 1fb00e
Packit Service 1fb00e
Packit Service 1fb00e
/*******************************************************************************
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * FUNCTION:    FlOpenMiscOutputFiles
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * PARAMETERS:  FilenamePrefix       - The user-specified ASL source file
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * RETURN:      Status
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * DESCRIPTION: Create and open the various output files needed, depending on
Packit Service 1fb00e
 *              the command line options
Packit Service 1fb00e
 *
Packit Service 1fb00e
 ******************************************************************************/
Packit Service 1fb00e
Packit Service 1fb00e
ACPI_STATUS
Packit Service 1fb00e
FlOpenMiscOutputFiles (
Packit Service 1fb00e
    char                    *FilenamePrefix)
Packit Service 1fb00e
{
Packit Service 1fb00e
    char                    *Filename;
Packit Service 1fb00e
Packit Service 1fb00e
Packit Service 1fb00e
     /* Create/Open a map file if requested */
Packit Service 1fb00e
Packit Service 1fb00e
    if (Gbl_MapfileFlag)
Packit Service 1fb00e
    {
Packit Service 1fb00e
        Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_MAP);
Packit Service 1fb00e
        if (!Filename)
Packit Service 1fb00e
        {
Packit Service 1fb00e
            AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME,
Packit Service 1fb00e
                0, 0, 0, 0, NULL, NULL);
Packit Service 1fb00e
            return (AE_ERROR);
Packit Service 1fb00e
        }
Packit Service 1fb00e
Packit Service 1fb00e
        /* Open the hex file, text mode (closed at compiler exit) */
Packit Service 1fb00e
Packit Service 1fb00e
        FlOpenFile (ASL_FILE_MAP_OUTPUT, Filename, "w+t");
Packit Service 1fb00e
Packit Service 1fb00e
        AslCompilerSignon (ASL_FILE_MAP_OUTPUT);
Packit Service 1fb00e
        AslCompilerFileHeader (ASL_FILE_MAP_OUTPUT);
Packit Service 1fb00e
    }
Packit Service 1fb00e
Packit Service 1fb00e
    /* All done for disassembler */
Packit Service 1fb00e
Packit Service 1fb00e
    if (Gbl_FileType == ASL_INPUT_TYPE_BINARY_ACPI_TABLE)
Packit Service 1fb00e
    {
Packit Service 1fb00e
        return (AE_OK);
Packit Service 1fb00e
    }
Packit Service 1fb00e
Packit Service 1fb00e
    /* Create/Open a hex output file if asked */
Packit Service 1fb00e
Packit Service 1fb00e
    if (Gbl_HexOutputFlag)
Packit Service 1fb00e
    {
Packit Service 1fb00e
        Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_HEX_DUMP);
Packit Service 1fb00e
        if (!Filename)
Packit Service 1fb00e
        {
Packit Service 1fb00e
            AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME,
Packit Service 1fb00e
                0, 0, 0, 0, NULL, NULL);
Packit Service 1fb00e
            return (AE_ERROR);
Packit Service 1fb00e
        }
Packit Service 1fb00e
Packit Service 1fb00e
        /* Open the hex file, text mode */
Packit Service 1fb00e
Packit Service 1fb00e
        FlOpenFile (ASL_FILE_HEX_OUTPUT, Filename, "w+t");
Packit Service 1fb00e
Packit Service 1fb00e
        AslCompilerSignon (ASL_FILE_HEX_OUTPUT);
Packit Service 1fb00e
        AslCompilerFileHeader (ASL_FILE_HEX_OUTPUT);
Packit Service 1fb00e
    }
Packit Service 1fb00e
Packit Service 1fb00e
    /* Create/Open a debug output file if asked */
Packit Service 1fb00e
Packit Service 1fb00e
    if (Gbl_DebugFlag)
Packit Service 1fb00e
    {
Packit Service 1fb00e
        Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_DEBUG);
Packit Service 1fb00e
        if (!Filename)
Packit Service 1fb00e
        {
Packit Service 1fb00e
            AslCommonError (ASL_ERROR, ASL_MSG_DEBUG_FILENAME,
Packit Service 1fb00e
                0, 0, 0, 0, NULL, NULL);
Packit Service 1fb00e
            return (AE_ERROR);
Packit Service 1fb00e
        }
Packit Service 1fb00e
Packit Service 1fb00e
        /* Open the debug file as STDERR, text mode */
Packit Service 1fb00e
Packit Service 1fb00e
        Gbl_Files[ASL_FILE_DEBUG_OUTPUT].Filename = Filename;
Packit Service 1fb00e
        Gbl_Files[ASL_FILE_DEBUG_OUTPUT].Handle =
Packit Service 1fb00e
            freopen (Filename, "w+t", stderr);
Packit Service 1fb00e
Packit Service 1fb00e
        if (!Gbl_Files[ASL_FILE_DEBUG_OUTPUT].Handle)
Packit Service 1fb00e
        {
Packit Service 1fb00e
            /*
Packit Service 1fb00e
             * A problem with freopen is that on error, we no longer
Packit Service 1fb00e
             * have stderr and cannot emit normal error messages.
Packit Service 1fb00e
             * Emit error to stdout, close files, and exit.
Packit Service 1fb00e
             */
Packit Service 1fb00e
            fprintf (stdout,
Packit Service 1fb00e
                "\nCould not open debug output file: %s\n\n", Filename);
Packit Service 1fb00e
Packit Service 1fb00e
            CmCleanupAndExit ();
Packit Service 1fb00e
            exit (1);
Packit Service 1fb00e
        }
Packit Service 1fb00e
Packit Service 1fb00e
        AslCompilerSignon (ASL_FILE_DEBUG_OUTPUT);
Packit Service 1fb00e
        AslCompilerFileHeader (ASL_FILE_DEBUG_OUTPUT);
Packit Service 1fb00e
    }
Packit Service 1fb00e
Packit Service 1fb00e
    /* Create/Open a cross-reference output file if asked */
Packit Service 1fb00e
Packit Service 1fb00e
    if (Gbl_CrossReferenceOutput)
Packit Service 1fb00e
    {
Packit Service 1fb00e
        Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_XREF);
Packit Service 1fb00e
        if (!Filename)
Packit Service 1fb00e
        {
Packit Service 1fb00e
            AslCommonError (ASL_ERROR, ASL_MSG_DEBUG_FILENAME,
Packit Service 1fb00e
                0, 0, 0, 0, NULL, NULL);
Packit Service 1fb00e
            return (AE_ERROR);
Packit Service 1fb00e
        }
Packit Service 1fb00e
Packit Service 1fb00e
        FlOpenFile (ASL_FILE_XREF_OUTPUT, Filename, "w+t");
Packit Service 1fb00e
Packit Service 1fb00e
        AslCompilerSignon (ASL_FILE_XREF_OUTPUT);
Packit Service 1fb00e
        AslCompilerFileHeader (ASL_FILE_XREF_OUTPUT);
Packit Service 1fb00e
    }
Packit Service 1fb00e
Packit Service 1fb00e
    /* Create/Open a listing output file if asked */
Packit Service 1fb00e
Packit Service 1fb00e
    if (Gbl_ListingFlag)
Packit Service 1fb00e
    {
Packit Service 1fb00e
        Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_LISTING);
Packit Service 1fb00e
        if (!Filename)
Packit Service 1fb00e
        {
Packit Service 1fb00e
            AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME,
Packit Service 1fb00e
                0, 0, 0, 0, NULL, NULL);
Packit Service 1fb00e
            return (AE_ERROR);
Packit Service 1fb00e
        }
Packit Service 1fb00e
Packit Service 1fb00e
        /* Open the listing file, text mode */
Packit Service 1fb00e
Packit Service 1fb00e
        FlOpenFile (ASL_FILE_LISTING_OUTPUT, Filename, "w+t");
Packit Service 1fb00e
Packit Service 1fb00e
        AslCompilerSignon (ASL_FILE_LISTING_OUTPUT);
Packit Service 1fb00e
        AslCompilerFileHeader (ASL_FILE_LISTING_OUTPUT);
Packit Service 1fb00e
    }
Packit Service 1fb00e
Packit Service 1fb00e
    /* Create the preprocessor output temp file if preprocessor enabled */
Packit Service 1fb00e
Packit Service 1fb00e
    if (Gbl_PreprocessFlag)
Packit Service 1fb00e
    {
Packit Service 1fb00e
        Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_PREPROCESSOR);
Packit Service 1fb00e
        if (!Filename)
Packit Service 1fb00e
        {
Packit Service 1fb00e
            AslCommonError (ASL_ERROR, ASL_MSG_PREPROCESSOR_FILENAME,
Packit Service 1fb00e
                0, 0, 0, 0, NULL, NULL);
Packit Service 1fb00e
            return (AE_ERROR);
Packit Service 1fb00e
        }
Packit Service 1fb00e
Packit Service 1fb00e
        FlOpenFile (ASL_FILE_PREPROCESSOR, Filename, "w+t");
Packit Service 1fb00e
    }
Packit Service 1fb00e
Packit Service 1fb00e
    /*
Packit Service 1fb00e
     * Create the "user" preprocessor output file if -li flag set.
Packit Service 1fb00e
     * Note, this file contains no embedded #line directives.
Packit Service 1fb00e
     */
Packit Service 1fb00e
    if (Gbl_PreprocessorOutputFlag)
Packit Service 1fb00e
    {
Packit Service 1fb00e
        Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_PREPROC_USER);
Packit Service 1fb00e
        if (!Filename)
Packit Service 1fb00e
        {
Packit Service 1fb00e
            AslCommonError (ASL_ERROR, ASL_MSG_PREPROCESSOR_FILENAME,
Packit Service 1fb00e
                0, 0, 0, 0, NULL, NULL);
Packit Service 1fb00e
            return (AE_ERROR);
Packit Service 1fb00e
        }
Packit Service 1fb00e
Packit Service 1fb00e
        FlOpenFile (ASL_FILE_PREPROCESSOR_USER, Filename, "w+t");
Packit Service 1fb00e
    }
Packit Service 1fb00e
Packit Service 1fb00e
    /* All done for data table compiler */
Packit Service 1fb00e
Packit Service 1fb00e
    if (Gbl_FileType == ASL_INPUT_TYPE_ASCII_DATA)
Packit Service 1fb00e
    {
Packit Service 1fb00e
        return (AE_OK);
Packit Service 1fb00e
    }
Packit Service 1fb00e
Packit Service 1fb00e
    /* Create/Open a combined source output file */
Packit Service 1fb00e
Packit Service 1fb00e
    Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_SOURCE);
Packit Service 1fb00e
    if (!Filename)
Packit Service 1fb00e
    {
Packit Service 1fb00e
        AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME,
Packit Service 1fb00e
            0, 0, 0, 0, NULL, NULL);
Packit Service 1fb00e
        return (AE_ERROR);
Packit Service 1fb00e
    }
Packit Service 1fb00e
Packit Service 1fb00e
    /*
Packit Service 1fb00e
     * Open the source output file, binary mode (so that LF does not get
Packit Service 1fb00e
     * expanded to CR/LF on some systems, messing up our seek
Packit Service 1fb00e
     * calculations.)
Packit Service 1fb00e
     */
Packit Service 1fb00e
    FlOpenFile (ASL_FILE_SOURCE_OUTPUT, Filename, "w+b");
Packit Service 1fb00e
Packit Service 1fb00e
/*
Packit Service 1fb00e
// TBD: TEMP
Packit Service 1fb00e
//    AslCompilerin = Gbl_Files[ASL_FILE_SOURCE_OUTPUT].Handle;
Packit Service 1fb00e
*/
Packit Service 1fb00e
    /* Create/Open a assembly code source output file if asked */
Packit Service 1fb00e
Packit Service 1fb00e
    if (Gbl_AsmOutputFlag)
Packit Service 1fb00e
    {
Packit Service 1fb00e
        Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_ASM_SOURCE);
Packit Service 1fb00e
        if (!Filename)
Packit Service 1fb00e
        {
Packit Service 1fb00e
            AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME,
Packit Service 1fb00e
                0, 0, 0, 0, NULL, NULL);
Packit Service 1fb00e
            return (AE_ERROR);
Packit Service 1fb00e
        }
Packit Service 1fb00e
Packit Service 1fb00e
        /* Open the assembly code source file, text mode */
Packit Service 1fb00e
Packit Service 1fb00e
        FlOpenFile (ASL_FILE_ASM_SOURCE_OUTPUT, Filename, "w+t");
Packit Service 1fb00e
Packit Service 1fb00e
        AslCompilerSignon (ASL_FILE_ASM_SOURCE_OUTPUT);
Packit Service 1fb00e
        AslCompilerFileHeader (ASL_FILE_ASM_SOURCE_OUTPUT);
Packit Service 1fb00e
    }
Packit Service 1fb00e
Packit Service 1fb00e
    /* Create/Open a C code source output file if asked */
Packit Service 1fb00e
Packit Service 1fb00e
    if (Gbl_C_OutputFlag)
Packit Service 1fb00e
    {
Packit Service 1fb00e
        Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_C_SOURCE);
Packit Service 1fb00e
        if (!Filename)
Packit Service 1fb00e
        {
Packit Service 1fb00e
            AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME,
Packit Service 1fb00e
                0, 0, 0, 0, NULL, NULL);
Packit Service 1fb00e
            return (AE_ERROR);
Packit Service 1fb00e
        }
Packit Service 1fb00e
Packit Service 1fb00e
        /* Open the C code source file, text mode */
Packit Service 1fb00e
Packit Service 1fb00e
        FlOpenFile (ASL_FILE_C_SOURCE_OUTPUT, Filename, "w+t");
Packit Service 1fb00e
Packit Service 1fb00e
        FlPrintFile (ASL_FILE_C_SOURCE_OUTPUT, "/*\n");
Packit Service 1fb00e
        AslCompilerSignon (ASL_FILE_C_SOURCE_OUTPUT);
Packit Service 1fb00e
        AslCompilerFileHeader (ASL_FILE_C_SOURCE_OUTPUT);
Packit Service 1fb00e
    }
Packit Service 1fb00e
Packit Service 1fb00e
    /* Create/Open a C code source output file for the offset table if asked */
Packit Service 1fb00e
Packit Service 1fb00e
    if (Gbl_C_OffsetTableFlag)
Packit Service 1fb00e
    {
Packit Service 1fb00e
        Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_C_OFFSET);
Packit Service 1fb00e
        if (!Filename)
Packit Service 1fb00e
        {
Packit Service 1fb00e
            AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME,
Packit Service 1fb00e
                0, 0, 0, 0, NULL, NULL);
Packit Service 1fb00e
            return (AE_ERROR);
Packit Service 1fb00e
        }
Packit Service 1fb00e
Packit Service 1fb00e
        /* Open the C code source file, text mode */
Packit Service 1fb00e
Packit Service 1fb00e
        FlOpenFile (ASL_FILE_C_OFFSET_OUTPUT, Filename, "w+t");
Packit Service 1fb00e
Packit Service 1fb00e
        FlPrintFile (ASL_FILE_C_OFFSET_OUTPUT, "/*\n");
Packit Service 1fb00e
        AslCompilerSignon (ASL_FILE_C_OFFSET_OUTPUT);
Packit Service 1fb00e
        AslCompilerFileHeader (ASL_FILE_C_OFFSET_OUTPUT);
Packit Service 1fb00e
    }
Packit Service 1fb00e
Packit Service 1fb00e
    /* Create/Open a assembly include output file if asked */
Packit Service 1fb00e
Packit Service 1fb00e
    if (Gbl_AsmIncludeOutputFlag)
Packit Service 1fb00e
    {
Packit Service 1fb00e
        Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_ASM_INCLUDE);
Packit Service 1fb00e
        if (!Filename)
Packit Service 1fb00e
        {
Packit Service 1fb00e
            AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME,
Packit Service 1fb00e
                0, 0, 0, 0, NULL, NULL);
Packit Service 1fb00e
            return (AE_ERROR);
Packit Service 1fb00e
        }
Packit Service 1fb00e
Packit Service 1fb00e
        /* Open the assembly include file, text mode */
Packit Service 1fb00e
Packit Service 1fb00e
        FlOpenFile (ASL_FILE_ASM_INCLUDE_OUTPUT, Filename, "w+t");
Packit Service 1fb00e
Packit Service 1fb00e
        AslCompilerSignon (ASL_FILE_ASM_INCLUDE_OUTPUT);
Packit Service 1fb00e
        AslCompilerFileHeader (ASL_FILE_ASM_INCLUDE_OUTPUT);
Packit Service 1fb00e
    }
Packit Service 1fb00e
Packit Service 1fb00e
    /* Create/Open a C include output file if asked */
Packit Service 1fb00e
Packit Service 1fb00e
    if (Gbl_C_IncludeOutputFlag)
Packit Service 1fb00e
    {
Packit Service 1fb00e
        Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_C_INCLUDE);
Packit Service 1fb00e
        if (!Filename)
Packit Service 1fb00e
        {
Packit Service 1fb00e
            AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME,
Packit Service 1fb00e
                0, 0, 0, 0, NULL, NULL);
Packit Service 1fb00e
            return (AE_ERROR);
Packit Service 1fb00e
        }
Packit Service 1fb00e
Packit Service 1fb00e
        /* Open the C include file, text mode */
Packit Service 1fb00e
Packit Service 1fb00e
        FlOpenFile (ASL_FILE_C_INCLUDE_OUTPUT, Filename, "w+t");
Packit Service 1fb00e
Packit Service 1fb00e
        FlPrintFile (ASL_FILE_C_INCLUDE_OUTPUT, "/*\n");
Packit Service 1fb00e
        AslCompilerSignon (ASL_FILE_C_INCLUDE_OUTPUT);
Packit Service 1fb00e
        AslCompilerFileHeader (ASL_FILE_C_INCLUDE_OUTPUT);
Packit Service 1fb00e
    }
Packit Service 1fb00e
Packit Service 1fb00e
    /* Create a namespace output file if asked */
Packit Service 1fb00e
Packit Service 1fb00e
    if (Gbl_NsOutputFlag)
Packit Service 1fb00e
    {
Packit Service 1fb00e
        Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_NAMESPACE);
Packit Service 1fb00e
        if (!Filename)
Packit Service 1fb00e
        {
Packit Service 1fb00e
            AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME,
Packit Service 1fb00e
                0, 0, 0, 0, NULL, NULL);
Packit Service 1fb00e
            return (AE_ERROR);
Packit Service 1fb00e
        }
Packit Service 1fb00e
Packit Service 1fb00e
        /* Open the namespace file, text mode */
Packit Service 1fb00e
Packit Service 1fb00e
        FlOpenFile (ASL_FILE_NAMESPACE_OUTPUT, Filename, "w+t");
Packit Service 1fb00e
Packit Service 1fb00e
        AslCompilerSignon (ASL_FILE_NAMESPACE_OUTPUT);
Packit Service 1fb00e
        AslCompilerFileHeader (ASL_FILE_NAMESPACE_OUTPUT);
Packit Service 1fb00e
    }
Packit Service 1fb00e
Packit Service 1fb00e
    /* Create a debug file for the converter */
Packit Service 1fb00e
Packit Service 1fb00e
    if (AcpiGbl_DebugAslConversion)
Packit Service 1fb00e
    {
Packit Service 1fb00e
        Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_CONVERT_DEBUG);
Packit Service 1fb00e
        if (!Filename)
Packit Service 1fb00e
        {
Packit Service 1fb00e
            AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME,
Packit Service 1fb00e
                0, 0, 0, 0, NULL, NULL);
Packit Service 1fb00e
            return (AE_ERROR);
Packit Service 1fb00e
        }
Packit Service 1fb00e
Packit Service 1fb00e
        /* Open the converter debug file, text mode */
Packit Service 1fb00e
Packit Service 1fb00e
        FlOpenFile (ASL_FILE_CONV_DEBUG_OUTPUT, Filename, "w+t");
Packit Service 1fb00e
Packit Service 1fb00e
        AslCompilerSignon (ASL_FILE_CONV_DEBUG_OUTPUT);
Packit Service 1fb00e
        AslCompilerFileHeader (ASL_FILE_CONV_DEBUG_OUTPUT);
Packit Service 1fb00e
Packit Service 1fb00e
        AcpiGbl_ConvDebugFile = Gbl_Files[ASL_FILE_CONV_DEBUG_OUTPUT].Handle;
Packit Service 1fb00e
    }
Packit Service 1fb00e
Packit Service 1fb00e
    return (AE_OK);
Packit Service 1fb00e
}
Packit Service 1fb00e
Packit Service 1fb00e
Packit Service 1fb00e
#ifdef ACPI_OBSOLETE_FUNCTIONS
Packit Service 1fb00e
/*******************************************************************************
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * FUNCTION:    FlParseInputPathname
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * PARAMETERS:  InputFilename       - The user-specified ASL source file to be
Packit Service 1fb00e
 *                                    compiled
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * RETURN:      Status
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * DESCRIPTION: Split the input path into a directory and filename part
Packit Service 1fb00e
 *              1) Directory part used to open include files
Packit Service 1fb00e
 *              2) Filename part used to generate output filenames
Packit Service 1fb00e
 *
Packit Service 1fb00e
 ******************************************************************************/
Packit Service 1fb00e
Packit Service 1fb00e
ACPI_STATUS
Packit Service 1fb00e
FlParseInputPathname (
Packit Service 1fb00e
    char                    *InputFilename)
Packit Service 1fb00e
{
Packit Service 1fb00e
    char                    *Substring;
Packit Service 1fb00e
Packit Service 1fb00e
Packit Service 1fb00e
    if (!InputFilename)
Packit Service 1fb00e
    {
Packit Service 1fb00e
        return (AE_OK);
Packit Service 1fb00e
    }
Packit Service 1fb00e
Packit Service 1fb00e
    /* Get the path to the input filename's directory */
Packit Service 1fb00e
Packit Service 1fb00e
    Gbl_DirectoryPath = strdup (InputFilename);
Packit Service 1fb00e
    if (!Gbl_DirectoryPath)
Packit Service 1fb00e
    {
Packit Service 1fb00e
        return (AE_NO_MEMORY);
Packit Service 1fb00e
    }
Packit Service 1fb00e
Packit Service 1fb00e
    Substring = strrchr (Gbl_DirectoryPath, '\\');
Packit Service 1fb00e
    if (!Substring)
Packit Service 1fb00e
    {
Packit Service 1fb00e
        Substring = strrchr (Gbl_DirectoryPath, '/');
Packit Service 1fb00e
        if (!Substring)
Packit Service 1fb00e
        {
Packit Service 1fb00e
            Substring = strrchr (Gbl_DirectoryPath, ':');
Packit Service 1fb00e
        }
Packit Service 1fb00e
    }
Packit Service 1fb00e
Packit Service 1fb00e
    if (!Substring)
Packit Service 1fb00e
    {
Packit Service 1fb00e
        Gbl_DirectoryPath[0] = 0;
Packit Service 1fb00e
        if (Gbl_UseDefaultAmlFilename)
Packit Service 1fb00e
        {
Packit Service 1fb00e
            Gbl_OutputFilenamePrefix = strdup (InputFilename);
Packit Service 1fb00e
        }
Packit Service 1fb00e
    }
Packit Service 1fb00e
    else
Packit Service 1fb00e
    {
Packit Service 1fb00e
        if (Gbl_UseDefaultAmlFilename)
Packit Service 1fb00e
        {
Packit Service 1fb00e
            Gbl_OutputFilenamePrefix = strdup (Substring + 1);
Packit Service 1fb00e
        }
Packit Service 1fb00e
        *(Substring+1) = 0;
Packit Service 1fb00e
    }
Packit Service 1fb00e
Packit Service 1fb00e
    UtConvertBackslashes (Gbl_OutputFilenamePrefix);
Packit Service 1fb00e
    return (AE_OK);
Packit Service 1fb00e
}
Packit Service 1fb00e
#endif