#include "deftype.h"

int jcpwild(unchar *wild,unchar *word)
/* 日本語対応ワイルドカード対応文字列比較ルーチン */
/* wildの文字列（ワイルドカード使用可）とwordの文字列を比較する */
/* ワイルドカードは'?'と'*'の２つ。また、word中に'?''*'が存在してはいけない */
/* ワイルドカードは２バイト文字も１文字として判断する */
/* リターン値：０＝不一致、１＝一致 */
{
int pc,c,pp=0,pw=0,ip,iw;
	while (1) {
		/* read pattern */
		pc=wild[pp];
		switch (pc) {
			case '?': /* wild card '?' */
				/* end of word ? */
				c=word[pw];
				if (c==0) return(0); /* 不一致：wildはまだ残っている */
				
				/* to next character */
				pp++;
				pw++;
				if (check_kanji1(c)) pw++; /* ２バイト文字の時 */
				continue; /* 続きへ */
			
			case '*': /* wild card '*' */
				do { /* '*'の直後のワイルドカードはすべて'*'に入れてしまう */
					/* しかし、最低１文字分はポインターを進める */
					pp++; /* wild pointer forward */
					pc=wild[pp];
				} while (pc=='*' || pc=='?');
				if (pc==0) return(1); /* ABC*など、最後が'*'の時は常に一致となる */
				
				/* サーチ！ */
				do {
					ip=-1; iw=-1;
					do {
						ip++; iw++;
						c=word[pw+iw];
						if (check_kanji1(c)) {
							iw++;
							c=(c<<8)|word[pw+iw];
						}
						pc=wild[pp+ip];
						if (check_kanji1(pc)) {
							ip++;
							pc=(pc<<8)|wild[pp+ip];
						}
						if (c==0) return(pc==0); /* pc=0なら全一致、<>0なら不一致 */
					} while (c==pc); /* 一致している間 */
					if (pc==0) return(0); /* 不一致 */
					/* ip,iw=不一致だったところ */
					pw++;
				} while (pc!='*' && pc!='?');
				pw+=(iw-1);
				pp+=ip;
				continue;
		}
		/* not wild card */
		/* ２バイト文字？ */
		if (check_kanji1(pc)) pc=(pc<<8)|wild[++pp];
		
		c=word[pw]; /* read word */
		if (check_kanji1(c)) c=(c<<8)|word[++pw];
		
		if (pc!=c) return(0); /* 不一致 */
		/* c=pc */
		if (c==0) return(1);  /* 全一致（c=pc=0：終わりまで行った）*/
		
		/* 次の文字へ */
		pp++; pw++;
	}
}
