● StrCalc BASIC の実装

1.基本手順

StrCalc BASIC では StrCalc の機能も使われるので、「StrCalc の実装手順」も必要になります。

基本形.
  1. StrCalc の初期化

  2. StrCalc BASIC の初期設定

  3. StrCalc BASIC の実行

  4. StrCalc 終了処理

StrCalc の初期化を最初に行い、最後に終了処理を行います(StrCalc の実装「基本手順」参照の事)。初期化と終了処理の間に、StrCalc BASIC 関連の処理を入れます。
簡単な例.

#include <stdio.h>
#include <string.h>
#include <time.h>
#include "sc39.h"

int __stdcall   usr_print(PSTRCALC_PARAM,char *,int,void *);

USERSTATEMENT       table[] = { /* ユーザステートメント登録テーブル */
    { "print", 5, usr_print, NULL }
};

int __cdecl     main(void)
{
    STRCALC_PARAM       sc;
    BASICPARAM          bas;
    int                 ret;

    ret = StrCalc_init(&sc); /* StrCalc環境の初期化 */
    if (!ret){
        printf("初期化に失敗\n");
        return 0;
    }

    /** BASIC 設定 **/

    bas.random_seed = (unsigned)time(NULL);
    bas.stackcnt_if = 16;
    bas.stackcnt_for = 16;
    bas.stackcnt_gosub = 16;
    bas.b_localparam = 1;
    bas.b_ignore_subcnt = 0;
    bas.b_remark_colontype = 0;
    bas.b_remark_ignorestr = 0;
    bas.b_check_dup_label = 1;
    bas.b_naked_us = 0;
    bas.b_us_check = 0;
    bas.b_removespace = 0;
    bas.b_srand = 1;

    bas.fprologue = NULL;
    bas.fevery = NULL;
    bas.fepilogue = NULL;
    bas.proc_exparam = NULL;
    bas.psubst = NULL;
    bas.subst_exparam = NULL;

    bas.pus = table;
    bas.uscnt = sizeof(table) / sizeof(USERSTATEMENT);

    /* BASIC ソースコード */
    bas.psource = "\
        # 0 から 10 までの数字をコンソール上に表示します \n\
        for i = 0 to 10\n\
            @print i\n\
        next\
    ";
    bas.src_size = strlen(bas.psource);

    /* StrCalc BASIC の実行 */
    ret = StrCalc_BASIC(&sc,&bas);

    StrCalc_term(&sc); /* StrCalc環境の終了 */

    if (ret != STATUS_NORMAL)
        printf("line : %lu     error.   %d\n",
            bas.stop_lineno,ret);

    return 0;
}

/*
  ユーザステートメント:数値の表示 @print

  StrCalc BASIC はデバイスの I/O を持たないので、アプリケーションが
  ユーザステートメントの形で用意する必要があります。
*/
int __stdcall   usr_print(PSTRCALC_PARAM prm,char *arg,int len,void *exparam)
{
    int         ret;

    /* 引数の文字列を計算して表示する */
    prm->str = arg;
    if ((ret = StrCalc(prm)) != STATUS_NORMAL)
        return ret;

    printf("%.16G\n",prm->ans);

    return STATUS_NORMAL;

len;        /* ← コンパイル時の警告を避けるために、未使用の引数を入れます */
exparam;    /*    警告を無視するのであれば、無くても可                     */
}

プログラム例(zip)

このプログラム例では、基本形 1 〜 4 の他に、処理結果を表示するための
ユーザステートメントを入れています。少し複雑なように見えますが、各処理単位の意味が分かれば、内容はそれほど難しくはありません。