/*	
 *	clipblob.h
 *
 *	ユーティリティ：BLOB
 *
 *	CLiP - Common Library for P/ECE
 *	Copyright (C) 2017-2018 Naoyuki Sawa
 *
 *	* Tue Sep 26 23:05:51 JST 2017 Naoyuki Sawa
 *	- 1st リリース。
 *	- dRegTblC.exeと同じ仕様の、BLOBデータを作成するユーティリティ関数です。
 *	  今後、dRegTblC.exeだけでなく、他のツールやモジュールでも同じ仕様を使おうと思うので、共通のユーティリティ関数として実装しておく事にしました。
 *	- 今回作成したのは、BLOBデータを作成するユーティリティ関数だけで、BLOBデータを読み出すユーティリティ関数は、まだ作成していません。
 *	  今後、もし、BLOBデータを読み出す処理も共通化する方が良さそうだと判断したら、その時に作成しようと思います。	⇒{{2017/09/27コメント追記:BLOBデータを読み出すユーティリティ関数も作成しました。}}
 *	* Thu Sep 28 23:55:37 JST 2017 Naoyuki Sawa
 *	- BLOBデータを読み出すユーティリティ関数も作成しました。
 *	  BLOBデータを作成するユーティリティ関数をテストするためには、やはりBLOBデータを読み出すユーティリティ関数も必要なので、作成する事にしました。
 *	  尚、アプリケーションから利用する事も出来ますが必須ではなく、特定のBLOBの構造を前提として直接アクセスしても構いません。
 *	- 「BLOBデータを作成するユーティリティ関数とBLOBデータを読み出すユーティリティ関数のテスト」を作成しました。
 *	* Sun Oct 01 23:07:12 JST 2017 Naoyuki Sawa
 *	- BLOB構造体にシグネチャを追加しました。
 *	  変更前のままでも動作上は問題無いのですが、data引数に間違ってBLOB以外のポインタを渡した場合に発見し辛いバグになるので、すぐにエラー停止出来るようにシグネチャを追加し、常に検査する事にしました。
 *	  今回の変更は、アプリケーションの観点からは透過であり、アプリケーションの変更は不要です。
 *	* Tue Oct 03 23:59:59 JST 2017 Naoyuki Sawa
 *	- blob_compare()を追加しました。
 *	* Sat Apr 07 23:59:59 JST 2018 Naoyuki Sawa
 *	- blob_add_ber(),blob_read_ber()を追加しました。
 */
#ifndef __CLIP_BLOB_H__
#define __CLIP_BLOB_H__
#ifdef  __cplusplus
extern "C" {
#endif//__cplusplus
//*****************************************************************************
//	BLOBデータを作成するユーティリティ関数
//*****************************************************************************
//【NOTE】blob_new()に相当する関数は有りません。NULLポインタが(そしてNULLポインタのみが)空のBLOBを表現するからです。
void blob_free(void* data/*NULL可*/);
int blob_get_size(void* data/*NULL可*/);
//{{2017/10/03追加:blob_compare()を追加しました。
int blob_compare(void* data1/*NULL可*/, void* data2/*NULL可*/);
//}}2017/10/03追加:blob_compare()を追加しました。
void* blob_add_bit(void* data/*NULL可*/, int n);
void* blob_add_byte(void* data/*NULL可*/, int n);
void* blob_add_half(void* data/*NULL可*/, int n);
void* blob_add_exp10(void* data/*NULL可*/, int n);
void* blob_add_word(void* data/*NULL可*/, int n);
//{{2018/04/07追加:blob_add_ber(),blob_read_ber()を追加しました。
void* blob_add_ber(void* data/*NULL可*/, int n);
//}}2018/04/07追加:blob_add_ber(),blob_read_ber()を追加しました。
void* blob_add_fp16(void* data/*NULL可*/, double d);
void* blob_add_fp32(void* data/*NULL可*/, double d);
void* blob_add_fp64(void* data/*NULL可*/, double d);
void* blob_add_string(void* data/*NULL可*/, const char* s);
void* blob_add_data(void* data/*NULL可*/, const void* p, int size/*0可*/);
//*****************************************************************************
//	BLOBデータを読み出すユーティリティ関数
//*****************************************************************************
//BLOBリーダー構造体。
struct blob_reader {
	const int*	data/*[(bits+31)/32]*/;		//+ 0,4 ビット配列データ。
	int		bits;				//+ 4,4 ビット配列データの総ビット数。
	int		pos;				//+ 8,4 次に読み出すビット位置。
};							//=12
//-----------------------------------------------------------------------------
void blob_reader_init(struct blob_reader* reader, const int* data, int size/*0可*/);
int blob_read_bit(struct blob_reader* reader);
int blob_read_byte(struct blob_reader* reader);
int blob_read_half(struct blob_reader* reader);
int blob_read_exp10(struct blob_reader* reader);
int blob_read_word(struct blob_reader* reader);
//{{2018/04/07追加:blob_add_ber(),blob_read_ber()を追加しました。
int blob_read_ber(struct blob_reader* reader);
//}}2018/04/07追加:blob_add_ber(),blob_read_ber()を追加しました。
double blob_read_fp16(struct blob_reader* reader);
double blob_read_fp32(struct blob_reader* reader);
double blob_read_fp64(struct blob_reader* reader);
const char* blob_read_string(struct blob_reader* reader);
const void* blob_read_data(struct blob_reader* reader, int size/*0可*/);
void* blob_copy_data(struct blob_reader* reader, void* p, int size/*0可*/);
#ifdef  __cplusplus
}//extern "C"
#endif//__cplusplus
#endif//__CLIP_BLOB_H__
