annotate toys/basename.c @ 405:a8b14410e784

'basename': Handle where we have no / passed
author Tryn Mirell <tryn@mirell.org>
date Sun, 15 Jan 2012 23:27:22 -0600
parents ad5ffc45aa62
children 8506c538f26a
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
404
ad5ffc45aa62 Initial 'basename' implementation
Tryn Mirell <tryn@mirell.org>
parents:
diff changeset
1 /* vi: set sw=4 ts=4:
ad5ffc45aa62 Initial 'basename' implementation
Tryn Mirell <tryn@mirell.org>
parents:
diff changeset
2 *
ad5ffc45aa62 Initial 'basename' implementation
Tryn Mirell <tryn@mirell.org>
parents:
diff changeset
3 * basename.c
ad5ffc45aa62 Initial 'basename' implementation
Tryn Mirell <tryn@mirell.org>
parents:
diff changeset
4
ad5ffc45aa62 Initial 'basename' implementation
Tryn Mirell <tryn@mirell.org>
parents:
diff changeset
5 USE_BASENAME(NEWTOY(basename, NULL, TOYFLAG_USR|TOYFLAG_BIN))
ad5ffc45aa62 Initial 'basename' implementation
Tryn Mirell <tryn@mirell.org>
parents:
diff changeset
6
ad5ffc45aa62 Initial 'basename' implementation
Tryn Mirell <tryn@mirell.org>
parents:
diff changeset
7 config BASENAME
ad5ffc45aa62 Initial 'basename' implementation
Tryn Mirell <tryn@mirell.org>
parents:
diff changeset
8 bool "basename"
ad5ffc45aa62 Initial 'basename' implementation
Tryn Mirell <tryn@mirell.org>
parents:
diff changeset
9 default n
ad5ffc45aa62 Initial 'basename' implementation
Tryn Mirell <tryn@mirell.org>
parents:
diff changeset
10 help
ad5ffc45aa62 Initial 'basename' implementation
Tryn Mirell <tryn@mirell.org>
parents:
diff changeset
11 usage: basename string [suffix]
ad5ffc45aa62 Initial 'basename' implementation
Tryn Mirell <tryn@mirell.org>
parents:
diff changeset
12 Return non-directory portion of a pathname
ad5ffc45aa62 Initial 'basename' implementation
Tryn Mirell <tryn@mirell.org>
parents:
diff changeset
13 */
ad5ffc45aa62 Initial 'basename' implementation
Tryn Mirell <tryn@mirell.org>
parents:
diff changeset
14
ad5ffc45aa62 Initial 'basename' implementation
Tryn Mirell <tryn@mirell.org>
parents:
diff changeset
15 #include "toys.h"
ad5ffc45aa62 Initial 'basename' implementation
Tryn Mirell <tryn@mirell.org>
parents:
diff changeset
16
ad5ffc45aa62 Initial 'basename' implementation
Tryn Mirell <tryn@mirell.org>
parents:
diff changeset
17 void basename_main(void)
ad5ffc45aa62 Initial 'basename' implementation
Tryn Mirell <tryn@mirell.org>
parents:
diff changeset
18 {
ad5ffc45aa62 Initial 'basename' implementation
Tryn Mirell <tryn@mirell.org>
parents:
diff changeset
19 char *arg, *suffix, *base;
ad5ffc45aa62 Initial 'basename' implementation
Tryn Mirell <tryn@mirell.org>
parents:
diff changeset
20 int arglen;
ad5ffc45aa62 Initial 'basename' implementation
Tryn Mirell <tryn@mirell.org>
parents:
diff changeset
21
ad5ffc45aa62 Initial 'basename' implementation
Tryn Mirell <tryn@mirell.org>
parents:
diff changeset
22 arg = toys.optargs[0];
ad5ffc45aa62 Initial 'basename' implementation
Tryn Mirell <tryn@mirell.org>
parents:
diff changeset
23 suffix = toys.optargs[1];
ad5ffc45aa62 Initial 'basename' implementation
Tryn Mirell <tryn@mirell.org>
parents:
diff changeset
24
ad5ffc45aa62 Initial 'basename' implementation
Tryn Mirell <tryn@mirell.org>
parents:
diff changeset
25 // return null string if nothing provided
ad5ffc45aa62 Initial 'basename' implementation
Tryn Mirell <tryn@mirell.org>
parents:
diff changeset
26 if (!arg) return;
ad5ffc45aa62 Initial 'basename' implementation
Tryn Mirell <tryn@mirell.org>
parents:
diff changeset
27
ad5ffc45aa62 Initial 'basename' implementation
Tryn Mirell <tryn@mirell.org>
parents:
diff changeset
28 arglen = strlen(arg);
405
a8b14410e784 'basename': Handle where we have no / passed
Tryn Mirell <tryn@mirell.org>
parents: 404
diff changeset
29
404
ad5ffc45aa62 Initial 'basename' implementation
Tryn Mirell <tryn@mirell.org>
parents:
diff changeset
30 // handle the case where we only have single slash
ad5ffc45aa62 Initial 'basename' implementation
Tryn Mirell <tryn@mirell.org>
parents:
diff changeset
31 if (arglen == 1 && arg[0] == '/') {
ad5ffc45aa62 Initial 'basename' implementation
Tryn Mirell <tryn@mirell.org>
parents:
diff changeset
32 puts("/");
ad5ffc45aa62 Initial 'basename' implementation
Tryn Mirell <tryn@mirell.org>
parents:
diff changeset
33 return;
ad5ffc45aa62 Initial 'basename' implementation
Tryn Mirell <tryn@mirell.org>
parents:
diff changeset
34 }
ad5ffc45aa62 Initial 'basename' implementation
Tryn Mirell <tryn@mirell.org>
parents:
diff changeset
35
ad5ffc45aa62 Initial 'basename' implementation
Tryn Mirell <tryn@mirell.org>
parents:
diff changeset
36 // remove trailing slash
ad5ffc45aa62 Initial 'basename' implementation
Tryn Mirell <tryn@mirell.org>
parents:
diff changeset
37 if (arg[arglen - 1] == '/') {
ad5ffc45aa62 Initial 'basename' implementation
Tryn Mirell <tryn@mirell.org>
parents:
diff changeset
38 arg[arglen - 1] = 0;
ad5ffc45aa62 Initial 'basename' implementation
Tryn Mirell <tryn@mirell.org>
parents:
diff changeset
39 }
ad5ffc45aa62 Initial 'basename' implementation
Tryn Mirell <tryn@mirell.org>
parents:
diff changeset
40
ad5ffc45aa62 Initial 'basename' implementation
Tryn Mirell <tryn@mirell.org>
parents:
diff changeset
41 // get everything past the last /
405
a8b14410e784 'basename': Handle where we have no / passed
Tryn Mirell <tryn@mirell.org>
parents: 404
diff changeset
42 base = strrchr(arg, '/');
a8b14410e784 'basename': Handle where we have no / passed
Tryn Mirell <tryn@mirell.org>
parents: 404
diff changeset
43
a8b14410e784 'basename': Handle where we have no / passed
Tryn Mirell <tryn@mirell.org>
parents: 404
diff changeset
44 if (!base) base = arg;
a8b14410e784 'basename': Handle where we have no / passed
Tryn Mirell <tryn@mirell.org>
parents: 404
diff changeset
45 else base++;
404
ad5ffc45aa62 Initial 'basename' implementation
Tryn Mirell <tryn@mirell.org>
parents:
diff changeset
46
ad5ffc45aa62 Initial 'basename' implementation
Tryn Mirell <tryn@mirell.org>
parents:
diff changeset
47 // handle the case where we have all slashes
ad5ffc45aa62 Initial 'basename' implementation
Tryn Mirell <tryn@mirell.org>
parents:
diff changeset
48 if (base[0] == 0) base = "/";
ad5ffc45aa62 Initial 'basename' implementation
Tryn Mirell <tryn@mirell.org>
parents:
diff changeset
49
ad5ffc45aa62 Initial 'basename' implementation
Tryn Mirell <tryn@mirell.org>
parents:
diff changeset
50 // chop off the suffix if provided
ad5ffc45aa62 Initial 'basename' implementation
Tryn Mirell <tryn@mirell.org>
parents:
diff changeset
51 if (suffix) {
ad5ffc45aa62 Initial 'basename' implementation
Tryn Mirell <tryn@mirell.org>
parents:
diff changeset
52 strstr(base, suffix)[0] = 0;
ad5ffc45aa62 Initial 'basename' implementation
Tryn Mirell <tryn@mirell.org>
parents:
diff changeset
53 }
ad5ffc45aa62 Initial 'basename' implementation
Tryn Mirell <tryn@mirell.org>
parents:
diff changeset
54
ad5ffc45aa62 Initial 'basename' implementation
Tryn Mirell <tryn@mirell.org>
parents:
diff changeset
55 puts(base);
ad5ffc45aa62 Initial 'basename' implementation
Tryn Mirell <tryn@mirell.org>
parents:
diff changeset
56 }