aslstartup.c revision 210976
118334Speter
272562Sobrien/******************************************************************************
3169689Skan *
4169689Skan * Module Name: aslstartup - Compiler startup routines, called from main
518334Speter *
690075Sobrien *****************************************************************************/
718334Speter
890075Sobrien/******************************************************************************
990075Sobrien *
1090075Sobrien * 1. Copyright Notice
1190075Sobrien *
1218334Speter * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp.
1390075Sobrien * All rights reserved.
1490075Sobrien *
1590075Sobrien * 2. License
1690075Sobrien *
1718334Speter * 2.1. This is your license from Intel Corp. under its intellectual property
1818334Speter * rights.  You may have additional license terms from the party that provided
1990075Sobrien * you this software, covering your right to use that party's intellectual
20169689Skan * property rights.
21169689Skan *
2218334Speter * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
2318334Speter * copy of the source code appearing in this file ("Covered Code") an
2450397Sobrien * irrevocable, perpetual, worldwide license under Intel's copyrights in the
25132718Skan * base code distributed originally by Intel ("Original Intel Code") to copy,
26132718Skan * make derivatives, distribute, use and display any portion of the Covered
2718334Speter * Code in any form, with the right to sublicense such rights; and
28117395Skan *
2918334Speter * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
3018334Speter * license (with the right to sublicense), under only those claims of Intel
3118334Speter * patents that are infringed by the Original Intel Code, to make, use, sell,
3218334Speter * offer to sell, and import the Covered Code and derivative works thereof
3350397Sobrien * solely to the minimum extent necessary to exercise the above copyright
3450397Sobrien * license, and in no event shall the patent license extend to any additions
3518334Speter * to or modifications of the Original Intel Code.  No other license or right
3650397Sobrien * is granted directly or by implication, estoppel or otherwise;
3790075Sobrien *
3890075Sobrien * The above copyright and patent license is granted only if the following
3918334Speter * conditions are met:
4090075Sobrien *
4190075Sobrien * 3. Conditions
4218334Speter *
4390075Sobrien * 3.1. Redistribution of Source with Rights to Further Distribute Source.
4418334Speter * Redistribution of source code of any substantial portion of the Covered
4518334Speter * Code or modification with rights to further distribute source must include
4650397Sobrien * the above Copyright Notice, the above License, this list of Conditions,
4790075Sobrien * and the following Disclaimer and Export Compliance provision.  In addition,
4890075Sobrien * Licensee must cause all Covered Code to which Licensee contributes to
4990075Sobrien * contain a file documenting the changes Licensee made to create that Covered
5090075Sobrien * Code and the date of any change.  Licensee must include in that file the
51169689Skan * documentation of any changes made by any predecessor Licensee.  Licensee
52169689Skan * must include a prominent statement that the modification is derived,
53169689Skan * directly or indirectly, from Original Intel Code.
54132718Skan *
55169689Skan * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
5618334Speter * Redistribution of source code of any substantial portion of the Covered
5718334Speter * Code or modification without rights to further distribute source must
5818334Speter * include the following Disclaimer and Export Compliance provision in the
5918334Speter * documentation and/or other materials provided with distribution.  In
6018334Speter * addition, Licensee may not authorize further sublicense of source of any
6118334Speter * portion of the Covered Code, and must include terms to the effect that the
6218334Speter * license from Licensee to its licensee is limited to the intellectual
6318334Speter * property embodied in the software Licensee provides to its licensee, and
6418334Speter * not to intellectual property embodied in modifications its licensee may
65107590Sobrien * make.
6618334Speter *
6790075Sobrien * 3.3. Redistribution of Executable. Redistribution in executable form of any
6818334Speter * substantial portion of the Covered Code or modification must reproduce the
69107590Sobrien * above Copyright Notice, and the following Disclaimer and Export Compliance
7018334Speter * provision in the documentation and/or other materials provided with the
7118334Speter * distribution.
7218334Speter *
7318334Speter * 3.4. Intel retains all right, title, and interest in and to the Original
7418334Speter * Intel Code.
7518334Speter *
7618334Speter * 3.5. Neither the name Intel nor any other trademark owned or controlled by
7718334Speter * Intel shall be used in advertising or otherwise to promote the sale, use or
7818334Speter * other dealings in products derived from or relating to the Covered Code
7918334Speter * without prior written authorization from Intel.
8018334Speter *
8150397Sobrien * 4. Disclaimer and Export Compliance
8218334Speter *
8318334Speter * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
8418334Speter * HERE.  ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
8518334Speter * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT,  ASSISTANCE,
8618334Speter * INSTALLATION, TRAINING OR OTHER SERVICES.  INTEL WILL NOT PROVIDE ANY
8718334Speter * UPDATES, ENHANCEMENTS OR EXTENSIONS.  INTEL SPECIFICALLY DISCLAIMS ANY
8818334Speter * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
8918334Speter * PARTICULAR PURPOSE.
9018334Speter *
9118334Speter * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
9218334Speter * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
9318334Speter * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
9418334Speter * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
9518334Speter * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
9618334Speter * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES.  THESE LIMITATIONS
9718334Speter * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
9818334Speter * LIMITED REMEDY.
9918334Speter *
10018334Speter * 4.3. Licensee shall not export, either directly or indirectly, any of this
10118334Speter * software or system incorporating such software without first obtaining any
10290075Sobrien * required license or other approval from the U. S. Department of Commerce or
10390075Sobrien * any other agency or department of the United States Government.  In the
10418334Speter * event Licensee exports any such software from the United States or
10518334Speter * re-exports any such software from a foreign destination, Licensee shall
10618334Speter * ensure that the distribution and export/re-export of the software is in
10790075Sobrien * compliance with all laws, regulations, orders, or other restrictions of the
10850397Sobrien * U.S. Export Administration Regulations. Licensee agrees that neither it nor
10918334Speter * any of its subsidiaries will export/re-export any technical data, process,
11090075Sobrien * software, or service, directly or indirectly, to any country for which the
11150397Sobrien * United States government or any agency thereof requires an export license,
11250397Sobrien * other governmental approval, or letter of assurance, without first obtaining
11350397Sobrien * such license, approval or letter.
11450397Sobrien *
11550397Sobrien *****************************************************************************/
11690075Sobrien
11790075Sobrien
118132718Skan#include <contrib/dev/acpica/compiler/aslcompiler.h>
119132718Skan#include <contrib/dev/acpica/include/actables.h>
12050397Sobrien#include <contrib/dev/acpica/include/acapps.h>
12150397Sobrien
12250397Sobrien#define _COMPONENT          ACPI_COMPILER
123132718Skan        ACPI_MODULE_NAME    ("aslstartup")
124169689Skan
125132718Skan
126132718Skan#define ASL_MAX_FILES   256
127132718Skanchar                    *FileList[ASL_MAX_FILES];
128132718Skanint                     FileCount;
129169689SkanBOOLEAN                 AslToFile = TRUE;
130169689Skan
131132718Skan
132132718Skan/* Local prototypes */
133132718Skan
134132718Skanstatic char **
135132718SkanAsDoWildcard (
136132718Skan    char                    *DirectoryPathname,
137132718Skan    char                    *FileSpecifier);
138169689Skan
139132718SkanUINT8
140132718SkanAslDetectSourceFileType (
141132718Skan    ASL_FILE_INFO           *Info);
142132718Skan
143132718Skan
144132718Skan/*******************************************************************************
145132718Skan *
146132718Skan * FUNCTION:    AslInitializeGlobals
147169689Skan *
148132718Skan * PARAMETERS:  None
149132718Skan *
150132718Skan * RETURN:      None
151132718Skan *
152132718Skan * DESCRIPTION: Re-initialize globals needed to restart the compiler. This
153132718Skan *              allows multiple files to be disassembled and/or compiled.
154169689Skan *
155132718Skan ******************************************************************************/
15690075Sobrien
157132718Skanvoid
15890075SobrienAslInitializeGlobals (
159132718Skan    void)
160132718Skan{
161169689Skan    UINT32                  i;
16218334Speter
16318334Speter
16418334Speter    /* Init compiler globals */
16518334Speter
16618334Speter    Gbl_CurrentColumn = 0;
16718334Speter    Gbl_CurrentLineNumber = 1;
16818334Speter    Gbl_LogicalLineNumber = 1;
16918334Speter    Gbl_CurrentLineOffset = 0;
170117395Skan    Gbl_InputFieldCount = 0;
171117395Skan    Gbl_LineBufPtr = Gbl_CurrentLineBuffer;
172117395Skan
173117395Skan    Gbl_ErrorLog = NULL;
17452284Sobrien    Gbl_NextError = NULL;
17590075Sobrien    Gbl_Signature = NULL;
17652284Sobrien    Gbl_FileType = 0;
17790075Sobrien
178169689Skan    AslGbl_NextEvent = 0;
179169689Skan    for (i = 0; i < ASL_NUM_REPORT_LEVELS; i++)
18052284Sobrien    {
18152284Sobrien        Gbl_ExceptionCount[i] = 0;
182117395Skan    }
183117395Skan
184117395Skan    Gbl_Files[ASL_FILE_AML_OUTPUT].Filename = NULL;
185117395Skan    Gbl_Files[ASL_FILE_AML_OUTPUT].Handle = NULL;
186169689Skan
187169689Skan    Gbl_Files[ASL_FILE_SOURCE_OUTPUT].Filename = NULL;
188117395Skan    Gbl_Files[ASL_FILE_SOURCE_OUTPUT].Handle = NULL;
189117395Skan}
190132718Skan
191132718Skan
192132718Skan/******************************************************************************
193132718Skan *
194169689Skan * FUNCTION:    AsDoWildcard
195169689Skan *
196169689Skan * PARAMETERS:  None
197132718Skan *
198132718Skan * RETURN:      None
19918334Speter *
200169689Skan * DESCRIPTION: Process files via wildcards. This function is for the Windows
20118334Speter *              case only.
202169689Skan *
203169689Skan ******************************************************************************/
20418334Speter
205169689Skanstatic char **
206132718SkanAsDoWildcard (
207132718Skan    char                    *DirectoryPathname,
208169689Skan    char                    *FileSpecifier)
209132718Skan{
210132718Skan#ifdef WIN32
211169689Skan    void                    *DirInfo;
212169689Skan    char                    *Filename;
213169689Skan
214169689Skan
215169689Skan    FileCount = 0;
216169689Skan
217169689Skan    /* Open parent directory */
218169689Skan
219169689Skan    DirInfo = AcpiOsOpenDirectory (DirectoryPathname, FileSpecifier, REQUEST_FILE_ONLY);
220169689Skan    if (!DirInfo)
221169689Skan    {
222169689Skan        /* Either the directory of file does not exist */
223169689Skan
224169689Skan        Gbl_Files[ASL_FILE_INPUT].Filename = FileSpecifier;
225169689Skan        FlFileError (ASL_FILE_INPUT, ASL_MSG_OPEN);
226169689Skan        AslAbort ();
227169689Skan    }
228169689Skan
229169689Skan    /* Process each file that matches the wildcard specification */
230169689Skan
231169689Skan    while ((Filename = AcpiOsGetNextFilename (DirInfo)))
232169689Skan    {
233169689Skan        /* Add the filename to the file list */
234132718Skan
235117395Skan        FileList[FileCount] = AcpiOsAllocate (strlen (Filename) + 1);
23650397Sobrien        strcpy (FileList[FileCount], Filename);
23718334Speter        FileCount++;
23890075Sobrien
23918334Speter        if (FileCount >= ASL_MAX_FILES)
24018334Speter        {
24118334Speter            printf ("Max files reached\n");
24218334Speter            FileList[0] = NULL;
24318334Speter            return (FileList);
24418334Speter        }
245132718Skan    }
24618334Speter
24718334Speter    /* Cleanup */
24818334Speter
24950397Sobrien    AcpiOsCloseDirectory (DirInfo);
25050397Sobrien    FileList[FileCount] = NULL;
251117395Skan    return (FileList);
25250397Sobrien
25318334Speter#else
25418334Speter    /*
25518334Speter     * Linux/Unix cases - Wildcards are expanded by the shell automatically.
25650397Sobrien     * Just return the filename in a null terminated list
25750397Sobrien     */
25818334Speter    FileList[0] = AcpiOsAllocate (strlen (FileSpecifier) + 1);
259117395Skan    strcpy (FileList[0], FileSpecifier);
260117395Skan    FileList[1] = NULL;
261117395Skan
26218334Speter    return (FileList);
263117395Skan#endif
264117395Skan}
265117395Skan
266117395Skan
26718334Speter/*******************************************************************************
26818334Speter *
26918334Speter * FUNCTION:    AslDetectSourceFileType
27018334Speter *
27118334Speter * PARAMETERS:  Info            - Name/Handle for the file (must be open)
27218334Speter *
27318334Speter * RETURN:      File Type
27418334Speter *
275117395Skan * DESCRIPTION: Determine the type of the input file. Either binary (contains
27618334Speter *              non-ASCII characters), ASL file, or an ACPI Data Table file.
27718334Speter *
27818334Speter ******************************************************************************/
27918334Speter
28018334SpeterUINT8
28118334SpeterAslDetectSourceFileType (
28218334Speter    ASL_FILE_INFO           *Info)
28318334Speter{
28418334Speter    char                    *FileChar;
28518334Speter    UINT8                   Type;
28618334Speter    ACPI_STATUS             Status;
28718334Speter
288117395Skan
28918334Speter    /* Check for 100% ASCII source file (comments are ignored) */
29018334Speter
29118334Speter    Status = FlCheckForAscii (Info);
29218334Speter    if (ACPI_FAILURE (Status))
29318334Speter    {
29418334Speter        printf ("Non-ascii input file - %s\n", Info->Filename);
29518334Speter        Type = ASL_INPUT_TYPE_BINARY;
29618334Speter        goto Cleanup;
29718334Speter    }
29818334Speter
29918334Speter    /*
30018334Speter     * File is ASCII. Determine if this is an ASL file or an ACPI data
30118334Speter     * table file.
30218334Speter     */
30318334Speter    while (fgets (Gbl_CurrentLineBuffer, ASL_LINE_BUFFER_SIZE, Info->Handle))
30418334Speter    {
30518334Speter        /* Uppercase the buffer for caseless compare */
30618334Speter
30718334Speter        FileChar = Gbl_CurrentLineBuffer;
30818334Speter        while (*FileChar)
30918334Speter        {
31018334Speter            *FileChar = (char) toupper ((int) *FileChar);
31118334Speter            FileChar++;
312117395Skan        }
313117395Skan
314117395Skan        /* Presence of "DefinitionBlock" indicates actual ASL code */
315117395Skan
316117395Skan        if (strstr (Gbl_CurrentLineBuffer, "DEFINITIONBLOCK"))
317117395Skan        {
318117395Skan            /* Appears to be an ASL file */
319117395Skan
320117395Skan            Type = ASL_INPUT_TYPE_ASCII_ASL;
321117395Skan            goto Cleanup;
322117395Skan        }
323117395Skan    }
324117395Skan
325117395Skan    /* Not an ASL source file, default to a data table source file */
326117395Skan
327117395Skan    Type = ASL_INPUT_TYPE_ASCII_DATA;
328117395Skan
329117395SkanCleanup:
330117395Skan
331117395Skan    /* Must seek back to the start of the file */
332117395Skan
33318334Speter    fseek (Info->Handle, 0, SEEK_SET);
33450397Sobrien    return (Type);
33518334Speter}
33618334Speter
33718334Speter
338132718Skan/*******************************************************************************
33918334Speter *
340132718Skan * FUNCTION:    AslDoOneFile
34118334Speter *
34218334Speter * PARAMETERS:  Filename        - Name of the file
34318334Speter *
34418334Speter * RETURN:      Status
34518334Speter *
34618334Speter * DESCRIPTION: Process a single file - either disassemble, compile, or both
34718334Speter *
34818334Speter ******************************************************************************/
349132718Skan
35018334SpeterACPI_STATUS
35118334SpeterAslDoOneFile (
35218334Speter    char                    *Filename)
353169689Skan{
354169689Skan    ACPI_STATUS             Status;
35518334Speter
35618334Speter
35718334Speter    Gbl_Files[ASL_FILE_INPUT].Filename = Filename;
35818334Speter
359117395Skan    /* Re-initialize "some" compiler globals */
360117395Skan
36118334Speter    AslInitializeGlobals ();
36218334Speter
363169689Skan    /*
36418334Speter     * AML Disassembly (Optional)
365169689Skan     */
366169689Skan    if (Gbl_DisasmFlag || Gbl_GetAllTables)
367169689Skan    {
368169689Skan        /* ACPICA subsystem initialization */
369169689Skan
37018334Speter        Status = AdInitialize ();
37118334Speter        if (ACPI_FAILURE (Status))
37218334Speter        {
37318334Speter            return (Status);
37418334Speter        }
37518334Speter
37618334Speter        Status = AcpiAllocateRootTable (4);
37718334Speter        if (ACPI_FAILURE (Status))
37818334Speter        {
37918334Speter            AcpiOsPrintf ("Could not initialize ACPI Table Manager, %s\n",
380169689Skan                AcpiFormatException (Status));
38118334Speter            return (Status);
38218334Speter        }
38318334Speter
38418334Speter        /* This is where the disassembly happens */
38518334Speter
38618334Speter        AcpiGbl_DbOpt_disasm = TRUE;
38718334Speter        Status = AdAmlDisassemble (AslToFile,
38818334Speter                    Gbl_Files[ASL_FILE_INPUT].Filename,
38990075Sobrien                    Gbl_OutputFilenamePrefix,
39090075Sobrien                    &Gbl_Files[ASL_FILE_INPUT].Filename,
391169689Skan                    Gbl_GetAllTables);
39290075Sobrien        if (ACPI_FAILURE (Status))
39390075Sobrien        {
39490075Sobrien            return (Status);
39590075Sobrien        }
39690075Sobrien
39790075Sobrien        /* Shutdown compiler and ACPICA subsystem */
39890075Sobrien
39990075Sobrien        AeClearErrorLog ();
40090075Sobrien        AcpiTerminate ();
40190075Sobrien
402132718Skan        /*
403132718Skan         * Gbl_Files[ASL_FILE_INPUT].Filename was replaced with the
404132718Skan         * .DSL disassembly file, which can now be compiled if requested
405132718Skan         */
406132718Skan        if (Gbl_DoCompile)
407132718Skan        {
40890075Sobrien            AcpiOsPrintf ("\nCompiling \"%s\"\n",
40918334Speter                Gbl_Files[ASL_FILE_INPUT].Filename);
41018334Speter        }
41190075Sobrien        else
412132718Skan        {
41318334Speter            Gbl_Files[ASL_FILE_INPUT].Filename = NULL;
414169689Skan            return (AE_OK);
415169689Skan        }
416169689Skan    }
417169689Skan
418169689Skan    /*
419169689Skan     * Open the input file. Here, this should be an ASCII source file,
420169689Skan     * either an ASL file or a Data Table file
421169689Skan     */
422169689Skan    Status = FlOpenInputFile (Gbl_Files[ASL_FILE_INPUT].Filename);
423132718Skan    if (ACPI_FAILURE (Status))
424169689Skan    {
425132718Skan        AePrintErrorLog (ASL_FILE_STDERR);
42690075Sobrien        return (AE_ERROR);
427132718Skan    }
42818334Speter
429132718Skan    /* Determine input file type */
430132718Skan
43118334Speter    Gbl_FileType = AslDetectSourceFileType (&Gbl_Files[ASL_FILE_INPUT]);
432132718Skan    if (Gbl_FileType == ASL_INPUT_TYPE_BINARY)
433132718Skan    {
43418334Speter        return (AE_ERROR);
43518334Speter    }
43650397Sobrien
437132718Skan    /*
438132718Skan     * If -p not specified, we will use the input filename as the
43950397Sobrien     * output filename prefix
440169689Skan     */
441169689Skan    if (Gbl_UseDefaultAmlFilename)
44218334Speter    {
44390075Sobrien        Gbl_OutputFilenamePrefix = Gbl_Files[ASL_FILE_INPUT].Filename;
44490075Sobrien    }
44518334Speter
44690075Sobrien    /* Open the optional output files (listings, etc.) */
44790075Sobrien
448132718Skan    Status = FlOpenMiscOutputFiles (Gbl_OutputFilenamePrefix);
449132718Skan    if (ACPI_FAILURE (Status))
450132718Skan    {
451132718Skan        AePrintErrorLog (ASL_FILE_STDERR);
45218334Speter        return (AE_ERROR);
45318334Speter    }
45418334Speter
455132718Skan    /*
456132718Skan     * Compilation of ASL source versus DataTable source uses different
457132718Skan     * compiler subsystems
458132718Skan     */
459132718Skan    switch (Gbl_FileType)
460132718Skan    {
461132718Skan    /*
462132718Skan     * Data Table Compilation
463169689Skan     */
464169689Skan    case ASL_INPUT_TYPE_ASCII_DATA:
465132718Skan
466132718Skan        Status = DtDoCompile ();
467132718Skan
468132718Skan        if (Gbl_Signature)
469132718Skan        {
470132718Skan            ACPI_FREE (Gbl_Signature);
471132718Skan            Gbl_Signature = NULL;
472132718Skan        }
473132718Skan        AeClearErrorLog ();
474169689Skan        return (Status);
475132718Skan
476132718Skan    /*
477132718Skan     * ASL Compilation (Optional)
478169689Skan     */
479169689Skan    case ASL_INPUT_TYPE_ASCII_ASL:
480132718Skan
481132718Skan        /* ACPICA subsystem initialization */
482169689Skan
483169689Skan        Status = AdInitialize ();
484169689Skan        if (ACPI_FAILURE (Status))
485169689Skan        {
486169689Skan            return (Status);
487132718Skan        }
488169689Skan
489169689Skan        Status = CmDoCompile ();
490169689Skan        AcpiTerminate ();
491169689Skan
492169689Skan        /*
493132718Skan         * Return non-zero exit code if there have been errors, unless the
494169689Skan         * global ignore error flag has been set
495132718Skan         */
496132718Skan        if ((Gbl_ExceptionCount[ASL_ERROR] > 0) && (!Gbl_IgnoreErrors))
49718334Speter        {
49818334Speter            return (AE_ERROR);
49918334Speter        }
50018334Speter
50118334Speter        AeClearErrorLog ();
50218334Speter        return (AE_OK);
50318334Speter
50418334Speter    case ASL_INPUT_TYPE_BINARY:
50518334Speter
50618334Speter        AePrintErrorLog (ASL_FILE_STDERR);
50718334Speter        return (AE_ERROR);
50818334Speter
50918334Speter    default:
51018334Speter        printf ("Unknown file type %X\n", Gbl_FileType);
51118334Speter        return (AE_ERROR);
51218334Speter    }
51318334Speter}
51418334Speter
51518334Speter
51618334Speter/*******************************************************************************
51718334Speter *
51818334Speter * FUNCTION:    AslDoOnePathname
51918334Speter *
52018334Speter * PARAMETERS:  Pathname            - Full pathname, possibly with wildcards
52118334Speter *
52218334Speter * RETURN:      Status
52318334Speter *
52418334Speter * DESCRIPTION: Process one pathname, possible terminated with a wildcard
52518334Speter *              specification. If a wildcard, it is expanded and the multiple
52618334Speter *              files are processed.
52718334Speter *
52818334Speter ******************************************************************************/
529169689Skan
530132718SkanACPI_STATUS
531132718SkanAslDoOnePathname (
532132718Skan    char                    *Pathname,
533132718Skan    ASL_PATHNAME_CALLBACK   PathCallback)
534132718Skan{
53518334Speter    ACPI_STATUS             Status = AE_OK;
53618334Speter    char                    **FileList;
53718334Speter    char                    *Filename;
53818334Speter    char                    *FullPathname;
53918334Speter
54018334Speter
54118334Speter    /* Split incoming path into a directory/filename combo */
54218334Speter
54318334Speter    Status = FlSplitInputPathname (Pathname, &Gbl_DirectoryPath, &Filename);
54418334Speter    if (ACPI_FAILURE (Status))
54518334Speter    {
54618334Speter        return (Status);
54718334Speter    }
54818334Speter
54918334Speter    /* Expand possible wildcard into a file list (Windows/DOS only) */
55018334Speter
55118334Speter    FileList = AsDoWildcard (Gbl_DirectoryPath, Filename);
55218334Speter    while (*FileList)
55318334Speter    {
55418334Speter        FullPathname = ACPI_ALLOCATE (
55518334Speter            strlen (Gbl_DirectoryPath) + strlen (*FileList) + 1);
55618334Speter
55718334Speter        /* Construct a full path to the file */
55818334Speter
55918334Speter        strcpy (FullPathname, Gbl_DirectoryPath);
56018334Speter        strcat (FullPathname, *FileList);
56118334Speter
56218334Speter        /*
56318334Speter         * If -p not specified, we will use the input filename as the
56418334Speter         * output filename prefix
56518334Speter         */
56618334Speter        if (Gbl_UseDefaultAmlFilename)
56718334Speter        {
56890075Sobrien            Gbl_OutputFilenamePrefix = FullPathname;
56918334Speter        }
57018334Speter
57118334Speter        /* Save status from all compiles */
57290075Sobrien
57318334Speter        Status |= (*PathCallback) (FullPathname);
57418334Speter
57518334Speter        ACPI_FREE (FullPathname);
57618334Speter        ACPI_FREE (*FileList);
57718334Speter        *FileList = NULL;
57818334Speter        FileList++;
57918334Speter    }
58018334Speter
58118334Speter    ACPI_FREE (Gbl_DirectoryPath);
58218334Speter    ACPI_FREE (Filename);
58318334Speter    return (Status);
58418334Speter}
58518334Speter
58618334Speter