文字列リテラルへのポインタを得るコマンド

書いてから思ったけど、HSP自体がリソースのために持っているバッファ(DS)へのポインタを返すので、リテラルが書き換え可能になっちゃうっていう。……まぁそこらへんはいいか。
実数値リテラルもいけるけど、整数はCodeSegmentに直書きだからそれ自体へのポインタは無理で、どこかにコピーを書いて取る必要がある。面倒くさい。
実際に使用するときは #define global constptr __constptr || というマクロを用いる。いちいち括弧をつけなくていいので記述が楽。

書いてから思ったけど、HSP自体がリソースのために持っているバッファ(DS)へのポインタを返すので、リテラルが書き換え可能になっちゃうっていう。……まぁそこらへんはいいか。
実数値リテラルもいけるけど、整数はCodeSegmentに直書きだからそれ自体へのポインタは無理で、どこかにコピーを書いて取る必要がある。面倒くさい。
実際に使用するときは #define global constptr __constptr || というマクロを用いる。いちいち括弧をつけなくていいので記述が楽。

// constptr || CONST_VALUE
int constptr( void** ppResult )	// この返値が *type_res に、*ppResult の値が reffunc の返値になるとする
{
	if ( *exinfo->npexflg & (EXFLG_1 | EXFLG_2) ) puterror( HSPERR_SYNTAX );
	static int stt_result;
	switch ( *type ) {
		case TYPE_STRING:
		case TYPE_DNUM:
			stt_result = reinterpret_cast<int>( &ctx->mem_mds[*val] );
			*ppResult = &stt_result;
			break;
		case TYPE_INUM:
			puterror( HSPERR_UNSUPPORTED_FUNCTION );	// CS中に埋め込まれているのでとれない
		default:
			puterror( HSPERR_SYNTAX );
	}
	code_next();
	if ( !(*type == TYPE_MARK && *val == 6) ) puterror( HSPERR_SYNTAX );	// or(||)
	code_next();
	return HSPVAR_FLAG_INT;
}