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

输入法编程

开发平台:

Visual C++

  1. // loadmylib.cpp: implementation of the loadmylib class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4. #include "stdafx.h"
  5. #include "Read_ch.h"
  6. #include "stdio.h"
  7. Read_ch::Read_ch()
  8. {
  9. readpp=NULL;
  10. readflge=0;
  11. Enstr[0]=0; //设置吵兵 
  12. Chistr[0]=0;
  13. ChistrEx[0]=0;
  14. pChistr=&Chistr[1];
  15. pChistrEx=&ChistrEx[1];
  16. }
  17. //toword=1表示向下,toword=0表示向上,-1保持不变
  18. int Read_ch::Changtoword(int Ltoword)
  19. {
  20. int ret=0,ret2=0;
  21.    if(toword==Ltoword)//
  22. return 0;
  23. toword=Ltoword;
  24.    if(toword==1)   //由上转为下
  25. {
  26. readpp++;
  27. if(*readpp==0)   //本段无数据,需要跳转区域或节点
  28. {
  29. switch(mode)
  30. {
  31. case 1://可以从基本区到扩展区
  32. if(readflge==0 && *pChistrEx!=0)//现在在基本区,并且扩展区非空
  33. {
  34. readpp=pChistrEx;
  35. readflge=1;
  36. }
  37. else//需要重新取节点
  38. {
  39. ret=1;
  40. }
  41. break;
  42. case 3:
  43. ret=1;
  44. //需要重新取节点
  45. break;
  46. case 2:
  47. if(readflge==1 && *pChistr!=0)
  48. {
  49. readpp=pChistr;
  50. readflge=0;
  51. }
  52. else
  53. {
  54. ret=1;//需要重新取节点
  55. }
  56. break;
  57. case 4:
  58. ret=1;//需要重新取节点
  59. break;
  60. }
  61. }
  62. else
  63. readpp++;//说明指针在数据的中间。
  64. }
  65. ///////////////////////////////////////////
  66.    if(toword==0)//由下转为上
  67. {
  68. readpp--;
  69. if(*readpp==0)
  70. {
  71. switch(mode)
  72. {
  73. case 1:
  74.     //现在在扩展区,基本区非空。
  75. if(readflge==1 && *pChistr!=0)
  76. {
  77. readpp=&pChistr[strlen(pChistr)-1];
  78. readflge=0;
  79. }
  80. else//需要重新取节点
  81. {
  82. ret=1;
  83. }
  84. break;
  85. case 3:
  86. ret=1;
  87. //需要重新取节点
  88. break;
  89. case 2:
  90. if(readflge==0 && *pChistrEx!=0)//现在在基本区,并且扩展区非空
  91. {
  92. readpp=&pChistrEx[strlen(pChistrEx)-1];
  93. readflge=1;
  94. }
  95. else
  96. {
  97. ret=1;//需要重新取节点
  98. }
  99. break;
  100. case 4:
  101. ret=1;
  102. //需要重新取节点
  103. break;
  104. }
  105. }
  106. else
  107. readpp--;//说明指针在数据的中间。
  108. }
  109. if(ret==1)
  110. {
  111. if(ReadID==-1||ReadID==(*IndexNum)-1)
  112. ret2=1;
  113. if(toword==0)
  114. {
  115. ReadID--;
  116. }
  117. else
  118. {
  119. ReadID++;
  120. }
  121. GetChss(ReadID,pChistr,pChistrEx,Enstr);
  122. ret=SetReadpp(toword);
  123. while(ret==1)
  124. {
  125. ReadID++;
  126. if(ReadID>=(*IndexNum))
  127. {
  128. return 2;
  129. }
  130. GetChss(ReadID,pChistr,pChistrEx,Enstr);
  131. ret=SetReadpp(toword);
  132. }
  133. }
  134. return ret2;
  135. }
  136. //toword=1表示向下,toword=0表示向上,-1保持不变
  137. //mode=1表示从基本到扩展,mode=2表示从扩展到基本
  138. //mode=3表示仅基本,mode=4表示仅扩展
  139. //返回为1表示本区无可用需要的数据。必须重新设置。
  140. //一般情况下一个区是有数据的,但不一定有可用数据。
  141. //要依模式而定,3或4模式有可能无可用需要的数据
  142. int Read_ch::SetReadpp(int Ltoword)
  143. {
  144. int ret=0;
  145. if(Ltoword>=0)
  146. toword=Ltoword;
  147. if(toword==1)//表示向下
  148. {
  149. switch(mode)
  150. {
  151. case 1:
  152. if(*pChistr!=0)
  153. {
  154. readpp=pChistr;
  155. readflge=0;
  156. }
  157. else
  158. {
  159. readpp=pChistrEx;
  160. readflge=1;
  161. }
  162. break;
  163. case 3:
  164. if(*pChistr!=0)
  165. {
  166. readpp=pChistr;
  167. readflge=0;
  168. }
  169. else
  170. {
  171. ret=1;  //本区无数据,需要重新设置。
  172. }
  173. break;
  174. case 2:
  175. if(*pChistrEx!=0)
  176. {
  177. readpp=pChistrEx;
  178. readflge=1;
  179. }
  180. else
  181. {
  182. readpp=pChistr;
  183. readflge=0;
  184. }
  185. break;
  186. case 4:
  187. if(*pChistrEx!=0)
  188. {
  189. readpp=pChistrEx;
  190. readflge=1;
  191. }
  192. else
  193. {
  194. ret=1;  //本区无数据,需要重新设置。
  195. }
  196. break;
  197. }
  198. }
  199. if(toword==0)//表示向上
  200. {
  201. switch(mode)
  202. {
  203. case 1://扩展区 至基本区
  204. if(*pChistrEx!=0)
  205. {
  206. readpp=&pChistrEx[strlen(pChistrEx)-1];//指向最后一个字符
  207. readflge=1;
  208. }
  209. else
  210. {
  211. readpp=&pChistr[strlen(pChistr)-1];//指向最后一个字符
  212. readflge=0;    //标记读取指针在扩展区
  213. }
  214. break;
  215. case 3://仅基本区
  216. if(*pChistr!=0)
  217. {
  218. readpp=&pChistr[strlen(pChistr)-1];//指向最后一个字符
  219. readflge=0;
  220. }
  221. else
  222. {
  223. ret=1;//基本区无数据,要求重新设置。
  224. }
  225. break;
  226. case 2://扩展区至基本区
  227. if(*pChistr!=0)
  228. {
  229. readpp=&pChistr[strlen(pChistr)-1];
  230. readflge=0;
  231. }
  232. else
  233. {
  234. readpp=&pChistrEx[strlen(pChistrEx)-1];
  235. readflge=1;
  236. }
  237. break;
  238. case 4://仅扩展区
  239. if(*pChistrEx!=0)
  240. {
  241. readpp=&pChistrEx[strlen(pChistrEx)-1];
  242. readflge=1;
  243. }
  244. else
  245. ret=1;//扩展区无数据,要求重新设置
  246. break;
  247. }
  248. }
  249. return ret;
  250. }
  251. //返回为2说明已经进入边界,
  252. //必须保证下次有数据可读,否则需报告信息
  253. int Read_ch::SetData(int Lmode,char *enstr)
  254. {
  255. int ret=0;
  256. long ID;
  257. strcpy(Enstr,enstr);
  258. mode=Lmode;
  259. toword=1;
  260. ID=GetIndex(Enstr);            //此函数是库中的函数,由库完成
  261. if(ID==-1)
  262. ID=findNextID(Enstr);
  263. if(ID>=0)
  264. {
  265. //GetChlen(ID);  //此函数是库中的函数,由库完成
  266. ReadID=ID;
  267. CurID=ID;
  268. GetChss(ReadID,pChistr,pChistrEx,Enstr);
  269. ret=SetReadpp(toword);
  270. while(ret==1)
  271. {
  272. ReadID++;
  273. if(ReadID>=(*IndexNum))
  274. {
  275. return 2;
  276. }
  277. GetChss(ReadID,pChistr,pChistrEx,Enstr);
  278. ret=SetReadpp(toword);
  279. }
  280. }
  281. else
  282. {
  283. ret= 1;//MessageBox(0,"取ID==-1","ID",0);
  284. }
  285. return ret;
  286. }
  287. //toword=1表示向下,toword=0表示向上
  288. //返回非0表示有错误发生,1表示无数据读出,2表示下一次无数据可读。 
  289. int Read_ch::GetWord(char *ss,char *en)
  290. {
  291. int  ret;
  292. strcpy(en,Enstr);
  293. if(toword==1)
  294. {
  295. ret=GetNextWord(ss);
  296. }
  297. if(toword==0)
  298. {
  299. ret=GetUpWord(ss);
  300. }
  301. return ret;
  302. }
  303. //torword =1是向下,torword=0是向上
  304. //flage=1表示从基本到扩展,flage=2表示从扩展到基本
  305. //flage=3表示仅基本,flage=4表示仅扩展
  306. //readflge=0表示读取指针在基本区内
  307. //返回非0表示有错误发生,1表示无数据读出,2表示下一次无数据可读。 
  308. int Read_ch::GetNextWord(char *ss)
  309. {
  310. int ret=0;
  311. if(readpp[0]==0)//表示当前无数据可读
  312. return 1;
  313. strcpyNextWord(ss,readpp);
  314. readpp+=strlen(ss);
  315. if(readpp[0]==0)//区域调整
  316. {
  317. if( mode==1 && readflge==0)//从基本到扩展
  318. {
  319. readpp=pChistrEx;
  320. readflge=1;
  321. }
  322. if(mode==2 && readflge==1)//从扩展到基本
  323. {
  324. readpp=pChistr;
  325. readflge=0;
  326. }
  327. }
  328. else{
  329. readpp++;
  330. }
  331. //调整后为空
  332. if(readpp[0]==0)//数据已经取完,要求得到下一结点
  333. {
  334. ReadID++;
  335. if(SetNode(ReadID)==2)
  336. return 2;
  337. }
  338. return 0;
  339. }
  340. int Read_ch::SetNode(long ID)
  341. {
  342. int ret2;
  343. if(ReadID>=(*IndexNum))
  344. return 2;
  345. GetChss(ReadID,pChistr,pChistrEx,Enstr);
  346. ret2=SetReadpp(-1);
  347. while(ret2==1)
  348. {
  349. ReadID++;
  350. if(ReadID>=(*IndexNum))
  351. return 2;
  352. GetChss(ReadID,pChistr,pChistrEx,Enstr);
  353. ret2=SetReadpp(-1);
  354. }
  355. return 0;
  356. }
  357. //返回非0表示有错误发生,1表示无数据读出,2表示下一次无数据可读。 
  358. int Read_ch::GetUpWord(char *ss)
  359. {
  360. int ret=0;
  361. if(ReadID>=(*IndexNum))
  362. {
  363. ReadID=(*IndexNum)-1;
  364. if(SetNode(ReadID)==2)
  365. return 2;
  366. else
  367. return 1;
  368. }
  369. if(readpp[0]==0)//表示当前无数据可读
  370. return 1;
  371. strcpyUpWord(ss,readpp);
  372. readpp-=strlen(ss);
  373. if(readpp[0]==0)//区域调整
  374. {
  375. if( mode==1 && readflge==1)//从扩展到基本
  376. {
  377. readpp=&pChistr[strlen(pChistr)-1];
  378. readflge=0;
  379. }
  380. if(mode==2 && readflge==0)//从基本到扩展
  381. {
  382. readpp=&pChistrEx[strlen(pChistrEx)-1];
  383. readflge=1;
  384. }
  385. }
  386. else{
  387. readpp--;
  388. }
  389. //调整后为空
  390. if(readpp[0]==0)//数据已经取完,要求得到下一结点
  391. {
  392. ReadID--;
  393. if(SetNode(ReadID)==2)
  394. return 2;
  395. }
  396. return 0;
  397. }
  398. ///////////////////////////////////////////////
  399. Read_ch::strcpyNextWord(char *CC,char* Chss)
  400. {
  401. int i=0;
  402. while(Chss[i]!=0&&Chss[i]!=';')
  403. {
  404. CC[i]=Chss[i];
  405. i++;
  406. }
  407. CC[i]=0;
  408. }
  409. int Read_ch:: sort(int num,char *retss)
  410. {
  411.     MySort(CurID,num,retss);
  412. return 0;
  413. }
  414. ///////////////////////////////////////////////////////
  415. Read_ch::strcpyUpWord(char *CC,char* Chss)
  416. {
  417. int i=0;
  418. char *p;
  419. p=Chss;
  420. while(*p!=0&&*p!=';')
  421. {
  422. CC[i]=*p;
  423. i++;
  424. p--;
  425. }
  426. CC[i]=0;
  427. _strrev(CC);
  428. }