Index: cygpath.cc =================================================================== RCS file: /cvs/src/src/winsup/utils/cygpath.cc,v retrieving revision 1.69 diff -u -r1.69 cygpath.cc --- cygpath.cc 6 Jul 2012 14:52:33 -0000 1.69 +++ cygpath.cc 27 Jul 2012 08:01:19 -0000 @@ -37,6 +37,7 @@ static char *prog_name; static char *file_arg, *output_arg; static int path_flag, unix_flag, windows_flag, absolute_flag; +static int separator_mode; // 0 = newline, 1 = null, 2 = nothing static int shortname_flag, longname_flag; static int ignore_flag, allusers_flag, output_flag; static int mixed_flag, options_from_file_flag, mode_flag; @@ -47,6 +48,8 @@ static struct option long_options[] = { {(char *) "absolute", no_argument, NULL, 'a'}, {(char *) "close", required_argument, NULL, 'c'}, + {(char *) "no-newline", no_argument, NULL, 'n'}, + {(char *) "null", no_argument, NULL, '0'}, {(char *) "dos", no_argument, NULL, 'd'}, {(char *) "file", required_argument, NULL, 'f'}, {(char *) "help", no_argument, NULL, 'h'}, @@ -73,14 +76,14 @@ {0, no_argument, 0, 0} }; -static char options[] = "ac:df:hilmMopst:uVwAC:DHOPSWF:"; +static char options[] = "ac:df:hilmMopst:uVwAC:DHOPSWF:n0"; static void usage (FILE * stream, int status) { if (!ignore_flag || !status) fprintf (stream, "\ -Usage: %1$s (-d|-m|-u|-w|-t TYPE) [-f FILE] [OPTION]... NAME...\n\ +Usage: %1$s (-d|-m|-u|-w|-t TYPE) [-n0] [-f FILE] [OPTION]... NAME...\n\ %1$s [-c HANDLE] \n\ %1$s [-ADHOPSW] \n\ %1$s [-F ID] \n\ @@ -132,6 +135,8 @@ -f, --file FILE read FILE for input; use - to read from STDIN\n\ -o, --option read options from FILE as well (for use with --file)\n\ -c, --close HANDLE close HANDLE (for use in captured process)\n\ + -n, --no-newline do not print a newline after the path\n\ + -0, --null print a null byte instead of a newline after each path\n\ -i, --ignore ignore missing argument\n\ -h, --help output usage information and exit\n\ -V, --version output version information and exit\n\ @@ -303,6 +308,29 @@ return ret; } +static void +output_with_separator (const char* buf) +{ + fputs (buf, stdout); + + switch (separator_mode) + { + case 0: + fputc ('\n', stdout); + break; + + case 1: + fputc ('\0', stdout); + break; + + case 2: + break; + + default: + abort (); + } +} + static char * get_device_paths (char *path) { @@ -621,7 +649,8 @@ if (mixed_flag) convert_slashes (buf); } - printf ("%s\n", buf); + + output_with_separator (buf); } static void @@ -756,7 +785,8 @@ } } - puts (print_tmp ? tmp : buf); + output_with_separator (print_tmp ? tmp : buf); + if (buf2) free (buf2); if (buf) @@ -810,6 +840,14 @@ CloseHandle ((HANDLE) strtoul (optarg, NULL, 16)); break; + case '0': + separator_mode = 1; + break; + + case 'n': + separator_mode = 2; + break; + case 'd': windows_flag = 1; shortname_flag = 1;