这个词典不是 SMTH 默认带的那个词典程序,而是 FB2K 中比较常用的 CDICT5 至于 FB2K
的效果可以看小百合站,如果要看安装在 SMTH 上的效果可以看我们的站 bbs.neu.edu.cn
词典的工作原理或者说外挂的工作应该应该是这个样子。
先在 menu.ini 中定义调用哪个动作,然后这个动作再去系统中寻找函数。然后函数在调用
外挂程序,反正词典应该是这个样子的。
所以,首先要在 menu.ini 在合适的地方增加:
@ExecDict 0, 0, 0,"Dict", "D) 英汉汉英字典"
一般都是放在特别服务区里。
然后,在你的 $BBSSRC/src/ 下修改两个文件:comm_list.c 和 xyz.c
打开 comm_list.c 在合适的地方增加定义
src/comm_lists.c:int x_dict();
src/comm_lists.c: {"ExecDict", x_dict},
第一个是定义 x_dict 函数,第二个应该是定义在 menu.ini 中 ExecDict 动作是调用 x_dict 函数用的。
然后打开 xyz.c 开始写函数,这个函数的工作方法是这个样子的。
首先在运行,然后输出一堆欢迎信息,然后让你输入东西,完了判断字符串是否合法,然后使用 system() 函数提交给外挂处理。外挂将程序的执行结果按照一定的文件名格式输出到
tmp/dict.userid.pid
x_dict 程序再判断 使用 file_size 函数(这个函数我不知道SMTH默认是否有带,我自己加了一个)判断 tmp/dict.userid.pid 文件是否为空,如果为空就是什么结果都没有,如
果不为空,就使用 ansimore 函数把文件信息显示出来。然后再调用 mail_file 函数发会信箱
我把我的 xyz.c 中的定义贴出来吧(不过BBS实在不适合贴代码啊)。
这样BBS的修改部分就好了,然后去找一个 CDICT 程序,安装好放到 $BBSHOME 下就可以了
然后测试一下是否可以正常运行。
$/home/bbs/cdict/cdict english
如果返回词典结果,就说明工作没问题了。如果有问题,一般可能会提示:
1,词典安装的时候路径不对,没办法输出结果。
2,词典目录下不存在 Index.gdbm 文件,反正就是提示什么改什么咯。
另外,你也可能根据我的 xyz.c 中的两个函数根据自己需要修改 x_dict 中cdict 执行程序的位置。
另外提醒一点,不可以直接复制FB2K的程序,因为FB2K中的程序有几个函数的参数和SMTH的参数个数不一样哦。你也可以根据程序的错误提示改哦,我就是这么做的。
//放到 xyz.c 好放的地方,呵呵。
/* add by wuweixin dict 2004.9.20 */
//这两个关于 YEA 和 NA 的定义底下要用到
#define YEA (1)
#define NA (0)
//这个函数基本不用修改
int file_size(char *file) {
FILE *fp;
char buf[256];
int i, size, size2=0;
size=0;
fp=fopen(file, "r");
if(fp==0) return 0;
if (fgets(buf, 255, fp)==0) return 0;
while(1) {
if(fgets(buf, 255, fp)==0) break;
for(i=0; buf[i]; i++) if(buf[i]<0) size2++;
size+=strlen(buf);
}
fclose(fp);
return size;
}
//这个是主要函数
void x_dict(){
char buf[STRLEN],newbuf[STRLEN];
unsigned char *s;
int c;
modify_user_mode(DICT);
while(1) {
clear();
prints("\n _____ __ __ __");
prints("\n | \\|__|.----.| |_|__|.-----.-----.---.-.----.--.--.");
prints("\n | -- | || __|| _| || _ | | _ | _| | |");
prints("\n |_____/|__||____||____|__||_____|__|__|___._|__| |___ |");
prints("\n |_____|");
prints("\n\n\n欢迎使用白山黑水站的字典。");
prints("\n\n本字典 CDICT5.0 收录单词近 40000 , 一般较常见的均已收录,");
prints("\n但不能查词组以及各类专业词汇. 中英文输入均可, 支持'*'后缀.");
prints("\n\n请输入您欲翻查的英文字或中文字, 或直接按 <ENTER> 取消。");
getdata(15, 0, "请输入要查询的中英文单词:", buf, 30, DOECHO, NULL, YEA);
if (buf[0] == '\0') {
return;
}
for (s = buf; *s != '\0'; s++) {
c=toupper(*s);
if(c>='A' && c<='Z') continue;
if(c>=160 && c<=254) continue;
if(c=='.' || c=='*') continue;
prints("\n输入错误!");
pressanykey();
return;
}
//主要改动可能就是底下的拉。词典的运行路径
sprintf(newbuf, "cdict/cdict %s > tmp/dict.%s.%05d", buf, currentuser->userid,uinfo.pid);
system( newbuf );
sprintf(buf, "tmp/dict.%s.%05d", currentuser->userid, uinfo.pid);
sprintf(newbuf, "%s/%s", BBSHOME, buf);
if (file_size(newbuf)!=0) {
ansimore(buf, YEA);
if (askyn("要将结果寄回信箱吗", NA) == YEA)
mail_file("deliver", buf, currentuser->userid, "词典查询结果", 0, 0);
unlink(buf);
}
else
{
prints("\n\n怎么什么也没找到呢.....\n\n可能是输错了,再来一次:)");
unlink(buf);
pressanykey();
}
}
}
--
修改:wuweixin FROM 202.118.1.*
FROM 219.216.80.*