● 関数リファレンス
コールバック関数SUBSTHOOK
int __stdcall function(PSTRCALC_PARAM prm,char *pstr,int len,int btemp,int *pret,void *param)
{
return 0 または 1;
}
引数
引数名 | 意味 |
prm | STRCALC_PARAM 構造体の実体アドレス |
pstr | 代入式の文字列全体を格納したバッファの先頭アドレス |
len | pstr 内に格納されている文字列の長さ |
btemp | テンポラリ属性指定の有無。 BASICPARAM 構造体のメンバ b_localparam と同じ内容が渡されます。 |
pret | 状態コードを返すための int型領域のアドレスが渡されます。 |
param | 追加パラメータ。BASICPARAM 構造体のメンバ subst_exparam の内容がそのまま渡されます。 |
説明
StrCalc BASIC の代入式処理をフックするコールバック関数です。関数ポインタの型は sc39.h 内で定義されています。
typedef int (__stdcall *SUBSTHOOK)(PSTRCALC_PARAM ,char *,int ,int ,int *,void *);
このコールバック関数は、代入式が処理される直前に呼び出されます。アプリケーションは、このコールバック内で pstr についての代入式処理を行います。
- pstr には、代入式の文字列(S-JIS 対応)が格納されたバッファの先頭アドレスが渡されます。
- 文字列は、半角空白文字やタブ文字が先頭側にあれば除かれます。また、行末(改行文字、コロン)はヌル文字に置き換えられます。
- シングルクォートやダブルクォートで括られた範囲にある改行文字やコロンは無視されます。対となるシングルクォート・ダブルクォートは、ヌル文字が出現するまで検索されます。
- len には文字列の長さが渡されます。これには、末尾ヌル分は含まれません。
- 文字列が格納されるバッファは、代入式の箇所毎に用意されます。内容はコールバックが呼び出される度にコピーされるので、pstr が指すバッファの内容を変更しても、呼び出し側に影響を与える事はありません(ただし、pstr [0] 〜 pstr [len ] の範囲である事)。
戻り値
コールバック関数を終了する時は、状態によって次のように終了手続きを行ってください。
状態 | 終了処理 |
処理に成功した場合 | 戻り値 1 で関数を終了 *pret の内容は無視されます |
BASIC を継続できない場合 | *pret に状態コード(エラー状態)をセットし、戻り値 0 で関数を終了 |
デフォルトの代入式処理を行う場合 | *pret に STATUS_NORMAL をセットし、戻り値 0 で関数を終了 |
BASIC を継続できない場合の状態コードは、適当なコードが見つからなければ、アプリケーション独自のコードを作成しても問題ありませんが、できるだけ StrCalc の状態コード範囲(STATUS_ERROR 〜 STATUS_SUBST_SYNTAXERROR)を使用する事を推奨します。
エラー時の状態コードは、BASICPARAM 構造体のメンバ sc_ret を使ってアプリケーションに通知されます。
注意点
- この関数には、代入式以外の文字列も渡される可能性があります。ラベル、注釈、通常ステートメント、ユーザステートメント以外の文字列で、アプリケーションがフック処理向けに定義した書式でなければ、文法エラーを伴っています。フック関数内では、必ず書式チェックを行ってください。
ただし、デフォルトの代入式処理のために書式チェックを行う必要はありません。
- デフォルトの代入式処理が使用するバッファは、フック関数がアクセスできるバッファとは異なります。そのため、編集した文字列をデフォルト処理に渡す事はできません。
編集した文字列の計算はフック関数内で行ってください。
次の関数はデフォルトの代入式と等価です。
int __stdcall hookcallback(PSTRCALC_PARAM prm,char *pstr,int len,int btemp,int *pret,void *param)
{
*pret = StrCalc_substitution(prm,pstr,btemp,NULL,NULL,NULL);
return *pret == STATUS_NORMAL;
}
- BASICPARAM 構造体のメンバ b_removespace に 1 を設定した場合、pstr が指す式は空白・タブ文字が除かれています。
空白やタブ文字に処理上の意味(例えば区切り文字としての意味)を持たせる場合は、b_removespace に 0 を設定してください。