#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <io.h>		/* filelength() */
#include "defines.h"
#include "abuff.h"

/* キャッシュシステム用グローバル変数 */

int	_Cs_fcash_=-1;		/* キャッシュオープンフラグ */
				/* >0 : memory , 0:file , -1:not cash_fopen */
unchar	*_Cs_cashbuff_;		/* キャッシュバッファー */
long	_Cs_csize_,_Cs_cseek_;	/* キャッシュサイズ＆シークポインター */

FILE *cash_fopen(char *fname,char *type)
/* ミニ キャッシュ システム：fopen */
/* file open with cache */
{
FILE *fp;
int size;
	/* 前にキャッシュが残っている時はオープンできない */
	if (_Cs_fcash_>0) return(NULL);
	
	/* ファイルオープン */
	_Cs_fcash_=0;	/* 取りあえずキャッシュＯＦＦ */
	fp=fopen(fname,type);
	if (fp!=NULL) {
		/* キャッシュバッファー確保 */
		/* テキストモードの時には最大で２倍の無駄がでる */
		size=filelength(fileno(fp));
		_Cs_cashbuff_=newmalloc(size);
		if (_Cs_cashbuff_!=NULL) { /* キャッシュバッファー確保 Ok */
			/* ファイル読み込み */
			_Cs_csize_=fread(_Cs_cashbuff_,1,size,fp); /* 実読み込みサイズを返す */
			if (ferror(fp)) { /* ファイル読み込みエラー発生時 */
				/* キャッシュバッファー開放 */
				free(_Cs_cashbuff_);
			} else {
				_Cs_cseek_=0;	/* シークポイント先頭へ */
				_Cs_fcash_=1;	/* キャッシュＯＮ */
				/* ファイルそのものはオープンしたままでおく */
				/* ただしファイルポインターは念のため先頭に戻しておく */
				rewind(fp);
			}
		}
	}
	/*printf2("Cache : O%s\n",_Cs_fcash_? "n":"ff");*/
	return(fp);
}
