#include "fat32.h"

int fseek32(FILE32 *fp,long offset,int mode)
// オープンしたファイル上でシークする
// mode = SEEK_SET 先頭		オフセット>=0
// mode = SEEK_CUR 現在位置	オフセットに負数を指定することで前方にも移動可能
// mode = SEEK_END 終端		オフセット<=0
// ポインタをファイル終端より後ろまたは先頭より前方に移動するとエラーになる
{
unlong of=0L,fat;
	fp->ungetc=SYM_UNGETC; // 戻している文字を消す
	switch (mode) {
		case SEEK_END: // 最後
			of=fp->filelen;
			break;
		case SEEK_CUR: // 現在位置
			of=fp->seek;
			break;
	//	case SEEK_SET: // 先頭では何もしない
	}
	of+=offset;
	if (of<0L||of>fp->filelen) return(-1); // 移動不可
//	printf("offset=%d(%04x)\n",of,of);
	fp->seek=of;

	of/=fp->clu1byte; // 先頭からのFAT数
//	printf("先頭からのFAT数=%d\n",of);
	
	fat=fp->topfat; // このファイルの先頭FAT
	while (of-->0) {
		fat=NextFat(fp,fat);
		if (fat==0L) return(-2); // 読めない（通常は出ないはず）
	}
	fp->fat=fat;
	if (CluRead(fp)) return(-3); // 読み取りエラー
	
	fp->ofst=fp->seek-(fp->seek/fp->clu1byte)*fp->clu1byte;
	return(0);
}
