/* SCOPY */

Call RxFuncAdd 'SysLoadFuncs', 'RexxUtil', 'SysLoadFuncs'
Call SysLoadFuncs

/*PARSE UPPER VALUE ARG(1) WITH src trg opt*/
PARSE VALUE ARG(1) WITH src trg opt
opt=TRANSLATE(opt);	/* 引数は大文字小文字を区別しない */

sDir=src
tDir=trg

if src=''|trg='' then
do
  say 'SCOPY -- by Rokkidow,Sukechine 1998.12.25'
  say '[usage] scopy <source-dir> <target-dir> [/s]';
  exit;
end;

if right(sDir,1)='\' then  sDir=left(sDir,length(sDir)-1);
if right(tDir,1)='\' then  tDir=left(tDir,length(tDir)-1);

/**************************/
/* SOURCE DIRECTORY CHECK */
/**************************/
CALL SysFileTree sDir, zine, 'DO'		/* source dirの有無の確認   */
if zine.0=0 then 				/* source dirがない時は終了 */
do
  say 'ERROR : source directory not found !'
  exit;
end;
else sDir=zine.1;				/* 相対パス対策→絶対パス */

/******************/
/* THIS DIRECTORY */
/******************/
CALL SysFileTree tDir, zine, 'D'		/* target dirの有無の確認   */
IF zine.0=0 THEN				/* target dirがない時は作る */
DO
  rc = SysMkDir(tDir)
  IF rc<>0 THEN
  DO
    SAY 'Can not make target directory !'
    EXIT
  END;
END;
CALL SysFileTree sDir||'\*.*', sFiles, 'FO', '**-**' /* source fileの取得 */
CALL COPY_MAIN sDir, tDir			     /* copyの実行        */


/*****************/
/* SUB DIRECTORY */
/*****************/

If pos('/S',opt)<>0 then
Do

  /*** SourceDir名の取得＆TargetDir名の作成 ***/

  CALL SysFileTree sDir||'\*.*', sDirs, 'DOS'
  Do n=1 to sDirs.0
    tDirs.n=tDir||substr(sDirs.n,length(sDir)+1);
    /* TargetDirがないときは作る */
    CALL SysFileTree tDirs.n, zine, 'D'
    IF zine.0=0 THEN
    DO
      rc=SysMkDir(tDirs.n)
      IF rc<>0 THEN
      DO
	SAY 'Can not make target directory !'
	EXIT
      END;
    END;
  end;

  Do n=1 to sDirs.0
    CALL Charout ,'.'
    CALL SysFileTree sDirs.n||'\*.*', sFiles, 'FO' ,'**-**'
    CALL COPY_MAIN sDirs.n, tDirs.n;
  End;
End;


EXIT;

/*---------------------------------------------------------------------------*/
  COPY_MAIN: PROCEDURE EXPOSE sFiles.; ARG sDir, tDir;
/*---------------------------------------------------------------------------*/

CRLF=D2C(13)||D2C(10);	/* 改行コード */
CRFlag1=0;		/* 改行制御用フラグ なんか、だっせーよな〜 */
TopFlag=1;		/* 改行制御用フラグ なんか、だっせーよな〜 */
NewFlag=0		/* 0=no-change 1=update 2=new */

Do n=1 to sFiles.0
  sFile=sFiles.n;
  len=length(sDir);
  tFile=tDir||substr(sFile,len+1);
  rc=stream(tFile,'c','query exist');	/* ターゲットファイルのチェック */
					/* 新規、既存、更新をチェックする */
  if rc='' then NewFlag=2;		/* 新規ファイル */
  else do
    NewFlag=0;				/* 既存ファイル */
    sTime=YYDDMMHHMMSS(stream(sFile,'c','query datetime'));
    tTime=YYDDMMHHMMSS(stream(tFile,'c','query datetime'));
    If sTime>tTime then NewFlag=1;	/* 更新ファイル */
  end;

  If NewFlag<>0 then
  Do
    /*** コピー状況の表示 ****/
    if TopFlag=1 then 			/* このフラグは改行制御用 */
    do
      Call CharOut ,CRLF||sDir '->' tDir;
      TopFlag=0;
    end;

    if NewFlag=1 then Call Charout, CRLF ' ' tFile '[UPD]'
    if NewFlag=2 then Call Charout, CRLF ' ' tFile '[NEW]'

    /*** コピーの実行 ***/
    /*rc=SysCopyObject(sFile,tDir);*/ /*オープン中のファイルにアクセスできず*/

    If Stream(sFile,'C','query size')=0	/* 空ファイル対策 */
    Then Do
      Call Charout tFile,''
      Call Stream  tFile,'C','CLOSE'
    End
    Else Do
      '@ECHO OFF'
      'COPY ' sFile tFile ' > NUL' ;	/* 空ファイルでエラーが出る */
      '@ECHO ON'
    End
    CRflag=1;
  End;

End;
If CrFlag=1 Then Call CharOut ,CRLF

RETURN

/*---------------------------------------------------------------------------*/
  YYDDMMHHMMSS: PROCEDURE; ARG st                    /* 日付時刻形式変換関数 */
/*---------------------------------------------------------------------------*/
    yy=substr(st,7,2)
    mm=substr(st,1,2)
    dd=substr(st,4,2)
    tt=substr(st,11,2)
    mn=substr(st,14,2)
    ss=substr(st,17,2)

    IF yy<70 THEN yy='20'||yy; ELSE yy='19'||yy;

RETURN yy||mm||dd||tt||mn||ss