EOLN中的Delphi 2006错误



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

        TEST    [EDX].TTextRec.Mode,tfCRLF

应该正确读取

        TEST    [EDX].TTextRec.Flags,tfCRLF

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

上面一行是Sytem单元的下面片段的一部分,当需要重新填充缓冲区时会调用该单元。错误没有被注意到,因为Mode字段是输入文件的奇数(这是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中修复
在DelphiXE6中,使用了纯Pascal版本,它还正确地检查t.Flags。
(显然,否则它将无法编译)

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

最新更新