source: MondoRescue/branches/3.3/mindi-busybox/coreutils/basename.c@ 3865

Last change on this file since 3865 was 3621, checked in by Bruno Cornec, 10 years ago

New 3?3 banch for incorporation of latest busybox 1.25. Changing minor version to handle potential incompatibilities.

File size: 2.1 KB
RevLine 
[821]1/* vi: set sw=4 ts=4: */
2/*
3 * Mini basename implementation for busybox
4 *
5 * Copyright (C) 1999-2004 by Erik Andersen <andersen@codepoet.org>
6 *
[2725]7 * Licensed under GPLv2 or later, see file LICENSE in this source tree.
[821]8 */
9
10/* Mar 16, 2003 Manuel Novoa III (mjn3@codepoet.org)
11 *
12 * Changes:
13 * 1) Now checks for too many args. Need at least one and at most two.
14 * 2) Don't check for options, as per SUSv3.
15 * 3) Save some space by using strcmp(). Calling strncmp() here was silly.
16 */
17
[2725]18/* BB_AUDIT SUSv3 compliant */
19/* http://www.opengroup.org/onlinepubs/007904975/utilities/basename.html */
20
21//kbuild:lib-$(CONFIG_BASENAME) += basename.o
22
23//config:config BASENAME
24//config: bool "basename"
25//config: default y
26//config: help
27//config: basename is used to strip the directory and suffix from filenames,
28//config: leaving just the filename itself. Enable this option if you wish
29//config: to enable the 'basename' utility.
30
[3232]31//usage:#define basename_trivial_usage
32//usage: "FILE [SUFFIX]"
33//usage:#define basename_full_usage "\n\n"
[3621]34//usage: "Strip directory path and .SUFFIX from FILE"
[3232]35//usage:
36//usage:#define basename_example_usage
37//usage: "$ basename /usr/local/bin/foo\n"
38//usage: "foo\n"
39//usage: "$ basename /usr/local/bin/\n"
40//usage: "bin\n"
41//usage: "$ basename /foo/bar.txt .txt\n"
42//usage: "bar"
43
[1765]44#include "libbb.h"
[821]45
[1765]46/* This is a NOFORK applet. Be very careful! */
47
[2725]48int basename_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
[821]49int basename_main(int argc, char **argv)
50{
51 size_t m, n;
52 char *s;
53
[3232]54 if (argv[1] && strcmp(argv[1], "--") == 0) {
55 argv++;
56 argc--;
57 }
58
[2725]59 if ((unsigned)(argc-2) >= 2) {
[821]60 bb_show_usage();
61 }
62
[2725]63 /* It should strip slash: /abc/def/ -> def */
64 s = bb_get_last_path_component_strip(*++argv);
[821]65
[2725]66 m = strlen(s);
[821]67 if (*++argv) {
68 n = strlen(*argv);
[2725]69 if ((m > n) && (strcmp(s+m-n, *argv) == 0)) {
70 m -= n;
71 /*s[m] = '\0'; - redundant */
[821]72 }
73 }
74
[2725]75 /* puts(s) will do, but we can do without stdio this way: */
76 s[m++] = '\n';
77 /* NB: != is correct here: */
78 return full_write(STDOUT_FILENO, s, m) != (ssize_t)m;
[821]79}
Note: See TracBrowser for help on using the repository browser.