--- cygpath.orig.cc Fri May 19 17:06:28 2000 +++ cygpath.cc Fri Sep 15 13:26:01 2000 @@ -23,6 +23,7 @@ static char *prog_name; static char *file_arg; static char *close_arg; static int path_flag, unix_flag, windows_flag, absolute_flag; +static int shortname_flag, ignore_flag; static struct option long_options[] = { @@ -35,26 +36,105 @@ static struct option long_options[] = { (char *) "file", required_argument, (int *) &file_arg, 'f'}, { (char *) "version", no_argument, NULL, 'v' }, { (char *) "windows", no_argument, NULL, 'w' }, + { (char *) "short-name", no_argument, NULL, 's' }, { (char *) "windir", no_argument, NULL, 'W' }, { (char *) "sysdir", no_argument, NULL, 'S' }, + { (char *) "ignore", no_argument, NULL, 'i' }, { 0, no_argument, 0, 0 } }; static void usage (FILE *stream, int status) { - fprintf (stream, "\ -Usage: %s [-p|--path] (-u|--unix)|(-w|--windows) filename\n\ + if (!ignore_flag || !status) + fprintf (stream, "\ +Usage: %s [-p|--path] (-u|--unix)|(-w|--windows [-s|--short-name]) filename\n\ -a|--absolute output absolute path\n\ -c|--close handle close handle (for use in captured process)\n\ -f|--file file read file for path information\n\ -u|--unix print Unix form of filename\n\ -w|--windows print Windows form of filename\n\ + -s|--short-name print Windows short form of filename\n\ -W|--windir print `Windows' directory\n\ -S|--sysdir print `system' directory\n\ - -p|--path filename argument is a path\n", + -p|--path filename argument is a path\n\ + -i|--ignore ignore missing argument\n", prog_name); - exit (status); + exit (ignore_flag ? 0 : status); +} + +static char * +get_short_paths (char *path) +{ + char *sbuf; + char *sptr; + char *next; + char *ptr = path; + char *end = strrchr (path, 0); + DWORD acc = 0; + DWORD len; + + while (ptr != NULL) + { + next = ptr; + ptr = strchr (ptr, ';'); + if (ptr) + *ptr++ = 0; + len = GetShortPathName (next, NULL, 0); + if (len == ERROR_INVALID_PARAMETER) + { + fprintf (stderr, "%s: cannot create short name of %s\n", prog_name, next); + exit (2); + } + acc += len+1; + } + sptr = sbuf = (char *) malloc(acc+1); + if (sbuf == NULL) + { + fprintf (stderr, "%s: out of memory\n", prog_name); + exit (1); + } + ptr = path; + for(;;) + { + if (GetShortPathName (ptr, sptr, acc) == ERROR_INVALID_PARAMETER) + { + fprintf (stderr, "%s: cannot create short name of %s\n", prog_name, ptr); + exit (2); + } + + ptr = strrchr (ptr, 0); + sptr = strrchr (sptr, 0); + if (ptr == end) + break; + *sptr = ';'; + ++ptr, ++sptr; + } + return sbuf; +} + +static char * +get_short_name (const char *filename) +{ + char *sbuf; + DWORD len = GetShortPathName (filename, NULL, 0); + if (len == ERROR_INVALID_PARAMETER) + { + fprintf (stderr, "%s: cannot create short name of %s\n", prog_name, filename); + exit (2); + } + sbuf = (char *) malloc(++len); + if (sbuf == NULL) + { + fprintf (stderr, "%s: out of memory\n", prog_name); + exit (1); + } + if (GetShortPathName (filename, sbuf, len) == ERROR_INVALID_PARAMETER) + { + fprintf (stderr, "%s: cannot create short name of %s\n", prog_name, filename); + exit (2); + } + return sbuf; } static void @@ -100,14 +180,22 @@ doit (char *filename) if (unix_flag) cygwin_win32_to_posix_path_list (filename, buf); else + { cygwin_posix_to_win32_path_list (filename, buf); + if (shortname_flag) + buf = get_short_paths (buf); + } } else { if (unix_flag) (absolute_flag ? cygwin_conv_to_full_posix_path : cygwin_conv_to_posix_path) (filename, buf); else - (absolute_flag ? cygwin_conv_to_full_win32_path : cygwin_conv_to_win32_path) (filename, buf); + { + (absolute_flag ? cygwin_conv_to_full_win32_path : cygwin_conv_to_win32_path) (filename, buf); + if (shortname_flag) + buf = get_short_name (buf); + } } puts (buf); @@ -130,8 +218,10 @@ main (int argc, char **argv) path_flag = 0; unix_flag = 0; windows_flag = 0; + shortname_flag = 0; + ignore_flag = 0; options_from_file_flag = 0; - while ((c = getopt_long (argc, argv, (char *) "hac:f:opSuvwW", long_options, (int *) NULL)) + while ((c = getopt_long (argc, argv, (char *) "hac:f:opsSuvwWi", long_options, (int *) NULL)) != EOF) { switch (c) @@ -168,6 +258,12 @@ main (int argc, char **argv) windows_flag = 1; break; + case 's': + if (unix_flag) + usage (stderr, 1); + shortname_flag = 1; + break; + case 'W': GetWindowsDirectory(buf, MAX_PATH); cygwin_conv_to_posix_path(buf, buf2); @@ -180,6 +276,10 @@ main (int argc, char **argv) printf("%s\n", buf2); exit(0); + case 'i': + ignore_flag = 1; + break; + case 'h': usage (stdout, 0); break; @@ -245,6 +345,12 @@ main (int argc, char **argv) { case 'a': absolute_flag = 1; + break; + case 'i': + ignore_flag = 1; + break; + case 's': + shortname_flag = 1; break; case 'w': unix_flag = 0;