475 lines
8.7 KiB
Groff
475 lines
8.7 KiB
Groff
|
.\" t
|
||
|
.TH DIRNAME 3 04-Jan-2007 MinGW "Programmer's Reference Manual"
|
||
|
.
|
||
|
.SH NAME
|
||
|
.
|
||
|
.BR dirname ,\0 basename
|
||
|
\- parse path name components
|
||
|
.
|
||
|
.
|
||
|
.SH SYNOPSIS
|
||
|
.
|
||
|
.B #include
|
||
|
.RB < libgen.h >
|
||
|
.PP
|
||
|
.B char *dirname( char
|
||
|
.BI * path
|
||
|
.B );
|
||
|
.br
|
||
|
.B char *basename( char
|
||
|
.BI * path
|
||
|
.B );
|
||
|
.
|
||
|
.
|
||
|
.SH DESCRIPTION
|
||
|
.
|
||
|
The
|
||
|
.B dirname
|
||
|
and
|
||
|
.B basename
|
||
|
functions parse a null\-terminated path name string,
|
||
|
and split it into its
|
||
|
.B directory name
|
||
|
and
|
||
|
.B file name
|
||
|
components.
|
||
|
Splitting is performed on the basis of the location of the
|
||
|
.B directory separator
|
||
|
characters,
|
||
|
which,
|
||
|
for this MS\-Windows(\(tm) implementation,
|
||
|
are the characters
|
||
|
.RB \(dq / \(dq
|
||
|
and
|
||
|
.RB \(dq \e \(dq,
|
||
|
each of which is interpreted as being equivalent.
|
||
|
Additionally,
|
||
|
if the
|
||
|
.I second
|
||
|
character of
|
||
|
.I path
|
||
|
is a colon
|
||
|
.RB (\(dq : \(dq),
|
||
|
the first two characters of
|
||
|
.I path
|
||
|
are interpreted as an MS\-Windows(\(tm) drive designator,
|
||
|
which will be included in the
|
||
|
.B directory name
|
||
|
component of
|
||
|
.IR path ,
|
||
|
but is never considered to form part of the
|
||
|
.B file name
|
||
|
component.
|
||
|
.
|
||
|
.PP
|
||
|
In normal usage,
|
||
|
.B dirname
|
||
|
returns a pointer to a string representing the path name component of
|
||
|
.IR path ,
|
||
|
up to but not including the rightmost directory separator,
|
||
|
while
|
||
|
.B basename
|
||
|
returns a pointer to the component following this separator.
|
||
|
Any trailing directory separators present in
|
||
|
.I path
|
||
|
are disregarded,
|
||
|
when determining the rightmost separator,
|
||
|
and, in the case of the return value from
|
||
|
.BR dirname ,
|
||
|
any internal sequences of recurring separator characters
|
||
|
are each reduced to a single such character.
|
||
|
.
|
||
|
.PP
|
||
|
If
|
||
|
.I path
|
||
|
contains no MS\-Windows(\(tm) drive designator,
|
||
|
and no directory separator character,
|
||
|
then
|
||
|
.B dirname
|
||
|
returns the string
|
||
|
.RB \(dq . \(dq,
|
||
|
and
|
||
|
.B basename
|
||
|
returns a copy of
|
||
|
.IR path.
|
||
|
If
|
||
|
.I path
|
||
|
does commence with an MS\-Windows(\(tm) drive designator,
|
||
|
but contains no directory separators,
|
||
|
then
|
||
|
.B dirname
|
||
|
returns the string
|
||
|
.RB \(dq d:. \(dq,
|
||
|
where
|
||
|
.RB \(dq d: \(dq
|
||
|
represents the drive designator,
|
||
|
while
|
||
|
.B basename
|
||
|
returns a copy of
|
||
|
.IR path ,
|
||
|
with its initial two characters,
|
||
|
(i.e.\ the drive designator),
|
||
|
deleted.
|
||
|
.
|
||
|
.PP
|
||
|
If
|
||
|
.I path
|
||
|
is a NULL pointer,
|
||
|
or is a pointer to an empty string,
|
||
|
then both
|
||
|
.B dirname
|
||
|
and
|
||
|
.B basename
|
||
|
return the string
|
||
|
.RB \(dq . \(dq.
|
||
|
.
|
||
|
.PP
|
||
|
If
|
||
|
.I path
|
||
|
is the string
|
||
|
.RB \(dq / \(dq,
|
||
|
or the string
|
||
|
.RB \(dq \e \(dq,
|
||
|
both
|
||
|
.B dirname
|
||
|
and
|
||
|
.B basename
|
||
|
return the string
|
||
|
.RB \(dq / \(dq,
|
||
|
or the string
|
||
|
.RB \(dq \e \(dq,
|
||
|
respectively.
|
||
|
.
|
||
|
.PP
|
||
|
If
|
||
|
.I path
|
||
|
commences with
|
||
|
.I exactly
|
||
|
two directory separator characters,
|
||
|
which must be similar,
|
||
|
then
|
||
|
.B dirname
|
||
|
will preserve these two characters in the returned path name.
|
||
|
This construct does not affect the string returned by
|
||
|
.BR basename ,
|
||
|
neither is this behaviour replicated by
|
||
|
.BR dirname ,
|
||
|
if
|
||
|
.I path
|
||
|
includes an MS\-Windows(\(tm) drive designator.
|
||
|
.
|
||
|
.PP
|
||
|
In the special case,
|
||
|
where
|
||
|
.I path
|
||
|
is specified as
|
||
|
.I exactly
|
||
|
two identical directory separator characters,
|
||
|
with no MS\-Windows(\(tm) drive designator,
|
||
|
and no following path name,
|
||
|
.B dirname
|
||
|
returns
|
||
|
.I path
|
||
|
unchanged;
|
||
|
.B basename
|
||
|
normalises the return string to only a single character,
|
||
|
either
|
||
|
.RB \(dq / \(dq
|
||
|
or
|
||
|
.RB \(dq \e \(dq,
|
||
|
matching the characters used to specify
|
||
|
.IR path .
|
||
|
.
|
||
|
.PP
|
||
|
Concatenating the string returned by
|
||
|
.BR dirname ,
|
||
|
a
|
||
|
.RB \(dq / \(dq
|
||
|
or a
|
||
|
.RB \(dq \e \(dq,
|
||
|
and the string returned by
|
||
|
.B basename
|
||
|
yields a complete path name.
|
||
|
.
|
||
|
.PP
|
||
|
The
|
||
|
.B dirname
|
||
|
and
|
||
|
.B basename
|
||
|
functions conform generally to SUSv3,
|
||
|
extended to accommodate the handling of
|
||
|
.RB \(dq / \(dq
|
||
|
and
|
||
|
.RB \(dq \e \(dq
|
||
|
as alternative directory separator characters,
|
||
|
and also to accommodate the likelihood of MS\-Windows(\(tm)
|
||
|
drive designators appearing in any path name specification.
|
||
|
The example,
|
||
|
which follows,
|
||
|
illustrates the conformance to SUSv3,
|
||
|
and also the effects of the extended behaviour.
|
||
|
.
|
||
|
.
|
||
|
.SH EXAMPLE
|
||
|
.
|
||
|
To verify the behaviour of the
|
||
|
.B dirname
|
||
|
and
|
||
|
.B basename
|
||
|
functions,
|
||
|
the test program defines the following function:\(em
|
||
|
.
|
||
|
.PP
|
||
|
.RS
|
||
|
.nf
|
||
|
#include <stdio.h>
|
||
|
#include <string.h>
|
||
|
#include <libgen.h>
|
||
|
|
||
|
void result( char *path )
|
||
|
{
|
||
|
char *dir = strdup( path );
|
||
|
char *file = strdup( path );
|
||
|
|
||
|
printf( " %-15s%-15s%-12s", path, dirname( dir ),
|
||
|
basename( file ) );
|
||
|
|
||
|
free( dir );
|
||
|
free( file );
|
||
|
}
|
||
|
.fi
|
||
|
.RE
|
||
|
.PP
|
||
|
This illustrates the correct use of the
|
||
|
.B dirname
|
||
|
and the
|
||
|
.B basename
|
||
|
functions,
|
||
|
with copies of the original
|
||
|
.I path
|
||
|
string being passed in the function calls.
|
||
|
Note that the return values from each function are used immediately,
|
||
|
in the
|
||
|
.B printf
|
||
|
call,
|
||
|
and the temporary copies of
|
||
|
.I path
|
||
|
are discarded,
|
||
|
and the associated memory is freed,
|
||
|
before these go out of scope.
|
||
|
.
|
||
|
.PP
|
||
|
Calling this example function illustrates the effect of each of the
|
||
|
.B dirname
|
||
|
and
|
||
|
.B basename
|
||
|
functions,
|
||
|
for various values of
|
||
|
.IR path .
|
||
|
The following,
|
||
|
taken from SUSv3,
|
||
|
illustrate general conformance with the standard:\(em
|
||
|
.RS
|
||
|
.TS
|
||
|
tab(!);
|
||
|
lB lB lB
|
||
|
lw(15n) lw(10n) lw(10n).
|
||
|
\0path!\0dirname!\0basename
|
||
|
\_!\_!\_
|
||
|
\0/usr/lib!\0/usr!\0lib
|
||
|
\0//usr//lib//!\0//usr!\0lib
|
||
|
\0///usr//lib//!\0/usr!\0lib
|
||
|
\0/usr/!\0/!\0usr
|
||
|
\0usr!\0.!\0usr
|
||
|
\0//!\0//!\0/
|
||
|
\0/!\0/!\0/
|
||
|
\0.!\0.!\0.
|
||
|
\0..!\0.!\0..
|
||
|
.TE
|
||
|
.RE
|
||
|
.
|
||
|
.PP
|
||
|
Similarly,
|
||
|
for the case where path names are expressed using the MS\-Windows(\(tm)
|
||
|
.RB \(dq \e \(dq
|
||
|
directory separator notation,
|
||
|
calling the example function displays:\(em
|
||
|
.RS
|
||
|
.TS
|
||
|
tab(!);
|
||
|
lB lB lB
|
||
|
lw(15n) lw(10n) lw(10n).
|
||
|
\0path!\0dirname!\0basename
|
||
|
\_!\_!\_
|
||
|
\0\eusr\elib!\0\eusr!\0lib
|
||
|
\0\e\eusr\e\elib\e\e!\0\e\eusr!\0lib
|
||
|
\0\e\e\eusr\e\elib\e\e!\0\eusr!\0lib
|
||
|
\0\eusr\e!\0\e!\0usr
|
||
|
\0usr!\0.!\0usr
|
||
|
\0\e\e!\0\e\e!\0\e
|
||
|
\0\e!\0\e!\0\e
|
||
|
\0.!\0.!\0.
|
||
|
\0..!\0.!\0..
|
||
|
.TE
|
||
|
.RE
|
||
|
.
|
||
|
.PP
|
||
|
and,
|
||
|
when an MS\-Windows(\(tm) drive designator is also specified,
|
||
|
this becomes:\(em
|
||
|
.RS
|
||
|
.TS
|
||
|
tab(!);
|
||
|
lB lB lB
|
||
|
lw(15n) lw(10n) lw(10n).
|
||
|
\0path!\0dirname!\0basename
|
||
|
\_!\_!\_
|
||
|
\0d:\eusr\elib!\0d:\eusr!\0lib
|
||
|
\0d:\e\eusr\e\elib\e\e!\0d:\eusr!\0lib
|
||
|
\0d:\e\e\eusr\e\elib\e\e!\0d:\eusr!\0lib
|
||
|
\0d:\eusr\e!\0d:\e!\0usr
|
||
|
\0d:usr!\0d:.!\0usr
|
||
|
\0d:\e\e!\0d:\e!\0\e
|
||
|
\0d:\e!\0d:\e!\0\e
|
||
|
\0d:.!\0d:.!\0.
|
||
|
\0d:..!\0d:.!\0..
|
||
|
.TE
|
||
|
.RE
|
||
|
.
|
||
|
.PP
|
||
|
Please note,
|
||
|
in particular,
|
||
|
the special handling of path names which begin with
|
||
|
.I exactly
|
||
|
two directory separator characters,
|
||
|
and also that this special handling is suppressed
|
||
|
when these two characters are dissimilar,
|
||
|
or when an MS\-Windows(\(tm) drive designator is specified:\(em
|
||
|
.RS
|
||
|
.TS
|
||
|
tab(!);
|
||
|
lB lB lB
|
||
|
lw(15n) lw(10n) lw(10n).
|
||
|
\0path!\0dirname!\0basename
|
||
|
\_!\_!\_
|
||
|
\0//usr//lib//!\0//usr!\0lib
|
||
|
\0\e\eusr\e\elib\e\e!\0\e\eusr!\0lib
|
||
|
\0/\eusr\e\elib\e\e!\0/usr!\0lib
|
||
|
\0\e/usr\e\elib\e\e!\0\eusr!\0lib
|
||
|
\0d:\e\eusr\e\elib\e\e!\0d:\eusr!\0lib
|
||
|
\0//!\0//!\0/
|
||
|
\0\e\e!\0\e\e!\0\e
|
||
|
\0/\e!\0/!\0/
|
||
|
\0\e/!\0\e!\0\e
|
||
|
\0d:\e\e!\0d:\e!\0\e
|
||
|
.TE
|
||
|
.RE
|
||
|
.
|
||
|
.
|
||
|
.SH RETURN VALUE
|
||
|
.
|
||
|
The
|
||
|
.B dirname
|
||
|
function returns a pointer to a null terminated string,
|
||
|
which represents the directory path component of the passed
|
||
|
.I path
|
||
|
string,
|
||
|
without any trailing directory separator character,
|
||
|
and with all internal sequences of directory separator characters
|
||
|
normalised to a single separator at each level of directory nesting.
|
||
|
.
|
||
|
.PP
|
||
|
The
|
||
|
.B basename
|
||
|
function
|
||
|
returns a pointer to a null terminated string,
|
||
|
which represents the rightmost element of the passed
|
||
|
.I path
|
||
|
string,
|
||
|
with all trailing directory separator characters removed.
|
||
|
.
|
||
|
.PP
|
||
|
If any MS\-Windows(\(tm) drive designator is specified in the input
|
||
|
.I path
|
||
|
string,
|
||
|
it is included in the return value of the
|
||
|
.B dirname
|
||
|
function,
|
||
|
but not in that of the
|
||
|
.B basename
|
||
|
function.
|
||
|
.
|
||
|
.
|
||
|
.SH ERROR RETURNS
|
||
|
.
|
||
|
None.
|
||
|
.
|
||
|
.
|
||
|
.SH CAVEATS AND BUGS
|
||
|
.
|
||
|
The
|
||
|
.B dirname
|
||
|
and
|
||
|
.B basename
|
||
|
functions may modify the
|
||
|
.I path
|
||
|
string passed to them.
|
||
|
Therefore, it is an error to pass a character constant as the
|
||
|
.I path
|
||
|
parameter;
|
||
|
to do so may result in memory violation errors,
|
||
|
(segmentation faults),
|
||
|
and consequent abnormal program termination.
|
||
|
.PP
|
||
|
Also note that,
|
||
|
since the
|
||
|
.I path
|
||
|
argument may be modified by the
|
||
|
.B dirname
|
||
|
or the
|
||
|
.B basename
|
||
|
function call,
|
||
|
if you wish to preserve the original content of
|
||
|
.IR path ,
|
||
|
you should pass a copy to the function.
|
||
|
Furthermore,
|
||
|
either function may return its result in a statically allocated buffer,
|
||
|
which may be overwritten on a subsequent function call.
|
||
|
.PP
|
||
|
Although the
|
||
|
.B dirname
|
||
|
and
|
||
|
.B basename
|
||
|
functions parse path name strings,
|
||
|
they are basically just
|
||
|
.I string
|
||
|
functions.
|
||
|
The presence of an MS\-Windows(\(tm) drive designator is determined
|
||
|
by the appearance of a colon
|
||
|
.RB (\(dq : \(dq)
|
||
|
as the second character of the
|
||
|
.I path
|
||
|
string,
|
||
|
but neither function performs any check
|
||
|
to ensure that the first character represents a valid file system device;
|
||
|
neither is any form of validation performed,
|
||
|
to ensure that the remainder of the string
|
||
|
represents a valid path name.
|
||
|
.
|
||
|
.
|
||
|
.SH AUTHOR
|
||
|
.
|
||
|
This manpage was written for the MinGW implementation of the
|
||
|
.B dirname
|
||
|
and
|
||
|
.B basename
|
||
|
functions by Keith\ Marshall,
|
||
|
<keithmarshall@users.sourceforge.net>.
|
||
|
It may copied, modified and redistributed,
|
||
|
without restriction of copyright,
|
||
|
provided this acknowledgement of contribution by
|
||
|
the original author remains unchanged.
|
||
|
.
|
||
|
.
|
||
|
.\" EOF
|