作者itoc.bbs@cpu.tfcis.org (核心動力) 看板: plan
標題Re: redir可否支援ptt的日期格式^^"...
時間動力核心 (2005/04/24 Sun 11:23:34) Updated: 2005/05/15
※ 引述《itoc (核心動力)》之銘言:
> ※ 引述《pigco (哈)》之銘言:
> > 可不可以讓redir這支程式支援ptt的時間格式 XD...
> 3. 如果你能取得該站的完整資料,那你可以用轉換的
先將其他 BBS 站的資料抓回並解壓縮
假設將目錄解開在 /tmp/xxxx
/tmp/xxxx 裡面要有 .DIR 及 M.*.A 的檔案
然後執行
% ~/bin/transbrd /tmp/xxxx ABCD
即可將 /tmp/xxxx 這目錄下的文章轉到站上的 [ABCD] 板 (要先在站上開這個板)
看板 [ABCD] 可以是一個全新的看板
也可以是一個已有文章的看板 (那麼會將文章併入到最後)
轉換程式如下
: src/util/Makefile
EXE = ..... transbrd.c
: src/util/transbrd.c 新增此程式
/*-------------------------------------------------------*/
/* util/transbrd.c */
/*-------------------------------------------------------*/
/* target : Maple Sob 2.36 至 Maple 3.02 看板轉換 */
/* create : 05/04/24 */
/* update : / / */
/*-------------------------------------------------------*/
#include "bbs.h"
/* ----------------------------------------------------- */
/* old DIR of board struct : 128 bytes */
/* ----------------------------------------------------- */
struct fileheader
{
char filename[33]; /* M.9876543210.A */
char savemode; /* file save mode */
char owner[14]; /* uid[.] */
char date[6]; /* [02/02] or space(5) */
char title[73];
uschar filemode; /* must be last field @ boards.c */
};
typedef struct fileheader fileheader;
static time_t
trans_hdr_chrono(filename)
char *filename;
{
char time_str[11];
/* M.1087654321.A 或 M.987654321.A */
str_ncpy(time_str, filename + 2, filename[2] == '1' ? 11 : 10);
return (time_t) atoi(time_str);
}
static void
trans_hdr_stamp(folder, t, hdr, fpath)
char *folder;
time_t t;
HDR *hdr;
char *fpath;
{
FILE *fp;
char *fname, *family;
int rc;
fname = fpath;
while (rc = *folder++)
{
*fname++ = rc;
if (rc == '/')
family = fname;
}
fname = family + 1;
*fname++ = '/';
*fname++ = 'A';
for (;;)
{
*family = radix32[t & 31];
archiv32(t, fname);
if (fp = fopen(fpath, "r"))
{
fclose(fp);
t++;
}
else
{
memset(hdr, 0, sizeof(HDR));
hdr->chrono = t;
str_stamp(hdr->date, &hdr->chrono);
strcpy(hdr->xname, --fname);
break;
}
}
}
/* ----------------------------------------------------- */
/* 轉換主程式 */
/* ----------------------------------------------------- */
int
main(argc, argv)
int argc;
char *argv[];
{
int fd;
char *brdname, *path;
char fpath[64], folder[64], buf[64];
time_t chrono;
fileheader fh;
HDR hdr;
if (argc != 3)
{
printf("Usage: %s path brdname\n", argv[0]);
printf("將 path 這目錄下的資料併入看板 brdname\n");
return 0;
}
chdir(BBSHOME);
brdname = argv[2];
brd_fpath(folder, brdname, NULL);
if (!dashd(folder))
{
printf("BBS 上沒有此看板 %s\n", brdname);
return 0;
}
path = argv[1];
sprintf(fpath, "%s/.DIR", path);
if (!dashf(fpath))
{
printf("%s 此目錄下沒有其他 BBS 站的文章\n", path);
return 0;
}
/* 轉換進板畫面 */
sprintf(fpath, "%s/notes", path);
if (dashf(fpath))
{
brd_fpath(folder, brdname, FN_NOTE);
f_cp(fpath, folder, O_TRUNC);
}
/* 轉換文章 */
sprintf(fpath, "%s/.DIR", path);
if ((fd = open(fpath, O_RDONLY)) >= 0)
{
brd_fpath(folder, brdname, FN_DIR);
while (read(fd, &fh, sizeof(fh)) == sizeof(fh))
{
/* 轉換文章 .DIR */
memset(&hdr, 0, sizeof(HDR));
chrono = trans_hdr_chrono(fh.filename);
trans_hdr_stamp(folder, chrono, &hdr, buf);
str_ncpy(hdr.owner, fh.owner, sizeof(hdr.owner));
str_ansi(hdr.title, fh.title, sizeof(hdr.title));
hdr.xmode = (fh.filemode & 0x2) ? POST_MARKED : 0;
rec_add(folder, &hdr, sizeof(HDR));
/* 拷貝檔案 */
sprintf(fpath, "%s/%s", path, fh.filename);
f_cp(fpath, buf, O_TRUNC);
}
close(fd);
}
return 0;
}
--
◤◥ Origin: Maple-itoc˙動力核心 cpu.tfcis.org
◣◢ Author: itoc 從 itoc.Dorm11.NCTU.edu.tw 發表精華選讀←離開[主題上]主題下(k)上篇(j)下篇S/a搜尋 G串列 TAB精華 ↑↓捲 Pg/Space翻