/*	
 *	clipnvlg.h
 *
 *	不揮発性ログバッファ
 *
 *	CLiP - Common Library for P/ECE
 *	Copyright (C) 2001-2015 Naoyuki Sawa
 *
 *	* Fri Oct 30 21:25:15 JST 2015 Naoyuki Sawa
 *	- 1st リリース。
 *	- 不揮発性メモリに随時書き込めむ事を目的とした、ログバッファです。
 *	  ログ機能としては既にcliplogb.cモジュールが有りますが、それは画面表示を目的としていて保存は意識していませんでした。
 *	- 当モジュールの機能の特徴は、ログバッファが壊れても正常に復帰出来る事です。
 *	  nvlog_puts()等は、プログラムの異常を検出した時にも呼び出される事を想定しています。
 *	  その時点で、ログバッファのメモリも壊れている可能性が有ります。
 *	  nvlog_puts()はログバッファが壊れていても正常な部分のみを使用して処理を継続します。
 *	  ログバッファが壊れても、nvlog_puts()を何度か呼び出すと、正常な部分だけが残って、ログバッファ全体が正常復帰します。
 *	- 当モジュール自身には、不揮発性メモリに書き込む機能は含めていません。
 *	  アプリケーション側で、nvlog_puts()を呼び出し直後に、その都度、ログバッファ全体を不揮発性メモリに書き込んで下さい。
 *	- ログバッファの内容を表示するには、プログラムからnvlog_dump()を呼び出すか、又は、
 *	  不揮発性メモリのデータをPCに読み出す事が可能ならば、そのデータに対してnvlogd.exeを使用して下さい。
 *	  P/ECEでの使用例は、nvlogd.bat,test.pce/n.bat,test.pce/v.batを参照して下さい。
 *	- ログバッファの初期化は不要です。
 *	  上述のとおり、ログバッファが不定値でも(=壊れていても)、nvlog_puts()の呼び出しによって正常復帰出来るからです。
 *	  又は、明示的に初期化するには、ログバッファの先頭1バイトに0を書き込めば、確実に空の状態となります。
 *	  ログバッファをBSSに置けば自然に空の状態から開始しますし、或いは、不定値で開始したとしても有りません。
 *	  要するに、ログバッファの初期状態を気にする必要は有りません。
 *	- ログバッファをダンプする方法について説明します。
 *	  一般的な標準入出力を利用出来る環境(Win32,P/ECE,等)ならば、nvlog_dump()を使って下さい。
 *	  nvlog_first(),nvlog_next()を使う必要は有りません。(使っても構いません)
 *	  一般的な標準入出力を利用出来ない組み込み環境等では、nvlog_first(),nvlog_next()を使って下さい。
 *	  nvlog_first(),nvlog_next()の、使用方法はnvlog_dump()の実装を参照して下さい。
 *	  特に注意すべき点は、nvlog_first(),nvlog_next()が返す値はヌル終端文字列では無い点に注意して下さい。
 *	* Wed Nov 18 21:37:53 JST 2015 Naoyuki Sawa
 *	- 'extern "C" {'〜'}'で囲みました。.cppを含むWin32プロジェクトからもインクルード出来るようにするためです。
 */
#ifndef __CLIP_NVLG_H__
#define __CLIP_NVLG_H__
#ifdef  __cplusplus
extern "C" {
#endif//__cplusplus
#ifndef __RENESAS__
#define USE_NVLOG_DUMP	//nvlog_dump()が不要ならばこのシンボル定義をコメントアウトしてください。
#endif//__RENESAS__
/****************************************************************************
 *	
 ****************************************************************************/
#ifndef __RENESAS__
#define NVLOG_SIZE	BLOCKSIZE	//調整可。少なくとも257以上とする事。一個のチャンクの最大バイト数が(1+255+1)だから。
#else //__RENESAS__
#define NVLOG_SIZE	2048		//調整可。少なくとも257以上とする事。一個のチャンクの最大バイト数が(1+255+1)だから。
#endif//__RENESAS__
/****************************************************************************
 *	
 ****************************************************************************/
void nvlog_printf(void* nvlog/*[NVLOG_SIZE]*/, const char* fmt, ...);
void nvlog_vprintf(void* nvlog/*[NVLOG_SIZE]*/, const char* fmt, va_list ap);
void nvlog_puts(void* nvlog/*[NVLOG_SIZE]*/, const char* new_str);
/*--------------------------------------------------------------------------*/
struct nvlog_iter { const unsigned char *pos, *end; };
const unsigned char* nvlog_first(const void* nvlog/*[NVLOG_SIZE]*/, struct nvlog_iter* iter);
const unsigned char* nvlog_next(struct nvlog_iter* iter);
#ifdef  USE_NVLOG_DUMP
void nvlog_dump(FILE* fp, void* nvlog/*[NVLOG_SIZE]*/);
#endif//USE_NVLOG_DUMP
#ifdef  __cplusplus
}//extern "C"
#endif//__cplusplus
#endif//__CLIP_NVLG_H__
