回文章列表
作者allen501pc.bbs@bbs.sa.ncyu.edu.tw (靜養中..) 看板: itoc
標題Re: [問題]看板合併?
時間新綠園 (2007/03/16 Fri 22:08:42)
※ 引述《itoc.bbs@cpu.tfcis.org (核心動力)》之銘言:
> ───────────────────────────────────────
> ※ 引述《allen501pc.bbs@bbs.sa.ncyu.edu.tw (靜養中..)》之銘言:
> > 我管的站裡面目前有3個看板需要合併成一個看板,話說直接把brd/XXX的東西移過去
> > 是不行的吧? 那麼還要修改什麼?
>   ~/bin/mergebrd A B C D
>   將 A B C D 四個板合併成 A 板  (A 板可以是新成立的板,或是已經存在的板)
> : src/util/Makefile
> EXE =   ... mergebrd
> : src/util/mergebrd.c 新增程式如下
> /*-------------------------------------------------------*/
> /* util/mergebrd.c      ( NTHU CS MapleBBS Ver 3.10 )    */
> /*-------------------------------------------------------*/
> /* target : merge several boards into one board          */
> /* create : 07/03/16                                     */
> /* update :   /  /                                       */
> /*-------------------------------------------------------*/
> /* syntax : mergebrd dst src1 [src2 src3 ...]            */
> /*-------------------------------------------------------*/
> #include "bbs.h"
> static int
> is_board(brdname)
>   char *brdname;
> {
>   BRD brd;
>   int fd;
>   int rc = 0;
>   if ((fd = open(FN_BRD, O_RDONLY)) >= 0)
>   {
>     while (read(fd, &brd, sizeof(BRD)) == sizeof(BRD))
>     {
>       if (!strcmp(brdname, brd.brdname))
>       {
>         rc = 1;
>         break;
>       }
>     }
>     close(fd);
>   }
>   return rc;
> }
> static int
> merge_board(src, dst)
>   char *src, *dst;
> {
>   int i;
>   char x;
>   char fnew[64], fold[64];
>   char cmd[256];
>   if (!strcmp(src, dst))
>   {
>     printf("不能將同一板合併\n");
>     return 0;
>   }
>   if (!is_board(src))
>   {
>     printf("沒有 %s 這板!\n", src);
>     return 0;
>   }
>   for (i = 0; i < 32; i++)
>   {
>     x = radix32[i];                       /* @/ 拋棄 */
>     sprintf(fold, "brd/%s/%c/*", src, x);
>     sprintf(fnew, "brd/%s/%c/", dst, x);
>     sprintf(cmd, "cp %s %s", fold, fnew); /* 假設沒有同樣檔名的。若有會覆蓋 */
>     system(cmd);
>   }
>   brd_fpath(fold, src, FN_DIR);
>   brd_fpath(fnew, dst, FN_DIR);
>   sprintf(cmd, "cat %s >> %s", fold, fnew);
>   system(cmd);
>   return 1;
> }
> static int
> hdr_cmp(a, b)
>   HDR *a;
>   HDR *b;
> {
>   return a->chrono - b->chrono;
> }
> int
> main(argc, argv)
>   int argc;
>   char *argv[];
> {
>   int i, num;
>   char *src, *dst;
>   char folder[64];
>   if (argc < 3)
>   {
>     printf("Usage: %s dst src1 [src2 src3 ...]\n", argv[0]);
>     return -1;
>   }
>   chdir(BBSHOME);
>   dst = argv[1];
>   if (!is_board(dst))
>   {
>     printf("沒有 %s 這板!\n", brdname);
>     return -1;
>   }
>   num = 0;
>   for (i = 2; i < argc; i++)
>   {
>     src = argv[i];
>     printf("開始將 %s 板合併到 %s 板內\n", src, dst);
>     num += merge_board(src, dst);
>   }
>   if (num > 0)
>   {
>     brd_fpath(folder, dst, FN_DIR);
>     rec_sync(fpath, sizeof(HDR), hdr_cmp, NULL);
>     printf("%d 個板合併成功\n", num);
>   }
>   return 0;
> }

非常感謝itoc大的熱心回應,小弟感激不盡<(_ _)>
--
  ╒═╕
  ║  ║║║           過方知
  ╠═╣║║╓═┐╭─╮
  ║  ║║║╠═╜║  ║    過方知
    ║║║╰─╯│  

--
    ╭─ Origin ─╗ 新綠園  bbs.sa.ncyu.edu.tw  ~ κλμ ─┤
    ├   Author   ╡ 220-129-162-7.dynamic.hinet.net       
文章選讀←離開[主題上]主題下(k)上篇(j)下篇S/a搜尋 G串列 TAB精華 ↑↓捲 Pg/Space翻