//--------------------------------------------------------------------------------------
//
// X-BASIC'
//	外部関数：iOS用 Text Screen
//
//--------------------------------------------------------------------------------------
// 外部関数の構造を持っている

#import	"RunViewController.h"
#import "libs.h"
#include "XBiOSt.h"
#include "fdef.h"
#include "support.h"
#import	"FileControl2.h"
#import "rgbhsv.h"
#import "NSString+substringWithRange2.h"

#define	MAX_MENUES2	10	// メニュー最大数(selectMenu2)
#define	MAX_MENUES	5	// メニュー最大数(selectMenu/WithMessage)

//---------------------------------------------------------------------------------------------
// 共通ワーク

// これは内部で設定
static	tConsole2 *tconsole;
static	RunViewController *runView;

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

static RET_FUNC _F_version(SWord numFAC,FAC fac[])
// この外部関数のバージョンを返す
{
	printFunc();
	fac[0].dl.cp[LL]=VERSION_XBIOSFUNCT;
	fac[0].facType=FACTYPE_RETURN;
	return (RET_FUNC_OK); // OK
}

//---------------------------------------------------------------------------------------------
// 画面表示
//---------------------------------------------------------------------------------------------

RET_FUNC _F_locate(SWord numFAC,FAC fac[])
{
	printFunc();
	int x=(int)fac[0].dl.l[LL];
	int y=(int)fac[1].dl.l[LL];
	nslog(@"locate(%d,%d):%d",x,y,numFAC);
	//
	fac[0].dl.l[LL]=c2basicYESNO([tconsole locate:x y:y]);
	//
	fac[0].facType=FACTYPE_RETURN;
	return (RET_FUNC_OK); // OK
}

// int gLocate(x;int,y;int)
// width(0)でグラフィックモードにいるとき、
// グラフィックとテキストで座標が合わないので合わせるための関数
static RET_FUNC _F_gLocate(SWord numFAC,FAC fac[])
{
	printFunc();
	int x=(int)fac[0].dl.l[LL];
	int y=(int)fac[1].dl.l[LL];

	// 本当はこの方が良さそうなのだが合わないので下の式で固定
//	fac[0].dl.l[LL]=c2basicYESNO([tconsole locate:x*tconsole.bfontWx y:y*tconsole.bfontWy]);
	fac[0].dl.l[LL]=c2basicYESNO([tconsole locate:x*8 y:y*16]);
	fac[0].facType=FACTYPE_RETURN;
	return (RET_FUNC_OK); // OK
}

static RET_FUNC _F_textX2Gx(SWord numFAC,FAC fac[])
{
	printFunc();
	//
	int x=(int)fac[0].dl.l[LL];
	fac[0].dl.l[LL]=[tconsole textX2Gx:(CGFloat)x];
	fac[0].facType=FACTYPE_RETURN;
	return (RET_FUNC_OK); // OK
}

static RET_FUNC _F_textY2Gy(SWord numFAC,FAC fac[])
{
	printFunc();
	//
	int y=(int)fac[0].dl.l[LL];
	fac[0].dl.l[LL]=[tconsole textY2Gy:(CGFloat)y];
	fac[0].facType=FACTYPE_RETURN;
	return (RET_FUNC_OK); // OK
}

RET_FUNC _F_cls(SWord numFAC,FAC fac[])
{
	printFunc();
	//
	[tconsole cls];
	//
	fac[0].dl.l[LL]=0; // 念のため
	fac[0].facType=FACTYPE_RETURN;
	return (RET_FUNC_OK); // OK
}

static RET_FUNC _F_home(SWord numFAC,FAC fac[])
{
	printFunc();
	//
	[tconsole home];
	//
	fac[0].dl.l[LL]=0; // 念のため
	fac[0].facType=FACTYPE_RETURN;
	return (RET_FUNC_OK); // OK
}

static RET_FUNC _F_pos(SWord numFAC,FAC fac[])
{
	printFunc();
	//
	fac[0].dl.l[LL]=tconsole.tx;
	fac[0].facType=FACTYPE_RETURN;
	return (RET_FUNC_OK); // OK
}

static RET_FUNC _F_csrlin(SWord numFAC,FAC fac[])
{
	printFunc();
	//
	fac[0].dl.l[LL]=tconsole.ty;
	fac[0].facType=FACTYPE_RETURN;
	return (RET_FUNC_OK); // OK
}

static RET_FUNC _F_tab(SWord numFAC,FAC fac[])
{
	printFunc();
	int cnt=(int)fac[0].dl.l[LL];
	//
	[tconsole tab:cnt];
	//
	fac[0].dl.l[LL]=0; // 念のため
	fac[0].facType=FACTYPE_RETURN;
	return (RET_FUNC_OK); // OK
}

static RET_FUNC _F_cursorMove(SWord numFAC,FAC fac[])
{
	printFunc();
	int direc=(int)fac[0].dl.l[LL];
	int cnt=1;
	if (fac[1].facType!=VOID_PARAM) { // 引数が省略されていない時
		cnt=(int)fac[1].dl.l[LL];
	}
	if (cnt<0) cnt=1;
	DBG_printf2("cursorMove(%d,%d)\n",direc,cnt);
	//
	[tconsole cursorMove:direc cnt:cnt];
	//
	fac[0].dl.l[LL]=0; // 念のため
	fac[0].facType=FACTYPE_RETURN;
	return (RET_FUNC_OK); // OK
}

RET_FUNC _F_tColor(SWord numFAC,FAC fac[])
{
	printFunc();
	//
	int r,g,b,alpha;
	getRGBColorFromFac(fac,0,&r,&g,&b,&alpha); // v2.2
	[tconsole color:r g:g b:b alpha:alpha];
	//
	fac[0].dl.l[LL]=0; // 念のため
	fac[0].facType=FACTYPE_RETURN;
	return (RET_FUNC_OK); // OK
}

static RET_FUNC _F_tborder(SWord numFAC,FAC fac[])
{
	printFunc();
	//
	int i=0;
	CGFloat width=fac[i++].dl.d;
	if (width>0) {
		int r,g,b,alpha;
		getRGBColorFromFac(fac,i,&r,&g,&b,&alpha); // v2.2
		[tconsole border:width r:r g:g b:b alpha:alpha];
	} // width<=0の時は何もしない
	//
	fac[0].dl.l[LL]=0; // 念のため
	fac[0].facType=FACTYPE_RETURN;
	return (RET_FUNC_OK); // OK
}

RET_FUNC _F_atrb(SWord numFAC,FAC fac[])
{
	printFunc();
	//
	[tconsole atrb:fac[0].dl.l[LL]];
	//
	fac[0].dl.l[LL]=0; // 念のため
	fac[0].facType=FACTYPE_RETURN;
	return (RET_FUNC_OK); // OK
}

static RET_FUNC _F_width(SWord numFAC,FAC fac[])
{
	printFunc();
	//
	int i=0;
	int wx=(int)fac[i++].dl.l[LL];
	int wy=0;
	
	if (fac[i].facType!=VOID_PARAM) { // 引数が省略されていない時
		wy=(int)fac[i].dl.l[LL];
	}
	i++;
	nslog(@"wx=%d,wy=%d",wx,wy);
	
	int *fzenhan=NULL;
	if (fac[i].facType!=VOID_PARAM) { // 引数が省略されていない時
		fzenhan=fac[i].dl.ip[LL];
	}
	i++;

	// v3.00
	int fdescender=NO;
	if (fac[i].facType!=VOID_PARAM) { // 引数が省略されていない時
		fdescender=basic2cYESNO(fac[i].dl.l[LL]);
	}
	i++;
	tconsole.fdescender=fdescender;
	nslog(@"fdescender=%d",fdescender);
	
	// v3.20
	NSString *baseCharacter=nil; // 標準設定の印
	int baseMode=0;
	if (fac[i].facType!=VOID_PARAM) { // 引数が省略されていない時
		baseMode=fac[i].dl.l[LL];
		switch (baseMode) {
			case 1:
				baseCharacter=@"🐓";
				break;
			case 2:
				baseCharacter=@"Ｗ";
				break;
			case 3:
				baseCharacter=@"ｇ";
			default:// その他は標準設定を使う
				break;
		}
		nslog(@"baseCharacter(%d)=%@",baseMode,baseCharacter);
	}
	i++;

	if (fac[i].facType!=VOID_PARAM) { // 引数が省略されていない時
		baseCharacter=@(fac[i].dl.cp[LL]);
		nslog(@"baseCharacter=%@",baseCharacter);
		if ([baseCharacter length]==0) baseCharacter=nil; // ""のときは標準
		else {
			baseCharacter=[baseCharacter substringWithRange2:NSMakeRange(0, 1)];
			nslog(@"baseCharacter1=%@",baseCharacter);
		}
	}
	tconsole.baseCharacter=baseCharacter;	// 幅計算基本文字
	//
	fac[0].dl.l[LL]=(ULong)[tconsole width:wx wy:wy];
	if (fzenhan!=NULL) {
		*fzenhan=c2basicYESNO(tconsole.fzenhan);
	}
	fac[0].facType=FACTYPE_RETURN;
	return (RET_FUNC_OK); // OK
}

static RET_FUNC _F_getWidth(SWord numFAC,FAC fac[])
{
	printFunc();
	//
	int i=0;
	int wx0;
	int *wx=NULL;
	if (fac[i].facType!=VOID_PARAM) { // 引数が省略されていない時
		wx=fac[i].dl.ip[LL];
		nslog(@"&wx=%p",wx);
	} else {
		// 省略時はダミーの領域を与える
		wx=&wx0;
	}
	i++;
	
	int *wy=NULL;
	if (fac[i].facType!=VOID_PARAM) { // 引数が省略されていない時
		wy=fac[i].dl.ip[LL];
		nslog(@"&wy=%p",wy);
	}
	i++;
	
	int *fzenhan=NULL;
	if (fac[i].facType!=VOID_PARAM) { // 引数が省略されていない時
		fzenhan=fac[i].dl.ip[LL];
	}
	//
	i++;
	
	double *fntWx=NULL;
	if (fac[i].facType!=VOID_PARAM) { // 引数が省略されていない時
		fntWx=fac[i].dl.dp[LL];
		nslog(@"&fntWx=%p",fntWx);
	}
	i++;
	
	double *fntWy=NULL;
	if (fac[i].facType!=VOID_PARAM) { // 引数が省略されていない時
		fntWy=fac[i].dl.dp[LL];
		nslog(@"&fntWy=%p",fntWy);
	}
	
	//
	int ret;
	*wx=(int)tconsole.widthx;
	if (*wx==0) { // グラフィック座標モード
		nslog(@"グラフィック座標モード");
		ret=BASIC_YES; // グラフィック座標モードの印
		CGSize size=[tconsole getScreenSize];
		*wx=(int)size.width;
		if (wy!=NULL) *wy=(int)size.height;
	} else { // テキスト座標モード
		nslog(@"テキスト座標モード");
		ret=BASIC_NO; // テキスト座標モードの印
		if (wy!=NULL) *wy=(int)tconsole.widthy;
	}
	if (fzenhan!=NULL) {
		*fzenhan=c2basicYESNO(tconsole.fzenhan);
	}
	// v2.1
	if (fntWx!=NULL) {
#if AARM>=2
		storeDoubleToDoublePointer(fntWx,tconsole.fontWx);
#else
		*fntWx=tconsole.fontWx;
#endif
	}
	if (fntWy!=NULL) {
#if AARM>=2
		storeDoubleToDoublePointer(fntWy,tconsole.fontWy);
#else
		*fntWy=tconsole.fontWy;
#endif
	}
	//
	nslog(@"wx=%d,wy=%d,ret=%d",*wx,*wy,ret);
	fac[0].dl.l[LL]=ret;
	fac[0].facType=FACTYPE_RETURN;
	return (RET_FUNC_OK); // OK
}

RET_FUNC _F_isLandscape(SWord numFAC,FAC fac[])
{
	printFunc();

	BOOL fdetail=NO;
	if (fac[0].facType!=VOID_PARAM) { // 引数が省略されていない時
		fdetail=basic2cYESNO(fac[0].dl.l[LL]);
	}
	if (fdetail) {
		// 上下左右
		fac[0].dl.l[LL]=[UIDevice currentDevice].orientation;
	} else {
		// 縦横のみ
		CGSize size=[tconsole getScreenSize];
		fac[0].dl.l[LL]=c2basicYESNO((size.width>size.height)); // 横のほうが広い時は横画面
	}
	fac[0].facType=FACTYPE_RETURN;
	return (RET_FUNC_OK); // OK
}

void _F_tBackgroundAlphaSub(double alpha)
{
	[tconsole alpha:alpha];
}

static RET_FUNC _F_tBackgroundAlpha(SWord numFAC,FAC fac[])
{
	printFunc();
	//
	_F_tBackgroundAlphaSub(fac[0].dl.d);
	//
	fac[0].dl.l[LL]=0; // 念のため
	fac[0].facType=FACTYPE_RETURN;
	return (RET_FUNC_OK); // OK
}

static RET_FUNC _F_tBackgroundColor(SWord numFAC,FAC fac[])
{
	printFunc();
	//
	int r,g,b,alpha;
	getRGBColorFromFac(fac,0,&r,&g,&b,&alpha); // v2.2
	[tconsole backgroundColor:r g:g b:b alpha:alpha];
	//
	fac[0].dl.l[LL]=0; // 念のため
	fac[0].facType=FACTYPE_RETURN;
	return (RET_FUNC_OK); // OK
}

static RET_FUNC _F_font(SWord numFAC,FAC fac[])
{
	printFunc();
	@autoreleasepool {
		NSString *fontName = @(bstrWithUTF8(fac[0].dl.bp[LL])); // UTF8化
		CGFloat pointSize=tconsole.pointSize0; // 省略時
		if (fac[1].facType!=VOID_PARAM) { // 引数が省略されていない時
			pointSize=fac[1].dl.d;
		}
		nslog(@"フォント名=%@",fontName);
		[tconsole font:fontName pointSize:pointSize];
		fac[0].dl.l[LL]=0; // 念のため
		fac[0].facType=FACTYPE_RETURN;
		//
		return (RET_FUNC_OK);
	}
}

// float fontSize(message;str,fontName;str,pointSize;float[,wy;float])
// wy=縦幅 , リターン値=横幅
RET_FUNC _F_fontSize(SWord numFAC,FAC fac[])
{
	printFunc();
	@autoreleasepool {
		int i=0;
		NSString *message  = @(bstrWithUTF8(fac[i].dl.bp[LL])); // UTF8化
		i++;
		NSString *fontName = @(bstrWithUTF8(fac[i].dl.bp[LL])); // UTF8化
		i++;
		CGFloat pointSize=fac[i++].dl.d;
		nslog(@"message=%@,fontName=%@,pointSize=%f",message,fontName,pointSize);
		//
		double *fntWy=NULL;
		if (fac[i].facType!=VOID_PARAM) { // 引数が省略されていない時
			fntWy=fac[i].dl.dp[LL];
			nslog(@"&fntWy=%p",fntWy);
		}
		
		CGFloat fontWy;
		fac[0].dl.d=[tconsole fontSize:message fontName:fontName pointSize:pointSize fontWy:&fontWy];
		if (fntWy!=NULL) {
#if AARM>=2
			storeDoubleToDoublePointer(fntWy,(double)fontWy);
#else
			*fntWy=(double)fontWy;
#endif
		}
		fac[0].facType=FACTYPE_RETURN;
		//
		return (RET_FUNC_OK);
	}
}

// 本体のprintと区別するためprints
static RET_FUNC _F_prints(SWord numFAC,FAC fac[])
{
	printFunc();
	//
	fac[0].dl.l[LL]=c2basicYESNO(prints(strWithUTF8(fac[0].dl.bp[LL]))); // UTF8化
	fac[0].facType=FACTYPE_RETURN;
	return (RET_FUNC_OK); // OK
}

static RET_FUNC _F_printCtrlCode(SWord numFAC,FAC fac[])
{
	printFunc();
	//
	BOOL ret=[tconsole printCtrlCode:(unichar)fac[0].dl.l[LL]];
	fac[0].dl.l[LL]=c2basicYESNO(ret);
	//
	fac[0].facType=FACTYPE_RETURN;
	return (RET_FUNC_OK); // OK
}

//----tconsole2.input

UByte *input(int keyType)
{
	printFuncs(@"%d",keyType);
	[tconsole input:@"" keyType:keyType]; // デフォルト入力は使わない
	NSString *str=[tconsole waitUntilInputEnd]; // 入力終了待ち
	nslog(@"input=%@",str);
	return unsStringTocString(str);
}

// 本体のinputと違い、初期入力を設定できる
// UTF8専用
static RET_FUNC _F_inputWithPlaceholder(SWord numFAC,FAC fac[])
{
	printFunc();
	@autoreleasepool {
	//
		int i=0;
		NSString *defInput	  = uCstringToNSString(fac[i++].dl.bp[LL]);
		NSString *placefolder =@"";
		if (fac[i].facType!=VOID_PARAM) { // 引数が省略されていない時
			placefolder = uCstringToNSString(fac[i].dl.bp[LL]);
		}
		i++;
		nslog(@"placeholder=%@,defInput=%@",placefolder,defInput);

		int keyType=UIKeyboardTypeDefault;
		if (fac[i].facType!=VOID_PARAM) { // 引数が省略されていない時
			keyType=(int)fac[i].dl.l[LL];
		}
		
		[tconsole input:defInput keyType:keyType placefolder:placefolder];
		NSString *str=[tconsole waitUntilInputEnd]; // 入力終了待ち
		nslog(@"input=%@",str);
		fac[0].dl.bp[LL]=unsStringTocString(str);
		fac[0].facType=FACTYPE_RETURN;
		return (RET_FUNC_OK);
	} // OK
}

//----tconsole2.selectMenu

// UTF8専用
// mode:0=selectMenu/1=selectMenu2/2=selectMenuWithMessage
static RET_FUNC selectMenuSub(SWord numFAC,FAC fac[],int mode)
{
	printFunc();
	nslog(@"(mode=$%x):numFAC=%d",mode,numFAC);
	
	RET_FUNC ret;
	@autoreleasepool {
	//
		int i=0;
		NSString *title   = uCstringToNSString(fac[i++].dl.bp[LL]);
		NSString *message = nil; // nilはコンパイラ警告回避のため
		if (mode==2) {
				  message = uCstringToNSString(fac[i++].dl.bp[LL]);
		}
		SWord size1;
		uwYouso youso;
		// 文字列型配列のアクセスし方
		char *strs=(char *)getDim1FromFAC(fac,i++,&size1,&youso); // fac[i]から;文字列は[operationStatus.sz_str]毎、固定サイズで並んでいる
		if (strs==NULL) { // 1次元でない
			// エラー
			ret=RET_FUNC_ERR;
		} else {
			int cnt=0; // 省略時は要素数に従う
			if (fac[i].facType!=VOID_PARAM) { // 引数が省略されていない時
				cnt = (int)fac[i].dl.l[LL]; // v2.1
			}
			i++;

			// 画面外タッチを無効にするかどうか v3.20
			BOOL fdisableBreak=YES;
			if (fac[i].facType!=VOID_PARAM) { // 引数が省略されていない時
				fdisableBreak = basic2cYESNO(fac[i].dl.l[LL]); // v3.2
			}
			
			// yousoは配列の宣言による大きさを返すので、実際に要素内容が入れられているかどうかは別途調べる必要がある
			nslog(@"title=%@/youso=%d/size1=%d",title,youso,size1);
			if (cnt>0) youso=cnt; // v2.1
			switch (mode) {
				case 0: // selectMenu
				case 2: // selectMenuWithMessage
					if (youso>=MAX_MENUES ) youso=MAX_MENUES;
					break;
				case 1: // selectMenu2
					if (youso>=MAX_MENUES2) youso=MAX_MENUES2;
					break;
			}
			nslog(@" → youso=%d",youso);
			NSMutableArray *menues=[[NSMutableArray alloc]init];
			int i;
			for (i=0;i<youso;i++) {
				nslog(@"[%d]=%@",i,@(strs)); // @(char *)=CstringToNSString();こうしないと日本語が表示できないので
				if (*strs==EOS) {
					nslog(@"i=%d skip",i);
					continue;
				}
				[menues addObject:uCstringToNSString(strs)];
				strs+=operationStatus.sz_str; // 次の文字列先頭へ
			}
			nslog(@"menues=%@(count=%d)",menues,(int)[menues count]);
			//
			do { // v3.20
				switch (mode) {
					case 1:
						[tconsole selectMenu2:title menu:menues];
						break;
					case 2:
						[tconsole selectMenu:title menu:menues message:message];
						break;
					case 0:
						[tconsole selectMenu:title menu:menues];
						break;
				}
				//
				[tconsole waitUntilSelectEnd]; // selectMenu2も終了待ちはwaitUntilSelectEnd
				nslog(@"selectNo=%d",(int)tconsole.selectNo);
				if (!fdisableBreak) break; // 画面外タッチが有効の時
			} while (tconsole.selectNo==-1); // v3.20;ただしループを回るのはselectMenu2()のみ
			
			fac[0].dl.l[LL]=(ULong)tconsole.selectNo;
			fac[0].facType=FACTYPE_RETURN;
			ret=RET_FUNC_OK;
		}
		return (ret);
	} // OK
}

// 以下UTF8専用
static RET_FUNC _F_selectMenu(SWord numFAC,FAC fac[])
{
	printFunc();
	return (selectMenuSub(numFAC,fac,0));
}

static RET_FUNC _F_selectMenu2(SWord numFAC,FAC fac[])
{
	printFunc();
	return (selectMenuSub(numFAC,fac,1));
}

static RET_FUNC _F_selectMenuWithMessage(SWord numFAC,FAC fac[])
{
	printFunc();
	return (selectMenuSub(numFAC,fac,2));
}

//---------------------------------------------------------------------------------------------
// メイル処理

// void emailSend(subject;str,body;str[,attachment;文字列1次元配列[,cnt;int][,zipfname;str]]
static RET_FUNC _F_emailSend(SWord numFAC,FAC fac[])
{
	printFunc();
	RET_FUNC ret;
	
	@autoreleasepool {
	// ARCにすると変数宣言をまたいでgotoできなくなるので、スコープ内で使う変数の宣言を先頭で行う必要がある。
	NSMutableArray *pathlist;
	// 引数取得
	int i=0;
	NSString *subject=[@(bstrWithUTF8no(fac[i].dl.bp[LL],0))copy]; // UTF8化;copyするのでワークは他で使ってもok
	i++;
	NSString *body	 =[@(bstrWithUTF8no(fac[i].dl.bp[LL],0))copy]; // UTF8化;copyするのでワークは他で使ってもok
	i++;
	//
	NSString *zipfname=nil; // zip圧縮なし
	uwYouso youso=0; // 添付なしの印(1)
	UByte *bp;
	if (fac[i].facType!=VOID_PARAM) { // 引数が省略されていない時
		SWord size1;
		bp=(UByte *)getDim1FromFAC(fac,i,&size1,&youso);
		if (bp==NULL) { // 1次元でない
			ret= RET_FUNC_ERR;
			goto EMAIL_END;
		}
		i++;
		
		if (fac[i].facType!=VOID_PARAM) { // 引数が省略されていない時
			int cnt=(int)fac[i].dl.l[LL];
			if (cnt<youso) youso=cnt; // 要素数より小さな値を指定された時のみ、ファイル名配列のうち、先頭のその分だけ使う
		}
		i++;
		
		if (fac[i].facType!=VOID_PARAM) { // 引数が省略されていない時
			zipfname=@(bstrWithUTF8no(fac[i].dl.bp[LL],1)); // UTF8化
		}
	} // 添付ファイルがないときは当然zip圧縮も出来ない

	//NSMutableArray *
	pathlist=nil; // 添付がない印(2)
	if (youso>0) {
		// C文字列→NSString変換＋フルパス名化しながらNSMutableArrayに格納
		pathlist=[[NSMutableArray alloc]init];
		for (i=0;i<youso;i++) {
			if (*bp!=EOS) {
				// ファイル名内容があるときのみ
				[pathlist addObject:makeFullPathForSaveData(@(bstrWithUTF8no(bp,0)))];
			}
			bp+=operationStatus.sz_str;
		}
		nslog(@"pathList=%@",pathlist);
	}
	[runView.mail eMailSendInMainThread:subject body:body attachment:pathlist zip:zipfname];
	fac[0].dl.l[LL]=0; // 念のため
	fac[0].facType=FACTYPE_RETURN;
	ret=RET_FUNC_OK;
EMAIL_END:;
	//
	}
	return (ret);
}

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

// 外部から使うウエイト関数(待ち付き)
void waitSub(NSTimeInterval tm)
{
	nslog(@"tconsole=%@",tconsole);
	[tconsole waitTime:tm fwait:YES];
}

RET_FUNC _F_wait(SWord numFAC,FAC fac[])
{
	printFunc();
	int i=0;
	double tm=fac[i++].dl.d;
	if (tm>0.0) { // 終了判定ではない時
		if (tm<0)    tm=0.1;	// 負号カット
		if (tm>=120) tm=120.0;	// 上限

		BOOL fwait=YES; // 省略時は待つ
		if (fac[i].facType!=VOID_PARAM) { // 引数が省略されていない時
			fwait=basic2cYESNO(fac[i].dl.l[LL]);
		}
		nslog(@"wait(%f) fwait=%d",tm,fwait);
		//
		if (![tconsole waitTime:tm fwait:fwait]) {
			// まだ前のウエイトが終わってなかった
			fac[0].dl.l[LL]=NO;
			fac[0].facType=FACTYPE_RETURN;
			return (RET_FUNC_OK); // OK
		}
		//
	} else {
		// tm<=0.0 : 先のwait(tm,NO)の終了を判定する	v2.4
		nslog(@"先のwait()の終了を判定:%f",tm);
	}
	fac[0].dl.l[LL]=c2basicYESNO(tconsole.ftimeWaitDone);
	fac[0].facType=FACTYPE_RETURN;
	return (RET_FUNC_OK); // OK
}

static RET_FUNC _F_setUpScroll(SWord numFAC,FAC fac[])
{
	printFunc();
	int flag=basic2cYESNO(fac[0].dl.l[LL]);
	//
	tconsole.fUpScroll=flag;
	//
	fac[0].dl.l[LL]=0; // 念のため
	fac[0].facType=FACTYPE_RETURN;
	return (RET_FUNC_OK); // OK
}

//---------------------------------------------------------------------------------------------
// v3.2

// logoAlert([title;str][,message;str])
static RET_FUNC _F_logoAlert(SWord numFAC,FAC fac[])
{
	printFunc();
	//
	NSString *title=nil;
	if (fac[0].facType!=VOID_PARAM) { // 引数が省略されていない時
		title=@(bstrWithUTF8(fac[0].dl.bp[LL]));
	}
	NSString *message=nil;
	if (fac[1].facType!=VOID_PARAM) { // 引数が省略されていない時
		message=@(bstrWithUTF8(fac[1].dl.bp[LL]));
	}
	nslog(@"title=%@/message=%@",title,message);
	[runView setLogoAlert:title message:message];
	//
	fac[0].dl.l[LL]=0; // 念のため
	fac[0].facType=FACTYPE_RETURN;
	return (RET_FUNC_OK); // OK
}

//---------------------------------------------------------------------------------------------
// インフォメーションテーブル (5.2.1章)
//---------------------------------------------------------------------------------------------

// 関数名テーブル(トークンテーブル)
static const char *iOSTTokens[]={
	"locate",
	"gLocate",
	"textX2Gx",
	"textY2Gy",
	"cls",
	"home",
	"pos",
	"csrlin",
	"tab",
	"cursorMove",
	"tcolor",
	"tColor",	// v2.1
	"tatrb",
	"tAtrb",	// v2.1
	"width",
	"getWidth",
	"isLandscape",	// v3.20
	"tBackgroundAlpha",
	"tBackgroundColor",	// v2.2
	"font",
	"fontSize",	// v3.20
	"prints",
	"printCtrlCode",
	"tborder",
	"tBorder",	// v2.1
	// tConsole2
	"inputWithPlaceholder",
	"selectMenu",
	"selectMenuWithMessage",
	"selectMenu2",
	"emailSend",
	"wait",
	"setUpScroll",
	// RunView
	"logoAlert",		// v3.20
	// バージョン
	"versionXBiOSTextScreenFunc$",
	// end of table
	NULL,
};

// 実行アドレステーブル
static FUNC_EXEC iOSTFuncExec[]={
	// Cの標準関数名と重複させないよう_F_を付ける
	// tConsole
	{_F_locate	},
	{_F_gLocate	},
	{_F_textX2Gx},
	{_F_textY2Gy},
	{_F_cls		},
	{_F_home	},
	{_F_pos		},
	{_F_csrlin	},
	{_F_tab		},
	{_F_cursorMove	},
	{_F_tColor	},
	{_F_tColor	},
	{_F_atrb	},
	{_F_atrb	},
	{_F_width	},
	{_F_getWidth},
	{_F_isLandscape},		// v3.20
	{_F_tBackgroundAlpha},
	{_F_tBackgroundColor},	// v2.2
	{_F_font	},
	{_F_fontSize},
	{_F_prints	},
	{_F_printCtrlCode},
	{_F_tborder	},
	{_F_tborder	},
	// tConsole2
	{_F_inputWithPlaceholder},
	{_F_selectMenu},
	{_F_selectMenuWithMessage},
	{_F_selectMenu2},
	{_F_emailSend},
	{_F_wait},
	{_F_setUpScroll},
	// RunView
	{_F_logoAlert},			// v3.20
	// バージョン
	{_F_version},
	// end of table
	{NULL},
};

//------------------------------
// パラメーターテーブル
// (1)種類別定義
// 1関数の引数は最大MAX_PARAM個

static const uwPARAMTYPE p_locate[]={
	INT_VAL,
	INT_VAL,
	INT_RET,	// v2.2
};
#define p_gLocate	p_locate

static const uwPARAMTYPE p_textX2Gx[]={
	INT_VAL,
	INT_RET,
};
#define p_textY2Gy p_textX2Gx

static const uwPARAMTYPE p_cls[]={
	VOID_RET,
};
#define	p_home	p_cls

static const uwPARAMTYPE p_pos[]={
	INT_RET,
};
#define	p_csrlin		p_pos

static const uwPARAMTYPE p_isLandscape[]={
	INT_OMT,
	INT_RET,
};

static const uwPARAMTYPE p_tab[]={
	INT_VAL,
	VOID_RET,
};
#define p_tatrb			p_tab
#define	p_setUpScroll	p_tab

static const uwPARAMTYPE p_cursorMove[]={
	INT_VAL,
	INT_OMT,	// V3.00	INT_VAL,
	VOID_RET,
};

static const uwPARAMTYPE p_tcolor[]={
	INT_VAL,
	INT_OMT,
	INT_OMT,
	INT_OMT,
	VOID_RET,
};

static const uwPARAMTYPE p_tborder[]={
	FLOAT_VAL,
	INT_VAL,
	INT_OMT,
	INT_OMT,
	INT_OMT,
	VOID_RET,
};

static const uwPARAMTYPE p_width[]={
	INT_VAL,
	INT_OMT,
	INT_VP|PARAM_OMIT,
	INT_OMT,	// v3.00
	INT_OMT,	// v3.20
	STR_OMT,	// V3.20
	INT_RET,
};

static const uwPARAMTYPE p_getWidth[]={
	INT_VP|PARAM_OMIT,		// v2.2
	INT_VP|PARAM_OMIT,
	INT_VP|PARAM_OMIT,
	FLOAT_VP|PARAM_OMIT,	// v2.1
	FLOAT_VP|PARAM_OMIT,	// v2.1
	INT_RET,
};

static const uwPARAMTYPE p_tBackgroundAlpha[]={
	FLOAT_VAL,
	VOID_RET,
};

static const uwPARAMTYPE p_wait[]={
	FLOAT_VAL,
	INT_OMT,	// v2.4
	INT_RET,	// v2.4
};

static const uwPARAMTYPE p_tBackgroundColor[]={ // v2.2
	INT_VAL,
	INT_OMT,
	INT_OMT,
	INT_OMT,
	VOID_RET,
};

static const uwPARAMTYPE p_font[]={
	STR_VAL,
	FLOAT_OMT,
	VOID_RET,
};

static const uwPARAMTYPE p_fontSize[]={ // v3.20
	STR_VAL,
	STR_VAL,
	FLOAT_VAL,
	FLOAT_VP|PARAM_OMIT,
	FLOAT_RET,
};

static const uwPARAMTYPE p_prints[]={
	STR_VAL,
	INT_RET,	// v2.2
};

static const uwPARAMTYPE p_printCtrlCode[]={
	INT_VAL,
	INT_RET,
};

static const uwPARAMTYPE p_inputWithPlaceholder[]={
	STR_VAL,
	STR_OMT,
	INT_OMT,
	STR_RET,
};

static const uwPARAMTYPE p_selectMenu[]={
	STR_VAL,
	ARRAY1_STR,
	INT_OMT,	// v2.1
	INT_OMT,	// v3.2
	INT_RET,
};
#define p_selectMenu2	p_selectMenu

static const uwPARAMTYPE p_selectMenuWithMessage[]={
	STR_VAL,
	STR_VAL,
	ARRAY1_STR,
	INT_OMT,	// v2.1
	INT_OMT,	// v3.2
	INT_RET,
};

static const uwPARAMTYPE p_emailSend[]={
	STR_VAL,
	STR_VAL,
	ARRAY1_STR|PARAM_OMIT,
	INT_OMT,
	STR_OMT,
	VOID_RET,
};

static const uwPARAMTYPE p_logoAlert[]={
	STR_OMT,
	STR_OMT,
	VOID_RET,
};

static const uwPARAMTYPE p_version[]={
	STR_RET,
};

//------------------------------
// パラメーターテーブル
// (2)関数別定義

static
const
uwPARAMTYPE *iOSTParams[]={
	p_locate	,
	p_gLocate	,
	p_textX2Gx	,
	p_textY2Gy	,
	p_cls		,
	p_home		,
	p_pos		,
	p_csrlin	,
	p_tab		,
	p_cursorMove,
	p_tcolor	,
	p_tcolor	,
	p_tatrb		,
	p_tatrb		,
	p_width		,
	p_getWidth	,
	p_isLandscape,
	p_tBackgroundAlpha	,
	p_tBackgroundColor	,
	p_font		,
	p_fontSize	,
	p_prints	,
	p_printCtrlCode,
	p_tborder	,
	p_tborder	,
	// tConsole2
	p_inputWithPlaceholder,
	p_selectMenu,
	p_selectMenuWithMessage,
	p_selectMenu2,
	p_emailSend,
	p_wait,
	p_setUpScroll,
	// RunView
	p_logoAlert,
	// バージョン
	p_version	,
	// end of table
	NULL,
};

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

// この中の関数の初期化処理
static void _Frun(void)
{
	printFunc();

	runView=xb_getRunView();
	//
	[runView disableRotate:YES]; // RUN直後は画面回転禁止(RUN方向の画面で固定)
	[runView vpriority:SCONSOLE p1:TCONSOLE p2:GCONSOLE0 p3:GCONSOLE1 p4:GCONSOLE2 p5:GCONSOLE3];
	[runView vpage:TCONSOLE onoff:YES];
	[runView vpage:SCONSOLE onoff:NO ]; // デフォルトはスプライトOFF
	
	tconsole=[runView getConsole:TCONSOLE];
	tconsole.fOlder=operationStatus.fOlder; // 旧表示互換を設定
	[tconsole start]; // RUN時画面はここに来る直前に固定されるので、ここで呼び出す必要がある
	
	// 標準のテキスト画面幅を設定
	int wxPortrait,wxLandscape;
	switch (getDeviceType()) {
		case DEVICE_IPAD:
		case DEVICE_IPAD_SIMULATOR:
			wxPortrait =64;
			wxLandscape=96;
			break;
		default: // とりあえずDEVICE_UNKNOWNはここにしておく(シミュレーター以外では来たらおかしい)
		case DEVICE_IPODTOUCH:
		case DEVICE_IPHONE:
		case DEVICE_IPHONE_SIMURATOR:
			wxPortrait =24;
			wxLandscape=48;
			break;
	}
	int wx;
	switch (getOrientation()) {
		default: // シミュレーターではunknownになるので
		case UIOrientationPortrait:
		case UIOrientationPortraitUpsideDown:
			wx=wxPortrait;
			break;
		case UIOrientationLandscapeLeft:
		case UIOrientationLandscapeRight:
			wx=wxLandscape;
			break;
	}
	// デフォルトはテキスト座標モード
	[tconsole font:DEFFONT pointSize:12]; // サイズはwidthで調整されるので適当
	nslog(@"デフォルトwidth.x=%d",wx);
	[tconsole width:wx wy:0]; // wyは自動設定
	[tconsole cls];
	[tconsole atrb:ATRB_NORMAL];
	[tconsole color:-THWHITE g:0 b:0 alpha:255];
#if 0	// consoleに移動
	[tconsole alpha:1.0];
	[tconsole border:0 r:0 g:0 b:0 alpha:0]; // ボーダーなし
#endif
	// 初期化時にちょっとウエイトしておく
	// なぜか初回wait()が短くなるので、それを防ぐため
	[tconsole waitTime:0.1 fwait:YES];
}

// この中の関数の終了処理
static void _Fend(void)
{
	printFunc();
	[tconsole end];
}

// インフォメーションテーブル
const
INFORMATION_TABLE	InfoIosTFuncs={
	#ifdef FUNC_DEBUG
	"iOS Text Screen functions",
	#endif
	returnOnly,	// Finit
	_Frun,		// Frun
	_Fend,		// Fend
	returnOnly,	// Fexit
	returnOnly,	// Fbreak
	NULL,		// FctrlD;未使用
	NULL,		// 予約1
	NULL,		// 予約2
	//
	iOSTTokens,
	iOSTParams,
	iOSTFuncExec
};

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