● 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 */
};