/* tray2file.c original code: SASANO Takayoshi --- public domain, no warranty. */ #include #include #include #include #include /* エンディアン変換が必要になった時のための、拡張用 */ #define XeH(x) (x) #define XeW(x) (x) /* 管理情報セグメント */ LOCAL UH InfoSeg[] = { XeH(TC_SPEC | TS_INFO), // 管理情報セグメント XeH(0x0006), // データ本体のバイト長 XeH(0x0000), // 項目ID(0:TAD規格のバージョン番号) XeH(0x0002), // 項目データのバイト長 XeH(0x0122), // TAD 1.22に準拠 }; /* 文書開始セグメント */ LOCAL UH TextSeg[] = { XeH(TC_SPEC | TS_TEXT), // 文章開始セグメント XeH(0x0018), // データ本体のバイト長 XeH(0x0000), XeH(0x0000), XeH(0x0000), XeH(0x0000), XeH(0x0000), XeH(0x0000), XeH(0x0000), XeH(0x0000), XeH(0xff88), XeH(0xff88), XeH(0x0021), XeH(0x0000), }; /* 文章終了セグメント */ LOCAL UH TextEndSeg[] = { XeH(TC_SPEC | TS_TEXTEND), // 文章終了セグメント XeH(0x0000), // データ本体のバイト長 }; /* 基本文書編集から取り出した実行機能付箋 */ LOCAL UH TXEDFusen[] = { XeH(0x0000), XeH(0x0000), XeH(0x0000), XeH(0x0000), // RECT view XeH(0x0010), // CHSIZE chsz XeH(0x0000), XeH(0x1000), // UH frcol[2] XeH(0x0000), XeH(0x1000), // UH chcol[2] XeH(0xffff), XeH(0x10ff), // UH tbcol[2] XeH(0x0004), // UH pict XeH(0x8000), XeH(0x0003), XeH(0x8000), // UH appl[3] XeH(0x3470), XeH(0x4b5c), XeH(0x4a38), XeH(0x3e4f), // TC name[16] XeH(0x4a54), XeH(0x3d38), XeH(0x0000), XeH(0x0000), XeH(0x0000), XeH(0x0000), XeH(0x0000), XeH(0x0000), XeH(0x0000), XeH(0x0000), XeH(0x0000), XeH(0x0000), XeH(0x4a38), XeH(0x3e4f), XeH(0x0000), XeH(0x0000), // TC dtype[16] XeH(0x0000), XeH(0x0000), XeH(0x0000), XeH(0x0000), XeH(0x0000), XeH(0x0000), XeH(0x0000), XeH(0x0000), XeH(0x0000), XeH(0x0000), XeH(0x0000), XeH(0x0000), XeH(0x0020), // UH dlen XeH(0x0002), XeH(0x0000), XeH(0x0000), XeH(0x0000), // unknown... XeH(0x0280), XeH(0x017c), XeH(0x0000), XeH(0x0000), XeH(0x0000), XeH(0x0000), XeH(0x0000), XeH(0xffff), XeH(0x10ff), XeH(0x0000), XeH(0x0000), XeH(0x0000), }; /* ファイル書き出し */ LOCAL W save_to_file(TC *name, TRAYREC *data, W rec) { W err, i, fd; LINK l; /* リンク取得 */ err = get_lnk(NULL, &l, F_NORM); if (err < ER_OK) { printf("save_to_file: get_lnk %d\n", err); goto fin0; } /* 出力ファイル作成 */ err = cre_fil(&l, name, NULL, 0, F_FIX); if (err < ER_OK) { printf("save_to_file: cre_fil %d\n", err); goto fin0; } fd = err; /* 管理情報セグメントを出力 */ err = apd_rec(fd, (UB *)InfoSeg, sizeof(InfoSeg), 1, 0, 0); if (err < ER_OK) { printf("save_to_file: apd_rec %d\n", err); goto fin1; } /* 終端レコードの一つ前に移動する */ err = see_rec(fd, -1, -1, NULL); if (err < ER_OK) { printf("save_to_file: see_rec %d\n", err); goto fin1; } /* 文書開始レコードを出力 */ err = wri_rec(fd, -1, (UB *)TextSeg, sizeof(TextSeg), NULL, NULL, 0); if (err < ER_OK) { printf("save_to_file: wri_rec %d\n", err); goto fin1; } /* 文章セグメント列のみ選択して出力 */ for (i = 0; i < rec; i++) { if (data[i].id != TR_TEXT) continue; err = wri_rec(fd, -1, data[i].dt, data[i].len, NULL, NULL, 0); if (err < ER_OK) { printf("save_to_file: wri_rec %d\n", err); goto fin1; } } /* 文章終了レコードを出力 */ err = wri_rec(fd, -1, (UB *)TextEndSeg, sizeof(TextEndSeg), NULL, NULL, 0); if (err < ER_OK) { printf("save_to_file: wri_rec %d\n", err); goto fin1; } /* 基本文書編集の実行機能付箋を貼り付ける */ err = apd_rec(fd, (UB *)TXEDFusen, sizeof(TXEDFusen), 8, 0, 0); if (err < ER_OK) { printf("save_to_file: apd_rec %d\n", err); goto fin1; } fin1: cls_fil(fd); fin0: return err; } /* main */ EXPORT ERR main(W ac, TC *av[]) { W err, rec, size, asize; TRAYREC *data; /* 引数のチェック */ if (ac < 2) { printf("usage: %S [filename]\n", av[0]); err = ER_PAR; goto fin0; } /* レコード全体のサイズ・レコード数の取得 */ err = tpop_dat(NULL, 0, &size, -1, NULL); if (err < ER_OK) { printf("main: tpop_dat %d\n", err); goto fin0; } rec = err; /* レコードが存在しない場合はここで終了 */ if (!size) { printf("main: no tray data\n"); err = ER_NOEXS; goto fin0; } /* メモリ確保 */ data = malloc(size); if (data == NULL) { printf("main: malloc NULL\n"); err = ER_NOMEM; goto fin0; } /* レコード全体の読み出し */ err = tpop_dat(data, size, &asize, -1, NULL); if (err < ER_OK) { printf("tpop_dat %d\n", err); goto fin1; } /* 指定されたファイルとして出力 */ err = save_to_file(av[1], data, rec); if (err < ER_OK) { printf("save_to_file %d\n", err); goto fin1; } fin1: free(data); fin0: return err; }