● StrCalc BASIC の実装
補足 : 追加パラメータの応用
USERSTATEMENT構造体のメンバ param は、ユーザステートメントのコールバックに渡される追加情報です。この情報は、ユーザステートメント毎に異なるものを指定する事ができます。変数型は void ポインタとなっていますが、キャストすればアドレスの他に整数型も指定する事ができます。
例えば、グローバル変数 mode の値を変更するユーザステートメント "@mode1"、"@mode2"、"@mode3" を作成する場合、
例.
int mode;
int __stdcall usr_mode1(PSTRCALC_PARAM prm,char *arg,int len,void *param)
{
if (len)
return STATUS_ERROR;
mode = 1;
return STATUS_NORMAL;
}
int __stdcall usr_mode2(PSTRCALC_PARAM prm,char *arg,int len,void *param)
{
if (len)
return STATUS_ERROR;
mode = 2;
return STATUS_NORMAL;
}
int __stdcall usr_mode3(PSTRCALC_PARAM prm,char *arg,int len,void *param)
{
if (len)
return STATUS_ERROR;
mode = 3;
return STATUS_NORMAL;
}
USERSTATEMENT table[] = {
{ "mode1", 5, usr_mode1, NULL }, /* @mode1 */
{ "mode2", 5, usr_mode2, NULL }, /* @mode2 */
{ "mode3", 5, usr_mode3, NULL } /* @mode3 */
};
この場合、追加パラメータを利用すると、コールバックの数を減らす事ができます。
int mode;
int __stdcall usr_mode_n(PSTRCALC_PARAM prm,char *arg,int len,int n)
{
if (len)
return STATUS_ERROR;
mode = n;
return STATUS_NORMAL;
}
USERSTATEMENT table[] = {
{ "mode1", 5, (USFUNC)usr_mode_n, (void *)1 }, /* @mode1 */
{ "mode2", 5, (USFUNC)usr_mode_n, (void *)2 }, /* @mode2 */
{ "mode3", 5, (USFUNC)usr_mode_n, (void *)3 } /* @mode3 */
};