// 本篇 patch 來自 Terry (frequency.twbbs.org) 兄的建議 內容提到 SOB 家族在
// 看板一覽或是新文章列表時 右上角的閱讀中看板會隨著翻頁而不斷改變其值 造成
// 閱文的不便 (我是覺得再多個 select 動作就好 ...) 所以做此 patch
// 請注意此 patch 雖適用於 SOB 家族 但是因為是以我先日釋出的 SOB-PACK 為修改
// 基準 可能會與各位友站的 Code 不盡相同 請參照修改 勿直接照抄
// src/maple/bbs.c
int Read() {
int mode0 = currutmp->mode;
int stat0 = currstat;
char buf[40];
boardheader *bp;
setutmpmode(READING);
if(!(bp = getbcache(currboard))) return 0; /* 避免無此看板造成溢位錯誤 */
set_board();
...
brc_initial(currboard); /* 避免 v 文後 boardstat 未更新 */
i_read(READING, buf, readtitle, readdoent, read_comms);
brc_update(currboard); /* 變更 brc_update() 函式型別 */
currutmp->mode = mode0;
currstat = stat0;
return 0;
}
// src/maple/board.c
extern int numboards;
extern boardheader *bcache;
char tmpcurrboard[IDLEN+1];
typedef struct {
int pos, total;
char *name, *title, *BM;
uschar unread, zap, bvote;
} boardstat;
void brc_update(char *brdname) {
...
while(tmp < &tmp_buf[tmp_size] && (*tmp >= ' ' && *tmp <= 'z')) {
tmp = brc_getrecord(tmp, tmp_name, &tmp_num, tmp_list);
if(strncmp(tmp_name, brdname, BRC_STRLEN))
ptr = brc_putrecord(ptr, tmp_name, tmp_num, tmp_list);
}
...
}
int brc_initial(char *boardname) {
char dirfile[STRLEN], *ptr;
int fd;
if(strcmp(currboard, boardname) == 0) return brc_num; /* 避免誤判 */
brc_update(boardname);
/* Dopin: idea by Terry.bbs@frequency.twbbs.org 利用暫存陣列 */
strcpy(tmpcurrboard, boardname);
if(brc_buf[0] == '\0') {
...
while(ptr < &brc_buf[brc_size] && (*ptr >= ' ' && *ptr <= 'z')) {
ptr = brc_getrecord(ptr, brc_name, &brc_num, brc_list);
if(strncmp(brc_name, tmpcurrboard, BRC_STRLEN) == 0) {
strcpy(tmpcurrboard, currboard);
return brc_num;
}
}
...
strcpy(tmpcurrboard, currboard);
return 1;
}
static void choose_board(int newflag) {
...
case 'v':
case 'V':
...
brc_num = brc_changed = 1;
brc_update(ptr->name);
if(newflag) show_brdlist(head, 0, 1);
break;
case KEY_RIGHT:
case '\n':
case '\r':
case 'r':
{
char buf[STRLEN];
ptr = &nbrd[num];
strcpy(currboard, ptr->name);
brc_initial(ptr->name);
...
}
void force_board(char *brdname) {
...
strcpy(currboard, ptr->name); /* 讓 Read() 少傳引數 */
while(check_newpost(ptr) && ptr->unread) {
clear();
move(10, 15);
prints("*[1;37;41m %s 看板有新文章! 請讀完後再離開... *[m", brdname);
pressanykey();
if(Read()) return; /* 若看板閱讀過程有誤則跳離 避免無窮迴圈 */
}
}
// src/maple/main.c / src/maple/mbbsd.c
static void user_login() {
...
{
brc_initial(DEFAULT_BOARD);
set_board(); /* 已有 force_board() 初始化看板 不需多跑 */
}
}
// 本 patch 雖經測試 但尚不敢保證正確性一定完全沒問題 請備份好原來的程式後再
// 做修正 相關原始碼在 ftp://ftp.ats.idv.tw/pub/SOB/sob_20030803_pack.tgz
--
Origin: Atlantis DN: bbs.ats.idv.tw IP : 203.73.231.195 ST: atlantis