我认为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。
(显然,否则它将无法编译)
我没有检查两者之间的任何回归。