[index > X68kの読み物や資料の部屋]

[前へ戻る]

BAStoCライブラリ


個々の説明の前に

BAStoCライブラリを作るには、BASICプログラムをCプログラム変換するための定義ファイル、 Cプログラム用ヘッダファイル、Cプログラム用ライブラリの3つを作成します。

…といいつつ、実は、あまり変なことをやっていなければ、 Cプログラム用のライブラリさえ用意すればきちんとBAStoCコンパイルできるのですが、 それだとせっかくのCコンパイラの文法チェックや最適化の足を引っ張ってしまうので、 できるだけ3つすべてを作成すべきです。 ただし、1999年に決定したC言語の新しい規格に準拠したCコンパイラを使う場合は、 Cプログラム用ヘッダファイルの用意が必須となります。

なお、3つの中に矛盾があるかどうか、という検査は行われません。 矛盾があるとCプログラムをコンパイルする時点でエラーかワーニング(警告)が出るはずなので、 それを見て対処することになります。

[戻る]


.defファイル

概要

(たぶん通称)defファイルは、BAStoCする際にBC.Xが参照する、 外部関数のBASIC→Cコンバート情報を定義するファイルです。

主ファイル名(ノード名)が同じ.hファイルを環境変数includeにインストールしておく必要のあるCソースファイルを生成します (foo.defを使うと、Cソースの先頭に#include <foo.h>という一行が入ります)。

定義

I       foo(I,NA,S)     :       b_foo(%,%,@,%)
↑      ↑  ↑引数の型          ↑    ↑変換方法
↑      関数名                  Cでの関数名(省略すると同じ関数名で出力する)
戻り値の型(省略するとvoid型)

defファイルには以上のような行が並びます。 「:」より左側がBASICでの関数、右側がCの関数です。 外部関数やCのヘッダと食い違っているとCコンパイルの時点でエラーになります(たぶん)。 記号の意味は以下の通りです。

-- BASICサイド --
C   char型
I   int型
F   float型
S   str型
NA  数値型配列(char・int・floatのどれでもよい)
CA  char型配列
IA  int型配列
FA  float型配列
SA  str型配列

-- Cサイド --
%  変換無し
&  ポインタを渡す
$  文字列の戻り値を格納する
@  配列の要素のサイズ(=sizeof(一つ前の引数[0]))
#  領域のサイズ(=sizeof(一つ前の引数))

C言語では文字列を戻り値に持てないため、戻り値がstr型の関数は、 「$」を使って戻り値を格納するテンポラリの文字列変数を渡します (指定する場所は任意でいいはずです)。 #や@はC言語上で型情報などを得るための細工を施す指定です (が、上の記述の通りただ sizeof() を入れるだけなので、 Cのヘッダで細工する場合に比べかなり不自由です)。foo(IA,#,@)はエラーになります。

なお、空行は無視するだけのようです。 コメントを付けられるかどうかは不明です(確認する気無しぉぃ) 。 ちなみに、このあたりの細かい仕様がまったくわかりません。 (ソースコードも欲しいけど、それよりも仕様書が欲しいです(笑))

未公開機能として、

        foo(I-) :       (%)
        bar(F-) :       (%)

などと'-'をつけると、引数が省略されたときに、そこに'NASI'を埋め込みます (float型の場合は(double)'NASI'にキャストされて渡されてきます※)。 これによりCライブラリ側で引数を省略したかどうか判別できるようになりますが、 引数がintの幅一杯に使う場合や、 float型引数だった場合は通常の数値に埋もれてしまうので判別不能です。 外部関数の仕様を決める段階で回避するセンスが求められます (「それは仕様です」って強弁しろってことじゃありませんよ)。

※)浮動小数点フォーマットにはFLOAT1のシャープフォーマットもありますが、 無視してIEEEフォーマット(FLOAT2/3/4)だけに対応すれば問題ありません。 (はっきり言ってFLOAT1を使う方が問題です)

ちなみに、以前

        foo(I-) :       (%,#)

などとやってみたことがありますが、勿論エラーでした。 引数を省略したときは0を入れてくれるような仕様だと良かったんですけどねぇ(;_;)。

[戻る]


C用ヘッダ

注意事項

[戻る]


Cライブラリ

注意事項

文字列操作などバッファを操作する場合は、操作する前にバッファサイズをチェックするか、 バッファサイズは不定長であるという前提でコーディングするべきです (バッファサイズの保証をユーザー任せにすると、 確保されているバッファの外まで操作してしまうので危険です。 他の変数や定数が化けたり、プログラムや場合によってはシステムまでもが暴走したりします)。

これ以外には、BASIC用のライブラリだから…ということは特にないと思います。 普通のCライブラリのつもりで作成すればOKのはずです。

[戻る]


[前へ戻る]

[index > X68kの読み物や資料の部屋]

Written by mor.

最終更新は2001年10月31日(水)です。