xref: /freebsd/sys/contrib/dev/acpica/compiler/aslmain.c (revision 7cd2dcf07629713e5a3d60472cfe4701b705a167)
1 /******************************************************************************
2  *
3  * Module Name: aslmain - compiler main and utilities
4  *
5  *****************************************************************************/
6 
7 /*
8  * Copyright (C) 2000 - 2012, 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 
45 #define _DECLARE_GLOBALS
46 
47 #include <contrib/dev/acpica/compiler/aslcompiler.h>
48 #include <contrib/dev/acpica/include/acapps.h>
49 #include <contrib/dev/acpica/include/acdisasm.h>
50 #include <signal.h>
51 
52 #ifdef _DEBUG
53 #include <crtdbg.h>
54 #endif
55 
56 #define _COMPONENT          ACPI_COMPILER
57         ACPI_MODULE_NAME    ("aslmain")
58 
59 /* Local prototypes */
60 
61 static void
62 Options (
63     void);
64 
65 static void
66 FilenameHelp (
67     void);
68 
69 static void
70 Usage (
71     void);
72 
73 static void ACPI_SYSTEM_XFACE
74 AslSignalHandler (
75     int                     Sig);
76 
77 static void
78 AslInitialize (
79     void);
80 
81 static int
82 AslCommandLine (
83     int                     argc,
84     char                    **argv);
85 
86 static int
87 AslDoOptions (
88     int                     argc,
89     char                    **argv,
90     BOOLEAN                 IsResponseFile);
91 
92 static void
93 AslMergeOptionTokens (
94     char                    *InBuffer,
95     char                    *OutBuffer);
96 
97 static int
98 AslDoResponseFile (
99     char                    *Filename);
100 
101 
102 #define ASL_TOKEN_SEPARATORS    " \t\n"
103 #define ASL_SUPPORTED_OPTIONS   "@:2b|c|d^D:e:fgh^i|I:l^m:no|p:P^r:s|t|T:G^v^w|x:z"
104 
105 
106 /*******************************************************************************
107  *
108  * FUNCTION:    Options
109  *
110  * PARAMETERS:  None
111  *
112  * RETURN:      None
113  *
114  * DESCRIPTION: Display option help message
115  *
116  ******************************************************************************/
117 
118 static void
119 Options (
120     void)
121 {
122 
123     printf ("\nGlobal:\n");
124     ACPI_OPTION ("-@ <file>",       "Specify command file");
125     ACPI_OPTION ("-I <dir>",        "Specify additional include directory");
126     ACPI_OPTION ("-T <sig>|ALL|*",  "Create table template file for ACPI <Sig>");
127     ACPI_OPTION ("-v",              "Display compiler version");
128 
129     printf ("\nPreprocessor:\n");
130     ACPI_OPTION ("-D <symbol>",     "Define symbol for preprocessor use");
131     ACPI_OPTION ("-li",             "Create preprocessed output file (*.i)");
132     ACPI_OPTION ("-P",              "Preprocess only and create preprocessor output file (*.i)");
133     ACPI_OPTION ("-Pn",             "Disable preprocessor");
134 
135     printf ("\nGeneral Output:\n");
136     ACPI_OPTION ("-p <prefix>",     "Specify path/filename prefix for all output files");
137     ACPI_OPTION ("-va",             "Disable all errors and warnings (summary only)");
138     ACPI_OPTION ("-vi",             "Less verbose errors and warnings for use with IDEs");
139     ACPI_OPTION ("-vo",             "Enable optimization comments");
140     ACPI_OPTION ("-vr",             "Disable remarks");
141     ACPI_OPTION ("-vs",             "Disable signon");
142     ACPI_OPTION ("-w1 -w2 -w3",     "Set warning reporting level");
143     ACPI_OPTION ("-we",             "Report warnings as errors");
144 
145     printf ("\nAML and Data Output Files:\n");
146     ACPI_OPTION ("-sa -sc",         "Create assembler or C source file (*.asm or *.c)");
147     ACPI_OPTION ("-ia -ic",         "Create assembler or C include file (*.inc or *.h)");
148     ACPI_OPTION ("-ta -tc -ts",     "Create assembler, C, or ASL hex table (*.hex)");
149 
150     printf ("\nAML Code Generation:\n");
151     ACPI_OPTION ("-oa",             "Disable all optimizations (compatibility mode)");
152     ACPI_OPTION ("-of",             "Disable constant folding");
153     ACPI_OPTION ("-oi",             "Disable integer optimization to Zero/One/Ones");
154     ACPI_OPTION ("-on",             "Disable named reference string optimization");
155     ACPI_OPTION ("-cr",             "Disable Resource Descriptor error checking");
156     ACPI_OPTION ("-r <revision>",   "Override table header Revision (1-255)");
157 
158     printf ("\nASL Listing Files:\n");
159     ACPI_OPTION ("-l",              "Create mixed listing file (ASL source and AML) (*.lst)");
160     ACPI_OPTION ("-ln",             "Create namespace file (*.nsp)");
161     ACPI_OPTION ("-ls",             "Create combined source file (expanded includes) (*.src)");
162 
163     printf ("\nACPI Data Tables:\n");
164     ACPI_OPTION ("-G",              "Compile custom table containing generic operators");
165     ACPI_OPTION ("-vt",             "Create verbose templates (full disassembly)");
166 
167     printf ("\nAML Disassembler:\n");
168     ACPI_OPTION ("-d  [file]",      "Disassemble or decode binary ACPI table to file (*.dsl)");
169     ACPI_OPTION ("-da [f1,f2]",     "Disassemble multiple tables from single namespace");
170     ACPI_OPTION ("-db",             "Do not translate Buffers to Resource Templates");
171     ACPI_OPTION ("-dc [file]",      "Disassemble AML and immediately compile it");
172     ACPI_OPTION ("",                "(Obtain DSDT from current system if no input file)");
173     ACPI_OPTION ("-e  [f1,f2]",     "Include ACPI table(s) for external symbol resolution");
174     ACPI_OPTION ("-2",              "Emit ACPI 2.0 compatible ASL code");
175     ACPI_OPTION ("-g",              "Get ACPI tables and write to files (*.dat)");
176     ACPI_OPTION ("-vt",             "Dump binary table data in hex format within output file");
177 
178     printf ("\nHelp:\n");
179     ACPI_OPTION ("-h",              "This message");
180     ACPI_OPTION ("-hc",             "Display operators allowed in constant expressions");
181     ACPI_OPTION ("-hf",             "Display help for output filename generation");
182     ACPI_OPTION ("-hr",             "Display ACPI reserved method names");
183     ACPI_OPTION ("-ht",             "Display currently supported ACPI table names");
184 
185     printf ("\nDebug Options:\n");
186     ACPI_OPTION ("-bf -bt",         "Create debug file (full or parse tree only) (*.txt)");
187     ACPI_OPTION ("-f",              "Ignore errors, force creation of AML output file(s)");
188     ACPI_OPTION ("-n",              "Parse only, no output generation");
189     ACPI_OPTION ("-ot",             "Display compile times and statistics");
190     ACPI_OPTION ("-x <level>",      "Set debug level for trace output");
191     ACPI_OPTION ("-z",              "Do not insert new compiler ID for DataTables");
192 }
193 
194 
195 /*******************************************************************************
196  *
197  * FUNCTION:    FilenameHelp
198  *
199  * PARAMETERS:  None
200  *
201  * RETURN:      None
202  *
203  * DESCRIPTION: Display help message for output filename generation
204  *
205  ******************************************************************************/
206 
207 static void
208 FilenameHelp (
209     void)
210 {
211 
212     printf ("\nAML output filename generation:\n");
213     printf ("  Output filenames are generated by appending an extension to a common\n");
214     printf ("  filename prefix. The filename prefix is obtained via one of the\n");
215     printf ("  following methods (in priority order):\n");
216     printf ("    1) The -p option specifies the prefix\n");
217     printf ("    2) The prefix of the AMLFileName in the ASL Definition Block\n");
218     printf ("    3) The prefix of the input filename\n");
219     printf ("\n");
220 }
221 
222 
223 /*******************************************************************************
224  *
225  * FUNCTION:    Usage
226  *
227  * PARAMETERS:  None
228  *
229  * RETURN:      None
230  *
231  * DESCRIPTION: Display usage and option message
232  *
233  ******************************************************************************/
234 
235 static void
236 Usage (
237     void)
238 {
239 
240     printf ("%s\n\n", ASL_COMPLIANCE);
241     ACPI_USAGE_HEADER ("iasl [Options] [Files]");
242     Options ();
243 }
244 
245 
246 /******************************************************************************
247  *
248  * FUNCTION:    AslSignalHandler
249  *
250  * PARAMETERS:  Sig                 - Signal that invoked this handler
251  *
252  * RETURN:      None
253  *
254  * DESCRIPTION: Control-C handler. Delete any intermediate files and any
255  *              output files that may be left in an indeterminate state.
256  *
257  *****************************************************************************/
258 
259 static void ACPI_SYSTEM_XFACE
260 AslSignalHandler (
261     int                     Sig)
262 {
263     UINT32                  i;
264 
265 
266     signal (Sig, SIG_IGN);
267     printf ("Aborting\n\n");
268 
269     /* Close all open files */
270 
271     Gbl_Files[ASL_FILE_PREPROCESSOR].Handle = NULL; /* the .i file is same as source file */
272 
273     for (i = ASL_FILE_INPUT; i < ASL_MAX_FILE_TYPE; i++)
274     {
275         FlCloseFile (i);
276     }
277 
278     /* Delete any output files */
279 
280     for (i = ASL_FILE_AML_OUTPUT; i < ASL_MAX_FILE_TYPE; i++)
281     {
282         FlDeleteFile (i);
283     }
284 
285     exit (0);
286 }
287 
288 
289 /*******************************************************************************
290  *
291  * FUNCTION:    AslInitialize
292  *
293  * PARAMETERS:  None
294  *
295  * RETURN:      None
296  *
297  * DESCRIPTION: Initialize compiler globals
298  *
299  ******************************************************************************/
300 
301 static void
302 AslInitialize (
303     void)
304 {
305     UINT32                  i;
306 
307 
308 #ifdef _DEBUG
309     _CrtSetDbgFlag (_CRTDBG_CHECK_ALWAYS_DF | _CrtSetDbgFlag(0));
310 #endif
311 
312 
313     for (i = 0; i < ASL_NUM_FILES; i++)
314     {
315         Gbl_Files[i].Handle = NULL;
316         Gbl_Files[i].Filename = NULL;
317     }
318 
319     Gbl_Files[ASL_FILE_STDOUT].Handle   = stdout;
320     Gbl_Files[ASL_FILE_STDOUT].Filename = "STDOUT";
321 
322     Gbl_Files[ASL_FILE_STDERR].Handle   = stderr;
323     Gbl_Files[ASL_FILE_STDERR].Filename = "STDERR";
324 
325     /* Allocate the line buffer(s) */
326 
327     Gbl_LineBufferSize /= 2;
328     UtExpandLineBuffers ();
329 }
330 
331 
332 /*******************************************************************************
333  *
334  * FUNCTION:    AslMergeOptionTokens
335  *
336  * PARAMETERS:  InBuffer            - Input containing an option string
337  *              OutBuffer           - Merged output buffer
338  *
339  * RETURN:      None
340  *
341  * DESCRIPTION: Remove all whitespace from an option string.
342  *
343  ******************************************************************************/
344 
345 static void
346 AslMergeOptionTokens (
347     char                    *InBuffer,
348     char                    *OutBuffer)
349 {
350     char                    *Token;
351 
352 
353     *OutBuffer = 0;
354 
355     Token = strtok (InBuffer, ASL_TOKEN_SEPARATORS);
356     while (Token)
357     {
358         strcat (OutBuffer, Token);
359         Token = strtok (NULL, ASL_TOKEN_SEPARATORS);
360     }
361 }
362 
363 
364 /*******************************************************************************
365  *
366  * FUNCTION:    AslDoResponseFile
367  *
368  * PARAMETERS:  Filename        - Name of the response file
369  *
370  * RETURN:      Status
371  *
372  * DESCRIPTION: Open a response file and process all options within.
373  *
374  ******************************************************************************/
375 
376 static int
377 AslDoResponseFile (
378     char                    *Filename)
379 {
380     char                    *argv = StringBuffer2;
381     FILE                    *ResponseFile;
382     int                     OptStatus = 0;
383     int                     Opterr;
384     int                     Optind;
385 
386 
387     ResponseFile = fopen (Filename, "r");
388     if (!ResponseFile)
389     {
390         printf ("Could not open command file %s, %s\n",
391             Filename, strerror (errno));
392         return (-1);
393     }
394 
395     /* Must save the current GetOpt globals */
396 
397     Opterr = AcpiGbl_Opterr;
398     Optind = AcpiGbl_Optind;
399 
400     /*
401      * Process all lines in the response file. There must be one complete
402      * option per line
403      */
404     while (fgets (StringBuffer, ASL_MSG_BUFFER_SIZE, ResponseFile))
405     {
406         /* Compress all tokens, allowing us to use a single argv entry */
407 
408         AslMergeOptionTokens (StringBuffer, StringBuffer2);
409 
410         /* Process the option */
411 
412         AcpiGbl_Opterr = 0;
413         AcpiGbl_Optind = 0;
414 
415         OptStatus = AslDoOptions (1, &argv, TRUE);
416         if (OptStatus)
417         {
418             printf ("Invalid option in command file %s: %s\n",
419                 Filename, StringBuffer);
420             break;
421         }
422     }
423 
424     /* Restore the GetOpt globals */
425 
426     AcpiGbl_Opterr = Opterr;
427     AcpiGbl_Optind = Optind;
428 
429     fclose (ResponseFile);
430     return (OptStatus);
431 }
432 
433 
434 /*******************************************************************************
435  *
436  * FUNCTION:    AslDoOptions
437  *
438  * PARAMETERS:  argc/argv           - Standard argc/argv
439  *              IsResponseFile      - TRUE if executing a response file.
440  *
441  * RETURN:      Status
442  *
443  * DESCRIPTION: Command line option processing
444  *
445  ******************************************************************************/
446 
447 static int
448 AslDoOptions (
449     int                     argc,
450     char                    **argv,
451     BOOLEAN                 IsResponseFile)
452 {
453     int                     j;
454     ACPI_STATUS             Status;
455 
456 
457     /* Get the command line options */
458 
459     while ((j = AcpiGetopt (argc, argv, ASL_SUPPORTED_OPTIONS)) != EOF) switch (j)
460     {
461     case '@':   /* Begin a response file */
462 
463         if (IsResponseFile)
464         {
465             printf ("Nested command files are not supported\n");
466             return (-1);
467         }
468 
469         if (AslDoResponseFile (AcpiGbl_Optarg))
470         {
471             return (-1);
472         }
473         break;
474 
475 
476     case '2':   /* ACPI 2.0 compatibility mode */
477         Gbl_Acpi2 = TRUE;
478         break;
479 
480 
481     case 'b':   /* Debug output options */
482         switch (AcpiGbl_Optarg[0])
483         {
484         case 'f':
485             AslCompilerdebug = 1; /* same as yydebug */
486             DtParserdebug = 1;
487             PrParserdebug = 1;
488             break;
489 
490         case 't':
491             break;
492 
493         default:
494             printf ("Unknown option: -b%s\n", AcpiGbl_Optarg);
495             return (-1);
496         }
497 
498         /* Produce debug output file */
499 
500         Gbl_DebugFlag = TRUE;
501         break;
502 
503 
504     case 'c':
505         switch (AcpiGbl_Optarg[0])
506         {
507         case 'r':
508             Gbl_NoResourceChecking = TRUE;
509             break;
510 
511         default:
512             printf ("Unknown option: -c%s\n", AcpiGbl_Optarg);
513             return (-1);
514         }
515         break;
516 
517 
518     case 'd':   /* Disassembler */
519         switch (AcpiGbl_Optarg[0])
520         {
521         case '^':
522             Gbl_DoCompile = FALSE;
523             break;
524 
525         case 'a':
526             Gbl_DoCompile = FALSE;
527             Gbl_DisassembleAll = TRUE;
528             break;
529 
530         case 'b':   /* Do not convert buffers to resource descriptors */
531             AcpiGbl_NoResourceDisassembly = TRUE;
532             break;
533 
534         case 'c':
535             break;
536 
537         default:
538             printf ("Unknown option: -d%s\n", AcpiGbl_Optarg);
539             return (-1);
540         }
541 
542         Gbl_DisasmFlag = TRUE;
543         break;
544 
545 
546     case 'D':   /* Define a symbol */
547         PrAddDefine (AcpiGbl_Optarg, NULL, TRUE);
548         break;
549 
550 
551     case 'e':   /* External files for disassembler */
552         Status = AcpiDmAddToExternalFileList (AcpiGbl_Optarg);
553         if (ACPI_FAILURE (Status))
554         {
555             printf ("Could not add %s to external list\n", AcpiGbl_Optarg);
556             return (-1);
557         }
558         break;
559 
560 
561     case 'f':   /* Ignore errors and force creation of aml file */
562         Gbl_IgnoreErrors = TRUE;
563         break;
564 
565 
566     case 'G':
567         Gbl_CompileGeneric = TRUE;
568         break;
569 
570 
571     case 'g':   /* Get all ACPI tables */
572 
573         Gbl_GetAllTables = TRUE;
574         Gbl_DoCompile = FALSE;
575         break;
576 
577 
578     case 'h':
579         switch (AcpiGbl_Optarg[0])
580         {
581         case '^':
582             Usage ();
583             exit (0);
584 
585         case 'c':
586             UtDisplayConstantOpcodes ();
587             exit (0);
588 
589         case 'f':
590             FilenameHelp ();
591             exit (0);
592 
593         case 'r':
594             /* reserved names */
595 
596             ApDisplayReservedNames ();
597             exit (0);
598 
599         case 't':
600             UtDisplaySupportedTables ();
601             exit (0);
602 
603         default:
604             printf ("Unknown option: -h%s\n", AcpiGbl_Optarg);
605             return (-1);
606         }
607 
608 
609     case 'I':   /* Add an include file search directory */
610         FlAddIncludeDirectory (AcpiGbl_Optarg);
611         break;
612 
613 
614     case 'i':   /* Output AML as an include file */
615         switch (AcpiGbl_Optarg[0])
616         {
617         case 'a':
618 
619             /* Produce assembly code include file */
620 
621             Gbl_AsmIncludeOutputFlag = TRUE;
622             break;
623 
624         case 'c':
625 
626             /* Produce C include file */
627 
628             Gbl_C_IncludeOutputFlag = TRUE;
629             break;
630 
631         default:
632             printf ("Unknown option: -i%s\n", AcpiGbl_Optarg);
633             return (-1);
634         }
635         break;
636 
637 
638     case 'l':   /* Listing files */
639         switch (AcpiGbl_Optarg[0])
640         {
641         case '^':
642             /* Produce listing file (Mixed source/aml) */
643 
644             Gbl_ListingFlag = TRUE;
645             break;
646 
647         case 'i':
648             /* Produce preprocessor output file */
649 
650             Gbl_PreprocessorOutputFlag = TRUE;
651             break;
652 
653         case 'n':
654             /* Produce namespace file */
655 
656             Gbl_NsOutputFlag = TRUE;
657             break;
658 
659         case 's':
660             /* Produce combined source file */
661 
662             Gbl_SourceOutputFlag = TRUE;
663             break;
664 
665         default:
666             printf ("Unknown option: -l%s\n", AcpiGbl_Optarg);
667             return (-1);
668         }
669         break;
670 
671 
672     case 'm':   /* Set line buffer size */
673         Gbl_LineBufferSize = (UINT32) strtoul (AcpiGbl_Optarg, NULL, 0) * 1024;
674         if (Gbl_LineBufferSize < ASL_DEFAULT_LINE_BUFFER_SIZE)
675         {
676             Gbl_LineBufferSize = ASL_DEFAULT_LINE_BUFFER_SIZE;
677         }
678         printf ("Line Buffer Size: %u\n", Gbl_LineBufferSize);
679         break;
680 
681 
682     case 'n':   /* Parse only */
683         Gbl_ParseOnlyFlag = TRUE;
684         break;
685 
686 
687     case 'o':   /* Control compiler AML optimizations */
688         switch (AcpiGbl_Optarg[0])
689         {
690         case 'a':
691 
692             /* Disable all optimizations */
693 
694             Gbl_FoldConstants = FALSE;
695             Gbl_IntegerOptimizationFlag = FALSE;
696             Gbl_ReferenceOptimizationFlag = FALSE;
697             break;
698 
699         case 'f':
700 
701             /* Disable folding on "normal" expressions */
702 
703             Gbl_FoldConstants = FALSE;
704             break;
705 
706         case 'i':
707 
708             /* Disable integer optimization to constants */
709 
710             Gbl_IntegerOptimizationFlag = FALSE;
711             break;
712 
713         case 'n':
714 
715             /* Disable named reference optimization */
716 
717             Gbl_ReferenceOptimizationFlag = FALSE;
718             break;
719 
720         case 't':
721 
722             /* Display compile time(s) */
723 
724             Gbl_CompileTimesFlag = TRUE;
725             break;
726 
727         default:
728             printf ("Unknown option: -c%s\n", AcpiGbl_Optarg);
729             return (-1);
730         }
731         break;
732 
733 
734     case 'P':   /* Preprocessor options */
735         switch (AcpiGbl_Optarg[0])
736         {
737         case '^':   /* Proprocess only, emit (.i) file */
738             Gbl_PreprocessOnly = TRUE;
739             Gbl_PreprocessorOutputFlag = TRUE;
740             break;
741 
742         case 'n':   /* Disable preprocessor */
743             Gbl_PreprocessFlag = FALSE;
744             break;
745 
746         default:
747             printf ("Unknown option: -P%s\n", AcpiGbl_Optarg);
748             return (-1);
749         }
750         break;
751 
752 
753     case 'p':   /* Override default AML output filename */
754         Gbl_OutputFilenamePrefix = AcpiGbl_Optarg;
755         Gbl_UseDefaultAmlFilename = FALSE;
756         break;
757 
758 
759     case 'r':   /* Override revision found in table header */
760         Gbl_RevisionOverride = (UINT8) strtoul (AcpiGbl_Optarg, NULL, 0);
761         break;
762 
763 
764     case 's':   /* Create AML in a source code file */
765         switch (AcpiGbl_Optarg[0])
766         {
767         case 'a':
768 
769             /* Produce assembly code output file */
770 
771             Gbl_AsmOutputFlag = TRUE;
772             break;
773 
774         case 'c':
775 
776             /* Produce C hex output file */
777 
778             Gbl_C_OutputFlag = TRUE;
779             break;
780 
781         default:
782             printf ("Unknown option: -s%s\n", AcpiGbl_Optarg);
783             return (-1);
784         }
785         break;
786 
787 
788     case 't':   /* Produce hex table output file */
789         switch (AcpiGbl_Optarg[0])
790         {
791         case 'a':
792             Gbl_HexOutputFlag = HEX_OUTPUT_ASM;
793             break;
794 
795         case 'c':
796             Gbl_HexOutputFlag = HEX_OUTPUT_C;
797             break;
798 
799         case 's':
800             Gbl_HexOutputFlag = HEX_OUTPUT_ASL;
801             break;
802 
803         default:
804             printf ("Unknown option: -t%s\n", AcpiGbl_Optarg);
805             return (-1);
806         }
807         break;
808 
809 
810     case 'T':   /* Create a ACPI table template file */
811         Gbl_DoTemplates = TRUE;
812         Gbl_TemplateSignature = AcpiGbl_Optarg;
813         break;
814 
815 
816     case 'v':   /* Version and verbosity settings */
817         switch (AcpiGbl_Optarg[0])
818         {
819         case '^':
820             printf (ACPI_COMMON_SIGNON (ASL_COMPILER_NAME));
821             exit (0);
822 
823         case 'a':
824             /* Disable All error/warning messages */
825 
826             Gbl_NoErrors = TRUE;
827             break;
828 
829         case 'i':
830             /*
831              * Support for integrated development environment(s).
832              *
833              * 1) No compiler signon
834              * 2) Send stderr messages to stdout
835              * 3) Less verbose error messages (single line only for each)
836              * 4) Error/warning messages are formatted appropriately to
837              *    be recognized by MS Visual Studio
838              */
839             Gbl_VerboseErrors = FALSE;
840             Gbl_DoSignon = FALSE;
841             Gbl_Files[ASL_FILE_STDERR].Handle = stdout;
842             break;
843 
844         case 'o':
845             Gbl_DisplayOptimizations = TRUE;
846             break;
847 
848         case 'r':
849             Gbl_DisplayRemarks = FALSE;
850             break;
851 
852         case 's':
853             Gbl_DoSignon = FALSE;
854             break;
855 
856         case 't':
857             Gbl_VerboseTemplates = TRUE;
858             break;
859 
860         default:
861             printf ("Unknown option: -v%s\n", AcpiGbl_Optarg);
862             return (-1);
863         }
864         break;
865 
866 
867     case 'w': /* Set warning levels */
868         switch (AcpiGbl_Optarg[0])
869         {
870         case '1':
871             Gbl_WarningLevel = ASL_WARNING;
872             break;
873 
874         case '2':
875             Gbl_WarningLevel = ASL_WARNING2;
876             break;
877 
878         case '3':
879             Gbl_WarningLevel = ASL_WARNING3;
880             break;
881 
882         case 'e':
883             Gbl_WarningsAsErrors = TRUE;
884             break;
885 
886         default:
887             printf ("Unknown option: -w%s\n", AcpiGbl_Optarg);
888             return (-1);
889         }
890         break;
891 
892 
893     case 'x':   /* Set debug print output level */
894         AcpiDbgLevel = strtoul (AcpiGbl_Optarg, NULL, 16);
895         break;
896 
897 
898     case 'z':
899         Gbl_UseOriginalCompilerId = TRUE;
900         break;
901 
902 
903     default:
904         return (-1);
905     }
906 
907     return (0);
908 }
909 
910 
911 /*******************************************************************************
912  *
913  * FUNCTION:    AslCommandLine
914  *
915  * PARAMETERS:  argc/argv
916  *
917  * RETURN:      Last argv index
918  *
919  * DESCRIPTION: Command line processing
920  *
921  ******************************************************************************/
922 
923 static int
924 AslCommandLine (
925     int                     argc,
926     char                    **argv)
927 {
928     int                     BadCommandLine = 0;
929     ACPI_STATUS             Status;
930 
931 
932     /* Minimum command line contains at least the command and an input file */
933 
934     if (argc < 2)
935     {
936         printf (ACPI_COMMON_SIGNON (ASL_COMPILER_NAME));
937         Usage ();
938         exit (1);
939     }
940 
941     /* Process all command line options */
942 
943     BadCommandLine = AslDoOptions (argc, argv, FALSE);
944 
945     if (Gbl_DoTemplates)
946     {
947         Status = DtCreateTemplates (Gbl_TemplateSignature);
948         if (ACPI_FAILURE (Status))
949         {
950             exit (-1);
951         }
952         exit (1);
953     }
954 
955     /* Next parameter must be the input filename */
956 
957     if (!argv[AcpiGbl_Optind] &&
958         !Gbl_DisasmFlag &&
959         !Gbl_GetAllTables)
960     {
961         printf ("Missing input filename\n");
962         BadCommandLine = TRUE;
963     }
964 
965     if (Gbl_DoSignon)
966     {
967         printf (ACPI_COMMON_SIGNON (ASL_COMPILER_NAME));
968         if (Gbl_IgnoreErrors)
969         {
970             printf ("Ignoring all errors, forcing AML file generation\n\n");
971         }
972     }
973 
974     /* Abort if anything went wrong on the command line */
975 
976     if (BadCommandLine)
977     {
978         printf ("\n");
979         Usage ();
980         exit (1);
981     }
982 
983     return (AcpiGbl_Optind);
984 }
985 
986 
987 /*******************************************************************************
988  *
989  * FUNCTION:    main
990  *
991  * PARAMETERS:  Standard argc/argv
992  *
993  * RETURN:      Program termination code
994  *
995  * DESCRIPTION: C main routine for the Asl Compiler. Handle command line
996  *              options and begin the compile for each file on the command line
997  *
998  ******************************************************************************/
999 
1000 int ACPI_SYSTEM_XFACE
1001 main (
1002     int                     argc,
1003     char                    **argv)
1004 {
1005     ACPI_STATUS             Status;
1006     int                     Index1;
1007     int                     Index2;
1008 
1009 
1010     signal (SIGINT, AslSignalHandler);
1011 
1012     AcpiGbl_ExternalFileList = NULL;
1013     AcpiDbgLevel = 0;
1014 
1015 #ifdef _DEBUG
1016     _CrtSetDbgFlag (_CRTDBG_CHECK_ALWAYS_DF | _CRTDBG_LEAK_CHECK_DF |
1017                     _CrtSetDbgFlag(_CRTDBG_REPORT_FLAG));
1018 #endif
1019 
1020     /* Init and command line */
1021 
1022     Index1 = Index2 = AslCommandLine (argc, argv);
1023 
1024     AslInitialize ();
1025     PrInitializePreprocessor ();
1026 
1027     /* Options that have no additional parameters or pathnames */
1028 
1029     if (Gbl_GetAllTables)
1030     {
1031         Status = AslDoOneFile (NULL);
1032         if (ACPI_FAILURE (Status))
1033         {
1034             return (-1);
1035         }
1036         return (0);
1037     }
1038 
1039     if (Gbl_DisassembleAll)
1040     {
1041         while (argv[Index1])
1042         {
1043             Status = AslDoOnePathname (argv[Index1], AcpiDmAddToExternalFileList);
1044             if (ACPI_FAILURE (Status))
1045             {
1046                 return (-1);
1047             }
1048 
1049             Index1++;
1050         }
1051     }
1052 
1053     /* Process each pathname/filename in the list, with possible wildcards */
1054 
1055     while (argv[Index2])
1056     {
1057         Status = AslDoOnePathname (argv[Index2], AslDoOneFile);
1058         if (ACPI_FAILURE (Status))
1059         {
1060             return (-1);
1061         }
1062 
1063         Index2++;
1064     }
1065 
1066     if (AcpiGbl_ExternalFileList)
1067     {
1068         AcpiDmClearExternalFileList();
1069     }
1070 
1071     return (0);
1072 }
1073