/* 連続したレコード数を数える */ LOCAL W count_contrecord(TRAYREC *rec, W entry, W *len) { W c; c = *len = 0; /* レコードの連続性は、接続フラグの有無のみで判定する */ do { c++; *len += rec->len; } while (--entry > 0 && ((rec++)->id & TR_CONT)); return c; } /* 書き出し対象となるレコードタイプのチェック */ LOCAL W check_recordid(UW type, W id) { W result; result = 0; switch (id) { /* 仮身系 */ case TR_VOBJ: // 0x01: 仮身レコード case TS_VOBJ: // 0xE6: 仮身セグメント if (type & ENABLE_VOBJ) result = 1; break; /* 文章系 */ case TR_TEXT: // 0x02: 文章レコード case TS_TEXT: // 0xE1: 文章開始セグメント case TS_TEXTEND: // 0xE2: 文章終了セグメント // ※TS_TPAGE(0xA0)〜TS_TAPPL(0xAF)は省略 if (type & ENABLE_TEXT) result = 1; break; /* 図形系 */ case TR_FIG: // 0x03: 図形レコード case TS_FIG: // 0xE3: 図形開始セグメント case TS_FIGEND: // 0xE4: 図形終了セグメント case TS_IMAGE: // 0xE5: 画像セグメント // ※TS_FPRIM(0xB0)〜TS_FAPPL(0xBF)は省略 if (type & ENABLE_FIG) result = 1; break; /* 付箋系 */ case TS_DFUSEN: // 0xE7: 指定付箋セグメント case TS_FFUSEN: // 0xE8: 機能付箋セグメント case TS_SFUSEN: // 0xE9: 設定付箋セグメント if (type & ENABLE_FUSEN) result = 1; break; /* その他 */ default: DP(("check_record: unknown id %x\n", id)); /* fall-through */ case TS_INFO: // 0xE0: 管理情報セグメント break; } return result; } /* トレーレコードをファイルに保存 */ LOCAL ERR save_trayrecord(W fd, TRAYREC *rec, W entry, W id, W tlen) { W err; /* セグメントヘッダを作成する場合 */ if (id >= 0x80) { if (len < 0xffff) { } else { } if (err < ER_OK) goto fin0; } /* トレーレコードの書き出し */ for (; entry > 0; entry--, rec++) { } fin0: return err; } /* トレー内容の書き出し・本体 */ EXPORT ERR tray2file_backend(W fd, UW type, TRAYREC *rec, W entry) { W err, i, c, id, len; for (i = 0; i < entry; i += c, rec += c) { /* 連続したレコード数を調べる */ c = count_contrecord(rec, entry - i, &len); /* 目的としないレコードであれば、スキップする */ id = rec->id & 0xff; if (!check_recordid(id)) continue; /* レコード数分だけ書き出す */ err = save_trayrecord(fd, rec, c, id, len); if (err < ER_OK) goto fin0; } fin0: return err; }