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