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

输入法编程

开发平台:

Visual C++

  1. // loadmylib.cpp: implementation of the loadmylib class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4. #include "stdafx.h"
  5. #include "Read_chEx.h"
  6. #include "stdio.h"
  7. Read_chEx::Read_chEx()
  8. {
  9. readpp=NULL;
  10. Enstr[0]=0; //设置吵兵 
  11. Chistr[0]=0;
  12. pChistr=&Chistr[1];
  13. }
  14. //返回为2说明已经进入边界,
  15. //必须保证下次有数据可读,否则需报告信息
  16. int Read_chEx::SetData(int Lmode,char *enstr)
  17. {
  18. int ret=0;
  19. long ID;
  20. strcpy(Enstr,enstr);
  21. mode=Lmode;
  22. toword=1;
  23. ID=GetIndex(Enstr);            //此函数是库中的函数,由库完成
  24. if(ID==-1)
  25. ID=findNextID(Enstr);
  26. if(ID>=0)
  27. {
  28. //GetChlen(ID);  //此函数是库中的函数,由库完成
  29. ReadID=ID;
  30. CurID=ID;
  31. if(SetNode(&ReadID)==2)
  32. return 2;
  33. }
  34. else
  35. {
  36. ret= 1;//MessageBox(0,"取ID==-1","ID",0);
  37. }
  38. return ret;
  39. }
  40. //toword=1表示向下,toword=0表示向上
  41. //返回非0表示有错误发生,1表示无数据读出,2表示下一次无数据可读。 
  42. int Read_chEx::GetWord(char *ss,char *en)
  43. {
  44. int  ret;
  45. strcpy(en,Enstr);
  46. if(toword==1)
  47. {
  48. ret=GetNextWord(ss);
  49. }
  50. if(toword==0)
  51. {
  52. ret=GetUpWord(ss);
  53. }
  54. return ret;
  55. }
  56. //torword =1是向下,torword=0是向上
  57. //flage=1表示从基本到扩展,flage=2表示从扩展到基本
  58. //flage=3表示仅基本,flage=4表示仅扩展
  59. //readflge=0表示读取指针在基本区内
  60. //返回非0表示有错误发生,1表示无数据读出,2表示下一次无数据可读。 
  61. int Read_chEx::GetNextWord(char *ss)
  62. {
  63. int ret=0;
  64. if(ReadID<0)//解除锁定
  65. {
  66. ReadID=0;
  67. if(SetNode(&ReadID)==2)//2表示越界
  68. return 1;
  69. else
  70. return 3;//解除成功
  71. }
  72. if(ReadID>=(*IndexNum))
  73. return 1;
  74. if(readpp[0]==0)//表示当前无数据可读
  75. return 1;
  76. strcpyNextWord(ss,readpp);
  77. readpp+=strlen(ss);
  78.   if(readpp[0]==0)//数据已经取完,要求得到下一结点
  79. {
  80. ReadID++;
  81. if(SetNode(&ReadID)==2)
  82. return 2;
  83. }
  84. else
  85. readpp++;
  86. return 0;
  87. }
  88. //返回非0表示有错误发生,1表示无数据读出,2表示下一次无数据可读。 
  89. int Read_chEx::GetUpWord(char *ss)
  90. {
  91. int ret=0;
  92. char *p;
  93. ss[0]=0;
  94. if(ReadID>=(*IndexNum))//解除锁定
  95. {
  96. ReadID=(*IndexNum)-1;
  97. if(SetNode(&ReadID)==2)//2表示越界
  98. return 1;
  99. else
  100. return 3;//解除成功
  101. }
  102. if(ReadID<0)
  103. return 1;
  104. if(readpp[0]==0)//表示当前无数据可读
  105. return 1;
  106. p=readpp;
  107. p--;
  108. if(*p==0)
  109. {
  110. ReadID--;
  111. if(SetNode(&ReadID)==2)
  112. return 2;
  113. }
  114. else
  115. readpp-=2;
  116. strcpyUpWord(ss,readpp);
  117. readpp-=strlen(ss)-1;
  118. return 0;
  119. }
  120. //2表示越界,0表示成功
  121. int Read_chEx::SetNode(long *ID)
  122. {
  123. if(toword==1)
  124. {
  125. if(*ID>=(*IndexNum))
  126. return 2;
  127. }
  128. else
  129. {
  130. if(*ID<0)
  131. return 2;
  132. }
  133. GetChss(*ID,Chistr1,Chistr2,Enstr);
  134. switch(mode)
  135. {
  136. case 1:
  137. if(Chistr2[0]==0 )
  138. sprintf(pChistr,"%s",Chistr1);
  139. else
  140. {
  141. if(Chistr1[0]==0)
  142. sprintf(pChistr,"%s",Chistr2);
  143. else
  144. sprintf(pChistr,"%s;%s",Chistr1,Chistr2);
  145. }
  146. break;
  147. case 2:
  148. if(Chistr1[0]==0 )
  149. sprintf(pChistr,"%s",Chistr2);
  150. else
  151. {
  152. if(Chistr2[0]==0)
  153. sprintf(pChistr,"%s",Chistr1);
  154. else
  155. sprintf(pChistr,"%s;%s",Chistr2,Chistr1);
  156. }
  157. break;
  158. case 3:
  159. sprintf(pChistr,"%s",Chistr1);
  160. break;
  161. case 4:
  162. sprintf(pChistr,"%s",Chistr2);
  163. break;
  164. }
  165. while(*pChistr==0)
  166. {
  167. if(toword==1)
  168. {
  169. (*ID)++;
  170. if((*ID)>=(*IndexNum))
  171. return 2;
  172. }
  173. else
  174. {
  175. (*ID)--;
  176. if(ID<0)
  177. return 2;
  178. }
  179. GetChss((*ID),Chistr1,Chistr2,Enstr);
  180. switch(mode)
  181. {
  182. case 1:
  183. sprintf(pChistr,"%s;%s",Chistr1,Chistr2);
  184. break;
  185. case 2:
  186. sprintf(pChistr,"%s;%s",Chistr2,Chistr1);
  187. break;
  188. case 3:
  189. sprintf(pChistr,"%s",Chistr1);
  190. break;
  191. case 4:
  192. sprintf(pChistr,"%s",Chistr2);
  193. break;
  194. }
  195. }
  196. if(toword==1)
  197. {
  198. readpp=pChistr;
  199. }
  200. else
  201. {
  202. readpp=&pChistr[strlen(pChistr)-1];
  203. }
  204. return 0;
  205. }
  206. ///////////////////////////////////////////////
  207. Read_chEx::strcpyNextWord(char *CC,char* Chss)
  208. {
  209. int i=0;
  210. while(Chss[i]!=0&&Chss[i]!=';')
  211. {
  212. CC[i]=Chss[i];
  213. i++;
  214. }
  215. CC[i]=0;
  216. }
  217. int Read_chEx:: sort(int num,char *retss)
  218. {
  219.     MySort(CurID,num,retss);
  220. return 0;
  221. }
  222. ///////////////////////////////////////////////////////
  223. Read_chEx::strcpyUpWord(char *CC,char* Chss)
  224. {
  225. int i=0;
  226. char *p;
  227. p=Chss;
  228. while(*p!=0&&*p!=';')
  229. {
  230. CC[i]=*p;
  231. i++;
  232. p--;
  233. }
  234. CC[i]=0;
  235. _strrev(CC);
  236. }