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