# include "jam.h"
# include "filesys.h"
# if defined( unix ) || defined( NT ) || defined( __OS2__ )
# ifdef unix
# define DELIM '/'
# else
# define DELIM '\\'
# endif
void
file_parse( file, f )
char *file;
FILENAME *f;
{
char *p, *q;
char *end;
memset( (char *)f, 0, sizeof( *f ) );
if( file[0] == '<' && ( p = strchr( file, '>' ) ) )
{
f->f_grist.ptr = file;
f->f_grist.len = p - file;
file = p + 1;
}
p = strrchr( file, '/' );
# ifndef UNIX
{
char *p1 = strrchr( file, '\\' );
p = p1 > p ? p1 : p;
}
# endif
if( p )
{
f->f_dir.ptr = file;
f->f_dir.len = p - file;
if( !f->f_dir.len )
f->f_dir.len = 1;
# ifndef UNIX
if( f->f_dir.len == 2 && file[1] == ':' )
f->f_dir.len = 3;
# endif
file = p + 1;
}
end = file + strlen( file );
if( ( p = strchr( file, '(' ) ) && end[-1] == ')' )
{
f->f_member.ptr = p + 1;
f->f_member.len = end - p - 2;
end = p;
}
p = 0;
q = file;
while( q = memchr( q, '.', end - q ) )
p = q++;
if( p )
{
f->f_suffix.ptr = p;
f->f_suffix.len = end - p;
end = p;
}
f->f_base.ptr = file;
f->f_base.len = end - file;
if (strncmp (file, "lib", 3) == 0) {
f->f_archive.ptr = file+3;
f->f_archive.len = end - file - 3;
} else {
f->f_archive.ptr = file;
f->f_archive.len = end - file;
}
}
void
file_build( f, file, binding )
FILENAME *f;
char *file;
int binding;
{
if( f->f_grist.len )
{
if( f->f_grist.ptr[0] != '<' ) *file++ = '<';
memcpy( file, f->f_grist.ptr, f->f_grist.len );
file += f->f_grist.len;
if( file[-1] != '>' ) *file++ = '>';
}
# ifdef unix
if( f->f_root.len
&& !( f->f_root.len == 1 && f->f_root.ptr[0] == '.' )
&& !( f->f_dir.len && f->f_dir.ptr[0] == '/' ) )
# else
if( f->f_root.len
&& !( f->f_root.len == 1 && f->f_root.ptr[0] == '.' )
&& !( f->f_dir.len && f->f_dir.ptr[0] == '/' )
&& !( f->f_dir.len && f->f_dir.ptr[0] == '\\' )
&& !( f->f_dir.len && f->f_dir.ptr[1] == ':' ) )
# endif
{
memcpy( file, f->f_root.ptr, f->f_root.len );
file += f->f_root.len;
*file++ = DELIM;
}
if( f->f_dir.len )
{
memcpy( file, f->f_dir.ptr, f->f_dir.len );
file += f->f_dir.len;
}
if( f->f_dir.len && ( f->f_base.len || f->f_suffix.len ) )
{
# ifndef UNIX
if( !( f->f_dir.len == 3 && f->f_dir.ptr[1] == ':' ) )
# endif
if( !( f->f_dir.len == 1 && f->f_dir.ptr[0] == DELIM ) )
*file++ = DELIM;
}
if( f->f_base.len && !f->f_archive.len )
{
memcpy( file, f->f_base.ptr, f->f_base.len );
file += f->f_base.len;
}
if( !f->f_base.len && f->f_archive.len )
{
memcpy( file, f->f_archive.ptr, f->f_archive.len );
file += f->f_archive.len;
}
if( f->f_base.len && f->f_archive.len )
{
if( strncmp (f->f_base.ptr, "lib", 3) == 0 )
{
memcpy( file, f->f_base.ptr, 3 );
file += 3;
}
memcpy( file, f->f_archive.ptr, f->f_archive.len );
file += f->f_archive.len;
}
if( f->f_suffix.len )
{
memcpy( file, f->f_suffix.ptr, f->f_suffix.len );
file += f->f_suffix.len;
}
if( f->f_member.len )
{
*file++ = '(';
memcpy( file, f->f_member.ptr, f->f_member.len );
file += f->f_member.len;
*file++ = ')';
}
*file = 0;
}
void
file_parent( f )
FILENAME *f;
{
f->f_base.ptr =
f->f_suffix.ptr =
f->f_member.ptr =
f->f_archive.ptr = "";
f->f_base.len =
f->f_suffix.len =
f->f_member.len =
f->f_archive.len = 0;
}
# endif