/*	
 *	clipstd_x64.h
 *
 *	標準ヘッダファイルをインクルードします。
 *
 *	CLiP - Common Library for P/ECE
 *	Copyright (C) 2001-2016 Naoyuki Sawa
 *
 *	* Sat Sep 03 14:13:50 JST 2016 Naoyuki Sawa
 *	- 作成開始。
 *	- clipstd.hの、64ビット用の代替バージョンです。
 *	  将来的にはclipstd.hにマージしたいですが、当面は混乱を防ぐためにファイルを分ける事にしました。
 *	- 64ビット特有の箇所以外は、基本的には32ビット版と同じなので、詳細なコメントは記載していません。
 *	  詳細なコメントについては、元バージョンを参照して下さい。
 */
#ifndef __CLIP_STD_X64_H__
#define __CLIP_STD_X64_H__
/*****************************************************************************
 *	
 *****************************************************************************/
#if     (defined(_WIN32) && !defined(WIN32))
#define                              WIN32
#endif//(defined(_WIN32) && !defined(WIN32))
#if     (defined(_DEBUG) && !defined(DEBUG))
#define                              DEBUG
#endif//(defined(_DEBUG) && !defined(DEBUG))
/*--------------------------------------------------------------------------*/
#ifndef __GNUC__
#define __attribute__(x)
#endif//__GNUC__
#ifndef _MSC_VER
#define __declspec(x)
#endif//_MSC_VER
/*****************************************************************************
 *	
 *****************************************************************************/
// * Sun Sep 04 21:41:17 JST 2016 Naoyuki Sawa
// - VS2015プロジェクトにおいて、以下のマクロ定義は定番です。
//   詳細は、/clip/tool/SofdecHelper/SofdecHelper.cの'Mon Aug 08 21:53:54 JST 2016'のコメントを参照して下さい。
// - アプリケーションのVS2015プロジェクトで、これらのマクロ定義を行わなかった場合でも、確実にこれらのマクロ定義が行われるように、このヘッダファイルで定義しておく事にしました。
//   「プロジェクト」→「プロパティ」→「構成=すべての構成、プラットフォーム=すべてのプラットフォーム」→「構成プロパティ=C/C++」→「プリプロセッサ」→「プリプロセッサの定義」
//   ど同じマクロ定義が行われた場合のために、条件コンパイルで重複を防いでいます。
#ifndef _CRT_SECURE_NO_WARNINGS
#define _CRT_SECURE_NO_WARNINGS
#endif//_CRT_SECURE_NO_WARNINGS
#ifndef _CRT_NONSTDC_NO_WARNINGS
#define _CRT_NONSTDC_NO_WARNINGS
#endif//_CRT_NONSTDC_NO_WARNINGS
/*--------------------------------------------------------------------------*/
// * Sat Sep 03 21:12:23 JST 2016 Naoyuki Sawa
// - 後述の通り、VS2015では、多くの関数がインラインで定義されるようになりました。
//   しかし、当面の間は、インライン定義を抑制しておく事にしました。
//   特に問題が出た訳では無いのですが、互換性やデバッグの観点で気になるからです。
//   もうしばらく様子を見てから、インライン定義を有効にしようと思います。
//   尚、_NO_CRT_STDIO_INLINEを定義すればインライン定義が無効になり、_NO_CRT_STDIO_INLINEが未定義ならば(=デフォルト)インライン定義が有効になります。
// - インライン定義を無効にした場合は、「legacy_stdio_definitions.lib」のリンクが必要です。
//   当ライブラリがインライン定義を有効にしていても、依存するライブラリがインライン定義を無効にしていたら、「legacy_stdio_definitions.lib」のリンクが必要です。
//   要するに、インライン定義を有効にしたモジュールと、無効にしたモジュールは混在可能で、無効にしたモジュールが一つでもあれば、上記のリンクが必要という事です。
#ifndef _NO_CRT_STDIO_INLINE
#define _NO_CRT_STDIO_INLINE
#endif//_NO_CRT_STDIO_INLINE
//■参照資料「Microsoft Developer Network - Visual C++ 2015 での互換性に影響する変更点」(https://msdn.microsoft.com/ja-jp/library/bb531344.aspx)
//│現在、関数のprintfファミリとscanfファミリは、インラインで定義されています。
//│printf関数とscanf関数すべての定義は、<stdio.h>、<conio.h>、およびその他のCRTヘッダーにインラインで移動されました。
//│これは、プログラムで適切なCRTヘッダーを組み込まずにこれらの関数をローカルで宣言した場合にリンカーエラー(LNK2019、外部シンボルは未解決です)につながる互換性に影響する変更点です。
//│可能な場合、CRTヘッダーが組み込まれるよう(つまり、#include<stdio.h>を追加するよう)またインライン関数が組み込まれるようコードを更新してください。
//│これらのヘッダーファイルが組み込まれるようコードを変更しない場合、別の方法として、付加的なライブラリをリンカー入力legacy_stdio_definitions.libに追加することもできます。
#pragma comment(lib, "legacy_stdio_definitions.lib")
/*--------------------------------------------------------------------------*/
//■参照資料「Microsoft Developer Network - 数値演算定数」(https://msdn.microsoft.com/ja-jp/library/4hwaceh6.aspx)
//│数値演算定数は標準C/C++では定義されていません。
//│これらの定数を使用するには、最初に_USE_MATH_DEFINESを定義してから、cmathまたはmath.hをインクルードする必要があります。
#define _USE_MATH_DEFINES
/*--------------------------------------------------------------------------*/
//■参照資料「Windows Dev Center - Disabling STRICT」(https://msdn.microsoft.com/en-us/library/windows/desktop/aa383679(v=vs.85).aspx)
//│When you define the STRICT symbol, you enable features that require more care in declaring and using types.
//│This helps you write more portable code.
//│This extra care will also reduce your debugging time.
//│Enabling STRICT redefines certain data types so that the compiler does not permit assignment from one type to another without an explicit cast.
//│This is especially helpful with Windows code.
//│Errors in passing data types are reported at compile time instead of causing fatal errors at run time.
//│With Visual C++, STRICT type checking is defined by default.	←←←←←←←←←←注目。昔は明示的にSTRICTを定義する必要が有ったが、現在はデフォルトで定義されているようです。とは言え確実のために明示的に定義しておく事にしました。
#define STRICT
//■参照資料「Windows Dev Center - Disabling STRICT」(https://msdn.microsoft.com/en-us/library/windows/desktop/aa383679(v=vs.85).aspx)
//│Disabling STRICT
//│To disable STRICT type checking, define the symbol name NO_STRICT.
//│In Visual C/C++, you can also specify this definition on the command line or in a makefile by specifying /DNO_STRICT as a compiler option.
//#define NO_STRICT
/*****************************************************************************
 *	
 *****************************************************************************/
#include <sys/types.h>
#include <sys/stat.h>
/*--------------------------------------------------------------------------*/
#include <ctype.h>
#include <errno.h>
#include <float.h>
#include <limits.h>
#include <math.h>
#include <stdarg.h>
#include <stddef.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <setjmp.h>
#include <assert.h>
#include <locale.h>
#include <search.h>
#include <signal.h>
#include <stdint.h>
/*--------------------------------------------------------------------------*/
#include <io.h>
#include <fcntl.h>
#include <conio.h>
#include <direct.h>
#include <malloc.h>
#include <process.h>
#include <mbctype.h>
#include <mbstring.h>
#include <tchar.h>	//_strnextc(),_strinc()等
/*--------------------------------------------------------------------------*/
#include <include/dirent.h>
#include <include/fnmatch.h>
#include <include/getopt.h>
#include <include/ucontext.h>
#include <include/error.h>
#include <include/libgen.h>
#include <include/unistd.h>
#include <include/syslog.h>
#include <include/glob.h>
#include <include/regexp.h>
/*--------------------------------------------------------------------------*/
//#define _CRTDBG_MAP_ALLOC		⇒Boehm GCとcrtdbg.hを併用する事はまず無いと思う。
#ifdef  _CRTDBG_MAP_ALLOC
#include <crtdbg.h>
#define DEBUG_INIT() do {								\
	_CrtSetReportMode(_CRT_WARN, _CRTDBG_MODE_FILE | _CRTDBG_MODE_DEBUG);		\
	_CrtSetReportFile(_CRT_WARN, _CRTDBG_FILE_STDERR);				\
	_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);
#endif//_CRTDBG_MAP_ALLOC
/*--------------------------------------------------------------------------*/
#include <winsock2.h>
#pragma comment(lib, "ws2_32.lib")
#include <windows.h>
#include <mmsystem.h>
#pragma comment(lib, "winmm.lib")
#include <vfw.h>
#pragma comment(lib, "vfw32.lib")
#ifdef  __cplusplus
#include <gdiplus.h>
#pragma comment(lib, "gdiplus.lib")
#endif//__cplusplus
/*--------------------------------------------------------------------------*/
#define YAML_DECLARE_STATIC
#include "yaml/yaml.h"
#pragma comment(lib, "yaml.lib")
/****************************************************************************
 *	
 ****************************************************************************/
#pragma warning(disable:4200)	//非標準の拡張機能が使用されています:構造体または共用体中にサイズが0の配列があります。	//これは.cppからインクルードした時に出る警告です。
#pragma warning(disable:4244)	//'...'から'...'への変換です。データが失われる可能性があります。
#pragma warning(disable:4267)	//'...'から'...'に変換しました。データが失われているかもしれません。
#pragma warning(disable:4838)	//'...'から'...'への変換には縮小変換が必要です
/*--------------------------------------------------------------------------*/
#include "clipstdw_x64.h"
#endif//__CLIP_STD_X64_H__
