修改的代码改动比较大,所以我这里只是简单谈一下思路:)
置顶/置底文件是按照.DIR的格式存储的,放在每个版目录下的 .TOP 中
每次进版的时候将.TOP文件内容读入一个单向链表中,由全局变量top_list指向其头节点
struct top_filelist{
struct fileheader ent;
struct top_filelist *next;
};
修改了fileheader结构,加入istop属性,从.TOP读入的istop=1,其他的istop=0(后面会
用到)
为了让用户同时能够置顶/置底, 引入全局变量
top_file_num(置顶数)
end_file_num(置底数)
在读入.TOP文件的时候初始化
如果用户选择的是置底(在用户的个人参数中设定),那么
首先在read.c中修改last_line(版面文章的文章总数)为:
last_line = get_num_records(currdirect, ssize) + end_file_num;
(请注意,这里只是一个表示值,而非真实文章数量)
在 record.c中的get_records()函数加入
if (!DEFINE(DEF_SHOWATTOP)) {
ptr = top_list;
while ((ptr) && (n < size*number)) {
memcpy(&rptr[n], &(ptr->ent), size);
ptr = ptr->next;
n+=size;
}
}
这样数据就会被直接插入到末尾
接下来就是显示问题,修改bbs.c
if (ent->accessed[0] & FILE_TOP) {
type = '#';
if (ent->istop == 1) { // 这就是刚才引入istop的原因之一
if (!strncmp("Re: ", ent->title, 4)) {
sprintf(buf,
" ^[[1;33m[置底]^[[m ^[[37m%s%-12.12s%s ^[[37m%cRe: %s",
file_owner_color, ent->owner, date, isPIC,
&TITLE[4]);
} else {
sprintf(buf,
" ^[[1;33m[置底]^[[m ^[[37m%s%-12.12s%s ^[[37m%c?? %s",
file_owner_color, ent->owner, date, isPIC, TITLE);
}
这样就可以显示置底文章了。
在bbs.c中的del_post, digest_post, mark_post 中都要加入一行代码:
if (fileinfo->istop) // 这就是引入istop的原因之二
return DONOTHING;
防止对置底帖子进行操作。
为了人性话,再打开read.c修改
case KEY_END:
if (last_line >= locmem->top_line + screen_len) {
locmem->top_line = last_line - screen_len + 1;
if (locmem->top_line <= 0)
locmem->top_line = 1;
locmem->crs_line = last_line - end_file_num;
return PARTUPDATE;
}
RMVCURS;
+ if (locmem->crs_line == (last_line - end_file_num))
+ locmem->crs_line = last_line;
+ else
+ locmem->crs_line = last_line - end_file_num; //置底修正一下
PUTCURS;
break;
这样做的作用是用户第一次按END的时候,光标移动到最后一片帖子(且在置底帖子前)
再按一次就会跳到置底帖子的最后一篇,第三次按就重复跳到最后一篇帖子,依此类推。
下面再说说置顶的实现,我改动的地方很多,因为不光要处理PG_UP, PG_DN, UP, DOWN
等按键,还要考虑到command table的映射关系...
我的做法是将整个坐标系向下移动top_file_num个单位,这样用户就可以每个屏幕都看到
置顶贴了,这里要解决的问题就是怎么看到置顶贴。 我们单独处理UP函数,允许其位置
为负值 (locmem->top_line > -top_file_num) ,在第一篇置顶帖子处按UP导致的翻页,
在最后一篇帖子处按DOWN导致翻页都要相应的做一些修正。这里就不一一贴出来了。
有兴趣的同学可以来一网深情(bbs.uestc.edu.cn)看看,帮忙找找虫子:)
代码放在
http://bbs.uestc.edu.cn/download/bbssrc_snap.tgz(不定期打包 HOHO~)
--
FROM 202.112.14.