From c40f79737a4ce6ae0cd8bd6ea7f302217333e486 Mon Sep 17 00:00:00 2001 From: Charles Cabergs Date: Sat, 22 Aug 2020 19:43:03 +0200 Subject: Added Makefile --- src/basename.c | 83 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 83 insertions(+) create mode 100644 src/basename.c (limited to 'src/basename.c') diff --git a/src/basename.c b/src/basename.c new file mode 100644 index 0000000..83f3b8f --- /dev/null +++ b/src/basename.c @@ -0,0 +1,83 @@ +#include +#include +#include +#include +#include + +char *g_name = "basename"; + +void fatal(char *message) +{ + fprintf(stderr, "%s: %s\n", g_name, message); + exit(EXIT_FAILURE); +} + +char *truncate_path(char *s, char *suffix) +{ + if (*s == '\0') + return s; + + size_t last = strlen(s) - 1; + while (s[last] == '/' && last != 0) + { + s[last] = '\0'; + last--; + } + + char *last_slash = strrchr(s, '/'); + if (last_slash != NULL && last_slash != s) + s = last_slash + 1; + + if (suffix != NULL) + { + char *end = s + strlen(s) - strlen(suffix); + if (end > s && strcmp(end, suffix) == 0) + *end = '\0'; + } + return s; +} + +int main(int argc, char **argv) +{ + int option; + char *suffix = NULL; + bool multiple = false; + char line_delim = '\n'; + + g_name = argv[0]; + while ((option = getopt(argc, argv, "as:z")) != -1) + { + switch (option) + { + case 's': + suffix = optarg; + case 'a': + multiple = true; + break; + case 'z': + line_delim = '\0'; + break; + default: + return EXIT_FAILURE; + } + } + + if (optind == argc) + fatal("missing operand"); + + if (!multiple) + { + argv[optind] = truncate_path(argv[optind], argv[optind + 1]); + fputs(argv[optind], stdout); + putchar(line_delim); + return EXIT_SUCCESS; + } + + for (; optind < argc; optind++) + { + argv[optind] = truncate_path(argv[optind], suffix); + fputs(argv[optind], stdout); + putchar(line_delim); + } + return EXIT_SUCCESS; +} -- cgit