lib2sim.c
上传用户:shdz666
上传日期:2007-01-03
资源大小:566k
文件大小:4k
源码类别:

输入法编程

开发平台:

Visual C++

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>
  4. #include <fcntl.h>
  5. #include <sys/types.h>
  6. #include <sys/stat.h>
  7. #include <io.h>
  8. #include <windows.h>
  9. #include <tchar.h>
  10. #define MAX_PHRASE_LEN 8
  11. #define MAX_PY_NUM 420
  12. #define MAX_EACH_PY_NUM 41
  13. typedef struct {
  14. WORD wKey;
  15. TCHAR szPY[8];
  16. } PINYIN,FAR *LPPINYIN;
  17. PINYIN      aPYTab[26][MAX_EACH_PY_NUM] = {0};
  18. void LoadHZDictionary( LPTSTR lpStr)
  19. {
  20. TCHAR szPY[20],szHZ[1000];
  21. static int i=0,j=0,nPre=0;
  22. WORD wPYHead=1;
  23. LPPINYIN lpPYTab = (LPPINYIN)aPYTab;
  24. _stscanf(lpStr,"%s %s",szPY,szHZ);
  25. wPYHead=(WORD)szPY[0] - (WORD)_T('a');
  26. if(wPYHead != nPre) j=0;
  27. _tcscpy( (lpPYTab+wPYHead*MAX_EACH_PY_NUM+j)->szPY,szPY);
  28. (lpPYTab+wPYHead*MAX_EACH_PY_NUM+j)->wKey=i+1;
  29. nPre=wPYHead;
  30. i++,j++;
  31. return;
  32. }
  33. WORD GetSegment(LPTSTR buf)
  34. {
  35. if(*buf == _T('')) return 1; //END_SEGMENT
  36. else if(*buf == _T('#')) return 2; //COMMENT
  37. else if( _tcsstr(buf,_T("[PUNCTUATION]")) != NULL ) return 3; 
  38. else if( _tcsstr(buf,_T("[DICTIONARY]")) != NULL) return 4;
  39. else return 0;
  40. }
  41. void GetStr(FILE *pf,LPTSTR pbuf)
  42. {
  43. while( !feof(pf) ) {
  44. *pbuf = _fgettc(pf);
  45. if(*pbuf == _T('n')) break;
  46. pbuf++;
  47. }
  48. *pbuf = _T('');
  49. }
  50. void LoadTable()
  51. {
  52. FILE *stream;
  53. TCHAR szStr[1000];
  54. TCHAR szTabFileName[200];
  55. LPTSTR lpTabFileName = szTabFileName;
  56. lpTabFileName += GetSystemDirectory(szTabFileName,200);
  57. if (*(lpTabFileName-1) != _T('\'))
  58. *lpTabFileName++ = _T('\');
  59. _tcscpy(lpTabFileName,_T("freepy.tab"));
  60. if( (stream = _tfopen( szTabFileName, "r" )) == NULL ){
  61. _stprintf(szStr,"%s can not found",szTabFileName);
  62. MessageBox(NULL,szStr,"init",MB_OK);
  63. exit(1);
  64. }
  65. while( !feof( stream )) {
  66. GetStr(stream,szStr);
  67. switch( GetSegment(szStr)) {
  68. case 1: //END_SEGMENT
  69. break;
  70. case 2: //COMMENT
  71. break;
  72. case 3: //PUNCTUATION
  73. if( feof( stream ) ) goto my_exit;
  74. GetStr(stream,szStr);
  75. while(GetSegment(szStr) != 1) {
  76. if( GetSegment(szStr) != 2){
  77. //LoadPunct( szStr );
  78. }
  79. if( feof( stream ) ) goto my_exit;
  80. GetStr(stream,szStr);
  81. }
  82. break;
  83. case 4: //DICTIONARY
  84. if( feof( stream ) ) goto my_exit;
  85. GetStr(stream,szStr);
  86. while(GetSegment(szStr) != 1) {
  87. if( GetSegment(szStr) != 2){
  88. LoadHZDictionary( szStr );
  89. }
  90. if( feof( stream ) ) goto my_exit;
  91. GetStr(stream,szStr);
  92. }
  93. break;
  94. default:
  95. break;
  96. }
  97. }
  98. my_exit:
  99. fclose(stream);
  100. return;
  101. }
  102. int lib2sim(LPTSTR lpInName,LPTSTR lpOutName)
  103. {
  104. FILE *out,*stream;
  105. LPPINYIN lpPYTab = (LPPINYIN)aPYTab;
  106. BYTE abKey[MAX_PHRASE_LEN+2];
  107. TCHAR szStr[2*MAX_PHRASE_LEN+2];
  108. BYTE bLen;
  109. WORD wLen,wKey,wTempKey;
  110. int i,j,k;
  111. if( (stream = _tfopen( lpInName, _T("rb") )) == NULL ){
  112. fprintf(stderr,_T("%s can not found"),lpInName);
  113. exit(1);
  114. }
  115. if( (out = _tfopen( lpOutName, _T("w") )) == NULL ){
  116. fprintf(stderr,"%s can not found",lpOutName);
  117. exit(1);
  118. }
  119. while( !feof( stream )) {
  120. if(fread(&bLen,1,1,stream)){
  121. wLen=(WORD)bLen;
  122. if( wLen > 0 && fread(abKey,1,wLen+1,stream) &&
  123. fread(szStr,1,wLen*2,stream) ) {
  124. szStr[wLen*2] = _T('');
  125. fprintf(out,"%st",szStr);
  126. for(k=0;k<wLen;k++){
  127. wKey = (WORD)abKey[0];
  128. wKey = (wKey << (8-k)) & 0x0100;
  129. wKey += (WORD)abKey[k+1];
  130. for(i=0;i<26;i++){
  131. for(j=0;(wTempKey = (lpPYTab+i*MAX_EACH_PY_NUM+j)->wKey);j++){
  132. if(wKey == wTempKey){
  133. fprintf(out,"%s",(lpPYTab+i*MAX_EACH_PY_NUM+j)->szPY);
  134. if(k!=wLen-1)
  135. fprintf(out," ");
  136. else
  137. fprintf(out,"n");
  138. }
  139. }
  140. }
  141. }
  142. }
  143. else goto my_exit;
  144. }
  145. else{
  146. goto my_exit;
  147. }
  148. }
  149. my_exit:
  150. fclose(stream);
  151. fclose(out);
  152. return 1;
  153. }
  154. void main(int argc, char **argv)
  155. {
  156. if(argc != 3) {
  157. fprintf(stderr,"usage: %s <input_name> <output_name>n",argv[0]);
  158. return;
  159. }
  160. LoadTable();
  161. lib2sim(argv[1],argv[2]);
  162. return;
  163. }