//
// Prefix header for all source files of the 'X-BASIC_for_iOS' target in the 'X-BASIC_for_iOS' project
//

#import <Availability.h>

#ifndef __IPHONE_5_0
#warning "This project uses features only available in iOS SDK 5.0 and later."
#endif

#ifdef __OBJC__
#import <UIKit/UIKit.h>
#import <Foundation/Foundation.h>
// 以下は常時読み込みヘッダー
#import "NSString+drawiOS7.h"
#endif

// 条件コンパイル用定義
// Xcode4.6.2には-Dオプションが2つしか効かないというバグがいるので回避のため
// 現在はコンパイラのオプションで設定済みなのでここで扁壺する必要はない
//#define	COMPILE_MODE	1	// 1=Release , 2=Distribution , 0=Debug
//#define	DEBUG		// コンパイラオプションで指定

#if COMPILE_MODE!=2
	#ifdef DEBUG	// DEBUGでないときにCORE_DEBUGするとなぜかコンパイルが通らない
//		#define	CORE_DEBUG
//		#define	CORE_DEBUG2
	#endif	// DEBUG
//	#define	DMP_INTERNALCODE	// 中間コードをファイル出力する→/test
//	#define	INTERNAL_TRACE		// 中間コードの実行順をすべて出力する
//	#define	PRT_STACKED			// xbasicMain();XBinterpreter.mで再帰呼び出し深さを表示するかどうか
//	#define	CHECK_MALLOC		// mallocとfreeの対を調べるコードを生成する
//	#define	FUNC_DEBUG			// 外部関数のデバッグ時に関数名を追加する
#endif	// 本番時は無効

#define IOS		1	// iOS環境下

// ARMはシステムが使っているようなのでAARMに変更
#define	AARM	2
#define	SPDUP		// console高速描画

#define ENABLE_ZIP_IMPORT		// ZIPからのファイルインポートを有効にするかどうか

//----------------------------------------

#if LONG_MAX>INT_MAX
#define	ARM64	1	// 64bit環境用
#else
#define	ARM32	1	// 32bit環境用;32ビットソースを残すためにある
#endif


// 型名定義 ; 32/64bit共用(変化なし)
typedef	unsigned	char	UByte;	// 符号無し８ビット
//typedef	signed		char	SByte;	// 符号あり８ビット
typedef				char	SByte;	// 符号あり８ビット ; Objective-Cは"〜"はchar *であってsigned char *ではない(UByte *でもない)。なぜ？
typedef	unsigned	short	UWord;	// 符号無し16ビット
typedef	signed		short	SWord;	// 符号あり16ビット

#ifdef ARM32	// 32bit
typedef	unsigned	long	ULong;	// 符号無し32ビット
typedef	signed		long	SLong;	// 符号あり32ビット
#else	// 64bit
typedef	unsigned	int		ULong;	// 符号無し32ビット;int32_t;_int32_t.hの定義に従う
typedef	signed		int		SLong;	// 符号あり32ビット
#endif

typedef	unsigned	long long	ULLong;	// 符号無し64ビット
typedef	signed		long long	SLLong;	// 符号あり64ビット

// 型別サイズ
#define	SZ_LLONG	(sizeof(ULLong))	// 64bit
#define	SZ_LONG		(sizeof(ULong))
#define	SZ_WORD		(sizeof(UWord))
#define	SZ_CHAR		(sizeof(UByte))
#define	SZ_VOIDP	(sizeof(void *))	// 64bit


// 超基本定数定義
#define	BIT0	0x00000001
#define	BIT1	(BIT0<<1)
#define	BIT2	(BIT0<<2)
#define	BIT3	(BIT0<<3)
#define	BIT4	(BIT0<<4)
#define	BIT5	(BIT0<<5)
#define	BIT6	(BIT0<<6)
#define	BIT7	(BIT0<<7)
#define	BIT8	(BIT0<<8)
#define	BIT9	(BIT0<<9)
#define	BIT10	(BIT0<<10)
#define	BIT11	(BIT0<<11)
#define	BIT12	(BIT0<<12)
#define	BIT13	(BIT0<<13)
#define	BIT14	(BIT0<<14)
#define	BIT15	(BIT0<<15)
#define	BIT16	(BIT0<<16)
#define	BIT17	(BIT0<<17)
#define	BIT18	(BIT0<<18)
#define	BIT19	(BIT0<<19)
#define	BIT20	(BIT0<<20)
#define	BIT21	(BIT0<<21)
#define	BIT22	(BIT0<<22)
#define	BIT23	(BIT0<<23)
#define	BIT24	(BIT0<<24)
#define	BIT25	(BIT0<<25)
#define	BIT26	(BIT0<<26)
#define	BIT27	(BIT0<<27)
#define	BIT28	(BIT0<<28)
#define	BIT29	(BIT0<<29)
#define	BIT30	(BIT0<<30)
#define	BIT31	(BIT0<<31)

// 基本定数
#define	K		1024

// 文字コード
#define	LF		0x0a
#define	CR		0x0d
#define	TAB		0x09
#define	SPC		' '
#define	EOS		0x00
#define	EOT		0x1a	// EOFはstdio.hのファイル関数が使うので

// 文字定数
#define ZSPC		@"　" // 全角スペース

// 1タブの幅
#define TABWIDTH	4
#define	TABSTRING	@"    "	// その桁数の半角スペース

#define SEARCH_BAR_HEIGHT_IPAD	(44.0)	// 44.0はiPad用searchの高さ(固有)

// NSTimeIntervalでのなしの印
#define	None	(0.0)	// なし

#define	NSLocalStr(str)	NSLocalizedString(str,nil)

// エラー通知用辞書キー
#define	DIC_TITLE		@"title"
#define	DIC_MESSAGE		@"message"
#define	DIC_EXCEPTION	@"exception"

// テスト用フォルダ定義
// Lionからルートへの書き込みができなくなりデバッグ用writeToFileがアクセス権問題でエラーを発生するようになったので回避のため
// /testはユーザーが作り、アクセス権を与えておくこと
#define	CTESTDIR		"/Users/AIMAIx/Desktop/"
#define	TESTDIR			@CTESTDIR
#define	TestFile(file)	(TESTDIR file)
//
// ディレクトリ定義
#define	DIR_SYSTEM		@""					// システム内部
#define	DIR_DOCUMENTS	getDocumentsPath()	// iTunesとのやり取り用;FileControl2.hが必要

#define __file__	(strrchr(__FILE__,'/' ) + 1 )	// __FILE__からファイルのみ取り出したもの

// 超基本関数
#define degree2radian(deg)	(((deg)* M_PI)/180.0)	// 角度ｰ>ラジアン
#define radian2degree(rad)	(((rad)*180.0)/ M_PI)	// ラジアン->角度

// DEBUGのときのみnslog()等を有効にする定義
#if COMPILE_MODE==2 // Distributionの時は外す
	#define	printf(...)
	#define	nslog(...)
	#define	NSLog(...)
	#define	nslog1(...)
	#define	nslog2(...)
	#define	printSelfs(a,b)
	#define	printSelf()
	#define	printSelf2()
	#define printFile()
	#define	printFunc()
	#define	printFuncs(a,b)
	#define printFunc2()
#else // Distribution以外
	// ここは必要に応じて変更しても良い
	// 常時表示
	#define	printSelf2()	NSLog(@"%@:%@",NSStringFromClass([self class]),NSStringFromSelector(_cmd))
	#define printFunc2()	NSLog(@"%s:%s",__file__,__FUNCTION__)
	#define	nslog2			NSLog
	#ifdef DEBUG
		#define	nslog		NSLog
		#define	nslog1		NSLog	// 識別用
		// 自身のクラス名とメソッド名を表示する関数;メソッド内でしか使えない(関数内では利用不可)
		// 継承されているときは、親クラスの名前が出てしまうので注意
		#define	printSelfs(a,b)	NSLog(@"%@:%@/" a,NSStringFromClass([self class]),NSStringFromSelector(_cmd),(b))
		#define	printSelf()		NSLog(@"%@:%@",NSStringFromClass([self class]),NSStringFromSelector(_cmd))
		// なので、明確に実ファイルを表示する関数
		#define	printFile()		NSLog(@"%@(%d):%@",@(__FILE__),__LINE__,NSStringFromSelector(_cmd))
		#define	printFunc()		NSLog(@"%s",__FUNCTION__)
		#define	printFuncs(a,b)	NSLog(@"%s/" a,__FUNCTION__,(b))
	#else // Release
		#define	printf(...)
		#define	nslog(...)
		#define	nslog1(...)
		#define	printSelfs(a,b)
		#define	printSelf()
		#define printFile()
		#define	printFunc()
		#define	printFuncs(a,b)
	#endif
#endif
// distribute時もそのままのNSLog
#define	nslogA			NSLog
