/*
 * DOS CONFIG.SYS parser
 *
 * Copyright 1998 Andreas Mohr
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 */

#include "config.h"
#include "wine/port.h"

#include <stdio.h>
#ifdef HAVE_UNISTD_H
# include <unistd.h>
#endif
#include <string.h>
#include <stdlib.h>
#include <ctype.h>

#include "winbase.h"

#include "file.h"
#include "miscemu.h"
#include "msdos.h"

#include "wine/debug.h"
#include "wine/unicode.h"

WINE_DEFAULT_DEBUG_CHANNEL(profile);


static int DOSCONF_Device(char **confline);
static int DOSCONF_Dos(char **confline);
static int DOSCONF_Fcbs(char **confline);
static int DOSCONF_Break(char **confline);
static int DOSCONF_Files(char **confline);
static int DOSCONF_Install(char **confline);
static int DOSCONF_Lastdrive(char **confline);
static int DOSCONF_Menu(char **confline);
static int DOSCONF_Include(char **confline);
static int DOSCONF_Country(char **confline);
static int DOSCONF_Numlock(char **confline);
static int DOSCONF_Switches(char **confline);
static int DOSCONF_Shell(char **confline);
static int DOSCONF_Stacks(char **confline);
static int DOSCONF_Buffers(char **confline);
static void DOSCONF_Parse(char *menuname);

DOSCONF DOSCONF_config =
{
    'E',  /* lastdrive */
    0,    /* brk_flag */
    8,    /* files */
    9,    /* stacks_nr */
    256,  /* stacks_sz */
    15,   /* buf */
    1,    /* buf2 */
    4,    /* fcbs */
    0,    /* flags */
    NULL, /* shell */
    NULL  /* country */
};

typedef struct {
    const char *tag_name;
    int (*tag_handler)(char **p);
} TAG_ENTRY;


/*
 * see
 * http://egeria.cm.cf.ac.uk/User/P.L.Poulain/project/internal/allinter.htm
 * or
 * http://www.csulb.edu/~murdock/dosindex.html
 */

static const TAG_ENTRY tag_entries[] =
{
    { ";", NULL },
    { "REM ", NULL },
    { "DEVICE", DOSCONF_Device },
    { "[", DOSCONF_Menu },
    { "SUBMENU", NULL },
    { "MENUDEFAULT", DOSCONF_Menu },
    { "INCLUDE", DOSCONF_Include },

    { "INSTALL", DOSCONF_Install },
    { "DOS", DOSCONF_Dos },
    { "FCBS", DOSCONF_Fcbs },
    { "BREAK", DOSCONF_Break },
    { "FILES", DOSCONF_Files },
    { "SHELL", DOSCONF_Shell },
    { "STACKS", DOSCONF_Stacks },
    { "BUFFERS", DOSCONF_Buffers },
    { "COUNTRY", DOSCONF_Country },
    { "NUMLOCK", DOSCONF_Numlock },
    { "SWITCHES", DOSCONF_Switches },
    { "LASTDRIVE", DOSCONF_Lastdrive }
};

static FILE *cfg_fd;

static char *menu_default = NULL;
static int menu_in_listing = 0;		/* we are in the [menu] section */
static int menu_skip = 0;				/* the current menu gets skipped */


static void DOSCONF_skip(char **pconfline)
{
    char *p;

    p = *pconfline;
    while ( (*p == ' ') || (*p == '\t') ) p++;
    *pconfline = p;
}

static int DOSCONF_JumpToEntry(char **pconfline, char separator)
{
    char *p;

    p = *pconfline;
    while ( (*p != separator) && (*p != '\0') ) p++;

    if (*p != separator)
	return 0;
    else p++;

    while ( (*p == ' ') || (*p == '\t') ) p++;
    *pconfline = p;
    return 1;
}

static int DOSCONF_Device(char **confline)
{
    int loadhigh = 0;

    *confline += 6; /* strlen("DEVICE") */
    if (!(strncasecmp(*confline, "HIGH", 4)))
    {
	loadhigh = 1;
	*confline += 4;
	/* FIXME: get DEVICEHIGH parameters if avail ? */
    }
    if (!(DOSCONF_JumpToEntry(confline, '='))) return 0;
    TRACE("Loading device '%s'\n", *confline);
#if 0
    DOSMOD_LoadDevice(*confline, loadhigh);
#endif
    return 1;
}

static int DOSCONF_Dos(char **confline)
{
    *confline += 3; /* strlen("DOS") */
    if (!(DOSCONF_JumpToEntry(confline, '='))) return 0;
    while (**confline != '\0')
    {
	if (!(strncasecmp(*confline, "HIGH", 4)))
	{
	    DOSCONF_config.flags |= DOSCONF_MEM_HIGH;
	    *confline += 4;
	}
	else
	if (!(strncasecmp(*confline, "UMB", 3)))
	{
	    DOSCONF_config.flags |= DOSCONF_MEM_UMB;
	    *confline += 3;
	}
        else (*confline)++;
	DOSCONF_JumpToEntry(confline, ',');
    }
    TRACE("DOSCONF_Dos: HIGH is %d, UMB is %d\n",
    	(DOSCONF_config.flags & DOSCONF_MEM_HIGH) != 0, (DOSCONF_config.flags & DOSCONF_MEM_UMB) != 0);
    return 1;
}

static int DOSCONF_Fcbs(char **confline)
{
    *confline += 4; /* strlen("FCBS") */
    if (!(DOSCONF_JumpToEntry(confline, '='))) return 0;
    DOSCONF_config.fcbs = atoi(*confline);
    if (DOSCONF_config.fcbs > 255)
    {
		MESSAGE("The FCBS value in the config.sys file is too high ! Setting to 255.\n");
		DOSCONF_config.fcbs = 255;
    }
    TRACE("DOSCONF_Fcbs returning %d\n", DOSCONF_config.fcbs);
    return 1;
}

static int DOSCONF_Break(char **confline)
{
    *confline += 5; /* strlen("BREAK") */
    if (!(DOSCONF_JumpToEntry(confline, '='))) return 0;
    if (!(strcasecmp(*confline, "ON")))
        DOSCONF_config.brk_flag = 1;
    TRACE("BREAK is %d\n", DOSCONF_config.brk_flag);
    return 1;
}

static int DOSCONF_Files(char **confline)
{
    *confline += 5; /* strlen("FILES") */
    if (!(DOSCONF_JumpToEntry(confline, '='))) return 0;
    DOSCONF_config.files = atoi(*confline);
    if (DOSCONF_config.files > 255)
    {
    	MESSAGE("The FILES value in the config.sys file is too high ! Setting to 255.\n");
        DOSCONF_config.files = 255;
    }
    if (DOSCONF_config.files < 8)
    {
    	MESSAGE("The FILES value in the config.sys file is too low ! Setting to 8.\n");
        DOSCONF_config.files = 8;
    }
    TRACE("DOSCONF_Files returning %d\n", DOSCONF_config.files);
    return 1;
}

static int DOSCONF_Install(char **confline)
{
#if 0
    int loadhigh = 0;
#endif

    *confline += 7; /* strlen("INSTALL") */
    if (!(DOSCONF_JumpToEntry(confline, '='))) return 0;
    TRACE("Installing '%s'\n", *confline);
#if 0
    DOSMOD_Install(*confline, loadhigh);
#endif
    return 1;
}

static int DOSCONF_Lastdrive(char **confline)
{
    *confline += 9; /* strlen("LASTDRIVE") */
    if (!(DOSCONF_JumpToEntry(confline, '='))) return 0;
    DOSCONF_config.lastdrive = toupper(**confline);
    TRACE("Lastdrive %c\n", DOSCONF_config.lastdrive);
    return 1;
}

static int DOSCONF_Country(char **confline)
{
    *confline += 7; /* strlen("COUNTRY") */
    if (!(DOSCONF_JumpToEntry(confline, '='))) return 0;
    TRACE("Country '%s'\n", *confline);
    if (DOSCONF_config.country == NULL)
		DOSCONF_config.country = malloc(strlen(*confline) + 1);
    strcpy(DOSCONF_config.country, *confline);
    return 1;
}

static int DOSCONF_Numlock(char **confline)
{
    *confline += 7; /* strlen("NUMLOCK") */
    if (!(DOSCONF_JumpToEntry(confline, '='))) return 0;
    if (!(strcasecmp(*confline, "ON")))
        DOSCONF_config.flags |= DOSCONF_NUMLOCK;
    TRACE("NUMLOCK is %d\n", (DOSCONF_config.flags & DOSCONF_NUMLOCK) != 0);
    return 1;
}

static int DOSCONF_Switches(char **confline)
{
    char *p;

    *confline += 8; /* strlen("SWITCHES") */
    if (!(DOSCONF_JumpToEntry(confline, '='))) return 0;
    p = strtok(*confline, "/");
    do
    {
	if ( toupper(*p) == 'K')
	    DOSCONF_config.flags |= DOSCONF_KEYB_CONV;
    }
    while ((p = strtok(NULL, "/")));
    TRACE("'Force conventional keyboard' is %d\n",
		(DOSCONF_config.flags & DOSCONF_KEYB_CONV) != 0);
    return 1;
}

static int DOSCONF_Shell(char **confline)
{
    *confline += 5; /* strlen("SHELL") */
    if (!(DOSCONF_JumpToEntry(confline, '='))) return 0;
    TRACE("Shell '%s'\n", *confline);
    if (DOSCONF_config.shell == NULL)
		DOSCONF_config.shell = malloc(strlen(*confline) + 1);
    strcpy(DOSCONF_config.shell, *confline);
    return 1;
}

static int DOSCONF_Stacks(char **confline)
{

    *confline += 6; /* strlen("STACKS") */
    if (!(DOSCONF_JumpToEntry(confline, '='))) return 0;
    DOSCONF_config.stacks_nr = atoi(strtok(*confline, ","));
    DOSCONF_config.stacks_sz = atoi((strtok(NULL, ",")));
    TRACE("%d stacks of size %d\n",
          DOSCONF_config.stacks_nr, DOSCONF_config.stacks_sz);
    return 1;
}

static int DOSCONF_Buffers(char **confline)
{
    char *p;

    *confline += 7; /* strlen("BUFFERS") */
    if (!(DOSCONF_JumpToEntry(confline, '='))) return 0;
    p = strtok(*confline, ",");
    DOSCONF_config.buf = atoi(p);
    if ((p = strtok(NULL, ",")))
        DOSCONF_config.buf2 = atoi(p);
    TRACE("%d primary buffers, %d secondary buffers\n",
          DOSCONF_config.buf, DOSCONF_config.buf2);
    return 1;
}

static int DOSCONF_Menu(char **confline)
{
    if (!(strncasecmp(*confline, "[MENU]", 6)))
	menu_in_listing = 1;
    else
    if ((!(strncasecmp(*confline, "[COMMON]", 8)))
    || (!(strncasecmp(*confline, "[WINE]", 6))))
	menu_skip = 0;
    else
    if (**confline == '[')
    {
	(*confline)++;
	if ((menu_default)
	&& (!(strncasecmp(*confline, menu_default, strlen(menu_default)))))
    {
		free(menu_default);
		menu_default = NULL;
	    menu_skip = 0;
    }
	else
	    menu_skip = 1;
	menu_in_listing = 0;
    }
    else
    if (!(strncasecmp(*confline, "menudefault", 11)) && (menu_in_listing))
    {
	if (!(DOSCONF_JumpToEntry(confline, '='))) return 0;
    *confline = strtok(*confline, ",");
    menu_default = malloc(strlen(*confline) + 1);
	strcpy(menu_default, *confline);
    }
    return 1;
}

static int DOSCONF_Include(char **confline)
{
    fpos_t oldpos;
    char *temp;

    *confline += 7; /* strlen("INCLUDE") */
    if (!(DOSCONF_JumpToEntry(confline, '='))) return 0;
    fgetpos(cfg_fd, &oldpos);
    fseek(cfg_fd, 0, SEEK_SET);
    TRACE("Including menu '%s'\n", *confline);
    temp = malloc(strlen(*confline) + 1);
    strcpy(temp, *confline);
    DOSCONF_Parse(temp);
	free(temp);
    fsetpos(cfg_fd, &oldpos);
    return 1;
}

static void DOSCONF_Parse(char *menuname)
{
   char confline[256];
   char *p, *trail;
   int i;

    if (menuname != NULL) /* we need to jump to a certain sub menu */
    {
	while (fgets(confline, 255, cfg_fd))
	{
	     p = confline;
	     DOSCONF_skip(&p);
	     if (*p == '[')
	     {
		p++;
		if (!(trail = strrchr(p, ']')))
		    return;
		if (!(strncasecmp(p, menuname, (int)trail - (int)p)))
		    break;
	     }
	}
    }

    while (fgets(confline, 255, cfg_fd))
    {
	p = confline;
	DOSCONF_skip(&p);

	if ((menuname) && (*p == '['))
	    /* we were handling a specific sub menu, but now next menu begins */
	    break;

	if ((trail = strrchr(confline, '\n')))
		*trail = '\0';
	if ((trail = strrchr(confline, '\r')))
		*trail = '\0';
	if (!(menu_skip))
	{
	    for (i = 0; i < sizeof(tag_entries) / sizeof(TAG_ENTRY); i++)
		if (!(strncasecmp(p, tag_entries[i].tag_name,
		   strlen(tag_entries[i].tag_name))))
		{
		    TRACE("tag '%s'\n", tag_entries[i].tag_name);
		    if (tag_entries[i].tag_handler != NULL)
			    tag_entries[i].tag_handler(&p);
			break;
		}
	}
	else /* the current menu gets skipped */
	DOSCONF_Menu(&p);
    }
}

int DOSCONF_ReadConfig(void)
{
    WCHAR filename[MAX_PATH];
    DOS_FULL_NAME fullname;
    WCHAR *p;
    int ret = 1;
    static const WCHAR wineW[] = {'w','i','n','e',0};
    static const WCHAR config_sysW[] = {'c','o','n','f','i','g','.','s','y','s',0};
    static const WCHAR empty_strW[] = { 0 };

    PROFILE_GetWineIniString( wineW, config_sysW, empty_strW, filename, MAX_PATH );
    if ((p = strchrW(filename, ','))) *p = 0;
    if (!filename[0]) return ret;

    DOSFS_GetFullName(filename, FALSE, &fullname);
    if ((cfg_fd = fopen(fullname.long_name, "r")))
    {
        DOSCONF_Parse(NULL);
        fclose(cfg_fd);
    }
    else
    {
        MESSAGE("Couldn't open config.sys file given as %s in" \
            " wine.conf or .winerc, section [wine] !\n", debugstr_w(filename));
        ret = 0;
    }
    return ret;
}
