#include "deftype.h"

int jcpwildn(unchar *wild,unchar data[],int dlen,int tc)
// 日本語対応ワイルドカード対応文字群比較ルーチン
// wildの文字列（ワイルドカード使用可）とdata[0]〜data[dlen-1]の文字群を比較する
// dataは文字群であって文字列ではない。従って、EOSは存在しない。
/* ワイルドカードは'?'と'*'の２つ。また、data中に'?''*'が存在してはいけない */
/* ワイルドカードは２バイト文字も１文字として判断する */
/* リターン値：０＝不一致、１＝一致 */
// jcpwild()の文字列長指定＋拡張版
// tc : wildのEOS相当文字 : 通常はEOS(0x00)
{
int wc,dc,wp=0,dp=0;
	#if 0
	{int i;
	i=0;
	while ((wc=wild[i++])!=tc) printf("%c",wc);
	printf("<->");
	for (i=0;i<dlen;i++) printf("%c",data[i]);
	printf("\t");
	}
	#endif
	if (dlen==0) {
		switch (*wild) {
		case '*':
			if (*(wild+1)==0) { // dlen=0かつwild="*"で一致
		case 0:		return(1); // dlen=0かつwild==""で一致
			}
		}
	}
//	if (dlen==0 && *wild!=0) return(0); // dlen=0の時はwild==""でない限り不一致
//	if (dlen==0) return(1); // dlen=0の時は常に一致(fcpwilddosでこの方が都合が良いから)
	while (dp<dlen) {
		/* read pattern */
		wc=wild[wp];
		switch (wc) {
		int wi,di;
		case '?': /* wild card '?' */
			// ここの１文字は常に一致とみなす
			// 次の文字へ
			wp++;
			dc=data[dp++];
			if (check_kanji1(dc)) dp++; // ２バイト文字
			continue; /* 続きへ */
		
		case '*': /* wild card '*' */
			do { /* '*'の直後のワイルドカードはすべて'*'に入れてしまう */
				/* しかし、最低１文字分はポインターを進める */
				wp++; /* wild pointer forward */
				wc=wild[wp];
			} while (wc=='*' || wc=='?');
			if (wc==tc) return(1); /* ABC*など、最後が'*'の時は常に一致となる */
			// 比較；後で戻れるように相対位置比較
			do {
				wi=di=-1; // 後で＋１されるから
				do {
					wi++; di++;
					dc=data[dp+di];
					if (check_kanji1(dc)) {
						di++;
						dc=(dc<<8)|data[dp+di];
					}
					wc=wild[wp+wi];
					if (check_kanji1(wc)) {
						wi++;
						wc=(wc<<8)|wild[wp+wi];
					}
					if (dp+di==dlen) return(wc==tc); /* wc=tcなら全一致、<>0なら不一致 */
				} while (dc==wc); /* 一致している間 */
				if (wc==tc) return(0); /* 不一致 */
				/* wi,di=不一致だったところ */
				dp++;
			} while (wc!='*' && wc!='?');
			dp+=(di-1);
			wp+=wi;
			continue;
		} // end of switch
		
		// ワイルドカードでない＝通常文字比較
		if (check_kanji1(wc)) wc=(wc<<8)|wild[++wp]; // ２バイト文字
		
		dc=data[dp];
		if (check_kanji1(dc)) {
			dp++;
			if (dp>=dlen) return(0); // 越えてしまう不一致
			dc=(dc<<8)|data[dp];
		}
		
		if (wc!=dc) return(0); /* 不一致 */
		
		/* 次の文字へ */
		wp++; dp++;
	}
//	printf("/wild[wp(%d)]=%02x/",wp,wild[wp]);
	return(wild[wp]==tc); // wildが終わってたら一致
}

#if 0

void cmp(unchar *wild,unchar *data,int dlen)
{
int ret;
	ret=jcpwild(wild,data);
	printf("s:%s一致:%s<->%s\n",(ret? "全":"不"),wild,data);
	ret=jcpwildn(wild,data,dlen);
	printf("n:%s一致:%s<->%d;",(ret? "全":"不"),wild,dlen);
	while (dlen-->0) {
		printf("%c",*data++);
	}
	printf("\n");
}

void main()
{
	cmp("ABC","ABC",3);
	cmp("ABC","ABCD",4);
	cmp("A?C","ABC",3);
	cmp("A*","ABC",3);
	cmp("*C","ABC",3);
	cmp("*C","ABC",2);
	//
	cmp("ＡＢＣ","ＡＢＣ",6);
	cmp("Ａ?Ｃ","ＡｂＣ",6);
	cmp("Ａ*?","Ａbc",4);
	cmp("*Ｃ","ABＣ",4);
	cmp("*Ｃ","ＡＢＣ",4);
}
#endif
