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

        TEST    [EDX].TTextRec.Mode,tfCRLF

应该正确阅读
        TEST    [EDX].TTextRec.Flags,tfCRLF

是存储线制动器样式的标志字段,而不是存储输入/输出模式的模式字段。

上面的行是Sytem单元下面的代码段的一部分,当需要重新填充缓冲区时会调用该代码段。由于“模式”字段是输入文件的奇数(通常是EOLN与之一起使用的模式),因此该错误并未引起注意。
fmInput  = $D7B1;

与Windows生成的文本文件的tfCRLF(= 1)中设置的唯一位匹配。较新版本的Delphi是否仍具有相同的EOLN编码?
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;

另一个好奇点:将此EOLN函数应用于Windows(CRLF)文件类型时,实际上仅检查CR,就像检查Mac文件(旧?)所在的位置,不检查LF以下!

最佳答案

它在2007年未修复。

这是Delphi 2007中的代码

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;

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

我还没有检查之间的任何回归。

10-07 13:38