basename.c (1174B)
- // utils-std: Collection of commonly available Unix tools
- // SPDX-FileCopyrightText: 2017 Haelwenn (lanodan) Monnier <contact+utils@hacktivis.me>
- // SPDX-License-Identifier: MPL-2.0
- #define _POSIX_C_SOURCE 200809L
- #include <libgen.h> // basename()
- #include <stdio.h> // puts(), perror()
- #include <string.h> // strlen(), strncmp()
- #ifdef __GNUC__
- #define _NonNull __attribute__((nonnull))
- #else
- #define _NonNull
- #endif
- _NonNull static char *
- suffix_basename(char *name, char *suffix)
- {
- char *string = basename(name);
- size_t suflen = strlen(suffix);
- size_t len = strlen(string);
- if(suflen < len && strcmp(&string[len - suflen], suffix) == 0)
- {
- string[len - suflen] = '\0';
- }
- return string;
- }
- int
- main(int argc, char *argv[])
- {
- int ret = 0;
- if((argc > 1) && (strncmp(argv[1], "--", 3) == 0))
- {
- argv++;
- argc--;
- }
- switch(argc)
- {
- case 1:
- ret = puts(".");
- break;
- case 2:
- ret = puts(basename(argv[1]));
- break;
- case 3:
- ret = puts(suffix_basename(argv[1], argv[2]));
- break;
- default:
- fputs("usage: basename string [suffix]\n", stderr);
- return 1;
- }
- if(ret < 0)
- {
- perror("basename: puts");
- return 1;
- }
- else
- {
- return 0;
- }
- }