#include <stdio.h>
#include "defines.h"

extern	int	_Cs_fcash_;
extern	long	_Cs_csize_,_Cs_cseek_;

int cash_fseek(FILE *fp,long seek,int prev)
/* ミニ キャッシュ システム:fseek */
{
	if (!_Cs_fcash_) return(fseek(fp,seek,prev));
	switch (prev) {
		case SEEK_SET:
			/* ０〜ファイル最後 */
			if (seek<0) return(1); /* error */
			if (seek<_Cs_csize_) _Cs_cseek_=seek;
			else _Cs_cseek_=_Cs_csize_-1; /* ファイル最後に移動 */
			break;
		case SEEK_CUR:
			/* ０〜ファイル現在位置〜最後 */
			if (seek>=0) { /* 後ろへ移動 */
				if (seek+_Cs_cseek_>=_Cs_csize_) _Cs_cseek_=_Cs_csize_-1; /* ファイル最後に移動 */
				else _Cs_cseek_+=seek;
			} else { /* seek<0：前へ移動 */
				if (_Cs_cseek_+seek<0) return(1); /* error */
				else _Cs_cseek_+=seek;
			}
			break;
		case SEEK_END:
			/* ファイル最後〜０ */
			if (seek>0) _Cs_cseek_=_Cs_csize_-1; /* ファイル最後に移動 */
			else { /* seek<=0 */
				if (-seek>=_Cs_csize_) return(1); /* error */
				_Cs_cseek_=_Cs_csize_+seek-1;
			}
			break;
	}
	return(0);
}
