/*	
 *	clipstd.h
 *
 *	標準ヘッダファイルをインクルードします。
 *
 *	CLiP - Common Library for P/ECE
 *	Copyright (C) 2001 Naoyuki Sawa
 *
 *	* Fri Nov 30 15:49:54 JST 2001 Naoyuki Sawa
 *	- 作成開始。
 *	* Thu Dec  6 22:01:32 JST 2001 Naoyuki Sawa
 *	- 1stリリース。
 *	* Thu May 30 06:09:50 JST 2002 Naoyuki Sawa
 *	- s1c33cpu.hとc33208.hのインクルードを追加。
 *	* Thu Jul  4 18:19:00 JST 2002 Naoyuki Sawa
 *	- #include "c33208.h" を "c33209.h" に変更。
 *	- c33209.hは、オリジナルのc33208.hを基に、修正を加えたものです。
 *	  c33208.hはもう使いませんが、keepフォルダに残してありますので、
 *	  c33208.hとc33209.hを比較して、変更か所を確認してください。
 *	* Fri Jul  5 20:05:00 JST 2002 Naoyuki Sawa
 *	- plc_IOの定義をc33209.hに移しました。
 *	* Sat Sep  7 21:39:00 JST 2002 Naoyuki Sawa
 *	- Simpleライブラリのプロジェクトからもclipstd.hを利用するために、
 *	  NOZLIBシンボルを定義するとzlib.hをincludeしないようにしました。
 *	  NOGSM シンボルを定義するとgsm.h をincludeしないようにしました。
 *	  ->Sat Oct 12 06:24:00 やっぱりNOZLIB,NOGSMは削除。
 *	    他のプロジェクトで使うときは、編集してください。
 *	* Mon Nov 26 00:47:00 JST 2002 Naoyuki Sawa
 *	- zlib/unzip.hを追加しました。
 *	  詳しくは、zlib/Makefileの2002/11/26日付コメントを参照してください。
 *	* Sun Mar 23 05:53:00 JST 2003 Naoyuki Sawa
 *	- S1C33 Family C Compiler Packageのpow()バグ回避方法を変更。
 *	  これまではマクロで置き換えていましたが、関数の再定義に変更しました。
 *	  マクロでもいいのですが、関数再定義の方が安全な気がしたので…
 *	  pow()の再定義は、他の関数の再定義と同じく、clippce.cで行っています。
 *	* Tue May 20 06:00:00 JST 2003 Naoyuki Sawa
 *	- 浮動小数点数対応のsprintf()/vsprintf()を作ったので、（→clipprnt.c）
 *	  これらの関数がカーネル呼び出しになってしまわないよう、
 *	  #include <piece.h> より先に #define NOPCESPRINTF を定義しました。
 *	* Wed Jan 04 04:16:00 JST 2006 Naoyuki Sawa
 *	- Win32アプリケーション用の、メモリリーク追跡の定義を追加しました。
 *	  メモリリーク追跡を行うには、main()の最初にDEBUG_INIT()を呼び出してください。
 *	* Thu Jan 05 02:51:00 JST 2006 Naoyuki Sawa
 *	- Win32環境でよく使う、assert.h、io.h等を、ここで読み込むよう追加しました。
 *	  これまでは、それぞれのWin32アプリケーションが、個別に読み込んでいました。
 *	* Thu Mar 23 19:55:00 JST 2006 Naoyuki Sawa
 *	- #include <setjmp.h> を追加しました。
 *	* Thu Jun 08 07:45:00 JST 2006 Naoyuki Sawa
 *	- EPSONライブラリのlimits.hは問題があり、INT_MINを使うと以下のような警告が表示されます。
 *		warning: decimal constant is so large that it is unsigned
 *	  警告を回避するために、INT_MINを再定義しました。(LONG_MINについても同様です。)
 *	  コンパイル時の警告の有無だけの違いであり、生成されるバイナリに変化はありません。
 *	  ややトリッキーですが、INT_MINをこのように定義して警告を回避するのは、C言語の定石です。
 *	* Sat Jun 17 04:53:39 JST 2006 Naoyuki Sawa
 *	- stddef.hとstdlib.hのwchar_t定義衝突を回避し、stddef.hのincludeを有効に戻しました。
 *	* Tue Jun 27 06:49:04 JST 2006 Naoyuki Sawa
 *	- Expatのヘッダファイル(expat/expat.h)インクルードを追加しました。
 *	* Wed Jun 28 05:09:19 JST 2006 Naoyuki Sawa
 *	- Visual C++ 6.0のC言語では、inlineが使えないので、__inlineへの置き換えを定義しました。
 *	  Win32でclipfix.hを利用するときに、プロジェクト毎の置き換え定義が不要になりました。
 *	* Thu Jul 20 06:10:41 JST 2006 Naoyuki Sawa
 *	- assert.hを、P/ECE環境とWin32環境共通でインクルードするよう変更しました。
 *	  これまでは、P/ECE環境にassert.hは存在せず、Win32環境でのみインクルードしていました。
 *	  今回、P/ECE環境のために、include/assert.hを作成しました。
 *	  P/ECE環境では、include/assert.hがインクルードされます。
 *	  CLiPには既にASSERTが存在するので、assert.hは単にassertをASSERTに置き換えるだけです。
 *	- 以上のように変更した理由は、次のとおりです。
 *	  既存のライブラリ等をP/ECEで利用する場合に、ライブラリがassert()を利用していることが多いです。
 *	  これまでは、「#include <assert.h>」をコメントアウトし、assert()をASSERT()に変更していました。
 *	  毎回このような作業を行うよりも、assert.hとassert()を提供する方が早いと判断しました。
 */
#ifndef __CLIP_STD_H__
#define __CLIP_STD_H__

/* S1C33 Family C Compiler Package でサポートされている、
 * 標準ヘッダファイルをインクルードします。
 * * stddef.hをインクルードすると、wchar_tの多重定義エラーになります。
 *   そういえば確かに、コンパイラマニュアルのヘッダファイルリストには
 *   stddef.hは載っていません(他のヘッダファイルは全部載ってるのに)。
 *   とりあえず、インクルードリストから外して様子を見ることにします。
 *   ↓追記 Sat Jun 17 04:53:39 JST 2006 Naoyuki Sawa
 *   この問題の原因は、stddef.hとstdlib.hでwchar_tの定義が衝突していることでした。
 *   stdlib.h側の定義を抑制して問題を回避し、stddef.hのincludeを有効に戻しました。
 * * stdarg.hは単独では使えず、_BOUNDARYの未定義エラーになります。
 *   S1C33アーキテクチャ依存のヘッダファイル、smcvals.hが必要です。
 */
#ifdef PIECE
#define _WCHAR_T	/* 2006/06/17 stddef.hとstdlib.hのwchar_t衝突回避 */
#endif /*PIECE*/
#include <ctype.h>
#include <errno.h>
#include <float.h>
#include <limits.h>
#include <math.h>
#include <stdarg.h>
#include <stddef.h>	/* 2006/06/17 stddef.hのincludeを有効に戻しました */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <setjmp.h>
#include <assert.h>	/* 2006/07/20 assert.hをWin32固有からP/ECEとWin32共通に変更 */

/* P/ECE専用 */
#ifdef PIECE
#define NOPCESPRINTF			/* sprintf()/vsprintf()はclipprnt.cで定義 */
#include <smcvals.h>			/* S1C33用: va_start()等に必要   */
#include <piece.h>			/* P/ECE用: 基本ヘッダファイル */
#include <pclsprite.h>			/* P/ECE用: スプライト/BGライブラリ */
#include <muslib.h>			/* P/ECE用: 標準音楽ドライバ */
#include <s1c33cpu.h>			/* P/ECE用: コアCPU制御 */
#include "vector.h"			/* P/ECE用: カーネルサービスベクタ番号 */
#include "c33209.h"			/* S1C33用: I/Oマップ */
///* S1C33 Family C Compiler Package の pow() には不具合があり、間違った値を返すことがあります。
// * 例えば pow(1.25, 1.0) の結果が 0.0 になることがあります。まだ原因は究明できていません。
// * pow(1.0〜1.5, 0.0以外) あたりが危ないようですが、微妙なコーディングの違いによって発症しないこともあります。
// * 現在、二種類の回避方法が発見されています。
// * ・pow()を呼ぶだけのラッピング関数pow_wrap()を用意し、常にpow_wrap()を経由してpow()を呼び出す。
// *   確かに回避できるのですが、なぜこれだけで回避できるのか全くわからないのが不安なところです。
// * ・pow()をexp()とlog()に展開し、pow()を使わないようにします。
// *   もしも不具合の原因がpow()単体の問題であったならば、この方法で確実に回避できるはずです。
// *   ただし、算術関数の呼び出しが増えるため、プログラムが遅くなってしまう欠点があります。
// * いずれにせよ、もともとの原因がわかっていないので、どちらの方法でも確実に回避できるとは言い切れません。
// */
//#define pow(x, y)	exp(log(x) * (y))
//→2003/03/23 マクロで置き換えるのではなく、関数を再定義して置き換えることにしました。clippce.cにあります。
/* * Thu Jun 08 07:45:00 JST 2006 Naoyuki Sawa
 * - EPSONライブラリのlimits.hは問題があり、INT_MINを使うと以下のような警告が表示されます。
 *	warning: decimal constant is so large that it is unsigned
 *   警告を回避するために、INT_MINを再定義しました。(LONG_MINについても同様です。)
 *   コンパイル時の警告の有無だけの違いであり、生成されるバイナリに変化はありません。
 *   ややトリッキーですが、INT_MINをこのように定義して警告を回避するのは、C言語の定石です。
 */
#undef  INT_MIN  // (-2147483648     )	/* EPSONライブラリの定義 (誤) */
#define INT_MIN     (-2147483647  - 1)	/* Visual C++ 6.0 の定義 (正) */
#undef  LONG_MIN // (-2147483648     )	/* EPSONライブラリの定義 (誤) */
#define LONG_MIN    (-2147483647L - 1)	/* Visual C++ 6.0 の定義 (正) */
#endif /*PIECE*/

/* Windows専用 */
#ifdef WIN32
#define STRICT
#pragma warning(disable: 4115)		/* 関数の仮引数リストで構造体、共用体、列挙型の定義に使われました。 */
#include <windows.h>
#pragma warning(default: 4115)
/* 非標準の拡張機能に関する警告を抑制します。 */
//#pragma warning(disable: 4200)	/* 非標準の拡張機能が使用されています:構造体または共用体中にサイズが0の配列があります。 */
#pragma warning(disable: 4204)		/* 非標準の拡張機能が使用されています:定数でない初期化子の集合です。 */
//#pragma warning(disable: 4214)	/* 非標準の拡張機能が使用されています:整数型以外のビットフィールドです。 */
#pragma warning(disable: 4244)		/* '...'から'...'に変換しました。データが失われているかもしれません。 */
//#pragma warning(disable: 4761)	/* 関数の仮引数と実引数のベース型が異なっています。実引数を仮引数の型に変換します。 */
/* VC++はデバッグ時にDEBUGでなく_DEBUGを定義するので、DEBUGも定義します。 */
#ifdef _DEBUG
#define DEBUG
#endif /*_DEBUG*/
/*{{2006/01/04 --------------------------------- メモリリーク追跡 --------------------------------- */
/* malloc()等をデバッグ版に置き換えて、メモリリークのレポート時に、ファイル名、行番号を表示します。 */
#define _CRTDBG_MAP_ALLOC /* ← この二行の順番、必須です!! 逆にすると */
#include <crtdbg.h>       /* ← _CRTDBG_MAP_ALLOCが有効になりません!! */
/* プログラム終了時に、メモリリークをレポートするよう指示します。main()の最初に呼び出してください。 */
#define DEBUG_INIT() do {											\
	/* * メモリリークのレポートは、警告レベルのデバッグメッセージとして出力されます。               */	\
	/*   初期状態では、警告レベルのデバッグメッセージはどこにも表示されないようです。               */	\
	/* - VC++ 6.0のヘルプには、初期状態では、stderrまたはデバッガに出力されると書いてありますが、   */	\
	/*   VC++ 6.0 SP6＋Windows 2000で試してみたところ、初期状態ではどこにも出力されませんでした。   */	\
	/* * メモリリークのレポートを表示するために、警告レベルのデバッグメッセージ出力先を設定します。 */	\
	/*   出力先は、stderrと、デバッガの両方とします。(_CrtSetReportMode()は複数設定が可能です)      */	\
	/* - stderrへ出力する理由は、プログラムを直接実行した場合は、デバッガ出力が見られないからです。 */	\
	/* - デバッガへ出力する理由は、コンソールプログラムをVC++上でデバッグ実行した場合、終了間際に   */	\
	/*   stderrへレポートが出力されても、すぐにコンソールが閉じてしまって、見られないからです。     */	\
	/* * エラーレベル、および、アサートレベルのデバッグメッセージ出力は、メモリリークのレポートには */	\
	/*   関係無いので、ここで出力先を設定する必要はありません。                                     */	\
	_CrtSetReportMode(_CRT_WARN, _CRTDBG_MODE_FILE | _CRTDBG_MODE_DEBUG);					\
	_CrtSetReportFile(_CRT_WARN, _CRTDBG_FILE_STDERR);							\
	/* _CrtSetReportMode(_CRT_ERROR, ...); → 変更しません */						\
	/* _CrtSetReportMode(_CRT_ASSERT, ...); → 変更しません */						\
	/* デバッグヒープマネージャのメモリ割り当て動作を設定します。 */					\
	_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF      | /* Turn on debug allocation       */				\
		       _CRTDBG_CHECK_ALWAYS_DF   | /* Check heap every alloc/dealloc */				\
		    /* _CRTDBG_CHECK_CRT_DF      |    Leak check/diff CRT blocks     */				\
		    /* _CRTDBG_DELAY_FREE_MEM_DF |    Don't actually free memory     */				\
		       _CRTDBG_LEAK_CHECK_DF);     /* Leak check at program exit     */				\
} while(0);
/*}}2006/01/04 --------------------------------- メモリリーク追跡 --------------------------------- */
/* P/ECEには無く、Windowsでよく使うヘッダファイルを、ここで読み込みます。 */
//#include <assert.h>	/* assert() */
//→2006/07/20 assert.hをWin32固有からP/ECEとWin32共通に変更
#include <io.h>		/* open()、isatty()等 */
#include <conio.h>	/* kbhit()、getch()等 */
/*{{2006/06/28 Visual C++ 6.0のC言語では、inlineが使えないので、__inlineへの置き換えを定義しました。*/
#define inline __inline
/*}}2006/06/28 Visual C++ 6.0のC言語では、inlineが使えないので、__inlineへの置き換えを定義しました。*/
#endif /*WIN32*/

/* GSM */
#include "gsm/gsm.h"

/* Zlib */
#include "zlib/zlib.h"
#include "zlib/unzip.h"

/* Expat */
#include "expat/expat.h"

#endif /*__CLIP_STD_H__*/
