asloptions.c revision 281075
188480Sjoerg/******************************************************************************
24007Sjoerg *
379755Sdd * Module Name: asloptions - compiler command line processing
44007Sjoerg *
54007Sjoerg *****************************************************************************/
64007Sjoerg
74007Sjoerg/*
84007Sjoerg * Copyright (C) 2000 - 2015, Intel Corp.
94007Sjoerg * All rights reserved.
104007Sjoerg *
114007Sjoerg * Redistribution and use in source and binary forms, with or without
1279755Sdd * modification, are permitted provided that the following conditions
134007Sjoerg * are met:
144007Sjoerg * 1. Redistributions of source code must retain the above copyright
154007Sjoerg *    notice, this list of conditions, and the following disclaimer,
164007Sjoerg *    without modification.
174007Sjoerg * 2. Redistributions in binary form must reproduce at minimum a disclaimer
184007Sjoerg *    substantially similar to the "NO WARRANTY" disclaimer below
194007Sjoerg *    ("Disclaimer") and any redistribution must be conditioned upon
204007Sjoerg *    including a substantially similar Disclaimer requirement for further
214007Sjoerg *    binary redistribution.
224007Sjoerg * 3. Neither the names of the above-listed copyright holders nor the names
234007Sjoerg *    of any contributors may be used to endorse or promote products derived
244007Sjoerg *    from this software without specific prior written permission.
2548791Snik *
2650479Speter * Alternatively, this software may be distributed under the terms of the
2748791Snik * GNU General Public License ("GPL") version 2 as published by the Free
28338545Seugen * Software Foundation.
29208593Suqs *
304007Sjoerg * NO WARRANTY
314007Sjoerg * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
324007Sjoerg * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
3388480Sjoerg * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
344007Sjoerg * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
3568965Sru * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
3688480Sjoerg * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
3788480Sjoerg * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
3888480Sjoerg * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
3988480Sjoerg * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
4088480Sjoerg * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
414007Sjoerg * POSSIBILITY OF SUCH DAMAGES.
4288480Sjoerg */
4388480Sjoerg
4468965Sru#include <contrib/dev/acpica/compiler/aslcompiler.h>
4588480Sjoerg#include <contrib/dev/acpica/include/acapps.h>
4688480Sjoerg#include <contrib/dev/acpica/include/acdisasm.h>
4788480Sjoerg
484007Sjoerg#define _COMPONENT          ACPI_COMPILER
4920245Smpp        ACPI_MODULE_NAME    ("asloption")
5088480Sjoerg
5188480Sjoerg
5288480Sjoerg/* Local prototypes */
5389228Sru
5489228Srustatic int
5588480SjoergAslDoOptions (
5688480Sjoerg    int                     argc,
5788480Sjoerg    char                    **argv,
5820245Smpp    BOOLEAN                 IsResponseFile);
5988480Sjoerg
6088480Sjoergstatic void
6189228SruAslMergeOptionTokens (
6288480Sjoerg    char                    *InBuffer,
6389228Sru    char                    *OutBuffer);
6488480Sjoerg
6588480Sjoergstatic int
6688480SjoergAslDoResponseFile (
67117287Smarkm    char                    *Filename);
6888480Sjoerg
6989228Sru
7089228Sru#define ASL_TOKEN_SEPARATORS    " \t\n"
7189228Sru#define ASL_SUPPORTED_OPTIONS   "@:b|c|d^D:e:f^gh^i|I:l^m:no|p:P^r:s|t|T+G^v^w|x:z"
7289228Sru
7389228Sru
7489228Sru/*******************************************************************************
7589228Sru *
7688480Sjoerg * FUNCTION:    AslCommandLine
7789228Sru *
78108317Sschweikh * PARAMETERS:  argc/argv
7988480Sjoerg *
8088480Sjoerg * RETURN:      Last argv index
8188480Sjoerg *
8288480Sjoerg * DESCRIPTION: Command line processing
8388480Sjoerg *
8488480Sjoerg ******************************************************************************/
8588480Sjoerg
8688480Sjoergint
8788480SjoergAslCommandLine (
8888480Sjoerg    int                     argc,
8988480Sjoerg    char                    **argv)
9088480Sjoerg{
9189228Sru    int                     BadCommandLine = 0;
9289228Sru    ACPI_STATUS             Status;
9388480Sjoerg
9488480Sjoerg
9588480Sjoerg    /* Minimum command line contains at least the command and an input file */
9689228Sru
974007Sjoerg    if (argc < 2)
9888480Sjoerg    {
9988480Sjoerg        printf (ACPI_COMMON_SIGNON (ASL_COMPILER_NAME));
10089228Sru        Usage ();
10189228Sru        exit (1);
10288480Sjoerg    }
10389228Sru
10489228Sru    /* Process all command line options */
10588480Sjoerg
10688480Sjoerg    BadCommandLine = AslDoOptions (argc, argv, FALSE);
107117287Smarkm
10889228Sru    if (Gbl_DoTemplates)
10988480Sjoerg    {
11089228Sru        Status = DtCreateTemplates (Gbl_TemplateSignature);
11189228Sru        if (ACPI_FAILURE (Status))
11289228Sru        {
11389228Sru            exit (-1);
11488480Sjoerg        }
11588480Sjoerg        exit (1);
11688480Sjoerg    }
11788480Sjoerg
11888480Sjoerg    /* Next parameter must be the input filename */
11988480Sjoerg
12088480Sjoerg    if (!argv[AcpiGbl_Optind] &&
12188480Sjoerg        !Gbl_DisasmFlag)
12288480Sjoerg    {
12388480Sjoerg        printf ("Missing input filename\n");
12488480Sjoerg        BadCommandLine = TRUE;
12588480Sjoerg    }
12689228Sru
12789228Sru    if (Gbl_DoSignon)
12889228Sru    {
12989228Sru        printf (ACPI_COMMON_SIGNON (ASL_COMPILER_NAME));
13088480Sjoerg        if (Gbl_IgnoreErrors)
13188480Sjoerg        {
13288480Sjoerg            printf ("Ignoring all errors, forcing AML file generation\n\n");
13388480Sjoerg        }
13488480Sjoerg    }
13588480Sjoerg
13688480Sjoerg    if (BadCommandLine)
13788480Sjoerg    {
13888480Sjoerg        printf ("Use -h option for help information\n");
13988480Sjoerg        exit (1);
14088480Sjoerg    }
14188480Sjoerg
14288480Sjoerg    return (AcpiGbl_Optind);
14388480Sjoerg}
14488480Sjoerg
14589228Sru
14689228Sru/*******************************************************************************
14789228Sru *
14889228Sru * FUNCTION:    AslDoOptions
14988480Sjoerg *
15088480Sjoerg * PARAMETERS:  argc/argv           - Standard argc/argv
15188480Sjoerg *              IsResponseFile      - TRUE if executing a response file.
15288480Sjoerg *
15388480Sjoerg * RETURN:      Status
15488480Sjoerg *
15589228Sru * DESCRIPTION: Command line option processing
15689228Sru *
15789228Sru ******************************************************************************/
15889228Sru
15988480Sjoergstatic int
16088480SjoergAslDoOptions (
16188480Sjoerg    int                     argc,
16288480Sjoerg    char                    **argv,
16388480Sjoerg    BOOLEAN                 IsResponseFile)
16488480Sjoerg{
16589228Sru    ACPI_STATUS             Status;
16688480Sjoerg    UINT32                  j;
16788480Sjoerg
16888480Sjoerg
16988480Sjoerg    /* Get the command line options */
17089228Sru
17189228Sru    while ((j = AcpiGetopt (argc, argv, ASL_SUPPORTED_OPTIONS)) != ACPI_OPT_END) switch (j)
17288480Sjoerg    {
17388480Sjoerg    case '@':   /* Begin a response file */
17488480Sjoerg
17589228Sru        if (IsResponseFile)
17689228Sru        {
17789228Sru            printf ("Nested command files are not supported\n");
17889228Sru            return (-1);
17988480Sjoerg        }
18088480Sjoerg
18189228Sru        if (AslDoResponseFile (AcpiGbl_Optarg))
18288480Sjoerg        {
18388480Sjoerg            return (-1);
18488480Sjoerg        }
18588480Sjoerg        break;
18688480Sjoerg
18788480Sjoerg    case 'b':   /* Debug options */
18888480Sjoerg
18988480Sjoerg        switch (AcpiGbl_Optarg[0])
19088480Sjoerg        {
19188480Sjoerg        case 'f':
19288480Sjoerg
19388480Sjoerg            AslCompilerdebug = 1; /* same as yydebug */
19488480Sjoerg            DtParserdebug = 1;
19589228Sru            PrParserdebug = 1;
19689228Sru            Gbl_DebugFlag = TRUE;
19788480Sjoerg            break;
19888480Sjoerg
19988480Sjoerg        case 'p':   /* Prune ASL parse tree */
20088480Sjoerg
20188480Sjoerg            /* Get the required argument */
20288480Sjoerg
20389228Sru            if (AcpiGetoptArgument (argc, argv))
20489228Sru            {
20588480Sjoerg                return (-1);
20688480Sjoerg            }
207131500Sru
20888480Sjoerg            Gbl_PruneParseTree = TRUE;
20988480Sjoerg            Gbl_PruneDepth = (UINT8) strtoul (AcpiGbl_Optarg, NULL, 0);
21088480Sjoerg            break;
21189228Sru
21289228Sru        case 's':
21389228Sru
21488480Sjoerg            Gbl_DebugFlag = TRUE;
21589228Sru            break;
21688480Sjoerg
21789228Sru        case 't':
21888480Sjoerg
21988480Sjoerg            /* Get the required argument */
22089228Sru
221131500Sru            if (AcpiGetoptArgument (argc, argv))
22288480Sjoerg            {
22389228Sru                return (-1);
22488480Sjoerg            }
22588480Sjoerg
22689228Sru            Gbl_PruneType = (UINT8) strtoul (AcpiGbl_Optarg, NULL, 0);
22788480Sjoerg            break;
22888480Sjoerg
22988480Sjoerg        default:
23088480Sjoerg
23188480Sjoerg            printf ("Unknown option: -b%s\n", AcpiGbl_Optarg);
23289228Sru            return (-1);
23389228Sru        }
23488480Sjoerg
23589228Sru        break;
23688480Sjoerg
23788480Sjoerg    case 'c':
23888480Sjoerg
23988480Sjoerg        switch (AcpiGbl_Optarg[0])
240130091Sru        {
24188480Sjoerg        case 'r':
24288480Sjoerg
24388480Sjoerg            Gbl_NoResourceChecking = TRUE;
24488480Sjoerg            break;
24589228Sru
24689228Sru        default:
24788480Sjoerg
24889228Sru            printf ("Unknown option: -c%s\n", AcpiGbl_Optarg);
24988480Sjoerg            return (-1);
25089228Sru        }
25188480Sjoerg        break;
25288480Sjoerg
253130091Sru    case 'd':   /* Disassembler */
254126234Sphk
255126234Sphk        switch (AcpiGbl_Optarg[0])
256130091Sru        {
25788480Sjoerg        case '^':
258130091Sru
259130091Sru            Gbl_DoCompile = FALSE;
260126234Sphk            break;
26188480Sjoerg
26288480Sjoerg        case 'a':
26388480Sjoerg
264130091Sru            Gbl_DoCompile = FALSE;
265130091Sru            Gbl_DisassembleAll = TRUE;
266126234Sphk            break;
267126234Sphk
268126234Sphk        case 'b':   /* Do not convert buffers to resource descriptors */
269126234Sphk
270126234Sphk            AcpiGbl_NoResourceDisassembly = TRUE;
271126234Sphk            break;
272126234Sphk
273126234Sphk        case 'c':
274126234Sphk
275126234Sphk            break;
276126234Sphk
277126234Sphk        case 'l':   /* Use legacy ASL code (not ASL+) for disassembly */
27888480Sjoerg
27920245Smpp            Gbl_DoCompile = FALSE;
28088480Sjoerg            AcpiGbl_CstyleDisassembly = FALSE;
28188480Sjoerg            break;
28289228Sru
28388480Sjoerg        default:
28489228Sru
28589228Sru            printf ("Unknown option: -d%s\n", AcpiGbl_Optarg);
28688480Sjoerg            return (-1);
28788480Sjoerg        }
28888480Sjoerg
28988480Sjoerg        Gbl_DisasmFlag = TRUE;
290126234Sphk        break;
291130091Sru
292126234Sphk    case 'D':   /* Define a symbol */
293130091Sru
294126234Sphk        PrAddDefine (AcpiGbl_Optarg, NULL, TRUE);
295130091Sru        break;
296126234Sphk
297126234Sphk    case 'e':   /* External files for disassembler */
298130091Sru
29921880Swosch        /* Get entire list of external files */
3004007Sjoerg
30188480Sjoerg        AcpiGbl_Optind--;
30288480Sjoerg        argv[AcpiGbl_Optind] = AcpiGbl_Optarg;
30388480Sjoerg
30488480Sjoerg        while (argv[AcpiGbl_Optind] &&
305117287Smarkm              (argv[AcpiGbl_Optind][0] != '-'))
30688480Sjoerg        {
30734809Scharnier            Status = AcpiDmAddToExternalFileList (argv[AcpiGbl_Optind]);
308117287Smarkm            if (ACPI_FAILURE (Status))
30968575Sru            {
3104007Sjoerg                printf ("Could not add %s to external list\n", argv[AcpiGbl_Optind]);
311                return (-1);
312            }
313
314            AcpiGbl_Optind++;
315        }
316        break;
317
318    case 'f':
319
320        switch (AcpiGbl_Optarg[0])
321        {
322        case '^':   /* Ignore errors and force creation of aml file */
323
324            Gbl_IgnoreErrors = TRUE;
325            break;
326
327        case 'e':   /* Disassembler: Get external declaration file */
328
329            if (AcpiGetoptArgument (argc, argv))
330            {
331                return (-1);
332            }
333
334            Gbl_ExternalRefFilename = AcpiGbl_Optarg;
335            break;
336
337        default:
338
339            printf ("Unknown option: -f%s\n", AcpiGbl_Optarg);
340            return (-1);
341        }
342        break;
343
344    case 'G':
345
346        Gbl_CompileGeneric = TRUE;
347        break;
348
349    case 'g':   /* Get all ACPI tables */
350
351        printf ("-g option is deprecated, use acpidump utility instead\n");
352        exit (1);
353
354    case 'h':
355
356        switch (AcpiGbl_Optarg[0])
357        {
358        case '^':
359
360            Usage ();
361            exit (0);
362
363        case 'c':
364
365            UtDisplayConstantOpcodes ();
366            exit (0);
367
368        case 'f':
369
370            AslFilenameHelp ();
371            exit (0);
372
373        case 'r':
374
375            /* reserved names */
376
377            ApDisplayReservedNames ();
378            exit (0);
379
380        case 't':
381
382            UtDisplaySupportedTables ();
383            exit (0);
384
385        default:
386
387            printf ("Unknown option: -h%s\n", AcpiGbl_Optarg);
388            return (-1);
389        }
390
391    case 'I':   /* Add an include file search directory */
392
393        FlAddIncludeDirectory (AcpiGbl_Optarg);
394        break;
395
396    case 'i':   /* Output AML as an include file */
397
398        switch (AcpiGbl_Optarg[0])
399        {
400        case 'a':
401
402            /* Produce assembly code include file */
403
404            Gbl_AsmIncludeOutputFlag = TRUE;
405            break;
406
407        case 'c':
408
409            /* Produce C include file */
410
411            Gbl_C_IncludeOutputFlag = TRUE;
412            break;
413
414        case 'n':
415
416            /* Compiler/Disassembler: Ignore the NOOP operator */
417
418            AcpiGbl_IgnoreNoopOperator = TRUE;
419            break;
420
421        default:
422
423            printf ("Unknown option: -i%s\n", AcpiGbl_Optarg);
424            return (-1);
425        }
426        break;
427
428    case 'l':   /* Listing files */
429
430        switch (AcpiGbl_Optarg[0])
431        {
432        case '^':
433
434            /* Produce listing file (Mixed source/aml) */
435
436            Gbl_ListingFlag = TRUE;
437            break;
438
439        case 'i':
440
441            /* Produce preprocessor output file */
442
443            Gbl_PreprocessorOutputFlag = TRUE;
444            break;
445
446        case 'm':
447
448            /* Produce hardware map summary file */
449
450            Gbl_MapfileFlag = TRUE;
451            break;
452
453        case 'n':
454
455            /* Produce namespace file */
456
457            Gbl_NsOutputFlag = TRUE;
458            break;
459
460        case 's':
461
462            /* Produce combined source file */
463
464            Gbl_SourceOutputFlag = TRUE;
465            break;
466
467        default:
468
469            printf ("Unknown option: -l%s\n", AcpiGbl_Optarg);
470            return (-1);
471        }
472        break;
473
474    case 'm':   /* Set line buffer size */
475
476        Gbl_LineBufferSize = (UINT32) strtoul (AcpiGbl_Optarg, NULL, 0) * 1024;
477        if (Gbl_LineBufferSize < ASL_DEFAULT_LINE_BUFFER_SIZE)
478        {
479            Gbl_LineBufferSize = ASL_DEFAULT_LINE_BUFFER_SIZE;
480        }
481        printf ("Line Buffer Size: %u\n", Gbl_LineBufferSize);
482        break;
483
484    case 'n':   /* Parse only */
485
486        Gbl_ParseOnlyFlag = TRUE;
487        break;
488
489    case 'o':   /* Control compiler AML optimizations */
490
491        switch (AcpiGbl_Optarg[0])
492        {
493        case 'a':
494
495            /* Disable all optimizations */
496
497            Gbl_FoldConstants = FALSE;
498            Gbl_IntegerOptimizationFlag = FALSE;
499            Gbl_ReferenceOptimizationFlag = FALSE;
500            break;
501
502        case 'f':
503
504            /* Disable folding on "normal" expressions */
505
506            Gbl_FoldConstants = FALSE;
507            break;
508
509        case 'i':
510
511            /* Disable integer optimization to constants */
512
513            Gbl_IntegerOptimizationFlag = FALSE;
514            break;
515
516        case 'n':
517
518            /* Disable named reference optimization */
519
520            Gbl_ReferenceOptimizationFlag = FALSE;
521            break;
522
523        case 't':
524
525            /* Display compile time(s) */
526
527            Gbl_CompileTimesFlag = TRUE;
528            break;
529
530        default:
531
532            printf ("Unknown option: -c%s\n", AcpiGbl_Optarg);
533            return (-1);
534        }
535        break;
536
537    case 'P':   /* Preprocessor options */
538
539        switch (AcpiGbl_Optarg[0])
540        {
541        case '^':   /* Proprocess only, emit (.i) file */
542
543            Gbl_PreprocessOnly = TRUE;
544            Gbl_PreprocessorOutputFlag = TRUE;
545            break;
546
547        case 'n':   /* Disable preprocessor */
548
549            Gbl_PreprocessFlag = FALSE;
550            break;
551
552        default:
553
554            printf ("Unknown option: -P%s\n", AcpiGbl_Optarg);
555            return (-1);
556        }
557        break;
558
559    case 'p':   /* Override default AML output filename */
560
561        Gbl_OutputFilenamePrefix = AcpiGbl_Optarg;
562        UtConvertBackslashes (Gbl_OutputFilenamePrefix);
563        Gbl_UseDefaultAmlFilename = FALSE;
564        break;
565
566    case 'r':   /* Override revision found in table header */
567
568        Gbl_RevisionOverride = (UINT8) strtoul (AcpiGbl_Optarg, NULL, 0);
569        break;
570
571    case 's':   /* Create AML in a source code file */
572
573        switch (AcpiGbl_Optarg[0])
574        {
575        case 'a':
576
577            /* Produce assembly code output file */
578
579            Gbl_AsmOutputFlag = TRUE;
580            break;
581
582        case 'c':
583
584            /* Produce C hex output file */
585
586            Gbl_C_OutputFlag = TRUE;
587            break;
588
589        case 'o':
590
591            /* Produce AML offset table in C */
592
593            Gbl_C_OffsetTableFlag = TRUE;
594            break;
595
596        default:
597
598            printf ("Unknown option: -s%s\n", AcpiGbl_Optarg);
599            return (-1);
600        }
601        break;
602
603    case 't':   /* Produce hex table output file */
604
605        switch (AcpiGbl_Optarg[0])
606        {
607        case 'a':
608
609            Gbl_HexOutputFlag = HEX_OUTPUT_ASM;
610            break;
611
612        case 'c':
613
614            Gbl_HexOutputFlag = HEX_OUTPUT_C;
615            break;
616
617        case 's':
618
619            Gbl_HexOutputFlag = HEX_OUTPUT_ASL;
620            break;
621
622        default:
623
624            printf ("Unknown option: -t%s\n", AcpiGbl_Optarg);
625            return (-1);
626        }
627        break;
628
629    case 'T':   /* Create a ACPI table template file */
630
631        Gbl_DoTemplates = TRUE;
632        Gbl_TemplateSignature = AcpiGbl_Optarg;
633        break;
634
635    case 'v':   /* Version and verbosity settings */
636
637        switch (AcpiGbl_Optarg[0])
638        {
639        case '^':
640
641            printf (ACPI_COMMON_SIGNON (ASL_COMPILER_NAME));
642            exit (0);
643
644        case 'a':
645
646            /* Disable all error/warning/remark messages */
647
648            Gbl_NoErrors = TRUE;
649            break;
650
651        case 'e':
652
653            /* Disable all warning/remark messages (errors only) */
654
655            Gbl_DisplayRemarks = FALSE;
656            Gbl_DisplayWarnings = FALSE;
657            break;
658
659        case 'i':
660            /*
661             * Support for integrated development environment(s).
662             *
663             * 1) No compiler signon
664             * 2) Send stderr messages to stdout
665             * 3) Less verbose error messages (single line only for each)
666             * 4) Error/warning messages are formatted appropriately to
667             *    be recognized by MS Visual Studio
668             */
669            Gbl_VerboseErrors = FALSE;
670            Gbl_DoSignon = FALSE;
671            Gbl_Files[ASL_FILE_STDERR].Handle = stdout;
672            break;
673
674        case 'o':
675
676            Gbl_DisplayOptimizations = TRUE;
677            break;
678
679        case 'r':
680
681            Gbl_DisplayRemarks = FALSE;
682            break;
683
684        case 's':
685
686            Gbl_DoSignon = FALSE;
687            break;
688
689        case 't':
690
691            Gbl_VerboseTemplates = TRUE;
692            break;
693
694        case 'w':
695
696            /* Get the required argument */
697
698            if (AcpiGetoptArgument (argc, argv))
699            {
700                return (-1);
701            }
702
703            Status = AslDisableException (AcpiGbl_Optarg);
704            if (ACPI_FAILURE (Status))
705            {
706                return (-1);
707            }
708            break;
709
710        default:
711
712            printf ("Unknown option: -v%s\n", AcpiGbl_Optarg);
713            return (-1);
714        }
715        break;
716
717    case 'w': /* Set warning levels */
718
719        switch (AcpiGbl_Optarg[0])
720        {
721        case '1':
722
723            Gbl_WarningLevel = ASL_WARNING;
724            break;
725
726        case '2':
727
728            Gbl_WarningLevel = ASL_WARNING2;
729            break;
730
731        case '3':
732
733            Gbl_WarningLevel = ASL_WARNING3;
734            break;
735
736        case 'e':
737
738            Gbl_WarningsAsErrors = TRUE;
739            break;
740
741        default:
742
743            printf ("Unknown option: -w%s\n", AcpiGbl_Optarg);
744            return (-1);
745        }
746        break;
747
748    case 'x':   /* Set debug print output level */
749
750        AcpiDbgLevel = strtoul (AcpiGbl_Optarg, NULL, 16);
751        break;
752
753    case 'z':
754
755        Gbl_UseOriginalCompilerId = TRUE;
756        break;
757
758    default:
759
760        return (-1);
761    }
762
763    return (0);
764}
765
766
767/*******************************************************************************
768 *
769 * FUNCTION:    AslMergeOptionTokens
770 *
771 * PARAMETERS:  InBuffer            - Input containing an option string
772 *              OutBuffer           - Merged output buffer
773 *
774 * RETURN:      None
775 *
776 * DESCRIPTION: Remove all whitespace from an option string.
777 *
778 ******************************************************************************/
779
780static void
781AslMergeOptionTokens (
782    char                    *InBuffer,
783    char                    *OutBuffer)
784{
785    char                    *Token;
786
787
788    *OutBuffer = 0;
789
790    Token = strtok (InBuffer, ASL_TOKEN_SEPARATORS);
791    while (Token)
792    {
793        strcat (OutBuffer, Token);
794        Token = strtok (NULL, ASL_TOKEN_SEPARATORS);
795    }
796}
797
798
799/*******************************************************************************
800 *
801 * FUNCTION:    AslDoResponseFile
802 *
803 * PARAMETERS:  Filename        - Name of the response file
804 *
805 * RETURN:      Status
806 *
807 * DESCRIPTION: Open a response file and process all options within.
808 *
809 ******************************************************************************/
810
811static int
812AslDoResponseFile (
813    char                    *Filename)
814{
815    char                    *argv = StringBuffer2;
816    FILE                    *ResponseFile;
817    int                     OptStatus = 0;
818    int                     Opterr;
819    int                     Optind;
820
821
822    ResponseFile = fopen (Filename, "r");
823    if (!ResponseFile)
824    {
825        printf ("Could not open command file %s, %s\n",
826            Filename, strerror (errno));
827        return (-1);
828    }
829
830    /* Must save the current GetOpt globals */
831
832    Opterr = AcpiGbl_Opterr;
833    Optind = AcpiGbl_Optind;
834
835    /*
836     * Process all lines in the response file. There must be one complete
837     * option per line
838     */
839    while (fgets (StringBuffer, ASL_MSG_BUFFER_SIZE, ResponseFile))
840    {
841        /* Compress all tokens, allowing us to use a single argv entry */
842
843        AslMergeOptionTokens (StringBuffer, StringBuffer2);
844
845        /* Process the option */
846
847        AcpiGbl_Opterr = 0;
848        AcpiGbl_Optind = 0;
849
850        OptStatus = AslDoOptions (1, &argv, TRUE);
851        if (OptStatus)
852        {
853            printf ("Invalid option in command file %s: %s\n",
854                Filename, StringBuffer);
855            break;
856        }
857    }
858
859    /* Restore the GetOpt globals */
860
861    AcpiGbl_Opterr = Opterr;
862    AcpiGbl_Optind = Optind;
863
864    fclose (ResponseFile);
865    return (OptStatus);
866}
867