logo

utils-std

Collection of commonly available Unix tools git clone https://anongit.hacktivis.me/git/utils-std.git

basename.c (1174B)


  1. // utils-std: Collection of commonly available Unix tools
  2. // SPDX-FileCopyrightText: 2017 Haelwenn (lanodan) Monnier <contact+utils@hacktivis.me>
  3. // SPDX-License-Identifier: MPL-2.0
  4. #define _POSIX_C_SOURCE 200809L
  5. #include <libgen.h> // basename()
  6. #include <stdio.h> // puts(), perror()
  7. #include <string.h> // strlen(), strncmp()
  8. #ifdef __GNUC__
  9. #define _NonNull __attribute__((nonnull))
  10. #else
  11. #define _NonNull
  12. #endif
  13. _NonNull static char *
  14. suffix_basename(char *name, char *suffix)
  15. {
  16. char *string = basename(name);
  17. size_t suflen = strlen(suffix);
  18. size_t len = strlen(string);
  19. if(suflen < len && strcmp(&string[len - suflen], suffix) == 0)
  20. {
  21. string[len - suflen] = '\0';
  22. }
  23. return string;
  24. }
  25. int
  26. main(int argc, char *argv[])
  27. {
  28. int ret = 0;
  29. if((argc > 1) && (strncmp(argv[1], "--", 3) == 0))
  30. {
  31. argv++;
  32. argc--;
  33. }
  34. switch(argc)
  35. {
  36. case 1:
  37. ret = puts(".");
  38. break;
  39. case 2:
  40. ret = puts(basename(argv[1]));
  41. break;
  42. case 3:
  43. ret = puts(suffix_basename(argv[1], argv[2]));
  44. break;
  45. default:
  46. fputs("usage: basename string [suffix]\n", stderr);
  47. return 1;
  48. }
  49. if(ret < 0)
  50. {
  51. perror("basename: puts");
  52. return 1;
  53. }
  54. else
  55. {
  56. return 0;
  57. }
  58. }