/*****************************************************************************/
/* ファイルコピー関数 */
/*****************************************************************************/

#include <stdio.h>
#include <stdlib.h>
#include <doslibm.h>
#include <io.h>
#include "deftype.h"
#include "abuff.h"
#include "fat32.h"

// #define _VFAT_があったら_VFAT対応になる

/*****************************************************************************/

#ifdef _VFAT_
int vfile_copy32(fname1,fname2,cbuff,bsize,vflag,ftm,fatr,retry,sum)
#else
int file_copy32(fname1,fname2,cbuff,bsize,vflag,ftm,fatr,retry,sum)
#endif
unchar *fname1,*fname2,*cbuff;
int bsize,vflag,retry,ftm,fatr,*sum;
/* リターン値
	0 正常終了
	1 読み込みエラー
	2 書き込みエラー
	3 Disk Full
//	4 Verify Error（起こらない）
	5 読み込みファイルオープンエラー
	6 書き込みファイルオープンエラー
*/
// 2001/02/05 : VerifyはOSレベルで行われているようなので処理を削除
//		但し引数レベルではそのままにしておく
{
#define BMAX 1024 /* ルーチンの実行時の使用メモリーが過剰に増えないように少な目にしておく */
unchar buff[BMAX];
FILE32 fpin;
FILE *fpout;
int ret,fbuff=0;
	/* file open */
	#ifdef _VFAT_
	if (vfopen32(fname1,"rb",&fpin)) return(5);
	#else
	if (fopen32(fname1,"rb",&fpin)) return(5);
	#endif
	if ((fpout=fopen(fname2,"wb"))==NULL) {
		fclose32(&fpin);
		return(6);
	}
	
	/* バッファー内部確保モード */
	if (cbuff==NULL) {
		if (bsize>0) {
			fbuff=1;
			bsize=fpin.filelen;
			cbuff=newmalloc(bsize);
			if (cbuff==NULL) { /* ファイルサイズ分は取れない時 */
				bsize=chkml(); /* 確保できる最大サイズ */
				cbuff=newmalloc(bsize);
				if (cbuff==NULL) fbuff=bsize=0;
			}
		}
		if (bsize<BMAX) { /* スタックバッファー使用 */
			if (fbuff) {
				free(cbuff);
				fbuff=0;
			}
			bsize=BMAX;
			cbuff=buff;
		}
	}
	
	/* ファイルコピー */
	ret=file_copy_sub32(&fpin,fpout,0,cbuff,bsize,vflag,retry,sum);
	
	/* タイムスタンプコピー */
	fflush(fpout); /* io.h命令を使う前には必要 */
	if (ftm) chgft(fileno(fpout),((fpin.date<<16)|fpin.time));
	
	fclose32(&fpin);
	fclose(fpout);
	
	/* 内部バッファー確保の時は開放する */
	if (fbuff) free(cbuff);
	
	if (ret) { /* エラー発生時は送り先ファイルを消す */
		unlink(fname2);
		return(ret);
	}
	
	/* ファイル属性コピー */
	if (fatr) chgfa(fname2,fpin.atr);
	
	return(0);
}

/*****************************************************************************/
