summaryrefslogtreecommitdiffstats
path: root/trans
diff options
context:
space:
mode:
authorwens <wens@63ad8ddf-47c3-0310-b6dd-a9e9d9715204>2008-05-25 12:05:26 +0800
committerwens <wens@63ad8ddf-47c3-0310-b6dd-a9e9d9715204>2008-05-25 12:05:26 +0800
commitff7ae115c5db1fe56f3c6114bf08ed8ecf0c9847 (patch)
treed80531d82774d0c8d340f760968dba13a3d11d07 /trans
parent983c3a4eefe0366ac29cd0ad90a859774500302c (diff)
downloadpttbbs-ff7ae115c5db1fe56f3c6114bf08ed8ecf0c9847.tar
pttbbs-ff7ae115c5db1fe56f3c6114bf08ed8ecf0c9847.tar.gz
pttbbs-ff7ae115c5db1fe56f3c6114bf08ed8ecf0c9847.tar.bz2
pttbbs-ff7ae115c5db1fe56f3c6114bf08ed8ecf0c9847.tar.lz
pttbbs-ff7ae115c5db1fe56f3c6114bf08ed8ecf0c9847.tar.xz
pttbbs-ff7ae115c5db1fe56f3c6114bf08ed8ecf0c9847.tar.zst
pttbbs-ff7ae115c5db1fe56f3c6114bf08ed8ecf0c9847.zip
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
Diffstat (limited to 'trans')
-rw-r--r--trans/Makefile62
-rw-r--r--trans/sob_trans.c113
-rw-r--r--trans/transman.c56
-rw-r--r--trans/wretch_man.c124
4 files changed, 355 insertions, 0 deletions
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] <path> <board>\n", argv[0]);
+ fprintf(stderr, " -m convert man (default is board)\n");
+ }
+ }
+
+ if ((argc - optind + 1) < 2) {
+ fprintf(stderr, "%s [-m] <path> <board>\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 <path>\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 <path> <board>\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;
+}