ChLibarry.cpp
上传用户:hyb6888
上传日期:2016-01-24
资源大小:5186k
文件大小:17k
源码类别:

输入法编程

开发平台:

Visual C++

  1. // loadmylib.cpp: implementation of the loadmylib class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4. #include "stdafx.h"
  5. #include "ChLibarry.h"
  6. #include "stdio.h"
  7. //////////////////////////////////////////////////////////////////////
  8. // Construction/Destruction
  9. //////////////////////////////////////////////////////////////////////
  10. ChLibarry::ChLibarry()
  11. {
  12. LIBHead=NULL;
  13. Base=0;
  14. GoldeNum=0;  //单个的编码
  15. GoldeLen=0;  
  16. LibName[0]=0;
  17. hMapFile = NULL;
  18. lpMapFileBase = NULL;
  19. }
  20. ChLibarry::~ChLibarry()
  21. {
  22. if(lpMapFileBase!=NULL)
  23. UnmapViewOfFile(lpMapFileBase);
  24. if(hMapFile!=NULL)
  25. CloseHandle(hMapFile);
  26. return ;
  27. }
  28. //
  29. long ChLibarry::reloadmylib()
  30. {
  31. HANDLE  hfile;
  32. if(lpMapFileBase!=NULL)
  33. {
  34. UnmapViewOfFile(lpMapFileBase);
  35. lpMapFileBase=NULL;
  36. }
  37. if(hMapFile!=NULL)
  38. {
  39. CloseHandle(hMapFile);
  40. hMapFile=NULL;
  41. }
  42. if(strlen(LibName)==0)
  43.   return -1;
  44. if(hMapFile==NULL||lpMapFileBase==NULL)
  45. {
  46. hfile=CreateFile(LibName,
  47. GENERIC_READ|GENERIC_WRITE,FILE_SHARE_WRITE|FILE_SHARE_READ ,NULL,
  48. OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
  49.    if(hfile==INVALID_HANDLE_VALUE){
  50.   //MessageBox(0,"函数打开文件失败","错误",0);
  51.   return -2;
  52. }
  53. if ( (hMapFile=CreateFileMapping(hfile,NULL,PAGE_READWRITE,0,0,"temfile0")) == NULL) 
  54. {
  55. //MessageBox(NULL,"建立映像文件失败",LibName,MB_OK);
  56. return -3;
  57. }
  58. if ( (lpMapFileBase = (LPVOID) MapViewOfFile( hMapFile, FILE_MAP_ALL_ACCESS,0,0,0)) == NULL) 
  59. {
  60. //MessageBox(NULL,"打开现有映像视图失败",LibName,MB_OK);
  61. return -4;
  62. }
  63. LIBHead=(char*)lpMapFileBase;
  64. Headlon    =(long*)&LIBHead[0];
  65. IndexNum   =(long*)&LIBHead[4];
  66. NullIndex  =(long*)&LIBHead[8];
  67. CLIB_Start =(long*)&LIBHead[12];
  68. CLIB_lon   =(long*)&LIBHead[16];
  69. ExCodeStart=(long*)&LIBHead[20];
  70. ExCdlon    =(long*)&LIBHead[24];
  71. FileLong   =(long*)&LIBHead[28];
  72. LIBIndex =(long*)&LIBHead[*Headlon];     //读入索引
  73. CLIB_EnCh=(char*)&LIBHead[*CLIB_Start]; 
  74. ExCdLIB  =(char*)&LIBHead[*ExCodeStart]; 
  75. {
  76. char ss[1000];
  77. sprintf(ss,"Headlon%dnHeadlon%dn",Headlon,IndexNum);
  78. //MessageBox(0,ss,inputLibName,0);
  79. }
  80. CloseHandle(hfile);
  81. }
  82. return 0;
  83. }
  84. ChLibarry::Unloadmylib()
  85. {
  86. if(lpMapFileBase!=NULL)
  87. {
  88. UnmapViewOfFile(lpMapFileBase);
  89. lpMapFileBase=NULL;
  90. }
  91. if(hMapFile!=NULL)
  92. {
  93. CloseHandle(hMapFile);
  94. hMapFile=NULL;
  95. }
  96. }
  97. ////////////////////////////////////////////////////////////////
  98. //                        装汉字码表库
  99. //外部条件:1、需要CLIBnum、CLIBlong变量。
  100. //          2、需要CL、LP、CLIB数组
  101. //返回0才是成功
  102. //装载编码库到内存中
  103. int ChLibarry::loadChiLib(char *inputLibName,long Locbase, long LocGoldeNum, long LocGoldeLen)
  104. {
  105. HANDLE  hfile;
  106. Base=Locbase;
  107. GoldeLen=LocGoldeLen;
  108. GoldeNum=LocGoldeNum;
  109. strcpy(LibName,inputLibName);
  110. if(strlen(LibName)==0)
  111.   return -1;
  112. if(hMapFile==NULL||lpMapFileBase==NULL)
  113. {
  114. hfile=CreateFile(LibName,
  115. GENERIC_READ|GENERIC_WRITE,FILE_SHARE_WRITE|FILE_SHARE_READ ,NULL,
  116. OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
  117.    if(hfile==INVALID_HANDLE_VALUE){
  118.   //MessageBox(0,"函数打开文件失败","错误",0);
  119.   return -2;
  120. }
  121. if ( (hMapFile=CreateFileMapping(hfile,NULL,PAGE_READWRITE,0,0,"temfile0")) == NULL) 
  122. {
  123. //MessageBox(NULL,"建立映像文件失败",LibName,MB_OK);
  124. return -3;
  125. }
  126. if ( (lpMapFileBase = (LPVOID) MapViewOfFile( hMapFile, FILE_MAP_ALL_ACCESS,0,0,0)) == NULL) 
  127. {
  128. //MessageBox(NULL,"打开现有映像视图失败",LibName,MB_OK);
  129. return -4;
  130. }
  131. LIBHead=(char*)lpMapFileBase;
  132. Headlon    =(long*)&LIBHead[0];
  133. IndexNum   =(long*)&LIBHead[4];
  134. NullIndex  =(long*)&LIBHead[8];
  135. CLIB_Start =(long*)&LIBHead[12];
  136. CLIB_lon   =(long*)&LIBHead[16];
  137. ExCodeStart=(long*)&LIBHead[20];
  138. ExCdlon    =(long*)&LIBHead[24];
  139. FileLong   =(long*)&LIBHead[28];
  140. LIBIndex =(long*)&LIBHead[*Headlon];     //读入索引
  141. CLIB_EnCh=(char*)&LIBHead[*CLIB_Start]; 
  142. ExCdLIB  =(char*)&LIBHead[*ExCodeStart]; 
  143. {
  144. char ss[1000];
  145. sprintf(ss,"Headlon%dnHeadlon%dn",Headlon,IndexNum);
  146. //MessageBox(0,ss,inputLibName,0);
  147. }
  148. CloseHandle(hfile);
  149. }
  150. return 0;
  151. }
  152. bool ChLibarry::isWBcode(char *inputEn)
  153. {
  154. bool ret=1;
  155. long low=0,hight,mid;
  156. char temss[100];
  157. &ExCdLIB[0];
  158. hight=(*ExCdlon)/5-1;  
  159. strcpy(temss,inputEn);
  160. temss[4]=0;
  161. strupr(temss);
  162. while(hight>=low)
  163. {
  164. mid=low+(hight-low)/2;
  165. if(strcmp(&ExCdLIB[mid*5],temss)==0)
  166. {
  167. ret=0;
  168. break;
  169. }
  170. else
  171. {
  172. if(strcmp(&ExCdLIB[mid*5],temss)>0)
  173. hight=mid-1;
  174. else
  175. low=mid+1;
  176. }
  177. }
  178. return ret;
  179. }
  180. //////////////////////////////////////////////////////////////
  181. //  外部条件:1、需要LP,CLIB数据
  182. //
  183. //  返回第一字的位置
  184. char *ChLibarry::EntoCh(char*Enss)
  185. {
  186.     long index=0;
  187.     char* pchi;
  188.     Midtems[0]=0;
  189. //char ss[1000];
  190. char kk[5000];
  191. // 汉字库的结构为:每个字串以空0结束,以13作为间隔符.
  192.  if(Enss[0]==0)
  193.  {
  194. Midtems[0]=0;;
  195. FirstChiNum=-1;
  196.  }
  197.  else
  198.  {
  199. FirstChiNum=GetChss(Enss,kk);//第一个汉字的位置
  200. /* findNextChiAndID(Enss,ss);
  201. if(kk[0]==0)
  202. sprintf(Midtems,"%s;",ss);
  203. else
  204. sprintf(Midtems,"%s",kk);
  205. */
  206. sprintf(Midtems,"%s",kk);
  207.  }
  208. pchi=Midtems;
  209.     return pchi;
  210. }
  211. //////////////////////////////////////////////////////////////
  212. //                根据编码得出,查表得出对应汉字串
  213. //  外部条件:1、需要CLIB_EnCh,LIBIndex数据
  214. //
  215. //  返回地址表中位置
  216. long ChLibarry::GetChss(char *enss,char *ss)
  217. {
  218. long lpp=-1;
  219.     long pp,len;
  220. char *lch;
  221. pp=GetIndex(enss);
  222. if(pp==-1)
  223. pp=findNextID(enss);
  224. if(pp>-1)
  225. {
  226. lch=&CLIB_EnCh[LIBIndex[pp]];
  227. len=strlen(lch);
  228. lch+=len+1;
  229. strcpy(ss,lch);
  230. }
  231. else
  232. ss[0]=0;
  233.    return pp;
  234. }
  235. //根据指定的ID值,取出编码及汉字串
  236. ///返回为-1说明有错误发生
  237. long ChLibarry::GetChss(long ID,char *ss1,char *ss2,char *EE)
  238. {
  239.     long len,ret=0;
  240. char *lch=NULL;
  241. if(ID>-1)
  242. {
  243. lch=&CLIB_EnCh[LIBIndex[ID]];
  244. strcpy(EE,lch);
  245. len=strlen(lch);
  246. lch+=len+1;
  247. strcpy(ss1,lch);
  248. len=strlen(lch);
  249. lch+=len+1;
  250. strcpy(ss2,lch);
  251. }
  252. else
  253. {
  254. ss1[0]=0;
  255. ss2[0]=0;
  256. EE[0]=0;
  257. ret=-1;
  258. }
  259.    return ret;
  260. }
  261. //由编码查找下一个有效位置
  262. //编码可能是一个无效编码没有下一个。
  263. //nextindex为在库中下顺序号,要由它得到汉字串还必须由它查地址码,再到汉字库中取汉字串
  264. //Cdindex编码索引值
  265. long ChLibarry::findNextChiAndID(char *Enss,char *Nextchiss)
  266. {
  267. long Cdindex=0;
  268. long Low=0, High=*IndexNum-1;
  269. long ret=-1,mid=0,temmid=-1,len;
  270. char ss[100],*p;
  271. Nextchiss[0]=0;
  272. //返回为-1表示失败
  273. //二分法查找
  274. strcpy(ss,Enss);
  275. strupr(ss);
  276. if ((strcmp(ss,&CLIB_EnCh[LIBIndex[Low]])>=0) && (strcmp(ss,&CLIB_EnCh[LIBIndex[High]])<0))
  277. {
  278. while( (High-Low)>-1 && temmid==-1)
  279. {
  280. mid=Low+(High-Low)/2;
  281. if(strcmp(ss,&CLIB_EnCh[LIBIndex[mid]])==0)
  282. temmid=mid;
  283. else
  284. if(strcmp(ss,&CLIB_EnCh[LIBIndex[mid]])>0)
  285. Low=mid+1;
  286. else
  287. High=mid-1;
  288. }
  289. ret=mid;
  290. if(strcmp(ss,&CLIB_EnCh[LIBIndex[ret]])>=0)//midindex停留在下一个的前面
  291. ret++;
  292. //if(temmid==-1)//仅当出现无效编码时当提示。
  293. {
  294. p=&CLIB_EnCh[LIBIndex[ret]];
  295. strcpy(Nextchiss,p);
  296. len=strlen(p);
  297. p+=len;
  298. strcat(Nextchiss,p);
  299. strlwr(Nextchiss);
  300. }
  301. }
  302. return ret;
  303. }
  304. long ChLibarry::findNextID(char *Enss)
  305. {
  306. long Cdindex=0;
  307. long Low=0, High=*IndexNum-1;
  308. long ret=-1,mid=0,temmid=-1;
  309. char ss[100];
  310. //返回为-1表示失败
  311. //二分法查找
  312. strcpy(ss,Enss);
  313. strupr(ss);
  314. if ((strcmp(ss,&CLIB_EnCh[LIBIndex[Low]])>=0) && (strcmp(ss,&CLIB_EnCh[LIBIndex[High]])<0))
  315. {
  316. while( (High-Low)>-1 && temmid==-1)
  317. {
  318. mid=Low+(High-Low)/2;
  319. if(strcmp(ss,&CLIB_EnCh[LIBIndex[mid]])==0)
  320. temmid=mid;
  321. else
  322. if(strcmp(ss,&CLIB_EnCh[LIBIndex[mid]])>0)
  323. Low=mid+1;
  324. else
  325. High=mid-1;
  326. }
  327. ret=mid;
  328. if(strcmp(ss,&CLIB_EnCh[LIBIndex[ret]])>=0)//midindex停留在下一个的前面
  329. ret++;
  330. //if(temmid==-1)//仅当出现无效编码时当提示。
  331. }
  332. return ret;
  333. }
  334. //根据指定的ID值,得到其汉字串的长度
  335. long ChLibarry::GetChlen(long ID)
  336. {
  337. long ret=0;
  338. char *p;
  339. p=&CLIB_EnCh[LIBIndex[ID]];
  340. p+=strlen(p);
  341. ret=strlen(p);
  342. return ret;
  343. }
  344. ///////////////////////////////////////////////////////////////////
  345. //private
  346. //由英文得到索引。
  347. /////////////////////////////////////////////
  348. //  由英文编码得到汉字索引值
  349. //  完全相同则得到完全相同者,
  350. //  没有完全相同的则得到最相近的后续者
  351. //返回为-1空说明未找到有效字符
  352. long ChLibarry::GetIndex(char *En)
  353. {
  354. //返回为-1表示失败
  355. //二分法查找
  356. long L1=0, L2=*IndexNum-1;
  357. long ret=-1,i=0;
  358. char temss[5000];
  359. //char tem[100];
  360. strcpy(temss,En);
  361.     strupr(temss);     //将代码变成大写,
  362. while( (L2-L1)>-1 && ret==-1)
  363. {
  364. i=L1+(L2-L1)/2;
  365. //sprintf(tem,"%s  %s %s n%s  %d   %d  %d",&CLIB_En[CL[L1]],&CLIB_En[CL[i]],&CLIB_En[CL[L2]],temss,strcmp(&CLIB_En[CL[i]],temss),L1,L2);
  366. //MessageBox(0,tem,0,0);
  367. if(strcmp(&CLIB_EnCh[LIBIndex[i]],temss)==0)
  368. {
  369. ret=i;
  370. break;
  371. }
  372. else
  373. if(strcmp(&CLIB_EnCh[LIBIndex[i]],temss)<0)
  374. L1=i+1;
  375. else
  376. L2=i-1;
  377. }
  378. return ret;
  379. }
  380. //chi中基本区在前,扩展区在后,最后跟一个0作为结束
  381. long ChLibarry::GetIndex(char *En,char *chi)
  382. {
  383. //返回为-1表示失败
  384. //二分法查找
  385. long L1=0, L2=*IndexNum-1,len=0;
  386. long ret=-1,i=0;
  387. char temss[100],*cp,*tp,*tt;
  388. //char tem[100];
  389. tp=&CLIB_EnCh[LIBIndex[5644]];
  390. strcpy(temss,En);
  391.     strupr(temss);     //将代码变成大写,
  392. while( (L2-L1)>-1 && ret==-1)
  393. {
  394. i=L1+(L2-L1)/2;
  395. //sprintf(tem,"%s  %s %s n%s  %d   %d  %d",&CLIB_En[CL[L1]],&CLIB_En[CL[i]],&CLIB_En[CL[L2]],temss,strcmp(&CLIB_En[CL[i]],temss),L1,L2);
  396. //MessageBox(0,tem,0,0);
  397. tt=&CLIB_EnCh[LIBIndex[i]];
  398. if(strcmp(&CLIB_EnCh[LIBIndex[i]],temss)==0)
  399. {
  400. ret=i;
  401. break;
  402. }
  403. else
  404. if(strcmp(&CLIB_EnCh[LIBIndex[i]],temss)<0)
  405. L1=i+1;
  406. else
  407. L2=i-1;
  408. }
  409. if(ret>-1)
  410. {
  411. cp=&CLIB_EnCh[LIBIndex[ret]];
  412. cp+=strlen(cp)+1;
  413. strcpy(chi,cp);    //基本区
  414. len=strlen(cp)+1;
  415. cp+=len;
  416. chi+=len;
  417. strcpy(chi,cp);    //扩展区
  418. chi[strlen(cp)+1]=0;
  419. }
  420. return ret;
  421. }
  422. //求指定方次
  423. unsigned long ChLibarry::Sqrt(long num, int p)
  424. {
  425. int i;
  426. unsigned long ret=1;
  427. for(i=0;i<p;i++)
  428. {
  429.    ret=ret*num;
  430. }
  431. return ret;
  432. }
  433. /////////////////////////////////////////////////////////
  434. ///////////////////////////////////////////////////////
  435. //   库中使用的函数
  436. ///////////////////////////////////////////////////////
  437. //把一个新词插入汉字库中
  438. //tag  为1表示在基本区中插入,2表示在扩展区中插入.
  439. long ChLibarry::insertID(char *En,char *chi,int  tag)
  440. {
  441.     long LID,len,nexindexvar;
  442. char *pcEx=NULL,*pcBs=NULL,*pc=NULL,ss[2000],ss1[2000];
  443. //strcpy(En,"d");
  444. //strcpy(chi,"王0");
  445. LID=GetIndex(En,ss);//SS中基本区在前,扩展区在后,最后跟一个0作为结束
  446. if(LID>-1)
  447. {
  448. if(FindSameWord(ss,chi,tag)==1)
  449. return 1;
  450. len=GetSpaceLon(LID,&pcBs,&pcEx);//得到当前ID后的空闲区域长度,pcfree返回,扩展区
  451. if(len>(long)strlen(chi))
  452. {
  453. if(tag==1)//基本区
  454. {
  455. if(*pcBs==0)//基本区为空
  456. {
  457. strcpy(ss1,pcEx);
  458. strcpy(pcBs,chi);
  459. pcEx=pcBs+strlen(pcBs)+1;//重新修定扩展区位置
  460. strcpy(pcEx,ss);
  461. }
  462. else
  463. {
  464. strcpy(ss,pcBs);
  465. strcpy(ss1,pcEx);
  466. sprintf(pcBs,"%s;%s",chi,ss);
  467. pcEx=pcBs+strlen(pcBs)+1;//重新修定扩展区位置
  468. strcpy(pcEx,ss);
  469. }
  470. }
  471. ///////////////////////////////////////////
  472. if(tag==2)//扩展区
  473. {
  474. if(*pcEx==0)//基本区为空
  475. {
  476. strcpy(pcEx,chi);
  477. }
  478. else
  479. {
  480. strcpy(ss,pcEx);
  481. sprintf(pcEx,"%s;%s",chi,ss);
  482. }
  483. }
  484. }
  485. else//空闲区域长度不足
  486. {
  487. if(tag==1)//基本区
  488. {
  489. if(*pcBs!=0)
  490. sprintf(ss,"%s;%s",chi,pcBs);
  491. else
  492. sprintf(ss,"%s",chi);
  493. strcpy(ss1,pcEx);
  494. strupr(En);
  495. nexindexvar=insertNewtoEnd(En,ss,ss1);
  496. DeleteSpace(LID);
  497. LIBIndex[LID]=nexindexvar;
  498. }
  499. //////////////////////////////////////
  500. if(tag==2)///
  501. {
  502. if(*pcEx!=0)
  503. sprintf(ss1,"%s;%s",chi,pcEx);
  504. else
  505. sprintf(ss1,"%s",chi);
  506. strcpy(ss,pcBs);
  507. strupr(En);
  508. nexindexvar=insertNewtoEnd(En,ss,ss1);
  509. DeleteSpace(LID);
  510. LIBIndex[LID]=nexindexvar;
  511. }
  512. }
  513. }
  514. else//没有找到
  515. {
  516. strupr(En);
  517. //生成新的数据,把数据写到文件尾部;
  518. if(tag==1)
  519. nexindexvar=insertNewtoEnd(En,chi,"");
  520. ////////////////////////////////////////
  521. if(tag==2)
  522. nexindexvar=insertNewtoEnd(En,"",chi);
  523. if(*NullIndex<=0)//先检查是否有空索引,有则插入
  524. {
  525.     MessageBox(0,"已没有空索引了","新词插入",0);
  526. //需要移动数据4K
  527. }
  528. insertNewIndex(En,nexindexvar);//在索引中插入新的索引
  529. }
  530. return 0;
  531. }
  532. //返回为1表示有相同的,
  533. //SS中基本区在前,扩展区在后,最后跟一个0作为结束.
  534. //tag 为0表示在所有区域中查找
  535. //tag 为1表示在基本区中查找
  536. //tag 为2表示在扩展区中查找
  537. //
  538. long ChLibarry::FindSameWord(char* ss,char *chi,int tag)
  539. {
  540.     char *cp,temss[1000];
  541. int i,len1,len2;
  542. long ret=0;
  543. len1=strlen(ss);
  544. len2=strlen(chi);
  545. if(tag<2)
  546. cp=ss;
  547. if(tag==2)
  548. cp=&ss[len1+1];
  549. //MessageBox(0,cp,chi,0);
  550. while(*cp!=0)
  551. {
  552. //---------------------------
  553. //取一个词
  554. i=0;
  555. while(*cp!=0)
  556. {
  557.    if(*cp==';'||*cp==0)
  558.    break;
  559.    temss[i]=*cp;
  560.    i++;
  561.    cp++;
  562. }
  563. temss[i]=0;
  564. //取词后CP停在字符串的后面。
  565. //---------------------------
  566. //MessageBox(0,temss,"FindSameWord",0);
  567. if(strcmp(temss,chi)==0)//判断取的词是否相同
  568. {
  569. ret=1;
  570. break;
  571. }
  572. if(*cp!=0 && tag>0)
  573. break;
  574. cp++;//指向下一个词
  575. }
  576. return ret;
  577. }
  578. ////////////////////////////////////////////
  579. //
  580. //在索引中插入新索引
  581. long ChLibarry::insertNewIndex(char *En,long nexindexvar)
  582. {
  583. long ID,i;
  584.     ID=findNextID(En);
  585. if(ID>-1)
  586. {
  587. for(i=(*IndexNum)-1;i>=ID;i--)
  588. {
  589. LIBIndex[i+1]=LIBIndex[i];
  590. }
  591. LIBIndex[i+1]=nexindexvar;       //设置新值
  592. (*NullIndex)--;
  593. (*IndexNum)++;
  594. }
  595. else
  596. {
  597. MessageBox(0,"insertNewIndex","插入失败",0);
  598. }
  599. return 0;
  600. }
  601. //
  602. //返回值为生成词相对于CLIB_Start的位置
  603. long ChLibarry::insertNewtoEnd(char *En,char *pcBs,char *pcEx)
  604. {
  605. long ret=0,lenEn,lenBs,lenEx;
  606. char *cp,ss[3000];
  607. HANDLE  hfile;
  608. DWORD retbyteNum;
  609. hfile=CreateFile(LibName,
  610. GENERIC_READ|GENERIC_WRITE,FILE_SHARE_WRITE|FILE_SHARE_READ ,NULL,
  611. OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
  612.     if(hfile==INVALID_HANDLE_VALUE){
  613.   //MessageBox(0,"函数打开文件失败","错误",0);
  614.   return -2;
  615. }
  616. lenBs=strlen(pcBs);
  617. lenEx=strlen(pcEx);
  618. lenEn=strlen(En);
  619. Unloadmylib();//卸下文件
  620. //在尾部生成结点
  621. cp=ss;
  622. strcpy(cp,En);
  623. cp+=lenEn+1;
  624. strcpy(cp,pcBs);
  625. cp+=lenBs+1;
  626. strcpy(cp,pcEx);
  627. SetFilePointer(hfile,0,0,FILE_END);
  628. WriteFile(hfile,&ss,lenEn+lenBs+lenEx+3,&retbyteNum,0);        // headlon;
  629. //MessageBox(0,0,"insertNewtoEnd",0);
  630. CloseHandle(hfile);
  631.     reloadmylib();             //重新装载修改后的文件
  632. ret=*FileLong-*CLIB_Start;
  633. *FileLong+=lenEn+lenBs+lenEx+3;  // 修正文件长度
  634. return ret;
  635. }
  636. //将指定索引清空
  637. long ChLibarry::DeleteSpace(long LID)
  638. {
  639. long ret=0;
  640. char *cp;
  641. cp=&CLIB_EnCh[LIBIndex[LID]];
  642. while(*cp!=0)
  643. {
  644. *cp=' ';
  645. cp++;
  646. }
  647. *cp=' ';
  648. cp++;
  649. while(*cp!=0)
  650. {
  651. *cp=' ';
  652. cp++;
  653. }
  654. ////////////////////////
  655. *cp=' ';
  656. cp++;
  657. while(*cp!=0)
  658. {
  659. *cp=' ';
  660. cp++;
  661. }
  662. return ret;
  663. }
  664. //测试空区域的长度,本结点后面有多少空闲区域
  665. //pcfree返回,扩展区
  666. long ChLibarry::GetSpaceLon(long LID,char **pcBs,char **pcEx)
  667. {
  668. long ret=0,len;
  669. char *pc,*temfree;
  670. pc=&CLIB_EnCh[LIBIndex[LID]];
  671. pc+=strlen(pc)+1;//越过英文
  672. *pcBs=pc;
  673. pc+=strlen(pc)+1;//越过基本区
  674. *pcEx=pc;
  675. temfree=pc;
  676. temfree+=strlen(pc)+1;//越过扩展区
  677. if(*temfree==' ')
  678. {
  679. len=0;
  680. while(*temfree==' ')
  681. {
  682. len+=strlen(temfree)+1;
  683. temfree+=len;
  684. }
  685. ret=len;
  686. }
  687. else
  688. {
  689. ret=0;
  690. }
  691. return ret;
  692. }
  693. ////////////////////////////////////////////////////////
  694. //从汉字库中删除指定的汉字串
  695. //
  696. ChLibarry::deleteID(char *En,char *Chi,int tag)//删除指定的汉字串
  697. {
  698.     char tem[1000],*pc;
  699. long LID;
  700. LID=GetIndex(En);
  701. if(LID>-1)                   //查找英文编码,并把找到的英文对应的汉字串填写在tem中
  702. {
  703. pc=&CLIB_EnCh[LIBIndex[LID]];
  704. pc+=strlen(pc)+1;        //越过编码区
  705. if(deletestr(pc,Chi,tag)>0)    //检查并删除指定的汉字串,并返回删除数
  706. {
  707. if(tem[0]=0)         //说明本索引已为空了
  708. {  
  709.    IndexNum--;
  710.    LIBIndex[LID]=-1;  // 设计指针为-1等扫描程序进行删除。
  711. }
  712. }
  713. }
  714. }
  715. //PC中的数据是两个字符串,基本汉字在前,扩展汉字在后
  716. //根据标志和指定的汉字串在PC中的相应区域删除相同的串
  717. //返回值0表示PC中已为空.
  718. long ChLibarry::deletestr(char *pc,char *Chi,int tag)
  719. {
  720.      return 0;
  721. }
  722. ///////////////////////////////////////////////////////
  723. //扫描索引,查看是否有空的索引值,并删除掉
  724. //
  725. ChLibarry::ScanID()
  726. {
  727.  int i,t=0;
  728.     for(i=0;i<*IndexNum;i++)
  729. {
  730. if(LIBIndex[i]!=-1)
  731.     LIBIndex[t]=LIBIndex[i];
  732. }
  733. }
  734. //////////////////////////////////////////////////////////
  735. //功能:对正确进行选择的操作排序
  736. //运行条件:1、能正确选择(在词内),2、选择必须大于0
  737. ChLibarry::MySort(long CurID ,int n, char *sle)
  738. {
  739. int lon;
  740. char sc[2000],ss[2000],*chi,*p=0;
  741. if(CurID!=-1 && strlen(sle)>0)
  742. {
  743. chi=&CLIB_EnCh[LIBIndex[CurID]];
  744. lon=strlen(chi);
  745. chi+=lon+1;
  746. lon=strlen(chi);
  747. if(ss!=NULL && sc!=NULL )
  748. {
  749. sprintf(sc,"%s;",chi);
  750. sprintf(ss,"%s;",sle);
  751. p=strstr(sc,ss);
  752. //sprintf(tem,"%s %s %s",chi,sle,p);
  753. //MessageBox(0,tem,chi,0);
  754. if(p!=NULL&&p!=&sc[0])
  755. {
  756. p--;*p=0;p++;
  757. p+=strlen(sle)+1;
  758. sprintf(ss,"%s;%s;%s",sle,sc,p);
  759. ss[lon]=0;
  760. strcpy(chi,ss);
  761. }
  762. else
  763. {
  764. ///sprintf(ss,"%s %s",sc,sle);
  765. //MessageBox(0,ss," ",0);
  766. }
  767. }
  768. }
  769.   return 0;
  770. }