- 注册时间
- 2004-8-30
- 最后登录
- 1970-1-1
|
发表于 2006-7-18 23:46:00
|
显示全部楼层
晕,我的本意是让开源让大家使用的...
不是再次拿来做函数的....
更完美的函数输入函数其实我已经做好了,
并被应用到了
Visual Lavo窗体系统中TextBox中,暂时受Lavo大赛限制,不能开源...
===============
System_WB2GB有个bug,我已经改了,但没有上传,就先贴在这里吧
- long System_WB2GB(int id,long ims,long buf,int bufsize)
- //返回值低16位:实际取词个数
- //返回值高16位:最大取词个数
- //id :取词的序数,从0开始
- //ims:待查找的五笔码
- //buf:返回五笔码对应的字词
- //bufsize:缓存区大小,强烈建议直接用sizeof(数组名)
- {
- struct TABLE_P1 Addr;
- struct TABLE_P2 Tab2;
- int max,num,len,i;
- long pos,pos0;
- char p1,p2;
- char wbs[5];
- char fds[MAX_FINDSTR];
- // *buf=0;
- if(id<0) return -1;
- len=strlen(ims);
- if(len<=0 | len>4) return -1;//五笔码长度越界
- for(i=0;i<len;i++)
- {//预处理编码
- wbs[i]=tolower(*ims++);
- if(!islower(wbs[i])) return -1;
- }
- wbs[i]=0;
- #ifdef USE_QUEWEI
- if(wbs[0]=='v' & isdigit(wbs[1]))
- {//进入区位查找
- if(System_QW2GB(&wbs[1],buf)==-1)
- return -1;
- else
- return 0x00010001;
- }
- #endif
- p1=wbs[0]-'a';
- p2=wbs[1]-'a';
- if(len==4)
- {//编码长度:4
- fseek(Wb_fp,(p1*25+p2)*Wb_tsize[1]+Wb_begin2,SEEK_SET);
- fread(Tab2,1,Wb_tsize[1],Wb_fp);
- if(!Tab2.num[0])
- pos0=Tab2.search;
- else
- pos0=(Tab2.num[0]-1)*Wb_tsize[0]+Tab2.num[0]+Tab2.search;
- fseek(Wb_fp,pos0,SEEK_SET);
- max=len=Tab2.num[1];
- num=sizeof(fds)-1;
- fds[num]=0;
- for(i=0;max>0;i++)
- {//后面用到i
- if(len<=num)
- fread(fds,1,max,Wb_fp);
- else
- fread(fds,1,num,Wb_fp);
- for(pos=-1;pos%2 & pos!=-fds;)
- pos=strstr(fds+pos+1,&wbs[2])-fds;
- if(pos>=0) break;
- max=max-num;
- }//end for i
- if(pos==-fds) return -1;
- pos=pos+num*i>>1;
- fseek(Wb_fp,pos*Wb_tsize[0]+pos0+len,SEEK_SET);
- }
- else if(len==3)
- {//编码长度:3
- fseek(Wb_fp,(p1*25+p2)*Wb_tsize[1]+Wb_begin2,SEEK_SET);
- fread(Tab2,1,Wb_tsize[1],Wb_fp);
- fseek(Wb_fp,Tab2.search,SEEK_SET);
- fread(fds,1,Tab2.num[0],Wb_fp);
- pos=strchr(fds,wbs[2])-fds;
- if(pos==-fds) return -1;
- fseek(Wb_fp,pos*Wb_tsize[0],SEEK_CUR);
- }
- else if(len==2)
- fseek(Wb_fp,(p1*25+p2)*Wb_tsize[1]+Wb_begin2,SEEK_SET);
- else if(len==1)
- fseek(Wb_fp,p1*Wb_tsize[0]+Wb_begin1,SEEK_SET);
- fread(Addr,1,Wb_tsize[0],Wb_fp);
- num=Addr.max-id;
- pos=buf+num;
- if(num<=0)
- return -1;//序号越界或没找到
- if(bufsize-num<Addr.len)
- return 0;//缓存区过小
- fseek(Wb_fp,Addr.pos,0);
- fread(pos,1,Addr.len,Wb_fp);
- pos0=buf;
- for(i=0;i<Addr.max;)
- { if(i++>=id)
- *buf++=pos-pos0;
- pos=pos+strlen(pos)+1;
- }
- return Addr.max<<16|num;//num:返回词个数,max:最大词个数
- }
复制代码
|
|