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
277281687Sjkim        case 'f':
278281687Sjkim
279281687Sjkim            AcpiGbl_ForceAmlDisassembly = TRUE;
280281687Sjkim            break;
281281687Sjkim
282281075Sdim        case 'l':   /* Use legacy ASL code (not ASL+) for disassembly */
283281075Sdim
284281075Sdim            Gbl_DoCompile = FALSE;
285281075Sdim            AcpiGbl_CstyleDisassembly = FALSE;
286281075Sdim            break;
287281075Sdim
288250757Sjkim        default:
289250757Sjkim
290250757Sjkim            printf ("Unknown option: -d%s\n", AcpiGbl_Optarg);
291250757Sjkim            return (-1);
292250757Sjkim        }
293250757Sjkim
294250757Sjkim        Gbl_DisasmFlag = TRUE;
295250757Sjkim        break;
296250757Sjkim
297250757Sjkim    case 'D':   /* Define a symbol */
298250757Sjkim
299250757Sjkim        PrAddDefine (AcpiGbl_Optarg, NULL, TRUE);
300250757Sjkim        break;
301250757Sjkim
302250757Sjkim    case 'e':   /* External files for disassembler */
303250757Sjkim
304281075Sdim        /* Get entire list of external files */
305281075Sdim
306281075Sdim        AcpiGbl_Optind--;
307281075Sdim        argv[AcpiGbl_Optind] = AcpiGbl_Optarg;
308281075Sdim
309281075Sdim        while (argv[AcpiGbl_Optind] &&
310281075Sdim              (argv[AcpiGbl_Optind][0] != '-'))
311250757Sjkim        {
312281075Sdim            Status = AcpiDmAddToExternalFileList (argv[AcpiGbl_Optind]);
313281075Sdim            if (ACPI_FAILURE (Status))
314281075Sdim            {
315281075Sdim                printf ("Could not add %s to external list\n", argv[AcpiGbl_Optind]);
316281075Sdim                return (-1);
317281075Sdim            }
318281075Sdim
319281075Sdim            AcpiGbl_Optind++;
320250757Sjkim        }
321250757Sjkim        break;
322250757Sjkim
323254745Sjkim    case 'f':
324250757Sjkim
325254745Sjkim        switch (AcpiGbl_Optarg[0])
326254745Sjkim        {
327254745Sjkim        case '^':   /* Ignore errors and force creation of aml file */
328254745Sjkim
329254745Sjkim            Gbl_IgnoreErrors = TRUE;
330254745Sjkim            break;
331254745Sjkim
332254745Sjkim        case 'e':   /* Disassembler: Get external declaration file */
333254745Sjkim
334254745Sjkim            if (AcpiGetoptArgument (argc, argv))
335254745Sjkim            {
336254745Sjkim                return (-1);
337254745Sjkim            }
338254745Sjkim
339254745Sjkim            Gbl_ExternalRefFilename = AcpiGbl_Optarg;
340254745Sjkim            break;
341254745Sjkim
342254745Sjkim        default:
343254745Sjkim
344254745Sjkim            printf ("Unknown option: -f%s\n", AcpiGbl_Optarg);
345254745Sjkim            return (-1);
346254745Sjkim        }
347250757Sjkim        break;
348250757Sjkim
349250757Sjkim    case 'G':
350250757Sjkim
351250757Sjkim        Gbl_CompileGeneric = TRUE;
352250757Sjkim        break;
353250757Sjkim
354250757Sjkim    case 'g':   /* Get all ACPI tables */
355250757Sjkim
356281075Sdim        printf ("-g option is deprecated, use acpidump utility instead\n");
357281075Sdim        exit (1);
358250757Sjkim
359250757Sjkim    case 'h':
360250757Sjkim
361250757Sjkim        switch (AcpiGbl_Optarg[0])
362250757Sjkim        {
363250757Sjkim        case '^':
364250757Sjkim
365250757Sjkim            Usage ();
366250757Sjkim            exit (0);
367250757Sjkim
368250757Sjkim        case 'c':
369250757Sjkim
370250757Sjkim            UtDisplayConstantOpcodes ();
371250757Sjkim            exit (0);
372250757Sjkim
373250757Sjkim        case 'f':
374250757Sjkim
375250757Sjkim            AslFilenameHelp ();
376250757Sjkim            exit (0);
377250757Sjkim
378250757Sjkim        case 'r':
379250757Sjkim
380250757Sjkim            /* reserved names */
381250757Sjkim
382250757Sjkim            ApDisplayReservedNames ();
383250757Sjkim            exit (0);
384250757Sjkim
385250757Sjkim        case 't':
386250757Sjkim
387250757Sjkim            UtDisplaySupportedTables ();
388250757Sjkim            exit (0);
389250757Sjkim
390250757Sjkim        default:
391250757Sjkim
392250757Sjkim            printf ("Unknown option: -h%s\n", AcpiGbl_Optarg);
393250757Sjkim            return (-1);
394250757Sjkim        }
395250757Sjkim
396250757Sjkim    case 'I':   /* Add an include file search directory */
397250757Sjkim
398250757Sjkim        FlAddIncludeDirectory (AcpiGbl_Optarg);
399250757Sjkim        break;
400250757Sjkim
401250757Sjkim    case 'i':   /* Output AML as an include file */
402250757Sjkim
403250757Sjkim        switch (AcpiGbl_Optarg[0])
404250757Sjkim        {
405250757Sjkim        case 'a':
406250757Sjkim
407250757Sjkim            /* Produce assembly code include file */
408250757Sjkim
409250757Sjkim            Gbl_AsmIncludeOutputFlag = TRUE;
410250757Sjkim            break;
411250757Sjkim
412250757Sjkim        case 'c':
413250757Sjkim
414250757Sjkim            /* Produce C include file */
415250757Sjkim
416250757Sjkim            Gbl_C_IncludeOutputFlag = TRUE;
417250757Sjkim            break;
418250757Sjkim
419250757Sjkim        case 'n':
420250757Sjkim
421250757Sjkim            /* Compiler/Disassembler: Ignore the NOOP operator */
422250757Sjkim
423250757Sjkim            AcpiGbl_IgnoreNoopOperator = TRUE;
424250757Sjkim            break;
425250757Sjkim
426250757Sjkim        default:
427250757Sjkim
428250757Sjkim            printf ("Unknown option: -i%s\n", AcpiGbl_Optarg);
429250757Sjkim            return (-1);
430250757Sjkim        }
431250757Sjkim        break;
432250757Sjkim
433250757Sjkim    case 'l':   /* Listing files */
434250757Sjkim
435250757Sjkim        switch (AcpiGbl_Optarg[0])
436250757Sjkim        {
437250757Sjkim        case '^':
438250757Sjkim
439250757Sjkim            /* Produce listing file (Mixed source/aml) */
440250757Sjkim
441250757Sjkim            Gbl_ListingFlag = TRUE;
442250757Sjkim            break;
443250757Sjkim
444250757Sjkim        case 'i':
445250757Sjkim
446250757Sjkim            /* Produce preprocessor output file */
447250757Sjkim
448250757Sjkim            Gbl_PreprocessorOutputFlag = TRUE;
449250757Sjkim            break;
450250757Sjkim
451281075Sdim        case 'm':
452281075Sdim
453281075Sdim            /* Produce hardware map summary file */
454281075Sdim
455281075Sdim            Gbl_MapfileFlag = TRUE;
456281075Sdim            break;
457281075Sdim
458250757Sjkim        case 'n':
459250757Sjkim
460250757Sjkim            /* Produce namespace file */
461250757Sjkim
462250757Sjkim            Gbl_NsOutputFlag = TRUE;
463250757Sjkim            break;
464250757Sjkim
465250757Sjkim        case 's':
466250757Sjkim
467250757Sjkim            /* Produce combined source file */
468250757Sjkim
469250757Sjkim            Gbl_SourceOutputFlag = TRUE;
470250757Sjkim            break;
471250757Sjkim
472250757Sjkim        default:
473250757Sjkim
474250757Sjkim            printf ("Unknown option: -l%s\n", AcpiGbl_Optarg);
475250757Sjkim            return (-1);
476250757Sjkim        }
477250757Sjkim        break;
478250757Sjkim
479250757Sjkim    case 'm':   /* Set line buffer size */
480250757Sjkim
481250757Sjkim        Gbl_LineBufferSize = (UINT32) strtoul (AcpiGbl_Optarg, NULL, 0) * 1024;
482250757Sjkim        if (Gbl_LineBufferSize < ASL_DEFAULT_LINE_BUFFER_SIZE)
483250757Sjkim        {
484250757Sjkim            Gbl_LineBufferSize = ASL_DEFAULT_LINE_BUFFER_SIZE;
485250757Sjkim        }
486250757Sjkim        printf ("Line Buffer Size: %u\n", Gbl_LineBufferSize);
487250757Sjkim        break;
488250757Sjkim
489250757Sjkim    case 'n':   /* Parse only */
490250757Sjkim
491250757Sjkim        Gbl_ParseOnlyFlag = TRUE;
492250757Sjkim        break;
493250757Sjkim
494250757Sjkim    case 'o':   /* Control compiler AML optimizations */
495250757Sjkim
496250757Sjkim        switch (AcpiGbl_Optarg[0])
497250757Sjkim        {
498250757Sjkim        case 'a':
499250757Sjkim
500250757Sjkim            /* Disable all optimizations */
501250757Sjkim
502250757Sjkim            Gbl_FoldConstants = FALSE;
503250757Sjkim            Gbl_IntegerOptimizationFlag = FALSE;
504250757Sjkim            Gbl_ReferenceOptimizationFlag = FALSE;
505250757Sjkim            break;
506250757Sjkim
507250757Sjkim        case 'f':
508250757Sjkim
509250757Sjkim            /* Disable folding on "normal" expressions */
510250757Sjkim
511250757Sjkim            Gbl_FoldConstants = FALSE;
512250757Sjkim            break;
513250757Sjkim
514250757Sjkim        case 'i':
515250757Sjkim
516250757Sjkim            /* Disable integer optimization to constants */
517250757Sjkim
518250757Sjkim            Gbl_IntegerOptimizationFlag = FALSE;
519250757Sjkim            break;
520250757Sjkim
521250757Sjkim        case 'n':
522250757Sjkim
523250757Sjkim            /* Disable named reference optimization */
524250757Sjkim
525250757Sjkim            Gbl_ReferenceOptimizationFlag = FALSE;
526250757Sjkim            break;
527250757Sjkim
528250757Sjkim        case 't':
529250757Sjkim
530250757Sjkim            /* Display compile time(s) */
531250757Sjkim
532250757Sjkim            Gbl_CompileTimesFlag = TRUE;
533250757Sjkim            break;
534250757Sjkim
535250757Sjkim        default:
536250757Sjkim
537250757Sjkim            printf ("Unknown option: -c%s\n", AcpiGbl_Optarg);
538250757Sjkim            return (-1);
539250757Sjkim        }
540250757Sjkim        break;
541250757Sjkim
542250757Sjkim    case 'P':   /* Preprocessor options */
543250757Sjkim
544250757Sjkim        switch (AcpiGbl_Optarg[0])
545250757Sjkim        {
546250757Sjkim        case '^':   /* Proprocess only, emit (.i) file */
547250757Sjkim
548250757Sjkim            Gbl_PreprocessOnly = TRUE;
549250757Sjkim            Gbl_PreprocessorOutputFlag = TRUE;
550250757Sjkim            break;
551250757Sjkim
552250757Sjkim        case 'n':   /* Disable preprocessor */
553250757Sjkim
554250757Sjkim            Gbl_PreprocessFlag = FALSE;
555250757Sjkim            break;
556250757Sjkim
557250757Sjkim        default:
558250757Sjkim
559250757Sjkim            printf ("Unknown option: -P%s\n", AcpiGbl_Optarg);
560250757Sjkim            return (-1);
561250757Sjkim        }
562250757Sjkim        break;
563250757Sjkim
564250757Sjkim    case 'p':   /* Override default AML output filename */
565250757Sjkim
566250757Sjkim        Gbl_OutputFilenamePrefix = AcpiGbl_Optarg;
567281075Sdim        UtConvertBackslashes (Gbl_OutputFilenamePrefix);
568250757Sjkim        Gbl_UseDefaultAmlFilename = FALSE;
569250757Sjkim        break;
570250757Sjkim
571250757Sjkim    case 'r':   /* Override revision found in table header */
572250757Sjkim
573250757Sjkim        Gbl_RevisionOverride = (UINT8) strtoul (AcpiGbl_Optarg, NULL, 0);
574250757Sjkim        break;
575250757Sjkim
576250757Sjkim    case 's':   /* Create AML in a source code file */
577250757Sjkim
578250757Sjkim        switch (AcpiGbl_Optarg[0])
579250757Sjkim        {
580250757Sjkim        case 'a':
581250757Sjkim
582250757Sjkim            /* Produce assembly code output file */
583250757Sjkim
584250757Sjkim            Gbl_AsmOutputFlag = TRUE;
585250757Sjkim            break;
586250757Sjkim
587250757Sjkim        case 'c':
588250757Sjkim
589250757Sjkim            /* Produce C hex output file */
590250757Sjkim
591250757Sjkim            Gbl_C_OutputFlag = TRUE;
592250757Sjkim            break;
593250757Sjkim
594250757Sjkim        case 'o':
595250757Sjkim
596250757Sjkim            /* Produce AML offset table in C */
597250757Sjkim
598250757Sjkim            Gbl_C_OffsetTableFlag = TRUE;
599250757Sjkim            break;
600250757Sjkim
601250757Sjkim        default:
602250757Sjkim
603250757Sjkim            printf ("Unknown option: -s%s\n", AcpiGbl_Optarg);
604250757Sjkim            return (-1);
605250757Sjkim        }
606250757Sjkim        break;
607250757Sjkim
608250757Sjkim    case 't':   /* Produce hex table output file */
609250757Sjkim
610250757Sjkim        switch (AcpiGbl_Optarg[0])
611250757Sjkim        {
612250757Sjkim        case 'a':
613250757Sjkim
614250757Sjkim            Gbl_HexOutputFlag = HEX_OUTPUT_ASM;
615250757Sjkim            break;
616250757Sjkim
617250757Sjkim        case 'c':
618250757Sjkim
619250757Sjkim            Gbl_HexOutputFlag = HEX_OUTPUT_C;
620250757Sjkim            break;
621250757Sjkim
622250757Sjkim        case 's':
623250757Sjkim
624250757Sjkim            Gbl_HexOutputFlag = HEX_OUTPUT_ASL;
625250757Sjkim            break;
626250757Sjkim
627250757Sjkim        default:
628250757Sjkim
629250757Sjkim            printf ("Unknown option: -t%s\n", AcpiGbl_Optarg);
630250757Sjkim            return (-1);
631250757Sjkim        }
632250757Sjkim        break;
633250757Sjkim
634250757Sjkim    case 'T':   /* Create a ACPI table template file */
635250757Sjkim
636250757Sjkim        Gbl_DoTemplates = TRUE;
637250757Sjkim        Gbl_TemplateSignature = AcpiGbl_Optarg;
638250757Sjkim        break;
639250757Sjkim
640250757Sjkim    case 'v':   /* Version and verbosity settings */
641250757Sjkim
642250757Sjkim        switch (AcpiGbl_Optarg[0])
643250757Sjkim        {
644250757Sjkim        case '^':
645250757Sjkim
646250757Sjkim            printf (ACPI_COMMON_SIGNON (ASL_COMPILER_NAME));
647250757Sjkim            exit (0);
648250757Sjkim
649250757Sjkim        case 'a':
650250757Sjkim
651281075Sdim            /* Disable all error/warning/remark messages */
652250757Sjkim
653250757Sjkim            Gbl_NoErrors = TRUE;
654250757Sjkim            break;
655250757Sjkim
656281075Sdim        case 'e':
657281075Sdim
658281075Sdim            /* Disable all warning/remark messages (errors only) */
659281075Sdim
660281075Sdim            Gbl_DisplayRemarks = FALSE;
661281075Sdim            Gbl_DisplayWarnings = FALSE;
662281075Sdim            break;
663281075Sdim
664250757Sjkim        case 'i':
665250757Sjkim            /*
666250757Sjkim             * Support for integrated development environment(s).
667250757Sjkim             *
668250757Sjkim             * 1) No compiler signon
669250757Sjkim             * 2) Send stderr messages to stdout
670250757Sjkim             * 3) Less verbose error messages (single line only for each)
671250757Sjkim             * 4) Error/warning messages are formatted appropriately to
672250757Sjkim             *    be recognized by MS Visual Studio
673250757Sjkim             */
674250757Sjkim            Gbl_VerboseErrors = FALSE;
675250757Sjkim            Gbl_DoSignon = FALSE;
676250757Sjkim            Gbl_Files[ASL_FILE_STDERR].Handle = stdout;
677250757Sjkim            break;
678250757Sjkim
679250757Sjkim        case 'o':
680250757Sjkim
681250757Sjkim            Gbl_DisplayOptimizations = TRUE;
682250757Sjkim            break;
683250757Sjkim
684250757Sjkim        case 'r':
685250757Sjkim
686250757Sjkim            Gbl_DisplayRemarks = FALSE;
687250757Sjkim            break;
688250757Sjkim
689250757Sjkim        case 's':
690250757Sjkim
691250757Sjkim            Gbl_DoSignon = FALSE;
692250757Sjkim            break;
693250757Sjkim
694250757Sjkim        case 't':
695250757Sjkim
696250757Sjkim            Gbl_VerboseTemplates = TRUE;
697250757Sjkim            break;
698250757Sjkim
699250757Sjkim        case 'w':
700250757Sjkim
701250757Sjkim            /* Get the required argument */
702250757Sjkim
703250757Sjkim            if (AcpiGetoptArgument (argc, argv))
704250757Sjkim            {
705250757Sjkim                return (-1);
706250757Sjkim            }
707250757Sjkim
708250757Sjkim            Status = AslDisableException (AcpiGbl_Optarg);
709250757Sjkim            if (ACPI_FAILURE (Status))
710250757Sjkim            {
711250757Sjkim                return (-1);
712250757Sjkim            }
713250757Sjkim            break;
714250757Sjkim
715250757Sjkim        default:
716250757Sjkim
717250757Sjkim            printf ("Unknown option: -v%s\n", AcpiGbl_Optarg);
718250757Sjkim            return (-1);
719250757Sjkim        }
720250757Sjkim        break;
721250757Sjkim
722250757Sjkim    case 'w': /* Set warning levels */
723250757Sjkim
724250757Sjkim        switch (AcpiGbl_Optarg[0])
725250757Sjkim        {
726250757Sjkim        case '1':
727250757Sjkim
728250757Sjkim            Gbl_WarningLevel = ASL_WARNING;
729250757Sjkim            break;
730250757Sjkim
731250757Sjkim        case '2':
732250757Sjkim
733250757Sjkim            Gbl_WarningLevel = ASL_WARNING2;
734250757Sjkim            break;
735250757Sjkim
736250757Sjkim        case '3':
737250757Sjkim
738250757Sjkim            Gbl_WarningLevel = ASL_WARNING3;
739250757Sjkim            break;
740250757Sjkim
741250757Sjkim        case 'e':
742250757Sjkim
743250757Sjkim            Gbl_WarningsAsErrors = TRUE;
744250757Sjkim            break;
745250757Sjkim
746250757Sjkim        default:
747250757Sjkim
748250757Sjkim            printf ("Unknown option: -w%s\n", AcpiGbl_Optarg);
749250757Sjkim            return (-1);
750250757Sjkim        }
751250757Sjkim        break;
752250757Sjkim
753250757Sjkim    case 'x':   /* Set debug print output level */
754250757Sjkim
755250757Sjkim        AcpiDbgLevel = strtoul (AcpiGbl_Optarg, NULL, 16);
756250757Sjkim        break;
757250757Sjkim
758250757Sjkim    case 'z':
759250757Sjkim
760250757Sjkim        Gbl_UseOriginalCompilerId = TRUE;
761250757Sjkim        break;
762250757Sjkim
763250757Sjkim    default:
764250757Sjkim
765250757Sjkim        return (-1);
766250757Sjkim    }
767250757Sjkim
768250757Sjkim    return (0);
769250757Sjkim}
770250757Sjkim
771250757Sjkim
772250757Sjkim/*******************************************************************************
773250757Sjkim *
774250757Sjkim * FUNCTION:    AslMergeOptionTokens
775250757Sjkim *
776250757Sjkim * PARAMETERS:  InBuffer            - Input containing an option string
777250757Sjkim *              OutBuffer           - Merged output buffer
778250757Sjkim *
779250757Sjkim * RETURN:      None
780250757Sjkim *
781250757Sjkim * DESCRIPTION: Remove all whitespace from an option string.
782250757Sjkim *
783250757Sjkim ******************************************************************************/
784250757Sjkim
785250757Sjkimstatic void
786250757SjkimAslMergeOptionTokens (
787250757Sjkim    char                    *InBuffer,
788250757Sjkim    char                    *OutBuffer)
789250757Sjkim{
790250757Sjkim    char                    *Token;
791250757Sjkim
792250757Sjkim
793250757Sjkim    *OutBuffer = 0;
794250757Sjkim
795250757Sjkim    Token = strtok (InBuffer, ASL_TOKEN_SEPARATORS);
796250757Sjkim    while (Token)
797250757Sjkim    {
798250757Sjkim        strcat (OutBuffer, Token);
799250757Sjkim        Token = strtok (NULL, ASL_TOKEN_SEPARATORS);
800250757Sjkim    }
801250757Sjkim}
802250757Sjkim
803250757Sjkim
804250757Sjkim/*******************************************************************************
805250757Sjkim *
806250757Sjkim * FUNCTION:    AslDoResponseFile
807250757Sjkim *
808250757Sjkim * PARAMETERS:  Filename        - Name of the response file
809250757Sjkim *
810250757Sjkim * RETURN:      Status
811250757Sjkim *
812250757Sjkim * DESCRIPTION: Open a response file and process all options within.
813250757Sjkim *
814250757Sjkim ******************************************************************************/
815250757Sjkim
816250757Sjkimstatic int
817250757SjkimAslDoResponseFile (
818250757Sjkim    char                    *Filename)
819250757Sjkim{
820250757Sjkim    char                    *argv = StringBuffer2;
821250757Sjkim    FILE                    *ResponseFile;
822250757Sjkim    int                     OptStatus = 0;
823250757Sjkim    int                     Opterr;
824250757Sjkim    int                     Optind;
825250757Sjkim
826250757Sjkim
827250757Sjkim    ResponseFile = fopen (Filename, "r");
828250757Sjkim    if (!ResponseFile)
829250757Sjkim    {
830250757Sjkim        printf ("Could not open command file %s, %s\n",
831250757Sjkim            Filename, strerror (errno));
832250757Sjkim        return (-1);
833250757Sjkim    }
834250757Sjkim
835250757Sjkim    /* Must save the current GetOpt globals */
836250757Sjkim
837250757Sjkim    Opterr = AcpiGbl_Opterr;
838250757Sjkim    Optind = AcpiGbl_Optind;
839250757Sjkim
840250757Sjkim    /*
841250757Sjkim     * Process all lines in the response file. There must be one complete
842250757Sjkim     * option per line
843250757Sjkim     */
844250757Sjkim    while (fgets (StringBuffer, ASL_MSG_BUFFER_SIZE, ResponseFile))
845250757Sjkim    {
846250757Sjkim        /* Compress all tokens, allowing us to use a single argv entry */
847250757Sjkim
848250757Sjkim        AslMergeOptionTokens (StringBuffer, StringBuffer2);
849250757Sjkim
850250757Sjkim        /* Process the option */
851250757Sjkim
852250757Sjkim        AcpiGbl_Opterr = 0;
853250757Sjkim        AcpiGbl_Optind = 0;
854250757Sjkim
855250757Sjkim        OptStatus = AslDoOptions (1, &argv, TRUE);
856250757Sjkim        if (OptStatus)
857250757Sjkim        {
858250757Sjkim            printf ("Invalid option in command file %s: %s\n",
859250757Sjkim                Filename, StringBuffer);
860250757Sjkim            break;
861250757Sjkim        }
862250757Sjkim    }
863250757Sjkim
864250757Sjkim    /* Restore the GetOpt globals */
865250757Sjkim
866250757Sjkim    AcpiGbl_Opterr = Opterr;
867250757Sjkim    AcpiGbl_Optind = Optind;
868250757Sjkim
869250757Sjkim    fclose (ResponseFile);
870250757Sjkim    return (OptStatus);
871250757Sjkim}
872