我认为当应用于具有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 !?
答案 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
(显然不会编译)。
我没有检查过它们之间的任何回归。