回精華區
作者itoc, 信區: itoc
標題[功能] edit.c "--" 以下的東西全部無法修改
時間03/07/27
作者: itoc (風調雨順,國泰民安) 看板: plan
標題: [功能] "--" 以下的東西全部無法修改
時間: Sun Jul 27 01:26:18 2003                          Updated: 2005/06/30

※ 引述《xeon.bbs@xeon.tfcis.org (Xeon Chen)》之銘言:
> "--" 以下的東西全部無法修改

  1. 推文後,作者可以修改文章,但不能修改推文
  2. 歷次修改的時間記錄均會保留下來

: modes.h

#define EDIT_ANONYMOUS  0x10    /* 匿名模式 */
#define EDIT_RESTRICT   0x20    /* 加密存檔 */
+ #define EDIT_MODIFYPOST 0x40    /* 禁止修改 -- 以下的文字 */

: post.c:post_edit()

  /* 原作者修改 */
  else if (!strcmp(hdr->owner, cuser.userid) && HAS_PERM(PERM_POST))
  {
+   curredit = EDIT_MODIFYPOST;
    if (!vedit(fpath, 0))       /* 若非取消則加上修改資訊 */
    {
      if (fp = fopen(fpath, "a"))
      {
        ve_banner(fp, 1);
        fclose(fp);
      }
    }
+   curredit = 0;

: edit.c

typedef struct textline
{
  struct textline *prev;
  struct textline *next;
+ char startq;              /* 1: -- 開始 */
  int len;
  uschar data[ANSILINELEN];
}       textline;

: edit.c:ve_forward()

  while (n--)
  {
-   if (!(tmp = cur->next))
+   /* itoc.030727: PGDN 翻頁最多移到 -- 開始 */
+   if (!(tmp = cur->next) || cur->startq)
      break;

: edit.c:ve_alloc()

  if (p = (textline *) malloc(sizeof(textline)))
  {
    p->prev = NULL;
    p->next = NULL;
+   p->startq = 0;
    p->len = 0;
    p->data[0] = '\0';
    return p;
  }

: edit.c:ve_load()

  uschar *str;
  textline *next;
+ textline *tmp;

  next = this->next;
+ tmp = this;

  mgets(-1);

  while (str = mgets(fd))
  {
    this = ve_line(this, str);

+   /* itoc.030727: -- 開始 */
+   if ((curredit & EDIT_MODIFYPOST) && !strcmp(str, "--"))
+   {
+     /* 找最後一個 "--" */
+     tmp->startq = 0;
+     tmp = this;
+     this->startq = 1;
+   }
  }

: edit.c:tbf_read()

static inline void
tbf_read()
{
  int fd;
  char fpath[80];

+ /* itoc.030727: -- 開始以後便不能載入暫存檔 */
+ if (vx_cur->startq)
+   return;

: edit.c:vedit() 的註解

/* ----------------------------------------------------- */
/* ve_op:                                                */
/*  0 => 純粹編輯檔案                                    */
/* -1 => 編輯但不能儲存,用在編輯作者不是自己的文章      */
/*  1 => 引文、加簽名檔,並加上檔頭,用在發表文章/站內信 */
/*  2 => 引文、加簽名檔,不加上檔頭,用在寄站外信        */
/* ----------------------------------------------------- */
/* 若 ve_op 是 1 或 2 時,進入 vedit 前還得指定 curredit */
+ /* 若 ve_op 是 0,若要禁止修改 -- 以下的文字,進入 vedit */
+ /* 前還得指定 curredit 為 EDIT_MODIFYPOST                */
/* ----------------------------------------------------- */

: edit.c:vedit()

    cc = vkey();

+   if (vln->startq)
+   {
+     /* itoc.030727: -- 開始以後,只能按以下按鍵 */
+     if (cc != KEY_INS && cc != KEY_LEFT && cc != KEY_UP &&
+       cc != Ctrl('P') && cc != KEY_PGUP && cc != Ctrl('B') &&
+       cc != KEY_PGDN && cc != Ctrl('F') && cc != Ctrl('O') &&
+       cc != Ctrl('T') && cc != Ctrl('S') && cc != Ctrl('V') &&
+       cc != Ctrl('X') && cc != Ctrl('Z'))
+     goto ve_key;
+   }

: edit.c:vedit()

      case Ctrl('O'):           /* delete to end of file */

        /* vln->len = ve_col = cc = 0; */
        tmp = vln->next;
        vln->next = NULL;
        while (tmp)
        {
-         vln = tmp->next;
-         free(tmp);
-         tmp = vln;
+         textline *tmp2;
+         /* yiting: 若下一行是"--",則把它接到目前這行的下面 */
+         if ((curredit & EDIT_MODIFYPOST) && (tmp->startq))
+         {
+           vln->next = tmp;
+           tmp->prev = vln;
+           break;
+         }
+         tmp2 = tmp->next;
+         free(tmp);
+         tmp = tmp2;
        }
        ve_mode = mode | VE_REDRAW;
        continue;

: edit.c:ve_edit()

      case Ctrl('D'):
      case KEY_DEL:             /* delete current character */

        cc = vln->len;
        if (cc == col)
        {
+         /* 若下行是 --,不能 DEL */
+         if ((curredit & EDIT_MODIFYPOST)&&(tmp = vln->next)&&(tmp->startq))
+           goto ve_key;
          join_up(vln);
          ve_mode = mode | VE_REDRAW;
        }


--
□ 本文章由 itocitoc.Dorm11.NCTU.edu.tw 發表
精華選讀←離開[主題上]主題下(k)上篇(j)下篇S/a搜尋 G串列 TAB精華 ↑↓捲 Pg/Space翻