aslstartup.c revision 233250
1193267Sjkim
2193267Sjkim/******************************************************************************
3193267Sjkim *
4193267Sjkim * Module Name: aslstartup - Compiler startup routines, called from main
5193267Sjkim *
6193267Sjkim *****************************************************************************/
7193267Sjkim
8217365Sjkim/*
9229989Sjkim * Copyright (C) 2000 - 2012, Intel Corp.
10193267Sjkim * All rights reserved.
11193267Sjkim *
12217365Sjkim * Redistribution and use in source and binary forms, with or without
13217365Sjkim * modification, are permitted provided that the following conditions
14217365Sjkim * are met:
15217365Sjkim * 1. Redistributions of source code must retain the above copyright
16217365Sjkim *    notice, this list of conditions, and the following disclaimer,
17217365Sjkim *    without modification.
18217365Sjkim * 2. Redistributions in binary form must reproduce at minimum a disclaimer
19217365Sjkim *    substantially similar to the "NO WARRANTY" disclaimer below
20217365Sjkim *    ("Disclaimer") and any redistribution must be conditioned upon
21217365Sjkim *    including a substantially similar Disclaimer requirement for further
22217365Sjkim *    binary redistribution.
23217365Sjkim * 3. Neither the names of the above-listed copyright holders nor the names
24217365Sjkim *    of any contributors may be used to endorse or promote products derived
25217365Sjkim *    from this software without specific prior written permission.
26193267Sjkim *
27217365Sjkim * Alternatively, this software may be distributed under the terms of the
28217365Sjkim * GNU General Public License ("GPL") version 2 as published by the Free
29217365Sjkim * Software Foundation.
30193267Sjkim *
31217365Sjkim * NO WARRANTY
32217365Sjkim * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
33217365Sjkim * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
34217365Sjkim * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
35217365Sjkim * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
36217365Sjkim * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
37217365Sjkim * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
38217365Sjkim * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
39217365Sjkim * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
40217365Sjkim * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
41217365Sjkim * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
42217365Sjkim * POSSIBILITY OF SUCH DAMAGES.
43217365Sjkim */
44193267Sjkim
45193267Sjkim
46193341Sjkim#include <contrib/dev/acpica/compiler/aslcompiler.h>
47193341Sjkim#include <contrib/dev/acpica/include/actables.h>
48193341Sjkim#include <contrib/dev/acpica/include/acapps.h>
49193267Sjkim
50193267Sjkim#define _COMPONENT          ACPI_COMPILER
51193267Sjkim        ACPI_MODULE_NAME    ("aslstartup")
52193267Sjkim
53193267Sjkim
54193267Sjkim#define ASL_MAX_FILES   256
55212761Sjkimstatic char             *FileList[ASL_MAX_FILES];
56212761Sjkimstatic BOOLEAN          AslToFile = TRUE;
57193267Sjkim
58193267Sjkim
59193267Sjkim/* Local prototypes */
60193267Sjkim
61193267Sjkimstatic char **
62193267SjkimAsDoWildcard (
63193267Sjkim    char                    *DirectoryPathname,
64193267Sjkim    char                    *FileSpecifier);
65193267Sjkim
66212761Sjkimstatic UINT8
67209746SjkimAslDetectSourceFileType (
68209746Sjkim    ASL_FILE_INFO           *Info);
69193267Sjkim
70209746Sjkim
71193267Sjkim/*******************************************************************************
72193267Sjkim *
73193267Sjkim * FUNCTION:    AslInitializeGlobals
74193267Sjkim *
75193267Sjkim * PARAMETERS:  None
76193267Sjkim *
77193267Sjkim * RETURN:      None
78193267Sjkim *
79193267Sjkim * DESCRIPTION: Re-initialize globals needed to restart the compiler. This
80193267Sjkim *              allows multiple files to be disassembled and/or compiled.
81193267Sjkim *
82193267Sjkim ******************************************************************************/
83193267Sjkim
84209746Sjkimvoid
85193267SjkimAslInitializeGlobals (
86193267Sjkim    void)
87193267Sjkim{
88193267Sjkim    UINT32                  i;
89193267Sjkim
90193267Sjkim
91193267Sjkim    /* Init compiler globals */
92193267Sjkim
93193267Sjkim    Gbl_CurrentColumn = 0;
94193267Sjkim    Gbl_CurrentLineNumber = 1;
95193267Sjkim    Gbl_LogicalLineNumber = 1;
96193267Sjkim    Gbl_CurrentLineOffset = 0;
97209746Sjkim    Gbl_InputFieldCount = 0;
98233250Sjkim    Gbl_InputByteCount = 0;
99233250Sjkim    Gbl_NsLookupCount = 0;
100193267Sjkim    Gbl_LineBufPtr = Gbl_CurrentLineBuffer;
101193267Sjkim
102193267Sjkim    Gbl_ErrorLog = NULL;
103193267Sjkim    Gbl_NextError = NULL;
104209746Sjkim    Gbl_Signature = NULL;
105209746Sjkim    Gbl_FileType = 0;
106193267Sjkim
107233250Sjkim    TotalExecutableOpcodes = 0;
108233250Sjkim    TotalNamedObjects = 0;
109233250Sjkim    TotalKeywords = 0;
110233250Sjkim    TotalParseNodes = 0;
111233250Sjkim    TotalMethods = 0;
112233250Sjkim    TotalAllocations = 0;
113233250Sjkim    TotalAllocated = 0;
114233250Sjkim    TotalFolds = 0;
115233250Sjkim
116193267Sjkim    AslGbl_NextEvent = 0;
117193267Sjkim    for (i = 0; i < ASL_NUM_REPORT_LEVELS; i++)
118193267Sjkim    {
119193267Sjkim        Gbl_ExceptionCount[i] = 0;
120193267Sjkim    }
121193267Sjkim
122233250Sjkim    for (i = ASL_FILE_INPUT; i <= ASL_MAX_FILE_TYPE; i++)
123233250Sjkim    {
124233250Sjkim        Gbl_Files[i].Handle = NULL;
125233250Sjkim        Gbl_Files[i].Filename = NULL;
126233250Sjkim    }
127193267Sjkim}
128193267Sjkim
129193267Sjkim
130193267Sjkim/******************************************************************************
131193267Sjkim *
132193267Sjkim * FUNCTION:    AsDoWildcard
133193267Sjkim *
134193267Sjkim * PARAMETERS:  None
135193267Sjkim *
136193267Sjkim * RETURN:      None
137193267Sjkim *
138193267Sjkim * DESCRIPTION: Process files via wildcards. This function is for the Windows
139193267Sjkim *              case only.
140193267Sjkim *
141193267Sjkim ******************************************************************************/
142193267Sjkim
143193267Sjkimstatic char **
144193267SjkimAsDoWildcard (
145193267Sjkim    char                    *DirectoryPathname,
146193267Sjkim    char                    *FileSpecifier)
147193267Sjkim{
148193267Sjkim#ifdef WIN32
149193267Sjkim    void                    *DirInfo;
150193267Sjkim    char                    *Filename;
151212761Sjkim    int                     FileCount;
152193267Sjkim
153193267Sjkim
154193267Sjkim    FileCount = 0;
155193267Sjkim
156193267Sjkim    /* Open parent directory */
157193267Sjkim
158193267Sjkim    DirInfo = AcpiOsOpenDirectory (DirectoryPathname, FileSpecifier, REQUEST_FILE_ONLY);
159193267Sjkim    if (!DirInfo)
160193267Sjkim    {
161193267Sjkim        /* Either the directory of file does not exist */
162193267Sjkim
163193267Sjkim        Gbl_Files[ASL_FILE_INPUT].Filename = FileSpecifier;
164193267Sjkim        FlFileError (ASL_FILE_INPUT, ASL_MSG_OPEN);
165193267Sjkim        AslAbort ();
166193267Sjkim    }
167193267Sjkim
168193267Sjkim    /* Process each file that matches the wildcard specification */
169193267Sjkim
170193267Sjkim    while ((Filename = AcpiOsGetNextFilename (DirInfo)))
171193267Sjkim    {
172193267Sjkim        /* Add the filename to the file list */
173193267Sjkim
174193267Sjkim        FileList[FileCount] = AcpiOsAllocate (strlen (Filename) + 1);
175193267Sjkim        strcpy (FileList[FileCount], Filename);
176193267Sjkim        FileCount++;
177193267Sjkim
178193267Sjkim        if (FileCount >= ASL_MAX_FILES)
179193267Sjkim        {
180193267Sjkim            printf ("Max files reached\n");
181193267Sjkim            FileList[0] = NULL;
182193267Sjkim            return (FileList);
183193267Sjkim        }
184193267Sjkim    }
185193267Sjkim
186193267Sjkim    /* Cleanup */
187193267Sjkim
188193267Sjkim    AcpiOsCloseDirectory (DirInfo);
189193267Sjkim    FileList[FileCount] = NULL;
190193267Sjkim    return (FileList);
191193267Sjkim
192193267Sjkim#else
193193267Sjkim    /*
194193267Sjkim     * Linux/Unix cases - Wildcards are expanded by the shell automatically.
195193267Sjkim     * Just return the filename in a null terminated list
196193267Sjkim     */
197193267Sjkim    FileList[0] = AcpiOsAllocate (strlen (FileSpecifier) + 1);
198193267Sjkim    strcpy (FileList[0], FileSpecifier);
199193267Sjkim    FileList[1] = NULL;
200193267Sjkim
201193267Sjkim    return (FileList);
202193267Sjkim#endif
203193267Sjkim}
204193267Sjkim
205193267Sjkim
206193267Sjkim/*******************************************************************************
207193267Sjkim *
208209746Sjkim * FUNCTION:    AslDetectSourceFileType
209209746Sjkim *
210209746Sjkim * PARAMETERS:  Info            - Name/Handle for the file (must be open)
211209746Sjkim *
212209746Sjkim * RETURN:      File Type
213209746Sjkim *
214209746Sjkim * DESCRIPTION: Determine the type of the input file. Either binary (contains
215209746Sjkim *              non-ASCII characters), ASL file, or an ACPI Data Table file.
216209746Sjkim *
217209746Sjkim ******************************************************************************/
218209746Sjkim
219212761Sjkimstatic UINT8
220209746SjkimAslDetectSourceFileType (
221209746Sjkim    ASL_FILE_INFO           *Info)
222209746Sjkim{
223209746Sjkim    char                    *FileChar;
224209746Sjkim    UINT8                   Type;
225209746Sjkim    ACPI_STATUS             Status;
226209746Sjkim
227209746Sjkim
228209746Sjkim    /* Check for 100% ASCII source file (comments are ignored) */
229209746Sjkim
230209746Sjkim    Status = FlCheckForAscii (Info);
231209746Sjkim    if (ACPI_FAILURE (Status))
232209746Sjkim    {
233209746Sjkim        printf ("Non-ascii input file - %s\n", Info->Filename);
234209746Sjkim        Type = ASL_INPUT_TYPE_BINARY;
235209746Sjkim        goto Cleanup;
236209746Sjkim    }
237209746Sjkim
238209746Sjkim    /*
239209746Sjkim     * File is ASCII. Determine if this is an ASL file or an ACPI data
240209746Sjkim     * table file.
241209746Sjkim     */
242209746Sjkim    while (fgets (Gbl_CurrentLineBuffer, ASL_LINE_BUFFER_SIZE, Info->Handle))
243209746Sjkim    {
244209746Sjkim        /* Uppercase the buffer for caseless compare */
245209746Sjkim
246209746Sjkim        FileChar = Gbl_CurrentLineBuffer;
247209746Sjkim        while (*FileChar)
248209746Sjkim        {
249209746Sjkim            *FileChar = (char) toupper ((int) *FileChar);
250209746Sjkim            FileChar++;
251209746Sjkim        }
252209746Sjkim
253209746Sjkim        /* Presence of "DefinitionBlock" indicates actual ASL code */
254209746Sjkim
255209746Sjkim        if (strstr (Gbl_CurrentLineBuffer, "DEFINITIONBLOCK"))
256209746Sjkim        {
257209746Sjkim            /* Appears to be an ASL file */
258209746Sjkim
259209746Sjkim            Type = ASL_INPUT_TYPE_ASCII_ASL;
260209746Sjkim            goto Cleanup;
261209746Sjkim        }
262209746Sjkim    }
263209746Sjkim
264209746Sjkim    /* Not an ASL source file, default to a data table source file */
265209746Sjkim
266209746Sjkim    Type = ASL_INPUT_TYPE_ASCII_DATA;
267209746Sjkim
268209746SjkimCleanup:
269209746Sjkim
270209746Sjkim    /* Must seek back to the start of the file */
271209746Sjkim
272209746Sjkim    fseek (Info->Handle, 0, SEEK_SET);
273209746Sjkim    return (Type);
274209746Sjkim}
275209746Sjkim
276209746Sjkim
277209746Sjkim/*******************************************************************************
278209746Sjkim *
279193267Sjkim * FUNCTION:    AslDoOneFile
280193267Sjkim *
281193267Sjkim * PARAMETERS:  Filename        - Name of the file
282193267Sjkim *
283193267Sjkim * RETURN:      Status
284193267Sjkim *
285193267Sjkim * DESCRIPTION: Process a single file - either disassemble, compile, or both
286193267Sjkim *
287193267Sjkim ******************************************************************************/
288193267Sjkim
289193267SjkimACPI_STATUS
290193267SjkimAslDoOneFile (
291193267Sjkim    char                    *Filename)
292193267Sjkim{
293193267Sjkim    ACPI_STATUS             Status;
294193267Sjkim
295193267Sjkim
296233250Sjkim    /* Re-initialize "some" compiler/preprocessor globals */
297193267Sjkim
298193267Sjkim    AslInitializeGlobals ();
299233250Sjkim    PrInitializeGlobals ();
300193267Sjkim
301233250Sjkim    Gbl_Files[ASL_FILE_INPUT].Filename = Filename;
302233250Sjkim
303193267Sjkim    /*
304193267Sjkim     * AML Disassembly (Optional)
305193267Sjkim     */
306193267Sjkim    if (Gbl_DisasmFlag || Gbl_GetAllTables)
307193267Sjkim    {
308209746Sjkim        /* ACPICA subsystem initialization */
309193267Sjkim
310193267Sjkim        Status = AdInitialize ();
311193267Sjkim        if (ACPI_FAILURE (Status))
312193267Sjkim        {
313193267Sjkim            return (Status);
314193267Sjkim        }
315193267Sjkim
316193267Sjkim        Status = AcpiAllocateRootTable (4);
317193267Sjkim        if (ACPI_FAILURE (Status))
318193267Sjkim        {
319193267Sjkim            AcpiOsPrintf ("Could not initialize ACPI Table Manager, %s\n",
320193267Sjkim                AcpiFormatException (Status));
321193267Sjkim            return (Status);
322193267Sjkim        }
323193267Sjkim
324193267Sjkim        /* This is where the disassembly happens */
325193267Sjkim
326193267Sjkim        AcpiGbl_DbOpt_disasm = TRUE;
327193267Sjkim        Status = AdAmlDisassemble (AslToFile,
328193267Sjkim                    Gbl_Files[ASL_FILE_INPUT].Filename,
329193267Sjkim                    Gbl_OutputFilenamePrefix,
330193267Sjkim                    &Gbl_Files[ASL_FILE_INPUT].Filename,
331193267Sjkim                    Gbl_GetAllTables);
332193267Sjkim        if (ACPI_FAILURE (Status))
333193267Sjkim        {
334193267Sjkim            return (Status);
335193267Sjkim        }
336193267Sjkim
337193267Sjkim        /* Shutdown compiler and ACPICA subsystem */
338193267Sjkim
339193267Sjkim        AeClearErrorLog ();
340212761Sjkim        (void) AcpiTerminate ();
341193267Sjkim
342193267Sjkim        /*
343193267Sjkim         * Gbl_Files[ASL_FILE_INPUT].Filename was replaced with the
344193267Sjkim         * .DSL disassembly file, which can now be compiled if requested
345193267Sjkim         */
346193267Sjkim        if (Gbl_DoCompile)
347193267Sjkim        {
348193267Sjkim            AcpiOsPrintf ("\nCompiling \"%s\"\n",
349193267Sjkim                Gbl_Files[ASL_FILE_INPUT].Filename);
350193267Sjkim        }
351209746Sjkim        else
352209746Sjkim        {
353209746Sjkim            Gbl_Files[ASL_FILE_INPUT].Filename = NULL;
354209746Sjkim            return (AE_OK);
355209746Sjkim        }
356193267Sjkim    }
357193267Sjkim
358193267Sjkim    /*
359209746Sjkim     * Open the input file. Here, this should be an ASCII source file,
360209746Sjkim     * either an ASL file or a Data Table file
361193267Sjkim     */
362209746Sjkim    Status = FlOpenInputFile (Gbl_Files[ASL_FILE_INPUT].Filename);
363209746Sjkim    if (ACPI_FAILURE (Status))
364193267Sjkim    {
365209746Sjkim        AePrintErrorLog (ASL_FILE_STDERR);
366209746Sjkim        return (AE_ERROR);
367209746Sjkim    }
368209746Sjkim
369209746Sjkim    /* Determine input file type */
370209746Sjkim
371209746Sjkim    Gbl_FileType = AslDetectSourceFileType (&Gbl_Files[ASL_FILE_INPUT]);
372209746Sjkim    if (Gbl_FileType == ASL_INPUT_TYPE_BINARY)
373209746Sjkim    {
374209746Sjkim        return (AE_ERROR);
375209746Sjkim    }
376209746Sjkim
377209746Sjkim    /*
378209746Sjkim     * If -p not specified, we will use the input filename as the
379209746Sjkim     * output filename prefix
380209746Sjkim     */
381209746Sjkim    if (Gbl_UseDefaultAmlFilename)
382209746Sjkim    {
383209746Sjkim        Gbl_OutputFilenamePrefix = Gbl_Files[ASL_FILE_INPUT].Filename;
384209746Sjkim    }
385209746Sjkim
386209746Sjkim    /* Open the optional output files (listings, etc.) */
387209746Sjkim
388209746Sjkim    Status = FlOpenMiscOutputFiles (Gbl_OutputFilenamePrefix);
389209746Sjkim    if (ACPI_FAILURE (Status))
390209746Sjkim    {
391209746Sjkim        AePrintErrorLog (ASL_FILE_STDERR);
392209746Sjkim        return (AE_ERROR);
393209746Sjkim    }
394209746Sjkim
395209746Sjkim    /*
396209746Sjkim     * Compilation of ASL source versus DataTable source uses different
397209746Sjkim     * compiler subsystems
398209746Sjkim     */
399209746Sjkim    switch (Gbl_FileType)
400209746Sjkim    {
401209746Sjkim    /*
402209746Sjkim     * Data Table Compilation
403209746Sjkim     */
404209746Sjkim    case ASL_INPUT_TYPE_ASCII_DATA:
405209746Sjkim
406209746Sjkim        Status = DtDoCompile ();
407209746Sjkim
408209746Sjkim        if (Gbl_Signature)
409193267Sjkim        {
410209746Sjkim            ACPI_FREE (Gbl_Signature);
411209746Sjkim            Gbl_Signature = NULL;
412193267Sjkim        }
413209746Sjkim        AeClearErrorLog ();
414233250Sjkim        PrTerminatePreprocessor ();
415209746Sjkim        return (Status);
416193267Sjkim
417209746Sjkim    /*
418209746Sjkim     * ASL Compilation (Optional)
419209746Sjkim     */
420209746Sjkim    case ASL_INPUT_TYPE_ASCII_ASL:
421193267Sjkim
422209746Sjkim        /* ACPICA subsystem initialization */
423209746Sjkim
424193267Sjkim        Status = AdInitialize ();
425193267Sjkim        if (ACPI_FAILURE (Status))
426193267Sjkim        {
427193267Sjkim            return (Status);
428193267Sjkim        }
429193267Sjkim
430193267Sjkim        Status = CmDoCompile ();
431212761Sjkim        (void) AcpiTerminate ();
432193267Sjkim
433193267Sjkim        /*
434193267Sjkim         * Return non-zero exit code if there have been errors, unless the
435193267Sjkim         * global ignore error flag has been set
436193267Sjkim         */
437193267Sjkim        if ((Gbl_ExceptionCount[ASL_ERROR] > 0) && (!Gbl_IgnoreErrors))
438193267Sjkim        {
439193267Sjkim            return (AE_ERROR);
440193267Sjkim        }
441193267Sjkim
442193267Sjkim        AeClearErrorLog ();
443233250Sjkim        PrTerminatePreprocessor ();
444209746Sjkim        return (AE_OK);
445209746Sjkim
446209746Sjkim    case ASL_INPUT_TYPE_BINARY:
447209746Sjkim
448209746Sjkim        AePrintErrorLog (ASL_FILE_STDERR);
449209746Sjkim        return (AE_ERROR);
450209746Sjkim
451209746Sjkim    default:
452209746Sjkim        printf ("Unknown file type %X\n", Gbl_FileType);
453209746Sjkim        return (AE_ERROR);
454193267Sjkim    }
455193267Sjkim}
456193267Sjkim
457193267Sjkim
458193267Sjkim/*******************************************************************************
459193267Sjkim *
460193267Sjkim * FUNCTION:    AslDoOnePathname
461193267Sjkim *
462193267Sjkim * PARAMETERS:  Pathname            - Full pathname, possibly with wildcards
463193267Sjkim *
464193267Sjkim * RETURN:      Status
465193267Sjkim *
466193267Sjkim * DESCRIPTION: Process one pathname, possible terminated with a wildcard
467193267Sjkim *              specification. If a wildcard, it is expanded and the multiple
468193267Sjkim *              files are processed.
469193267Sjkim *
470193267Sjkim ******************************************************************************/
471193267Sjkim
472193267SjkimACPI_STATUS
473193267SjkimAslDoOnePathname (
474210976Sjkim    char                    *Pathname,
475210976Sjkim    ASL_PATHNAME_CALLBACK   PathCallback)
476193267Sjkim{
477209746Sjkim    ACPI_STATUS             Status = AE_OK;
478212761Sjkim    char                    **WildcardList;
479193267Sjkim    char                    *Filename;
480193267Sjkim    char                    *FullPathname;
481193267Sjkim
482193267Sjkim
483193267Sjkim    /* Split incoming path into a directory/filename combo */
484193267Sjkim
485193267Sjkim    Status = FlSplitInputPathname (Pathname, &Gbl_DirectoryPath, &Filename);
486193267Sjkim    if (ACPI_FAILURE (Status))
487193267Sjkim    {
488193267Sjkim        return (Status);
489193267Sjkim    }
490193267Sjkim
491193267Sjkim    /* Expand possible wildcard into a file list (Windows/DOS only) */
492193267Sjkim
493212761Sjkim    WildcardList = AsDoWildcard (Gbl_DirectoryPath, Filename);
494212761Sjkim    while (*WildcardList)
495193267Sjkim    {
496193267Sjkim        FullPathname = ACPI_ALLOCATE (
497212761Sjkim            strlen (Gbl_DirectoryPath) + strlen (*WildcardList) + 1);
498193267Sjkim
499193267Sjkim        /* Construct a full path to the file */
500193267Sjkim
501193267Sjkim        strcpy (FullPathname, Gbl_DirectoryPath);
502212761Sjkim        strcat (FullPathname, *WildcardList);
503193267Sjkim
504193267Sjkim        /*
505193267Sjkim         * If -p not specified, we will use the input filename as the
506193267Sjkim         * output filename prefix
507193267Sjkim         */
508193267Sjkim        if (Gbl_UseDefaultAmlFilename)
509193267Sjkim        {
510193267Sjkim            Gbl_OutputFilenamePrefix = FullPathname;
511193267Sjkim        }
512193267Sjkim
513209746Sjkim        /* Save status from all compiles */
514193267Sjkim
515210976Sjkim        Status |= (*PathCallback) (FullPathname);
516209746Sjkim
517193267Sjkim        ACPI_FREE (FullPathname);
518212761Sjkim        ACPI_FREE (*WildcardList);
519212761Sjkim        *WildcardList = NULL;
520212761Sjkim        WildcardList++;
521193267Sjkim    }
522193267Sjkim
523193267Sjkim    ACPI_FREE (Gbl_DirectoryPath);
524193267Sjkim    ACPI_FREE (Filename);
525209746Sjkim    return (Status);
526193267Sjkim}
527193267Sjkim
528