aslstartup.c revision 241973
1193267Sjkim/******************************************************************************
2193267Sjkim *
3193267Sjkim * Module Name: aslstartup - Compiler startup routines, called from main
4193267Sjkim *
5193267Sjkim *****************************************************************************/
6193267Sjkim
7217365Sjkim/*
8245582Sjkim * Copyright (C) 2000 - 2012, Intel Corp.
9193267Sjkim * All rights reserved.
10193267Sjkim *
11217365Sjkim * Redistribution and use in source and binary forms, with or without
12217365Sjkim * modification, are permitted provided that the following conditions
13217365Sjkim * are met:
14217365Sjkim * 1. Redistributions of source code must retain the above copyright
15217365Sjkim *    notice, this list of conditions, and the following disclaimer,
16217365Sjkim *    without modification.
17217365Sjkim * 2. Redistributions in binary form must reproduce at minimum a disclaimer
18217365Sjkim *    substantially similar to the "NO WARRANTY" disclaimer below
19217365Sjkim *    ("Disclaimer") and any redistribution must be conditioned upon
20217365Sjkim *    including a substantially similar Disclaimer requirement for further
21217365Sjkim *    binary redistribution.
22217365Sjkim * 3. Neither the names of the above-listed copyright holders nor the names
23217365Sjkim *    of any contributors may be used to endorse or promote products derived
24217365Sjkim *    from this software without specific prior written permission.
25193267Sjkim *
26217365Sjkim * Alternatively, this software may be distributed under the terms of the
27217365Sjkim * GNU General Public License ("GPL") version 2 as published by the Free
28217365Sjkim * Software Foundation.
29193267Sjkim *
30217365Sjkim * NO WARRANTY
31217365Sjkim * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
32217365Sjkim * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
33217365Sjkim * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
34217365Sjkim * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
35217365Sjkim * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
36217365Sjkim * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
37217365Sjkim * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
38217365Sjkim * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
39217365Sjkim * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
40217365Sjkim * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
41217365Sjkim * POSSIBILITY OF SUCH DAMAGES.
42217365Sjkim */
43193267Sjkim
44193267Sjkim
45193341Sjkim#include <contrib/dev/acpica/compiler/aslcompiler.h>
46193341Sjkim#include <contrib/dev/acpica/include/actables.h>
47246849Sjkim#include <contrib/dev/acpica/include/acapps.h>
48193341Sjkim
49193267Sjkim#define _COMPONENT          ACPI_COMPILER
50193267Sjkim        ACPI_MODULE_NAME    ("aslstartup")
51193267Sjkim
52193267Sjkim
53193267Sjkim#define ASL_MAX_FILES   256
54193267Sjkimstatic char             *FileList[ASL_MAX_FILES];
55212761Sjkimstatic BOOLEAN          AslToFile = TRUE;
56212761Sjkim
57193267Sjkim
58193267Sjkim/* Local prototypes */
59193267Sjkim
60193267Sjkimstatic char **
61193267SjkimAsDoWildcard (
62193267Sjkim    char                    *DirectoryPathname,
63193267Sjkim    char                    *FileSpecifier);
64193267Sjkim
65193267Sjkimstatic UINT8
66212761SjkimAslDetectSourceFileType (
67209746Sjkim    ASL_FILE_INFO           *Info);
68209746Sjkim
69193267Sjkim
70246849Sjkim/*******************************************************************************
71246849Sjkim *
72246849Sjkim * FUNCTION:    AslInitializeGlobals
73209746Sjkim *
74246849Sjkim * PARAMETERS:  None
75193267Sjkim *
76193267Sjkim * RETURN:      None
77193267Sjkim *
78193267Sjkim * DESCRIPTION: Re-initialize globals needed to restart the compiler. This
79193267Sjkim *              allows multiple files to be disassembled and/or compiled.
80193267Sjkim *
81193267Sjkim ******************************************************************************/
82193267Sjkim
83193267Sjkimvoid
84193267SjkimAslInitializeGlobals (
85193267Sjkim    void)
86193267Sjkim{
87193267Sjkim    UINT32                  i;
88209746Sjkim
89193267Sjkim
90193267Sjkim    /* Init compiler globals */
91193267Sjkim
92193267Sjkim    Gbl_CurrentColumn = 0;
93193267Sjkim    Gbl_CurrentLineNumber = 1;
94193267Sjkim    Gbl_LogicalLineNumber = 1;
95193267Sjkim    Gbl_CurrentLineOffset = 0;
96193267Sjkim    Gbl_InputFieldCount = 0;
97193267Sjkim    Gbl_InputByteCount = 0;
98193267Sjkim    Gbl_NsLookupCount = 0;
99193267Sjkim    Gbl_LineBufPtr = Gbl_CurrentLineBuffer;
100193267Sjkim
101209746Sjkim    Gbl_ErrorLog = NULL;
102233250Sjkim    Gbl_NextError = NULL;
103233250Sjkim    Gbl_Signature = NULL;
104193267Sjkim    Gbl_FileType = 0;
105193267Sjkim
106193267Sjkim    TotalExecutableOpcodes = 0;
107193267Sjkim    TotalNamedObjects = 0;
108209746Sjkim    TotalKeywords = 0;
109209746Sjkim    TotalParseNodes = 0;
110193267Sjkim    TotalMethods = 0;
111233250Sjkim    TotalAllocations = 0;
112233250Sjkim    TotalAllocated = 0;
113233250Sjkim    TotalFolds = 0;
114233250Sjkim
115233250Sjkim    AslGbl_NextEvent = 0;
116233250Sjkim    for (i = 0; i < ASL_NUM_REPORT_LEVELS; i++)
117233250Sjkim    {
118233250Sjkim        Gbl_ExceptionCount[i] = 0;
119233250Sjkim    }
120193267Sjkim
121193267Sjkim    for (i = ASL_FILE_INPUT; i <= ASL_MAX_FILE_TYPE; i++)
122193267Sjkim    {
123193267Sjkim        Gbl_Files[i].Handle = NULL;
124193267Sjkim        Gbl_Files[i].Filename = NULL;
125193267Sjkim    }
126233250Sjkim}
127233250Sjkim
128233250Sjkim
129233250Sjkim/******************************************************************************
130233250Sjkim *
131193267Sjkim * FUNCTION:    AsDoWildcard
132193267Sjkim *
133193267Sjkim * PARAMETERS:  None
134193267Sjkim *
135193267Sjkim * RETURN:      None
136193267Sjkim *
137193267Sjkim * DESCRIPTION: Process files via wildcards. This function is for the Windows
138193267Sjkim *              case only.
139193267Sjkim *
140193267Sjkim ******************************************************************************/
141193267Sjkim
142193267Sjkimstatic char **
143193267SjkimAsDoWildcard (
144193267Sjkim    char                    *DirectoryPathname,
145193267Sjkim    char                    *FileSpecifier)
146193267Sjkim{
147193267Sjkim#ifdef WIN32
148193267Sjkim    void                    *DirInfo;
149193267Sjkim    char                    *Filename;
150193267Sjkim    int                     FileCount;
151193267Sjkim
152193267Sjkim
153193267Sjkim    FileCount = 0;
154193267Sjkim
155212761Sjkim    /* Open parent directory */
156193267Sjkim
157193267Sjkim    DirInfo = AcpiOsOpenDirectory (DirectoryPathname, FileSpecifier, REQUEST_FILE_ONLY);
158193267Sjkim    if (!DirInfo)
159193267Sjkim    {
160193267Sjkim        /* Either the directory of file does not exist */
161193267Sjkim
162193267Sjkim        Gbl_Files[ASL_FILE_INPUT].Filename = FileSpecifier;
163193267Sjkim        FlFileError (ASL_FILE_INPUT, ASL_MSG_OPEN);
164193267Sjkim        AslAbort ();
165193267Sjkim    }
166193267Sjkim
167193267Sjkim    /* Process each file that matches the wildcard specification */
168193267Sjkim
169193267Sjkim    while ((Filename = AcpiOsGetNextFilename (DirInfo)))
170193267Sjkim    {
171193267Sjkim        /* Add the filename to the file list */
172193267Sjkim
173193267Sjkim        FileList[FileCount] = AcpiOsAllocate (strlen (Filename) + 1);
174193267Sjkim        strcpy (FileList[FileCount], Filename);
175193267Sjkim        FileCount++;
176193267Sjkim
177193267Sjkim        if (FileCount >= ASL_MAX_FILES)
178193267Sjkim        {
179193267Sjkim            printf ("Max files reached\n");
180193267Sjkim            FileList[0] = NULL;
181193267Sjkim            return (FileList);
182193267Sjkim        }
183193267Sjkim    }
184193267Sjkim
185193267Sjkim    /* Cleanup */
186193267Sjkim
187193267Sjkim    AcpiOsCloseDirectory (DirInfo);
188193267Sjkim    FileList[FileCount] = NULL;
189193267Sjkim    return (FileList);
190193267Sjkim
191193267Sjkim#else
192193267Sjkim    /*
193193267Sjkim     * Linux/Unix cases - Wildcards are expanded by the shell automatically.
194193267Sjkim     * Just return the filename in a null terminated list
195193267Sjkim     */
196193267Sjkim    FileList[0] = AcpiOsAllocate (strlen (FileSpecifier) + 1);
197193267Sjkim    strcpy (FileList[0], FileSpecifier);
198193267Sjkim    FileList[1] = NULL;
199193267Sjkim
200193267Sjkim    return (FileList);
201193267Sjkim#endif
202193267Sjkim}
203193267Sjkim
204193267Sjkim
205193267Sjkim/*******************************************************************************
206193267Sjkim *
207193267Sjkim * FUNCTION:    AslDetectSourceFileType
208193267Sjkim *
209193267Sjkim * PARAMETERS:  Info            - Name/Handle for the file (must be open)
210193267Sjkim *
211193267Sjkim * RETURN:      File Type
212209746Sjkim *
213209746Sjkim * DESCRIPTION: Determine the type of the input file. Either binary (contains
214209746Sjkim *              non-ASCII characters), ASL file, or an ACPI Data Table file.
215209746Sjkim *
216209746Sjkim ******************************************************************************/
217209746Sjkim
218209746Sjkimstatic UINT8
219209746SjkimAslDetectSourceFileType (
220209746Sjkim    ASL_FILE_INFO           *Info)
221209746Sjkim{
222209746Sjkim    char                    *FileChar;
223212761Sjkim    UINT8                   Type;
224209746Sjkim    ACPI_STATUS             Status;
225209746Sjkim
226209746Sjkim
227209746Sjkim    /* Check for 100% ASCII source file (comments are ignored) */
228209746Sjkim
229209746Sjkim    Status = FlCheckForAscii (Info->Handle, Info->Filename, TRUE);
230209746Sjkim    if (ACPI_FAILURE (Status))
231209746Sjkim    {
232246849Sjkim        printf ("Non-ascii input file - %s\n", Info->Filename);
233246849Sjkim
234246849Sjkim        if (!Gbl_IgnoreErrors)
235246849Sjkim        {
236246849Sjkim            Type = ASL_INPUT_TYPE_BINARY;
237246849Sjkim            goto Cleanup;
238246849Sjkim        }
239246849Sjkim    }
240246849Sjkim
241209746Sjkim    /*
242209746Sjkim     * File is ASCII. Determine if this is an ASL file or an ACPI data
243235945Sjkim     * table file.
244209746Sjkim     */
245209746Sjkim    while (fgets (Gbl_CurrentLineBuffer, Gbl_LineBufferSize, Info->Handle))
246209746Sjkim    {
247241973Sjkim        /* Uppercase the buffer for caseless compare */
248241973Sjkim
249241973Sjkim        FileChar = Gbl_CurrentLineBuffer;
250241973Sjkim        while (*FileChar)
251241973Sjkim        {
252241973Sjkim            *FileChar = (char) toupper ((int) *FileChar);
253209746Sjkim            FileChar++;
254209746Sjkim        }
255209746Sjkim
256209746Sjkim        /* Presence of "DefinitionBlock" indicates actual ASL code */
257209746Sjkim
258209746Sjkim        if (strstr (Gbl_CurrentLineBuffer, "DEFINITIONBLOCK"))
259240716Sjkim        {
260209746Sjkim            /* Appears to be an ASL file */
261209746Sjkim
262209746Sjkim            Type = ASL_INPUT_TYPE_ASCII_ASL;
263209746Sjkim            goto Cleanup;
264209746Sjkim        }
265209746Sjkim    }
266209746Sjkim
267209746Sjkim    /* Not an ASL source file, default to a data table source file */
268209746Sjkim
269209746Sjkim    Type = ASL_INPUT_TYPE_ASCII_DATA;
270209746Sjkim
271209746SjkimCleanup:
272209746Sjkim
273209746Sjkim    /* Must seek back to the start of the file */
274209746Sjkim
275209746Sjkim    fseek (Info->Handle, 0, SEEK_SET);
276209746Sjkim    return (Type);
277209746Sjkim}
278209746Sjkim
279209746Sjkim
280209746Sjkim/*******************************************************************************
281209746Sjkim *
282209746Sjkim * FUNCTION:    AslDoOneFile
283209746Sjkim *
284209746Sjkim * PARAMETERS:  Filename        - Name of the file
285209746Sjkim *
286209746Sjkim * RETURN:      Status
287209746Sjkim *
288209746Sjkim * DESCRIPTION: Process a single file - either disassemble, compile, or both
289209746Sjkim *
290209746Sjkim ******************************************************************************/
291209746Sjkim
292209746SjkimACPI_STATUS
293209746SjkimAslDoOneFile (
294209746Sjkim    char                    *Filename)
295209746Sjkim{
296246849Sjkim    ACPI_STATUS             Status;
297246849Sjkim
298246849Sjkim
299246849Sjkim    /* Re-initialize "some" compiler/preprocessor globals */
300246849Sjkim
301246849Sjkim    AslInitializeGlobals ();
302246849Sjkim    PrInitializeGlobals ();
303246849Sjkim
304246849Sjkim    Gbl_Files[ASL_FILE_INPUT].Filename = Filename;
305246849Sjkim
306246849Sjkim    /*
307246849Sjkim     * AML Disassembly (Optional)
308246849Sjkim     */
309246849Sjkim    if (Gbl_DisasmFlag || Gbl_GetAllTables)
310246849Sjkim    {
311246849Sjkim        /* ACPICA subsystem initialization */
312246849Sjkim
313246849Sjkim        Status = AdInitialize ();
314246849Sjkim        if (ACPI_FAILURE (Status))
315246849Sjkim        {
316246849Sjkim            return (Status);
317246849Sjkim        }
318246849Sjkim
319246849Sjkim        Status = AcpiAllocateRootTable (4);
320246849Sjkim        if (ACPI_FAILURE (Status))
321246849Sjkim        {
322246849Sjkim            AcpiOsPrintf ("Could not initialize ACPI Table Manager, %s\n",
323246849Sjkim                AcpiFormatException (Status));
324246849Sjkim            return (Status);
325246849Sjkim        }
326246849Sjkim
327246849Sjkim        /* This is where the disassembly happens */
328246849Sjkim
329246849Sjkim        AcpiGbl_DbOpt_disasm = TRUE;
330246849Sjkim        Status = AdAmlDisassemble (AslToFile,
331246849Sjkim                    Gbl_Files[ASL_FILE_INPUT].Filename,
332246849Sjkim                    Gbl_OutputFilenamePrefix,
333246849Sjkim                    &Gbl_Files[ASL_FILE_INPUT].Filename,
334246849Sjkim                    Gbl_GetAllTables);
335246849Sjkim        if (ACPI_FAILURE (Status))
336246849Sjkim        {
337246849Sjkim            return (Status);
338246849Sjkim        }
339246849Sjkim
340246849Sjkim        /* Shutdown compiler and ACPICA subsystem */
341246849Sjkim
342246849Sjkim        AeClearErrorLog ();
343246849Sjkim        (void) AcpiTerminate ();
344246849Sjkim
345246849Sjkim        /*
346246849Sjkim         * Gbl_Files[ASL_FILE_INPUT].Filename was replaced with the
347246849Sjkim         * .DSL disassembly file, which can now be compiled if requested
348246849Sjkim         */
349246849Sjkim        if (Gbl_DoCompile)
350246849Sjkim        {
351246849Sjkim            AcpiOsPrintf ("\nCompiling \"%s\"\n",
352246849Sjkim                Gbl_Files[ASL_FILE_INPUT].Filename);
353246849Sjkim        }
354246849Sjkim        else
355246849Sjkim        {
356246849Sjkim            Gbl_Files[ASL_FILE_INPUT].Filename = NULL;
357246849Sjkim            return (AE_OK);
358246849Sjkim        }
359246849Sjkim    }
360246849Sjkim
361246849Sjkim    /*
362246849Sjkim     * Open the input file. Here, this should be an ASCII source file,
363246849Sjkim     * either an ASL file or a Data Table file
364246849Sjkim     */
365246849Sjkim    Status = FlOpenInputFile (Gbl_Files[ASL_FILE_INPUT].Filename);
366246849Sjkim    if (ACPI_FAILURE (Status))
367246849Sjkim    {
368246849Sjkim        AePrintErrorLog (ASL_FILE_STDERR);
369246849Sjkim        return (AE_ERROR);
370246849Sjkim    }
371246849Sjkim
372246849Sjkim    /* Determine input file type */
373246849Sjkim
374246849Sjkim    Gbl_FileType = AslDetectSourceFileType (&Gbl_Files[ASL_FILE_INPUT]);
375246849Sjkim    if (Gbl_FileType == ASL_INPUT_TYPE_BINARY)
376193267Sjkim    {
377193267Sjkim        return (AE_ERROR);
378193267Sjkim    }
379193267Sjkim
380193267Sjkim    /*
381193267Sjkim     * If -p not specified, we will use the input filename as the
382193267Sjkim     * output filename prefix
383193267Sjkim     */
384193267Sjkim    if (Gbl_UseDefaultAmlFilename)
385193267Sjkim    {
386193267Sjkim        Gbl_OutputFilenamePrefix = Gbl_Files[ASL_FILE_INPUT].Filename;
387193267Sjkim    }
388193267Sjkim
389193267Sjkim    /* Open the optional output files (listings, etc.) */
390193267Sjkim
391193267Sjkim    Status = FlOpenMiscOutputFiles (Gbl_OutputFilenamePrefix);
392193267Sjkim    if (ACPI_FAILURE (Status))
393233250Sjkim    {
394193267Sjkim        AePrintErrorLog (ASL_FILE_STDERR);
395193267Sjkim        return (AE_ERROR);
396233250Sjkim    }
397193267Sjkim
398233250Sjkim    /*
399233250Sjkim     * Compilation of ASL source versus DataTable source uses different
400193267Sjkim     * compiler subsystems
401193267Sjkim     */
402193267Sjkim    switch (Gbl_FileType)
403193267Sjkim    {
404193267Sjkim    /*
405246849Sjkim     * Data Table Compilation
406246849Sjkim     */
407193267Sjkim    case ASL_INPUT_TYPE_ASCII_DATA:
408193267Sjkim
409193267Sjkim        Status = DtDoCompile ();
410193267Sjkim        if (ACPI_FAILURE (Status))
411193267Sjkim        {
412193267Sjkim            return (Status);
413209746Sjkim        }
414209746Sjkim
415193267Sjkim        if (Gbl_Signature)
416209746Sjkim        {
417209746Sjkim            ACPI_FREE (Gbl_Signature);
418193267Sjkim            Gbl_Signature = NULL;
419209746Sjkim        }
420209746Sjkim
421209746Sjkim        /* Check if any errors occurred during compile */
422209746Sjkim
423209746Sjkim        Status = AslCheckForErrorExit ();
424209746Sjkim        if (ACPI_FAILURE (Status))
425209746Sjkim        {
426209746Sjkim            return (Status);
427209746Sjkim        }
428209746Sjkim
429209746Sjkim        /* Cleanup (for next source file) and exit */
430209746Sjkim
431209746Sjkim        AeClearErrorLog ();
432209746Sjkim        PrTerminatePreprocessor ();
433209746Sjkim        return (Status);
434209746Sjkim
435209746Sjkim    /*
436209746Sjkim     * ASL Compilation
437209746Sjkim     */
438209746Sjkim    case ASL_INPUT_TYPE_ASCII_ASL:
439209746Sjkim
440209746Sjkim        /* ACPICA subsystem initialization */
441209746Sjkim
442209746Sjkim        Status = AdInitialize ();
443209746Sjkim        if (ACPI_FAILURE (Status))
444209746Sjkim        {
445209746Sjkim            return (Status);
446209746Sjkim        }
447209746Sjkim
448209746Sjkim        (void) CmDoCompile ();
449209746Sjkim        (void) AcpiTerminate ();
450209746Sjkim
451209746Sjkim        /* Check if any errors occurred during compile */
452209746Sjkim
453209746Sjkim        Status = AslCheckForErrorExit ();
454209746Sjkim        if (ACPI_FAILURE (Status))
455209746Sjkim        {
456209746Sjkim            return (Status);
457209746Sjkim        }
458209746Sjkim
459209746Sjkim        /* Cleanup (for next source file) and exit */
460209746Sjkim
461234623Sjkim        AeClearErrorLog ();
462234623Sjkim        PrTerminatePreprocessor ();
463234623Sjkim        return (AE_OK);
464234623Sjkim
465209746Sjkim    case ASL_INPUT_TYPE_BINARY:
466209746Sjkim
467193267Sjkim        AePrintErrorLog (ASL_FILE_STDERR);
468209746Sjkim        return (AE_ERROR);
469209746Sjkim
470193267Sjkim    default:
471234623Sjkim        printf ("Unknown file type %X\n", Gbl_FileType);
472234623Sjkim        return (AE_ERROR);
473234623Sjkim    }
474234623Sjkim}
475234623Sjkim
476234623Sjkim
477234623Sjkim/*******************************************************************************
478234623Sjkim *
479234623Sjkim * FUNCTION:    AslDoOnePathname
480234623Sjkim *
481234623Sjkim * PARAMETERS:  Pathname            - Full pathname, possibly with wildcards
482209746Sjkim *
483233250Sjkim * RETURN:      Status
484209746Sjkim *
485193267Sjkim * DESCRIPTION: Process one pathname, possible terminated with a wildcard
486209746Sjkim *              specification. If a wildcard, it is expanded and the multiple
487234623Sjkim *              files are processed.
488209746Sjkim *
489209746Sjkim ******************************************************************************/
490193267Sjkim
491209746SjkimACPI_STATUS
492209746SjkimAslDoOnePathname (
493193267Sjkim    char                    *Pathname,
494193267Sjkim    ASL_PATHNAME_CALLBACK   PathCallback)
495193267Sjkim{
496193267Sjkim    ACPI_STATUS             Status = AE_OK;
497193267Sjkim    char                    **WildcardList;
498193267Sjkim    char                    *Filename;
499234623Sjkim    char                    *FullPathname;
500212761Sjkim
501193267Sjkim
502234623Sjkim    /* Split incoming path into a directory/filename combo */
503234623Sjkim
504234623Sjkim    Status = FlSplitInputPathname (Pathname, &Gbl_DirectoryPath, &Filename);
505234623Sjkim    if (ACPI_FAILURE (Status))
506193267Sjkim    {
507234623Sjkim        return (Status);
508193267Sjkim    }
509193267Sjkim
510234623Sjkim    /* Expand possible wildcard into a file list (Windows/DOS only) */
511234623Sjkim
512193267Sjkim    WildcardList = AsDoWildcard (Gbl_DirectoryPath, Filename);
513233250Sjkim    while (*WildcardList)
514209746Sjkim    {
515209746Sjkim        FullPathname = ACPI_ALLOCATE (
516246849Sjkim            strlen (Gbl_DirectoryPath) + strlen (*WildcardList) + 1);
517246849Sjkim
518246849Sjkim        /* Construct a full path to the file */
519246849Sjkim
520246849Sjkim        strcpy (FullPathname, Gbl_DirectoryPath);
521246849Sjkim        strcat (FullPathname, *WildcardList);
522246849Sjkim
523246849Sjkim        /*
524246849Sjkim         * If -p not specified, we will use the input filename as the
525246849Sjkim         * output filename prefix
526246849Sjkim         */
527246849Sjkim        if (Gbl_UseDefaultAmlFilename)
528246849Sjkim        {
529246849Sjkim            Gbl_OutputFilenamePrefix = FullPathname;
530246849Sjkim        }
531209746Sjkim
532209746Sjkim        /* Save status from all compiles */
533209746Sjkim
534209746Sjkim        Status |= (*PathCallback) (FullPathname);
535209746Sjkim
536209746Sjkim        ACPI_FREE (FullPathname);
537209746Sjkim        ACPI_FREE (*WildcardList);
538209746Sjkim        *WildcardList = NULL;
539193267Sjkim        WildcardList++;
540193267Sjkim    }
541193267Sjkim
542193267Sjkim    ACPI_FREE (Gbl_DirectoryPath);
543193267Sjkim    ACPI_FREE (Filename);
544193267Sjkim    return (Status);
545193267Sjkim}
546193267Sjkim
547193267Sjkim
548193267Sjkim/*******************************************************************************
549193267Sjkim *
550193267Sjkim * FUNCTION:    AslCheckForErrorExit
551193267Sjkim *
552193267Sjkim * PARAMETERS:  None. Examines global exception count array
553193267Sjkim *
554193267Sjkim * RETURN:      Status
555193267Sjkim *
556193267Sjkim * DESCRIPTION: Determine if compiler should abort with error status
557193267Sjkim *
558193267Sjkim ******************************************************************************/
559210976Sjkim
560210976SjkimACPI_STATUS
561193267SjkimAslCheckForErrorExit (
562209746Sjkim    void)
563212761Sjkim{
564193267Sjkim
565193267Sjkim    /*
566193267Sjkim     * Return non-zero exit code if there have been errors, unless the
567193267Sjkim     * global ignore error flag has been set
568193267Sjkim     */
569193267Sjkim    if (!Gbl_IgnoreErrors)
570193267Sjkim    {
571193267Sjkim        if (Gbl_ExceptionCount[ASL_ERROR] > 0)
572193267Sjkim        {
573193267Sjkim            return (AE_ERROR);
574193267Sjkim        }
575193267Sjkim
576193267Sjkim        /* Optionally treat warnings as errors */
577193267Sjkim
578212761Sjkim        if (Gbl_WarningsAsErrors)
579212761Sjkim        {
580193267Sjkim            if ((Gbl_ExceptionCount[ASL_WARNING] > 0)  ||
581193267Sjkim                (Gbl_ExceptionCount[ASL_WARNING2] > 0) ||
582212761Sjkim                (Gbl_ExceptionCount[ASL_WARNING3] > 0))
583193267Sjkim            {
584193267Sjkim                return (AE_ERROR);
585193267Sjkim            }
586193267Sjkim        }
587212761Sjkim    }
588193267Sjkim
589193267Sjkim    return (AE_OK);
590193267Sjkim}
591193267Sjkim