#include "defines.h"
#include "acmp.h"
#include "astring.h"
#include <string.h>

#define	DEBUG	0

int fcpwildDOS(unchar *wild0,unchar *fname0)
// MS-DOSと全く同じ方法でファイル名を比較する
// wild  = 探したいファイル（ワイルドカード対応）: EOSで終わる文字列(8+.+3以下)
// fname = ディレクトリエントリ内での格納形式そのままのファイル名 : 8+3のバイト列
// 1=一致 , 0=不一致
// Human+TwentyOneでの比較とは異なる
{
unchar c,*b;
int len,dot,i;
unchar wild[MAXFILEEXT],fname[8+3];
	// file.ext=完全一致のみ
	
	// .の前後が省略されている時は'*'を補足する
	// ただし、*.のみは例外
	// *.   = 拡張子なしのファイルのみ
	
	// *.*  = 全てのファイルに一致する
	// *.ext= 拡張子extのファイルに一致する/拡張子無しのファイルには一致しない
	// *    = 拡張子部分は比較せず=*.*
	//  .ext -> *.ext = ファイル名部分は比較せず
	//  .*   -> *.*
	//  .    -> *.*
	//  ""   -> *.*
	// この変換により比較パターンは*.または*.*の２つに絞られる。
	
	// 引数補正
	dot=-1;
	i=0;
	switch (*wild0) {
		case '.': // 先頭が'.'である
			if (*(wild0+1)==0) { // "."である
				wild0++; // .を飛ばしてしまう＝次は0
			}
		case 0 : // ""である
			wild[i++]='*'; // 前に'*'を入れる
			break;
	}
	while ((c=*wild0++)!=0) {
		if (c=='.') dot=i; // 拡張子の位置記録
		wild[i++]=toupper(c); // 大文字化
	}
	if (dot==-1) { // 拡張子の指定がないので".*"を付ける
		dot=i; // 拡張子の位置記録
		wild[i++]='.';
		wild[i++]='*';
	}
	wild[i]=0; // EOS
	#if DEBUG
	printf("(W=%s/F=",wild);
	#endif
	
	b=fname;
	for (i=0;i<8+3;i++) {
		c=*fname0++;
		*b++=toupper(c); // 大文字化
		#if DEBUG
		printf("%c",*(b-1));
		#endif
	}
	#if DEBUG
	printf(")");
	#endif
	
	// ファイル名部分の長さを得る
	b=fname;
	len=0;
	while (*b++!=' ' && len<8) len++;
	#if DEBUG
	printf("(fn:%d)",len);
	#endif

	// ファイル名部分比較(〜'.'まで)
	if (!jcpwildn(wild,fname,len,'.')) return(0); // ファイル名不一致

	// 拡張子名部分の長さを得る
	b=&fname[8];
	len=0;
	while (*b++!=' ' && len<3) len++;
	#if DEBUG
	printf("(ex:%d)",len);
	#endif
	
	// 拡張子部分比較(〜EOSまで)
	return(jcpwildn(&wild[dot+1],&fname[8],len,0));
}

#if DEBUG
#include <doslibm.h>
void main(int argc,unchar *argv[])
{
_EXFILBUF fblock;
int ret;
unchar buff[8+3];
	if (argc>=2) {
	ret=EXFILES(&fblock,"*.*",FA_ARCH);
	while (ret>=0) {
	    int i;
	    	printf("%s\t",fblock.name);
		// 8+3を作り出す : TwentyOneマルチピリオド不対応
		{unchar c,*b0,*b1;
		b0=fblock.name;
		b1=buff;
		memset(buff,' ',8+3); // クリア
		for (i=0;i<21;i++) {
			c=*b0++;
			if (c=='.') {
				b1=&buff[8];
				for (i=0;i<3;i++) {
					c=*b0++;
					if (c==0) break;
					*b1++=c;
				}
				break;
			}
			if (c==0) break; // EOSは入れない
			if (i<8) *b1++=c;
		}
		}
	    	for (i=0;i<8+3;i++) printf("%c",buff[i]);
		if (fcpwildDOS(argv[1],buff)) {
			printf("<-一致");
		}
		printf("\n");
		ret=EXNFILES(&fblock);
	}
	printf("END\n");
	}
}
#endif
