看板SetupBBS
标 题patch -- SOB-PACK 避免 currboard 随看板一览而变更
发信站亚特兰提斯 (Sun Aug 3 19:04:04 2003)
转信站ptt!ctu-reader!ctu-peer!news.nctu!news.csie.ncyu!news.cs.nthu!Atlantis
// 本篇 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 [email protected] 利用暂存阵列 */
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