2 * Compute the relative path needed to go from one Unix dir to another
4 * Copyright 2006 Alexandre Julliard
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
27 /* determine where the destination path is located relative to the 'from' path */
28 static const char *get_relative_path( const char *from
, const char *dest
, unsigned int *dotdots
)
30 #define DIR_END(p) (*(p) == 0 || *(p) == '/')
33 /* a path of "." is equivalent to an empty path */
34 if (!strcmp( from
, "." )) from
= "";
39 while (*from
== '/') from
++;
40 while (*dest
== '/') dest
++;
41 start
= dest
; /* save start of next path element */
44 while (!DIR_END(from
) && *from
== *dest
) { from
++; dest
++; }
45 if (DIR_END(from
) && DIR_END(dest
)) continue;
47 /* count remaining elements in 'from' */
51 while (!DIR_END(from
)) from
++;
52 while (*from
== '/') from
++;
62 int main( int argc
, char *argv
[] )
65 unsigned int dotdots
= 0;
69 fprintf( stderr
, "Usage: %s fromdir todir\n", argv
[0] );
72 start
= get_relative_path( argv
[1], argv
[2], &dotdots
);
74 if (!start
[0] && !dotdots
) printf( ".\n" );
81 if (dotdots
|| start
[0]) printf( "/" );
83 printf( "%s\n", start
);