Windows Delphi 2006 EOLN中的bug
我认为D2006(WIN 32)中的EOLN函数在应用于具有Unix类型的换行符(LF)的文本文件时有一个错误,因为该换行符是输入缓冲区中的第一个字符。 错误的来源是线路Windows Delphi 2006 EOLN中的bug,windows,delphi,unix,Windows,Delphi,Unix,我认为D2006(WIN 32)中的EOLN函数在应用于具有Unix类型的换行符(LF)的文本文件时有一个错误,因为该换行符是输入缓冲区中的第一个字符。 错误的来源是线路 TEST [EDX].TTextRec.Mode,tfCRLF 哪个应该正确阅读 TEST [EDX].TTextRec.Flags,tfCRLF 存储线路制动样式的是标志字段,而不是存储输入/输出模式的模式字段 上面一行是下面来自系统单元的代码段的一部分,当需要重新填充缓冲区时
TEST [EDX].TTextRec.Mode,tfCRLF
哪个应该正确阅读
TEST [EDX].TTextRec.Flags,tfCRLF
存储线路制动样式的是标志字段,而不是存储输入/输出模式的模式字段
上面一行是下面来自系统单元的代码段的一部分,当需要重新填充缓冲区时调用该代码段。由于模式字段是输入文件的奇数(这是通常与EOLN一起使用的模式),因此没有注意到该错误
为Windows生成的文本文件匹配tfCRLF(=1)中设置的唯一位。Delphi的较新版本是否仍具有相同的EOLN编码
另一个奇怪之处是:当应用于Windows(CRLF)文件类型时,此EOLN函数实际上只检查CR,就好像它在检查(旧的?)Mac文件时,不检查LF following 它在2007年没有固定下来
下面是Delphi2007的代码
function _Eoln(var t: TTextRec): Boolean;
asm
....
TEST [EDX].TTextRec.Mode,tfCRLF <<-- incorrect reference still there
JE @@testLF
CMP CL,cCR
JE @@eol
JMP @@exit
@@eol:
@@eof:
MOV AL,1
@@exit:
end;
函数(var t:TTextRec):布尔值;
asm
....
测试[EDX].TTextRec.Mode,tfCRLF我想你是对的。你应该在QC报告这一点。最好是使用QC Windows客户端,因为它比@Jeroen的web界面更容易使用:报告它只在XE6中仍然存在时才起作用。新版本发布后,EMBT不会向旧版本发布补丁,D2006是一个非常旧的版本。@Jeroen:True。我不想给Marcelo留下这样的印象,即报告它会在某个时候修复D2006,尽管如此。:-)@MarceloBergweiler如果您提供了一个可复制的测试用例(最好是一个基于Delphi的测试框架已经提供了很长时间),我可以检查。@Jeroen:因为我们不能在这里附加文件,所以我准备了一个ZIP文件并将其附加到一个新的Johan,D2007代码与D2006中的代码完全相同。错误在代码的下半部分,即以“@@readChar”开头的部分。你会发现对“Mode”的引用是错误的。糟糕,不管怎样,它在XE6中被修复了。
function _Eoln(var t: TTextRec): Boolean;
asm
.
.
.
@@readChar:
PUSH EAX
CALL _ReadChar
POP EDX
CMP AH,cEOF
JE @@eof
DEC [EDX].TTextRec.BufPos
XOR ECX,ECX
XCHG ECX,EAX
TEST [EDX].TTextRec.Mode,tfCRLF
JE @@testLF
CMP CL,cCR
JE @@eol
JMP @@exit
@@eol:
@@eof:
MOV AL,1
@@exit:
end;
function _Eoln(var t: TTextRec): Boolean;
asm
....
TEST [EDX].TTextRec.Mode,tfCRLF <<-- incorrect reference still there
JE @@testLF
CMP CL,cCR
JE @@eol
JMP @@exit
@@eol:
@@eof:
MOV AL,1
@@exit:
end;