windows – EOLN中的Delphi 2006错误

前端之家收集整理的这篇文章主要介绍了windows – EOLN中的Delphi 2006错误前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我认为D2006(WIN 32)中的EOLN功能存在一个错误,当应用于具有Unix类型换行符(LF)的文本文件时,此LF是输入缓冲区中的第一个字符.
错误的来源是线
  1. TEST [EDX].TTextRec.Mode,tfCRLF

哪个应该正确阅读

  1. TEST [EDX].TTextRec.Flags,tfCRLF

Flags字段存储线制动器样式,而不是存储输入/输出模式的Mode字段.

以上行是Sytem单元下面的片段的一部分,当需要重新填充缓冲区时调用该片段.该错误未被注意,因为Mode字段是输入文件的奇数(这是EOLN通常使用的模式)

  1. fmInput = $D7B1;

匹配tfCRLF(= 1)中为Windows生成的文本文件设置的唯一位.较新版本的Delphi是否仍然具有相同的EOLN编码?

  1. function _Eoln(var t: TTextRec): Boolean;
  2. asm
  3. .
  4. .
  5. .
  6. @@readChar:
  7. PUSH EAX
  8. CALL _ReadChar
  9. POP EDX
  10. CMP AH,cEOF
  11. JE @@eof
  12. DEC [EDX].TTextRec.BufPos
  13. XOR ECX,ECX
  14. XCHG ECX,EAX
  15. TEST [EDX].TTextRec.Mode,tfCRLF
  16. JE @@testLF
  17. CMP CL,cCR
  18. JE @@eol
  19. JMP @@exit
  20.  
  21. @@eol:
  22. @@eof:
  23. MOV AL,1
  24. @@exit:
  25. end;

另一个好奇心:这个EOLN功能,当应用于Windows(CRLF)文件类型时,实际上只检查CR,就好像它检查了一个(旧的?)Mac文件,没有检查过LF!

它没有在2007年修复.

这是Delphi 2007的代码

  1. function _Eoln(var t: TTextRec): Boolean;
  2. asm
  3. ....
  4. TEST [EDX].TTextRec.Mode,tfCRLF <<-- incorrect reference still there
  5. JE @@testLF
  6. CMP CL,cCR
  7. JE @@eol
  8. JMP @@exit
  9. @@eol:
  10. @@eof:
  11. MOV AL,1
  12. @@exit:
  13. end;

在XE6中修复
在Delphi XE6中,使用纯Pascal版本,它也正确检查t.Flags.
(显然否则它不会编译).

我没有检查过它们之间的任何回归.

猜你在找的Windows相关文章