/*
 * compiler options processing
 * March 1989, Miles Bader
 */

#include "common.h"
#include "options.h"

long globalOpts[MAXOPTS/BITSPERLONG];

struct option {
    char *name;
    int opt;
    int *set;
};

/* pre-processor compatibility modes */
int ppOptSet[]={OPT_TRAD, OPT_ANSI, OPT_CPP, 0};

/* cpu-types */
int cpuOptSet[]={OPT_68K, OPT_020, OPT_030, 0};

/* types of floating point support */
int floatOptSet[]={OPT_FFP, OPT_IEEE, OPT_881, 0};

struct option optionlist[]={
/*   name              mask            excludes        */

    /* parsing */
    {"ansi",           OPT_ANSI,       ppOptSet},
    {"c++",            OPT_CPP,        ppOptSet},
    {"traditional",    OPT_TRAD,       ppOptSet},

    /* code gen */
    {"abs-code",       OPT_ABSCODE},
    {"abs-data",       OPT_ABSDATA},

    {"reg-args",       OPT_REGARGS},
    {"reload-a4",      OPT_RELOADA4},
    {"short-ints",     OPT_SHORTINTS},
    {"long-align",     OPT_LONGALIGN},
    {"stack-check",    OPT_STACKCHECK},

    {"pure-strings",   OPT_PURESTRINGS},

    {"68k",            OPT_68K,        cpuOptSet},
    {"020",            OPT_020,        cpuOptSet},
    {"030",            OPT_030,        cpuOptSet},

    {"881",            OPT_881,        floatOptSet},
    {"ffp",            OPT_FFP,        floatOptSet},
    {"ieee",           OPT_IEEE,       floatOptSet},

    /* linking */
    {"detach",         OPT_DETACH},
    {"resident",       OPT_RESIDENT},
    {"tiny-main",      OPT_TINYMAIN},
    {"catch",          OPT_CATCH},

    {"optimize",       OPT_OPTIMIZE},
    {"link",           OPT_LINK},
    {"compile",                OPT_COMPILE},
    {"assemble",       OPT_ASSEMBLE},
    {"debug",          OPT_DEBUG},

    {"echo",           OPT_ECHO},
    {"filter",         OPT_FILTER},
    {"exec",           OPT_EXEC},

    {"big-lc1",                OPT_BIGLC1},

    NULL
};

void options_SetByName(optname)
char *optname;
{
    struct option *opt;
    int not=FALSE;

    if(strncmp(optname,"no-",3)==0){
       optname+=3;
       not=TRUE;
    }

    for(opt=optionlist; opt->name!=NULL; opt++)
       if(strcmp(optname,opt->name)==0){
           if(not){
               if(opt->set!=NULL)
                   fatal("%s is not a boolean option",opt);
               else
                   options_Clear(opt->opt);
           }else{
               if(opt->set!=NULL){
                   int *clear;
                   for(clear=opt->set; *clear!=0; clear++)
                       options_Clear(*clear);
               }
               
               options_Set(opt->opt);
           }

           break;
       }

    if(opt->name==NULL)
       fatal("unknown option: %s",optname);
}

void options_Init()
{
    int i;
    for(i=0; i<(MAXOPTS/BITSPERLONG); i++)
       globalOpts[i]=0;
}
