Mercurial > hg > octave-nkf > gnulib-hg
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 |
rev | line source |
---|---|
1250 | 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 | 3 |
4 This program is free software; you can redistribute it and/or modify | |
5 it under the terms of the GNU General Public License as published by | |
6 the Free Software Foundation; either version 2, or (at your option) | |
7 any later version. | |
8 | |
9 This program is distributed in the hope that it will be useful, | |
10 but WITHOUT ANY WARRANTY; without even the implied warranty of | |
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
12 GNU General Public License for more details. | |
13 | |
14 You should have received a copy of the GNU General Public License | |
15 along with this program; if not, write to the Free Software Foundation, | |
16 Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ | |
9 | 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 | 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 | 34 |
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 | 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 | 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 | 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 } |