VS_ASC.C
上传用户:bangxh
上传日期:2007-01-31
资源大小:42235k
文件大小:4k
源码类别:

Windows编程

开发平台:

Visual C++

  1. #include "vsp_asc.h"
  2. #include "vsctop.h"
  3. #include "vs_asc.pro"
  4. #define EOF (-1)
  5. /************************** ROUTINES *****************************************/
  6. /******************************************************************************
  7. * ASC_INIT       *
  8. * Initialize the data union data structure    *
  9. ******************************************************************************/
  10. VW_ENTRYSC  SHORT  VW_ENTRYMOD VwStreamOpenFunc (fp, FileId, FileName, FilterInfo, hProc)
  11. SOFILE fp;
  12. SHORT FileId;
  13. BYTE VWPTR *FileName;
  14. SOFILTERINFO VWPTR *FilterInfo;
  15. HPROC hProc;
  16. {
  17. char chread[10];
  18. SHORT ch;
  19. SHORT chCount;
  20. SHORT done;
  21. SHORT locText;
  22. if ( FilterInfo != NULL )
  23. {
  24. FilterInfo->wFilterCharSet = SO_PC;
  25. strcpy ( FilterInfo->szFilterName, VwStreamIdName[0].FileDescription );
  26. }
  27. Proc.AscSave.SeekSpot = 0L;
  28. Proc.AscSave.lastchar = 0;
  29. Proc.bFileIsText = FALSE;
  30. Proc.hFile = _lopen ( (LPCSTR) FileName, OF_READ | OF_SHARE_DENY_WRITE );
  31. if (Proc.hFile == HFILE_ERROR)
  32. return -1;
  33. _llseek (Proc.hFile, 0L, 0);
  34. chCount = 0;
  35. done = FALSE;
  36. locText = TRUE;
  37. do {
  38. if (chCount >= 512)
  39. break;
  40. if (0==_lread (Proc.hFile, chread, 1) )
  41. ch=EOF;
  42. else
  43. ch=chread[0];
  44. chCount ++;
  45. switch (ch)
  46. {
  47. case EOF:
  48. done=TRUE;
  49. break;
  50. case 0x0d: // CR
  51. case 0x08: // Backspace
  52. case 0x0a: // NL
  53. case 0x09: // TAB
  54. case 0x0c: // NEW PAGE
  55. case 0x1a:    // ASCII EOF
  56. case 0x00: // NULL
  57. case 0xc6: // 850 - a tilde
  58. case 0xc7:  // 850 - A tilde
  59. break;
  60. default:
  61. if ( (ch>=0x20) && (ch<=0x7F) )
  62. break;
  63. if ( ch >= 0x80 && ch <= 0xA5 )
  64. break;
  65. if ( ch >= 0xD0 && ch <= 0xD8 )
  66. break;
  67. if ( ch >= 0xE0 && ch <= 0xEF )
  68. break;
  69. if ( ch >= 0xB5 && ch <= 0xB7 )
  70. break;
  71. locText = FALSE;
  72. done = TRUE;
  73. }
  74. }while (done == FALSE);
  75. if (locText)
  76. Proc.bFileIsText = TRUE;
  77. _llseek (Proc.hFile, 0L, 0);
  78. return ( 0 );
  79. }
  80. VW_ENTRYSC VOID VW_ENTRYMOD VwStreamCloseFunc(SOFILE hFile, HPROC hProc)
  81. {
  82. _lclose ( Proc.hFile );
  83. }
  84. VW_ENTRYSC SHORT VW_ENTRYMOD VwStreamSeekFunc(hFile,hProc)
  85. SOFILE hFile;
  86. HPROC hProc;
  87. {
  88. return((SHORT)_llseek(Proc.hFile,Proc.VwStreamSaveName.SeekSpot,0));
  89. }
  90. VW_ENTRYSC SHORT VW_ENTRYMOD VwStreamTellFunc(hFile,hProc)
  91. SOFILE hFile;
  92. HPROC hProc;
  93. {
  94. Proc.VwStreamSaveName.SeekSpot = _llseek(Proc.hFile,0L, 1);
  95. return(0);
  96. }
  97. /******************************************************************************
  98. * ASC_SECTION_FUNC       *
  99. ******************************************************************************/
  100. VW_ENTRYSC  SHORT  VW_ENTRYMOD VwStreamSectionFunc (fp, hProc)
  101. SOFILE fp;
  102. HPROC hProc;
  103. {
  104. SOPutSectionType ( SO_PARAGRAPHS, hProc );
  105. return(0);
  106. }
  107. VW_ENTRYSC  SHORT  VW_ENTRYMOD VwStreamReadFunc (fp, hProc)
  108. SOFILE fp;
  109. HPROC hProc;
  110. {
  111. SHORT ch;
  112. char  chread[10];
  113. SHORT chCount;
  114. SHORT chTabs;
  115. SHORT type, done;
  116. type = SO_PARABREAK;
  117. do {
  118. chCount = 0;
  119. chTabs = 0;
  120. done = FALSE;
  121. do {
  122. if (0==_lread (Proc.hFile, chread, 1) )
  123. ch=EOF;
  124. else
  125. ch=chread[0];
  126. if ((ch >= 0x20) && (ch <= 0x7e))
  127. {
  128. chCount++;
  129. SOPutChar ( ch, hProc );
  130. }
  131. else if (ch == 0x09)
  132. {
  133. chCount++;
  134. chTabs++;
  135. SOPutSpecialCharX ( SO_CHTAB, SO_COUNT, hProc );
  136. }
  137. else if (ch == 0x0c)
  138. {
  139. chCount++;
  140. SOPutSpecialCharX ( SO_CHHPAGE, SO_COUNT, hProc );
  141. }
  142. else if (ch == EOF)
  143. {
  144. type = SO_EOFBREAK;
  145. done = TRUE;
  146. }
  147. else if (ch == 0x0a)
  148. {
  149. if (Proc.AscSave.lastchar != 0x0d)
  150. {
  151. done = TRUE;
  152. }
  153. else
  154. {
  155. ch = 0x00;
  156. }
  157. }
  158. else if (ch == 0x0d)
  159. {
  160. if (Proc.AscSave.lastchar != 0x0a)
  161. {
  162. done = TRUE;
  163. }
  164. else
  165. {
  166. ch = 0x00;
  167. }
  168. }
  169. else if (Proc.bFileIsText)
  170. {
  171. // Put out logical extended TEXT characters ...
  172. if ( ( ch >= 0x80 && ch <= 0xA5 ) ||
  173.   ( ch >= 0xD0 && ch <= 0xD8 ) ||
  174.   ( ch >= 0xB5 && ch <= 0xB7 ) ||
  175.   ( ch == 0xC6) ||
  176.   ( ch == 0xC7) ||
  177.   ( ch >= 0xE0 && ch <= 0xEF ) )
  178. {
  179. chCount++;
  180. SOPutChar ( ch, hProc );
  181. }
  182. }
  183. if (chCount > 2048 || chTabs > 10)
  184. done = TRUE;
  185. Proc.AscSave.lastchar = ch;
  186. } while ( !done );
  187. } while ( SOPutBreak (type, (LONG) NULL, hProc) != SO_STOP );
  188. return ( 0 );
  189. }  /** end of file **/