#include    <stdio.h>
#include    <stdlib.h>
#include    <string.h>
#include    <ctype.h>
#include    <mos.h>
#include    "graphic.h"
#include    "coldef.h"
#include    "bitmap.h"
#include    "event.h"
#include    "exec.h"

#define	TRUE	1
#define	FALSE	0
#define	ERR	(-1)

#define	PROG_MAX	32

	EXEPTR	prog_tab[PROG_MAX];

	char	*strdup(char *str);

void	PROG_append(char *wild, char *prog)
{
    int n;

    for ( n = 0 ; n < PROG_MAX ; n++ ) {
	if ( prog_tab[n].wild != NULL &&
		strcmp(wild , prog_tab[n].wild) == 0 ) {
	    if ( prog_tab[n].prog != NULL )
		free(prog_tab[n].prog);
	    prog_tab[n].prog = strdup(prog);
	    return;
	}
    }

    for ( n = 0 ; n < PROG_MAX ; n++ ) {
	if ( prog_tab[n].wild == NULL ) {
	    prog_tab[n].wild = strdup(wild);
	    if ( prog_tab[n].prog != NULL )
		free(prog_tab[n].prog);
	    prog_tab[n].prog = strdup(prog);
	    return;
	}
    }
}

#define	IFSET_X1	70
#define	IFSET_Y1	140
#define	IFSET_X2	(IFSET_X1 + 488)
#define	IFSET_Y2	(IFSET_Y1 + 220)

#define	END_NO		0
#define	END_X1		(IFSET_X1 + 300)
#define	END_Y1		(IFSET_Y1 + 190)

#define	NEXT_NO		1
#define	NEXT_X1		(IFSET_X1 + 110)
#define	NEXT_Y1		(IFSET_Y1 + 190)

#define	BACK_NO		2
#define	BACK_X1		(IFSET_X1 + 200)
#define	BACK_Y1		(IFSET_Y1 + 190)

#define	WILD_NO		100
#define	WILD_TOP_X1	(IFSET_X1 + 16)
#define	WILD_TOP_Y1	(IFSET_Y1 + 8)

#define	CMDS_NO		200
#define	CMDS_TOP_X1	(IFSET_X1 + 110)
#define	CMDS_TOP_Y1	(IFSET_Y1 + 8)

#define	WILD_X1(n)	(WILD_TOP_X1)
#define	WILD_Y1(n)	(WILD_TOP_Y1 + (n) * 22)

#define	CMDS_X1(n)	(CMDS_TOP_X1)
#define	CMDS_Y1(n)	(CMDS_TOP_Y1 + (n) * 22)

#define	MENU_MAX	8

void	IFSET_cmds()
{
    int n, i;
    int sw, bx, by;
    int top = 0, old = 0;
    BLOCK *sp;
    EVENT *ep = NULL;
    char tmp[128];

    MOS_disp(OFF);
    sp = DSP_push_vram(IFSET_X1, IFSET_Y1, IFSET_X2, IFSET_Y2);
    DSP_opbox(IFSET_X1, IFSET_Y1, IFSET_X2, IFSET_Y2);
    DSP_wbox(IFSET_X1, IFSET_Y1, IFSET_X2, IFSET_Y2,
		LINE_COL, FILD_COL, M_PSET);

    ep = EVT_img(ep, END_NO, END_X1, END_Y1,
	CHR_COL, WIND_COL, 50, ok_img);
    ep = EVT_img(ep, NEXT_NO, NEXT_X1, NEXT_Y1,
	CHR_COL, WIND_COL, 50, next_img);
    ep = EVT_img(ep, BACK_NO, BACK_X1, BACK_Y1,
	CHR_COL, WIND_COL, 50, back_img);

    sprintf(tmp, "%-46.46s", "");
    for ( n = 0 ; n < MENU_MAX ; n++ ) {
	ep = EVT_sw(ep, WILD_NO + n,
		WILD_X1(n), WILD_Y1(n), CHR_COL, WIND_COL, "          ");
	ep = EVT_sw(ep, CMDS_NO + n,
		CMDS_X1(n), CMDS_Y1(n), CHR_COL, WIND_COL, tmp);

	if ( prog_tab[n].wild != NULL ) {
	    gprintf(WILD_X1(n), WILD_Y1(n),
		CHR_COL, WIND_COL, "%-10.10s", prog_tab[n].wild);
	    gprintf(CMDS_X1(n), CMDS_Y1(n),
		CHR_COL, WIND_COL, "%-46.46s", prog_tab[n].prog);
	}
    }

    MOS_rdpos(&sw, &bx, &by);
    MOS_setpos((IFSET_X1 + IFSET_X2) / 2, (IFSET_Y1 + IFSET_Y2) / 2);
    MOS_disp(ON);

    for ( ; ; ) {
	if ( top != old ) {
	    MOS_disp(OFF);
	    for ( n = 0 ; n < 8 ; n++ ) {
		i = top + n;
		if ( prog_tab[i].wild != NULL ) {
		    gprintf(WILD_X1(n), WILD_Y1(n),
			CHR_COL, WIND_COL, "%-10.10s", prog_tab[i].wild);
		    gprintf(CMDS_X1(n), CMDS_Y1(n),
			CHR_COL, WIND_COL, "%-46.46s", prog_tab[i].prog);
		} else {
		    gprintf(WILD_X1(n), WILD_Y1(n),
			CHR_COL, WIND_COL, "%-10.10s", "");
		    gprintf(CMDS_X1(n), CMDS_Y1(n),
			CHR_COL, WIND_COL, "%-46.46s", "");
		}
	    }
	    MOS_disp(ON);
	    old = top;
	}

	n = EVT_wait(ep);

	if ( n == END_NO )
	    break;
	else if ( n == NEXT_NO ) {
	    if ( (top + 8) < PROG_MAX )
		top += 8;
	} else if ( n == BACK_NO ) {
	    if ( top > 0 )
		top -= 8;
	} else if ( n >= CMDS_NO ) {
	    n = (n - CMDS_NO) + top;
	    strcpy(tmp, (prog_tab[n].prog == NULL ? "" : prog_tab[n].prog));
	    MOS_disp(OFF);
	    input(CMDS_X1(n - top), CMDS_Y1(n - top), 46, tmp);
	    gprintf(CMDS_X1(n - top), CMDS_Y1(n - top),
		CHR_COL, WIND_COL, "%-46.46s", tmp);
	    if ( prog_tab[n].prog != NULL )
		free(prog_tab[n].prog);
	    prog_tab[n].prog = strdup(tmp);
	    MOS_disp(ON);
	    
	} else if ( n >= WILD_NO ) {
	    n = (n - WILD_NO) + top;
	    strcpy(tmp, (prog_tab[n].wild == NULL ? "" : prog_tab[n].wild));
	    MOS_disp(OFF);
	    input(WILD_X1(n - top), WILD_Y1(n - top), 10, tmp);
	    gprintf(WILD_X1(n - top), WILD_Y1(n - top),
		CHR_COL, WIND_COL, "%-10.10s", tmp);
	    if ( prog_tab[n].wild != NULL )
		free(prog_tab[n].wild);
	    prog_tab[n].wild = (tmp[0] != '\0' ? strdup(tmp) : NULL);
	    MOS_disp(ON);
	}
    }

    EVT_free(ep);
    MOS_disp(OFF);
    DSP_pop_vram(sp);
    DSP_clbox(IFSET_X1, IFSET_Y1, IFSET_X2, IFSET_Y2);
    MOS_setpos(bx, by);
    MOS_disp(ON);
}
void	IF2_load(char *file)
{
    int n;
    FILE *fp;
    char *s, *p;
    char *av[4];
    char wild[8];
    char tmp[128];
    char cmds[256];
    EXEPTR *ep;

    if ( (fp = fopen(file, "r")) == NULL )
	return;

    while ( fgets(tmp, 127, fp) != NULL ) {
	if ( (p = strchr(tmp, '\n')) != NULL )
	    *p = '\0';

	s = tmp;
	for ( n = 0 ; n < 3 ; n++ ) {
	    av[n] = s;
	    if ( (p = strchr(s, ',')) == NULL )
		break;
	    *(p++) = '\0';
	    s = p;
	}
	av[n] = s;

	if ( n < 3 )
	    continue;

	for ( p = av[0] ; isspace(*p) ; p++ )
	    ;
	if ( *p == '\0' )
	    continue;

	strncpy(tmp, p, 3);
	tmp[3] = '\0';
	sprintf(wild, "*.%s", tmp);

	for ( p = av[3] ; isspace(*p) ; p++ )
	    ;
	if ( *p == '\0' )
	    continue;

	strcpy(tmp, p);
	strcpy(cmds, p);

	for ( p = cmds ; *p != '\0' && !isspace(*p) ; p++ )
	    ;
	*p = '\0';

	if ( (p = strrchr(cmds, '\\')) != NULL )
	    p++;
	else
	    p = cmds;

	for ( n = 0 ; n < PROG_MAX ; n++ ) {
	    ep = &(prog_tab[n]);
	    if ( ep->wild != NULL && wild_mach(ep->wild, p) ) {
		strcpy(cmds, (ep->prog == NULL ? "" : ep->prog));
		strcat(cmds, " ");
		strcat(cmds, tmp);
		break;
	    }
	}
	if ( n >= PROG_MAX )
	    strcpy(cmds, tmp);

	PROG_append(wild, cmds);
    }

    fclose(fp);
}
