/* tray2file_frontend.c original code: SASANO Takayoshi --- public domain, no warranty. */ #include "common.h" /* 管理情報セグメント */ LOCAL UH InfoSeg[] = { XeH(TC_SPEC | TS_INFO), // 管理情報セグメント XeH(0x0006), // データ本体のバイト長 XeH(0x0000), // 項目ID(0:TAD規格のバージョン番号) XeH(0x0002), // 項目データのバイト長 XeH(0x0122), // TAD 1.22に準拠 }; /* 基本文書編集から取り出した実行機能付箋 */ 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 UH FGEDFusen[] = { 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(0x0002), XeH(0x8000), // UH appl[3] XeH(0x3470), XeH(0x4b5c), XeH(0x3f5e), XeH(0x3741), // 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(0x3f5e), XeH(0x3741), 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(0x002e), // UH dlen XeH(0x6100), XeH(0x0101), XeH(0x0000), XeH(0x0000), // unknown... XeH(0x0258), XeH(0x017c), XeH(0x0000), XeH(0x0000), XeH(0x0258), XeH(0x017c), XeH(0x010e), XeH(0x0000), XeH(0x017c), XeH(0x0060), XeH(0x0000), XeH(0xffff), XeH(0x10ff), XeH(0x0000), XeH(0x0000), XeH(0x0000), XeH(0x0000), XeH(0x0000), XeH(0x0000), }; /* 主TADレコードの新規作成 */ LOCAL W create_tadrec(W fd) { W err; DP(("create TAD record\n")); /* 管理情報セグメントを出力 */ err = apd_rec(fd, (UB *)InfoSeg, sizeof(InfoSeg), 1, 0, 0); if (err < ER_OK) { DP(("create_tadrec: apd_rec %d\n", err)); goto fin0; } /* 終端レコードの一つ前に移動する */ err = see_rec(fd, -1, -1, NULL); if (err < ER_OK) { DP(("create_tadrec: see_rec %d\n", err)); goto fin0; } fin0: return err; } /* フロントエンド本体 */ LOCAL W frontend_main(TC *fname, W option) { W err, newfile, fd; LINK l; /* ファイルの存在チェック */ err = get_lnk(fname, &l, F_NORM); if (err < ER_OK) { /* ファイルは存在しない:新規作成 */ newfile = 1; DP(("create new file\n")); /* リンクを獲得 */ err = get_lnk(NULL, &l, F_NORM); if (err < ER_OK) { DP(("frontend_main: get_lnk %d\n", err)); goto fin0; } /* 出力ファイルの作成 */ err = cre_fil(&l, fname, NULL, (option == ENABLE_TEXT) ? 1 : 2, F_FIX); if (err < ER_OK) { DP(("frontend_main: cre_fil %d\n", err)); goto fin0; } fd = err; /* 管理情報セグメントを作成 */ err = create_tadrec(fd); if (err < ER_OK) { DP(("frontend_main: create_tadrec %d\n", err)); goto fin1; } } else { /* ファイルは存在する:既存ファイルに追加 */ newfile = 0; DP(("append to file\n")); /* ファイルをオープン */ err = opn_fil(&l, F_WRITE | F_EXCL, NULL); if (err < ER_OK) { DP(("frontend_main: opn_fil %d\n", err)); goto fin0; } fd = err; /* 主TADレコードの検索 */ err = fnd_rec(fd, F_ENDTOP, (1 << 1), 0, NULL); if (err < ER_OK) { /* 主TADレコード無し:新規作成 */ err = create_tadrec(fd); if (err < ER_OK) { DP(("frontend_main: create_tadrec %d\n", err)); goto fin1; } } else { /* 主TADレコード有り:既存レコードに追加 */ // ここでは特に何もしない } } /* バックエンドの実行 */ // XXX /* ファイルを新規作成した場合は、実行機能付箋を貼り付ける */ if (newfile) { /* 基本文書編集(図形レコードのみの保存は除く) */ if (option != ENABLE_FIG) { err = apd_rec(fd, (UB *)TXEDFusen, sizeof(TXEDFusen), 8, 0, 0); if (err < ER_OK) { DP(("frontend_main: apd_rec %d\n", err)); // エラー処理は行わない } } /* 基本図形編集(文章レコードのみの保存は除く) */ if (option != ENABLE_TEXT) { err = apd_rec(fd, (UB *)FGEDFusen, sizeof(FGEDFusen), 8, 0, 0); if (err < ER_OK) { DP(("frontend_main: apd_rec %d\n", err)); // エラー処理は行わない } } /* あくまでもおまけなので、エラーが発生しても無視する */ err = ER_OK; } fin1: cls_fil(fd); fin0: return err; } /* デフォルトファイル名の作成 */ LOCAL W create_filename(TC *fname) { W err; STIME st; DATE_TIM dt; UB buf[L_FNM + 1]; /* システム時間を取得 */ err = get_tim(&st, NULL); if (err < ER_OK) { DP(("create_filename: get_tim %d\n", err)); goto fin0; } /* 日時に変換 */ err = get_tod(&dt, st, True); if (err < ER_OK) { DP(("create_filename: get_tod %d\n", err)); goto fin0; } /* ASCII(EUC)のファイル名を作成(末端はNULL) */ sprintf(buf, "%04d%02d%02d_%02d%02d%02d", dt.d_year + 1900, dt.d_month, dt.d_day, dt.d_hour, dt.d_min, dt.d_sec); /* ASCII(EUC)→TCに変換 */ eucstotcs(fname, buf); fin0: return err; } /* 保存対象のチェック */ LOCAL W check_option(TC *arg) { W err; err = 0; /* 指定されたフラグをonにする(複数設定可) */ while (*arg != TC_NULL) { switch (*arg++) { case TK_v: err |= ENABLE_VOBJ; break; case TK_t: err |= ENABLE_TEXT; break; case TK_f: err |= ENABLE_FIG; break; case TK_u: err |= ENABLE_FUSEN; break; case TK_a: err = ENABLE_ALL; goto fin0; // これ以上のチェックは不要 default: err = ER_PAR; goto fin0; // これ以上のチェックは不要 } } fin0: return err; } /* main entry */ EXPORT W main(W ac, TC *av[]) { W err, option; TC *fname, fnbuf[L_FNM + 1]; /* ヘルプの表示 */ if (ac < 2) { P(("usage: %S [option] [(filename)]\n", av[0])); P(("option: v vobj\n")); P((" t text\n")); P((" f fig\n")); P((" u fusen\n")); P((" a all\n")); err = ER_PAR; goto fin0; } /* オプションのチェック */ err = check_option(av[1]); if (err < ER_OK) { P(("option error\n")); goto fin0; } option = err; DP(("option: %#x\n", option)); /* ファイル名のチェック */ if (ac < 3) { err = create_filename(fnbuf); if (err < ER_OK) { P(("create_filename %d\n", err)); goto fin0; } fname = fnbuf; } else { fname = av[2]; } DP(("filename: %S\n", fname)); /* フロントエンドの実行 */ err = frontend_main(fname, option); fin0: return err; }