/***   [optparse.c]
*
*	起動時オプション解析		(C)ささがわ
*
*	For GNU C Compiler (GCC)   Version 1.39
*
***/

#include <string.h>
#include <stdlib.h>
#include "others.h"

#define OPT		'/'
#define OPTN	15

static int	argc;
static char	**argv;
static const char	*opt_name[OPTN] = {
	"tabm", "crm", "tab", "lg", "lc",
	"bg-tiff", "bg-tile", "bg-beta",
	"wa-beep", "wa-pcm", "m",
	"fcap", "fsort", "fwide", "scspd"
};
static const char	opt_n[OPTN] = {
	1, 1, 1, 1, 1,
	1, 2, 1,
	0, 1, 0,
	0, 1, 0, 1
};

static int Next(int);

void OPT_init(int ac, char *av[]) {
	argc = ac;
	argv = av;
}

static int Next(int finit) {
	int		i, r;
	char	*p;
	static int	no;
	
	if (finit) {
		no = 1;
		return 0;
	} else if ((r = no++) >= argc)
		return -1;
	
	if (argv[r][0] == OPT && strlen(argv[r]) >= 2) {
		p = &argv[r][1];
		for (i = 0; i < OPTN; i++) {
			if (!stricmp(p, opt_name[i])) {
				no += opt_n[i];
				break;
			}
		}
	}
	
	if (no - 1 >= argc)
		return -1;
	else
		return r;
}

void OPT_filew(char *wide, char *cap, char *sort) {
	int		i;
	char	*p;
	
	*wide = 0;
	*cap = 0;
	*sort = 0;
	Next(1);
	while ((i = Next(0)) >= 0) {
		if (argv[i][0] != OPT || strlen(argv[i]) < 2)
			continue;
		
		p = &argv[i][1];
		if (!stricmp(p, opt_name[11])) {
			*cap = 1;
		} else if (!stricmp(p, opt_name[12])) {
			*sort = atoi(argv[i + 1]);
			if (*sort < 0 || 3 < *sort)
				*sort = 0;
		} else if (!stricmp(p, opt_name[13])) {
			*wide = 1;
		}
	}
	
	return;
}

int OPT_BackG(char *path, int *no) {
	int		i, ret = -1;
	char	*p;
	
	path[0] = '\0';
	*no = 0;
	Next(1);
	while ((i = Next(0)) >= 0 && ret < 0) {
		if (argv[i][0] != OPT || strlen(argv[i]) < 2)
			continue;
		
		p = &argv[i][1];
		if (!stricmp(p, opt_name[5])) {
			ret = 0;
			strncpy(path, argv[i + 1], 89);
			break;
		} else if (!stricmp(p, opt_name[6])) {
			ret = 1;
			strncpy(path, argv[i + 1], 89);
			*no = atoi(argv[i + 2]);
			break;
		} else if (!stricmp(p, opt_name[7])) {
			ret = 2;
			*no = atoi(argv[i + 1]);
			break;
		}
	}
	
	path[89] = '\0';
	if (ret < 0)
		ret = 2;
	return ret;
}

int OPT_WarnS(char *path) {
	int		i, ret = 0;
	char	*p;
	
	path[0] = '\0';
	Next(1);
	while ((i = Next(0)) >= 0 && ret == 0) {
		if (argv[i][0] != OPT || strlen(argv[i]) < 2)
			continue;
		
		p = &argv[i][1];
		if (!stricmp(p, opt_name[9])) {
			ret = 1;
			strncpy(path, argv[i + 1], 89);
			break;
		} else if (!stricmp(p, opt_name[8])) {
			ret = 2;
			break;
		}
	}
	path[89] = '\0';
	
	return ret;
}

int OPT_Cons(void) {
	int		i, r = 0;
	
	Next(1);
	while ((i = Next(0)) >= 0) {
		if (argv[i][0] == OPT && strlen(argv[i]) >= 2 && !stricmp(&argv[i][1], opt_name[10])) {
			r = 1;
			break;
		}
	}
	
	return r;
}

int OPT_Scroll(void) {
	int		i, r = -1;
	
	Next(1);
	while ((i = Next(0)) >= 0) {
		if (argv[i][0] == OPT && strlen(argv[i]) >= 2 && !stricmp(&argv[i][1], opt_name[14])) {
			r = atoi(argv[i + 1]);
			break;
		}
	}
	
	return r;
}

int OPT_txt_n(void) {
	int		i, ret = 0;
	
	Next(1);
	while ((i = Next(0)) >= 0) {
		if (argv[i][0] != OPT)
			ret++;
	}
	Next(1);
	
	return ret;
}

const char *OPT_txt(void) {
	int		i;
	const char	*ret = NULL;
	
	while ((i = Next(0)) >= 0) {
		if (argv[i][0] != OPT) {
			ret = argv[i];
			break;
		}
	}
	
	return ret;
}

void OPT_disp(short *par) {
	int		i;
	char	*p;
	
	Next(1);
	while ((i = Next(0)) >= 0) {
		int		a;
		
		if (argv[i][0] != OPT || strlen(argv[i]) < 2)
			continue;
		
		p = &argv[i][1];
		for (a = 0; a < 5; a++) {
			if (!stricmp(p, opt_name[a])) {
				par[a] = atoi(argv[i + 1]);
				break;
			}
		}
	}
	
	return;
}
