
#define MAX_LEN			1024	// ファイル名の最大文字数 (末尾のNULL文字も含む)
#define ADD_LEN			32		// 作業中にファイル名に追加する文字数
#define EXT_LEN			16		// 拡張子として認識する最大文字数
#define COMMENT_LEN		128		// コメントの最大文字数
#define ALLOC_LEN		4096	// 可変長領域を何バイトごとに確保するか
#define IO_SIZE			65536	// 16384 以上にすること
#define MAX_HASH		64		// 対応するハッシュ値の最大バイト数
#define UPDATE_TIME		1024	// 更新間隔 ms

// グローバル変数
extern wchar_t checksum_file[MAX_LEN];	// チェックサム・ファイルのパス
extern wchar_t base_dir[MAX_LEN];		// ソース・ファイルの基準ディレクトリ
extern wchar_t ini_path[MAX_LEN];		// 検査結果ファイルのパス

extern int base_len;		// ソース・ファイルの基準ディレクトリの長さ
extern int file_num;		// ソース・ファイルの数

extern int switch_v;	// 検査レベル

// 可変長サイズの領域にテキストを保存する
extern wchar_t *text_buf;	// チェックサム・ファイルのテキスト内容
extern int text_len;		// テキストの文字数
extern int text_max;		// テキストの最大文字数

extern wchar_t *hash_buf;	// 検査したファイルのファイル名とハッシュ値のリスト
extern int hash_len;
extern int hash_max;

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

extern unsigned int cp_output;	// Console Output Code Page

// 指定された Code Page から UTF-16 に変換する
int cp_to_utf16(char *in, wchar_t *out, int max_size, unsigned int cp);

// Windown OS の UTF-16 から指定された Code Page に変換する
int utf16_to_cp(wchar_t *in, char *out, int max_size, unsigned int cp);

// 文字列が UTF-8 かどうかを判定する (0 = maybe UTF-8)
int check_utf8(unsigned char *text);

// 文字列が UTF-16 かどうかを判定して変換する
int utf16_to_utf16(unsigned char *in, int len, wchar_t *out);

// UTF-16 のファイル・パスを画面出力用の Code Page を使って表示する
void printf_cp(unsigned char *format, wchar_t *path);

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

// ファイルの offset バイト目から size バイトのデータを buf に読み込む
int file_read_data(
	HANDLE hFileRead,
	__int64 offset,
	unsigned char *buf,
	unsigned int size);

// ファイルの offset バイト目に size バイトのデータを buf から書き込む
int file_write_data(
	HANDLE hFileWrite,
	__int64 offset,
	unsigned char *buf,
	unsigned int size);

// ファイルの offset バイト目に size バイトの指定値を書き込む
int file_fill_data(
	HANDLE hFileWrite,
	__int64 offset,
	unsigned char value,
	unsigned int size);

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

// ファイル・パスがファイル・リスト上に既に存在するか調べる
int search_file_path(
	wchar_t *list,			// ファイル・リスト
	int total_len,			// ファイル・リストの文字数
	wchar_t *search_file);	// 検索するファイルのパス

// ファイル・リストの内容を並び替える
void sort_list(
	wchar_t *list,	// ファイル・リスト
	int total_len);	// ファイル・リストの文字数

// テキストに新しい文字列を追加する
int add_text(wchar_t *new_text);	// 追加するテキスト

// リストに新しいハッシュ値を追加する
int add_hash(
	wchar_t *new_name,	// ファイル名
	wchar_t *new_hash,	// ハッシュ値
	wchar_t *state);	// 状態

// ファイル名で一致する検査結果を探す
int search_hash_name(wchar_t *find_name);

// ハッシュ値で一致する検査結果を探す
int search_hash_value(
	int search_from,
	wchar_t *find_hash);

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

// ファイル・パスからファイル名の位置を戻す
wchar_t * offset_file_name(wchar_t *file_path);

// ファイル・パスからファイル名だけ取り出す
void get_file_name(
	wchar_t *file_path,		// ファイル・パス
	wchar_t *file_name);	// ファイル名

// ファイル・パスからディレクトリだけ取り出す、末尾は「\」か「/」
void get_base_dir(
	wchar_t *file_path,		// ファイル・パス
	wchar_t *base_path);	// ディレクトリ

// ディレクトリ記号の「\」を「/」に置換する
void unix_directory(wchar_t *path);

// 絶対パスかどうかを判定する
int is_full_path(wchar_t *path);

// ファイルのディレクトリ位置が同じかどうかを調べる
int compare_directory(wchar_t *path1, wchar_t *path2);

// ファイル名が有効か確かめて、問題があれば浄化する
int sanitize_filename(wchar_t *name);

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

// 相対パスを絶対パスに変換し、パスの先頭に "\\?\" を追加する
// 戻り値 : 0=エラー, 5～=新しいパスの長さ
int copy_path_prefix(
	wchar_t *new_path,	// 新しいパス
	int max_len,		// 新しいパスの最大長さ (末尾の null文字も含む)
	wchar_t *src_path,	// 元のパス (相対パスでもよい)
	wchar_t *dir_path);	// 相対パスの場合に基準となるディレクトリ (NULL ならカレント・ディレクトリ)

// ファイル・パスから、先頭にある "\\?\" を省いた長さを戻す
int len_without_prefix(wchar_t *file_path);

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

// ユニコードの16進数文字列から数値を読み取る
unsigned int get_val32h(wchar_t *s);

// 16進数の文字が何個続いてるか
unsigned int base16_len(wchar_t *s);

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

extern int prog_last;	// 前回と同じ進捗状況は出力しないので記録しておく

// 経過のパーセント表示、キャンセルと一時停止ができる
// 普段は 0 を返す、キャンセル時は 0以外
int print_progress(int prog_now);
void print_progress_text(int prog_now, char *text);
int print_progress_file(int prog_now, wchar_t *file_name);
void print_progress_done(void);

// キャンセルと一時停止を行う
int cancel_progress(void);

// Win32 API のエラー・メッセージを表示する
void print_win32_err(void);

// エクスプローラーで隠しファイルを表示する設定になってるか調べる
unsigned int get_show_hidden(void);

