/*
**
** VConfig - creator for VBCC v0.3d
**
*/

/* #include <dos.h> */
#include <ctype.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#include "vconfig.h"

#include "help.c"
#include "menu_main.c"
#include "menu_optimize.c"
#include "menu_warnings.c"
#include "menu_includePath.c"
#include "menu_libLink.c"
#include "menu_define.c"
#include "menu_compiler.c"
#include "menu_code.c"


const char vers[] = "$VER: VConfig 1.0 (28.7.96)";


void line(int len)
{
    int i;
    char line[255];

    for(i = 0; i < len; i++) line[i] = ' ';
    line[i] = 0; /* EOL */

    printf("[4m%s[0m\n\n", line);
}


void back_help_quit(void)
{
    line(55);
    printf("     [1mB. [0mBack            [1mH. [0mHelp           [1mQ. [0mQuit\n");
    line(55);

    printf("\nPlease select: ");
}

void back_quit(void)
{
    line(55);
    printf("     [1mB. [0mBack                               [1mQ. [0mQuit\n");
    line(55);

    printf("\nPlease select: ");
}



void removeLib(char *lib)
{
    int i;
    for(i = 0; i < 10; i++)
        if(stricmp(libLinkTable[i], lib) == 0)
            strcpy(libLinkTable[i], "");
}


void addLib(char *lib)
{
    int i;
    for(i = 0; i < 10; i++)
    {
        if(strlen(libLinkTable[i]) == 0)
        {
            strcpy(libLinkTable[i], lib);
            return;
        }
    }

    printf("\n\nVolker says:\n\"Everyone who uses more than 10 link libraries is a sick pervert and doesn't deserve to use vconfig. :-)\"\n\n<press return>");
    getchar();
}


void initDefaults(void)
{
    verboseOutput   = 0;
    cpuCode         = 0;                 /* compile for all amiga's */
    fpuCode         = 0;
/*    errorHighlight  = TRUE;            /* put ansi in errorreport */
    optimizeMode    = 1;                 /* optimization default    */
    strcpy(compilationName, "");         /* no filename             */
    compileMethod       = 0;             /* Fully compilation */
    keepIntermediateFiles = FALSE;
    maxErrors       = 10;
    maxOptPasses    = EMPTY;
    inlineSize      = EMPTY;
    datamodel       = LARGE;
    codemodel       = LARGE;
    stripfilename   = FALSE;              /* strip filepath off warnings */
}



long readConfigFile(char *filename)
{
    int retval = 0;
    FILE *fp;

    if((fp = fopen(filename, "r")) != NULL)
    {
        char line[255];
        int warncount, ignorewarncount, includepathcount, liblinkcount, definecount;

        retval = 1;
        warncount = ignorewarncount = includepathcount = liblinkcount = definecount = 0;

        while(fgets(line, 255, fp))
        {
            int len = strlen(line);
            line[--len] = 0; /* remove return code */

            /* avoid empty lines */
            if(len > 2)
            {
                /* THESE VALUES ARE NOT MODIFIABLE */
                if(!strncmp(line, "-pp=",  4)) strcpy(pp, line);
                if(!strncmp(line, "-ppv=", 5)) strcpy(ppv, line);
                if(!strncmp(line, "-as=",  4)) strcpy(as, line);
                if(!strncmp(line, "-asv=", 5)) strcpy(asv, line);
                if(!strncmp(line, "-rm=",  4)) strcpy(rm, line);
                if(!strncmp(line, "-rmv=", 5)) strcpy(rmv, line);
                if(!strncmp(line, "-ld=",  4)) strcpy(ld, line);
                if(!strncmp(line, "-l2=",  4)) strcpy(l2, line);
                if(!strncmp(line, "-ldv=", 5)) strcpy(ldv, line);
                if(!strncmp(line, "-l2v=", 5)) strcpy(l2v, line);


                /* data model */
                if(!strncmp(line, "-sd", 3)) datamodel = SMALL;

                /* code model */
                if(!strncmp(line, "-sc", 3)) codemodel = SMALL;

                /* dontwarn */
                if(!strncmp(line, "-dontwarn=", 10) && ignorewarncount <= 9)
                    ignoreWarnTable[ignorewarncount++] = strtol(&line[10], NULL, 10);

                /* warn */
                if(!strncmp(line, "-warn=", 6) && warncount <= 9)
                    warnTable[warncount++] = strtol(&line[6], NULL, 10);

                /* define */
                if(!strncmp(line, "-D", 2) && definecount <= 9)
                    strcpy(defineTable[definecount++], &line[2]);

                /* include search path */
                if(!strncmp(line, "-I", 2) && includepathcount <= 9)
                    strcpy(includePathTable[includepathcount++], &line[2]);

                /* link ulib */
                if((!strncmp(line, "-l", 2)) && line[3] != '=' && line[4] != '=' && liblinkcount <= 9)
                    strcpy(libLinkTable[liblinkcount++], &line[2]);

                /* intermediate files */
                if(!strncmp(line, "-k", 2)) keepIntermediateFiles = TRUE;

                /* don't compile */
                if(!strncmp(line, "-E", 2)) compileMethod = 1;

                /* don't link */
                if(!strncmp(line, "-c", 2)) compileMethod = 2;

                /* don't assemble */
                if(!strncmp(line, "-S", 2)) compileMethod = 3;

                /* verbose */
                if(!strncmp(line, "-v", 2)) verboseOutput = 1;
                if(!strncmp(line, "-vv", 3)) verboseOutput = 2;

                /* optimize */
                if(!strncmp(line, "-O", 2)) optimizeMode = line[2]-'0';

                /* output name */
                if(!strncmp(line, "-o=", 3)) strncpy(compilationName, &line[3], len-3);

                /* fpu */
                if(!strncmp(line, "-lmieee", 7)) fpuCode = 1; /* IEEE */
                if(!strncmp(line, "-fpu", 4)) fpuCode = 2;

                /* cpu */
                if(!strncmp(line, "-cpu", 4))
                {
                    if(!strcmp(&line[len-5], "68000")) cpuCode = 0; else
                    if(!strcmp(&line[len-5], "68010")) cpuCode = 1; else
                    if(!strcmp(&line[len-5], "68020")) cpuCode = 2; else
                    if(!strcmp(&line[len-5], "68030")) cpuCode = 3; else
                    if(!strcmp(&line[len-5], "68040")) cpuCode = 4; else
                    if(!strcmp(&line[len-5], "68060")) cpuCode = 5;
                }


                /* don't link stdlib */
                if(!strncmp(line, "-nostdlib", 9)) noStdLib = TRUE;

                /* maxerrors */
                if(!strncmp(line, "-maxerrors=", 11)) maxErrors = strtol(&line[11], NULL, 10);

                /* maxoptpasses */
                if(!strncmp(line, "-maxoptpasses=", 14)) maxOptPasses = strtol(&line[14], NULL, 10);

                /* inline-size */
                if(!strncmp(line, "-inline-size=", 13)) inlineSize = strtol(&line[13], NULL, 10);
            }
        }

        fclose(fp);
    }

    return(retval);
}




void saveConfigFile(char *filename)
{
    FILE *fp;

    if((fp = fopen(filename, "w")) != NULL)
    {
        int i;

        fprintf(fp, "%s\n", pp);
        fprintf(fp, "%s\n", ppv);
        fprintf(fp, "%s\n", as);
        fprintf(fp, "%s\n", asv);
        fprintf(fp, "%s\n", rm);
        fprintf(fp, "%s\n", rmv);
        fprintf(fp, "%s\n", ld);
        fprintf(fp, "%s\n", l2);
        fprintf(fp, "%s\n", ldv);
        fprintf(fp, "%s\n", l2v);


        /* write warnings */
        for(i = 0; i < MAXWARNS; i++)
            if(warnTable[i] != EMPTY)
                fprintf(fp, "-warn=%d\n", warnTable[i]);

        /* write ignore warnings */
        for(i = 0; i < MAXWARNS; i++)
            if(ignoreWarnTable[i] != EMPTY)
                fprintf(fp, "-dontwarn=%d\n", ignoreWarnTable[i]);


        /* write extra include search paths */
        for(i = 0; i < 10; i++)
            if(includePathTable[i][0] != 0)
                fprintf(fp, "-I%s\n", includePathTable[i]);


        /* write extra defines */
        for(i = 0; i < 10; i++)
            if(defineTable[i][0] != 0)
                fprintf(fp, "-D%s\n", defineTable[i]);


        /* write extra link .lib's */
        for(i = 0; i < 10; i++)
            if(libLinkTable[i][0] != 0)
                fprintf(fp, "-l%s\n", libLinkTable[i]);


        if(datamodel == SMALL)
            fprintf(fp, "-sd\n");

        if(codemodel == SMALL)
            fprintf(fp, "-sc\n");

        if(compilationName[0] != 0)
            fprintf(fp, "-o=%s\n", compilationName);


        /* cpu */
        switch(cpuCode)
        {
            case 1: fprintf(fp, "-cpu=68010\n"); break;
            case 2: fprintf(fp, "-cpu=68020\n"); break;
            case 3: fprintf(fp, "-cpu=68030\n"); break;
            case 4: fprintf(fp, "-cpu=68040\n"); break;
            case 5: fprintf(fp, "-cpu=68060\n"); break;
        }

        if(fpuCode == 2)
            switch(cpuCode)
            {
                case 2:                                     /* 020 */
                case 3: fprintf(fp, "-fpu=68881\n"); break; /* 030 */
                case 4: fprintf(fp, "-fpu=68040\n"); break; /* 040 */
                case 5: fprintf(fp, "-fpu=68060\n"); break; /* 060 */
            }


        /* optimization */
        switch(optimizeMode)
        {
            case 0: fprintf(fp, "-O0\n"); break;
            case 2: fprintf(fp, "-O1\n"); break;
            case 3: fprintf(fp, "-O2\n"); break;
            case 4: fprintf(fp, "-O3\n"); break;
        }


        if(verboseOutput == 1)
            fprintf(fp, "-v\n");
        else
            if(verboseOutput == 2)
                fprintf(fp, "-vv\n");


        if(compileMethod == 1) fprintf(fp, "-E\n");
        else
            if(compileMethod == 2) fprintf(fp, "-c\n");
        else
            if(compileMethod == 3) fprintf(fp, "-S\n");


        if(noStdLib == TRUE)
            fprintf(fp, "-nostdlib\n");


        if(keepIntermediateFiles == 1)
            fprintf(fp, "-k\n");


        fprintf(fp, "-maxerrors=%d\n", maxErrors);


        if(maxOptPasses != EMPTY)
            fprintf(fp, "-maxoptpasses=%d\n", maxOptPasses);


        if(inlineSize != EMPTY)
            fprintf(fp, "-inline-size=%d\n", inlineSize);


        if(stripfilename == TRUE)
            fprintf(fp, "-strip-path\n");


        fclose(fp);
    }
    else
    {
        printf("Can't write file \"%s\"!\n<press return>", filename);
        getchar();
    }
}



main()
{
    int returnval = 0;
    initDefaults();

    /* If loacle cfg file doesn't exist */
    if(readConfigFile("vc.config") == 0)
    {
        if(readConfigFile("env:vc.config") == 0)
        {
            if(readConfigFile("envarc:vc.config") == 0)
            {
                if(readConfigFile("vbcc:vc.config") == 0)
                    printf("Locale configfile not found, reading default configfile.\n");
                else
                    printf("No configfile found!\n");
            }
        }
    }


    while(returnval == 0)
        returnval = mainMenu();

    if(returnval == SAVE)
        saveConfigFile("vc.config");
    else
        if(returnval == SAVEDEFAULT)
        {
            saveConfigFile("ENV:vc.config");
            saveConfigFile("ENVARC:vc.config");
        }

    printf("\n\n");

}


