Hi! Let's have a look for filename "C:A":
> function ExtractFileDir(const FileName: string): string; > var i,j: longint; > begin > if FileName[2]=':' then j:=3 > else j:=1; Now j = 3, pointing to the letter "A". OK. > I := Length(FileName); > while (I > 0) and not (FileName[I] in ['/', '\', ':']) do Dec(I); Error: I is supposed to go from the string end back to the string start, but never below j. But exactly this happens here. I is decremented below j, from 3 to 2, so shit might happen .. > if (I > j) and (FileName[I] in ['\', '/']) and > not (FileName[I - 1] in ['/', '\', ':']) then Dec(I); skipped > Result := Copy(FileName, j, I-j+1); Result = Copy(Filename, 3, 0). Is this an error or wrong documentation? The line result should be '', but it actually is 'a:c'. So there are two errors: 1. I decremented below j, but the programmer had in mind that i was above j. the while-statement should read 'while (I > J) ..' 2. The Copy returns the full string for length 0 - Note: I don't like the while structure for combined conditions. I prefer a repeat-until with several breaks. That usually makes things more clear. I know that this is not considered 'well-structured' programming, but the world we live in is not 'well-structured'. Should I post a new, tested "repeat - break - break - until" version of this function? Anton. > _______________________________________________ > fpc-pascal maillist - [EMAIL PROTECTED] > http://lists.freepascal.org/mailman/listinfo/fpc-pascal -- ---------- "Adas Methode war, wie sich zeigen wird, Tagträume in offenbar korrekte Berechnungen einzuweben." Doris Langley Moore: Ada, Countess of Lovelace (London 1977). ---------- Anton Tichawa Volkertstrasse 19 / 20 A-1020 Wien mobil: +43 664 52 07 907 email: [EMAIL PROTECTED] ---------- _______________________________________________ fpc-pascal maillist - [EMAIL PROTECTED] http://lists.freepascal.org/mailman/listinfo/fpc-pascal