#include <error.h>
#include "defines.h"
#include "ascsi.h"
#include "acmp.h"
#include "FAT32.h"

//#define	DEBUG	1

#if DEBUG >=1
#define	Fat2Sec0(fp,fat)	(fp->secdata+((fat-fp->fatroot)*fp->clu1sec))
#endif

int _DelDirEntry32(FILE32 *fp)
// ディレクトリのエントリ上から指定ファイルを削除する
// ＦＡＴリンクは削除しないので注意
// 常にvfat対応である
// return : =0:ok , !=0:error
{
int ret;
	#if DEBUG
	printf("DelDirEntry\n");
	#endif
	// この関数ではファイル／ディレクトリ／ボリューム名のエントリが削除出来るが、
	// ディレクトリはその下のファイルを消してからでないと、以後それらが
	// アクセス出来なくなるので注意。
	// また、オープン中のファイルも理論上削除可能だが、以後動作がおかしくなる。
	// （ＯＳレベルの対応でないので、オープンされているかどうかのチェックが出来ない。）
	
	// エントリは常にVFAT込みで消す（そうしないとVFATエントリのゴミが残るため）。
	// そのためこの関数はVFAT対応版しかない。
	if (fp->lname[0]!=0) { // ロングファイル名がある時
	    unchar *b;
		#if DEBUG
		printf("ロングファイル名あり:fat=$%x[$%x]/sec=$%x\n"
			,fp->VFATTop,fp->OfstVFATTop
			,Fat2Sec0(fp,fp->VFATTop));
		#endif
		b=&fp->buff[(fp->oldfat!=fp->VFATTop? 0:fp->OfstVFATTop)];
		// fp->oldfat==fp->VFATTopのときはVFAT先頭は現在読み込んでいるFAT内にある
		// まずは現在のＦＡＴ内のVFATを消す
		while (b<=fp->next) {
			*b=0xe5;
			b+=32; // １エントリは３２バイト
		}
		if (fp->oldfat!=fp->VFATTop) {
			#if DEBUG
			printf("２ＦＡＴにまたがる:fat=$%x+$%x\n",fp->VFATTop,fp->oldfat);
			#endif
			
			// まずは現在のＦＡＴ内のVFATを書き出す
			ret=CluWrite(fp,fp->oldfat);
			if (ret) return(ret);
			
			// VFATエントリの先頭を読み込む
			fp->fat=fp->VFATTop;
			ret=CluRead(fp);
			if (ret) return(ret);
			
			// VFATエントリは必ず連続で、しかも最大でも２つのＦＡＴしかまたがらない
			// 従って、今読んでいるＦＡＴ内に無いと言うことは、前のＦＡＴの
			// OfstVFATTopから最後まで全てと現在のＦＡＴのfp->nextまでがこの
			// ファイルのエントリである。
			b=&fp->buff[fp->OfstVFATTop];
			while (b<=&fp->buff[fp->clu1byte]) {
				*b=0xe5;
				b+=32; // １エントリは３２バイト
			}
			return(CluWrite(fp,fp->VFATTop));
		}
	} else { // ショートファイル名しかない時
		// エントリは現在読み込んでいるFAT内にある
		#if DEBUG
		printf("ロングファイル名なし:fat=$%x[$%x]/sec=$%x\n"
			,fp->oldfat,(int)(fp->next-fp->buff)
			,Fat2Sec0(fp,fp->oldfat));
		#endif
		*fp->next=0xe5; // 削除
	}
	return(CluWrite(fp,fp->oldfat));
}
