From ff7ae115c5db1fe56f3c6114bf08ed8ecf0c9847 Mon Sep 17 00:00:00 2001 From: wens Date: Sun, 25 May 2008 04:05:26 +0000 Subject: Move transform programs to seperate directory. Add transformation program for SOB git-svn-id: http://opensvn.csie.org/pttbbs/trunk/pttbbs@4322 63ad8ddf-47c3-0310-b6dd-a9e9d9715204 --- trans/Makefile | 62 +++++++++++++++++++++++++++ trans/sob_trans.c | 113 ++++++++++++++++++++++++++++++++++++++++++++++++ trans/transman.c | 56 ++++++++++++++++++++++++ trans/wretch_man.c | 124 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 355 insertions(+) create mode 100644 trans/Makefile create mode 100644 trans/sob_trans.c create mode 100644 trans/transman.c create mode 100644 trans/wretch_man.c (limited to 'trans') diff --git a/trans/Makefile b/trans/Makefile new file mode 100644 index 00000000..6518509a --- /dev/null +++ b/trans/Makefile @@ -0,0 +1,62 @@ +# $Id$ + +SRCROOT= .. +.include "$(SRCROOT)/pttbbs.mk" + +CFLAGS+= -DPTTBBS_UTIL + +BBSBASE= $(SRCROOT)/include/var.h + +UTIL_OBJS= \ + util_cache.o util_record.o util_passwd.o util_var.o + +MBBSD_OBJS= \ + cache record passwd var + +# 下面這些程式, 會被 compile 並且和 $(UTIL_OBJS) 聯結 +CPROG_WITH_UTIL= \ + wretch_man \ + sob_trans \ + transman + +# 下面是 C++ 的程式 +CPP_WITH_UTIL= \ + + +# 下面這些程式, 會直接被 compile +CPROG_WITHOUT_UTIL= \ + +# 下面這些程式會被 install +PROGS= ${CPROG_WITH_UTIL} ${CPROG_WITHOUT_UTIL} ${CPP_WITH_UTIL}\ + +LIBS+= $(SRCROOT)/common/sys/libcmsys.a \ + $(SRCROOT)/common/bbs/libcmbbs.a + + +all: ${CPROG_WITH_UTIL} ${CPROG_WITHOUT_UTIL} ${CPP_WITH_UTIL} ${PROGS} + +$(SRCROOT)/include/var.h: $(SRCROOT)/mbbsd/var.c + cd $(SRCROOT)/mbbsd; $(MAKE) $(SRCROOT)/include/var.h + +.for fn in ${CPROG_WITH_UTIL} +${fn}: ${BBSBASE} ${fn}.c ${UTIL_OBJS} + $(CCACHE) ${CC} ${CFLAGS} ${LDFLAGS} -o ${fn} ${UTIL_OBJS} ${fn}.c $(LIBS) +.endfor + +.for fn in ${CPP_WITH_UTIL} +${fn}: ${BBSBASE} ${fn}.cc ${UTIL_OBJS} + $(CCACHE) ${CXX} ${CFLAGS} ${LDFLAGS} -o ${fn} ${UTIL_OBJS} ${fn}.cc $(LIBS) +.endfor + +.for fn in ${MBBSD_OBJS} +util_${fn}.o: ${BBSBASE} $(SRCROOT)/mbbsd/${fn}.c + $(CCACHE) ${CC} ${CFLAGS} -D_BBS_UTIL_C_ -c -o $@ $(SRCROOT)/mbbsd/${fn}.c +.endfor + +install: $(PROGS) + install -d $(BBSHOME)/bin/ + install -c -m 755 $(PROGS) $(BBSHOME)/bin/ + +clean: + rm -f *.o $(CPROGS) $(CPROG_WITH_UTIL) $(CPROG_WITHOUT_UTIL) $(CPP_WITH_UTIL) + diff --git a/trans/sob_trans.c b/trans/sob_trans.c new file mode 100644 index 00000000..bc92c095 --- /dev/null +++ b/trans/sob_trans.c @@ -0,0 +1,113 @@ +/* $Id$ */ +/* tool to convert sob bbs to ptt bbs, based on sob 20030803 pack */ + +#include "bbs.h" + +typedef struct { + char filename[32]; + char pad1[2]; + char owner[14]; + char date[6]; + char title[73]; + unsigned char filemode; +} sob_fileheader_t; + +#define SOB_FILE_MARKED 0x02 + +int convert(const char *oldpath, char *newpath) +{ + int fd; + char *p; + char buf[PATHLEN]; + sob_fileheader_t whdr; + fileheader_t fhdr; + + setadir(buf, oldpath); + + if ((fd = open(buf, O_RDONLY, 0)) == -1) + return -1; + + while (read(fd, &whdr, sizeof(whdr)) == sizeof(whdr)) { + snprintf(buf, sizeof(buf), "%s/%s", oldpath, whdr.filename); + + if (dashd(buf)) { + /* folder */ + stampdir(newpath, &fhdr); + + convert(whdr.filename, newpath); + } + else { + /* article */ + stampfile(newpath, &fhdr); + + fhdr.modified = dasht(buf); + if (whdr.filemode & SOB_FILE_MARKED) + fhdr.filemode | FILE_MARKED; + + copy_file(buf, newpath); + } + + p = strrchr(newpath, '/'); + *p = '\0'; + + strlcpy(fhdr.title, whdr.title, sizeof(fhdr.title)); + strlcpy(fhdr.owner, whdr.owner, sizeof(fhdr.owner)); + strlcpy(fhdr.date, whdr.date, sizeof(fhdr.date)); + + setadir(buf, newpath); + append_record(buf, &fhdr, sizeof(fhdr)); + } + + close(fd); + return 0; +} + +int main(int argc, char *argv[]) +{ + char buf[PATHLEN]; + char *path; + char *board; + int opt; + int trans_man = 0; + + while ((opt = getopt(argc, argv, "m")) != -1) { + switch (opt) { + case 'm': + trans_man = 1; + break; + default: + fprintf(stderr, "%s [-m] \n", argv[0]); + fprintf(stderr, " -m convert man (default is board)\n"); + } + } + + if ((argc - optind + 1) < 2) { + fprintf(stderr, "%s [-m] \n", argv[0]); + fprintf(stderr, " -m convert man (default is board)\n"); + return 0; + } + + path = argv[optind]; + board = argv[optind+1]; + + if (!dashd(path)) { + fprintf(stderr, "%s is not directory\n", path); + return 0; + } + + if (trans_man) + setapath(buf, board); + else + setbpath(buf, board); + + if (!dashd(buf)) { + fprintf(stderr, "%s is not directory\n", buf); + return 0; + } + + attach_SHM(); + + convert(path, buf); + + return 0; +} diff --git a/trans/transman.c b/trans/transman.c new file mode 100644 index 00000000..711e8ead --- /dev/null +++ b/trans/transman.c @@ -0,0 +1,56 @@ +/* $Id$ */ +// tools to translate the format of eagle bbs -> Ptt bbs */ + +#include "bbs.h" + +int transman(char *path) +{ + char name[128]; + char buf[512], filename[512], *direct=""; + int n=0; + fileheader_t fh; + FILE *fp; + + chdir(path); + + fp = fopen(".Names", "r"); + if(fp) + for(n=0; fgets(buf,512,fp)>0; n++) + { + strtok(buf,"\r\n"); + if(buf[0]=='#') continue; + if(buf[0]=='N') + strcpy(name, buf+5); + else + if(buf[0]=='P') + { + direct = buf+7; + strcpy(filename, "."); + stampfile(filename, &fh); + unlink(filename); + if(dashd(direct)) + { + sprintf(fh.title, "◆ %s", name); + transman(direct); + } + else + sprintf(fh.title, "◇ %s", name); + rename(direct, filename); + append_record(".DIR", &fh, sizeof(fh)); + } + } + chdir(".."); + return n; +} + +int main(int argc, char* argv[]) +{ + if(argc < 2) + { + printf("%s \n", argv[0]); + return 0; + } + + transman(argv[1]); + return 0; +} diff --git a/trans/wretch_man.c b/trans/wretch_man.c new file mode 100644 index 00000000..d055980d --- /dev/null +++ b/trans/wretch_man.c @@ -0,0 +1,124 @@ +/* $Id$ */ +/* tool to convert wretch bbs to ptt bbs */ + +#include "bbs.h" + +struct wretch_fheader_t { + time4_t chrono; + char pad[4]; + int xmode; + int xid; + char xname[32]; /* 檔案名稱 */ + char owner[80]; /* 作者 (E-mail address) */ + char nick[50]; /* 暱稱 */ + char date[9]; /* [96/12/01] */ + char title[72]; /* 主題 (TTLEN + 1) */ + char score; + char pad2[4]; +}; + +#define POST_MARKED 0x00000002 /* marked */ +#define POST_BOTTOM1 0x00002000 /* 置底文章的正本 */ + +#define GEM_RESTRICT 0x0800 /* 限制級精華區,須 manager 才能看 */ +#define GEM_RESERVED 0x1000 /* 限制級精華區,須 sysop 才能更改 */ +#define GEM_FOLDER 0x00010000 /* folder / article */ +#define GEM_BOARD 0x00020000 /* 看板精華區 */ + +static const char radix32[32] = { + '0', '1', '2', '3', '4', '5', '6', '7', + '8', '9', 'A', 'B', 'C', 'D', 'E', 'F', + 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', + 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', +}; + +char *path; +char *board; + +int transman(char *fname, char *newpath) +{ + int fd; + char *p; + char buf[PATHLEN]; + struct wretch_fheader_t whdr; + fileheader_t fhdr; + + if (fname[0] == '.') + snprintf(buf, PATHLEN, "%s/%s", path, fname); + else + snprintf(buf, PATHLEN, "%s/%c/%s", path, fname[7], fname); + + if ((fd = open(buf, O_RDONLY, 0)) == -1) + return -1; + + while (read(fd, &whdr, sizeof(whdr)) == sizeof(whdr)) { + if (strcmp(whdr.xname, "..") == 0 || strchr(whdr.xname, '/')) + continue; + + if (!(whdr.xmode & 0xffff0000)) { + /* article */ + stampfile(newpath, &fhdr); + strlcpy(fhdr.title, "◇ ", sizeof(fhdr.title)); + + if (whdr.xname[0] == '@') + snprintf(buf, sizeof(buf), "%s/@/%s", path, whdr.xname); + else + snprintf(buf, sizeof(buf), "%s/%c/%s", path, whdr.xname[7], whdr.xname); + + copy_file(buf, newpath); + } + else if (whdr.xmode & GEM_FOLDER) { + /* folder */ + stampdir(newpath, &fhdr); + strlcpy(fhdr.title, "◆ ", sizeof(fhdr.title)); + + transman(whdr.xname, newpath); + } + + p = strrchr(newpath, '/'); + *p = '\0'; + + if (whdr.xmode & 0x0800) + fhdr.filemode |= FILE_BM; + + strncat(fhdr.title, whdr.title, sizeof(fhdr.title) - strlen(fhdr.title) - 1); + strlcpy(fhdr.owner, whdr.owner, sizeof(fhdr.title)); + + setadir(buf, newpath); + append_record(buf, &fhdr, sizeof(fhdr)); + } + + close(fd); + return 0; +} + +int main(int argc, char *argv[]) +{ + char buf[PATHLEN]; + + if (argc < 2) { + printf("%s \n", argv[0]); + return 0; + } + + path = argv[1]; + board = argv[2]; + + if (!dashd(path)) { + printf("%s is not directory\n", path); + return 0; + } + + setapath(buf, board); + + if (!dashd(buf)) { + printf("%s is not directory\n", buf); + return 0; + } + + attach_SHM(); + + transman(".DIR", buf); + + return 0; +} -- cgit v1.2.3