/*	
 *	clipfpk.h
 *
 *	ファイルパック形式
 *
 *	CLiP - Common Library for P/ECE
 *	Copyright (C) 2015 Naoyuki Sawa
 *
 *	* Tue Jan 06 21:26:41 JST 2015 Naoyuki Sawa
 *	- 新規作成。
 *	- ファイルパック形式関連の宣言を、clipmisc.hからclipfpk.hへ分離しました。
 *	  ファイルパック形式関連の実装は既に、clipmisc.cからclipfpk.cへ分離してあったので、今回分離したのは宣言のみです。
 *	  宣言も分離することにした理由は、宣言と実装のファイルの対応付けを、分り易くするためです。
 *	* Wed Nov 18 21:37:53 JST 2015 Naoyuki Sawa
 *	- 'extern "C" {'〜'}'で囲みました。.cppを含むWin32プロジェクトからもインクルード出来るようにするためです。
 */
#ifndef __CLIP_FPK_H__
#define __CLIP_FPK_H__

#ifdef  __cplusplus
extern "C" {
#endif//__cplusplus

/*****************************************************************************
 *	ユーティリティ：ファイルパック形式
 *****************************************************************************/

/*                           0 +-----------------------------+
 *                             | FILE_PAC_INFO               |
 *                             +-----------------------------+
 *                             | FILE_INFO[0]                |
 *                             +-----------------------------+
 *                             | FILE_INFO[1]                |
 *                             +-----------------------------+
 *                             =                             =
 *                             +-----------------------------+
 *                             | FILE_INFO[famount-1]        |
 *         FILE_INFO[0].offset +-----------------------------+−
 *                             |                             |↑
 *                             | ファイル[0]のデータ         |｜FILE_INFO[0].size + 3 & ~3
 *                             |                             |↓
 *         FILE_INFO[1].offset +-----------------------------+−
 *                             |                             |↑
 *                             | ファイル[1]のデータ         |｜FILE_INFO[1].size + 3 & ~3
 *                             |                             |↓
 *                             +-----------------------------+−
 *                             =                             =
 * FILE_INFO[famount-1].offset +-----------------------------+−
 *                             |                             |↑
 *                             | ファイル[famount-1]のデータ |｜FILE_INFO[famount-1].size
 *                             |                             |↓
 *                             +-----------------------------+−
 */
#define FILE_PAC_INFO_HEAD	 ('F' << 24 | 'P' << 16 | 'A' << 8 | 'K')
typedef struct _FILE_PAC_INFO {	/* ファイルパック情報                   */
	unsigned long head;	/* シグネチャ('FPAK'固定。並びは"KAPF") */
	long famount;		/* ファイル数                           */
} FILE_PAC_INFO;
typedef struct _FILE_INFO {	/* ファイル情報                         */
	char fname[16];		/* ファイル名                           */
	unsigned long offset;	/* オフセット(fpkファイル先頭を0とする) */
	unsigned long size;	/* ファイルサイズ                       */
} FILE_INFO;

/* fpkファイル内のファイルサイズを取得します。
 * [in]
 *	fname		fpkファイル名。
 *	name		ファイルエントリ名。
 * [out]
 *	戻り値		ファイルサイズ[バイト]。
 * [note]
 *	* ファイルエントリ名は、大文字小文字を区別せずに比較します。
 *	* ファイルエントリが見つからなかった場合は、アサートします。
 */
int fpk_size(const char* fname, const char* name);

/* fpkファイル内のファイルを読み込みます。
 * [in]
 *	fname		fpkファイル名。
 *	name		ファイルエントリ名。
 *	buffer		バッファアドレス。
 *	buflen		バッファサイズ。
 * [out]
 *	戻り値		実際に読み込んだファイルサイズ[バイト]。
 * [note]
 *	* ファイルエントリ名は、大文字小文字を区別せずに比較します。
 *	* ファイルエントリが見つからなかった場合は、アサートします。
 *	* バッファサイズがファイルサイズ未満の場合は、アサートします。
 */
int fpk_load(const char* fname, const char* name, void* buffer, int buflen);

/*****************************************************************************
 *	ユーティリティ：オンメモリファイルパック形式
 *****************************************************************************/

/* オンメモリfpk内のファイル先頭アドレスを取得します。
 * [in]
 *	fpk		オンメモリfpkの先頭アドレス。
 *	name		ファイルエントリ名。
 *	size		ファイルサイズを格納する変数へのポインタ。
 *			NULLを指定するとファイルサイズは格納されません。
 * [out]
 *	戻り値		実際に読み込んだファイルサイズ[バイト]。
 * [note]
 *	* ファイルエントリ名は、大文字小文字を区別せずに比較します。
 *	* ファイルエントリが見つからなかった場合は、アサートします。
 */
const void* fpk_address(const void* fpk, const char* name, int* size);

#ifdef  __cplusplus
}//extern "C"
#endif//__cplusplus

#endif//__CLIP_FPK_H__
