リンクレコードについて

蛇足になるかもしれませんが、リンクレコードの読み書きについて補足しておきます。ここまでは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です。


Tamakoshi Hiroki
Last modified: Wed Dec 4 01:02:36 JST 2002