蛇足になるかもしれませんが、リンクレコードの読み書きについて補足しておきます。ここまではTAD主レコードの読み書き、つまりTADデータ構成としてのセグメントの読み書きについて解説しました。TADデータ構成でないフォーマットを持つレコードをまとめると仕様書3.2.2 実身レコード構成より以下のようになります。
レコードタイプ0 | リンクレコード | 標準データタイプ |
---|---|---|
レコードタイプ9 | 実行プログラムレコード | 標準オブジェクト形式 |
レコードタイプ10 | データボックスレコード | データボックス定義形式 |
レコードタイプ11 | フォントデータレコード | 標準フォントデータ形式 |
レコードタイプ12 | 辞書データレコード | 標準辞書データ形式 |
レコードタイプ15 | システムデータレコード | システムアプリケーション定義 |
ここで解説するのはリンクレコードです。他のレコードタイプについては今のところ分かりません。また、レコードタイプ8の実行機能付箋レコードはこれまでに解説したTADデータ構成と定義されていますが、その解釈は普通にはできないことを付記しておきます。
セグメントとはのところでも書きましたが、標準データタイプとはBやWなどの基本的な型のことであり、LINK型も含みます。リンクレコードとはこのLINK型の値そのものです。実際にリンクレコードを読み込むプログラムを例示する方が分かりがいいと思いますので示します。
#include <sample.h>
#include <bassert.h>
/* レコードごとに処理 */
VOID ShowRecord(W iNumber, UH iSubtype, LINK * iLinkRecord)
{
TC Name[21] = {0};
fil_sts(iLinkRecord, Name, NULL, NULL);
printf("Record number: %d, subtype: %d, name: %S\n",
iNumber, iSubtype, Name);
}
VOID main(W argc, TC ** argv)
{
LINK SrcLink;
WERR WErr, SrcFD;
W SearchMode = F_FWD, Number;
ERR Err;
WErr = get_lnk(L"test", &SrcLink, F_NORM);
SrcFD = opn_fil(&SrcLink, F_READ, NULL);
while( fnd_lnk(SrcFD, SearchMode, NULL, 0, &Number) == 0 ) {
LINK LinkRecord;
UH Subtype;
W Size;
if ( SearchMode == F_FWD ) SearchMode = F_NFWD;
WErr = rea_rec(SrcFD, 0, (B*)&LinkRecord, sizeof( LINK ), &Size, &Subtype);
assert( sizeof( LINK ) == Size );
ShowRecord(Number, Subtype, &LinkRecord);
}
Err = cls_fil( SrcFD );
}
つまりrea_recするときにLINK型へのポインタをB型へのポインタと思ってsizeof( LINK )だけreadするというだけのことです。writeも同様です。
ここで出てきた関数はfnd_lnkとfil_stsです。