EOLN中的Delphi 2006错误

时间:2014-04-18 04:01:42

标签: windows delphi unix

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

        TEST    [EDX].TTextRec.Mode,tfCRLF

应正确阅读

        TEST    [EDX].TTextRec.Flags,tfCRLF

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

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

fmInput  = $D7B1;

匹配 tfCRLF (= 1)中为Windows生成的文本文件设置的唯一位。新版本的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 !?

1 个答案:

答案 0 :(得分:0)

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   (显然不会编译)。

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