asloptions.c revision 281075
1250757Sjkim/******************************************************************************
2250757Sjkim *
3250757Sjkim * Module Name: asloptions - compiler command line processing
4250757Sjkim *
5250757Sjkim *****************************************************************************/
6250757Sjkim
7250757Sjkim/*
8281075Sdim * Copyright (C) 2000 - 2015, Intel Corp.
9250757Sjkim * All rights reserved.
10250757Sjkim *
11250757Sjkim * Redistribution and use in source and binary forms, with or without
12250757Sjkim * modification, are permitted provided that the following conditions
13250757Sjkim * are met:
14250757Sjkim * 1. Redistributions of source code must retain the above copyright
15250757Sjkim *    notice, this list of conditions, and the following disclaimer,
16250757Sjkim *    without modification.
17250757Sjkim * 2. Redistributions in binary form must reproduce at minimum a disclaimer
18250757Sjkim *    substantially similar to the "NO WARRANTY" disclaimer below
19250757Sjkim *    ("Disclaimer") and any redistribution must be conditioned upon
20250757Sjkim *    including a substantially similar Disclaimer requirement for further
21250757Sjkim *    binary redistribution.
22250757Sjkim * 3. Neither the names of the above-listed copyright holders nor the names
23250757Sjkim *    of any contributors may be used to endorse or promote products derived
24250757Sjkim *    from this software without specific prior written permission.
25250757Sjkim *
26250757Sjkim * Alternatively, this software may be distributed under the terms of the
27250757Sjkim * GNU General Public License ("GPL") version 2 as published by the Free
28250757Sjkim * Software Foundation.
29250757Sjkim *
30250757Sjkim * NO WARRANTY
31250757Sjkim * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
32250757Sjkim * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
33250757Sjkim * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
34250757Sjkim * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
35250757Sjkim * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
36250757Sjkim * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
37250757Sjkim * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
38250757Sjkim * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
39250757Sjkim * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
40250757Sjkim * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
41250757Sjkim * POSSIBILITY OF SUCH DAMAGES.
42250757Sjkim */
43250757Sjkim
44250838Sjkim#include <contrib/dev/acpica/compiler/aslcompiler.h>
45250838Sjkim#include <contrib/dev/acpica/include/acapps.h>
46250838Sjkim#include <contrib/dev/acpica/include/acdisasm.h>
47250757Sjkim
48250757Sjkim#define _COMPONENT          ACPI_COMPILER
49250757Sjkim        ACPI_MODULE_NAME    ("asloption")
50250757Sjkim
51250757Sjkim
52250757Sjkim/* Local prototypes */
53250757Sjkim
54250757Sjkimstatic int
55250757SjkimAslDoOptions (
56250757Sjkim    int                     argc,
57250757Sjkim    char                    **argv,
58250757Sjkim    BOOLEAN                 IsResponseFile);
59250757Sjkim
60250757Sjkimstatic void
61250757SjkimAslMergeOptionTokens (
62250757Sjkim    char                    *InBuffer,
63250757Sjkim    char                    *OutBuffer);
64250757Sjkim
65250757Sjkimstatic int
66250757SjkimAslDoResponseFile (
67250757Sjkim    char                    *Filename);
68250757Sjkim
69250757Sjkim
70250757Sjkim#define ASL_TOKEN_SEPARATORS    " \t\n"
71254745Sjkim#define ASL_SUPPORTED_OPTIONS   "@:b|c|d^D:e:f^gh^i|I:l^m:no|p:P^r:s|t|T+G^v^w|x:z"
72250757Sjkim
73250757Sjkim
74250757Sjkim/*******************************************************************************
75250757Sjkim *
76250757Sjkim * FUNCTION:    AslCommandLine
77250757Sjkim *
78250757Sjkim * PARAMETERS:  argc/argv
79250757Sjkim *
80250757Sjkim * RETURN:      Last argv index
81250757Sjkim *
82250757Sjkim * DESCRIPTION: Command line processing
83250757Sjkim *
84250757Sjkim ******************************************************************************/
85250757Sjkim
86250757Sjkimint
87250757SjkimAslCommandLine (
88250757Sjkim    int                     argc,
89250757Sjkim    char                    **argv)
90250757Sjkim{
91250757Sjkim    int                     BadCommandLine = 0;
92250757Sjkim    ACPI_STATUS             Status;
93250757Sjkim
94250757Sjkim
95250757Sjkim    /* Minimum command line contains at least the command and an input file */
96250757Sjkim
97250757Sjkim    if (argc < 2)
98250757Sjkim    {
99250757Sjkim        printf (ACPI_COMMON_SIGNON (ASL_COMPILER_NAME));
100250757Sjkim        Usage ();
101250757Sjkim        exit (1);
102250757Sjkim    }
103250757Sjkim
104250757Sjkim    /* Process all command line options */
105250757Sjkim
106250757Sjkim    BadCommandLine = AslDoOptions (argc, argv, FALSE);
107250757Sjkim
108250757Sjkim    if (Gbl_DoTemplates)
109250757Sjkim    {
110250757Sjkim        Status = DtCreateTemplates (Gbl_TemplateSignature);
111250757Sjkim        if (ACPI_FAILURE (Status))
112250757Sjkim        {
113250757Sjkim            exit (-1);
114250757Sjkim        }
115250757Sjkim        exit (1);
116250757Sjkim    }
117250757Sjkim
118250757Sjkim    /* Next parameter must be the input filename */
119250757Sjkim
120250757Sjkim    if (!argv[AcpiGbl_Optind] &&
121281075Sdim        !Gbl_DisasmFlag)
122250757Sjkim    {
123250757Sjkim        printf ("Missing input filename\n");
124250757Sjkim        BadCommandLine = TRUE;
125250757Sjkim    }
126250757Sjkim
127250757Sjkim    if (Gbl_DoSignon)
128250757Sjkim    {
129250757Sjkim        printf (ACPI_COMMON_SIGNON (ASL_COMPILER_NAME));
130250757Sjkim        if (Gbl_IgnoreErrors)
131250757Sjkim        {
132250757Sjkim            printf ("Ignoring all errors, forcing AML file generation\n\n");
133250757Sjkim        }
134250757Sjkim    }
135250757Sjkim
136250757Sjkim    if (BadCommandLine)
137250757Sjkim    {
138254745Sjkim        printf ("Use -h option for help information\n");
139250757Sjkim        exit (1);
140250757Sjkim    }
141250757Sjkim
142250757Sjkim    return (AcpiGbl_Optind);
143250757Sjkim}
144250757Sjkim
145250757Sjkim
146250757Sjkim/*******************************************************************************
147250757Sjkim *
148250757Sjkim * FUNCTION:    AslDoOptions
149250757Sjkim *
150250757Sjkim * PARAMETERS:  argc/argv           - Standard argc/argv
151250757Sjkim *              IsResponseFile      - TRUE if executing a response file.
152250757Sjkim *
153250757Sjkim * RETURN:      Status
154250757Sjkim *
155250757Sjkim * DESCRIPTION: Command line option processing
156250757Sjkim *
157250757Sjkim ******************************************************************************/
158250757Sjkim
159250757Sjkimstatic int
160250757SjkimAslDoOptions (
161250757Sjkim    int                     argc,
162250757Sjkim    char                    **argv,
163250757Sjkim    BOOLEAN                 IsResponseFile)
164250757Sjkim{
165250757Sjkim    ACPI_STATUS             Status;
166250757Sjkim    UINT32                  j;
167250757Sjkim
168250757Sjkim
169250757Sjkim    /* Get the command line options */
170250757Sjkim
171281075Sdim    while ((j = AcpiGetopt (argc, argv, ASL_SUPPORTED_OPTIONS)) != ACPI_OPT_END) switch (j)
172250757Sjkim    {
173250757Sjkim    case '@':   /* Begin a response file */
174250757Sjkim
175250757Sjkim        if (IsResponseFile)
176250757Sjkim        {
177250757Sjkim            printf ("Nested command files are not supported\n");
178250757Sjkim            return (-1);
179250757Sjkim        }
180250757Sjkim
181250757Sjkim        if (AslDoResponseFile (AcpiGbl_Optarg))
182250757Sjkim        {
183250757Sjkim            return (-1);
184250757Sjkim        }
185250757Sjkim        break;
186250757Sjkim
187281075Sdim    case 'b':   /* Debug options */
188250757Sjkim
189250757Sjkim        switch (AcpiGbl_Optarg[0])
190250757Sjkim        {
191250757Sjkim        case 'f':
192250757Sjkim
193250757Sjkim            AslCompilerdebug = 1; /* same as yydebug */
194250757Sjkim            DtParserdebug = 1;
195250757Sjkim            PrParserdebug = 1;
196281075Sdim            Gbl_DebugFlag = TRUE;
197250757Sjkim            break;
198250757Sjkim
199281075Sdim        case 'p':   /* Prune ASL parse tree */
200281075Sdim
201281075Sdim            /* Get the required argument */
202281075Sdim
203281075Sdim            if (AcpiGetoptArgument (argc, argv))
204281075Sdim            {
205281075Sdim                return (-1);
206281075Sdim            }
207281075Sdim
208281075Sdim            Gbl_PruneParseTree = TRUE;
209281075Sdim            Gbl_PruneDepth = (UINT8) strtoul (AcpiGbl_Optarg, NULL, 0);
210281075Sdim            break;
211281075Sdim
212281075Sdim        case 's':
213281075Sdim
214281075Sdim            Gbl_DebugFlag = TRUE;
215281075Sdim            break;
216281075Sdim
217250757Sjkim        case 't':
218250757Sjkim
219281075Sdim            /* Get the required argument */
220281075Sdim
221281075Sdim            if (AcpiGetoptArgument (argc, argv))
222281075Sdim            {
223281075Sdim                return (-1);
224281075Sdim            }
225281075Sdim
226281075Sdim            Gbl_PruneType = (UINT8) strtoul (AcpiGbl_Optarg, NULL, 0);
227250757Sjkim            break;
228250757Sjkim
229250757Sjkim        default:
230250757Sjkim
231250757Sjkim            printf ("Unknown option: -b%s\n", AcpiGbl_Optarg);
232250757Sjkim            return (-1);
233250757Sjkim        }
234250757Sjkim
235250757Sjkim        break;
236250757Sjkim
237250757Sjkim    case 'c':
238250757Sjkim
239250757Sjkim        switch (AcpiGbl_Optarg[0])
240250757Sjkim        {
241250757Sjkim        case 'r':
242250757Sjkim
243250757Sjkim            Gbl_NoResourceChecking = TRUE;
244250757Sjkim            break;
245250757Sjkim
246250757Sjkim        default:
247250757Sjkim
248250757Sjkim            printf ("Unknown option: -c%s\n", AcpiGbl_Optarg);
249250757Sjkim            return (-1);
250250757Sjkim        }
251250757Sjkim        break;
252250757Sjkim
253250757Sjkim    case 'd':   /* Disassembler */
254250757Sjkim
255250757Sjkim        switch (AcpiGbl_Optarg[0])
256250757Sjkim        {
257250757Sjkim        case '^':
258250757Sjkim
259250757Sjkim            Gbl_DoCompile = FALSE;
260250757Sjkim            break;
261250757Sjkim
262250757Sjkim        case 'a':
263250757Sjkim
264250757Sjkim            Gbl_DoCompile = FALSE;
265250757Sjkim            Gbl_DisassembleAll = TRUE;
266250757Sjkim            break;
267250757Sjkim
268250757Sjkim        case 'b':   /* Do not convert buffers to resource descriptors */
269250757Sjkim
270250757Sjkim            AcpiGbl_NoResourceDisassembly = TRUE;
271250757Sjkim            break;
272250757Sjkim
273250757Sjkim        case 'c':
274250757Sjkim
275250757Sjkim            break;
276250757Sjkim
277281075Sdim        case 'l':   /* Use legacy ASL code (not ASL+) for disassembly */
278281075Sdim
279281075Sdim            Gbl_DoCompile = FALSE;
280281075Sdim            AcpiGbl_CstyleDisassembly = FALSE;
281281075Sdim            break;
282281075Sdim
283250757Sjkim        default:
284250757Sjkim
285250757Sjkim            printf ("Unknown option: -d%s\n", AcpiGbl_Optarg);
286250757Sjkim            return (-1);
287250757Sjkim        }
288250757Sjkim
289250757Sjkim        Gbl_DisasmFlag = TRUE;
290250757Sjkim        break;
291250757Sjkim
292250757Sjkim    case 'D':   /* Define a symbol */
293250757Sjkim
294250757Sjkim        PrAddDefine (AcpiGbl_Optarg, NULL, TRUE);
295250757Sjkim        break;
296250757Sjkim
297250757Sjkim    case 'e':   /* External files for disassembler */
298250757Sjkim
299281075Sdim        /* Get entire list of external files */
300281075Sdim
301281075Sdim        AcpiGbl_Optind--;
302281075Sdim        argv[AcpiGbl_Optind] = AcpiGbl_Optarg;
303281075Sdim
304281075Sdim        while (argv[AcpiGbl_Optind] &&
305281075Sdim              (argv[AcpiGbl_Optind][0] != '-'))
306250757Sjkim        {
307281075Sdim            Status = AcpiDmAddToExternalFileList (argv[AcpiGbl_Optind]);
308281075Sdim            if (ACPI_FAILURE (Status))
309281075Sdim            {
310281075Sdim                printf ("Could not add %s to external list\n", argv[AcpiGbl_Optind]);
311281075Sdim                return (-1);
312281075Sdim            }
313281075Sdim
314281075Sdim            AcpiGbl_Optind++;
315250757Sjkim        }
316250757Sjkim        break;
317250757Sjkim
318254745Sjkim    case 'f':
319250757Sjkim
320254745Sjkim        switch (AcpiGbl_Optarg[0])
321254745Sjkim        {
322254745Sjkim        case '^':   /* Ignore errors and force creation of aml file */
323254745Sjkim
324254745Sjkim            Gbl_IgnoreErrors = TRUE;
325254745Sjkim            break;
326254745Sjkim
327254745Sjkim        case 'e':   /* Disassembler: Get external declaration file */
328254745Sjkim
329254745Sjkim            if (AcpiGetoptArgument (argc, argv))
330254745Sjkim            {
331254745Sjkim                return (-1);
332254745Sjkim            }
333254745Sjkim
334254745Sjkim            Gbl_ExternalRefFilename = AcpiGbl_Optarg;
335254745Sjkim            break;
336254745Sjkim
337254745Sjkim        default:
338254745Sjkim
339254745Sjkim            printf ("Unknown option: -f%s\n", AcpiGbl_Optarg);
340254745Sjkim            return (-1);
341254745Sjkim        }
342250757Sjkim        break;
343250757Sjkim
344250757Sjkim    case 'G':
345250757Sjkim
346250757Sjkim        Gbl_CompileGeneric = TRUE;
347250757Sjkim        break;
348250757Sjkim
349250757Sjkim    case 'g':   /* Get all ACPI tables */
350250757Sjkim
351281075Sdim        printf ("-g option is deprecated, use acpidump utility instead\n");
352281075Sdim        exit (1);
353250757Sjkim
354250757Sjkim    case 'h':
355250757Sjkim
356250757Sjkim        switch (AcpiGbl_Optarg[0])
357250757Sjkim        {
358250757Sjkim        case '^':
359250757Sjkim
360250757Sjkim            Usage ();
361250757Sjkim            exit (0);
362250757Sjkim
363250757Sjkim        case 'c':
364250757Sjkim
365250757Sjkim            UtDisplayConstantOpcodes ();
366250757Sjkim            exit (0);
367250757Sjkim
368250757Sjkim        case 'f':
369250757Sjkim
370250757Sjkim            AslFilenameHelp ();
371250757Sjkim            exit (0);
372250757Sjkim
373250757Sjkim        case 'r':
374250757Sjkim
375250757Sjkim            /* reserved names */
376250757Sjkim
377250757Sjkim            ApDisplayReservedNames ();
378250757Sjkim            exit (0);
379250757Sjkim
380250757Sjkim        case 't':
381250757Sjkim
382250757Sjkim            UtDisplaySupportedTables ();
383250757Sjkim            exit (0);
384250757Sjkim
385250757Sjkim        default:
386250757Sjkim
387250757Sjkim            printf ("Unknown option: -h%s\n", AcpiGbl_Optarg);
388250757Sjkim            return (-1);
389250757Sjkim        }
390250757Sjkim
391250757Sjkim    case 'I':   /* Add an include file search directory */
392250757Sjkim
393250757Sjkim        FlAddIncludeDirectory (AcpiGbl_Optarg);
394250757Sjkim        break;
395250757Sjkim
396250757Sjkim    case 'i':   /* Output AML as an include file */
397250757Sjkim
398250757Sjkim        switch (AcpiGbl_Optarg[0])
399250757Sjkim        {
400250757Sjkim        case 'a':
401250757Sjkim
402250757Sjkim            /* Produce assembly code include file */
403250757Sjkim
404250757Sjkim            Gbl_AsmIncludeOutputFlag = TRUE;
405250757Sjkim            break;
406250757Sjkim
407250757Sjkim        case 'c':
408250757Sjkim
409250757Sjkim            /* Produce C include file */
410250757Sjkim
411250757Sjkim            Gbl_C_IncludeOutputFlag = TRUE;
412250757Sjkim            break;
413250757Sjkim
414250757Sjkim        case 'n':
415250757Sjkim
416250757Sjkim            /* Compiler/Disassembler: Ignore the NOOP operator */
417250757Sjkim
418250757Sjkim            AcpiGbl_IgnoreNoopOperator = TRUE;
419250757Sjkim            break;
420250757Sjkim
421250757Sjkim        default:
422250757Sjkim
423250757Sjkim            printf ("Unknown option: -i%s\n", AcpiGbl_Optarg);
424250757Sjkim            return (-1);
425250757Sjkim        }
426250757Sjkim        break;
427250757Sjkim
428250757Sjkim    case 'l':   /* Listing files */
429250757Sjkim
430250757Sjkim        switch (AcpiGbl_Optarg[0])
431250757Sjkim        {
432250757Sjkim        case '^':
433250757Sjkim
434250757Sjkim            /* Produce listing file (Mixed source/aml) */
435250757Sjkim
436250757Sjkim            Gbl_ListingFlag = TRUE;
437250757Sjkim            break;
438250757Sjkim
439250757Sjkim        case 'i':
440250757Sjkim
441250757Sjkim            /* Produce preprocessor output file */
442250757Sjkim
443250757Sjkim            Gbl_PreprocessorOutputFlag = TRUE;
444250757Sjkim            break;
445250757Sjkim
446281075Sdim        case 'm':
447281075Sdim
448281075Sdim            /* Produce hardware map summary file */
449281075Sdim
450281075Sdim            Gbl_MapfileFlag = TRUE;
451281075Sdim            break;
452281075Sdim
453250757Sjkim        case 'n':
454250757Sjkim
455250757Sjkim            /* Produce namespace file */
456250757Sjkim
457250757Sjkim            Gbl_NsOutputFlag = TRUE;
458250757Sjkim            break;
459250757Sjkim
460250757Sjkim        case 's':
461250757Sjkim
462250757Sjkim            /* Produce combined source file */
463250757Sjkim
464250757Sjkim            Gbl_SourceOutputFlag = TRUE;
465250757Sjkim            break;
466250757Sjkim
467250757Sjkim        default:
468250757Sjkim
469250757Sjkim            printf ("Unknown option: -l%s\n", AcpiGbl_Optarg);
470250757Sjkim            return (-1);
471250757Sjkim        }
472250757Sjkim        break;
473250757Sjkim
474250757Sjkim    case 'm':   /* Set line buffer size */
475250757Sjkim
476250757Sjkim        Gbl_LineBufferSize = (UINT32) strtoul (AcpiGbl_Optarg, NULL, 0) * 1024;
477250757Sjkim        if (Gbl_LineBufferSize < ASL_DEFAULT_LINE_BUFFER_SIZE)
478250757Sjkim        {
479250757Sjkim            Gbl_LineBufferSize = ASL_DEFAULT_LINE_BUFFER_SIZE;
480250757Sjkim        }
481250757Sjkim        printf ("Line Buffer Size: %u\n", Gbl_LineBufferSize);
482250757Sjkim        break;
483250757Sjkim
484250757Sjkim    case 'n':   /* Parse only */
485250757Sjkim
486250757Sjkim        Gbl_ParseOnlyFlag = TRUE;
487250757Sjkim        break;
488250757Sjkim
489250757Sjkim    case 'o':   /* Control compiler AML optimizations */
490250757Sjkim
491250757Sjkim        switch (AcpiGbl_Optarg[0])
492250757Sjkim        {
493250757Sjkim        case 'a':
494250757Sjkim
495250757Sjkim            /* Disable all optimizations */
496250757Sjkim
497250757Sjkim            Gbl_FoldConstants = FALSE;
498250757Sjkim            Gbl_IntegerOptimizationFlag = FALSE;
499250757Sjkim            Gbl_ReferenceOptimizationFlag = FALSE;
500250757Sjkim            break;
501250757Sjkim
502250757Sjkim        case 'f':
503250757Sjkim
504250757Sjkim            /* Disable folding on "normal" expressions */
505250757Sjkim
506250757Sjkim            Gbl_FoldConstants = FALSE;
507250757Sjkim            break;
508250757Sjkim
509250757Sjkim        case 'i':
510250757Sjkim
511250757Sjkim            /* Disable integer optimization to constants */
512250757Sjkim
513250757Sjkim            Gbl_IntegerOptimizationFlag = FALSE;
514250757Sjkim            break;
515250757Sjkim
516250757Sjkim        case 'n':
517250757Sjkim
518250757Sjkim            /* Disable named reference optimization */
519250757Sjkim
520250757Sjkim            Gbl_ReferenceOptimizationFlag = FALSE;
521250757Sjkim            break;
522250757Sjkim
523250757Sjkim        case 't':
524250757Sjkim
525250757Sjkim            /* Display compile time(s) */
526250757Sjkim
527250757Sjkim            Gbl_CompileTimesFlag = TRUE;
528250757Sjkim            break;
529250757Sjkim
530250757Sjkim        default:
531250757Sjkim
532250757Sjkim            printf ("Unknown option: -c%s\n", AcpiGbl_Optarg);
533250757Sjkim            return (-1);
534250757Sjkim        }
535250757Sjkim        break;
536250757Sjkim
537250757Sjkim    case 'P':   /* Preprocessor options */
538250757Sjkim
539250757Sjkim        switch (AcpiGbl_Optarg[0])
540250757Sjkim        {
541250757Sjkim        case '^':   /* Proprocess only, emit (.i) file */
542250757Sjkim
543250757Sjkim            Gbl_PreprocessOnly = TRUE;
544250757Sjkim            Gbl_PreprocessorOutputFlag = TRUE;
545250757Sjkim            break;
546250757Sjkim
547250757Sjkim        case 'n':   /* Disable preprocessor */
548250757Sjkim
549250757Sjkim            Gbl_PreprocessFlag = FALSE;
550250757Sjkim            break;
551250757Sjkim
552250757Sjkim        default:
553250757Sjkim
554250757Sjkim            printf ("Unknown option: -P%s\n", AcpiGbl_Optarg);
555250757Sjkim            return (-1);
556250757Sjkim        }
557250757Sjkim        break;
558250757Sjkim
559250757Sjkim    case 'p':   /* Override default AML output filename */
560250757Sjkim
561250757Sjkim        Gbl_OutputFilenamePrefix = AcpiGbl_Optarg;
562281075Sdim        UtConvertBackslashes (Gbl_OutputFilenamePrefix);
563250757Sjkim        Gbl_UseDefaultAmlFilename = FALSE;
564250757Sjkim        break;
565250757Sjkim
566250757Sjkim    case 'r':   /* Override revision found in table header */
567250757Sjkim
568250757Sjkim        Gbl_RevisionOverride = (UINT8) strtoul (AcpiGbl_Optarg, NULL, 0);
569250757Sjkim        break;
570250757Sjkim
571250757Sjkim    case 's':   /* Create AML in a source code file */
572250757Sjkim
573250757Sjkim        switch (AcpiGbl_Optarg[0])
574250757Sjkim        {
575250757Sjkim        case 'a':
576250757Sjkim
577250757Sjkim            /* Produce assembly code output file */
578250757Sjkim
579250757Sjkim            Gbl_AsmOutputFlag = TRUE;
580250757Sjkim            break;
581250757Sjkim
582250757Sjkim        case 'c':
583250757Sjkim
584250757Sjkim            /* Produce C hex output file */
585250757Sjkim
586250757Sjkim            Gbl_C_OutputFlag = TRUE;
587250757Sjkim            break;
588250757Sjkim
589250757Sjkim        case 'o':
590250757Sjkim
591250757Sjkim            /* Produce AML offset table in C */
592250757Sjkim
593250757Sjkim            Gbl_C_OffsetTableFlag = TRUE;
594250757Sjkim            break;
595250757Sjkim
596250757Sjkim        default:
597250757Sjkim
598250757Sjkim            printf ("Unknown option: -s%s\n", AcpiGbl_Optarg);
599250757Sjkim            return (-1);
600250757Sjkim        }
601250757Sjkim        break;
602250757Sjkim
603250757Sjkim    case 't':   /* Produce hex table output file */
604250757Sjkim
605250757Sjkim        switch (AcpiGbl_Optarg[0])
606250757Sjkim        {
607250757Sjkim        case 'a':
608250757Sjkim
609250757Sjkim            Gbl_HexOutputFlag = HEX_OUTPUT_ASM;
610250757Sjkim            break;
611250757Sjkim
612250757Sjkim        case 'c':
613250757Sjkim
614250757Sjkim            Gbl_HexOutputFlag = HEX_OUTPUT_C;
615250757Sjkim            break;
616250757Sjkim
617250757Sjkim        case 's':
618250757Sjkim
619250757Sjkim            Gbl_HexOutputFlag = HEX_OUTPUT_ASL;
620250757Sjkim            break;
621250757Sjkim
622250757Sjkim        default:
623250757Sjkim
624250757Sjkim            printf ("Unknown option: -t%s\n", AcpiGbl_Optarg);
625250757Sjkim            return (-1);
626250757Sjkim        }
627250757Sjkim        break;
628250757Sjkim
629250757Sjkim    case 'T':   /* Create a ACPI table template file */
630250757Sjkim
631250757Sjkim        Gbl_DoTemplates = TRUE;
632250757Sjkim        Gbl_TemplateSignature = AcpiGbl_Optarg;
633250757Sjkim        break;
634250757Sjkim
635250757Sjkim    case 'v':   /* Version and verbosity settings */
636250757Sjkim
637250757Sjkim        switch (AcpiGbl_Optarg[0])
638250757Sjkim        {
639250757Sjkim        case '^':
640250757Sjkim
641250757Sjkim            printf (ACPI_COMMON_SIGNON (ASL_COMPILER_NAME));
642250757Sjkim            exit (0);
643250757Sjkim
644250757Sjkim        case 'a':
645250757Sjkim
646281075Sdim            /* Disable all error/warning/remark messages */
647250757Sjkim
648250757Sjkim            Gbl_NoErrors = TRUE;
649250757Sjkim            break;
650250757Sjkim
651281075Sdim        case 'e':
652281075Sdim
653281075Sdim            /* Disable all warning/remark messages (errors only) */
654281075Sdim
655281075Sdim            Gbl_DisplayRemarks = FALSE;
656281075Sdim            Gbl_DisplayWarnings = FALSE;
657281075Sdim            break;
658281075Sdim
659250757Sjkim        case 'i':
660250757Sjkim            /*
661250757Sjkim             * Support for integrated development environment(s).
662250757Sjkim             *
663250757Sjkim             * 1) No compiler signon
664250757Sjkim             * 2) Send stderr messages to stdout
665250757Sjkim             * 3) Less verbose error messages (single line only for each)
666250757Sjkim             * 4) Error/warning messages are formatted appropriately to
667250757Sjkim             *    be recognized by MS Visual Studio
668250757Sjkim             */
669250757Sjkim            Gbl_VerboseErrors = FALSE;
670250757Sjkim            Gbl_DoSignon = FALSE;
671250757Sjkim            Gbl_Files[ASL_FILE_STDERR].Handle = stdout;
672250757Sjkim            break;
673250757Sjkim
674250757Sjkim        case 'o':
675250757Sjkim
676250757Sjkim            Gbl_DisplayOptimizations = TRUE;
677250757Sjkim            break;
678250757Sjkim
679250757Sjkim        case 'r':
680250757Sjkim
681250757Sjkim            Gbl_DisplayRemarks = FALSE;
682250757Sjkim            break;
683250757Sjkim
684250757Sjkim        case 's':
685250757Sjkim
686250757Sjkim            Gbl_DoSignon = FALSE;
687250757Sjkim            break;
688250757Sjkim
689250757Sjkim        case 't':
690250757Sjkim
691250757Sjkim            Gbl_VerboseTemplates = TRUE;
692250757Sjkim            break;
693250757Sjkim
694250757Sjkim        case 'w':
695250757Sjkim
696250757Sjkim            /* Get the required argument */
697250757Sjkim
698250757Sjkim            if (AcpiGetoptArgument (argc, argv))
699250757Sjkim            {
700250757Sjkim                return (-1);
701250757Sjkim            }
702250757Sjkim
703250757Sjkim            Status = AslDisableException (AcpiGbl_Optarg);
704250757Sjkim            if (ACPI_FAILURE (Status))
705250757Sjkim            {
706250757Sjkim                return (-1);
707250757Sjkim            }
708250757Sjkim            break;
709250757Sjkim
710250757Sjkim        default:
711250757Sjkim
712250757Sjkim            printf ("Unknown option: -v%s\n", AcpiGbl_Optarg);
713250757Sjkim            return (-1);
714250757Sjkim        }
715250757Sjkim        break;
716250757Sjkim
717250757Sjkim    case 'w': /* Set warning levels */
718250757Sjkim
719250757Sjkim        switch (AcpiGbl_Optarg[0])
720250757Sjkim        {
721250757Sjkim        case '1':
722250757Sjkim
723250757Sjkim            Gbl_WarningLevel = ASL_WARNING;
724250757Sjkim            break;
725250757Sjkim
726250757Sjkim        case '2':
727250757Sjkim
728250757Sjkim            Gbl_WarningLevel = ASL_WARNING2;
729250757Sjkim            break;
730250757Sjkim
731250757Sjkim        case '3':
732250757Sjkim
733250757Sjkim            Gbl_WarningLevel = ASL_WARNING3;
734250757Sjkim            break;
735250757Sjkim
736250757Sjkim        case 'e':
737250757Sjkim
738250757Sjkim            Gbl_WarningsAsErrors = TRUE;
739250757Sjkim            break;
740250757Sjkim
741250757Sjkim        default:
742250757Sjkim
743250757Sjkim            printf ("Unknown option: -w%s\n", AcpiGbl_Optarg);
744250757Sjkim            return (-1);
745250757Sjkim        }
746250757Sjkim        break;
747250757Sjkim
748250757Sjkim    case 'x':   /* Set debug print output level */
749250757Sjkim
750250757Sjkim        AcpiDbgLevel = strtoul (AcpiGbl_Optarg, NULL, 16);
751250757Sjkim        break;
752250757Sjkim
753250757Sjkim    case 'z':
754250757Sjkim
755250757Sjkim        Gbl_UseOriginalCompilerId = TRUE;
756250757Sjkim        break;
757250757Sjkim
758250757Sjkim    default:
759250757Sjkim
760250757Sjkim        return (-1);
761250757Sjkim    }
762250757Sjkim
763250757Sjkim    return (0);
764250757Sjkim}
765250757Sjkim
766250757Sjkim
767250757Sjkim/*******************************************************************************
768250757Sjkim *
769250757Sjkim * FUNCTION:    AslMergeOptionTokens
770250757Sjkim *
771250757Sjkim * PARAMETERS:  InBuffer            - Input containing an option string
772250757Sjkim *              OutBuffer           - Merged output buffer
773250757Sjkim *
774250757Sjkim * RETURN:      None
775250757Sjkim *
776250757Sjkim * DESCRIPTION: Remove all whitespace from an option string.
777250757Sjkim *
778250757Sjkim ******************************************************************************/
779250757Sjkim
780250757Sjkimstatic void
781250757SjkimAslMergeOptionTokens (
782250757Sjkim    char                    *InBuffer,
783250757Sjkim    char                    *OutBuffer)
784250757Sjkim{
785250757Sjkim    char                    *Token;
786250757Sjkim
787250757Sjkim
788250757Sjkim    *OutBuffer = 0;
789250757Sjkim
790250757Sjkim    Token = strtok (InBuffer, ASL_TOKEN_SEPARATORS);
791250757Sjkim    while (Token)
792250757Sjkim    {
793250757Sjkim        strcat (OutBuffer, Token);
794250757Sjkim        Token = strtok (NULL, ASL_TOKEN_SEPARATORS);
795250757Sjkim    }
796250757Sjkim}
797250757Sjkim
798250757Sjkim
799250757Sjkim/*******************************************************************************
800250757Sjkim *
801250757Sjkim * FUNCTION:    AslDoResponseFile
802250757Sjkim *
803250757Sjkim * PARAMETERS:  Filename        - Name of the response file
804250757Sjkim *
805250757Sjkim * RETURN:      Status
806250757Sjkim *
807250757Sjkim * DESCRIPTION: Open a response file and process all options within.
808250757Sjkim *
809250757Sjkim ******************************************************************************/
810250757Sjkim
811250757Sjkimstatic int
812250757SjkimAslDoResponseFile (
813250757Sjkim    char                    *Filename)
814250757Sjkim{
815250757Sjkim    char                    *argv = StringBuffer2;
816250757Sjkim    FILE                    *ResponseFile;
817250757Sjkim    int                     OptStatus = 0;
818250757Sjkim    int                     Opterr;
819250757Sjkim    int                     Optind;
820250757Sjkim
821250757Sjkim
822250757Sjkim    ResponseFile = fopen (Filename, "r");
823250757Sjkim    if (!ResponseFile)
824250757Sjkim    {
825250757Sjkim        printf ("Could not open command file %s, %s\n",
826250757Sjkim            Filename, strerror (errno));
827250757Sjkim        return (-1);
828250757Sjkim    }
829250757Sjkim
830250757Sjkim    /* Must save the current GetOpt globals */
831250757Sjkim
832250757Sjkim    Opterr = AcpiGbl_Opterr;
833250757Sjkim    Optind = AcpiGbl_Optind;
834250757Sjkim
835250757Sjkim    /*
836250757Sjkim     * Process all lines in the response file. There must be one complete
837250757Sjkim     * option per line
838250757Sjkim     */
839250757Sjkim    while (fgets (StringBuffer, ASL_MSG_BUFFER_SIZE, ResponseFile))
840250757Sjkim    {
841250757Sjkim        /* Compress all tokens, allowing us to use a single argv entry */
842250757Sjkim
843250757Sjkim        AslMergeOptionTokens (StringBuffer, StringBuffer2);
844250757Sjkim
845250757Sjkim        /* Process the option */
846250757Sjkim
847250757Sjkim        AcpiGbl_Opterr = 0;
848250757Sjkim        AcpiGbl_Optind = 0;
849250757Sjkim
850250757Sjkim        OptStatus = AslDoOptions (1, &argv, TRUE);
851250757Sjkim        if (OptStatus)
852250757Sjkim        {
853250757Sjkim            printf ("Invalid option in command file %s: %s\n",
854250757Sjkim                Filename, StringBuffer);
855250757Sjkim            break;
856250757Sjkim        }
857250757Sjkim    }
858250757Sjkim
859250757Sjkim    /* Restore the GetOpt globals */
860250757Sjkim
861250757Sjkim    AcpiGbl_Opterr = Opterr;
862250757Sjkim    AcpiGbl_Optind = Optind;
863250757Sjkim
864250757Sjkim    fclose (ResponseFile);
865250757Sjkim    return (OptStatus);
866250757Sjkim}
867