/*
	NYAN/E2用スライドマージ		ver.1.031
			   Copyright (c) おこめ 1995
                        	NIFTY-Serve ID:KFR01230
*/

#include	<stdio.h>
#include	<stdlib.h>
#include	<string.h>
#include	<dos.h>

void _splitpath( char *pat, char *dir)
{
	int j=0;
	while (strpbrk(pat, "\\")!=NULL)
	{
		dir[j++] = *(pat++);
	}
	dir[j] = 0;
}

#define	WS	2050

int rekk[13] = {  0,  0, 31, 59, 90,120,151,181,212,243,273,304,334};
char adir[200], num[100], wk[WS], wk2[WS];

void ermod(void)
{
	fputs("Error:ファイルがオープンできません\n",stdout);
	exit(1);
}

long datetoint(char *dta)
{
	long day;
	char tp[128];

	strcpy(tp,dta);
	tp[8] = 0;	day =      atoi(&(tp[6])) - 1;
	tp[5] = 0;	day+= rekk[atoi(&(tp[3]))];
	tp[2] = 0;	day+=      atoi(  tp    ) * 365;
	return (day);
}

int datehit2(char *dta, long int b)
{	/*	-1:aが先	0:同じ	1:bが先	*/
	int yy1=0, yy2;
	long day1, day2;
	char tp[128];

	strcpy(tp, dta);
	tp[8] = 0;	day1 =      atoi(&(tp[6])) - 1;
	tp[5] = 0;	day1+= rekk[atoi(&(tp[3]))];
	if (tp[2]=='/')	{
		tp[2] = 0;	yy1  =      atoi(  tp    );
	}

	day2 = (b % 365);
	yy2  = (b / 365) % 100;

	if (tp[2]==0)
	{
		if ( yy1 - yy2 > 50)
			yy2 = yy2 + 100;
		if ( yy2 - yy1 > 50)
			yy1 = yy1 + 100;
		day1 += yy1 * 365;
		day2 += yy2 * 365;
	} else {
		if ( day1 - day2 > 182)
			day2 = day2 + 365;
		if ( day2 - day1 > 182)
			day1 = day1 + 365;
	}
	return ( (day1 < day2) ? (-1) : ((day1 == day2) ? (0) : (1)) );
}

/*	適合チェック	*/
int lchka(char *a, char *fmt)
{		/*	0:不適	1:適合	*/
	int c;
	if (strlen(a) < strlen(fmt))
		return(0);
	while (*fmt!=0)
	{
		if (*a==' ')			c = 1;
		else if ('0'<=*a && *a<='9')	c = 2;
		else if ('A'<=*a && *a<='Z')	c = 4;
		else	c = 8;
		if ('A'<=*fmt && *fmt<='P')
		{	if ((c & (*fmt-'A')) == 0)
				return(0);
		} else {
			if (*a!=*fmt)
				return(0);
		}
		fmt++;
		a++;
	}
	return(1);
}

/*	Forum系 ゴミ取り	*/
void hdcln(char *wk, FILE *fp)
{
	do {
		fgets(wk, WS, fp);
	} while ((wk[0]<'0' || wk[0]>'9') && feof(fp)==0);
	strcpy(num,wk);
	if (num[3]=='/')
		num[3] = 0;
	else
		num[5] = 0;
}

/*	Forum & Patio	*/
long meschk(char *wk, long dta, FILE *fp, long *smes2)
{
	unsigned char dtchk = 0, mess;
	long cnt = 0, napf = 0;
	char napna[200], nnb[33];
	char *napp;
	char *napp2;
	char *napp1;
	FILE *nap;
	while (feof(fp) == 0)
	{
		hdcln(wk, fp);
		if (feof(fp))	break;
		fgets(wk, WS, fp);
		dtchk |= ((dtchk < 2) && datehit2(wk+7, dta) < 0) ? 1 : 2;
		if (dtchk < 2)
			*smes2 = cnt + 1;
		wk[3] = 0;
		mess = atoi(wk+1);
		while(strcmp(wk," \b\r\n")!=0 && feof(fp) == 0)
		{
			fgets(wk, WS, fp);
			if ((napp=strstr(wk,"\x1b&6A"))!=NULL && napf == 0)
			{
				napf = 1;
				strcpy(napna,adir);
				itoa(mess, nnb, 10);
				strcat(napna, nnb);
				strcat(napna, num);
				strcat(napna,".NPB");
				if ((nap = fopen(napna,"rb"))==NULL)
				{
					if ((nap = fopen(napna,"ab"))==NULL)
					{
						napf = 0;
					}
					napp+=4;
				} else {
					napf = 0;
					fclose(nap);
				}
				napp1 = napp;
			}
			if (napf!=0)
			{
				if ((napp2=strstr(napp1,"\x1b&6@"))!=NULL)
				{
					*napp2 = 0;
					napf = 0;
					fputs(napp1, nap);
					napp1 = wk;
					fclose(nap);
				} else {
					fputs(napp1, nap);
					napp1 = wk;
				}
			}
		}
		cnt++;
	}
	return (cnt);
}

int mesmrg(char *wk, FILE *fp, FILE *fp2)
{
	int err = 0;
	hdcln(wk, fp);
	while(strcmp(wk," \b\r\n")!=0 && feof(fp)==0)
	{
		err |= fputs(wk, fp2);
		fgets(wk, WS, fp);
	}
	err |= fputs("\r\n", fp2 );
	return (err);
}

int mescut(char *wk, FILE *fp, FILE *fp2)
{
	int err = 0;
	hdcln(wk, fp);
	err |= fputs("\r\n", fp2);
	return (err);
}

/*	HomeParty	*/
int hphdchk(char *wk)
{
	return (lchka(wk,"CCC  [CC/CC/CC CC:CC]  EEECCCCC      "));
}

long hpchk(char *wk, long dta, FILE *fp, long *smes2)
{
	unsigned char dtchk = 0;
	long cnt = 0;
	while (1) {
		do {
			fgets(wk, WS, fp);
		} while(hphdchk(wk)==0 && feof(fp)==0);
		if (feof(fp))	break;
		dtchk |= ((dtchk < 2) && datehit2(wk+6, dta) < 0) ? 1 : 2;
		if (dtchk < 2)
			*smes2 = cnt + 1;
		cnt++;
	}
	return (cnt);
}

int hpmrg(char *wk, FILE *fp, FILE *fp2)
{
	int err = 0;
	/*	err |= fputs( "\r\n", fp2 );	*/
	while(hphdchk(wk)==0 && feof(fp)==0)
		fgets(wk, WS, fp);
	do {
		err |= fputs(wk, fp2);
		fgets(wk, WS, fp);
		if (strncmp(wk,"HP>",3)==0)
		{	fgets(wk2, WS, fp);
			if (strcmp(wk2,"◆該当するメッセージはありません◆\r\n")==0)
			{
				wk[0]=0;
			} else {
				if (hphdchk(wk2)==0)
				{	
					if (wk[3]==0)
						wk[0] = 0;
					else
						err |= fputs(wk, fp2);
				}
				strcpy(wk, wk2);
			}
		}
	} while(hphdchk(wk)==0 && feof(fp)==0);
	return (err);
}

int hpcut(char *wk, FILE *fp, FILE *fp2)
{
	int err=0;
	err = fputs( "\r\n", fp2 );
	do {
		err |= hpmrg(wk, fp, fp2);
	} while (feof(fp)==0);
	err |= fputs( "HP>", fp2 );
	wk[0]=0;
	return (err);
}

/*	New Mail	*/
int mailhdchk(char *wk)
{
	return(lchka(wk,"DC JPPPPPPPPPPPPPPPP  EEECCCCC          CC/CC/CC CC:CC")
		-  lchka(wk,"DC JPPPPPPPPPPPPPPPP  EEE>PPPPPPPPPPPP  CC/CC/CC CC:CC")
		+ (lchka(wk,"DC JPPPPPPPPPPPPPPPP  EEE>P")
		  +lchka(wk,"DC JPPPPPPPPPPPPPPPP  EEECCCCC  CC/CC CC:CC") ) * 2);
}

long mailchk(char *wk, long dta, FILE *fp, long *smes2)
{
	unsigned char dtchk = 0, flg;
	long cnt = 0;
	while (1) {
		do {
			fgets(wk, WS, fp);
		} while((flg = mailhdchk(wk))==0 && feof(fp)==0);
		if (feof(fp))	break;
		if ((flg & 1)!=0)
			dtchk |= ( dtchk == 0 && datehit2( wk + 40, dta ) < 0 ) ? 0 : 1;
		if (dtchk == 0)
			*smes2 = cnt + 1;
		cnt++;
	}
	return (cnt);
}

int mailmrg(char *wk, FILE *fp, FILE *fp2)
{
	int err = 0;
	/*	err |= fputs( "\r\n", fp2 );	*/
	while(mailhdchk(wk)==0 && feof(fp)==0)
		fgets(wk, WS, fp);
	do {
		err |= fputs(wk, fp2);
		fgets(wk, WS, fp);
	} while(mailhdchk(wk)==0 && feof(fp)==0);
	return (err);
}

int mailcut(char *wk, FILE *fp, FILE *fp2)
{
	int err;
	err = fputs( "\r\n", fp2 );
	return (err);
}

/* Forum BBS */

int bbshdchk(char *wk)
{
	return (lchka(wk,"CCC   EEECCCCC  CC/CC  CCCCC  "));
}

long bbschk(char *wk, long dta, FILE *fp, long *smes2)
{
	unsigned char dtchk = 0;
	long cnt = 0;
	while (1) {
		do {
			fgets(wk, WS, fp);
		} while(bbshdchk(wk)==0 && feof(fp)==0);
		if (feof(fp))	break;
		dtchk |= ((dtchk < 2) && datehit2(wk+13, dta) >= 0) ? 1 : 2;
		if (dtchk < 2)
			*smes2 = cnt + 1;
		cnt++;
	}
	return (cnt);
}

int bbsmrg(char *wk, FILE *fp, FILE *fp2)
{
	int err = 0;
	/*	err |= fputs( "\r\n", fp2 );	*/
	while(bbshdchk(wk)==0 && feof(fp)==0)
		fgets(wk, WS, fp);
	do {
		err |= fputs(wk, fp2);
		fgets(wk, WS, fp);
	} while(mailhdchk(wk)==0 && feof(fp)==0);
	return (err);
}

int bbscut(char *wk, FILE *fp, FILE *fp2)
{
	int err;
	err = fputs( "\r\n", fp2 );
	return (err);
}



void main(int argc, char *argv[])
{
	long cnt = 0, smes = 300, smes2 = 0, dti = 30, dta;
	int i = 3, err = 0, logtype = 0;
	char tmpfn[128];
	struct find_t ffind;
	struct dosdate_t day1;
	FILE *fp;
	FILE *fp2;

	if (argc<3)
	{
		fputs("SLDMES MES00.LOG MES00.ALL\n", stdout);
		exit(1);
	}
	/*	マージ日付設定	*/
	_dos_getdate(&day1);
	dta = (day1.year % 100)*365 + rekk[day1.month] + day1.day - 1;

	/*	オプション設定	*/
	if (argc > 3)
	{
		for ( i = 3; i < argc; i++ )
		{
			switch (argv[i][0])
			{
			case 'D':
				dta = datetoint(&(argv[i][1]));
				dti = 0;
				break;
			case 'd':
				dti = atoi(&(argv[i][1]));
				break;
			case 'H':	logtype = 1;	break;
			case 'M':	logtype = 2;	break;
			case 'B':	logtype = 3;	break;
			default:
				smes = atoi(argv[i]);
				break;
			}
		}
	}
	dta -= dti;

	strcpy(tmpfn,argv[1]);
	strcpy(strrchr(tmpfn,'.'),".TMP");
	if ((fp = fopen(argv[1],"rb"))==NULL)
		ermod();

	/*	ディレクトリ名作り	*/
	_splitpath(argv[2],adir);

	/*	Check Count	*/
	switch (logtype)
	{
	case 0:	cnt = meschk(wk, dta, fp, &smes2 );	break;
	case 1:	cnt = hpchk( wk, dta, fp, &smes2 );	break;
	case 2:	cnt = mailchk( wk, dta, fp, &smes2 );	break;
	case 3:	cnt = bbschk( wk, dta, fp, &smes2 );	break;
	}
	fclose(fp);
	smes = min(smes, (cnt - smes2));

	/*	Marge	*/
	if (cnt > smes || cnt == 0)
	{
		/*	Add	*/
		wk[0] = 0;
		fp = fopen(argv[1], "rb");
		if ((fp2 = fopen(argv[2], "ab"))==NULL) {
			ermod();
		}
		if (logtype==1)	{
			err |= fputs( "\r\n", fp2 );
		}
		for ( ; cnt>smes; cnt--)
		{
			switch (logtype)
			{
			case 0:	err |= mesmrg( wk, fp, fp2 );	break;
			case 1:	err |= hpmrg(  wk, fp, fp2 );	break;
			case 2:	err |= mailmrg(wk, fp, fp2 );	break;
			case 3:	err |= bbsmrg(wk, fp, fp2 );	break;
			}
		}
		fclose(fp2);
		/*	Cut	*/
		if (err == 0)
		{
			fp2 = fopen(tmpfn, "wb" );
			switch (logtype)
			{
			case 0:	err |= mescut(wk, fp, fp2);	break;
			case 1:	err |= hpcut( wk, fp, fp2);	break;
			case 2:	err |= mailcut( wk, fp, fp2);	break;
			case 3:	err |= bbscut( wk, fp, fp2);	break;
			}
			err |= fputs( wk, fp2 );
			while (feof(fp) == 0)
			{
				fgets( wk, WS, fp);
				err |= fputs( wk, fp2 );
			}
			fclose(fp2);
		}
		fclose(fp);
		if (err == 0)
		{
			remove( argv[1] );
			rename( tmpfn, argv[1] );
			_dos_findfirst(argv[1], _A_NORMAL | _A_HIDDEN, &ffind);
			if (ffind.size < 40)
				remove( argv[1] );
		} else {
			remove( tmpfn );
		}
	}
	exit(0);
}
