● StrCalc BASIC の実装
1.基本手順
StrCalc BASIC では StrCalc の機能も使われるので、「StrCalc の実装手順」も必要になります。
基本形.
- StrCalc の初期化
- StrCalc BASIC の初期設定
- StrCalc BASIC の実行
- 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 の他に、処理結果を表示するためのユーザステートメントを入れています。少し複雑なように見えますが、各処理単位の意味が分かれば、内容はそれほど難しくはありません。