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

输入法编程

开发平台:

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. WORD String2Array(LPTSTR lpBuf,LPTSTR lpStrArr,WORD wMaxArrSize)
  103. {
  104. int i;
  105. WORD cursor=0,count=0,wBufLen;
  106. wBufLen = strlen(lpBuf);
  107. for (i=0;i<wBufLen;i++){
  108. if(*(lpBuf+i) == _T(' ') || *(lpBuf+i) == _T('t')) {
  109. if(i!=0 && *(lpBuf+i-1)!=_T(' ') && *(lpBuf+i-1)!=_T('t') ){
  110. _tcsncpy(lpStrArr+count*wMaxArrSize,lpBuf+cursor,i-cursor);
  111. *(lpStrArr+count*wMaxArrSize+i-cursor)=_T('');
  112. count++;
  113. }
  114. cursor=i+1;
  115. }
  116. if(i == wBufLen-1 && *(lpBuf+i)!=_T(' ') && *(lpBuf+i)!=_T(' ') ){
  117. _tcsncpy(lpStrArr+count*wMaxArrSize,lpBuf+cursor,i-cursor+1);
  118. *(lpStrArr+count*wMaxArrSize+i-cursor+1)=_T('');
  119. count++;
  120. }
  121. }
  122. return count;
  123. }
  124. int sim2lib(LPTSTR lpInName,LPTSTR lpOutName)
  125. {
  126. FILE *stream,*out;
  127. int i,j;
  128. TCHAR szStr[250];
  129. WORD wLen,wHead,flag;
  130. BYTE abKey[MAX_PHRASE_LEN+2],bLen;
  131. WORD awKey[MAX_PHRASE_LEN];
  132. WORD wCount;
  133. TCHAR szStrArr[MAX_PHRASE_LEN+4][2*MAX_PHRASE_LEN+2];
  134. if( (stream = _tfopen( lpInName, _T("r") )) == NULL ){
  135. fprintf(stderr,"%s cant open.n",lpInName);
  136. exit(1);
  137. }
  138. if( (out = _tfopen( lpOutName, _T("wb") )) == NULL ){
  139. fprintf(stderr,"%s cant open.n",lpOutName);
  140. exit(1);
  141. }
  142. while( !feof( stream )) {
  143. if( _fgetts(szStr,1000,stream) != NULL){
  144. *(szStr+_tcslen(szStr)-1)=_T('');
  145. wCount=String2Array(szStr,(LPTSTR)szStrArr,2*MAX_PHRASE_LEN+2);
  146. wLen=_tcslen(szStrArr[0])/2;
  147. if(wLen != wCount-1 || wLen > MAX_PHRASE_LEN){
  148. printf("%sn",szStr);
  149. continue;
  150. }
  151. for(i=1;i<wCount;i++){
  152. wHead=(int)szStrArr[i][0] - _T('a');
  153. flag=1;
  154. if(wHead < 0 || wHead > 25){
  155. printf("%sn",szStr);
  156. flag=0;
  157. break;
  158. }
  159. flag=0;
  160. for(j=0;aPYTab[wHead][j].wKey;j++){
  161. if(!_tcscmp(aPYTab[wHead][j].szPY,szStrArr[i])){
  162. awKey[i-1]=aPYTab[wHead][j].wKey;
  163. flag=1;
  164. break;
  165. }
  166. }
  167. if(!flag) break;
  168. }
  169. if(!flag){
  170. printf("%sn",szStr);
  171. continue;
  172. }
  173. for(i=0;i<wLen;i++)
  174. abKey[i+1] = awKey[i] & 0xff;
  175. abKey[0]=_T('');
  176. for(i=0;i<wLen;i++)
  177. abKey[0] |= (awKey[i] & 0x0100) >> (8-i);
  178. bLen=(BYTE)wLen;
  179. fwrite(&bLen,1,1,out);
  180. fwrite(abKey,1,wLen+1,out);
  181. fwrite(szStr,1,wLen*2,out);
  182. }
  183. }
  184. fclose(stream);
  185. fclose(out);
  186. return (0);
  187. }
  188. void main(int argc,char **argv)
  189. {
  190.   if(argc != 3) {
  191.     fprintf(stderr,"usage: %s <input_name> <output_name>n",argv[0]);
  192.     return;
  193.   }
  194.   LoadTable();
  195.   sim2lib(argv[1],argv[2]);
  196.   return;
  197. }