[Back to MISC SWAG index] [Back to Main SWAG index] [Original]
{
I'm not sure if the following bug in Contains() of STDDLG.PAS has been fixed
in 7.01 (since I still don't have it) so I decided to post it.
STDDLG.PAS, function Contains()
}
{ Contains returns true if S1 contains any characters in S2 }
function Contains(S1, S2 : String): Boolean; near; assembler;
asm
PUSH DS
CLD
LDS SI, S1
LES DI, S2
MOV DX, DI
> INC DX { DX still pointed at len byte }
XOR AH, AH
LODSB
MOV BX, AX
OR BX, BX
JZ @@2
MOV AL, ES:[DI]
XCHG AX, CX
@@1:
PUSH CX
MOV DI, DX
LODSB
REPNE SCASB
POP CX
JE @@3
DEC BX
JNZ @@1
@@2:
XOR AL, AL
JMP @@4
@@3:
MOV AL, 1
@@4:
POP DS
end;
{
BUT: fixing the bug reveals another bug <g>
The function is used to determine whether a filename or path contains illegal
characters or not. The last character in the constant "IllegalChars" is the
backslash "\" that would have been ignored by the buggy version of Contains().
However, the corrected version returns TRUE for Contains('\MYPATH\',
IllegalChars) (as it's supposed to). Since a path name created by FSplit
normally contains a "\" the filename is considered as FALSE by ValidFileName.
My solution is to add a second const named IllegalCharsFN for illegal chars in
the filename (but legal chars in path names) currently just containing '\'.
Furthermore, I removed space ' ' from the list of illegal characters (since it
isn't an illegal char!) and added '/' instead. But have a look at my final
correction suggestion:
}
function ValidFileName(var FileName : PathStr) : Boolean;
const
IllegalCharsFN = '\';
IllegalChars = ';,=+<>|"[]/';
var
Dir : DirStr;
Name : NameStr;
Ext : ExtStr;
{ Contains returns true if S1 contains any characters in S2 }
function Contains(S1, S2 : String) : Boolean; near; assembler;
asm
{...see above...}
end;
begin
ValidFileName := True;
FSplit(FileName, Dir, Name, Ext);
if not ((Dir = '') or PathValid(Dir)) or
Contains(Name, IllegalChars + IllegalCharsFN) or
Contains(Dir, IllegalChars) then
ValidFileName := False;
end;
[Back to MISC SWAG index] [Back to Main SWAG index] [Original]