From 94567a73b86a15fd1b3c42bb0b65e6dbbacf8bf4 Mon Sep 17 00:00:00 2001 From: corinna Date: Wed, 23 May 2007 16:45:03 +0000 Subject: [PATCH] * cygpath.cc: Include argz.h. (options_from_file_flag): Move from main to global static variable. (mode_flag): Ditto. (do_sysfolders): Rename from dowin and accommodate throughout. Don't exit from here. (do_pathconv): Rename from doit and accommodate throughout. (print_version): Change copyright. (do_options): New function, centralizing option processing. Rework checking options for correctness. (action): New function, centralizing calling worker functions. (main): Simplify. Move option processing to do_options. Move calling worker functions to action. Rework getting arguments from files. --- winsup/utils/ChangeLog | 15 +++ winsup/utils/cygpath.cc | 242 +++++++++++++++++++++++------------------------- 2 files changed, 130 insertions(+), 127 deletions(-) diff --git a/winsup/utils/ChangeLog b/winsup/utils/ChangeLog index c690337e11..6306a88cfc 100644 --- a/winsup/utils/ChangeLog +++ b/winsup/utils/ChangeLog @@ -1,3 +1,18 @@ +2007-05-23 Corinna Vinschen + + * cygpath.cc: Include argz.h. + (options_from_file_flag): Move from main to global static variable. + (mode_flag): Ditto. + (do_sysfolders): Rename from dowin and accommodate throughout. + Don't exit from here. + (do_pathconv): Rename from doit and accommodate throughout. + (print_version): Change copyright. + (do_options): New function, centralizing option processing. + Rework checking options for correctness. + (action): New function, centralizing calling worker functions. + (main): Simplify. Move option processing to do_options. Move calling + worker functions to action. Rework getting arguments from files. + 2007-03-30 Mark Mitchell * utils/cygpath.cc (get_long_path_name_w32impl): Close handles returned diff --git a/winsup/utils/cygpath.cc b/winsup/utils/cygpath.cc index 45fc9b405f..e49efff223 100644 --- a/winsup/utils/cygpath.cc +++ b/winsup/utils/cygpath.cc @@ -14,6 +14,7 @@ details. */ #include #include #include +#include #include #include #include @@ -33,7 +34,8 @@ static char *file_arg, *output_arg; static int path_flag, unix_flag, windows_flag, absolute_flag; static int shortname_flag, longname_flag; static int ignore_flag, allusers_flag, output_flag; -static int mixed_flag; +static int mixed_flag, options_from_file_flag, mode_flag; + static const char *format_type_arg; static struct option long_options[] = { @@ -532,7 +534,7 @@ get_user_folder (char* path, int id, int allid) } static void -dowin (char option) +do_sysfolders (char option) { char *buf, buf1[MAX_PATH], buf2[MAX_PATH]; DWORD len = MAX_PATH; @@ -619,7 +621,6 @@ dowin (char option) buf = get_mixed_name (buf); } printf ("%s\n", buf); - exit (0); } static void @@ -641,7 +642,7 @@ report_mode (char *filename) } static void -doit (char *filename) +do_pathconv (char *filename) { char *buf; DWORD len; @@ -745,37 +746,29 @@ print_version () printf ("\ cygpath (cygwin) %.*s\n\ Path Conversion Utility\n\ -Copyright 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005 Red Hat, Inc.\n\ +Copyright 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, \n\ + 2007 Red Hat, Inc.\n\ Compiled on %s\n\ ", len, v, __DATE__); } -int -main (int argc, char **argv) +static int +do_options (int argc, char **argv, int from_file) { int c, o = 0; - int options_from_file_flag; - int mode_flag; - - prog_name = strrchr (argv[0], '/'); - if (prog_name == NULL) - prog_name = strrchr (argv[0], '\\'); - if (prog_name == NULL) - prog_name = argv[0]; - else - prog_name++; - path_flag = 0; - unix_flag = 1; + unix_flag = 0; windows_flag = 0; shortname_flag = 0; longname_flag = 0; mixed_flag = 0; ignore_flag = 0; - options_from_file_flag = 0; allusers_flag = 0; output_flag = 0; mode_flag = 0; + if (!from_file) + options_from_file_flag = 0; + optind = 0; while ((c = getopt_long (argc, argv, options, long_options, (int *) NULL)) != EOF) { @@ -786,18 +779,19 @@ main (int argc, char **argv) break; case 'c': + if (!optarg) + usage (stderr, 1); CloseHandle ((HANDLE) strtoul (optarg, NULL, 16)); break; case 'd': - if (windows_flag) - usage (stderr, 1); - unix_flag = 0; windows_flag = 1; shortname_flag = 1; break; case 'f': + if (from_file || !optarg) + usage (stderr, 1); file_arg = optarg; break; @@ -806,6 +800,8 @@ main (int argc, char **argv) break; case 'o': + if (from_file) + usage (stderr, 1); options_from_file_flag = 1; break; @@ -814,20 +810,14 @@ main (int argc, char **argv) break; case 'u': - if (windows_flag || mixed_flag) - usage (stderr, 1); unix_flag = 1; break; case 'w': - if (windows_flag || mixed_flag) - usage (stderr, 1); - unix_flag = 0; windows_flag = 1; break; case 'm': - unix_flag = 0; windows_flag = 1; mixed_flag = 1; break; @@ -840,37 +830,25 @@ main (int argc, char **argv) shortname_flag = 1; break; - case 't': - if (optarg == NULL) + case 't': + if (!optarg) usage (stderr, 1); format_type_arg = (*optarg == '=') ? (optarg + 1) : (optarg); if (strcasecmp (format_type_arg, "dos") == 0) { - if (windows_flag || longname_flag) - usage (stderr, 1); - unix_flag = 0; - windows_flag = 1; - shortname_flag = 1; + windows_flag = 1; + shortname_flag = 1; } - else if (strcasecmp (format_type_arg, "mixed") == 0) + else if (!strcasecmp (format_type_arg, "mixed")) { - unix_flag = 0; - mixed_flag = 1; + windows_flag = 1; + mixed_flag = 1; } - else if (strcasecmp (format_type_arg, "unix") == 0) - { - if (windows_flag) - usage (stderr, 1); + else if (!strcasecmp (format_type_arg, "unix")) unix_flag = 1; - } - else if (strcasecmp (format_type_arg, "windows") == 0) - { - if (mixed_flag) - usage (stderr, 1); - unix_flag = 0; + else if (!strcasecmp (format_type_arg, "windows")) windows_flag = 1; - } else usage (stderr, 1); break; @@ -885,16 +863,14 @@ main (int argc, char **argv) case 'P': case 'S': case 'W': - if (output_flag) - usage (stderr, 1); - output_flag = 1; + ++output_flag; o = c; break; case 'F': - if (output_flag || !optarg) + if (!optarg) usage (stderr, 1); - output_flag = 1; + ++output_flag; output_arg = optarg; o = c; break; @@ -917,23 +893,43 @@ main (int argc, char **argv) } } - if (options_from_file_flag && !file_arg) + /* If none of the "important" flags are set, -u is default. */ + if (!unix_flag && !windows_flag && !options_from_file_flag && !output_flag + && !mode_flag) + unix_flag = 1; + + /* Only one of ... */ + if (unix_flag + windows_flag + output_flag + mode_flag > 1 + + (!from_file ? options_from_file_flag : 0)) usage (stderr, 1); - if (longname_flag && !windows_flag) + /* options_from_file_flag requires a file. */ + if (!from_file && options_from_file_flag && !file_arg) usage (stderr, 1); - if (shortname_flag && !windows_flag) + /* longname and shortname don't play well together. */ + if (longname_flag && shortname_flag) usage (stderr, 1); - if (!unix_flag && !windows_flag && !mixed_flag && !options_from_file_flag) + /* longname and shortname only make sense with Windows paths. */ + if ((longname_flag || shortname_flag) && !windows_flag) usage (stderr, 1); - if (!file_arg) + return o; +} + +static void +action (int argc, char **argv, int opt) +{ + if (output_flag) { - if (output_flag) - dowin (o); + if (argv[optind]) + usage (stderr, 1); + do_sysfolders (opt); + } + else + { if (optind > argc - 1) usage (stderr, 1); @@ -941,8 +937,27 @@ main (int argc, char **argv) if (mode_flag) report_mode (argv[i]); else - doit (argv[i]); + do_pathconv (argv[i]); } +} + +int +main (int argc, char **argv) +{ + int o; + + prog_name = strrchr (argv[0], '/'); + if (!prog_name) + prog_name = strrchr (argv[0], '\\'); + if (!prog_name) + prog_name = argv[0]; + else + prog_name++; + + o = do_options (argc, argv, 0); + + if (!file_arg) + action (argc, argv, o); else { FILE *fp; @@ -951,82 +966,55 @@ main (int argc, char **argv) if (argv[optind]) usage (stderr, 1); - if (strcmp (file_arg, "-") != 0) - fp = fopen (file_arg, "rt"); + if (strcmp (file_arg, "-")) + { + if (!(fp = fopen (file_arg, "rt"))) + { + perror ("cygpath"); + exit (1); + } + } else { fp = stdin; setmode (0, O_TEXT); } - if (fp == NULL) - { - perror ("cygpath"); - exit (1); - } - setbuf (stdout, NULL); - while (fgets (buf, sizeof (buf), fp) != NULL) + + while (fgets (buf, sizeof (buf), fp)) { - char *s = buf; - char *p = strchr (s, '\n'); + size_t azl = 0; + int ac; + char *az, **av; + char *p = strchr (buf, '\n'); if (p) *p = '\0'; - if (options_from_file_flag && *s == '-') + if (argz_create_sep (buf, ' ', &az, &azl)) + { + perror ("cygpath"); + exit (1); + } + ac = argz_count (az, azl) + 1; + av = (char **) malloc ((ac + 1) * sizeof (char *)); + if (!av) { - char c; - for (c = *++s; c && !isspace (c); c = *++s) - switch (c) - { - case 'a': - absolute_flag = 1; - break; - case 'i': - ignore_flag = 1; - break; - case 's': - shortname_flag = 1; - longname_flag = 0; - break; - case 'l': - shortname_flag = 0; - longname_flag = 1; - break; - case 'm': - unix_flag = 0; - windows_flag = 1; - mixed_flag = 1; - case 'w': - unix_flag = 0; - windows_flag = 1; - break; - case 'u': - windows_flag = 0; - unix_flag = 1; - break; - case 'p': - path_flag = 1; - break; - case 'D': - case 'H': - case 'O': - case 'P': - case 'S': - case 'W': - output_flag = 1; - o = c; - break; - } - if (*s) - do - s++; - while (*s && isspace (*s)); + perror ("cygpath"); + exit (1); } - if (*s && !output_flag) - doit (s); - if (!*s && output_flag) - dowin (o); + av[0] = prog_name; + argz_extract (az, azl, av + 1); + free (az); + if (options_from_file_flag) + o = do_options (ac, av, 1); + else + { + optind = 1; + unix_flag = 1; + output_flag = mode_flag = windows_flag = 0; + } + action (ac, av, o); + free (av); } } - exit (0); } -- 2.11.0