@cindex stripping non-directory suffix
@cindex non-directory suffix, stripping
-@command{dirname} prints all but the final slash-delimited component of
-@var{name}. Slashes on either side of the final component are also
-removed. If the string contains no slash, @command{dirname} prints
-@samp{.} (meaning the current directory). Synopsis:
+@command{dirname} prints all but the final slash-delimited component
+of each @var{name}. Slashes on either side of the final component are
+also removed. If the string contains no slash, @command{dirname}
+prints @samp{.} (meaning the current directory). Synopsis:
@example
-dirname @var{name}
+dirname [@var{option}] @var{name}...
@end example
@var{name} need not be a file name, but if it is, this operation
result is @samp{//} on platforms where @var{//} is distinct from
@var{/}, and @samp{/} on platforms where there is no difference.
-The only options are @option{--help} and @option{--version}. @xref{Common
-options}.
+The program accepts the following option. Also see @ref{Common options}.
+
+@table @samp
+
+@item -z
+@itemx --zero
+@opindex -z
+@opindex --zero
+Separate output items with @sc{nul} characters.
+
+@end table
@exitstatus
dirname /usr/bin/sort
dirname /usr/bin//.//
+# Output "dir1" followed by "dir2"
+dirname dir1/str dir2/str
+
# Output ".".
dirname stdio.h
@end smallexample
#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"
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)
{
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);
main (int argc, char **argv)
{
static char const dot = '.';
+ bool use_nuls = false;
char const *result;
size_t len;
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)
{
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 = ˙
+ len = 1;
+ }
- if (! len)
- {
- result = ˙
- len = 1;
+ fwrite (result, 1, len, stdout);
+ putchar (use_nuls ? '\0' :'\n');
}
- fwrite (result, 1, len, stdout);
- putchar ('\n');
-
exit (EXIT_SUCCESS);
}
(
['fail-1', {ERR => "$prog: missing operand\n"
. "Try '$prog --help' for more information.\n"}, {EXIT => '1'}],
- ['fail-2', qw(a b), {ERR => "$prog: extra operand 'b'\n"
- . "Try '$prog --help' for more information.\n"}, {EXIT => '1'}],
['a', qw(d/f), {OUT => 'd'}],
['b', qw(/d/f), {OUT => '/d'}],
['k', qw(///a///b), {OUT => '///a'}],
['l', qw(///a//b/), {OUT => '///a'}],
['m', qw(''), {OUT => '.'}],
+ ['n', qw(a/b c/d), {OUT => "a\nc"}],
);
# Append a newline to end of each expected 'OUT' string.