windows – EOLN中的Delphi 2006错误

前端之家收集整理的这篇文章主要介绍了windows – EOLN中的Delphi 2006错误前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我认为D2006(WIN 32)中的EOLN功能存在一个错误,当应用于具有Unix类型换行符(LF)的文本文件时,此LF是输入缓冲区中的第一个字符.
错误的来源是线
TEST    [EDX].TTextRec.Mode,tfCRLF

哪个应该正确阅读

TEST    [EDX].TTextRec.Flags,tfCRLF

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

以上行是Sytem单元下面的片段的一部分,当需要重新填充缓冲区时调用该片段.该错误未被注意,因为Mode字段是输入文件的奇数(这是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!

它没有在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.
(显然否则它不会编译).

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

原文链接:https://www.f2er.com/windows/364424.html

猜你在找的Windows相关文章