1250757Sjkim/******************************************************************************
2250757Sjkim *
3250757Sjkim * Module Name: asloptions - compiler command line processing
4250757Sjkim *
5250757Sjkim *****************************************************************************/
6250757Sjkim
7250757Sjkim/*
8250757Sjkim * Copyright (C) 2000 - 2013, 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] &&
121250757Sjkim        !Gbl_DisasmFlag &&
122250757Sjkim        !Gbl_GetAllTables)
123250757Sjkim    {
124250757Sjkim        printf ("Missing input filename\n");
125250757Sjkim        BadCommandLine = TRUE;
126250757Sjkim    }
127250757Sjkim
128250757Sjkim    if (Gbl_DoSignon)
129250757Sjkim    {
130250757Sjkim        printf (ACPI_COMMON_SIGNON (ASL_COMPILER_NAME));
131250757Sjkim        if (Gbl_IgnoreErrors)
132250757Sjkim        {
133250757Sjkim            printf ("Ignoring all errors, forcing AML file generation\n\n");
134250757Sjkim        }
135250757Sjkim    }
136250757Sjkim
137250757Sjkim    if (BadCommandLine)
138250757Sjkim    {
139254745Sjkim        printf ("Use -h option for help information\n");
140250757Sjkim        exit (1);
141250757Sjkim    }
142250757Sjkim
143250757Sjkim    return (AcpiGbl_Optind);
144250757Sjkim}
145250757Sjkim
146250757Sjkim
147250757Sjkim/*******************************************************************************
148250757Sjkim *
149250757Sjkim * FUNCTION:    AslDoOptions
150250757Sjkim *
151250757Sjkim * PARAMETERS:  argc/argv           - Standard argc/argv
152250757Sjkim *              IsResponseFile      - TRUE if executing a response file.
153250757Sjkim *
154250757Sjkim * RETURN:      Status
155250757Sjkim *
156250757Sjkim * DESCRIPTION: Command line option processing
157250757Sjkim *
158250757Sjkim ******************************************************************************/
159250757Sjkim
160250757Sjkimstatic int
161250757SjkimAslDoOptions (
162250757Sjkim    int                     argc,
163250757Sjkim    char                    **argv,
164250757Sjkim    BOOLEAN                 IsResponseFile)
165250757Sjkim{
166250757Sjkim    ACPI_STATUS             Status;
167250757Sjkim    UINT32                  j;
168250757Sjkim
169250757Sjkim
170250757Sjkim    /* Get the command line options */
171250757Sjkim
172250757Sjkim    while ((j = AcpiGetopt (argc, argv, ASL_SUPPORTED_OPTIONS)) != EOF) switch (j)
173250757Sjkim    {
174250757Sjkim    case '@':   /* Begin a response file */
175250757Sjkim
176250757Sjkim        if (IsResponseFile)
177250757Sjkim        {
178250757Sjkim            printf ("Nested command files are not supported\n");
179250757Sjkim            return (-1);
180250757Sjkim        }
181250757Sjkim
182250757Sjkim        if (AslDoResponseFile (AcpiGbl_Optarg))
183250757Sjkim        {
184250757Sjkim            return (-1);
185250757Sjkim        }
186250757Sjkim        break;
187250757Sjkim
188250757Sjkim    case 'b':   /* Debug output options */
189250757Sjkim
190250757Sjkim        switch (AcpiGbl_Optarg[0])
191250757Sjkim        {
192250757Sjkim        case 'f':
193250757Sjkim
194250757Sjkim            AslCompilerdebug = 1; /* same as yydebug */
195250757Sjkim            DtParserdebug = 1;
196250757Sjkim            PrParserdebug = 1;
197250757Sjkim            break;
198250757Sjkim
199250757Sjkim        case 't':
200250757Sjkim
201250757Sjkim            break;
202250757Sjkim
203250757Sjkim        default:
204250757Sjkim
205250757Sjkim            printf ("Unknown option: -b%s\n", AcpiGbl_Optarg);
206250757Sjkim            return (-1);
207250757Sjkim        }
208250757Sjkim
209250757Sjkim        /* Produce debug output file */
210250757Sjkim
211250757Sjkim        Gbl_DebugFlag = TRUE;
212250757Sjkim        break;
213250757Sjkim
214250757Sjkim    case 'c':
215250757Sjkim
216250757Sjkim        switch (AcpiGbl_Optarg[0])
217250757Sjkim        {
218250757Sjkim        case 'r':
219250757Sjkim
220250757Sjkim            Gbl_NoResourceChecking = TRUE;
221250757Sjkim            break;
222250757Sjkim
223250757Sjkim        default:
224250757Sjkim
225250757Sjkim            printf ("Unknown option: -c%s\n", AcpiGbl_Optarg);
226250757Sjkim            return (-1);
227250757Sjkim        }
228250757Sjkim        break;
229250757Sjkim
230250757Sjkim    case 'd':   /* Disassembler */
231250757Sjkim
232250757Sjkim        switch (AcpiGbl_Optarg[0])
233250757Sjkim        {
234250757Sjkim        case '^':
235250757Sjkim
236250757Sjkim            Gbl_DoCompile = FALSE;
237250757Sjkim            break;
238250757Sjkim
239250757Sjkim        case 'a':
240250757Sjkim
241250757Sjkim            Gbl_DoCompile = FALSE;
242250757Sjkim            Gbl_DisassembleAll = TRUE;
243250757Sjkim            break;
244250757Sjkim
245250757Sjkim        case 'b':   /* Do not convert buffers to resource descriptors */
246250757Sjkim
247250757Sjkim            AcpiGbl_NoResourceDisassembly = TRUE;
248250757Sjkim            break;
249250757Sjkim
250250757Sjkim        case 'c':
251250757Sjkim
252250757Sjkim            break;
253250757Sjkim
254250757Sjkim        default:
255250757Sjkim
256250757Sjkim            printf ("Unknown option: -d%s\n", AcpiGbl_Optarg);
257250757Sjkim            return (-1);
258250757Sjkim        }
259250757Sjkim
260250757Sjkim        Gbl_DisasmFlag = TRUE;
261250757Sjkim        break;
262250757Sjkim
263250757Sjkim    case 'D':   /* Define a symbol */
264250757Sjkim
265250757Sjkim        PrAddDefine (AcpiGbl_Optarg, NULL, TRUE);
266250757Sjkim        break;
267250757Sjkim
268250757Sjkim    case 'e':   /* External files for disassembler */
269250757Sjkim
270250757Sjkim        Status = AcpiDmAddToExternalFileList (AcpiGbl_Optarg);
271250757Sjkim        if (ACPI_FAILURE (Status))
272250757Sjkim        {
273250757Sjkim            printf ("Could not add %s to external list\n", AcpiGbl_Optarg);
274250757Sjkim            return (-1);
275250757Sjkim        }
276250757Sjkim        break;
277250757Sjkim
278254745Sjkim    case 'f':
279250757Sjkim
280254745Sjkim        switch (AcpiGbl_Optarg[0])
281254745Sjkim        {
282254745Sjkim        case '^':   /* Ignore errors and force creation of aml file */
283254745Sjkim
284254745Sjkim            Gbl_IgnoreErrors = TRUE;
285254745Sjkim            break;
286254745Sjkim
287254745Sjkim        case 'e':   /* Disassembler: Get external declaration file */
288254745Sjkim
289254745Sjkim            if (AcpiGetoptArgument (argc, argv))
290254745Sjkim            {
291254745Sjkim                return (-1);
292254745Sjkim            }
293254745Sjkim
294254745Sjkim            Gbl_ExternalRefFilename = AcpiGbl_Optarg;
295254745Sjkim            break;
296254745Sjkim
297254745Sjkim        default:
298254745Sjkim
299254745Sjkim            printf ("Unknown option: -f%s\n", AcpiGbl_Optarg);
300254745Sjkim            return (-1);
301254745Sjkim        }
302250757Sjkim        break;
303250757Sjkim
304250757Sjkim    case 'G':
305250757Sjkim
306250757Sjkim        Gbl_CompileGeneric = TRUE;
307250757Sjkim        break;
308250757Sjkim
309250757Sjkim    case 'g':   /* Get all ACPI tables */
310250757Sjkim
311250757Sjkim        Gbl_GetAllTables = TRUE;
312250757Sjkim        Gbl_DoCompile = FALSE;
313250757Sjkim        break;
314250757Sjkim
315250757Sjkim    case 'h':
316250757Sjkim
317250757Sjkim        switch (AcpiGbl_Optarg[0])
318250757Sjkim        {
319250757Sjkim        case '^':
320250757Sjkim
321250757Sjkim            Usage ();
322250757Sjkim            exit (0);
323250757Sjkim
324250757Sjkim        case 'c':
325250757Sjkim
326250757Sjkim            UtDisplayConstantOpcodes ();
327250757Sjkim            exit (0);
328250757Sjkim
329250757Sjkim        case 'f':
330250757Sjkim
331250757Sjkim            AslFilenameHelp ();
332250757Sjkim            exit (0);
333250757Sjkim
334250757Sjkim        case 'r':
335250757Sjkim
336250757Sjkim            /* reserved names */
337250757Sjkim
338250757Sjkim            ApDisplayReservedNames ();
339250757Sjkim            exit (0);
340250757Sjkim
341250757Sjkim        case 't':
342250757Sjkim
343250757Sjkim            UtDisplaySupportedTables ();
344250757Sjkim            exit (0);
345250757Sjkim
346250757Sjkim        default:
347250757Sjkim
348250757Sjkim            printf ("Unknown option: -h%s\n", AcpiGbl_Optarg);
349250757Sjkim            return (-1);
350250757Sjkim        }
351250757Sjkim
352250757Sjkim    case 'I':   /* Add an include file search directory */
353250757Sjkim
354250757Sjkim        FlAddIncludeDirectory (AcpiGbl_Optarg);
355250757Sjkim        break;
356250757Sjkim
357250757Sjkim    case 'i':   /* Output AML as an include file */
358250757Sjkim
359250757Sjkim        switch (AcpiGbl_Optarg[0])
360250757Sjkim        {
361250757Sjkim        case 'a':
362250757Sjkim
363250757Sjkim            /* Produce assembly code include file */
364250757Sjkim
365250757Sjkim            Gbl_AsmIncludeOutputFlag = TRUE;
366250757Sjkim            break;
367250757Sjkim
368250757Sjkim        case 'c':
369250757Sjkim
370250757Sjkim            /* Produce C include file */
371250757Sjkim
372250757Sjkim            Gbl_C_IncludeOutputFlag = TRUE;
373250757Sjkim            break;
374250757Sjkim
375250757Sjkim        case 'n':
376250757Sjkim
377250757Sjkim            /* Compiler/Disassembler: Ignore the NOOP operator */
378250757Sjkim
379250757Sjkim            AcpiGbl_IgnoreNoopOperator = TRUE;
380250757Sjkim            break;
381250757Sjkim
382250757Sjkim        default:
383250757Sjkim
384250757Sjkim            printf ("Unknown option: -i%s\n", AcpiGbl_Optarg);
385250757Sjkim            return (-1);
386250757Sjkim        }
387250757Sjkim        break;
388250757Sjkim
389250757Sjkim    case 'l':   /* Listing files */
390250757Sjkim
391250757Sjkim        switch (AcpiGbl_Optarg[0])
392250757Sjkim        {
393250757Sjkim        case '^':
394250757Sjkim
395250757Sjkim            /* Produce listing file (Mixed source/aml) */
396250757Sjkim
397250757Sjkim            Gbl_ListingFlag = TRUE;
398250757Sjkim            break;
399250757Sjkim
400250757Sjkim        case 'i':
401250757Sjkim
402250757Sjkim            /* Produce preprocessor output file */
403250757Sjkim
404250757Sjkim            Gbl_PreprocessorOutputFlag = TRUE;
405250757Sjkim            break;
406250757Sjkim
407250757Sjkim        case 'n':
408250757Sjkim
409250757Sjkim            /* Produce namespace file */
410250757Sjkim
411250757Sjkim            Gbl_NsOutputFlag = TRUE;
412250757Sjkim            break;
413250757Sjkim
414250757Sjkim        case 's':
415250757Sjkim
416250757Sjkim            /* Produce combined source file */
417250757Sjkim
418250757Sjkim            Gbl_SourceOutputFlag = TRUE;
419250757Sjkim            break;
420250757Sjkim
421250757Sjkim        default:
422250757Sjkim
423250757Sjkim            printf ("Unknown option: -l%s\n", AcpiGbl_Optarg);
424250757Sjkim            return (-1);
425250757Sjkim        }
426250757Sjkim        break;
427250757Sjkim
428250757Sjkim    case 'm':   /* Set line buffer size */
429250757Sjkim
430250757Sjkim        Gbl_LineBufferSize = (UINT32) strtoul (AcpiGbl_Optarg, NULL, 0) * 1024;
431250757Sjkim        if (Gbl_LineBufferSize < ASL_DEFAULT_LINE_BUFFER_SIZE)
432250757Sjkim        {
433250757Sjkim            Gbl_LineBufferSize = ASL_DEFAULT_LINE_BUFFER_SIZE;
434250757Sjkim        }
435250757Sjkim        printf ("Line Buffer Size: %u\n", Gbl_LineBufferSize);
436250757Sjkim        break;
437250757Sjkim
438250757Sjkim    case 'n':   /* Parse only */
439250757Sjkim
440250757Sjkim        Gbl_ParseOnlyFlag = TRUE;
441250757Sjkim        break;
442250757Sjkim
443250757Sjkim    case 'o':   /* Control compiler AML optimizations */
444250757Sjkim
445250757Sjkim        switch (AcpiGbl_Optarg[0])
446250757Sjkim        {
447250757Sjkim        case 'a':
448250757Sjkim
449250757Sjkim            /* Disable all optimizations */
450250757Sjkim
451250757Sjkim            Gbl_FoldConstants = FALSE;
452250757Sjkim            Gbl_IntegerOptimizationFlag = FALSE;
453250757Sjkim            Gbl_ReferenceOptimizationFlag = FALSE;
454250757Sjkim            break;
455250757Sjkim
456250757Sjkim        case 'f':
457250757Sjkim
458250757Sjkim            /* Disable folding on "normal" expressions */
459250757Sjkim
460250757Sjkim            Gbl_FoldConstants = FALSE;
461250757Sjkim            break;
462250757Sjkim
463250757Sjkim        case 'i':
464250757Sjkim
465250757Sjkim            /* Disable integer optimization to constants */
466250757Sjkim
467250757Sjkim            Gbl_IntegerOptimizationFlag = FALSE;
468250757Sjkim            break;
469250757Sjkim
470250757Sjkim        case 'n':
471250757Sjkim
472250757Sjkim            /* Disable named reference optimization */
473250757Sjkim
474250757Sjkim            Gbl_ReferenceOptimizationFlag = FALSE;
475250757Sjkim            break;
476250757Sjkim
477250757Sjkim        case 't':
478250757Sjkim
479250757Sjkim            /* Display compile time(s) */
480250757Sjkim
481250757Sjkim            Gbl_CompileTimesFlag = TRUE;
482250757Sjkim            break;
483250757Sjkim
484250757Sjkim        default:
485250757Sjkim
486250757Sjkim            printf ("Unknown option: -c%s\n", AcpiGbl_Optarg);
487250757Sjkim            return (-1);
488250757Sjkim        }
489250757Sjkim        break;
490250757Sjkim
491250757Sjkim    case 'P':   /* Preprocessor options */
492250757Sjkim
493250757Sjkim        switch (AcpiGbl_Optarg[0])
494250757Sjkim        {
495250757Sjkim        case '^':   /* Proprocess only, emit (.i) file */
496250757Sjkim
497250757Sjkim            Gbl_PreprocessOnly = TRUE;
498250757Sjkim            Gbl_PreprocessorOutputFlag = TRUE;
499250757Sjkim            break;
500250757Sjkim
501250757Sjkim        case 'n':   /* Disable preprocessor */
502250757Sjkim
503250757Sjkim            Gbl_PreprocessFlag = FALSE;
504250757Sjkim            break;
505250757Sjkim
506250757Sjkim        default:
507250757Sjkim
508250757Sjkim            printf ("Unknown option: -P%s\n", AcpiGbl_Optarg);
509250757Sjkim            return (-1);
510250757Sjkim        }
511250757Sjkim        break;
512250757Sjkim
513250757Sjkim    case 'p':   /* Override default AML output filename */
514250757Sjkim
515250757Sjkim        Gbl_OutputFilenamePrefix = AcpiGbl_Optarg;
516250757Sjkim        Gbl_UseDefaultAmlFilename = FALSE;
517250757Sjkim        break;
518250757Sjkim
519250757Sjkim    case 'r':   /* Override revision found in table header */
520250757Sjkim
521250757Sjkim        Gbl_RevisionOverride = (UINT8) strtoul (AcpiGbl_Optarg, NULL, 0);
522250757Sjkim        break;
523250757Sjkim
524250757Sjkim    case 's':   /* Create AML in a source code file */
525250757Sjkim
526250757Sjkim        switch (AcpiGbl_Optarg[0])
527250757Sjkim        {
528250757Sjkim        case 'a':
529250757Sjkim
530250757Sjkim            /* Produce assembly code output file */
531250757Sjkim
532250757Sjkim            Gbl_AsmOutputFlag = TRUE;
533250757Sjkim            break;
534250757Sjkim
535250757Sjkim        case 'c':
536250757Sjkim
537250757Sjkim            /* Produce C hex output file */
538250757Sjkim
539250757Sjkim            Gbl_C_OutputFlag = TRUE;
540250757Sjkim            break;
541250757Sjkim
542250757Sjkim        case 'o':
543250757Sjkim
544250757Sjkim            /* Produce AML offset table in C */
545250757Sjkim
546250757Sjkim            Gbl_C_OffsetTableFlag = TRUE;
547250757Sjkim            break;
548250757Sjkim
549250757Sjkim        default:
550250757Sjkim
551250757Sjkim            printf ("Unknown option: -s%s\n", AcpiGbl_Optarg);
552250757Sjkim            return (-1);
553250757Sjkim        }
554250757Sjkim        break;
555250757Sjkim
556250757Sjkim    case 't':   /* Produce hex table output file */
557250757Sjkim
558250757Sjkim        switch (AcpiGbl_Optarg[0])
559250757Sjkim        {
560250757Sjkim        case 'a':
561250757Sjkim
562250757Sjkim            Gbl_HexOutputFlag = HEX_OUTPUT_ASM;
563250757Sjkim            break;
564250757Sjkim
565250757Sjkim        case 'c':
566250757Sjkim
567250757Sjkim            Gbl_HexOutputFlag = HEX_OUTPUT_C;
568250757Sjkim            break;
569250757Sjkim
570250757Sjkim        case 's':
571250757Sjkim
572250757Sjkim            Gbl_HexOutputFlag = HEX_OUTPUT_ASL;
573250757Sjkim            break;
574250757Sjkim
575250757Sjkim        default:
576250757Sjkim
577250757Sjkim            printf ("Unknown option: -t%s\n", AcpiGbl_Optarg);
578250757Sjkim            return (-1);
579250757Sjkim        }
580250757Sjkim        break;
581250757Sjkim
582250757Sjkim    case 'T':   /* Create a ACPI table template file */
583250757Sjkim
584250757Sjkim        Gbl_DoTemplates = TRUE;
585250757Sjkim        Gbl_TemplateSignature = AcpiGbl_Optarg;
586250757Sjkim        break;
587250757Sjkim
588250757Sjkim    case 'v':   /* Version and verbosity settings */
589250757Sjkim
590250757Sjkim        switch (AcpiGbl_Optarg[0])
591250757Sjkim        {
592250757Sjkim        case '^':
593250757Sjkim
594250757Sjkim            printf (ACPI_COMMON_SIGNON (ASL_COMPILER_NAME));
595250757Sjkim            exit (0);
596250757Sjkim
597250757Sjkim        case 'a':
598250757Sjkim
599250757Sjkim            /* Disable All error/warning messages */
600250757Sjkim
601250757Sjkim            Gbl_NoErrors = TRUE;
602250757Sjkim            break;
603250757Sjkim
604250757Sjkim        case 'i':
605250757Sjkim            /*
606250757Sjkim             * Support for integrated development environment(s).
607250757Sjkim             *
608250757Sjkim             * 1) No compiler signon
609250757Sjkim             * 2) Send stderr messages to stdout
610250757Sjkim             * 3) Less verbose error messages (single line only for each)
611250757Sjkim             * 4) Error/warning messages are formatted appropriately to
612250757Sjkim             *    be recognized by MS Visual Studio
613250757Sjkim             */
614250757Sjkim            Gbl_VerboseErrors = FALSE;
615250757Sjkim            Gbl_DoSignon = FALSE;
616250757Sjkim            Gbl_Files[ASL_FILE_STDERR].Handle = stdout;
617250757Sjkim            break;
618250757Sjkim
619250757Sjkim        case 'o':
620250757Sjkim
621250757Sjkim            Gbl_DisplayOptimizations = TRUE;
622250757Sjkim            break;
623250757Sjkim
624250757Sjkim        case 'r':
625250757Sjkim
626250757Sjkim            Gbl_DisplayRemarks = FALSE;
627250757Sjkim            break;
628250757Sjkim
629250757Sjkim        case 's':
630250757Sjkim
631250757Sjkim            Gbl_DoSignon = FALSE;
632250757Sjkim            break;
633250757Sjkim
634250757Sjkim        case 't':
635250757Sjkim
636250757Sjkim            Gbl_VerboseTemplates = TRUE;
637250757Sjkim            break;
638250757Sjkim
639250757Sjkim        case 'w':
640250757Sjkim
641250757Sjkim            /* Get the required argument */
642250757Sjkim
643250757Sjkim            if (AcpiGetoptArgument (argc, argv))
644250757Sjkim            {
645250757Sjkim                return (-1);
646250757Sjkim            }
647250757Sjkim
648250757Sjkim            Status = AslDisableException (AcpiGbl_Optarg);
649250757Sjkim            if (ACPI_FAILURE (Status))
650250757Sjkim            {
651250757Sjkim                return (-1);
652250757Sjkim            }
653250757Sjkim            break;
654250757Sjkim
655250757Sjkim        default:
656250757Sjkim
657250757Sjkim            printf ("Unknown option: -v%s\n", AcpiGbl_Optarg);
658250757Sjkim            return (-1);
659250757Sjkim        }
660250757Sjkim        break;
661250757Sjkim
662250757Sjkim    case 'w': /* Set warning levels */
663250757Sjkim
664250757Sjkim        switch (AcpiGbl_Optarg[0])
665250757Sjkim        {
666250757Sjkim        case '1':
667250757Sjkim
668250757Sjkim            Gbl_WarningLevel = ASL_WARNING;
669250757Sjkim            break;
670250757Sjkim
671250757Sjkim        case '2':
672250757Sjkim
673250757Sjkim            Gbl_WarningLevel = ASL_WARNING2;
674250757Sjkim            break;
675250757Sjkim
676250757Sjkim        case '3':
677250757Sjkim
678250757Sjkim            Gbl_WarningLevel = ASL_WARNING3;
679250757Sjkim            break;
680250757Sjkim
681250757Sjkim        case 'e':
682250757Sjkim
683250757Sjkim            Gbl_WarningsAsErrors = TRUE;
684250757Sjkim            break;
685250757Sjkim
686250757Sjkim        default:
687250757Sjkim
688250757Sjkim            printf ("Unknown option: -w%s\n", AcpiGbl_Optarg);
689250757Sjkim            return (-1);
690250757Sjkim        }
691250757Sjkim        break;
692250757Sjkim
693250757Sjkim    case 'x':   /* Set debug print output level */
694250757Sjkim
695250757Sjkim        AcpiDbgLevel = strtoul (AcpiGbl_Optarg, NULL, 16);
696250757Sjkim        break;
697250757Sjkim
698250757Sjkim    case 'z':
699250757Sjkim
700250757Sjkim        Gbl_UseOriginalCompilerId = TRUE;
701250757Sjkim        break;
702250757Sjkim
703250757Sjkim    default:
704250757Sjkim
705250757Sjkim        return (-1);
706250757Sjkim    }
707250757Sjkim
708250757Sjkim    return (0);
709250757Sjkim}
710250757Sjkim
711250757Sjkim
712250757Sjkim/*******************************************************************************
713250757Sjkim *
714250757Sjkim * FUNCTION:    AslMergeOptionTokens
715250757Sjkim *
716250757Sjkim * PARAMETERS:  InBuffer            - Input containing an option string
717250757Sjkim *              OutBuffer           - Merged output buffer
718250757Sjkim *
719250757Sjkim * RETURN:      None
720250757Sjkim *
721250757Sjkim * DESCRIPTION: Remove all whitespace from an option string.
722250757Sjkim *
723250757Sjkim ******************************************************************************/
724250757Sjkim
725250757Sjkimstatic void
726250757SjkimAslMergeOptionTokens (
727250757Sjkim    char                    *InBuffer,
728250757Sjkim    char                    *OutBuffer)
729250757Sjkim{
730250757Sjkim    char                    *Token;
731250757Sjkim
732250757Sjkim
733250757Sjkim    *OutBuffer = 0;
734250757Sjkim
735250757Sjkim    Token = strtok (InBuffer, ASL_TOKEN_SEPARATORS);
736250757Sjkim    while (Token)
737250757Sjkim    {
738250757Sjkim        strcat (OutBuffer, Token);
739250757Sjkim        Token = strtok (NULL, ASL_TOKEN_SEPARATORS);
740250757Sjkim    }
741250757Sjkim}
742250757Sjkim
743250757Sjkim
744250757Sjkim/*******************************************************************************
745250757Sjkim *
746250757Sjkim * FUNCTION:    AslDoResponseFile
747250757Sjkim *
748250757Sjkim * PARAMETERS:  Filename        - Name of the response file
749250757Sjkim *
750250757Sjkim * RETURN:      Status
751250757Sjkim *
752250757Sjkim * DESCRIPTION: Open a response file and process all options within.
753250757Sjkim *
754250757Sjkim ******************************************************************************/
755250757Sjkim
756250757Sjkimstatic int
757250757SjkimAslDoResponseFile (
758250757Sjkim    char                    *Filename)
759250757Sjkim{
760250757Sjkim    char                    *argv = StringBuffer2;
761250757Sjkim    FILE                    *ResponseFile;
762250757Sjkim    int                     OptStatus = 0;
763250757Sjkim    int                     Opterr;
764250757Sjkim    int                     Optind;
765250757Sjkim
766250757Sjkim
767250757Sjkim    ResponseFile = fopen (Filename, "r");
768250757Sjkim    if (!ResponseFile)
769250757Sjkim    {
770250757Sjkim        printf ("Could not open command file %s, %s\n",
771250757Sjkim            Filename, strerror (errno));
772250757Sjkim        return (-1);
773250757Sjkim    }
774250757Sjkim
775250757Sjkim    /* Must save the current GetOpt globals */
776250757Sjkim
777250757Sjkim    Opterr = AcpiGbl_Opterr;
778250757Sjkim    Optind = AcpiGbl_Optind;
779250757Sjkim
780250757Sjkim    /*
781250757Sjkim     * Process all lines in the response file. There must be one complete
782250757Sjkim     * option per line
783250757Sjkim     */
784250757Sjkim    while (fgets (StringBuffer, ASL_MSG_BUFFER_SIZE, ResponseFile))
785250757Sjkim    {
786250757Sjkim        /* Compress all tokens, allowing us to use a single argv entry */
787250757Sjkim
788250757Sjkim        AslMergeOptionTokens (StringBuffer, StringBuffer2);
789250757Sjkim
790250757Sjkim        /* Process the option */
791250757Sjkim
792250757Sjkim        AcpiGbl_Opterr = 0;
793250757Sjkim        AcpiGbl_Optind = 0;
794250757Sjkim
795250757Sjkim        OptStatus = AslDoOptions (1, &argv, TRUE);
796250757Sjkim        if (OptStatus)
797250757Sjkim        {
798250757Sjkim            printf ("Invalid option in command file %s: %s\n",
799250757Sjkim                Filename, StringBuffer);
800250757Sjkim            break;
801250757Sjkim        }
802250757Sjkim    }
803250757Sjkim
804250757Sjkim    /* Restore the GetOpt globals */
805250757Sjkim
806250757Sjkim    AcpiGbl_Opterr = Opterr;
807250757Sjkim    AcpiGbl_Optind = Optind;
808250757Sjkim
809250757Sjkim    fclose (ResponseFile);
810250757Sjkim    return (OptStatus);
811250757Sjkim}
812