asloptions.c revision 1.18 1 /******************************************************************************
2 *
3 * Module Name: asloptions - compiler command line processing
4 *
5 *****************************************************************************/
6
7 /*
8 * Copyright (C) 2000 - 2023, 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 'd':
526
527 /* Disable deterministic output, enabling timestamp */
528
529 AslGbl_Deterministic = FALSE;
530 break;
531
532 case 'i':
533
534 /* Produce preprocessor output file */
535
536 AslGbl_PreprocessorOutputFlag = TRUE;
537 break;
538
539 case 'm':
540
541 /* Produce hardware map summary file */
542
543 AslGbl_MapfileFlag = TRUE;
544 break;
545
546 case 'n':
547
548 /* Produce namespace file */
549
550 AslGbl_NsOutputFlag = TRUE;
551 break;
552
553 case 's':
554
555 /* Produce combined source file */
556
557 AslGbl_SourceOutputFlag = TRUE;
558 break;
559
560 case 'x':
561
562 /* Produce cross-reference file */
563
564 AslGbl_CrossReferenceOutput = TRUE;
565 break;
566
567 default:
568
569 printf ("Unknown option: -l%s\n", AcpiGbl_Optarg);
570 return (-1);
571 }
572 break;
573
574 case 'm': /* Set line buffer size */
575
576 AslGbl_LineBufferSize = (UINT32) strtoul (AcpiGbl_Optarg, NULL, 0) * 1024;
577 if (AslGbl_LineBufferSize < ASL_DEFAULT_LINE_BUFFER_SIZE)
578 {
579 AslGbl_LineBufferSize = ASL_DEFAULT_LINE_BUFFER_SIZE;
580 }
581 printf ("Line Buffer Size: %u\n", AslGbl_LineBufferSize);
582 break;
583
584 case 'n': /* Parse only */
585
586 AslGbl_ParseOnlyFlag = TRUE;
587 break;
588
589 case 'o': /* Control compiler AML optimizations */
590
591 switch (AcpiGbl_Optarg[0])
592 {
593 case 'a':
594
595 /* Disable all optimizations */
596
597 AslGbl_FoldConstants = FALSE;
598 AslGbl_IntegerOptimizationFlag = FALSE;
599 AslGbl_ReferenceOptimizationFlag = FALSE;
600 AslGbl_OptimizeTrivialParseNodes = FALSE;
601
602 break;
603
604 case 'c':
605
606 /* Display compile time(s) */
607
608 AslGbl_CompileTimesFlag = TRUE;
609 break;
610
611 case 'd':
612
613 /* Disable disassembler code optimizations */
614
615 AcpiGbl_DoDisassemblerOptimizations = FALSE;
616 break;
617
618 case 'e':
619
620 /* Disassembler: Emit embedded external operators */
621
622 AcpiGbl_DmEmitExternalOpcodes = TRUE;
623 break;
624
625 case 'E':
626
627 /*
628 * iASL: keep External opcodes in place.
629 * No affect if Gbl_DoExternals is false.
630 */
631
632 AslGbl_DoExternalsInPlace = TRUE;
633 break;
634
635 case 'f':
636
637 /* Disable folding on "normal" expressions */
638
639 AslGbl_FoldConstants = FALSE;
640 break;
641
642 case 'i':
643
644 /* Disable integer optimization to constants */
645
646 AslGbl_IntegerOptimizationFlag = FALSE;
647 break;
648
649 case 'n':
650
651 /* Disable named reference optimization */
652
653 AslGbl_ReferenceOptimizationFlag = FALSE;
654 break;
655
656 case 't':
657
658 /* Disable heavy typechecking */
659
660 AslGbl_DoTypechecking = FALSE;
661 break;
662
663 default:
664
665 printf ("Unknown option: -c%s\n", AcpiGbl_Optarg);
666 return (-1);
667 }
668 break;
669
670 case 'P': /* Preprocessor options */
671
672 switch (AcpiGbl_Optarg[0])
673 {
674 case '^': /* Proprocess only, emit (.i) file */
675
676 AslGbl_PreprocessOnly = TRUE;
677 AslGbl_PreprocessorOutputFlag = TRUE;
678 break;
679
680 case 'n': /* Disable preprocessor */
681
682 AslGbl_PreprocessFlag = FALSE;
683 break;
684
685 default:
686
687 printf ("Unknown option: -P%s\n", AcpiGbl_Optarg);
688 return (-1);
689 }
690 break;
691
692 case 'p': /* Override default AML output filename */
693
694 AslGbl_OutputFilenamePrefix = AcpiGbl_Optarg;
695 UtConvertBackslashes (AslGbl_OutputFilenamePrefix);
696 AslGbl_UseDefaultAmlFilename = FALSE;
697 break;
698
699 case 'q': /* ASL/ASl+ converter: compile only and leave badaml. */
700
701 printf ("Convert ASL to ASL+ with comments\n");
702 AslGbl_FoldConstants = FALSE;
703 AslGbl_IntegerOptimizationFlag = FALSE;
704 AslGbl_ReferenceOptimizationFlag = FALSE;
705 AslGbl_OptimizeTrivialParseNodes = FALSE;
706 AslGbl_DoExternalsInPlace = TRUE;
707 AcpiGbl_CaptureComments = TRUE;
708 return (0);
709
710 case 'r': /* Override revision found in table header */
711
712 AslGbl_RevisionOverride = (UINT8) strtoul (AcpiGbl_Optarg, NULL, 0);
713 break;
714
715 case 's': /* Create AML in a source code file */
716
717 switch (AcpiGbl_Optarg[0])
718 {
719 case 'a':
720
721 /* Produce assembly code output file */
722
723 AslGbl_AsmOutputFlag = TRUE;
724 break;
725
726 case 'c':
727
728 /* Produce C hex output file */
729
730 AslGbl_C_OutputFlag = TRUE;
731 break;
732
733 case 'o':
734
735 /* Produce AML offset table in C */
736
737 AslGbl_C_OffsetTableFlag = TRUE;
738 break;
739
740 default:
741
742 printf ("Unknown option: -s%s\n", AcpiGbl_Optarg);
743 return (-1);
744 }
745 break;
746
747 case 't': /* Produce hex table output file */
748
749 switch (AcpiGbl_Optarg[0])
750 {
751 case 'a':
752
753 AslGbl_HexOutputFlag = HEX_OUTPUT_ASM;
754 break;
755
756 case 'c':
757
758 AslGbl_HexOutputFlag = HEX_OUTPUT_C;
759 break;
760
761 case 'p': /* data table flex/bison prototype */
762
763 AslGbl_DtLexBisonPrototype = TRUE;
764 break;
765
766 case 's':
767
768 AslGbl_HexOutputFlag = HEX_OUTPUT_ASL;
769 break;
770
771 default:
772
773 printf ("Unknown option: -t%s\n", AcpiGbl_Optarg);
774 return (-1);
775 }
776 break;
777
778 case 'T': /* Create a ACPI table template file */
779
780 AslGbl_DoTemplates = TRUE;
781 break;
782
783 case 'v': /* Version and verbosity settings */
784
785 switch (AcpiGbl_Optarg[0])
786 {
787 case '^':
788
789 printf (ACPI_COMMON_SIGNON (ASL_COMPILER_NAME));
790 exit (0);
791
792 case 'a':
793
794 /* Disable all error/warning/remark messages */
795
796 AslGbl_NoErrors = TRUE;
797 break;
798
799 case 'd':
800
801 printf (ACPI_COMMON_SIGNON (ASL_COMPILER_NAME));
802 printf (ACPI_COMMON_BUILD_TIME);
803 exit (0);
804
805 case 'e':
806
807 /* Disable all warning/remark messages (errors only) */
808
809 AslGbl_DisplayRemarks = FALSE;
810 AslGbl_DisplayWarnings = FALSE;
811 break;
812
813 case 'i':
814 /*
815 * Support for integrated development environment(s).
816 *
817 * 1) No compiler signon
818 * 2) Send stderr messages to stdout
819 * 3) Less verbose error messages (single line only for each)
820 * 4) Error/warning messages are formatted appropriately to
821 * be recognized by MS Visual Studio
822 */
823 AslGbl_VerboseErrors = FALSE;
824 AslGbl_DoSignon = FALSE;
825 break;
826
827 case 'o':
828
829 AslGbl_DisplayOptimizations = TRUE;
830 break;
831
832 case 'r':
833
834 AslGbl_DisplayRemarks = FALSE;
835 break;
836
837 case 's':
838
839 AslGbl_DoSignon = FALSE;
840 break;
841
842 case 't':
843
844 AslGbl_VerboseTemplates = TRUE;
845 break;
846
847 case 'w':
848
849 /* Get the required argument */
850
851 if (AcpiGetoptArgument (argc, argv))
852 {
853 return (-1);
854 }
855
856 Status = AslDisableException (AcpiGbl_Optarg);
857 if (ACPI_FAILURE (Status))
858 {
859 return (-1);
860 }
861 break;
862
863 case 'x':
864
865 /* Get the required argument */
866
867 if (AcpiGetoptArgument (argc, argv))
868 {
869 return (-1);
870 }
871
872 Status = AslLogExpectedException (AcpiGbl_Optarg);
873 if (ACPI_FAILURE (Status))
874 {
875 return (-1);
876 }
877 break;
878
879 default:
880
881 printf ("Unknown option: -v%s\n", AcpiGbl_Optarg);
882 return (-1);
883 }
884 break;
885
886 case 'w': /* Set warning levels */
887
888 switch (AcpiGbl_Optarg[0])
889 {
890 case '1':
891
892 AslGbl_WarningLevel = ASL_WARNING;
893 break;
894
895 case '2':
896
897 AslGbl_WarningLevel = ASL_WARNING2;
898 break;
899
900 case '3':
901
902 AslGbl_WarningLevel = ASL_WARNING3;
903 break;
904
905 case 'e':
906
907 AslGbl_WarningsAsErrors = TRUE;
908 break;
909
910 case 'w':
911
912 /* Get the required argument */
913
914 if (AcpiGetoptArgument (argc, argv))
915 {
916 return (-1);
917 }
918
919 Status = AslElevateException (AcpiGbl_Optarg);
920 if (ACPI_FAILURE (Status))
921 {
922 return (-1);
923 }
924 break;
925
926
927 default:
928
929 printf ("Unknown option: -w%s\n", AcpiGbl_Optarg);
930 return (-1);
931 }
932 break;
933
934 case 'x': /* Set debug print output level */
935
936 AcpiDbgLevel = strtoul (AcpiGbl_Optarg, NULL, 16);
937 break;
938
939 case 'z':
940
941 AslGbl_UseOriginalCompilerId = TRUE;
942 break;
943
944 default:
945
946 return (-1);
947 }
948
949 return (0);
950 }
951
952
953 /*******************************************************************************
954 *
955 * FUNCTION: AslMergeOptionTokens
956 *
957 * PARAMETERS: InBuffer - Input containing an option string
958 * OutBuffer - Merged output buffer
959 *
960 * RETURN: None
961 *
962 * DESCRIPTION: Remove all whitespace from an option string.
963 *
964 ******************************************************************************/
965
966 static void
967 AslMergeOptionTokens (
968 char *InBuffer,
969 char *OutBuffer)
970 {
971 char *Token;
972
973
974 *OutBuffer = 0;
975
976 Token = strtok (InBuffer, ASL_TOKEN_SEPARATORS);
977 while (Token)
978 {
979 strcat (OutBuffer, Token);
980 Token = strtok (NULL, ASL_TOKEN_SEPARATORS);
981 }
982 }
983
984
985 /*******************************************************************************
986 *
987 * FUNCTION: AslDoResponseFile
988 *
989 * PARAMETERS: Filename - Name of the response file
990 *
991 * RETURN: Status
992 *
993 * DESCRIPTION: Open a response file and process all options within.
994 *
995 ******************************************************************************/
996
997 static int
998 AslDoResponseFile (
999 char *Filename)
1000 {
1001 char *argv = AslGbl_StringBuffer2;
1002 FILE *ResponseFile;
1003 int OptStatus = 0;
1004 int Opterr;
1005 int Optind;
1006
1007
1008 ResponseFile = fopen (Filename, "r");
1009 if (!ResponseFile)
1010 {
1011 printf ("Could not open command file %s, %s\n",
1012 Filename, strerror (errno));
1013 return (-1);
1014 }
1015
1016 /* Must save the current GetOpt globals */
1017
1018 Opterr = AcpiGbl_Opterr;
1019 Optind = AcpiGbl_Optind;
1020
1021 /*
1022 * Process all lines in the response file. There must be one complete
1023 * option per line
1024 */
1025 while (fgets (AslGbl_StringBuffer, ASL_STRING_BUFFER_SIZE, ResponseFile))
1026 {
1027 /* Compress all tokens, allowing us to use a single argv entry */
1028
1029 AslMergeOptionTokens (AslGbl_StringBuffer, AslGbl_StringBuffer2);
1030
1031 /* Process the option */
1032
1033 AcpiGbl_Opterr = 0;
1034 AcpiGbl_Optind = 0;
1035
1036 OptStatus = AslDoOptions (1, &argv, TRUE);
1037 if (OptStatus)
1038 {
1039 printf ("Invalid option in command file %s: %s\n",
1040 Filename, AslGbl_StringBuffer);
1041 break;
1042 }
1043 }
1044
1045 /* Restore the GetOpt globals */
1046
1047 AcpiGbl_Opterr = Opterr;
1048 AcpiGbl_Optind = Optind;
1049
1050 fclose (ResponseFile);
1051 return (OptStatus);
1052 }
1053