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