Windows Delphi 2006 EOLN中的bug

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 存储线路制动样式的是标志字段,而不是存储输入/输出模式的模式字段 上面一行是下面来自系统单元的代码段的一部分,当需要重新填充缓冲区时

我认为D2006(WIN 32)中的EOLN函数在应用于具有Unix类型的换行符(LF)的文本文件时有一个错误,因为该换行符是输入缓冲区中的第一个字符。 错误的来源是线路

        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;