diff options
| author | Charles Cabergs <me@cacharle.xyz> | 2020-08-07 19:55:14 +0200 |
|---|---|---|
| committer | Charles Cabergs <me@cacharle.xyz> | 2020-08-07 19:55:14 +0200 |
| commit | e2b1ce01e093ac2959da58b0cc86a710321188c7 (patch) | |
| tree | b2aa58e92f315b6766a861f901ce341da96c7848 /basename/basename.c | |
| parent | c08dba6327d50ddeec1441f3258951b6a826790c (diff) | |
| download | coreutils-e2b1ce01e093ac2959da58b0cc86a710321188c7.tar.gz coreutils-e2b1ce01e093ac2959da58b0cc86a710321188c7.tar.bz2 coreutils-e2b1ce01e093ac2959da58b0cc86a710321188c7.zip | |
Added basename
Diffstat (limited to 'basename/basename.c')
| -rw-r--r-- | basename/basename.c | 83 |
1 files changed, 83 insertions, 0 deletions
diff --git a/basename/basename.c b/basename/basename.c new file mode 100644 index 0000000..83f3b8f --- /dev/null +++ b/basename/basename.c @@ -0,0 +1,83 @@ +#include <unistd.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <stdbool.h> + +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; +} |
