;;; @file    fileutil.nsc
;;; @brief   senzogawa作「fileutil.dll」のラッパ
;;; @desc    ・適切な「番号.txt」に名前を変えて使用してください。
;;;          ・変数番号の先頭は FILEUTIL_ARG_BEGIN で指定できます。
;;;          ・変数番号の末尾は FILEUTIL_ARG_END で定義されます。
;;;          ・「fileutil.dll」をカレントディレクトリ以外に置く場合は、
;;;            FILEUTIL_DLL にディレクトリ名を指定してください。
;;;            その際、パス区切りには「\」を用いてください。
;;; @version 1.0(fileutil.dll Ver.0.1, NScripter Ver.2.82)
;;; @author  senzogawa
*fileutil_plugin
stralias FILEUTIL_DLL,"fileutil.dll"
numalias FILEUTIL_ARG_BEGIN,180
stralias FILEUTIL_PARAM_SEP,"|"
stralias FILEUTIL_LIST_SEP,"|"

defsub fileutil_version
defsub mkdir
defsub rmdir
defsub curdir
defsub fileread
defsub filewrite
defsub fileappend
defsub filerename
defsub filesize
defsub filecopy
defsub filelist
defsub dirlist
defsub fileutil_exec
defsub fileutil_execwith
defsub dirlist_each
defsub filelist_each
defsub dirlist_eachbreak
defsub filelist_eachbreak
;// private
defsub fileutil_setproc
defsub fileutil_callproc

mov %0,FILEUTIL_ARG_BEGIN
numalias fileutil_command,%0:inc %0
numalias fileutil_dir,%0:inc %0
numalias fileutil_file,%0:inc %0
numalias fileutil_from,%0:inc %0
numalias fileutil_param,%0:inc %0
numalias fileutil_proc,%0:inc %0
numalias fileutil_result,%0:inc %0
numalias fileutil_str,%0:inc %0
numalias fileutil_to,%0:inc %0
; for "each"
numalias fileutil_dirbreak,%0:inc %0
numalias fileutil_diritem,%0:inc %0
numalias fileutil_dirlist,%0:inc %0
numalias fileutil_dirproc,%0:inc %0
numalias fileutil_filebreak,%0:inc %0
numalias fileutil_fileitem,%0:inc %0
numalias fileutil_filelist,%0:inc %0
numalias fileutil_fileproc,%0:inc %0
numalias FILEUTIL_ARG_END,%0-1
return


;;; @brief バージョン情報を取得する。
;;; @usage fileutil_version %バージョン
;;; @note  バージョンが大きければ新しい。
*fileutil_version
getparam i%fileutil_result
fileutil_exec "version"
getret %%fileutil_result
return


;;; @brief ディレクトリを作成する。
;;; @usage mkdir ディレクトリ名
;;; @note  
*mkdir
getparam $fileutil_dir
fileutil_execwith "mkdir",$fileutil_dir
return


;;; @brief ディレクトリを削除する。
;;; @usage rmdir ディレクトリ名
;;; @note  
*rmdir
getparam $fileutil_dir
fileutil_execwith "rmdir",$fileutil_dir
return


;;; @brief 現在のディレクトリパスを取得する。
;;; @usage curdir $ディレクトリパス
;;; @note  
*curdir
getparam s%fileutil_result
fileutil_exec "curdir"
getret $%fileutil_result
return


;;; @brief ファイルから文字列を読み込む。
;;; @usage fileread $文字列, ファイル名
;;; @note  改行は「\」に置換される。
*fileread
getparam s%fileutil_result,$fileutil_file
fileutil_execwith "fileread",$fileutil_file
getret $%fileutil_result
return


;;; @brief ファイルに文字列を書き込む。
;;; @usage filewrite ファイル名, 文字列
;;; @note  
*filewrite
getparam $fileutil_file,$fileutil_str
fileutil_execwith "filewrite",$fileutil_file+FILEUTIL_PARAM_SEP+$fileutil_str
return


;;; @brief ファイルに文字列を追記する。
;;; @usage fileappend ファイル名, 文字列
;;; @note  ファイルが無い場合は作成する。
*fileappend
getparam $fileutil_file,$fileutil_str
fileutil_execwith "fileappend",$fileutil_file+FILEUTIL_PARAM_SEP+$fileutil_str
return


;;; @brief ファイル名を変更する。
;;; @usage filerename 変更元のファイル名, 変更先のファイル名
;;; @note  
*filerename
getparam $fileutil_from,$fileutil_to
fileutil_execwith "filerename",$fileutil_from+FILEUTIL_PARAM_SEP+$fileutil_to
return


;;; @brief ファイルサイズを取得する。
;;; @usage filesize %ファイルサイズ, ファイル名
;;; @note  ファイルが無い場合は-1が返る。
*filesize
getparam i%fileutil_result,$fileutil_file
fileutil_execwith "filesize",$fileutil_file
getret %%fileutil_result
return


;;; @brief ファイルをコピーする。
;;; @usage filecopy コピー元のファイル名, コピー先のファイル名
;;; @note  
*filecopy
getparam $fileutil_from,$fileutil_to
fileutil_execwith "filecopy",$fileutil_from+FILEUTIL_PARAM_SEP+$fileutil_to
return


;;; @brief ファイルリストを取得する。
;;; @usage filelist $ファイルリスト, 対象ディレクトリ名
;;; @note  区切り文字はFILEUTIL_LIST_SEPを参照。
;;; @see   filelist_each
*filelist
getparam s%fileutil_result,$fileutil_dir
fileutil_execwith "filelist",$fileutil_dir
getret $%fileutil_result
return


;;; @brief ディレクトリリストを取得する。
;;; @usage dirlist $ディレクトリリスト, 対象ディレクトリ名
;;; @note  区切り文字はFILEUTIL_LIST_SEPを参照。
;;; @see   dirlist_each
*dirlist
getparam s%fileutil_result,$fileutil_dir
fileutil_execwith "dirlist",$fileutil_dir
getret $%fileutil_result
return


;;; @brief fileutilプラグインを実行する。
;;; @usage fileutil コマンド
;;; @note  
*fileutil_exec
getparam $fileutil_command
exec_dll FILEUTIL_DLL+"/"+$fileutil_command
return


;;; @brief fileutilプラグインを引数付で実行する。
;;; @usage fileutil コマンド, パラメータ
;;; @note  パラメータの区切りはFILEUTIL_PARAM_SEPを用いる。
*fileutil_execwith
getparam $fileutil_command,$fileutil_param
exec_dll FILEUTIL_DLL+"/"+$fileutil_command+" "+$fileutil_param
return


;// ヘルパー

;;; @brief ディレクトリリストの各ディレクトリを処理する。
;;; @usage dirlist_each ディレクトリリスト, *コールバック
;;; @note  ディレクトリリストの各ディレクトリに対し、コールバックを呼び出す。
;;; @desc
;;; コールバック:
;;;   第一引数にはディレクトリ名を渡す。
;;;   dirlist_eachの再呼び出しは不可
*dirlist_each
getparam $fileutil_dirlist,$fileutil_dirproc
labelexist %fileutil_dirproc,$fileutil_dirproc
if %fileutil_dirproc==0 return
mov %fileutil_dirbreak,0
*dirlist_eachloop
if $fileutil_dirlist=="" return
split $fileutil_dirlist,FILEUTIL_LIST_SEP,$fileutil_diritem
len %fileutil_dirlist,$fileutil_dirlist
len %fileutil_diritem,$fileutil_diritem
fileutil_setproc $fileutil_dirproc
fileutil_callproc $fileutil_diritem
if %fileutil_dirbreak==1 return
if %fileutil_dirlist==%fileutil_diritem return
inc %fileutil_diritem ; セパレータ分を加算
mid $fileutil_dirlist,$fileutil_dirlist,%fileutil_diritem,%fileutil_dirlist-%fileutil_diritem
goto *dirlist_eachloop
return


;;; @brief ファイルリストの各ファイルを処理する。
;;; @usage filelist_each ファイルリスト, *コールバック
;;; @note  ファイルリストの各ファイルに対し、コールバックを呼び出す。
;;; @desc
;;; コールバック:
;;;   第一引数にはディレクトリ名を渡す。
;;;   dirlist_each, filelist_eachの呼び出しは不可
*filelist_each
getparam $fileutil_filelist,$fileutil_fileproc
labelexist %fileutil_fileproc,$fileutil_fileproc
if %fileutil_fileproc==0 return
mov %fileutil_filebreak,0
*filelist_eachloop
if $fileutil_filelist=="" return
split $fileutil_filelist,FILEUTIL_LIST_SEP,$fileutil_fileitem
len %fileutil_filelist,$fileutil_filelist
len %fileutil_fileitem,$fileutil_fileitem
fileutil_setproc $fileutil_fileproc
fileutil_callproc $fileutil_fileitem
if %fileutil_filebreak==1 return
if %fileutil_filelist==%fileutil_fileitem return
inc %fileutil_fileitem ; セパレータ分を加算
mid $fileutil_filelist,$fileutil_filelist,%fileutil_fileitem,%fileutil_filelist-%fileutil_fileitem
goto *filelist_eachloop
return


;;; @brief ディレクトリリスト処理を途中で終了する。
;;; @usage dirlist_eachbreak
;;; @note  
*dirlist_eachbreak
mov %fileutil_dirbreak,1
return


;;; @brief ファイルリスト処理を途中で終了する。
;;; @usage filelist_eachbreak
;;; @note  
*filelist_eachbreak
mov %fileutil_filebreak,1
return


;// private

;;; コールバックを設定する。
*fileutil_setproc
getparam $fileutil_proc
return


;;; コールバックを呼び出す。
*fileutil_callproc
goto $fileutil_proc