Alexandre Julliard : tools: Added 'relpath' tool to compute relative Unix paths.

Alexandre Julliard julliard at wine.codeweavers.com
Fri Feb 17 04:59:30 CST 2006


Module: wine
Branch: refs/heads/master
Commit: 35842ca71763682dbae233115a1ab7004bf8cf8d
URL:    http://source.winehq.org/git/?p=wine.git;a=commit;h=35842ca71763682dbae233115a1ab7004bf8cf8d

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Fri Feb 17 11:42:17 2006 +0100

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(+), 0 deletions(-)
 create mode 100644 tools/relpath.c

diff --git a/Make.rules.in b/Make.rules.in
index ddc9274..9deee72 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 d811816..e9581d0 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 78afd6a..c44525d 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 0000000..e261dbd
--- /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 <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+/* 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);
+}




More information about the wine-cvs mailing list