aboutsummaryrefslogtreecommitdiff
path: root/coreutils
diff options
context:
space:
mode:
authorDenys Vlasenko <vda.linux@googlemail.com>2021-09-09 23:45:13 +0200
committerDenys Vlasenko <vda.linux@googlemail.com>2021-09-09 23:45:13 +0200
commit0599e0f87bcaa4b9f91652fa53bc29a3bdacfa13 (patch)
treed27c9b54ba863b5ae0b669b0a864b301e30c9abb /coreutils
parent7ab9cd23988b48956fcfe171d5828d61285baf40 (diff)
downloadbusybox-w32-0599e0f87bcaa4b9f91652fa53bc29a3bdacfa13.tar.gz
busybox-w32-0599e0f87bcaa4b9f91652fa53bc29a3bdacfa13.tar.bz2
busybox-w32-0599e0f87bcaa4b9f91652fa53bc29a3bdacfa13.zip
basename: implement -a and -s SUFFIX
function old new delta basename_main 145 207 +62 packed_usage 33914 33950 +36 .rodata 104241 104250 +9 ------------------------------------------------------------------------------ (add/remove: 0/0 grow/shrink: 3/0 up/down: 107/0) Total: 107 bytes Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
Diffstat (limited to 'coreutils')
-rw-r--r--coreutils/basename.c62
1 files changed, 38 insertions, 24 deletions
diff --git a/coreutils/basename.c b/coreutils/basename.c
index 0dd2c43c7..0b721c03c 100644
--- a/coreutils/basename.c
+++ b/coreutils/basename.c
@@ -29,9 +29,11 @@
29/* http://www.opengroup.org/onlinepubs/007904975/utilities/basename.html */ 29/* http://www.opengroup.org/onlinepubs/007904975/utilities/basename.html */
30 30
31//usage:#define basename_trivial_usage 31//usage:#define basename_trivial_usage
32//usage: "FILE [SUFFIX]" 32//usage: "FILE [SUFFIX] | -a FILE... | -s SUFFIX FILE..."
33//usage:#define basename_full_usage "\n\n" 33//usage:#define basename_full_usage "\n\n"
34//usage: "Strip directory path and .SUFFIX from FILE" 34//usage: "Strip directory path and SUFFIX from FILE\n"
35//usage: "\n -a All arguments are FILEs"
36//usage: "\n -s SUFFIX Remove SUFFIX (implies -a)"
35//usage: 37//usage:
36//usage:#define basename_example_usage 38//usage:#define basename_example_usage
37//usage: "$ basename /usr/local/bin/foo\n" 39//usage: "$ basename /usr/local/bin/foo\n"
@@ -48,31 +50,43 @@
48int basename_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; 50int basename_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
49int basename_main(int argc UNUSED_PARAM, char **argv) 51int basename_main(int argc UNUSED_PARAM, char **argv)
50{ 52{
51 size_t m, n; 53 unsigned opts;
52 char *s; 54 const char *suffix = NULL;
53 55
54 if (argv[1] && strcmp(argv[1], "--") == 0) { 56 /* '+': stop at first non-option */
55 argv++; 57 opts = getopt32(argv, "^+" "as:"
56 } 58 "\0" "-1" /* At least one argument */
57 if (!argv[1]) 59 , &suffix
58 bb_show_usage(); 60 );
61 argv += optind;
59 62
60 /* It should strip slash: /abc/def/ -> def */ 63 do {
61 s = bb_get_last_path_component_strip(*++argv); 64 char *s;
65 size_t m;
62 66
63 m = strlen(s); 67 /* It should strip slash: /abc/def/ -> def */
64 if (*++argv) { 68 s = bb_get_last_path_component_strip(*argv++);
65 if (argv[1]) 69 m = strlen(s);
66 bb_show_usage(); 70 if (!opts) {
67 n = strlen(*argv); 71 if (*argv) {
68 if ((m > n) && (strcmp(s+m-n, *argv) == 0)) { 72 suffix = *argv;
69 m -= n; 73 if (argv[1])
70 /*s[m] = '\0'; - redundant */ 74 bb_show_usage();
75 }
71 } 76 }
72 } 77 if (suffix) {
78 size_t n = strlen(suffix);
79 if ((m > n) && (strcmp(s + m - n, suffix) == 0)) {
80 m -= n;
81 /*s[m] = '\0'; - redundant */
82 }
83 }
84 /* puts(s) will do, but we can do without stdio this way: */
85 s[m++] = '\n';
86 /* NB: != is correct here: */
87 if (full_write(STDOUT_FILENO, s, m) != (ssize_t)m)
88 return EXIT_FAILURE;
89 } while (opts && *argv);
73 90
74 /* puts(s) will do, but we can do without stdio this way: */ 91 return EXIT_SUCCESS;
75 s[m++] = '\n';
76 /* NB: != is correct here: */
77 return full_write(STDOUT_FILENO, s, m) != (ssize_t)m;
78} 92}