我认为在D2006(WIN 32)的EOLN函数中存在一个bug,当应用于具有Unix类型换行符(LF)的文本文件时,如果这个LF是输入缓冲区中的第一个字符,则会出现问题。这个bug的源代码是这一行:
TEST [EDX].TTextRec.Mode,tfCRLF
应该正确阅读为:
TEST [EDX].TTextRec.Flags,tfCRLF
存储换行样式的是Flags字段,而不是存储输入/输出模式的Mode字段。
上面这行是从System单元中的以下代码片段中提取出来的,当需要重新填充缓冲区时会调用该代码。由于对于输入文件(通常与EOLN一起使用的模式)Mode字段是奇数,因此该错误未被注意到。
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;
还有一个奇怪的地方:当应用于Windows (CRLF)文件类型时,这个EOLN函数实际上只检查CR,就好像它是一个(旧的?)Mac文件,不会检查后面是否有LF!?