我认为当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。
(显然,否则它不会编译)。
我还没有检查之间的任何回归。