Contributor: PETER GEDECK             

{
bcp100@cd4680fs.rrze.uni-erlangen.de (Peter Gedeck)

: Does anyone have a relative path routine?   An example of what I mean by a
: relative path routine is the Turbo Pascal IDE's editor window titles. It
: only displays as much of the files path name as is necessary. It should be
: something like
:     function RelativePath(FullPath: string): string;

This is what I use to get a relative file name. I think it works correctly
and hope you will find it useful.
}

Uses
  Dos;


function GetCurDir : DirStr;
var
  CurDir : DirStr;
begin
  GetDir(0, CurDir);
  GetCurDir := CurDir;
end;


function GetCurDrive : Char; assembler;
asm
  MOV     AH,19H
  INT     21H
  ADD     AL,'A'
end;


function GetRelativeFileName(F : String) : String;
var
  D  : DirStr;
  N  : NameStr;
  E  : ExtStr;
  i  : integer;
  rd : string;

begin
  F := FExpand(F);
  FSplit(F, D, N, E);
  if GetCurDrive = D[1] then
  begin
    { Same Drive - remove Driveinformation from D }
    Delete(D, 1, 2);
    F := GetCurDir + '\';
    Delete(F, 1, 2);
    { Maybe it is a file in a directory higher than the actual directory }
    i := Pos(F, d);
    if i > 0 then
      Delete(d, 1, length(F))
    else
    begin
      rd := '';
      if Pos(d, F) = 0 then
      repeat
        repeat
          rd := d[Ord(d[0])] + rd;
          dec(d[0]);
        until d[Ord(d[0])] = '\';
      until Pos(d, F) > 0;

      { Maybe it  is a file in a directory lower than the actual directory }
      if Pos(d, F) > 0 then
      begin
        repeat
          rd := '..\' + rd;
          dec(F[0]);
          while F[Ord(F[0])] <> '\' do
            dec(F[0]);
        until (Pos(d, F) > 0) and not ((d = '\') and (F <> '\'));
        d := rd;
      end;
    end;
  end;
  GetRelativeFileName := (D + N + E);
end;


begin
  Writeln(GetRelativeFileName('C:\qmpro\dl\bp\lib\ansi.pas'));
end.