プログラミング工房 > HSP > サンプルモジュール > 標準入出力関連モジュール >

/***********************************************************

	標準入出力関連モジュール(hsp3cl用)

		【2005/11/16 更新】

	命令・関数一覧

	#defcfunc is_stdin_redirected
		機能:		標準入力がリダイレクトされているかチェック
		戻り値:	1(Yes) or 0(No)
		用途:		標準入力からデータを受け取る際のinput命令
					のp3を決める基準にする。戻り値が1であれば
					キーボード以外にリダイレクトされている。
					(input ?,?,0 要実行の可能性あり)

	#defcfunc is_stdout_redirected
		機能:		標準出力がリダイレクトされているかチェック
		戻り値:	1(Yes) or 0(No)

	#deffunc input2 var p1
		機能:		標準入力からサイズの制限なくデータを取得する
		用途:		標準のinputだとデータサイズが大きいときに
					システムエラーで強制終了することがあるので
					input ?,?,0 の代わりに使う。

	#deffunc mes2 var p1
		機能:		指定された文字列を改行コードを付加せずに
					標準出力に出力
		用途:		出力時に末尾に改行コードが付加されるmes
					命令では不都合な時に使う。
					p1に含まれる改行コードがCRLF(0x0d 0x0a)の
					場合のみ有効。

	#defcfunc get_hstdin
		機能:		標準入力ハンドルを取得
		戻り値:	ハンドル(整数)

	#defcfunc get_hstdout
		機能:		標準出力ハンドルを取得
		戻り値:	ハンドル(整数)

	#defcfunc get_hstderr
		機能:		標準エラーハンドルを取得
		戻り値:	ハンドル(整数)

***********************************************************/
#module stdio

#const	TRUE	1
#const	FALSE	0

#uselib	"kernel32.dll"
#func	GetStdHandle "GetStdHandle" sptr
#const	STD_INPUT_HANDLE	-10
#const	STD_OUTPUT_HANDLE	-11
#const	STD_ERROR_HANDLE	-12

#uselib	"msvcrt.dll"
#cfunc	isatty	"_isatty" int
#func	putchar	"putchar" int
#cfunc	getchar	"getchar"
#const	EOF		-1

/**********************************************************/
// 標準入力がリダイレクトされているかチェック
/**********************************************************/
#defcfunc is_stdin_redirected
	if isatty(0) {
		return FALSE
	}
	return TRUE

/**********************************************************/
// 標準出力がリダイレクトされているかチェック
/**********************************************************/
#defcfunc is_stdout_redirected
	if isatty(1) {
		return FALSE
	}
	return TRUE

/**********************************************************/
// 標準入力からサイズの制限なくデータを取得する
/**********************************************************/
#deffunc input2 var p1
	p1 = ""
	char = " "				// 2バイト目を確実に0にする
	repeat
		byte = getchar()
		if (byte=EOF)|(byte=0) {
			break
		}
		else {
			poke char,0,byte
			p1 += char
		}
	loop
	return

/**********************************************************/
// 指定された文字列を改行コードを付加せずに標準出力に出力
/**********************************************************/
#deffunc mes2 var p1
	if strmid(p1,strlen(p1)-2,2)="\n" {	// 文字列の末尾が改行コード(CRLF)
		flag = TRUE
	}
	else {
		flag = FALSE
	}
	notesel p1
	num = notemax

	repeat num
		noteget linestr,cnt
		if cnt=(num-1) {		// 最後の行
			if flag=FALSE {		// 文字列の末尾が改行コード(CRLF)でない
				repeat strlen(linestr)
					putchar peek(linestr,cnt)
				loop
				break
			}
		}
		mes linestr
	loop
	return

/**********************************************************/
// 標準入力ハンドルを取得
/**********************************************************/
#defcfunc get_hstdin
	GetStdHandle STD_INPUT_HANDLE
	return stat

/**********************************************************/
// 標準出力ハンドルを取得
/**********************************************************/
#defcfunc get_hstdout
	GetStdHandle STD_OUTPUT_HANDLE
	return stat

/**********************************************************/
// 標準エラーハンドルを取得
/**********************************************************/
#defcfunc get_hstderr
	GetStdHandle STD_ERROR_HANDLE
	return stat

/**********************************************************/
#global