唉,问了没人答我,还是自己做了..因为原来那个BBS是用FB3GB的,而且又没带
GB<->BIG5的转换,现在要加这个功能,又不想用FB2000,只好这样了
给FB3.0GB版(未带GB<->BIG5转换)添加GB<->BIG5码转换
使用程序: 由FB2000中的GB<->BIG5码转换程序改进.
实现方式: 大致是分别增加一个read2()与一个write2()函数,
如果用户使用BIG5码时,在程序进行输入输出是使用read2()与write2()
进行转换.其中read2()是先使用read()然后经转码成后再返回结果,
而write2()是把要内容转码后再用write()进行操作.
实现步骤:
1. 为方便以后方便决定是否使用此功能
在include/function.h中增加以下内容:
#define ALLOWSWITCHCODE
2. 在main.c中增加:
#ifdef ALLOWSWITCHCODE
int convcode = 0; // 为0是使用GB码,1时使用BIG5码
extern void resolve_GbBig5Files();
#endif
在函数login_query()中:
在要求输入用户名的那个 getdate()后增加:
// 判断用户是否使用BIG5码
#ifdef ALLOWSWITCHCODE
if (strlen(uid)>1 && uid[strlen(uid)-1]=='.') {
id[strlen(uid)-1]='\0';
convcode = 1;
}
#endif
在main()中:
在load_sysconf();一行后增加:
// 初始化用于转换的数组
#ifdef ALLOWSWITCHCODE
resolve_GbBig5Files();
#endif
3. 在io.c中增加
增加resolve_GbBig5Files(),read2()和write2()这三个函数
源程序可在FB2000的io.c中copy,但
resolve_GbBig5Files()中一行:
BtoG = (unsigned char *)attach_shm("CONV_SHMKEY", 3013,GtoB_count*2+Bto
G_count*2);
需改为:
BtoG = (unsigned char *)malloc(GtoB_count*2+BtoG_count*2);
原因不明,应该是那个FB2000内存分配的函数有点问题.
在io.c中所有使用read()与write()这两个函数前加类似下面的东东:
#ifdef ALLOWSWITCHCODE
if(convcode) write2(0, outbuf, size);
else
#endif
就是将read();改成
if (convcode) read2();
else read();
这样.函数参数一样
4. 重新编译
停止BBS服务,用bbs的帐号:
$ make clean
$ make
$ make update
最后再启动BBS服务
--
FROM 172.28.114.31