xref: /netbsd-src/sys/external/bsd/acpica/dist/compiler/asloptions.c (revision f4748aaa01faf324805f9747191535eb6600f82c)
1 /******************************************************************************
2  *
3  * Module Name: asloptions - compiler command line processing
4  *
5  *****************************************************************************/
6 
7 /*
8  * Copyright (C) 2000 - 2022, Intel Corp.
9  * All rights reserved.
10  *
11  * Redistribution and use in source and binary forms, with or without
12  * modification, are permitted provided that the following conditions
13  * are met:
14  * 1. Redistributions of source code must retain the above copyright
15  *    notice, this list of conditions, and the following disclaimer,
16  *    without modification.
17  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
18  *    substantially similar to the "NO WARRANTY" disclaimer below
19  *    ("Disclaimer") and any redistribution must be conditioned upon
20  *    including a substantially similar Disclaimer requirement for further
21  *    binary redistribution.
22  * 3. Neither the names of the above-listed copyright holders nor the names
23  *    of any contributors may be used to endorse or promote products derived
24  *    from this software without specific prior written permission.
25  *
26  * Alternatively, this software may be distributed under the terms of the
27  * GNU General Public License ("GPL") version 2 as published by the Free
28  * Software Foundation.
29  *
30  * NO WARRANTY
31  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
32  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
33  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
34  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
35  * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
36  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
37  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
38  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
39  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
40  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
41  * POSSIBILITY OF SUCH DAMAGES.
42  */
43 
44 #include "aslcompiler.h"
45 #include "acapps.h"
46 #include "acdisasm.h"
47 #include "acglobal.h"
48 
49 #define _COMPONENT          ACPI_COMPILER
50         ACPI_MODULE_NAME    ("asloption")
51 
52 
53 /* Local prototypes */
54 
55 static int
56 AslDoOptions (
57     int                     argc,
58     char                    **argv,
59     BOOLEAN                 IsResponseFile);
60 
61 static void
62 AslMergeOptionTokens (
63     char                    *InBuffer,
64     char                    *OutBuffer);
65 
66 static int
67 AslDoResponseFile (
68     char                    *Filename);
69 
70 
71 #define ASL_TOKEN_SEPARATORS    " \t\n"
72 #define ASL_SUPPORTED_OPTIONS   "@:a:b|c|d^D:e:f^gh^i|I:l^m:no|p:P^q^r:s|:t|T+G^v^w|x:z"
73 
74 
75 /*******************************************************************************
76  *
77  * FUNCTION:    AslCommandLine
78  *
79  * PARAMETERS:  argc/argv
80  *
81  * RETURN:      Last argv index
82  *
83  * DESCRIPTION: Command line processing
84  *
85  ******************************************************************************/
86 
87 int
88 AslCommandLine (
89     int                     argc,
90     char                    **argv)
91 {
92     int                     BadCommandLine = 0;
93     ACPI_STATUS             Status;
94 
95 
96     /* Minimum command line contains at least the command and an input file */
97 
98     if (argc < 2)
99     {
100         Usage ();
101         exit (1);
102     }
103 
104     /* Process all command line options */
105 
106     BadCommandLine = AslDoOptions (argc, argv, FALSE);
107 
108     if (AslGbl_DoTemplates)
109     {
110         Status = DtCreateTemplates (argv);
111         if (ACPI_FAILURE (Status))
112         {
113             exit (-1);
114         }
115         exit (0);
116     }
117 
118     /* Next parameter must be the input filename */
119 
120     if (!argv[AcpiGbl_Optind] &&
121         !AcpiGbl_DisasmFlag)
122     {
123         printf ("Missing input filename\n");
124         BadCommandLine = TRUE;
125     }
126 
127     if (AslGbl_DoSignon)
128     {
129         printf (ACPI_COMMON_SIGNON (ASL_COMPILER_NAME));
130         if (AslGbl_IgnoreErrors)
131         {
132             printf ("Ignoring all errors, forcing AML file generation\n\n");
133         }
134     }
135 
136     if (BadCommandLine)
137     {
138         printf ("Use -h option for help information\n");
139         exit (1);
140     }
141 
142     return (AcpiGbl_Optind);
143 }
144 
145 
146 /*******************************************************************************
147  *
148  * FUNCTION:    AslDoOptions
149  *
150  * PARAMETERS:  argc/argv           - Standard argc/argv
151  *              IsResponseFile      - TRUE if executing a response file.
152  *
153  * RETURN:      Status
154  *
155  * DESCRIPTION: Command line option processing
156  *
157  ******************************************************************************/
158 
159 static int
160 AslDoOptions (
161     int                     argc,
162     char                    **argv,
163     BOOLEAN                 IsResponseFile)
164 {
165     ACPI_STATUS             Status;
166     INT32                  j;
167 
168 
169     /* Get the command line options */
170 
171     while ((j = AcpiGetopt (argc, argv, ASL_SUPPORTED_OPTIONS)) != ACPI_OPT_END) switch (j)
172     {
173     case '@':   /* Begin a response file */
174 
175         if (IsResponseFile)
176         {
177             printf ("Nested command files are not supported\n");
178             return (-1);
179         }
180 
181         if (AslDoResponseFile (AcpiGbl_Optarg))
182         {
183             return (-1);
184         }
185         break;
186 
187     case 'a':   /* Debug options */
188 
189         switch (AcpiGbl_Optarg[0])
190         {
191         case 'r':
192 
193             AslGbl_EnableReferenceTypechecking = TRUE;
194             break;
195 
196         default:
197 
198             printf ("Unknown option: -a%s\n", AcpiGbl_Optarg);
199             return (-1);
200         }
201 
202         break;
203 
204 
205     case 'b':   /* Debug options */
206 
207         switch (AcpiGbl_Optarg[0])
208         {
209 
210         case 'c':
211 
212             printf ("Debug ASL to ASL+ conversion\n");
213 
214             AslGbl_DoAslConversion = TRUE;
215             AslGbl_FoldConstants = FALSE;
216             AslGbl_IntegerOptimizationFlag = FALSE;
217             AslGbl_ReferenceOptimizationFlag = FALSE;
218             AslGbl_OptimizeTrivialParseNodes = FALSE;
219             AcpiGbl_CaptureComments = TRUE;
220             AcpiGbl_DoDisassemblerOptimizations = FALSE;
221             AcpiGbl_DebugAslConversion = TRUE;
222             AcpiGbl_DmEmitExternalOpcodes = TRUE;
223             AslGbl_DoExternalsInPlace = TRUE;
224 
225             return (0);
226 
227         case 'f':
228 
229             AslCompilerdebug = 1; /* same as yydebug */
230             DtParserdebug = 1;
231             PrParserdebug = 1;
232             AslGbl_DebugFlag = TRUE;
233             AslGbl_KeepPreprocessorTempFile = TRUE;
234             break;
235 
236         case 'p':   /* Prune ASL parse tree */
237 
238             /* Get the required argument */
239 
240             if (AcpiGetoptArgument (argc, argv))
241             {
242                 return (-1);
243             }
244 
245             AslGbl_PruneParseTree = TRUE;
246             AslGbl_PruneDepth = (UINT8) strtoul (AcpiGbl_Optarg, NULL, 0);
247             break;
248 
249         case 's':
250 
251             AslGbl_DebugFlag = TRUE;
252             break;
253 
254         case 't':
255 
256             /* Get the required argument */
257 
258             if (AcpiGetoptArgument (argc, argv))
259             {
260                 return (-1);
261             }
262             AslGbl_PruneType = (UINT8) strtoul (AcpiGbl_Optarg, NULL, 0);
263             break;
264 
265         default:
266 
267             printf ("Unknown option: -b%s\n", AcpiGbl_Optarg);
268             return (-1);
269         }
270 
271         break;
272 
273     case 'c':
274 
275         switch (AcpiGbl_Optarg[0])
276         {
277 
278         case 'a':
279 
280             printf ("Convert ASL to ASL+ with comments\n");
281             AslGbl_DoAslConversion = TRUE;
282             AslGbl_FoldConstants = FALSE;
283             AslGbl_IntegerOptimizationFlag = FALSE;
284             AslGbl_ReferenceOptimizationFlag = FALSE;
285             AslGbl_OptimizeTrivialParseNodes = FALSE;
286             AcpiGbl_CaptureComments = TRUE;
287             AcpiGbl_DoDisassemblerOptimizations = FALSE;
288             AcpiGbl_DmEmitExternalOpcodes = TRUE;
289             AslGbl_DoExternalsInPlace = TRUE;
290 
291             return (0);
292 
293         case 'r':
294 
295             AslGbl_NoResourceChecking = TRUE;
296             break;
297 
298         default:
299 
300             printf ("Unknown option: -c%s\n", AcpiGbl_Optarg);
301             return (-1);
302         }
303         break;
304 
305     case 'd':   /* Disassembler */
306 
307         switch (AcpiGbl_Optarg[0])
308         {
309         case '^':
310 
311             AslGbl_DoCompile = FALSE;
312             break;
313 
314         case 'a':
315 
316             AslGbl_DoCompile = FALSE;
317             AslGbl_DisassembleAll = TRUE;
318             break;
319 
320         case 'b':   /* Do not convert buffers to resource descriptors */
321 
322             AcpiGbl_NoResourceDisassembly = TRUE;
323             break;
324 
325         case 'c':
326 
327             break;
328 
329         case 'f':
330 
331             AcpiGbl_ForceAmlDisassembly = TRUE;
332             break;
333 
334         case 'l':   /* Use legacy ASL code (not ASL+) for disassembly */
335 
336             AslGbl_DoCompile = FALSE;
337             AcpiGbl_CstyleDisassembly = FALSE;
338             break;
339 
340         case 's':   /* Specify table signature (Only supported for CDAT table) */
341 
342             /* Get the required argument */
343 
344             if (AcpiGetoptArgument (argc, argv))
345             {
346                 return (-1);
347             }
348 
349             /* Check for exact string "CDAT" (upper or lower case) */
350 
351             AcpiGbl_CDAT = ACPI_CAST_PTR (char, &AcpiGbl_Optarg);
352             if (AcpiUtStricmp (AcpiGbl_Optarg, ACPI_SIG_CDAT))
353             {
354                 printf ("\nUnknown table signature: %s\n", AcpiGbl_Optarg);
355                 return (-1);
356             }
357 
358             AcpiGbl_CDAT = malloc (5);
359             AcpiUtSafeStrncpy ((char *) AcpiGbl_CDAT, ACPI_SIG_CDAT, 5);
360             break;
361 
362         default:
363 
364             printf ("Unknown option: -d%s\n", AcpiGbl_Optarg);
365             return (-1);
366         }
367 
368         AcpiGbl_DisasmFlag = TRUE;
369         break;
370 
371     case 'D':   /* Define a symbol */
372 
373         PrAddDefine (AcpiGbl_Optarg, NULL, TRUE);
374         break;
375 
376     case 'e':   /* External files for disassembler */
377 
378         /* Get entire list of external files */
379 
380         AcpiGbl_Optind--;
381         argv[AcpiGbl_Optind] = AcpiGbl_Optarg;
382 
383         while (argv[AcpiGbl_Optind] &&
384               (argv[AcpiGbl_Optind][0] != '-'))
385         {
386             Status = AcpiDmAddToExternalFileList (argv[AcpiGbl_Optind]);
387             if (ACPI_FAILURE (Status))
388             {
389                 printf ("Could not add %s to external list\n",
390                     argv[AcpiGbl_Optind]);
391                 return (-1);
392             }
393 
394             AcpiGbl_Optind++;
395         }
396         break;
397 
398     case 'f':
399 
400         switch (AcpiGbl_Optarg[0])
401         {
402         case '^':   /* Ignore errors and force creation of aml file */
403 
404             AslGbl_IgnoreErrors = TRUE;
405             break;
406 
407         case 'e':   /* Disassembler: Get external declaration file */
408 
409             if (AcpiGetoptArgument (argc, argv))
410             {
411                 return (-1);
412             }
413 
414             AslGbl_ExternalRefFilename = AcpiGbl_Optarg;
415             break;
416 
417         default:
418 
419             printf ("Unknown option: -f%s\n", AcpiGbl_Optarg);
420             return (-1);
421         }
422         break;
423 
424     case 'G':
425 
426         AslGbl_CompileGeneric = TRUE;
427         break;
428 
429     case 'g':   /* Get all ACPI tables */
430 
431         printf ("-g option is deprecated, use acpidump utility instead\n");
432         exit (1);
433 
434     case 'h':
435 
436         switch (AcpiGbl_Optarg[0])
437         {
438         case '^':
439 
440             Usage ();
441             exit (0);
442 
443         case 'c':
444 
445             UtDisplayConstantOpcodes ();
446             exit (0);
447 
448         case 'd':
449 
450             AslDisassemblyHelp ();
451             exit (0);
452 
453         case 'f':
454 
455             AslFilenameHelp ();
456             exit (0);
457 
458         case 'r':
459 
460             /* reserved names */
461 
462             ApDisplayReservedNames ();
463             exit (0);
464 
465         case 't':
466 
467             UtDisplaySupportedTables ();
468             exit (0);
469 
470         default:
471 
472             printf ("Unknown option: -h%s\n", AcpiGbl_Optarg);
473             return (-1);
474         }
475 
476     case 'I':   /* Add an include file search directory */
477 
478         FlAddIncludeDirectory (AcpiGbl_Optarg);
479         break;
480 
481     case 'i':   /* Output AML as an include file */
482 
483         switch (AcpiGbl_Optarg[0])
484         {
485         case 'a':
486 
487             /* Produce assembly code include file */
488 
489             AslGbl_AsmIncludeOutputFlag = TRUE;
490             break;
491 
492         case 'c':
493 
494             /* Produce C include file */
495 
496             AslGbl_C_IncludeOutputFlag = TRUE;
497             break;
498 
499         case 'n':
500 
501             /* Compiler/Disassembler: Ignore the NOOP operator */
502 
503             AcpiGbl_IgnoreNoopOperator = TRUE;
504             break;
505 
506         default:
507 
508             printf ("Unknown option: -i%s\n", AcpiGbl_Optarg);
509             return (-1);
510         }
511         break;
512 
513     case 'l':   /* Listing files */
514 
515         switch (AcpiGbl_Optarg[0])
516         {
517         case '^':
518 
519             /* Produce listing file (Mixed source/aml) */
520 
521             AslGbl_ListingFlag = TRUE;
522             AcpiGbl_DmOpt_Listing = TRUE;
523             break;
524 
525         case 'i':
526 
527             /* Produce preprocessor output file */
528 
529             AslGbl_PreprocessorOutputFlag = TRUE;
530             break;
531 
532         case 'm':
533 
534             /* Produce hardware map summary file */
535 
536             AslGbl_MapfileFlag = TRUE;
537             break;
538 
539         case 'n':
540 
541             /* Produce namespace file */
542 
543             AslGbl_NsOutputFlag = TRUE;
544             break;
545 
546         case 's':
547 
548             /* Produce combined source file */
549 
550             AslGbl_SourceOutputFlag = TRUE;
551             break;
552 
553         case 'x':
554 
555             /* Produce cross-reference file */
556 
557             AslGbl_CrossReferenceOutput = TRUE;
558             break;
559 
560         default:
561 
562             printf ("Unknown option: -l%s\n", AcpiGbl_Optarg);
563             return (-1);
564         }
565         break;
566 
567     case 'm':   /* Set line buffer size */
568 
569         AslGbl_LineBufferSize = (UINT32) strtoul (AcpiGbl_Optarg, NULL, 0) * 1024;
570         if (AslGbl_LineBufferSize < ASL_DEFAULT_LINE_BUFFER_SIZE)
571         {
572             AslGbl_LineBufferSize = ASL_DEFAULT_LINE_BUFFER_SIZE;
573         }
574         printf ("Line Buffer Size: %u\n", AslGbl_LineBufferSize);
575         break;
576 
577     case 'n':   /* Parse only */
578 
579         AslGbl_ParseOnlyFlag = TRUE;
580         break;
581 
582     case 'o':   /* Control compiler AML optimizations */
583 
584         switch (AcpiGbl_Optarg[0])
585         {
586         case 'a':
587 
588             /* Disable all optimizations */
589 
590             AslGbl_FoldConstants = FALSE;
591             AslGbl_IntegerOptimizationFlag = FALSE;
592             AslGbl_ReferenceOptimizationFlag = FALSE;
593             AslGbl_OptimizeTrivialParseNodes = FALSE;
594 
595             break;
596 
597         case 'c':
598 
599             /* Display compile time(s) */
600 
601             AslGbl_CompileTimesFlag = TRUE;
602             break;
603 
604         case 'd':
605 
606             /* Disable disassembler code optimizations */
607 
608             AcpiGbl_DoDisassemblerOptimizations = FALSE;
609             break;
610 
611         case 'e':
612 
613             /* Disassembler: Emit embedded external operators */
614 
615             AcpiGbl_DmEmitExternalOpcodes = TRUE;
616             break;
617 
618         case 'E':
619 
620             /*
621              * iASL: keep External opcodes in place.
622              * No affect if Gbl_DoExternals is false.
623              */
624 
625             AslGbl_DoExternalsInPlace = TRUE;
626             break;
627 
628         case 'f':
629 
630             /* Disable folding on "normal" expressions */
631 
632             AslGbl_FoldConstants = FALSE;
633             break;
634 
635         case 'i':
636 
637             /* Disable integer optimization to constants */
638 
639             AslGbl_IntegerOptimizationFlag = FALSE;
640             break;
641 
642         case 'n':
643 
644             /* Disable named reference optimization */
645 
646             AslGbl_ReferenceOptimizationFlag = FALSE;
647             break;
648 
649         case 't':
650 
651             /* Disable heavy typechecking */
652 
653             AslGbl_DoTypechecking = FALSE;
654             break;
655 
656         default:
657 
658             printf ("Unknown option: -c%s\n", AcpiGbl_Optarg);
659             return (-1);
660         }
661         break;
662 
663     case 'P':   /* Preprocessor options */
664 
665         switch (AcpiGbl_Optarg[0])
666         {
667         case '^':   /* Proprocess only, emit (.i) file */
668 
669             AslGbl_PreprocessOnly = TRUE;
670             AslGbl_PreprocessorOutputFlag = TRUE;
671             break;
672 
673         case 'n':   /* Disable preprocessor */
674 
675             AslGbl_PreprocessFlag = FALSE;
676             break;
677 
678         default:
679 
680             printf ("Unknown option: -P%s\n", AcpiGbl_Optarg);
681             return (-1);
682         }
683         break;
684 
685     case 'p':   /* Override default AML output filename */
686 
687         AslGbl_OutputFilenamePrefix = AcpiGbl_Optarg;
688         UtConvertBackslashes (AslGbl_OutputFilenamePrefix);
689         AslGbl_UseDefaultAmlFilename = FALSE;
690         break;
691 
692     case 'q':   /* ASL/ASl+ converter: compile only and leave badaml. */
693 
694         printf ("Convert ASL to ASL+ with comments\n");
695         AslGbl_FoldConstants = FALSE;
696         AslGbl_IntegerOptimizationFlag = FALSE;
697         AslGbl_ReferenceOptimizationFlag = FALSE;
698         AslGbl_OptimizeTrivialParseNodes = FALSE;
699         AslGbl_DoExternalsInPlace = TRUE;
700         AcpiGbl_CaptureComments = TRUE;
701         return (0);
702 
703     case 'r':   /* Override revision found in table header */
704 
705         AslGbl_RevisionOverride = (UINT8) strtoul (AcpiGbl_Optarg, NULL, 0);
706         break;
707 
708     case 's':   /* Create AML in a source code file */
709 
710         switch (AcpiGbl_Optarg[0])
711         {
712         case 'a':
713 
714             /* Produce assembly code output file */
715 
716             AslGbl_AsmOutputFlag = TRUE;
717             break;
718 
719         case 'c':
720 
721             /* Produce C hex output file */
722 
723             AslGbl_C_OutputFlag = TRUE;
724             break;
725 
726         case 'o':
727 
728             /* Produce AML offset table in C */
729 
730             AslGbl_C_OffsetTableFlag = TRUE;
731             break;
732 
733         default:
734 
735             printf ("Unknown option: -s%s\n", AcpiGbl_Optarg);
736             return (-1);
737         }
738         break;
739 
740     case 't':   /* Produce hex table output file */
741 
742         switch (AcpiGbl_Optarg[0])
743         {
744         case 'a':
745 
746             AslGbl_HexOutputFlag = HEX_OUTPUT_ASM;
747             break;
748 
749         case 'c':
750 
751             AslGbl_HexOutputFlag = HEX_OUTPUT_C;
752             break;
753 
754         case 'p': /* data table flex/bison prototype */
755 
756             AslGbl_DtLexBisonPrototype = TRUE;
757             break;
758 
759         case 's':
760 
761             AslGbl_HexOutputFlag = HEX_OUTPUT_ASL;
762             break;
763 
764         default:
765 
766             printf ("Unknown option: -t%s\n", AcpiGbl_Optarg);
767             return (-1);
768         }
769         break;
770 
771     case 'T':   /* Create a ACPI table template file */
772 
773         AslGbl_DoTemplates = TRUE;
774         break;
775 
776     case 'v':   /* Version and verbosity settings */
777 
778         switch (AcpiGbl_Optarg[0])
779         {
780         case '^':
781 
782             printf (ACPI_COMMON_SIGNON (ASL_COMPILER_NAME));
783             exit (0);
784 
785         case 'a':
786 
787             /* Disable all error/warning/remark messages */
788 
789             AslGbl_NoErrors = TRUE;
790             break;
791 
792         case 'd':
793 
794             printf (ACPI_COMMON_SIGNON (ASL_COMPILER_NAME));
795             printf (ACPI_COMMON_BUILD_TIME);
796             exit (0);
797 
798         case 'e':
799 
800             /* Disable all warning/remark messages (errors only) */
801 
802             AslGbl_DisplayRemarks = FALSE;
803             AslGbl_DisplayWarnings = FALSE;
804             break;
805 
806         case 'i':
807             /*
808              * Support for integrated development environment(s).
809              *
810              * 1) No compiler signon
811              * 2) Send stderr messages to stdout
812              * 3) Less verbose error messages (single line only for each)
813              * 4) Error/warning messages are formatted appropriately to
814              *    be recognized by MS Visual Studio
815              */
816             AslGbl_VerboseErrors = FALSE;
817             AslGbl_DoSignon = FALSE;
818             break;
819 
820         case 'o':
821 
822             AslGbl_DisplayOptimizations = TRUE;
823             break;
824 
825         case 'r':
826 
827             AslGbl_DisplayRemarks = FALSE;
828             break;
829 
830         case 's':
831 
832             AslGbl_DoSignon = FALSE;
833             break;
834 
835         case 't':
836 
837             AslGbl_VerboseTemplates = TRUE;
838             break;
839 
840         case 'w':
841 
842             /* Get the required argument */
843 
844             if (AcpiGetoptArgument (argc, argv))
845             {
846                 return (-1);
847             }
848 
849             Status = AslDisableException (AcpiGbl_Optarg);
850             if (ACPI_FAILURE (Status))
851             {
852                 return (-1);
853             }
854             break;
855 
856         case 'x':
857 
858             /* Get the required argument */
859 
860             if (AcpiGetoptArgument (argc, argv))
861             {
862                 return (-1);
863             }
864 
865             Status = AslLogExpectedException (AcpiGbl_Optarg);
866             if (ACPI_FAILURE (Status))
867             {
868                 return (-1);
869             }
870             break;
871 
872         default:
873 
874             printf ("Unknown option: -v%s\n", AcpiGbl_Optarg);
875             return (-1);
876         }
877         break;
878 
879     case 'w': /* Set warning levels */
880 
881         switch (AcpiGbl_Optarg[0])
882         {
883         case '1':
884 
885             AslGbl_WarningLevel = ASL_WARNING;
886             break;
887 
888         case '2':
889 
890             AslGbl_WarningLevel = ASL_WARNING2;
891             break;
892 
893         case '3':
894 
895             AslGbl_WarningLevel = ASL_WARNING3;
896             break;
897 
898         case 'e':
899 
900             AslGbl_WarningsAsErrors = TRUE;
901             break;
902 
903         case 'w':
904 
905             /* Get the required argument */
906 
907             if (AcpiGetoptArgument (argc, argv))
908             {
909                 return (-1);
910             }
911 
912             Status = AslElevateException (AcpiGbl_Optarg);
913             if (ACPI_FAILURE (Status))
914             {
915                 return (-1);
916             }
917             break;
918 
919 
920         default:
921 
922             printf ("Unknown option: -w%s\n", AcpiGbl_Optarg);
923             return (-1);
924         }
925         break;
926 
927     case 'x':   /* Set debug print output level */
928 
929         AcpiDbgLevel = strtoul (AcpiGbl_Optarg, NULL, 16);
930         break;
931 
932     case 'z':
933 
934         AslGbl_UseOriginalCompilerId = TRUE;
935         break;
936 
937     default:
938 
939         return (-1);
940     }
941 
942     return (0);
943 }
944 
945 
946 /*******************************************************************************
947  *
948  * FUNCTION:    AslMergeOptionTokens
949  *
950  * PARAMETERS:  InBuffer            - Input containing an option string
951  *              OutBuffer           - Merged output buffer
952  *
953  * RETURN:      None
954  *
955  * DESCRIPTION: Remove all whitespace from an option string.
956  *
957  ******************************************************************************/
958 
959 static void
960 AslMergeOptionTokens (
961     char                    *InBuffer,
962     char                    *OutBuffer)
963 {
964     char                    *Token;
965 
966 
967     *OutBuffer = 0;
968 
969     Token = strtok (InBuffer, ASL_TOKEN_SEPARATORS);
970     while (Token)
971     {
972         strcat (OutBuffer, Token);
973         Token = strtok (NULL, ASL_TOKEN_SEPARATORS);
974     }
975 }
976 
977 
978 /*******************************************************************************
979  *
980  * FUNCTION:    AslDoResponseFile
981  *
982  * PARAMETERS:  Filename        - Name of the response file
983  *
984  * RETURN:      Status
985  *
986  * DESCRIPTION: Open a response file and process all options within.
987  *
988  ******************************************************************************/
989 
990 static int
991 AslDoResponseFile (
992     char                    *Filename)
993 {
994     char                    *argv = AslGbl_StringBuffer2;
995     FILE                    *ResponseFile;
996     int                     OptStatus = 0;
997     int                     Opterr;
998     int                     Optind;
999 
1000 
1001     ResponseFile = fopen (Filename, "r");
1002     if (!ResponseFile)
1003     {
1004         printf ("Could not open command file %s, %s\n",
1005             Filename, strerror (errno));
1006         return (-1);
1007     }
1008 
1009     /* Must save the current GetOpt globals */
1010 
1011     Opterr = AcpiGbl_Opterr;
1012     Optind = AcpiGbl_Optind;
1013 
1014     /*
1015      * Process all lines in the response file. There must be one complete
1016      * option per line
1017      */
1018     while (fgets (AslGbl_StringBuffer, ASL_STRING_BUFFER_SIZE, ResponseFile))
1019     {
1020         /* Compress all tokens, allowing us to use a single argv entry */
1021 
1022         AslMergeOptionTokens (AslGbl_StringBuffer, AslGbl_StringBuffer2);
1023 
1024         /* Process the option */
1025 
1026         AcpiGbl_Opterr = 0;
1027         AcpiGbl_Optind = 0;
1028 
1029         OptStatus = AslDoOptions (1, &argv, TRUE);
1030         if (OptStatus)
1031         {
1032             printf ("Invalid option in command file %s: %s\n",
1033                 Filename, AslGbl_StringBuffer);
1034             break;
1035         }
1036     }
1037 
1038     /* Restore the GetOpt globals */
1039 
1040     AcpiGbl_Opterr = Opterr;
1041     AcpiGbl_Optind = Optind;
1042 
1043     fclose (ResponseFile);
1044     return (OptStatus);
1045 }
1046