asloptions.c revision 250757
1226633Sdim/******************************************************************************
2193326Sed *
3193326Sed * Module Name: asloptions - compiler command line processing
4193326Sed *
5193326Sed *****************************************************************************/
6193326Sed
7193326Sed/*
8193326Sed * Copyright (C) 2000 - 2013, Intel Corp.
9193326Sed * All rights reserved.
10193326Sed *
11226633Sdim * Redistribution and use in source and binary forms, with or without
12193326Sed * modification, are permitted provided that the following conditions
13193326Sed * are met:
14193326Sed * 1. Redistributions of source code must retain the above copyright
15212904Sdim *    notice, this list of conditions, and the following disclaimer,
16212904Sdim *    without modification.
17193326Sed * 2. Redistributions in binary form must reproduce at minimum a disclaimer
18223017Sdim *    substantially similar to the "NO WARRANTY" disclaimer below
19249423Sdim *    ("Disclaimer") and any redistribution must be conditioned upon
20193326Sed *    including a substantially similar Disclaimer requirement for further
21212904Sdim *    binary redistribution.
22193326Sed * 3. Neither the names of the above-listed copyright holders nor the names
23193326Sed *    of any contributors may be used to endorse or promote products derived
24193326Sed *    from this software without specific prior written permission.
25193326Sed *
26193326Sed * Alternatively, this software may be distributed under the terms of the
27193326Sed * GNU General Public License ("GPL") version 2 as published by the Free
28193326Sed * Software Foundation.
29193326Sed *
30193326Sed * NO WARRANTY
31193326Sed * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
32193326Sed * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
33193326Sed * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
34198092Srdivacky * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
35193326Sed * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
36193326Sed * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
37193326Sed * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
38193326Sed * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
39193326Sed * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
40193326Sed * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
41193326Sed * POSSIBILITY OF SUCH DAMAGES.
42193326Sed */
43193326Sed
44198092Srdivacky#include "aslcompiler.h"
45234353Sdim#include "acapps.h"
46208600Srdivacky#include "acdisasm.h"
47198092Srdivacky
48234353Sdim#define _COMPONENT          ACPI_COMPILER
49208600Srdivacky        ACPI_MODULE_NAME    ("asloption")
50208600Srdivacky
51208600Srdivacky
52208600Srdivacky/* Local prototypes */
53193326Sed
54193326Sedstatic int
55198092SrdivackyAslDoOptions (
56208600Srdivacky    int                     argc,
57208600Srdivacky    char                    **argv,
58208600Srdivacky    BOOLEAN                 IsResponseFile);
59193326Sed
60198092Srdivackystatic void
61226633SdimAslMergeOptionTokens (
62193326Sed    char                    *InBuffer,
63226633Sdim    char                    *OutBuffer);
64208600Srdivacky
65226633Sdimstatic int
66226633SdimAslDoResponseFile (
67193326Sed    char                    *Filename);
68193326Sed
69193326Sed
70210299Sed#define ASL_TOKEN_SEPARATORS    " \t\n"
71224145Sdim#define ASL_SUPPORTED_OPTIONS   "@:b|c|d^D:e:fgh^i|I:l^m:no|p:P^r:s|t|T:G^v^w|x:z"
72224145Sdim
73224145Sdim
74224145Sdim/*******************************************************************************
75193326Sed *
76208600Srdivacky * FUNCTION:    AslCommandLine
77234353Sdim *
78208600Srdivacky * PARAMETERS:  argc/argv
79218893Sdim *
80226633Sdim * RETURN:      Last argv index
81234353Sdim *
82234353Sdim * DESCRIPTION: Command line processing
83208600Srdivacky *
84208600Srdivacky ******************************************************************************/
85193326Sed
86193326Sedint
87193326SedAslCommandLine (
88193326Sed    int                     argc,
89193326Sed    char                    **argv)
90193326Sed{
91208600Srdivacky    int                     BadCommandLine = 0;
92198092Srdivacky    ACPI_STATUS             Status;
93193326Sed
94193326Sed
95224145Sdim    /* Minimum command line contains at least the command and an input file */
96224145Sdim
97198092Srdivacky    if (argc < 2)
98193326Sed    {
99193326Sed        printf (ACPI_COMMON_SIGNON (ASL_COMPILER_NAME));
100208600Srdivacky        Usage ();
101193326Sed        exit (1);
102198092Srdivacky    }
103208600Srdivacky
104208600Srdivacky    /* Process all command line options */
105208600Srdivacky
106208600Srdivacky    BadCommandLine = AslDoOptions (argc, argv, FALSE);
107208600Srdivacky
108208600Srdivacky    if (Gbl_DoTemplates)
109208600Srdivacky    {
110208600Srdivacky        Status = DtCreateTemplates (Gbl_TemplateSignature);
111208600Srdivacky        if (ACPI_FAILURE (Status))
112208600Srdivacky        {
113208600Srdivacky            exit (-1);
114208600Srdivacky        }
115208600Srdivacky        exit (1);
116208600Srdivacky    }
117208600Srdivacky
118208600Srdivacky    /* Next parameter must be the input filename */
119208600Srdivacky
120224145Sdim    if (!argv[AcpiGbl_Optind] &&
121224145Sdim        !Gbl_DisasmFlag &&
122193326Sed        !Gbl_GetAllTables)
123193326Sed    {
124224145Sdim        printf ("Missing input filename\n");
125193326Sed        BadCommandLine = TRUE;
126243830Sdim    }
127193326Sed
128208600Srdivacky    if (Gbl_DoSignon)
129208600Srdivacky    {
130224145Sdim        printf (ACPI_COMMON_SIGNON (ASL_COMPILER_NAME));
131224145Sdim        if (Gbl_IgnoreErrors)
132224145Sdim        {
133224145Sdim            printf ("Ignoring all errors, forcing AML file generation\n\n");
134224145Sdim        }
135224145Sdim    }
136224145Sdim
137224145Sdim    if (BadCommandLine)
138234353Sdim    {
139224145Sdim        printf ("\n");
140224145Sdim        Usage ();
141224145Sdim        exit (1);
142224145Sdim    }
143224145Sdim
144224145Sdim    return (AcpiGbl_Optind);
145224145Sdim}
146224145Sdim
147224145Sdim
148224145Sdim/*******************************************************************************
149224145Sdim *
150224145Sdim * FUNCTION:    AslDoOptions
151224145Sdim *
152234353Sdim * PARAMETERS:  argc/argv           - Standard argc/argv
153234353Sdim *              IsResponseFile      - TRUE if executing a response file.
154224145Sdim *
155224145Sdim * RETURN:      Status
156224145Sdim *
157224145Sdim * DESCRIPTION: Command line option processing
158224145Sdim *
159224145Sdim ******************************************************************************/
160224145Sdim
161224145Sdimstatic int
162224145SdimAslDoOptions (
163224145Sdim    int                     argc,
164224145Sdim    char                    **argv,
165224145Sdim    BOOLEAN                 IsResponseFile)
166224145Sdim{
167243830Sdim    ACPI_STATUS             Status;
168243830Sdim    UINT32                  j;
169243830Sdim
170224145Sdim
171243830Sdim    /* Get the command line options */
172243830Sdim
173243830Sdim    while ((j = AcpiGetopt (argc, argv, ASL_SUPPORTED_OPTIONS)) != EOF) switch (j)
174224145Sdim    {
175243830Sdim    case '@':   /* Begin a response file */
176243830Sdim
177224145Sdim        if (IsResponseFile)
178263508Sdim        {
179243830Sdim            printf ("Nested command files are not supported\n");
180263508Sdim            return (-1);
181224145Sdim        }
182243830Sdim
183243830Sdim        if (AslDoResponseFile (AcpiGbl_Optarg))
184243830Sdim        {
185224145Sdim            return (-1);
186243830Sdim        }
187243830Sdim        break;
188243830Sdim
189243830Sdim    case 'b':   /* Debug output options */
190243830Sdim
191243830Sdim        switch (AcpiGbl_Optarg[0])
192243830Sdim        {
193243830Sdim        case 'f':
194243830Sdim
195243830Sdim            AslCompilerdebug = 1; /* same as yydebug */
196243830Sdim            DtParserdebug = 1;
197243830Sdim            PrParserdebug = 1;
198243830Sdim            break;
199243830Sdim
200243830Sdim        case 't':
201243830Sdim
202263508Sdim            break;
203263508Sdim
204263508Sdim        default:
205263508Sdim
206263508Sdim            printf ("Unknown option: -b%s\n", AcpiGbl_Optarg);
207243830Sdim            return (-1);
208243830Sdim        }
209243830Sdim
210243830Sdim        /* Produce debug output file */
211243830Sdim
212243830Sdim        Gbl_DebugFlag = TRUE;
213210299Sed        break;
214243830Sdim
215243830Sdim    case 'c':
216208600Srdivacky
217243830Sdim        switch (AcpiGbl_Optarg[0])
218243830Sdim        {
219208600Srdivacky        case 'r':
220208600Srdivacky
221208600Srdivacky            Gbl_NoResourceChecking = TRUE;
222193326Sed            break;
223224145Sdim
224193326Sed        default:
225198092Srdivacky
226221345Sdim            printf ("Unknown option: -c%s\n", AcpiGbl_Optarg);
227221345Sdim            return (-1);
228224145Sdim        }
229221345Sdim        break;
230221345Sdim
231224145Sdim    case 'd':   /* Disassembler */
232193326Sed
233193326Sed        switch (AcpiGbl_Optarg[0])
234210299Sed        {
235210299Sed        case '^':
236210299Sed
237224145Sdim            Gbl_DoCompile = FALSE;
238210299Sed            break;
239210299Sed
240210299Sed        case 'a':
241210299Sed
242210299Sed            Gbl_DoCompile = FALSE;
243210299Sed            Gbl_DisassembleAll = TRUE;
244210299Sed            break;
245210299Sed
246210299Sed        case 'b':   /* Do not convert buffers to resource descriptors */
247210299Sed
248210299Sed            AcpiGbl_NoResourceDisassembly = TRUE;
249210299Sed            break;
250193326Sed
251224145Sdim        case 'c':
252224145Sdim
253224145Sdim            break;
254224145Sdim
255224145Sdim        default:
256224145Sdim
257224145Sdim            printf ("Unknown option: -d%s\n", AcpiGbl_Optarg);
258224145Sdim            return (-1);
259224145Sdim        }
260224145Sdim
261224145Sdim        Gbl_DisasmFlag = TRUE;
262224145Sdim        break;
263224145Sdim
264224145Sdim    case 'D':   /* Define a symbol */
265224145Sdim
266224145Sdim        PrAddDefine (AcpiGbl_Optarg, NULL, TRUE);
267224145Sdim        break;
268224145Sdim
269224145Sdim    case 'e':   /* External files for disassembler */
270224145Sdim
271224145Sdim        Status = AcpiDmAddToExternalFileList (AcpiGbl_Optarg);
272224145Sdim        if (ACPI_FAILURE (Status))
273224145Sdim        {
274224145Sdim            printf ("Could not add %s to external list\n", AcpiGbl_Optarg);
275224145Sdim            return (-1);
276224145Sdim        }
277234353Sdim        break;
278224145Sdim
279224145Sdim    case 'f':   /* Ignore errors and force creation of aml file */
280224145Sdim
281224145Sdim        Gbl_IgnoreErrors = TRUE;
282224145Sdim        break;
283224145Sdim
284224145Sdim    case 'G':
285224145Sdim
286224145Sdim        Gbl_CompileGeneric = TRUE;
287224145Sdim        break;
288193326Sed
289193326Sed    case 'g':   /* Get all ACPI tables */
290193326Sed
291193326Sed        Gbl_GetAllTables = TRUE;
292224145Sdim        Gbl_DoCompile = FALSE;
293224145Sdim        break;
294224145Sdim
295224145Sdim    case 'h':
296224145Sdim
297224145Sdim        switch (AcpiGbl_Optarg[0])
298224145Sdim        {
299224145Sdim        case '^':
300210299Sed
301210299Sed            Usage ();
302193326Sed            exit (0);
303208600Srdivacky
304208600Srdivacky        case 'c':
305208600Srdivacky
306208600Srdivacky            UtDisplayConstantOpcodes ();
307208600Srdivacky            exit (0);
308208600Srdivacky
309218893Sdim        case 'f':
310218893Sdim
311218893Sdim            AslFilenameHelp ();
312218893Sdim            exit (0);
313218893Sdim
314218893Sdim        case 'r':
315218893Sdim
316218893Sdim            /* reserved names */
317218893Sdim
318218893Sdim            ApDisplayReservedNames ();
319218893Sdim            exit (0);
320208600Srdivacky
321208600Srdivacky        case 't':
322208600Srdivacky
323208600Srdivacky            UtDisplaySupportedTables ();
324210299Sed            exit (0);
325210299Sed
326210299Sed        default:
327210299Sed
328210299Sed            printf ("Unknown option: -h%s\n", AcpiGbl_Optarg);
329210299Sed            return (-1);
330210299Sed        }
331210299Sed
332210299Sed    case 'I':   /* Add an include file search directory */
333208600Srdivacky
334193326Sed        FlAddIncludeDirectory (AcpiGbl_Optarg);
335193326Sed        break;
336193326Sed
337193326Sed    case 'i':   /* Output AML as an include file */
338208600Srdivacky
339208600Srdivacky        switch (AcpiGbl_Optarg[0])
340243830Sdim        {
341243830Sdim        case 'a':
342243830Sdim
343243830Sdim            /* Produce assembly code include file */
344243830Sdim
345243830Sdim            Gbl_AsmIncludeOutputFlag = TRUE;
346243830Sdim            break;
347243830Sdim
348243830Sdim        case 'c':
349243830Sdim
350243830Sdim            /* Produce C include file */
351243830Sdim
352243830Sdim            Gbl_C_IncludeOutputFlag = TRUE;
353243830Sdim            break;
354243830Sdim
355243830Sdim        case 'n':
356243830Sdim
357243830Sdim            /* Compiler/Disassembler: Ignore the NOOP operator */
358243830Sdim
359243830Sdim            AcpiGbl_IgnoreNoopOperator = TRUE;
360243830Sdim            break;
361243830Sdim
362243830Sdim        default:
363208600Srdivacky
364208600Srdivacky            printf ("Unknown option: -i%s\n", AcpiGbl_Optarg);
365193326Sed            return (-1);
366198092Srdivacky        }
367218893Sdim        break;
368210299Sed
369210299Sed    case 'l':   /* Listing files */
370210299Sed
371210299Sed        switch (AcpiGbl_Optarg[0])
372210299Sed        {
373193326Sed        case '^':
374193326Sed
375198092Srdivacky            /* Produce listing file (Mixed source/aml) */
376212904Sdim
377212904Sdim            Gbl_ListingFlag = TRUE;
378212904Sdim            break;
379212904Sdim
380212904Sdim        case 'i':
381218893Sdim
382218893Sdim            /* Produce preprocessor output file */
383218893Sdim
384218893Sdim            Gbl_PreprocessorOutputFlag = TRUE;
385218893Sdim            break;
386218893Sdim
387212904Sdim        case 'n':
388212904Sdim
389212904Sdim            /* Produce namespace file */
390212904Sdim
391212904Sdim            Gbl_NsOutputFlag = TRUE;
392212904Sdim            break;
393212904Sdim
394193326Sed        case 's':
395193326Sed
396193326Sed            /* Produce combined source file */
397204643Srdivacky
398204643Srdivacky            Gbl_SourceOutputFlag = TRUE;
399193326Sed            break;
400210299Sed
401210299Sed        default:
402193326Sed
403193326Sed            printf ("Unknown option: -l%s\n", AcpiGbl_Optarg);
404193326Sed            return (-1);
405193326Sed        }
406193326Sed        break;
407224145Sdim
408193326Sed    case 'm':   /* Set line buffer size */
409208600Srdivacky
410208600Srdivacky        Gbl_LineBufferSize = (UINT32) strtoul (AcpiGbl_Optarg, NULL, 0) * 1024;
411208600Srdivacky        if (Gbl_LineBufferSize < ASL_DEFAULT_LINE_BUFFER_SIZE)
412193326Sed        {
413193326Sed            Gbl_LineBufferSize = ASL_DEFAULT_LINE_BUFFER_SIZE;
414224145Sdim        }
415193326Sed        printf ("Line Buffer Size: %u\n", Gbl_LineBufferSize);
416193326Sed        break;
417207619Srdivacky
418207619Srdivacky    case 'n':   /* Parse only */
419193326Sed
420193326Sed        Gbl_ParseOnlyFlag = TRUE;
421208600Srdivacky        break;
422193326Sed
423198092Srdivacky    case 'o':   /* Control compiler AML optimizations */
424224145Sdim
425224145Sdim        switch (AcpiGbl_Optarg[0])
426193326Sed        {
427198092Srdivacky        case 'a':
428193326Sed
429193326Sed            /* Disable all optimizations */
430193326Sed
431193326Sed            Gbl_FoldConstants = FALSE;
432208600Srdivacky            Gbl_IntegerOptimizationFlag = FALSE;
433193326Sed            Gbl_ReferenceOptimizationFlag = FALSE;
434224145Sdim            break;
435193326Sed
436198092Srdivacky        case 'f':
437193326Sed
438193326Sed            /* Disable folding on "normal" expressions */
439224145Sdim
440224145Sdim            Gbl_FoldConstants = FALSE;
441193326Sed            break;
442193326Sed
443193326Sed        case 'i':
444193326Sed
445193326Sed            /* Disable integer optimization to constants */
446193326Sed
447198092Srdivacky            Gbl_IntegerOptimizationFlag = FALSE;
448193326Sed            break;
449193326Sed
450193326Sed        case 'n':
451193326Sed
452208600Srdivacky            /* Disable named reference optimization */
453193326Sed
454224145Sdim            Gbl_ReferenceOptimizationFlag = FALSE;
455224145Sdim            break;
456193326Sed
457193326Sed        case 't':
458193326Sed
459224145Sdim            /* Display compile time(s) */
460224145Sdim
461224145Sdim            Gbl_CompileTimesFlag = TRUE;
462224145Sdim            break;
463224145Sdim
464224145Sdim        default:
465224145Sdim
466224145Sdim            printf ("Unknown option: -c%s\n", AcpiGbl_Optarg);
467224145Sdim            return (-1);
468224145Sdim        }
469224145Sdim        break;
470243830Sdim
471243830Sdim    case 'P':   /* Preprocessor options */
472243830Sdim
473243830Sdim        switch (AcpiGbl_Optarg[0])
474243830Sdim        {
475243830Sdim        case '^':   /* Proprocess only, emit (.i) file */
476243830Sdim
477224145Sdim            Gbl_PreprocessOnly = TRUE;
478224145Sdim            Gbl_PreprocessorOutputFlag = TRUE;
479224145Sdim            break;
480224145Sdim
481224145Sdim        case 'n':   /* Disable preprocessor */
482243830Sdim
483224145Sdim            Gbl_PreprocessFlag = FALSE;
484224145Sdim            break;
485193326Sed
486193326Sed        default:
487193326Sed
488193326Sed            printf ("Unknown option: -P%s\n", AcpiGbl_Optarg);
489193326Sed            return (-1);
490193326Sed        }
491193326Sed        break;
492193326Sed
493193326Sed    case 'p':   /* Override default AML output filename */
494193326Sed
495198092Srdivacky        Gbl_OutputFilenamePrefix = AcpiGbl_Optarg;
496198092Srdivacky        Gbl_UseDefaultAmlFilename = FALSE;
497193326Sed        break;
498218893Sdim
499226633Sdim    case 'r':   /* Override revision found in table header */
500234353Sdim
501234353Sdim        Gbl_RevisionOverride = (UINT8) strtoul (AcpiGbl_Optarg, NULL, 0);
502193326Sed        break;
503193326Sed
504198092Srdivacky    case 's':   /* Create AML in a source code file */
505218893Sdim
506218893Sdim        switch (AcpiGbl_Optarg[0])
507218893Sdim        {
508218893Sdim        case 'a':
509226633Sdim
510234353Sdim            /* Produce assembly code output file */
511234353Sdim
512218893Sdim            Gbl_AsmOutputFlag = TRUE;
513218893Sdim            break;
514218893Sdim
515208600Srdivacky        case 'c':
516208600Srdivacky
517208600Srdivacky            /* Produce C hex output file */
518208600Srdivacky
519249423Sdim            Gbl_C_OutputFlag = TRUE;
520249423Sdim            break;
521249423Sdim
522249423Sdim        case 'o':
523249423Sdim
524249423Sdim            /* Produce AML offset table in C */
525249423Sdim
526249423Sdim            Gbl_C_OffsetTableFlag = TRUE;
527234353Sdim            break;
528193326Sed
529208600Srdivacky        default:
530208600Srdivacky
531193326Sed            printf ("Unknown option: -s%s\n", AcpiGbl_Optarg);
532208600Srdivacky            return (-1);
533208600Srdivacky        }
534208600Srdivacky        break;
535208600Srdivacky
536208600Srdivacky    case 't':   /* Produce hex table output file */
537208600Srdivacky
538208600Srdivacky        switch (AcpiGbl_Optarg[0])
539208600Srdivacky        {
540208600Srdivacky        case 'a':
541208600Srdivacky
542208600Srdivacky            Gbl_HexOutputFlag = HEX_OUTPUT_ASM;
543208600Srdivacky            break;
544208600Srdivacky
545208600Srdivacky        case 'c':
546208600Srdivacky
547208600Srdivacky            Gbl_HexOutputFlag = HEX_OUTPUT_C;
548208600Srdivacky            break;
549208600Srdivacky
550208600Srdivacky        case 's':
551208600Srdivacky
552208600Srdivacky            Gbl_HexOutputFlag = HEX_OUTPUT_ASL;
553198092Srdivacky            break;
554208600Srdivacky
555208600Srdivacky        default:
556208600Srdivacky
557208600Srdivacky            printf ("Unknown option: -t%s\n", AcpiGbl_Optarg);
558208600Srdivacky            return (-1);
559208600Srdivacky        }
560208600Srdivacky        break;
561198092Srdivacky
562208600Srdivacky    case 'T':   /* Create a ACPI table template file */
563208600Srdivacky
564208600Srdivacky        Gbl_DoTemplates = TRUE;
565208600Srdivacky        Gbl_TemplateSignature = AcpiGbl_Optarg;
566226633Sdim        break;
567208600Srdivacky
568208600Srdivacky    case 'v':   /* Version and verbosity settings */
569226633Sdim
570208600Srdivacky        switch (AcpiGbl_Optarg[0])
571208600Srdivacky        {
572208600Srdivacky        case '^':
573208600Srdivacky
574208600Srdivacky            printf (ACPI_COMMON_SIGNON (ASL_COMPILER_NAME));
575208600Srdivacky            exit (0);
576208600Srdivacky
577208600Srdivacky        case 'a':
578208600Srdivacky
579208600Srdivacky            /* Disable All error/warning messages */
580208600Srdivacky
581208600Srdivacky            Gbl_NoErrors = TRUE;
582208600Srdivacky            break;
583198092Srdivacky
584208600Srdivacky        case 'i':
585208600Srdivacky            /*
586208600Srdivacky             * Support for integrated development environment(s).
587218893Sdim             *
588226633Sdim             * 1) No compiler signon
589208600Srdivacky             * 2) Send stderr messages to stdout
590208600Srdivacky             * 3) Less verbose error messages (single line only for each)
591218893Sdim             * 4) Error/warning messages are formatted appropriately to
592218893Sdim             *    be recognized by MS Visual Studio
593208600Srdivacky             */
594218893Sdim            Gbl_VerboseErrors = FALSE;
595218893Sdim            Gbl_DoSignon = FALSE;
596208600Srdivacky            Gbl_Files[ASL_FILE_STDERR].Handle = stdout;
597208600Srdivacky            break;
598208600Srdivacky
599208600Srdivacky        case 'o':
600208600Srdivacky
601208600Srdivacky            Gbl_DisplayOptimizations = TRUE;
602208600Srdivacky            break;
603208600Srdivacky
604208600Srdivacky        case 'r':
605208600Srdivacky
606208600Srdivacky            Gbl_DisplayRemarks = FALSE;
607208600Srdivacky            break;
608218893Sdim
609208600Srdivacky        case 's':
610208600Srdivacky
611218893Sdim            Gbl_DoSignon = FALSE;
612208600Srdivacky            break;
613208600Srdivacky
614208600Srdivacky        case 't':
615208600Srdivacky
616208600Srdivacky            Gbl_VerboseTemplates = TRUE;
617208600Srdivacky            break;
618208600Srdivacky
619208600Srdivacky        case 'w':
620208600Srdivacky
621208600Srdivacky            /* Get the required argument */
622208600Srdivacky
623208600Srdivacky            if (AcpiGetoptArgument (argc, argv))
624208600Srdivacky            {
625208600Srdivacky                return (-1);
626208600Srdivacky            }
627208600Srdivacky
628208600Srdivacky            Status = AslDisableException (AcpiGbl_Optarg);
629193326Sed            if (ACPI_FAILURE (Status))
630193326Sed            {
631208600Srdivacky                return (-1);
632208600Srdivacky            }
633226633Sdim            break;
634208600Srdivacky
635208600Srdivacky        default:
636208600Srdivacky
637208600Srdivacky            printf ("Unknown option: -v%s\n", AcpiGbl_Optarg);
638208600Srdivacky            return (-1);
639208600Srdivacky        }
640208600Srdivacky        break;
641208600Srdivacky
642208600Srdivacky    case 'w': /* Set warning levels */
643208600Srdivacky
644208600Srdivacky        switch (AcpiGbl_Optarg[0])
645208600Srdivacky        {
646208600Srdivacky        case '1':
647208600Srdivacky
648208600Srdivacky            Gbl_WarningLevel = ASL_WARNING;
649208600Srdivacky            break;
650208600Srdivacky
651208600Srdivacky        case '2':
652208600Srdivacky
653208600Srdivacky            Gbl_WarningLevel = ASL_WARNING2;
654208600Srdivacky            break;
655208600Srdivacky
656208600Srdivacky        case '3':
657208600Srdivacky
658208600Srdivacky            Gbl_WarningLevel = ASL_WARNING3;
659208600Srdivacky            break;
660208600Srdivacky
661208600Srdivacky        case 'e':
662208600Srdivacky
663208600Srdivacky            Gbl_WarningsAsErrors = TRUE;
664208600Srdivacky            break;
665208600Srdivacky
666208600Srdivacky        default:
667193326Sed
668193326Sed            printf ("Unknown option: -w%s\n", AcpiGbl_Optarg);
669193326Sed            return (-1);
670193326Sed        }
671234353Sdim        break;
672234353Sdim
673234353Sdim    case 'x':   /* Set debug print output level */
674234353Sdim
675234353Sdim        AcpiDbgLevel = strtoul (AcpiGbl_Optarg, NULL, 16);
676234353Sdim        break;
677234353Sdim
678234353Sdim    case 'z':
679234353Sdim
680234353Sdim        Gbl_UseOriginalCompilerId = TRUE;
681234353Sdim        break;
682249423Sdim
683234353Sdim    default:
684234353Sdim
685234353Sdim        return (-1);
686234353Sdim    }
687234353Sdim
688234353Sdim    return (0);
689234353Sdim}
690234353Sdim
691234353Sdim
692234353Sdim/*******************************************************************************
693234353Sdim *
694234353Sdim * FUNCTION:    AslMergeOptionTokens
695234353Sdim *
696234353Sdim * PARAMETERS:  InBuffer            - Input containing an option string
697234353Sdim *              OutBuffer           - Merged output buffer
698234353Sdim *
699234353Sdim * RETURN:      None
700234353Sdim *
701234353Sdim * DESCRIPTION: Remove all whitespace from an option string.
702234353Sdim *
703234353Sdim ******************************************************************************/
704208600Srdivacky
705208600Srdivackystatic void
706208600SrdivackyAslMergeOptionTokens (
707218893Sdim    char                    *InBuffer,
708208600Srdivacky    char                    *OutBuffer)
709208600Srdivacky{
710208600Srdivacky    char                    *Token;
711208600Srdivacky
712234353Sdim
713208600Srdivacky    *OutBuffer = 0;
714208600Srdivacky
715208600Srdivacky    Token = strtok (InBuffer, ASL_TOKEN_SEPARATORS);
716234353Sdim    while (Token)
717234353Sdim    {
718208600Srdivacky        strcat (OutBuffer, Token);
719234353Sdim        Token = strtok (NULL, ASL_TOKEN_SEPARATORS);
720208600Srdivacky    }
721234353Sdim}
722234353Sdim
723208600Srdivacky
724208600Srdivacky/*******************************************************************************
725234353Sdim *
726234353Sdim * FUNCTION:    AslDoResponseFile
727234353Sdim *
728234353Sdim * PARAMETERS:  Filename        - Name of the response file
729208600Srdivacky *
730234353Sdim * RETURN:      Status
731208600Srdivacky *
732234353Sdim * DESCRIPTION: Open a response file and process all options within.
733234353Sdim *
734234353Sdim ******************************************************************************/
735234353Sdim
736234353Sdimstatic int
737234353SdimAslDoResponseFile (
738234353Sdim    char                    *Filename)
739226633Sdim{
740226633Sdim    char                    *argv = StringBuffer2;
741193326Sed    FILE                    *ResponseFile;
742193326Sed    int                     OptStatus = 0;
743226633Sdim    int                     Opterr;
744234353Sdim    int                     Optind;
745234353Sdim
746193326Sed
747193326Sed    ResponseFile = fopen (Filename, "r");
748193326Sed    if (!ResponseFile)
749193326Sed    {
750193326Sed        printf ("Could not open command file %s, %s\n",
751198092Srdivacky            Filename, strerror (errno));
752193326Sed        return (-1);
753193326Sed    }
754198092Srdivacky
755208600Srdivacky    /* Must save the current GetOpt globals */
756198092Srdivacky
757208600Srdivacky    Opterr = AcpiGbl_Opterr;
758208600Srdivacky    Optind = AcpiGbl_Optind;
759198092Srdivacky
760208600Srdivacky    /*
761234353Sdim     * Process all lines in the response file. There must be one complete
762226633Sdim     * option per line
763226633Sdim     */
764226633Sdim    while (fgets (StringBuffer, ASL_MSG_BUFFER_SIZE, ResponseFile))
765234353Sdim    {
766226633Sdim        /* Compress all tokens, allowing us to use a single argv entry */
767226633Sdim
768234353Sdim        AslMergeOptionTokens (StringBuffer, StringBuffer2);
769234353Sdim
770226633Sdim        /* Process the option */
771226633Sdim
772226633Sdim        AcpiGbl_Opterr = 0;
773193326Sed        AcpiGbl_Optind = 0;
774226633Sdim
775226633Sdim        OptStatus = AslDoOptions (1, &argv, TRUE);
776226633Sdim        if (OptStatus)
777234353Sdim        {
778226633Sdim            printf ("Invalid option in command file %s: %s\n",
779193326Sed                Filename, StringBuffer);
780226633Sdim            break;
781226633Sdim        }
782226633Sdim    }
783234353Sdim
784226633Sdim    /* Restore the GetOpt globals */
785234353Sdim
786234353Sdim    AcpiGbl_Opterr = Opterr;
787234353Sdim    AcpiGbl_Optind = Optind;
788234353Sdim
789234353Sdim    fclose (ResponseFile);
790234353Sdim    return (OptStatus);
791193326Sed}
792193326Sed