Mar*_*ler 7 unix windows delphi
我认为D2006(WIN 32)中的EOLN功能存在一个错误,当应用于具有Unix类型换行符(LF)的文本文件时,此LF是输入缓冲区中的第一个字符.错误的来源是线
TEST [EDX].TTextRec.Mode,tfCRLF
Run Code Online (Sandbox Code Playgroud)
哪个应该正确阅读
TEST [EDX].TTextRec.Flags,tfCRLF
Run Code Online (Sandbox Code Playgroud)
这是标志字段,其存储的线制动器样式,而不是模式字段,其存储的输入/输出模式.
以上行是Sytem单元下面的片段的一部分,当需要重新填充缓冲区时调用该片段.该错误未被注意,因为Mode字段是输入文件的奇数(这是EOLN通常使用的模式)
fmInput = $D7B1;
Run Code Online (Sandbox Code Playgroud)
匹配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;
Run Code Online (Sandbox Code Playgroud)
另一个好奇心:这个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;
Run Code Online (Sandbox Code Playgroud)
XE6 中已修复
在 Delphi XE6 中使用纯 Pascal 版本,它也可以正确检查 t.Flags。
(显然否则它不会编译)。
我没有检查其间是否有任何回归。