/* dirname -- strip suffix from file name Copyright (C) 1990-2023 Free Software Foundation, Inc. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ /* Written by David MacKenzie and Jim Meyering. */ #include #include #include #include #include "system.h" /* The official name of this program (e.g., no 'g' prefix). */ #define PROGRAM_NAME "dirname" #define AUTHORS \ proper_name ("David MacKenzie"), \ proper_name ("Jim Meyering") static struct option const longopts[] = { {"zero", no_argument, nullptr, 'z'}, {GETOPT_HELP_OPTION_DECL}, {GETOPT_VERSION_OPTION_DECL}, {nullptr, 0, nullptr, 0} }; void usage (int status) { if (status != EXIT_SUCCESS) emit_try_help (); else { printf (_("\ Usage: %s [OPTION] NAME...\n\ "), program_name); fputs (_("\ 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 end each output line with NUL, not newline\n\ "), stdout); fputs (HELP_OPTION_DESCRIPTION, stdout); fputs (VERSION_OPTION_DESCRIPTION, stdout); printf (_("\ \n\ Examples:\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); emit_ancillary_info (PROGRAM_NAME); } exit (status); } int main (int argc, char **argv) { static char const dot = '.'; bool use_nuls = false; char const *result; size_t len; initialize_main (&argc, &argv); set_program_name (argv[0]); setlocale (LC_ALL, ""); bindtextdomain (PACKAGE, LOCALEDIR); textdomain (PACKAGE); atexit (close_stdout); while (true) { int c = getopt_long (argc, argv, "z", longopts, nullptr); 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) { error (0, 0, _("missing operand")); usage (EXIT_FAILURE); } for (; optind < argc; optind++) { result = argv[optind]; len = dir_len (result); if (! len) { result = ˙ len = 1; } fwrite (result, 1, len, stdout); putchar (use_nuls ? '\0' :'\n'); } return EXIT_SUCCESS; }