home *** CD-ROM | disk | FTP | other *** search
- {
- 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;