1250757Sjkim/******************************************************************************
2250757Sjkim *
3250757Sjkim * Module Name: asloptions - compiler command line processing
4250757Sjkim *
5250757Sjkim *****************************************************************************/
6250757Sjkim
7250757Sjkim/*
8306536Sjkim * Copyright (C) 2000 - 2016, 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"
71306536Sjkim#define ASL_SUPPORTED_OPTIONS   "@:a: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    {
110306536Sjkim        Status = DtCreateTemplates (argv);
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
187306536Sjkim    case 'a':   /* Debug options */
188306536Sjkim
189306536Sjkim        switch (AcpiGbl_Optarg[0])
190306536Sjkim        {
191306536Sjkim        case 'r':
192306536Sjkim
193306536Sjkim            Gbl_EnableReferenceTypechecking = TRUE;
194306536Sjkim            break;
195306536Sjkim
196306536Sjkim        default:
197306536Sjkim
198306536Sjkim            printf ("Unknown option: -a%s\n", AcpiGbl_Optarg);
199306536Sjkim            return (-1);
200306536Sjkim        }
201306536Sjkim
202306536Sjkim        break;
203306536Sjkim
204306536Sjkim
205281075Sdim    case 'b':   /* Debug options */
206250757Sjkim
207250757Sjkim        switch (AcpiGbl_Optarg[0])
208250757Sjkim        {
209250757Sjkim        case 'f':
210250757Sjkim
211250757Sjkim            AslCompilerdebug = 1; /* same as yydebug */
212250757Sjkim            DtParserdebug = 1;
213250757Sjkim            PrParserdebug = 1;
214281075Sdim            Gbl_DebugFlag = TRUE;
215306536Sjkim            Gbl_KeepPreprocessorTempFile = TRUE;
216250757Sjkim            break;
217250757Sjkim
218281075Sdim        case 'p':   /* Prune ASL parse tree */
219281075Sdim
220281075Sdim            /* Get the required argument */
221281075Sdim
222281075Sdim            if (AcpiGetoptArgument (argc, argv))
223281075Sdim            {
224281075Sdim                return (-1);
225281075Sdim            }
226281075Sdim
227281075Sdim            Gbl_PruneParseTree = TRUE;
228281075Sdim            Gbl_PruneDepth = (UINT8) strtoul (AcpiGbl_Optarg, NULL, 0);
229281075Sdim            break;
230281075Sdim
231281075Sdim        case 's':
232281075Sdim
233281075Sdim            Gbl_DebugFlag = TRUE;
234281075Sdim            break;
235281075Sdim
236250757Sjkim        case 't':
237250757Sjkim
238281075Sdim            /* Get the required argument */
239281075Sdim
240281075Sdim            if (AcpiGetoptArgument (argc, argv))
241281075Sdim            {
242281075Sdim                return (-1);
243281075Sdim            }
244281075Sdim
245281075Sdim            Gbl_PruneType = (UINT8) strtoul (AcpiGbl_Optarg, NULL, 0);
246250757Sjkim            break;
247250757Sjkim
248250757Sjkim        default:
249250757Sjkim
250250757Sjkim            printf ("Unknown option: -b%s\n", AcpiGbl_Optarg);
251250757Sjkim            return (-1);
252250757Sjkim        }
253250757Sjkim
254250757Sjkim        break;
255250757Sjkim
256250757Sjkim    case 'c':
257250757Sjkim
258250757Sjkim        switch (AcpiGbl_Optarg[0])
259250757Sjkim        {
260250757Sjkim        case 'r':
261250757Sjkim
262250757Sjkim            Gbl_NoResourceChecking = TRUE;
263250757Sjkim            break;
264250757Sjkim
265250757Sjkim        default:
266250757Sjkim
267250757Sjkim            printf ("Unknown option: -c%s\n", AcpiGbl_Optarg);
268250757Sjkim            return (-1);
269250757Sjkim        }
270250757Sjkim        break;
271250757Sjkim
272250757Sjkim    case 'd':   /* Disassembler */
273250757Sjkim
274250757Sjkim        switch (AcpiGbl_Optarg[0])
275250757Sjkim        {
276250757Sjkim        case '^':
277250757Sjkim
278250757Sjkim            Gbl_DoCompile = FALSE;
279250757Sjkim            break;
280250757Sjkim
281250757Sjkim        case 'a':
282250757Sjkim
283250757Sjkim            Gbl_DoCompile = FALSE;
284250757Sjkim            Gbl_DisassembleAll = TRUE;
285250757Sjkim            break;
286250757Sjkim
287250757Sjkim        case 'b':   /* Do not convert buffers to resource descriptors */
288250757Sjkim
289250757Sjkim            AcpiGbl_NoResourceDisassembly = TRUE;
290250757Sjkim            break;
291250757Sjkim
292250757Sjkim        case 'c':
293250757Sjkim
294250757Sjkim            break;
295250757Sjkim
296281687Sjkim        case 'f':
297281687Sjkim
298281687Sjkim            AcpiGbl_ForceAmlDisassembly = TRUE;
299281687Sjkim            break;
300281687Sjkim
301281075Sdim        case 'l':   /* Use legacy ASL code (not ASL+) for disassembly */
302281075Sdim
303281075Sdim            Gbl_DoCompile = FALSE;
304281075Sdim            AcpiGbl_CstyleDisassembly = FALSE;
305281075Sdim            break;
306281075Sdim
307250757Sjkim        default:
308250757Sjkim
309250757Sjkim            printf ("Unknown option: -d%s\n", AcpiGbl_Optarg);
310250757Sjkim            return (-1);
311250757Sjkim        }
312250757Sjkim
313250757Sjkim        Gbl_DisasmFlag = TRUE;
314250757Sjkim        break;
315250757Sjkim
316250757Sjkim    case 'D':   /* Define a symbol */
317250757Sjkim
318250757Sjkim        PrAddDefine (AcpiGbl_Optarg, NULL, TRUE);
319250757Sjkim        break;
320250757Sjkim
321250757Sjkim    case 'e':   /* External files for disassembler */
322250757Sjkim
323281075Sdim        /* Get entire list of external files */
324281075Sdim
325281075Sdim        AcpiGbl_Optind--;
326281075Sdim        argv[AcpiGbl_Optind] = AcpiGbl_Optarg;
327281075Sdim
328281075Sdim        while (argv[AcpiGbl_Optind] &&
329281075Sdim              (argv[AcpiGbl_Optind][0] != '-'))
330250757Sjkim        {
331281075Sdim            Status = AcpiDmAddToExternalFileList (argv[AcpiGbl_Optind]);
332281075Sdim            if (ACPI_FAILURE (Status))
333281075Sdim            {
334306536Sjkim                printf ("Could not add %s to external list\n",
335306536Sjkim                    argv[AcpiGbl_Optind]);
336281075Sdim                return (-1);
337281075Sdim            }
338281075Sdim
339281075Sdim            AcpiGbl_Optind++;
340250757Sjkim        }
341250757Sjkim        break;
342250757Sjkim
343254745Sjkim    case 'f':
344250757Sjkim
345254745Sjkim        switch (AcpiGbl_Optarg[0])
346254745Sjkim        {
347254745Sjkim        case '^':   /* Ignore errors and force creation of aml file */
348254745Sjkim
349254745Sjkim            Gbl_IgnoreErrors = TRUE;
350254745Sjkim            break;
351254745Sjkim
352254745Sjkim        case 'e':   /* Disassembler: Get external declaration file */
353254745Sjkim
354254745Sjkim            if (AcpiGetoptArgument (argc, argv))
355254745Sjkim            {
356254745Sjkim                return (-1);
357254745Sjkim            }
358254745Sjkim
359254745Sjkim            Gbl_ExternalRefFilename = AcpiGbl_Optarg;
360254745Sjkim            break;
361254745Sjkim
362254745Sjkim        default:
363254745Sjkim
364254745Sjkim            printf ("Unknown option: -f%s\n", AcpiGbl_Optarg);
365254745Sjkim            return (-1);
366254745Sjkim        }
367250757Sjkim        break;
368250757Sjkim
369250757Sjkim    case 'G':
370250757Sjkim
371250757Sjkim        Gbl_CompileGeneric = TRUE;
372250757Sjkim        break;
373250757Sjkim
374250757Sjkim    case 'g':   /* Get all ACPI tables */
375250757Sjkim
376281075Sdim        printf ("-g option is deprecated, use acpidump utility instead\n");
377281075Sdim        exit (1);
378250757Sjkim
379250757Sjkim    case 'h':
380250757Sjkim
381250757Sjkim        switch (AcpiGbl_Optarg[0])
382250757Sjkim        {
383250757Sjkim        case '^':
384250757Sjkim
385250757Sjkim            Usage ();
386250757Sjkim            exit (0);
387250757Sjkim
388250757Sjkim        case 'c':
389250757Sjkim
390250757Sjkim            UtDisplayConstantOpcodes ();
391250757Sjkim            exit (0);
392250757Sjkim
393250757Sjkim        case 'f':
394250757Sjkim
395250757Sjkim            AslFilenameHelp ();
396250757Sjkim            exit (0);
397250757Sjkim
398250757Sjkim        case 'r':
399250757Sjkim
400250757Sjkim            /* reserved names */
401250757Sjkim
402250757Sjkim            ApDisplayReservedNames ();
403250757Sjkim            exit (0);
404250757Sjkim
405250757Sjkim        case 't':
406250757Sjkim
407250757Sjkim            UtDisplaySupportedTables ();
408250757Sjkim            exit (0);
409250757Sjkim
410250757Sjkim        default:
411250757Sjkim
412250757Sjkim            printf ("Unknown option: -h%s\n", AcpiGbl_Optarg);
413250757Sjkim            return (-1);
414250757Sjkim        }
415250757Sjkim
416250757Sjkim    case 'I':   /* Add an include file search directory */
417250757Sjkim
418250757Sjkim        FlAddIncludeDirectory (AcpiGbl_Optarg);
419250757Sjkim        break;
420250757Sjkim
421250757Sjkim    case 'i':   /* Output AML as an include file */
422250757Sjkim
423250757Sjkim        switch (AcpiGbl_Optarg[0])
424250757Sjkim        {
425250757Sjkim        case 'a':
426250757Sjkim
427250757Sjkim            /* Produce assembly code include file */
428250757Sjkim
429250757Sjkim            Gbl_AsmIncludeOutputFlag = TRUE;
430250757Sjkim            break;
431250757Sjkim
432250757Sjkim        case 'c':
433250757Sjkim
434250757Sjkim            /* Produce C include file */
435250757Sjkim
436250757Sjkim            Gbl_C_IncludeOutputFlag = TRUE;
437250757Sjkim            break;
438250757Sjkim
439250757Sjkim        case 'n':
440250757Sjkim
441250757Sjkim            /* Compiler/Disassembler: Ignore the NOOP operator */
442250757Sjkim
443250757Sjkim            AcpiGbl_IgnoreNoopOperator = TRUE;
444250757Sjkim            break;
445250757Sjkim
446250757Sjkim        default:
447250757Sjkim
448250757Sjkim            printf ("Unknown option: -i%s\n", AcpiGbl_Optarg);
449250757Sjkim            return (-1);
450250757Sjkim        }
451250757Sjkim        break;
452250757Sjkim
453250757Sjkim    case 'l':   /* Listing files */
454250757Sjkim
455250757Sjkim        switch (AcpiGbl_Optarg[0])
456250757Sjkim        {
457250757Sjkim        case '^':
458250757Sjkim
459250757Sjkim            /* Produce listing file (Mixed source/aml) */
460250757Sjkim
461250757Sjkim            Gbl_ListingFlag = TRUE;
462306536Sjkim            AcpiGbl_DmOpt_Listing = TRUE;
463250757Sjkim            break;
464250757Sjkim
465250757Sjkim        case 'i':
466250757Sjkim
467250757Sjkim            /* Produce preprocessor output file */
468250757Sjkim
469250757Sjkim            Gbl_PreprocessorOutputFlag = TRUE;
470250757Sjkim            break;
471250757Sjkim
472281075Sdim        case 'm':
473281075Sdim
474281075Sdim            /* Produce hardware map summary file */
475281075Sdim
476281075Sdim            Gbl_MapfileFlag = TRUE;
477281075Sdim            break;
478281075Sdim
479250757Sjkim        case 'n':
480250757Sjkim
481250757Sjkim            /* Produce namespace file */
482250757Sjkim
483250757Sjkim            Gbl_NsOutputFlag = TRUE;
484250757Sjkim            break;
485250757Sjkim
486250757Sjkim        case 's':
487250757Sjkim
488250757Sjkim            /* Produce combined source file */
489250757Sjkim
490250757Sjkim            Gbl_SourceOutputFlag = TRUE;
491250757Sjkim            break;
492250757Sjkim
493306536Sjkim        case 'x':
494306536Sjkim
495306536Sjkim            /* Produce cross-reference file */
496306536Sjkim
497306536Sjkim            Gbl_CrossReferenceOutput = TRUE;
498306536Sjkim            break;
499306536Sjkim
500250757Sjkim        default:
501250757Sjkim
502250757Sjkim            printf ("Unknown option: -l%s\n", AcpiGbl_Optarg);
503250757Sjkim            return (-1);
504250757Sjkim        }
505250757Sjkim        break;
506250757Sjkim
507250757Sjkim    case 'm':   /* Set line buffer size */
508250757Sjkim
509250757Sjkim        Gbl_LineBufferSize = (UINT32) strtoul (AcpiGbl_Optarg, NULL, 0) * 1024;
510250757Sjkim        if (Gbl_LineBufferSize < ASL_DEFAULT_LINE_BUFFER_SIZE)
511250757Sjkim        {
512250757Sjkim            Gbl_LineBufferSize = ASL_DEFAULT_LINE_BUFFER_SIZE;
513250757Sjkim        }
514250757Sjkim        printf ("Line Buffer Size: %u\n", Gbl_LineBufferSize);
515250757Sjkim        break;
516250757Sjkim
517250757Sjkim    case 'n':   /* Parse only */
518250757Sjkim
519250757Sjkim        Gbl_ParseOnlyFlag = TRUE;
520250757Sjkim        break;
521250757Sjkim
522250757Sjkim    case 'o':   /* Control compiler AML optimizations */
523250757Sjkim
524250757Sjkim        switch (AcpiGbl_Optarg[0])
525250757Sjkim        {
526250757Sjkim        case 'a':
527250757Sjkim
528250757Sjkim            /* Disable all optimizations */
529250757Sjkim
530250757Sjkim            Gbl_FoldConstants = FALSE;
531250757Sjkim            Gbl_IntegerOptimizationFlag = FALSE;
532250757Sjkim            Gbl_ReferenceOptimizationFlag = FALSE;
533250757Sjkim            break;
534250757Sjkim
535306536Sjkim        case 'c':
536306536Sjkim
537306536Sjkim            /* Display compile time(s) */
538306536Sjkim
539306536Sjkim            Gbl_CompileTimesFlag = TRUE;
540306536Sjkim            break;
541306536Sjkim
542306536Sjkim        case 'e':
543306536Sjkim
544306536Sjkim            /* iASL: Disable External opcode generation */
545306536Sjkim
546306536Sjkim            Gbl_DoExternals = FALSE;
547306536Sjkim
548306536Sjkim            /* Disassembler: Emit embedded external operators */
549306536Sjkim
550306536Sjkim            AcpiGbl_DmEmitExternalOpcodes = TRUE;
551306536Sjkim            break;
552306536Sjkim
553250757Sjkim        case 'f':
554250757Sjkim
555250757Sjkim            /* Disable folding on "normal" expressions */
556250757Sjkim
557250757Sjkim            Gbl_FoldConstants = FALSE;
558250757Sjkim            break;
559250757Sjkim
560250757Sjkim        case 'i':
561250757Sjkim
562250757Sjkim            /* Disable integer optimization to constants */
563250757Sjkim
564250757Sjkim            Gbl_IntegerOptimizationFlag = FALSE;
565250757Sjkim            break;
566250757Sjkim
567250757Sjkim        case 'n':
568250757Sjkim
569250757Sjkim            /* Disable named reference optimization */
570250757Sjkim
571250757Sjkim            Gbl_ReferenceOptimizationFlag = FALSE;
572250757Sjkim            break;
573250757Sjkim
574250757Sjkim        case 't':
575250757Sjkim
576306536Sjkim            /* Disable heavy typechecking */
577250757Sjkim
578306536Sjkim            Gbl_DoTypechecking = FALSE;
579250757Sjkim            break;
580250757Sjkim
581250757Sjkim        default:
582250757Sjkim
583250757Sjkim            printf ("Unknown option: -c%s\n", AcpiGbl_Optarg);
584250757Sjkim            return (-1);
585250757Sjkim        }
586250757Sjkim        break;
587250757Sjkim
588250757Sjkim    case 'P':   /* Preprocessor options */
589250757Sjkim
590250757Sjkim        switch (AcpiGbl_Optarg[0])
591250757Sjkim        {
592250757Sjkim        case '^':   /* Proprocess only, emit (.i) file */
593250757Sjkim
594250757Sjkim            Gbl_PreprocessOnly = TRUE;
595250757Sjkim            Gbl_PreprocessorOutputFlag = TRUE;
596250757Sjkim            break;
597250757Sjkim
598250757Sjkim        case 'n':   /* Disable preprocessor */
599250757Sjkim
600250757Sjkim            Gbl_PreprocessFlag = FALSE;
601250757Sjkim            break;
602250757Sjkim
603250757Sjkim        default:
604250757Sjkim
605250757Sjkim            printf ("Unknown option: -P%s\n", AcpiGbl_Optarg);
606250757Sjkim            return (-1);
607250757Sjkim        }
608250757Sjkim        break;
609250757Sjkim
610250757Sjkim    case 'p':   /* Override default AML output filename */
611250757Sjkim
612250757Sjkim        Gbl_OutputFilenamePrefix = AcpiGbl_Optarg;
613281075Sdim        UtConvertBackslashes (Gbl_OutputFilenamePrefix);
614250757Sjkim        Gbl_UseDefaultAmlFilename = FALSE;
615250757Sjkim        break;
616250757Sjkim
617250757Sjkim    case 'r':   /* Override revision found in table header */
618250757Sjkim
619250757Sjkim        Gbl_RevisionOverride = (UINT8) strtoul (AcpiGbl_Optarg, NULL, 0);
620250757Sjkim        break;
621250757Sjkim
622250757Sjkim    case 's':   /* Create AML in a source code file */
623250757Sjkim
624250757Sjkim        switch (AcpiGbl_Optarg[0])
625250757Sjkim        {
626250757Sjkim        case 'a':
627250757Sjkim
628250757Sjkim            /* Produce assembly code output file */
629250757Sjkim
630250757Sjkim            Gbl_AsmOutputFlag = TRUE;
631250757Sjkim            break;
632250757Sjkim
633250757Sjkim        case 'c':
634250757Sjkim
635250757Sjkim            /* Produce C hex output file */
636250757Sjkim
637250757Sjkim            Gbl_C_OutputFlag = TRUE;
638250757Sjkim            break;
639250757Sjkim
640250757Sjkim        case 'o':
641250757Sjkim
642250757Sjkim            /* Produce AML offset table in C */
643250757Sjkim
644250757Sjkim            Gbl_C_OffsetTableFlag = TRUE;
645250757Sjkim            break;
646250757Sjkim
647250757Sjkim        default:
648250757Sjkim
649250757Sjkim            printf ("Unknown option: -s%s\n", AcpiGbl_Optarg);
650250757Sjkim            return (-1);
651250757Sjkim        }
652250757Sjkim        break;
653250757Sjkim
654250757Sjkim    case 't':   /* Produce hex table output file */
655250757Sjkim
656250757Sjkim        switch (AcpiGbl_Optarg[0])
657250757Sjkim        {
658250757Sjkim        case 'a':
659250757Sjkim
660250757Sjkim            Gbl_HexOutputFlag = HEX_OUTPUT_ASM;
661250757Sjkim            break;
662250757Sjkim
663250757Sjkim        case 'c':
664250757Sjkim
665250757Sjkim            Gbl_HexOutputFlag = HEX_OUTPUT_C;
666250757Sjkim            break;
667250757Sjkim
668250757Sjkim        case 's':
669250757Sjkim
670250757Sjkim            Gbl_HexOutputFlag = HEX_OUTPUT_ASL;
671250757Sjkim            break;
672250757Sjkim
673250757Sjkim        default:
674250757Sjkim
675250757Sjkim            printf ("Unknown option: -t%s\n", AcpiGbl_Optarg);
676250757Sjkim            return (-1);
677250757Sjkim        }
678250757Sjkim        break;
679250757Sjkim
680250757Sjkim    case 'T':   /* Create a ACPI table template file */
681250757Sjkim
682250757Sjkim        Gbl_DoTemplates = TRUE;
683250757Sjkim        break;
684250757Sjkim
685250757Sjkim    case 'v':   /* Version and verbosity settings */
686250757Sjkim
687250757Sjkim        switch (AcpiGbl_Optarg[0])
688250757Sjkim        {
689250757Sjkim        case '^':
690250757Sjkim
691250757Sjkim            printf (ACPI_COMMON_SIGNON (ASL_COMPILER_NAME));
692250757Sjkim            exit (0);
693250757Sjkim
694250757Sjkim        case 'a':
695250757Sjkim
696281075Sdim            /* Disable all error/warning/remark messages */
697250757Sjkim
698250757Sjkim            Gbl_NoErrors = TRUE;
699250757Sjkim            break;
700250757Sjkim
701281075Sdim        case 'e':
702281075Sdim
703281075Sdim            /* Disable all warning/remark messages (errors only) */
704281075Sdim
705281075Sdim            Gbl_DisplayRemarks = FALSE;
706281075Sdim            Gbl_DisplayWarnings = FALSE;
707281075Sdim            break;
708281075Sdim
709250757Sjkim        case 'i':
710250757Sjkim            /*
711250757Sjkim             * Support for integrated development environment(s).
712250757Sjkim             *
713250757Sjkim             * 1) No compiler signon
714250757Sjkim             * 2) Send stderr messages to stdout
715250757Sjkim             * 3) Less verbose error messages (single line only for each)
716250757Sjkim             * 4) Error/warning messages are formatted appropriately to
717250757Sjkim             *    be recognized by MS Visual Studio
718250757Sjkim             */
719250757Sjkim            Gbl_VerboseErrors = FALSE;
720250757Sjkim            Gbl_DoSignon = FALSE;
721250757Sjkim            Gbl_Files[ASL_FILE_STDERR].Handle = stdout;
722250757Sjkim            break;
723250757Sjkim
724250757Sjkim        case 'o':
725250757Sjkim
726250757Sjkim            Gbl_DisplayOptimizations = TRUE;
727250757Sjkim            break;
728250757Sjkim
729250757Sjkim        case 'r':
730250757Sjkim
731250757Sjkim            Gbl_DisplayRemarks = FALSE;
732250757Sjkim            break;
733250757Sjkim
734250757Sjkim        case 's':
735250757Sjkim
736250757Sjkim            Gbl_DoSignon = FALSE;
737250757Sjkim            break;
738250757Sjkim
739250757Sjkim        case 't':
740250757Sjkim
741250757Sjkim            Gbl_VerboseTemplates = TRUE;
742250757Sjkim            break;
743250757Sjkim
744250757Sjkim        case 'w':
745250757Sjkim
746250757Sjkim            /* Get the required argument */
747250757Sjkim
748250757Sjkim            if (AcpiGetoptArgument (argc, argv))
749250757Sjkim            {
750250757Sjkim                return (-1);
751250757Sjkim            }
752250757Sjkim
753250757Sjkim            Status = AslDisableException (AcpiGbl_Optarg);
754250757Sjkim            if (ACPI_FAILURE (Status))
755250757Sjkim            {
756250757Sjkim                return (-1);
757250757Sjkim            }
758250757Sjkim            break;
759250757Sjkim
760250757Sjkim        default:
761250757Sjkim
762250757Sjkim            printf ("Unknown option: -v%s\n", AcpiGbl_Optarg);
763250757Sjkim            return (-1);
764250757Sjkim        }
765250757Sjkim        break;
766250757Sjkim
767250757Sjkim    case 'w': /* Set warning levels */
768250757Sjkim
769250757Sjkim        switch (AcpiGbl_Optarg[0])
770250757Sjkim        {
771250757Sjkim        case '1':
772250757Sjkim
773250757Sjkim            Gbl_WarningLevel = ASL_WARNING;
774250757Sjkim            break;
775250757Sjkim
776250757Sjkim        case '2':
777250757Sjkim
778250757Sjkim            Gbl_WarningLevel = ASL_WARNING2;
779250757Sjkim            break;
780250757Sjkim
781250757Sjkim        case '3':
782250757Sjkim
783250757Sjkim            Gbl_WarningLevel = ASL_WARNING3;
784250757Sjkim            break;
785250757Sjkim
786250757Sjkim        case 'e':
787250757Sjkim
788250757Sjkim            Gbl_WarningsAsErrors = TRUE;
789250757Sjkim            break;
790250757Sjkim
791250757Sjkim        default:
792250757Sjkim
793250757Sjkim            printf ("Unknown option: -w%s\n", AcpiGbl_Optarg);
794250757Sjkim            return (-1);
795250757Sjkim        }
796250757Sjkim        break;
797250757Sjkim
798250757Sjkim    case 'x':   /* Set debug print output level */
799250757Sjkim
800250757Sjkim        AcpiDbgLevel = strtoul (AcpiGbl_Optarg, NULL, 16);
801250757Sjkim        break;
802250757Sjkim
803250757Sjkim    case 'z':
804250757Sjkim
805250757Sjkim        Gbl_UseOriginalCompilerId = TRUE;
806250757Sjkim        break;
807250757Sjkim
808250757Sjkim    default:
809250757Sjkim
810250757Sjkim        return (-1);
811250757Sjkim    }
812250757Sjkim
813250757Sjkim    return (0);
814250757Sjkim}
815250757Sjkim
816250757Sjkim
817250757Sjkim/*******************************************************************************
818250757Sjkim *
819250757Sjkim * FUNCTION:    AslMergeOptionTokens
820250757Sjkim *
821250757Sjkim * PARAMETERS:  InBuffer            - Input containing an option string
822250757Sjkim *              OutBuffer           - Merged output buffer
823250757Sjkim *
824250757Sjkim * RETURN:      None
825250757Sjkim *
826250757Sjkim * DESCRIPTION: Remove all whitespace from an option string.
827250757Sjkim *
828250757Sjkim ******************************************************************************/
829250757Sjkim
830250757Sjkimstatic void
831250757SjkimAslMergeOptionTokens (
832250757Sjkim    char                    *InBuffer,
833250757Sjkim    char                    *OutBuffer)
834250757Sjkim{
835250757Sjkim    char                    *Token;
836250757Sjkim
837250757Sjkim
838250757Sjkim    *OutBuffer = 0;
839250757Sjkim
840250757Sjkim    Token = strtok (InBuffer, ASL_TOKEN_SEPARATORS);
841250757Sjkim    while (Token)
842250757Sjkim    {
843250757Sjkim        strcat (OutBuffer, Token);
844250757Sjkim        Token = strtok (NULL, ASL_TOKEN_SEPARATORS);
845250757Sjkim    }
846250757Sjkim}
847250757Sjkim
848250757Sjkim
849250757Sjkim/*******************************************************************************
850250757Sjkim *
851250757Sjkim * FUNCTION:    AslDoResponseFile
852250757Sjkim *
853250757Sjkim * PARAMETERS:  Filename        - Name of the response file
854250757Sjkim *
855250757Sjkim * RETURN:      Status
856250757Sjkim *
857250757Sjkim * DESCRIPTION: Open a response file and process all options within.
858250757Sjkim *
859250757Sjkim ******************************************************************************/
860250757Sjkim
861250757Sjkimstatic int
862250757SjkimAslDoResponseFile (
863250757Sjkim    char                    *Filename)
864250757Sjkim{
865250757Sjkim    char                    *argv = StringBuffer2;
866250757Sjkim    FILE                    *ResponseFile;
867250757Sjkim    int                     OptStatus = 0;
868250757Sjkim    int                     Opterr;
869250757Sjkim    int                     Optind;
870250757Sjkim
871250757Sjkim
872250757Sjkim    ResponseFile = fopen (Filename, "r");
873250757Sjkim    if (!ResponseFile)
874250757Sjkim    {
875250757Sjkim        printf ("Could not open command file %s, %s\n",
876250757Sjkim            Filename, strerror (errno));
877250757Sjkim        return (-1);
878250757Sjkim    }
879250757Sjkim
880250757Sjkim    /* Must save the current GetOpt globals */
881250757Sjkim
882250757Sjkim    Opterr = AcpiGbl_Opterr;
883250757Sjkim    Optind = AcpiGbl_Optind;
884250757Sjkim
885250757Sjkim    /*
886250757Sjkim     * Process all lines in the response file. There must be one complete
887250757Sjkim     * option per line
888250757Sjkim     */
889250757Sjkim    while (fgets (StringBuffer, ASL_MSG_BUFFER_SIZE, ResponseFile))
890250757Sjkim    {
891250757Sjkim        /* Compress all tokens, allowing us to use a single argv entry */
892250757Sjkim
893250757Sjkim        AslMergeOptionTokens (StringBuffer, StringBuffer2);
894250757Sjkim
895250757Sjkim        /* Process the option */
896250757Sjkim
897250757Sjkim        AcpiGbl_Opterr = 0;
898250757Sjkim        AcpiGbl_Optind = 0;
899250757Sjkim
900250757Sjkim        OptStatus = AslDoOptions (1, &argv, TRUE);
901250757Sjkim        if (OptStatus)
902250757Sjkim        {
903250757Sjkim            printf ("Invalid option in command file %s: %s\n",
904250757Sjkim                Filename, StringBuffer);
905250757Sjkim            break;
906250757Sjkim        }
907250757Sjkim    }
908250757Sjkim
909250757Sjkim    /* Restore the GetOpt globals */
910250757Sjkim
911250757Sjkim    AcpiGbl_Opterr = Opterr;
912250757Sjkim    AcpiGbl_Optind = Optind;
913250757Sjkim
914250757Sjkim    fclose (ResponseFile);
915250757Sjkim    return (OptStatus);
916250757Sjkim}
917