作者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;
}
--
□ 本文章由 itoc 從 itoc.Dorm11.NCTU.edu.tw 發表