summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJérémy Compostella <jeremy.compostella@gmail.com>2012-03-09 19:21:42 +0100
committerPádraig Brady <P@draigBrady.com>2012-03-10 19:53:06 +0000
commit57c929da8bbc297249dadc560e8e3a569b0d685d (patch)
treef68334475ff3975f3ea179ea92935ef3b00de5ab /src
parent7480e2db2935663b9c0c4d66418ce2801005792d (diff)
downloadcoreutils-57c929da8bbc297249dadc560e8e3a569b0d685d.tar.xz
dirname: support more than one argument
* src/dirname.c (main): Handle new -z option and manage more than one argument. * doc/coreutils.texi (dirname invocation): Mention it. * NEWS (New features): Mention it. * tests/misc/dirname: Add a two arguments test.
Diffstat (limited to 'src')
-rw-r--r--src/dirname.c77
1 files changed, 50 insertions, 27 deletions
diff --git a/src/dirname.c b/src/dirname.c
index 3637a046f..ac218d5d9 100644
--- a/src/dirname.c
+++ b/src/dirname.c
@@ -23,9 +23,7 @@
#include <sys/types.h>
#include "system.h"
-#include "long-options.h"
#include "error.h"
-#include "quote.h"
/* The official name of this program (e.g., no 'g' prefix). */
#define PROGRAM_NAME "dirname"
@@ -34,6 +32,14 @@
proper_name ("David MacKenzie"), \
proper_name ("Jim Meyering")
+static struct option const longopts[] =
+{
+ {"zero", no_argument, NULL, 'z'},
+ {GETOPT_HELP_OPTION_DECL},
+ {GETOPT_VERSION_OPTION_DECL},
+ {NULL, 0, NULL, 0}
+};
+
void
usage (int status)
{
@@ -42,24 +48,27 @@ usage (int status)
else
{
printf (_("\
-Usage: %s NAME\n\
- or: %s OPTION\n\
+Usage: %s [OPTION] NAME...\n\
"),
- program_name, program_name);
+ program_name);
fputs (_("\
-Output NAME with its last non-slash component and trailing slashes removed;\n\
-if NAME contains no /'s, output '.' (meaning the current directory).\n\
+Output each NAME with its last non-slash component and trailing slashes\n\
+removed; if NAME contains no /'s, output '.' (meaning the current directory).\n\
\n\
"), stdout);
+ fputs (_("\
+ -z, --zero separate output with NUL rather than newline\n\
+"), stdout);
fputs (HELP_OPTION_DESCRIPTION, stdout);
fputs (VERSION_OPTION_DESCRIPTION, stdout);
printf (_("\
\n\
Examples:\n\
- %s /usr/bin/ Output \"/usr\".\n\
- %s stdio.h Output \".\".\n\
+ %s /usr/bin/ -> \"/usr\"\n\
+ %s dir1/str dir2/str -> \"dir1\" followed by \"dir2\"\n\
+ %s stdio.h -> \".\"\n\
"),
- program_name, program_name);
+ program_name, program_name, program_name);
emit_ancillary_info ();
}
exit (status);
@@ -69,6 +78,7 @@ int
main (int argc, char **argv)
{
static char const dot = '.';
+ bool use_nuls = false;
char const *result;
size_t len;
@@ -80,10 +90,26 @@ main (int argc, char **argv)
atexit (close_stdout);
- parse_long_options (argc, argv, PROGRAM_NAME, PACKAGE_NAME, Version,
- usage, AUTHORS, (char const *) NULL);
- if (getopt_long (argc, argv, "+", NULL, NULL) != -1)
- usage (EXIT_FAILURE);
+ while (true)
+ {
+ int c = getopt_long (argc, argv, "z", longopts, NULL);
+
+ if (c == -1)
+ break;
+
+ switch (c)
+ {
+ case 'z':
+ use_nuls = true;
+ break;
+
+ case_GETOPT_HELP_CHAR;
+ case_GETOPT_VERSION_CHAR (PROGRAM_NAME, AUTHORS);
+
+ default:
+ usage (EXIT_FAILURE);
+ }
+ }
if (argc < optind + 1)
{
@@ -91,23 +117,20 @@ main (int argc, char **argv)
usage (EXIT_FAILURE);
}
- if (optind + 1 < argc)
+ for (; optind < argc; optind++)
{
- error (0, 0, _("extra operand %s"), quote (argv[optind + 1]));
- usage (EXIT_FAILURE);
- }
+ result = argv[optind];
+ len = dir_len (result);
- result = argv[optind];
- len = dir_len (result);
+ if (! len)
+ {
+ result = &dot;
+ len = 1;
+ }
- if (! len)
- {
- result = &dot;
- len = 1;
+ fwrite (result, 1, len, stdout);
+ putchar (use_nuls ? '\0' :'\n');
}
- fwrite (result, 1, len, stdout);
- putchar ('\n');
-
exit (EXIT_SUCCESS);
}