我认为D2006(WIN 32)中的EOLN功能存在一个错误,当应用于具有Unix类型换行符(LF)的文本文件时,此LF是输入缓冲区中的第一个字符.
错误的来源是线
错误的来源是线
- TEST [EDX].TTextRec.Mode,tfCRLF
哪个应该正确阅读
- TEST [EDX].TTextRec.Flags,tfCRLF
Flags字段存储线制动器样式,而不是存储输入/输出模式的Mode字段.
以上行是Sytem单元下面的片段的一部分,当需要重新填充缓冲区时调用该片段.该错误未被注意,因为Mode字段是输入文件的奇数(这是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!
它没有在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.
(显然否则它不会编译).
我没有检查过它们之间的任何回归.