プログラミング工房 > HSP > Tips > 

小ネタいろいろ

命名規則
コマンドライン引数の取得
ファイル分割(スクリプト挿入)
コンソールアプリケーションに設定される標準入出力ハンドルのデフォルト値
ユーザ定義命令(関数)のローカル指定


コンソールアプリケーションに設定される標準入出力ハンドルのデフォルト値

(2007/07/05 更新)

 コンソールアプリケーションの標準入出力を起動の時点でリダイレクトさせる場合、少なくともCreateProcess APIに渡すSTARTUPINFO構造体の該当メンバにリダイレクト先のハンドルを入れておく必要があるのですが、このメンバを有効にしたままリダイレクトさせないようにするには注意が必要です。その場合、該当メンバには0などの無効なハンドルではなく、メンバを無効にしていた場合にデフォルトで割り当てられるハンドルを自分で設定してやらなければいけません。Windows XP上で調べた限りでは、デフォルトで与えられる標準入出力ハンドルの値は固定されており、標準入力、標準出力、標準エラー出力はそれぞれ、3、7、11です。

 このサイトで公開されているスクリプトの中には、上記の部分について0を設定してしまっているものがあります。修正が遅れていて申し訳ないのですがご注意ください。


命名規則

変数・ユーザ定義命令(関数)

 1バイト「英字」またはアンダースコア(_)または日本語文字で始まり、そのあとが1バイト英数字、アンダースコア、日本語文字からなる59バイト以下の文字列。

ラベル名

 アスタリスク(*)に続く1バイト「英字」またはアンダースコアまたは日本語文字で始まり、そのあとが1バイト英数字、アンダースコア、日本語文字からなる59バイト以下の文字列。

マクロ名

 1バイト「英字」またはアンダースコア(_)または日本語文字で始まり、そのあとが1バイト英数字、アンダースコア、日本語文字からなる20バイト以下の文字列。

モジュール名

 1バイト「英字」またはアンダースコアまたは日本語文字で始まり、そのあとが1バイト英数字、アンダースコア、日本語文字からなる18バイト以下の文字列。

(動作確認ver : 3.1b5)


ユーザ定義命令(関数)のローカル指定

※※※ このコンテンツは現在修正中です。修正が終わるまで情報の利用は控えて下さい。 ※※※

 ver 3.1b6 から、ユーザ定義命令(関数)に対して local 指定が可能になった。この機能を利用するとモジュールの内と外、または別モジュール同士であれば、一応名前の衝突を気にする必要がなくなる。

 一応というのは、命令(関数)の定義時と呼び出し時に、名前に"@"+(モジュール名)の接尾辞を付加する必要があるから。(モジュール外のものには必要ない)

 変数については以前から似たような扱いができたが、ローカル指定したユーザ定義命令(関数)の場合、呼び出し元が同一モジュールか否かにかかわらず接尾辞を付加しなければならない。

 この機能は #deffunc 命令、#defcfunc 命令だけでなく、#modfunc命令に対しても使うことができる。


/* ユーザ定義命令(関数)に対するローカル指定のサンプル */
	goto *@f
#deffunc func1				// 従来の書き方
	mes "This is func1."
	return
*@

#module mod1
#deffunc local func1@mod1			// local指定し"@"+(モジュール名)を付加して定義
	mes "This is func1 in mod1."
	return
#deffunc func2
	func1@mod1			// モジュール内の方を呼び出し
	return
#deffunc func3
	func1				// モジュール外の方を呼び出し
	return
#global

	func1
	func1@mod1
	func2
	func3

(動作確認ver : 3.1b6)


コマンドライン引数の取得

 実行時に渡されたコマンドラインは、dirinfo(4)関数、またはその別名のdir_cmdlineで取得することができる。ただし、コマンドラインを個々の引数に分解するには、このようなモジュールを作るなど自前の処理を書く必要がある。

 実行された実行ファイルまたはスクリプトファイル自身の名前はdir_cmdline内の文字列には含まれない。


ファイル分割(スクリプト挿入)

 HSPではプリプロセッサ命令の#includeを使うことで別ファイルに保存されたスクリプトを挿入することができる。#includeが行うのは、コンパイル前に単純にファイルを結合することだけ。下のサンプルスクリプトはサブルーチン(ユーザ定義命令)が定義されたファイルをインクルードし、サブルーチンを呼び出している例。


#include "sample_mod.hsp"

	sample_mod_func

 ひとつのプログラムの中で同じファイルの内容が複数回挿入されないようにするには、プリプロセッサ命令の#ifndef/#endifと#defineを利用する。

(インクルードされるスクリプトファイルの例)

#ifndef	__SAMPLE_MOD__
	#define __SAMPLE_MOD__

	#module sample_mod
		#deffunc sample_mod_func
			mes "sample_mod_func"
			return
	#global
#endif

 1度目のインクルードでは「__SAMPLE_MOD__」というマクロ名が定義されていないため、マクロの定義とモジュール(*)内のユーザ定義命令の定義が実行されるが、2度目以降は「__SAMPLE_MOD__」が定義済みなので実行されない。「__SAMPLE_MOD__」の部分は他のマクロと重複しない名前を選ぶ必要がある。

 * モジュールは変数や定数に対して名前空間の分離を行う仕組み