C/L utility to translate unix and dos paths

Michael Wetherell mike.wetherell at ntlworld.com
Thu Apr 25 06:40:19 CDT 2002


The 'configure' band still had broken long lines, and perhaps I
shouldn't have had it there anyway since it can be generated, so I've
just removed it.

ChangeLog:
        * configure, configure.ac, Makefile.in, schedule/process.c
          programs/Makefile.in, programs/winepath/.cvsignore
          programs/winepath/Makefile.in, programs/winepath/winepath.c
        Mike Wetherell <mike.wetherell at ntlworld.com>
        Utility to convert between Unix and Windows paths at the command line.

Index: configure.ac
===================================================================
RCS file: /home/wine/wine/configure.ac,v
retrieving revision 1.20
diff -u -r1.20 configure.ac
--- configure.ac	20 Apr 2002 21:00:42 -0000	1.20
+++ configure.ac	22 Apr 2002 22:50:08 -0000
@@ -1406,6 +1406,7 @@
 programs/wcmd/Makefile
 programs/wineconsole/Makefile
 programs/winemine/Makefile
+programs/winepath/Makefile
 programs/winetest/Makefile
 programs/winhelp/Makefile
 programs/winver/Makefile
Index: Makefile.in
===================================================================
RCS file: /home/wine/wine/Makefile.in,v
retrieving revision 1.115
diff -u -r1.115 Makefile.in
--- Makefile.in	17 Apr 2002 16:51:47 -0000	1.115
+++ Makefile.in	22 Apr 2002 22:50:09 -0000
@@ -30,7 +30,8 @@
 # Programs that link with libwine
 LIBPROGRAMS = \
 	debugger/winedbg \
-	programs/wineconsole/wineconsole
+	programs/wineconsole/wineconsole \
+	programs/winepath/winepath
 
 # Libraries (not dlls) to build
 LIBRARIES = \
@@ -66,6 +67,7 @@
 	library \
 	ole \
 	programs/wineconsole \
+	programs/winepath \
 	server \
 	tools \
 	tsx11 \
Index: scheduler/process.c
===================================================================
RCS file: /home/wine/wine/scheduler/process.c,v
retrieving revision 1.177
diff -u -r1.177 process.c
--- scheduler/process.c	15 Apr 2002 15:38:10 -0000	1.177
+++ scheduler/process.c	22 Apr 2002 22:50:18 -0000
@@ -241,7 +241,7 @@
  *
  * Main process initialisation code
  */
-static BOOL process_init( char *argv[] )
+BOOL process_init( char *argv[] )
 {
     BOOL ret;
     size_t info_size = 0;
Index: programs/Makefile.in
===================================================================
RCS file: /home/wine/wine/programs/Makefile.in,v
retrieving revision 1.14
diff -u -r1.14 Makefile.in
--- programs/Makefile.in	11 Apr 2002 23:58:40 -0000	1.14
+++ programs/Makefile.in	22 Apr 2002 22:50:19 -0000
@@ -20,6 +20,7 @@
 	wcmd \
 	wineconsole \
 	winemine \
+	winepath \
 	winetest \
 	winhelp \
 	winver
diff -Nu programs/winepath/.cvsignore programs/winepath/.cvsignore
--- programs/winepath/.cvsignore	Thu Jan  1 01:00:00 1970
+++ programs/winepath/.cvsignore	Tue Apr 23 00:15:47 2002
@@ -0,0 +1,2 @@
+Makefile
+winepath
diff -Nu programs/winepath/Makefile.in programs/winepath/Makefile.in
--- programs/winepath/Makefile.in	Thu Jan  1 01:00:00 1970
+++ programs/winepath/Makefile.in	Tue Apr 23 00:15:47 2002
@@ -0,0 +1,27 @@
+TOPSRCDIR = @top_srcdir@
+TOPOBJDIR = ../..
+SRCDIR    = @srcdir@
+VPATH     = @srcdir@
+
+PROGRAMS  = winepath
+MODULE    = none
+IMPORTS   = ntdll.dll
+
+C_SRCS = \
+	winepath.c
+
+all: $(PROGRAMS)
+
+ at MAKE_RULES@
+
+winepath: $(OBJS)
+	$(CC) $(CFLAGS) -o winepath $(OBJS) -L$(DLLDIR) $(IMPORTS:%=-l%) $(LIBWINE) $(LIBUNICODE) $(LDFLAGS)
+
+install:: $(PROGRAMS)
+	[ -d $(bindir) ] || $(MKDIR) $(bindir)
+	$(INSTALL_PROGRAM) winepath $(bindir)/winepath
+
+uninstall::
+	$(RM) $(bindir)/winepath
+
+### Dependencies:
diff -Nu programs/winepath/winepath.c programs/winepath/winepath.c
--- programs/winepath/winepath.c	Thu Jan  1 01:00:00 1970
+++ programs/winepath/winepath.c	Tue Apr 23 00:17:07 2002
@@ -0,0 +1,184 @@
+/*
+ * Translate between Wine and Unix paths
+ *
+ * Copyright 2002 Mike Wetherell
+ *
+ * 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 <windows.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+#if defined(_WIN32) || defined(_WIN64) || defined(WINELIB)
+#define WINDOWS 1
+#endif
+
+#define VERSION "0.1 (" PACKAGE_STRING ")"
+
+enum { 
+    SHORTFORMAT = 1,
+    LONGFORMAT  = 2,
+    UNIXFORMAT  = 4
+};
+
+static char *progname;
+
+/* Wine specific functions */
+extern BOOL process_init(char *argv[]);
+typedef BOOL WINAPI wine_get_unix_file_name_t ( LPCSTR dos,
+                                                LPSTR buffer,
+                                                DWORD len );
+/*
+ * handle an option
+ */
+int option(int shortopt, char *longopt)
+{
+    const char *helpmsg =
+    "Convert PATH(s) to Unix or Windows long or short paths.\n"
+    "\n"
+    "  -u, --unix    output Unix format\n"
+    "  -l, --long    output Windows long format\n"
+    "  -s, --short   output Windows short format \n"
+    "  -h, --help    output this help message and exit\n"
+    "  -v, --version output version information and exit\n"
+    "\n"
+    "The input paths can be in any format. If more than one option is given\n"
+    "then the input paths are ouput in all formats specified, in the order\n"
+    "Unix, long, short. If no option is given the default is Unix format.\n";
+
+    switch (shortopt) {
+        case 'h':
+            printf("Usage: %s [OPTION] [PATH]...\n", progname);
+            printf(helpmsg);
+            exit(0);
+        case 'v':
+            printf("%s version " VERSION "\n", progname);
+            exit(0);
+        case 'l':
+            return LONGFORMAT;
+        case 's':
+            return SHORTFORMAT;
+        case 'u':
+            return UNIXFORMAT;
+    } 
+
+    fprintf(stderr, "%s: invalid option ", progname);
+    if (longopt)
+        fprintf(stderr, "'%s'\n", longopt);
+    else
+        fprintf(stderr, "'-%c'\n", shortopt); 
+    fprintf(stderr, "Try '%s --help' for help\n", progname);
+    exit(2);
+}
+
+/*
+ * Parse command line options
+ */
+int parse_options(char *argv[])
+{
+    int outputformats = 0;
+    int done = 0;
+    char *longopts[] = { "long", "short", "unix", "help", "version", "" };
+    int i, j;
+
+    for (i = 1; argv[i] && !done; )
+    {
+        if (argv[i][0] != '-') {
+            /* not an option */
+            i++;
+            continue;
+        }
+
+        if (argv[i][1] == '-') {
+            if (argv[i][2] == 0) {
+                /* '--' end of options */
+                done = 1;
+            } else {
+                /* long option */
+                for (j = 0; longopts[j][0]; j++)
+                    if (strcmp(argv[i]+2, longopts[j]) == 0)
+                        break;
+                outputformats |= option(longopts[j][0], argv[i]);
+            }
+        } else {
+            /* short options */
+            for (j = 1; argv[i][j]; j++)
+                outputformats |= option(argv[i][j], NULL); 
+        }
+
+        /* remove option */
+        for (j = i + 1; argv[j - 1]; j++)
+            argv[j - 1] = argv[j];
+    }
+
+    return outputformats;
+}
+
+/*
+ * Main function
+ */
+int main(int argc, char *argv[])
+{
+#ifndef WINDOWS
+    char *noargs[2] = { argv[0], NULL };
+#endif
+    wine_get_unix_file_name_t *wine_get_unix_file_name_ptr;
+    static char path[MAX_PATH];
+    int outputformats;
+    int i;
+
+    progname = argv[0];
+    outputformats = parse_options(argv);
+    if (outputformats == 0)
+        outputformats = UNIXFORMAT;
+
+#ifndef WINDOWS
+    if (!process_init(noargs))
+        exit(1);
+    wine_get_unix_file_name_ptr = wine_get_unix_file_name;
+#else
+    if (outputformats & UNIXFORMAT) {
+        wine_get_unix_file_name_ptr = (wine_get_unix_file_name_t*)
+            GetProcAddress(GetModuleHandle("KERNEL32"),
+                           "wine_get_unix_file_name");
+        if (wine_get_unix_file_name_ptr == NULL) {
+            fprintf(stderr, "%s: cannot get the address of "
+                            "'wine_get_unix_file_name'\n", progname);
+            exit(3);
+        }
+    }
+#endif
+
+    for (i = 1; argv[i]; i++)
+    {
+        if (outputformats & LONGFORMAT) {
+            GetLongPathNameA(argv[i], path, sizeof(path));
+            printf("%s\n", path);
+        }
+        if (outputformats & SHORTFORMAT) {
+            GetShortPathNameA(argv[i], path, sizeof(path));
+            printf("%s\n", path);
+        }
+        if (outputformats & UNIXFORMAT) {
+            wine_get_unix_file_name_ptr(argv[i], path, sizeof(path));
+            printf("%s\n", path);
+        }
+    }
+
+    exit(0);
+}



More information about the wine-patches mailing list