annotate lib/basename.c @ 3241:3de6cd0813b1

(FILESYSTEM_PREFIX_LEN, PARAMS, ISSLASH): Remove; now in dirname.h. Do not include <stdio.h>, <assert.h>; no longer needed. Include <string.h>, <dirname.h>. (base_name): Allow file names ending in slashes, other than names that are all slashes. In this case, return the basename followed by the slashes. This is more general, and can be used in places where the original base_name purposely had an assertion failure. (base_len): New function.
author Jim Meyering <jim@meyering.net>
date Sat, 12 May 2001 14:23:49 +0000
parents 11b1f9a9da67
children 025019cda2d6
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1250
29ccc7d6e9e9 add copyright
Jim Meyering <jim@meyering.net>
parents: 958
diff changeset
1 /* basename.c -- return the last element in a path
3107
11b1f9a9da67 Include <stdio.h>, needed by assert on SunOS4.
Jim Meyering <jim@meyering.net>
parents: 2786
diff changeset
2 Copyright (C) 1990, 1998, 1999, 2000, 2001 Free Software Foundation, Inc.
1250
29ccc7d6e9e9 add copyright
Jim Meyering <jim@meyering.net>
parents: 958
diff changeset
3
29ccc7d6e9e9 add copyright
Jim Meyering <jim@meyering.net>
parents: 958
diff changeset
4 This program is free software; you can redistribute it and/or modify
29ccc7d6e9e9 add copyright
Jim Meyering <jim@meyering.net>
parents: 958
diff changeset
5 it under the terms of the GNU General Public License as published by
29ccc7d6e9e9 add copyright
Jim Meyering <jim@meyering.net>
parents: 958
diff changeset
6 the Free Software Foundation; either version 2, or (at your option)
29ccc7d6e9e9 add copyright
Jim Meyering <jim@meyering.net>
parents: 958
diff changeset
7 any later version.
29ccc7d6e9e9 add copyright
Jim Meyering <jim@meyering.net>
parents: 958
diff changeset
8
29ccc7d6e9e9 add copyright
Jim Meyering <jim@meyering.net>
parents: 958
diff changeset
9 This program is distributed in the hope that it will be useful,
29ccc7d6e9e9 add copyright
Jim Meyering <jim@meyering.net>
parents: 958
diff changeset
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
29ccc7d6e9e9 add copyright
Jim Meyering <jim@meyering.net>
parents: 958
diff changeset
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
29ccc7d6e9e9 add copyright
Jim Meyering <jim@meyering.net>
parents: 958
diff changeset
12 GNU General Public License for more details.
29ccc7d6e9e9 add copyright
Jim Meyering <jim@meyering.net>
parents: 958
diff changeset
13
29ccc7d6e9e9 add copyright
Jim Meyering <jim@meyering.net>
parents: 958
diff changeset
14 You should have received a copy of the GNU General Public License
29ccc7d6e9e9 add copyright
Jim Meyering <jim@meyering.net>
parents: 958
diff changeset
15 along with this program; if not, write to the Free Software Foundation,
29ccc7d6e9e9 add copyright
Jim Meyering <jim@meyering.net>
parents: 958
diff changeset
16 Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
9
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
17
922
9cb09b60925d Update from FSF via patch-2.2.93.
Jim Meyering <jim@meyering.net>
parents: 653
diff changeset
18 #if HAVE_CONFIG_H
653
b63f146fd963 indent cpp-directives
Jim Meyering <jim@meyering.net>
parents: 650
diff changeset
19 # include <config.h>
379
0c05dc8a5d05 (basename): Use strrchr, not rindex.
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
20 #endif
0c05dc8a5d05 (basename): Use strrchr, not rindex.
Jim Meyering <jim@meyering.net>
parents: 9
diff changeset
21
3241
3de6cd0813b1 (FILESYSTEM_PREFIX_LEN, PARAMS, ISSLASH): Remove; now in dirname.h.
Jim Meyering <jim@meyering.net>
parents: 3107
diff changeset
22 #if STDC_HEADERS || HAVE_STRING_H
3de6cd0813b1 (FILESYSTEM_PREFIX_LEN, PARAMS, ISSLASH): Remove; now in dirname.h.
Jim Meyering <jim@meyering.net>
parents: 3107
diff changeset
23 # include <string.h>
922
9cb09b60925d Update from FSF via patch-2.2.93.
Jim Meyering <jim@meyering.net>
parents: 653
diff changeset
24 #endif
3241
3de6cd0813b1 (FILESYSTEM_PREFIX_LEN, PARAMS, ISSLASH): Remove; now in dirname.h.
Jim Meyering <jim@meyering.net>
parents: 3107
diff changeset
25 #include <dirname.h>
1952
8c28becce781 (base_name): Add prototype. From Akim Demaille.
Jim Meyering <jim@meyering.net>
parents: 1738
diff changeset
26
922
9cb09b60925d Update from FSF via patch-2.2.93.
Jim Meyering <jim@meyering.net>
parents: 653
diff changeset
27 /* In general, we can't use the builtin `basename' function if available,
9cb09b60925d Update from FSF via patch-2.2.93.
Jim Meyering <jim@meyering.net>
parents: 653
diff changeset
28 since it has different meanings in different environments.
1737
c6a6decaf2ad (base_name): If NAME is all slashes, return `/' (in
Jim Meyering <jim@meyering.net>
parents: 1251
diff changeset
29 In some environments the builtin `basename' modifies its argument.
3241
3de6cd0813b1 (FILESYSTEM_PREFIX_LEN, PARAMS, ISSLASH): Remove; now in dirname.h.
Jim Meyering <jim@meyering.net>
parents: 3107
diff changeset
30
3de6cd0813b1 (FILESYSTEM_PREFIX_LEN, PARAMS, ISSLASH): Remove; now in dirname.h.
Jim Meyering <jim@meyering.net>
parents: 3107
diff changeset
31 Return the address of the last file name component of NAME. If
3de6cd0813b1 (FILESYSTEM_PREFIX_LEN, PARAMS, ISSLASH): Remove; now in dirname.h.
Jim Meyering <jim@meyering.net>
parents: 3107
diff changeset
32 NAME has no file name components because it is all slashes, return
3de6cd0813b1 (FILESYSTEM_PREFIX_LEN, PARAMS, ISSLASH): Remove; now in dirname.h.
Jim Meyering <jim@meyering.net>
parents: 3107
diff changeset
33 NAME if it is empty, the address of its last slash otherwise. */
9
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
34
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
35 char *
1251
d7d7a33a5fd3 capitalize macro params and protoize
Jim Meyering <jim@meyering.net>
parents: 1250
diff changeset
36 base_name (char const *name)
9
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
37 {
3241
3de6cd0813b1 (FILESYSTEM_PREFIX_LEN, PARAMS, ISSLASH): Remove; now in dirname.h.
Jim Meyering <jim@meyering.net>
parents: 3107
diff changeset
38 char const *base = name + FILESYSTEM_PREFIX_LEN (name);
1737
c6a6decaf2ad (base_name): If NAME is all slashes, return `/' (in
Jim Meyering <jim@meyering.net>
parents: 1251
diff changeset
39 char const *p;
9
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
40
3241
3de6cd0813b1 (FILESYSTEM_PREFIX_LEN, PARAMS, ISSLASH): Remove; now in dirname.h.
Jim Meyering <jim@meyering.net>
parents: 3107
diff changeset
41 for (p = base; *p; p++)
1737
c6a6decaf2ad (base_name): If NAME is all slashes, return `/' (in
Jim Meyering <jim@meyering.net>
parents: 1251
diff changeset
42 {
c6a6decaf2ad (base_name): If NAME is all slashes, return `/' (in
Jim Meyering <jim@meyering.net>
parents: 1251
diff changeset
43 if (ISSLASH (*p))
3241
3de6cd0813b1 (FILESYSTEM_PREFIX_LEN, PARAMS, ISSLASH): Remove; now in dirname.h.
Jim Meyering <jim@meyering.net>
parents: 3107
diff changeset
44 {
3de6cd0813b1 (FILESYSTEM_PREFIX_LEN, PARAMS, ISSLASH): Remove; now in dirname.h.
Jim Meyering <jim@meyering.net>
parents: 3107
diff changeset
45 /* Treat multiple adjacent slashes like a single slash. */
3de6cd0813b1 (FILESYSTEM_PREFIX_LEN, PARAMS, ISSLASH): Remove; now in dirname.h.
Jim Meyering <jim@meyering.net>
parents: 3107
diff changeset
46 do p++;
3de6cd0813b1 (FILESYSTEM_PREFIX_LEN, PARAMS, ISSLASH): Remove; now in dirname.h.
Jim Meyering <jim@meyering.net>
parents: 3107
diff changeset
47 while (ISSLASH (*p));
1737
c6a6decaf2ad (base_name): If NAME is all slashes, return `/' (in
Jim Meyering <jim@meyering.net>
parents: 1251
diff changeset
48
3241
3de6cd0813b1 (FILESYSTEM_PREFIX_LEN, PARAMS, ISSLASH): Remove; now in dirname.h.
Jim Meyering <jim@meyering.net>
parents: 3107
diff changeset
49 /* If the file name ends in slash, use the trailing slash as
3de6cd0813b1 (FILESYSTEM_PREFIX_LEN, PARAMS, ISSLASH): Remove; now in dirname.h.
Jim Meyering <jim@meyering.net>
parents: 3107
diff changeset
50 the basename if no non-slashes have been found. */
3de6cd0813b1 (FILESYSTEM_PREFIX_LEN, PARAMS, ISSLASH): Remove; now in dirname.h.
Jim Meyering <jim@meyering.net>
parents: 3107
diff changeset
51 if (! *p)
3de6cd0813b1 (FILESYSTEM_PREFIX_LEN, PARAMS, ISSLASH): Remove; now in dirname.h.
Jim Meyering <jim@meyering.net>
parents: 3107
diff changeset
52 {
3de6cd0813b1 (FILESYSTEM_PREFIX_LEN, PARAMS, ISSLASH): Remove; now in dirname.h.
Jim Meyering <jim@meyering.net>
parents: 3107
diff changeset
53 if (ISSLASH (*base))
3de6cd0813b1 (FILESYSTEM_PREFIX_LEN, PARAMS, ISSLASH): Remove; now in dirname.h.
Jim Meyering <jim@meyering.net>
parents: 3107
diff changeset
54 base = p - 1;
3de6cd0813b1 (FILESYSTEM_PREFIX_LEN, PARAMS, ISSLASH): Remove; now in dirname.h.
Jim Meyering <jim@meyering.net>
parents: 3107
diff changeset
55 break;
3de6cd0813b1 (FILESYSTEM_PREFIX_LEN, PARAMS, ISSLASH): Remove; now in dirname.h.
Jim Meyering <jim@meyering.net>
parents: 3107
diff changeset
56 }
922
9cb09b60925d Update from FSF via patch-2.2.93.
Jim Meyering <jim@meyering.net>
parents: 653
diff changeset
57
3241
3de6cd0813b1 (FILESYSTEM_PREFIX_LEN, PARAMS, ISSLASH): Remove; now in dirname.h.
Jim Meyering <jim@meyering.net>
parents: 3107
diff changeset
58 /* *P is a non-slash preceded by a slash. */
3de6cd0813b1 (FILESYSTEM_PREFIX_LEN, PARAMS, ISSLASH): Remove; now in dirname.h.
Jim Meyering <jim@meyering.net>
parents: 3107
diff changeset
59 base = p;
3de6cd0813b1 (FILESYSTEM_PREFIX_LEN, PARAMS, ISSLASH): Remove; now in dirname.h.
Jim Meyering <jim@meyering.net>
parents: 3107
diff changeset
60 }
3de6cd0813b1 (FILESYSTEM_PREFIX_LEN, PARAMS, ISSLASH): Remove; now in dirname.h.
Jim Meyering <jim@meyering.net>
parents: 3107
diff changeset
61 }
2763
8a832ac25a04 (base_name): Add an assertion.
Jim Meyering <jim@meyering.net>
parents: 2718
diff changeset
62
590
cf44c49093fd (basename): Rewrite so it doesn't rely on strrchr,
Jim Meyering <jim@meyering.net>
parents: 421
diff changeset
63 return (char *) base;
9
f8dce34b5ab0 Initial revision
Jim Meyering <jim@meyering.net>
parents:
diff changeset
64 }
3241
3de6cd0813b1 (FILESYSTEM_PREFIX_LEN, PARAMS, ISSLASH): Remove; now in dirname.h.
Jim Meyering <jim@meyering.net>
parents: 3107
diff changeset
65
3de6cd0813b1 (FILESYSTEM_PREFIX_LEN, PARAMS, ISSLASH): Remove; now in dirname.h.
Jim Meyering <jim@meyering.net>
parents: 3107
diff changeset
66 /* Return the length of of the basename NAME. Typically NAME is the
3de6cd0813b1 (FILESYSTEM_PREFIX_LEN, PARAMS, ISSLASH): Remove; now in dirname.h.
Jim Meyering <jim@meyering.net>
parents: 3107
diff changeset
67 value returned by base_name. Act like strlen (NAME), except omit
3de6cd0813b1 (FILESYSTEM_PREFIX_LEN, PARAMS, ISSLASH): Remove; now in dirname.h.
Jim Meyering <jim@meyering.net>
parents: 3107
diff changeset
68 redundant trailing slashes. */
3de6cd0813b1 (FILESYSTEM_PREFIX_LEN, PARAMS, ISSLASH): Remove; now in dirname.h.
Jim Meyering <jim@meyering.net>
parents: 3107
diff changeset
69
3de6cd0813b1 (FILESYSTEM_PREFIX_LEN, PARAMS, ISSLASH): Remove; now in dirname.h.
Jim Meyering <jim@meyering.net>
parents: 3107
diff changeset
70 size_t
3de6cd0813b1 (FILESYSTEM_PREFIX_LEN, PARAMS, ISSLASH): Remove; now in dirname.h.
Jim Meyering <jim@meyering.net>
parents: 3107
diff changeset
71 base_len (char const *name)
3de6cd0813b1 (FILESYSTEM_PREFIX_LEN, PARAMS, ISSLASH): Remove; now in dirname.h.
Jim Meyering <jim@meyering.net>
parents: 3107
diff changeset
72 {
3de6cd0813b1 (FILESYSTEM_PREFIX_LEN, PARAMS, ISSLASH): Remove; now in dirname.h.
Jim Meyering <jim@meyering.net>
parents: 3107
diff changeset
73 size_t len;
3de6cd0813b1 (FILESYSTEM_PREFIX_LEN, PARAMS, ISSLASH): Remove; now in dirname.h.
Jim Meyering <jim@meyering.net>
parents: 3107
diff changeset
74
3de6cd0813b1 (FILESYSTEM_PREFIX_LEN, PARAMS, ISSLASH): Remove; now in dirname.h.
Jim Meyering <jim@meyering.net>
parents: 3107
diff changeset
75 for (len = strlen (name); 1 < len && ISSLASH (name[len - 1]); len--)
3de6cd0813b1 (FILESYSTEM_PREFIX_LEN, PARAMS, ISSLASH): Remove; now in dirname.h.
Jim Meyering <jim@meyering.net>
parents: 3107
diff changeset
76 continue;
3de6cd0813b1 (FILESYSTEM_PREFIX_LEN, PARAMS, ISSLASH): Remove; now in dirname.h.
Jim Meyering <jim@meyering.net>
parents: 3107
diff changeset
77
3de6cd0813b1 (FILESYSTEM_PREFIX_LEN, PARAMS, ISSLASH): Remove; now in dirname.h.
Jim Meyering <jim@meyering.net>
parents: 3107
diff changeset
78 return len;
3de6cd0813b1 (FILESYSTEM_PREFIX_LEN, PARAMS, ISSLASH): Remove; now in dirname.h.
Jim Meyering <jim@meyering.net>
parents: 3107
diff changeset
79 }