From 35842ca71763682dbae233115a1ab7004bf8cf8d Mon Sep 17 00:00:00 2001 From: Alexandre Julliard Date: Fri, 17 Feb 2006 11:42:17 +0100 Subject: [PATCH] tools: Added 'relpath' tool to compute relative Unix paths. --- Make.rules.in | 1 + tools/.gitignore | 1 + tools/Makefile.in | 5 +++ tools/relpath.c | 83 +++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 90 insertions(+) create mode 100644 tools/relpath.c diff --git a/Make.rules.in b/Make.rules.in index ddc92744dc9..9deee72b78c 100644 --- a/Make.rules.in +++ b/Make.rules.in @@ -72,6 +72,7 @@ BIN2RES = $(TOOLSDIR)/tools/bin2res WMC = $(TOOLSDIR)/tools/wmc/wmc WIDL = $(TOOLSDIR)/tools/widl/widl WINEGCC = $(TOOLSDIR)/tools/winegcc/winegcc +RELPATH = $(TOOLSDIR)/tools/relpath SFNT2FNT = $(TOOLSDIR)/tools/sfnt2fnt FNT2FON = $(TOOLSDIR)/tools/fnt2fon RC = $(WRC) diff --git a/tools/.gitignore b/tools/.gitignore index d811816f55d..e9581d09528 100644 --- a/tools/.gitignore +++ b/tools/.gitignore @@ -4,6 +4,7 @@ fnt2bdf fnt2fon make_ctests makedep +relpath sfnt2fnt winemaker.man wineprefixcreate diff --git a/tools/Makefile.in b/tools/Makefile.in index 78afd6a778e..c44525de19e 100644 --- a/tools/Makefile.in +++ b/tools/Makefile.in @@ -14,6 +14,7 @@ PROGRAMS = \ fnt2fon$(EXEEXT) \ make_ctests$(EXEEXT) \ makedep$(EXEEXT) \ + relpath$(EXEEXT) \ sfnt2fnt$(EXEEXT) \ wineprefixcreate @@ -26,6 +27,7 @@ C_SRCS = \ fnt2fon.c \ make_ctests.c \ makedep.c \ + relpath.c \ sfnt2fnt.c \ INSTALLSUBDIRS = \ @@ -58,6 +60,9 @@ fnt2bdf$(EXEEXT): fnt2bdf.o fnt2fon$(EXEEXT): fnt2fon.o $(CC) $(CFLAGS) -o $@ fnt2fon.o $(LIBPORT) +relpath$(EXEEXT): relpath.o + $(CC) $(CFLAGS) -o $@ relpath.o $(LIBPORT) + sfnt2fnt$(EXEEXT): sfnt2fnt.o $(CC) $(CFLAGS) -o $@ sfnt2fnt.o $(LIBUNICODE) $(LIBPORT) $(FREETYPELIBS) diff --git a/tools/relpath.c b/tools/relpath.c new file mode 100644 index 00000000000..e261dbd4c78 --- /dev/null +++ b/tools/relpath.c @@ -0,0 +1,83 @@ +/* + * Compute the relative path needed to go from one Unix dir to another + * + * Copyright 2006 Alexandre Julliard + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "config.h" + +#include +#include +#include + +/* determine where the destination path is located relative to the 'from' path */ +static const char *get_relative_path( const char *from, const char *dest, unsigned int *dotdots ) +{ +#define DIR_END(p) (*(p) == 0 || *(p) == '/') + const char *start; + + *dotdots = 0; + for (;;) + { + while (*from == '/') from++; + while (*dest == '/') dest++; + start = dest; /* save start of next path element */ + if (!*from) break; + + while (!DIR_END(from) && *from == *dest) { from++; dest++; } + if (DIR_END(from) && DIR_END(dest)) continue; + + /* count remaining elements in 'from' */ + do + { + (*dotdots)++; + while (!DIR_END(from)) from++; + while (*from == '/') from++; + } + while (*from); + break; + } + return start; +#undef DIR_END +} + + +int main( int argc, char *argv[] ) +{ + const char *start; + unsigned int dotdots = 0; + + if (argc != 3) + { + fprintf( stderr, "Usage: %s fromdir todir\n", argv[0] ); + exit(1); + } + start = get_relative_path( argv[1], argv[2], &dotdots ); + + if (!start[0] && !dotdots) printf( ".\n" ); + else + { + while (dotdots) + { + printf( ".." ); + dotdots--; + if (dotdots || start[0]) printf( "/" ); + } + printf( "%s\n", start ); + } + exit(0); +}