/*	
 *	include/assert.h
 *
 *	CLiP - Common Library for P/ECE
 *	Copyright (C) 2012 Naoyuki Sawa
 *
 *	* Thu Jul 20 06:10:41 JST 2006 Naoyuki Sawa
 *	- 新規作成。
 *	  本ファイルを作成した理由は、clipstd.hのコメントを参照してください。
 *	* Tue Jan 03 22:25:06 JST 2012 Naoyuki Sawa
 *	- assertの有効/無効を、NDEBUGシンボルで切り替えるように変更しました。
 *	* Sat Jan 14 00:03:29 JST 2012 Naoyuki Sawa
 *	- assertマクロが、die()の代りに、die3()を使用するように変更しました。
 *	  詳細は、clipmisc.hの同日のコメントを参照してください。
 */
#ifndef _ASSERT_H
#define _ASSERT_H

//{{2012/01/03:変更
//#define assert	ASSERT	/* ASSERT()マクロはclipmisc.hで定義されています。 */
//↓2012/01/03:変更
//↓* Tue Jan 03 22:25:06 JST 2012 Naoyuki Sawa
//↓- これまで、assertはASSERTと同じく、DEBUGシンボルが定義されているときに有効としていました。
//↓  しかし、CLiP使用プロジェクトをDEBUGビルドすることはほとんど無いため、assertもASSERTもほぼ使い道がありませんでした。
//↓  元々DEBUGシンボルは、CLiPライブラリ開発初期のDEBUGビルドに利用したのみで、現在はDEBUGビルドの検証は行っていません。
//↓- 今回、Luaライブラリの使用にあたり、APIチェックがassertで行われているため、assertを有効にしたいと考えました。
//↓  しかし、上記の理由により、CLiP使用プロジェクトでassertを有効にすることは難しいという問題が発生しました。
//↓  assertを有効にしたければ、DEBUGビルドにするしか方法が無く、実用的でないためです。
//↓- そこで今後、assertはASSERTと違って、NDEBUGシンボルが定義されていないときに有効とするように変更しました。
//↓  標準Cライブラリの仕様に準拠するようにしたわけで、その観点からも望ましいはずです。
//↓- 個別のCLiP使用プロジェクトでassertを有効にしたい場合、DEBUGビルドにする必要はありません。
//↓  個別のCLiP使用プロジェクトのMakefileで、以下のように定義してください。
//↓	APP_CFLAGS = -D"NDEBUG -UNDEBUG"
//↓  これは、gcc33.exeに対して以下のように引き渡され、clip.mk内で指定されている-DNDEBUGを、未定義に戻します。
//↓	gcc33.exe -S -x c -Wall -DPIECE -I..\clip -I..\clip\include -O2 -DNDEBUG -DNDEBUG -UNDEBUG -IC:\usr\PIECE\include main.$
//↓	                                                                         ~~~~~~~~~~~~~~~~~
//↓  単純に「APP_CFLAGS = -UNDEBUG」と指定できない理由は、pcc33.exeが-Uオプションを認識しないからです。
//↓  このテクニックについては、test.pce/Makefile内のコメントを参照してください。
#ifndef NDEBUG
//{{2012/01/14:変更
//void die(const char* fmt, ...) __attribute__((noreturn));
//#define assert(f)	((void)((f) || (die(__FILE__ "(%d): %s", __LINE__, #f), 0)))
//↓2012/01/14:変更
void die3(const char* file, int line, const char* f) __attribute__((noreturn));
#define assert(f)	((void)((f) || (die3(__FILE__, __LINE__, #f), 0)))
//}}2012/01/14:変更
#else /*NDEBUG*/
#define assert(f)	((void)0)
#endif/*NDEBUG*/
//}}2012/01/03:変更

#endif/*_ASSERT_H*/
