firebird 系统判断是否为同一主题采用的是比较标题的方法,
这样如果标题一样就认为是同一主题了,很明显, 这种算法存在误判断.
原来使用的是全局变量 ReadPost 和 ReplyPost, 在 bbs.c 的 setqtitle() 中,
现在定义另外一全局变量: unsigned char ext_acc[12];
而把 setqtitle() 改为:
void setqtitle(char *accessed)
{
FFLL = 1;
memcpy(ext_acc, accessed, 12);
}
也就是利用 struct fileheader {} 中的 accessed[] 来判断同主题,
令 struct fileheader info1, info2;
现在要判断的是 info1, info2, 在我的代码中是:
若 accessed[4] == 1 , 则为同主题第一篇.
若 accessed[4] == 0 , 则为其它同主题.
若 !strncmp(info1.accessed + 6, info1.accessed + 6, 5) 为真,
则 info1 和 info2 为同一主题.
RE 文章的时候 accessed + 6 与被Re的文章相同,
新发表的文章要设置一个唯一的 accessed + 6 ,
我想到了用时间来表示, 所以使用了下面的函数:
__128(char *s)
{
char *p = s;
time_t t = time(NULL);
while(t){
*p++ = t % 128;
t = t / 128;
}
}
假定要发表的文章为 struct fileheader postfile , 要先进行:
postfile.accessed[4] = 1;
__128(postfile.accessed + 6);
改动还算比较烦, 比如 search_articles() 要增加一参数 char *accessed , 等等.
以上只是我用的算法, 写出来让大家改进改进, :)
--