xref: /netbsd-src/sys/external/bsd/acpica/dist/compiler/asloptions.c (revision 87d689fb734c654d2486f87f7be32f1b53ecdbec)
1 /******************************************************************************
2  *
3  * Module Name: asloptions - compiler command line processing
4  *
5  *****************************************************************************/
6 
7 /*
8  * Copyright (C) 2000 - 2017, 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 MERCHANTIBILITY 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 
48 #define _COMPONENT          ACPI_COMPILER
49         ACPI_MODULE_NAME    ("asloption")
50 
51 
52 /* Local prototypes */
53 
54 static int
55 AslDoOptions (
56     int                     argc,
57     char                    **argv,
58     BOOLEAN                 IsResponseFile);
59 
60 static void
61 AslMergeOptionTokens (
62     char                    *InBuffer,
63     char                    *OutBuffer);
64 
65 static int
66 AslDoResponseFile (
67     char                    *Filename);
68 
69 
70 #define ASL_TOKEN_SEPARATORS    " \t\n"
71 #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"
72 
73 
74 /*******************************************************************************
75  *
76  * FUNCTION:    AslCommandLine
77  *
78  * PARAMETERS:  argc/argv
79  *
80  * RETURN:      Last argv index
81  *
82  * DESCRIPTION: Command line processing
83  *
84  ******************************************************************************/
85 
86 int
87 AslCommandLine (
88     int                     argc,
89     char                    **argv)
90 {
91     int                     BadCommandLine = 0;
92     ACPI_STATUS             Status;
93 
94 
95     /* Minimum command line contains at least the command and an input file */
96 
97     if (argc < 2)
98     {
99         Usage ();
100         exit (1);
101     }
102 
103     /* Process all command line options */
104 
105     BadCommandLine = AslDoOptions (argc, argv, FALSE);
106 
107     if (Gbl_DoTemplates)
108     {
109         Status = DtCreateTemplates (argv);
110         if (ACPI_FAILURE (Status))
111         {
112             exit (-1);
113         }
114         exit (1);
115     }
116 
117     /* Next parameter must be the input filename */
118 
119     if (!argv[AcpiGbl_Optind] &&
120         !AcpiGbl_DisasmFlag)
121     {
122         printf ("Missing input filename\n");
123         BadCommandLine = TRUE;
124     }
125 
126     if (Gbl_DoSignon)
127     {
128         printf (ACPI_COMMON_SIGNON (ASL_COMPILER_NAME));
129         if (Gbl_IgnoreErrors)
130         {
131             printf ("Ignoring all errors, forcing AML file generation\n\n");
132         }
133     }
134 
135     if (BadCommandLine)
136     {
137         printf ("Use -h option for help information\n");
138         exit (1);
139     }
140 
141     return (AcpiGbl_Optind);
142 }
143 
144 
145 /*******************************************************************************
146  *
147  * FUNCTION:    AslDoOptions
148  *
149  * PARAMETERS:  argc/argv           - Standard argc/argv
150  *              IsResponseFile      - TRUE if executing a response file.
151  *
152  * RETURN:      Status
153  *
154  * DESCRIPTION: Command line option processing
155  *
156  ******************************************************************************/
157 
158 static int
159 AslDoOptions (
160     int                     argc,
161     char                    **argv,
162     BOOLEAN                 IsResponseFile)
163 {
164     ACPI_STATUS             Status;
165     UINT32                  j;
166 
167 
168     /* Get the command line options */
169 
170     while ((j = AcpiGetopt (argc, argv, ASL_SUPPORTED_OPTIONS)) != ACPI_OPT_END) switch (j)
171     {
172     case '@':   /* Begin a response file */
173 
174         if (IsResponseFile)
175         {
176             printf ("Nested command files are not supported\n");
177             return (-1);
178         }
179 
180         if (AslDoResponseFile (AcpiGbl_Optarg))
181         {
182             return (-1);
183         }
184         break;
185 
186     case 'a':   /* Debug options */
187 
188         switch (AcpiGbl_Optarg[0])
189         {
190         case 'r':
191 
192             Gbl_EnableReferenceTypechecking = TRUE;
193             break;
194 
195         default:
196 
197             printf ("Unknown option: -a%s\n", AcpiGbl_Optarg);
198             return (-1);
199         }
200 
201         break;
202 
203 
204     case 'b':   /* Debug options */
205 
206         switch (AcpiGbl_Optarg[0])
207         {
208 
209         case 'c':
210 
211             printf ("Debug ASL to ASL+ conversion\n");
212 
213             Gbl_DoAslConversion = TRUE;
214             Gbl_FoldConstants = FALSE;
215             Gbl_IntegerOptimizationFlag = FALSE;
216             Gbl_ReferenceOptimizationFlag = FALSE;
217             Gbl_OptimizeTrivialParseNodes = FALSE;
218             Gbl_CaptureComments = TRUE;
219             AcpiGbl_DoDisassemblerOptimizations = FALSE;
220             AcpiGbl_DebugAslConversion = TRUE;
221             AcpiGbl_DmEmitExternalOpcodes = TRUE;
222             Gbl_DoExternalsInPlace = TRUE;
223 
224             return (0);
225 
226         case 'f':
227 
228             AslCompilerdebug = 1; /* same as yydebug */
229             DtParserdebug = 1;
230             PrParserdebug = 1;
231             Gbl_DebugFlag = TRUE;
232             Gbl_KeepPreprocessorTempFile = TRUE;
233             break;
234 
235         case 'p':   /* Prune ASL parse tree */
236 
237             /* Get the required argument */
238 
239             if (AcpiGetoptArgument (argc, argv))
240             {
241                 return (-1);
242             }
243 
244             Gbl_PruneParseTree = TRUE;
245             Gbl_PruneDepth = (UINT8) strtoul (AcpiGbl_Optarg, NULL, 0);
246             break;
247 
248         case 's':
249 
250             Gbl_DebugFlag = TRUE;
251             break;
252 
253         case 't':
254 
255             /* Get the required argument */
256 
257             if (AcpiGetoptArgument (argc, argv))
258             {
259                 return (-1);
260             }
261 
262             Gbl_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             Gbl_DoAslConversion = TRUE;
282             Gbl_FoldConstants = FALSE;
283             Gbl_IntegerOptimizationFlag = FALSE;
284             Gbl_ReferenceOptimizationFlag = FALSE;
285             Gbl_OptimizeTrivialParseNodes = FALSE;
286             Gbl_CaptureComments = TRUE;
287             AcpiGbl_DoDisassemblerOptimizations = FALSE;
288             AcpiGbl_DmEmitExternalOpcodes = TRUE;
289             Gbl_DoExternalsInPlace = TRUE;
290 
291             return (0);
292 
293         case 'r':
294 
295             Gbl_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             /* Get the required argument */
312 
313             if (AcpiGetoptArgument (argc, argv))
314             {
315                 return (-1);
316             }
317 
318             Gbl_DoCompile = FALSE;
319             break;
320 
321         case 'a':
322 
323             /* Get the required argument */
324 
325             if (AcpiGetoptArgument (argc, argv))
326             {
327                 return (-1);
328             }
329 
330             Gbl_DoCompile = FALSE;
331             Gbl_DisassembleAll = TRUE;
332             break;
333 
334         case 'b':   /* Do not convert buffers to resource descriptors */
335 
336             AcpiGbl_NoResourceDisassembly = TRUE;
337             break;
338 
339         case 'c':
340 
341             break;
342 
343         case 'f':
344 
345             AcpiGbl_ForceAmlDisassembly = TRUE;
346             break;
347 
348         case 'l':   /* Use legacy ASL code (not ASL+) for disassembly */
349 
350             Gbl_DoCompile = FALSE;
351             AcpiGbl_CstyleDisassembly = FALSE;
352             break;
353 
354         default:
355 
356             printf ("Unknown option: -d%s\n", AcpiGbl_Optarg);
357             return (-1);
358         }
359 
360         AcpiGbl_DisasmFlag = TRUE;
361         break;
362 
363     case 'D':   /* Define a symbol */
364 
365         PrAddDefine (AcpiGbl_Optarg, NULL, TRUE);
366         break;
367 
368     case 'e':   /* External files for disassembler */
369 
370         /* Get entire list of external files */
371 
372         AcpiGbl_Optind--;
373         argv[AcpiGbl_Optind] = AcpiGbl_Optarg;
374 
375         while (argv[AcpiGbl_Optind] &&
376               (argv[AcpiGbl_Optind][0] != '-'))
377         {
378             Status = AcpiDmAddToExternalFileList (argv[AcpiGbl_Optind]);
379             if (ACPI_FAILURE (Status))
380             {
381                 printf ("Could not add %s to external list\n",
382                     argv[AcpiGbl_Optind]);
383                 return (-1);
384             }
385 
386             AcpiGbl_Optind++;
387         }
388         break;
389 
390     case 'f':
391 
392         switch (AcpiGbl_Optarg[0])
393         {
394         case '^':   /* Ignore errors and force creation of aml file */
395 
396             Gbl_IgnoreErrors = TRUE;
397             break;
398 
399         case 'e':   /* Disassembler: Get external declaration file */
400 
401             if (AcpiGetoptArgument (argc, argv))
402             {
403                 return (-1);
404             }
405 
406             Gbl_ExternalRefFilename = AcpiGbl_Optarg;
407             break;
408 
409         default:
410 
411             printf ("Unknown option: -f%s\n", AcpiGbl_Optarg);
412             return (-1);
413         }
414         break;
415 
416     case 'G':
417 
418         Gbl_CompileGeneric = TRUE;
419         break;
420 
421     case 'g':   /* Get all ACPI tables */
422 
423         printf ("-g option is deprecated, use acpidump utility instead\n");
424         exit (1);
425 
426     case 'h':
427 
428         switch (AcpiGbl_Optarg[0])
429         {
430         case '^':
431 
432             Usage ();
433             exit (0);
434 
435         case 'c':
436 
437             UtDisplayConstantOpcodes ();
438             exit (0);
439 
440         case 'd':
441 
442             AslDisassemblyHelp ();
443             exit (0);
444 
445         case 'f':
446 
447             AslFilenameHelp ();
448             exit (0);
449 
450         case 'r':
451 
452             /* reserved names */
453 
454             ApDisplayReservedNames ();
455             exit (0);
456 
457         case 't':
458 
459             UtDisplaySupportedTables ();
460             exit (0);
461 
462         default:
463 
464             printf ("Unknown option: -h%s\n", AcpiGbl_Optarg);
465             return (-1);
466         }
467 
468     case 'I':   /* Add an include file search directory */
469 
470         FlAddIncludeDirectory (AcpiGbl_Optarg);
471         break;
472 
473     case 'i':   /* Output AML as an include file */
474 
475         switch (AcpiGbl_Optarg[0])
476         {
477         case 'a':
478 
479             /* Produce assembly code include file */
480 
481             Gbl_AsmIncludeOutputFlag = TRUE;
482             break;
483 
484         case 'c':
485 
486             /* Produce C include file */
487 
488             Gbl_C_IncludeOutputFlag = TRUE;
489             break;
490 
491         case 'n':
492 
493             /* Compiler/Disassembler: Ignore the NOOP operator */
494 
495             AcpiGbl_IgnoreNoopOperator = TRUE;
496             break;
497 
498         default:
499 
500             printf ("Unknown option: -i%s\n", AcpiGbl_Optarg);
501             return (-1);
502         }
503         break;
504 
505     case 'l':   /* Listing files */
506 
507         switch (AcpiGbl_Optarg[0])
508         {
509         case '^':
510 
511             /* Produce listing file (Mixed source/aml) */
512 
513             Gbl_ListingFlag = TRUE;
514             AcpiGbl_DmOpt_Listing = TRUE;
515             break;
516 
517         case 'i':
518 
519             /* Produce preprocessor output file */
520 
521             Gbl_PreprocessorOutputFlag = TRUE;
522             break;
523 
524         case 'm':
525 
526             /* Produce hardware map summary file */
527 
528             Gbl_MapfileFlag = TRUE;
529             break;
530 
531         case 'n':
532 
533             /* Produce namespace file */
534 
535             Gbl_NsOutputFlag = TRUE;
536             break;
537 
538         case 's':
539 
540             /* Produce combined source file */
541 
542             Gbl_SourceOutputFlag = TRUE;
543             break;
544 
545         case 'x':
546 
547             /* Produce cross-reference file */
548 
549             Gbl_CrossReferenceOutput = TRUE;
550             break;
551 
552         default:
553 
554             printf ("Unknown option: -l%s\n", AcpiGbl_Optarg);
555             return (-1);
556         }
557         break;
558 
559     case 'm':   /* Set line buffer size */
560 
561         Gbl_LineBufferSize = (UINT32) strtoul (AcpiGbl_Optarg, NULL, 0) * 1024;
562         if (Gbl_LineBufferSize < ASL_DEFAULT_LINE_BUFFER_SIZE)
563         {
564             Gbl_LineBufferSize = ASL_DEFAULT_LINE_BUFFER_SIZE;
565         }
566         printf ("Line Buffer Size: %u\n", Gbl_LineBufferSize);
567         break;
568 
569     case 'n':   /* Parse only */
570 
571         Gbl_ParseOnlyFlag = TRUE;
572         break;
573 
574     case 'o':   /* Control compiler AML optimizations */
575 
576         switch (AcpiGbl_Optarg[0])
577         {
578         case 'a':
579 
580             /* Disable all optimizations */
581 
582             Gbl_FoldConstants = FALSE;
583             Gbl_IntegerOptimizationFlag = FALSE;
584             Gbl_ReferenceOptimizationFlag = FALSE;
585             Gbl_OptimizeTrivialParseNodes = FALSE;
586 
587             break;
588 
589         case 'c':
590 
591             /* Display compile time(s) */
592 
593             Gbl_CompileTimesFlag = TRUE;
594             break;
595 
596         case 'd':
597 
598             /* Disable disassembler code optimizations */
599 
600             AcpiGbl_DoDisassemblerOptimizations = FALSE;
601             break;
602 
603         case 'e':
604 
605             /* Disassembler: Emit embedded external operators */
606 
607             AcpiGbl_DmEmitExternalOpcodes = TRUE;
608             break;
609 
610         case 'E':
611 
612             /*
613              * iASL: keep External opcodes in place.
614              * No affect if Gbl_DoExternals is false.
615              */
616 
617             Gbl_DoExternalsInPlace = TRUE;
618             break;
619 
620         case 'f':
621 
622             /* Disable folding on "normal" expressions */
623 
624             Gbl_FoldConstants = FALSE;
625             break;
626 
627         case 'i':
628 
629             /* Disable integer optimization to constants */
630 
631             Gbl_IntegerOptimizationFlag = FALSE;
632             break;
633 
634         case 'n':
635 
636             /* Disable named reference optimization */
637 
638             Gbl_ReferenceOptimizationFlag = FALSE;
639             break;
640 
641         case 't':
642 
643             /* Disable heavy typechecking */
644 
645             Gbl_DoTypechecking = FALSE;
646             break;
647 
648         default:
649 
650             printf ("Unknown option: -c%s\n", AcpiGbl_Optarg);
651             return (-1);
652         }
653         break;
654 
655     case 'P':   /* Preprocessor options */
656 
657         switch (AcpiGbl_Optarg[0])
658         {
659         case '^':   /* Proprocess only, emit (.i) file */
660 
661             Gbl_PreprocessOnly = TRUE;
662             Gbl_PreprocessorOutputFlag = TRUE;
663             break;
664 
665         case 'n':   /* Disable preprocessor */
666 
667             Gbl_PreprocessFlag = FALSE;
668             break;
669 
670         default:
671 
672             printf ("Unknown option: -P%s\n", AcpiGbl_Optarg);
673             return (-1);
674         }
675         break;
676 
677     case 'p':   /* Override default AML output filename */
678 
679         Gbl_OutputFilenamePrefix = AcpiGbl_Optarg;
680         UtConvertBackslashes (Gbl_OutputFilenamePrefix);
681         Gbl_UseDefaultAmlFilename = FALSE;
682         break;
683 
684     case 'q':   /* ASL/ASl+ converter: compile only and leave badaml. */
685 
686         printf ("Convert ASL to ASL+ with comments\n");
687         Gbl_FoldConstants = FALSE;
688         Gbl_IntegerOptimizationFlag = FALSE;
689         Gbl_ReferenceOptimizationFlag = FALSE;
690         Gbl_OptimizeTrivialParseNodes = FALSE;
691         Gbl_CaptureComments = TRUE;
692         Gbl_DoExternalsInPlace = TRUE;
693         return (0);
694 
695     case 'r':   /* Override revision found in table header */
696 
697         Gbl_RevisionOverride = (UINT8) strtoul (AcpiGbl_Optarg, NULL, 0);
698         break;
699 
700     case 's':   /* Create AML in a source code file */
701 
702         switch (AcpiGbl_Optarg[0])
703         {
704         case 'a':
705 
706             /* Produce assembly code output file */
707 
708             Gbl_AsmOutputFlag = TRUE;
709             break;
710 
711         case 'c':
712 
713             /* Produce C hex output file */
714 
715             Gbl_C_OutputFlag = TRUE;
716             break;
717 
718         case 'o':
719 
720             /* Produce AML offset table in C */
721 
722             Gbl_C_OffsetTableFlag = TRUE;
723             break;
724 
725         default:
726 
727             printf ("Unknown option: -s%s\n", AcpiGbl_Optarg);
728             return (-1);
729         }
730         break;
731 
732     case 't':   /* Produce hex table output file */
733 
734         switch (AcpiGbl_Optarg[0])
735         {
736         case 'a':
737 
738             Gbl_HexOutputFlag = HEX_OUTPUT_ASM;
739             break;
740 
741         case 'c':
742 
743             Gbl_HexOutputFlag = HEX_OUTPUT_C;
744             break;
745 
746         case 's':
747 
748             Gbl_HexOutputFlag = HEX_OUTPUT_ASL;
749             break;
750 
751         default:
752 
753             printf ("Unknown option: -t%s\n", AcpiGbl_Optarg);
754             return (-1);
755         }
756         break;
757 
758     case 'T':   /* Create a ACPI table template file */
759 
760         Gbl_DoTemplates = TRUE;
761         break;
762 
763     case 'v':   /* Version and verbosity settings */
764 
765         switch (AcpiGbl_Optarg[0])
766         {
767         case '^':
768 
769             printf (ACPI_COMMON_SIGNON (ASL_COMPILER_NAME));
770             exit (0);
771 
772         case 'a':
773 
774             /* Disable all error/warning/remark messages */
775 
776             Gbl_NoErrors = TRUE;
777             break;
778 
779         case 'd':
780 
781             printf (ACPI_COMMON_SIGNON (ASL_COMPILER_NAME));
782             printf (ACPI_COMMON_BUILD_TIME);
783             exit (0);
784 
785         case 'e':
786 
787             /* Disable all warning/remark messages (errors only) */
788 
789             Gbl_DisplayRemarks = FALSE;
790             Gbl_DisplayWarnings = FALSE;
791             break;
792 
793         case 'i':
794             /*
795              * Support for integrated development environment(s).
796              *
797              * 1) No compiler signon
798              * 2) Send stderr messages to stdout
799              * 3) Less verbose error messages (single line only for each)
800              * 4) Error/warning messages are formatted appropriately to
801              *    be recognized by MS Visual Studio
802              */
803             Gbl_VerboseErrors = FALSE;
804             Gbl_DoSignon = FALSE;
805             Gbl_Files[ASL_FILE_STDERR].Handle = stdout;
806             break;
807 
808         case 'o':
809 
810             Gbl_DisplayOptimizations = TRUE;
811             break;
812 
813         case 'r':
814 
815             Gbl_DisplayRemarks = FALSE;
816             break;
817 
818         case 's':
819 
820             Gbl_DoSignon = FALSE;
821             break;
822 
823         case 't':
824 
825             Gbl_VerboseTemplates = TRUE;
826             break;
827 
828         case 'w':
829 
830             /* Get the required argument */
831 
832             if (AcpiGetoptArgument (argc, argv))
833             {
834                 return (-1);
835             }
836 
837             Status = AslDisableException (AcpiGbl_Optarg);
838             if (ACPI_FAILURE (Status))
839             {
840                 return (-1);
841             }
842             break;
843 
844         case 'x':
845 
846             /* Get the required argument */
847 
848             if (AcpiGetoptArgument (argc, argv))
849             {
850                 return (-1);
851             }
852 
853             Status = AslExpectException (AcpiGbl_Optarg);
854             if (ACPI_FAILURE (Status))
855             {
856                 return (-1);
857             }
858             break;
859 
860         default:
861 
862             printf ("Unknown option: -v%s\n", AcpiGbl_Optarg);
863             return (-1);
864         }
865         break;
866 
867     case 'w': /* Set warning levels */
868 
869         switch (AcpiGbl_Optarg[0])
870         {
871         case '1':
872 
873             Gbl_WarningLevel = ASL_WARNING;
874             break;
875 
876         case '2':
877 
878             Gbl_WarningLevel = ASL_WARNING2;
879             break;
880 
881         case '3':
882 
883             Gbl_WarningLevel = ASL_WARNING3;
884             break;
885 
886         case 'e':
887 
888             Gbl_WarningsAsErrors = TRUE;
889             break;
890 
891         default:
892 
893             printf ("Unknown option: -w%s\n", AcpiGbl_Optarg);
894             return (-1);
895         }
896         break;
897 
898     case 'x':   /* Set debug print output level */
899 
900         AcpiDbgLevel = strtoul (AcpiGbl_Optarg, NULL, 16);
901         break;
902 
903     case 'z':
904 
905         Gbl_UseOriginalCompilerId = TRUE;
906         break;
907 
908     default:
909 
910         return (-1);
911     }
912 
913     return (0);
914 }
915 
916 
917 /*******************************************************************************
918  *
919  * FUNCTION:    AslMergeOptionTokens
920  *
921  * PARAMETERS:  InBuffer            - Input containing an option string
922  *              OutBuffer           - Merged output buffer
923  *
924  * RETURN:      None
925  *
926  * DESCRIPTION: Remove all whitespace from an option string.
927  *
928  ******************************************************************************/
929 
930 static void
931 AslMergeOptionTokens (
932     char                    *InBuffer,
933     char                    *OutBuffer)
934 {
935     char                    *Token;
936 
937 
938     *OutBuffer = 0;
939 
940     Token = strtok (InBuffer, ASL_TOKEN_SEPARATORS);
941     while (Token)
942     {
943         strcat (OutBuffer, Token);
944         Token = strtok (NULL, ASL_TOKEN_SEPARATORS);
945     }
946 }
947 
948 
949 /*******************************************************************************
950  *
951  * FUNCTION:    AslDoResponseFile
952  *
953  * PARAMETERS:  Filename        - Name of the response file
954  *
955  * RETURN:      Status
956  *
957  * DESCRIPTION: Open a response file and process all options within.
958  *
959  ******************************************************************************/
960 
961 static int
962 AslDoResponseFile (
963     char                    *Filename)
964 {
965     char                    *argv = StringBuffer2;
966     FILE                    *ResponseFile;
967     int                     OptStatus = 0;
968     int                     Opterr;
969     int                     Optind;
970 
971 
972     ResponseFile = fopen (Filename, "r");
973     if (!ResponseFile)
974     {
975         printf ("Could not open command file %s, %s\n",
976             Filename, strerror (errno));
977         return (-1);
978     }
979 
980     /* Must save the current GetOpt globals */
981 
982     Opterr = AcpiGbl_Opterr;
983     Optind = AcpiGbl_Optind;
984 
985     /*
986      * Process all lines in the response file. There must be one complete
987      * option per line
988      */
989     while (fgets (StringBuffer, ASL_MSG_BUFFER_SIZE, ResponseFile))
990     {
991         /* Compress all tokens, allowing us to use a single argv entry */
992 
993         AslMergeOptionTokens (StringBuffer, StringBuffer2);
994 
995         /* Process the option */
996 
997         AcpiGbl_Opterr = 0;
998         AcpiGbl_Optind = 0;
999 
1000         OptStatus = AslDoOptions (1, &argv, TRUE);
1001         if (OptStatus)
1002         {
1003             printf ("Invalid option in command file %s: %s\n",
1004                 Filename, StringBuffer);
1005             break;
1006         }
1007     }
1008 
1009     /* Restore the GetOpt globals */
1010 
1011     AcpiGbl_Opterr = Opterr;
1012     AcpiGbl_Optind = Optind;
1013 
1014     fclose (ResponseFile);
1015     return (OptStatus);
1016 }
1017