# include "jam.h"
# include "filesys.h"
# ifdef macintosh
# define DELIM ':'
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, DELIM );
if( p )
{
f->f_dir.ptr = file;
f->f_dir.len = p - file;
#if 0
if( !f->f_dir.len )
++f->f_dir.len;
# else
f->f_dir.len++;
# 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;
}
}
# define DIR_EMPTY 0
# define DIR_DOT 1
# define DIR_DOTDOT 2
# define DIR_ABS 3
# define DIR_REL 4
# define G_DIR 0
# define G_ROOT 1
# define G_CAT 2
# define G_DTDR 3
# define G_DDDD 4
# define G_MT 5
char grid[5][5] = {
{ G_MT, G_DIR, G_DIR, G_DIR, G_DIR },
{ G_ROOT, G_DIR, G_DIR, G_DIR, G_DIR },
{ G_ROOT, G_ROOT, G_DDDD, G_DIR, G_DTDR },
{ G_ROOT, G_ROOT, G_ROOT, G_DIR, G_CAT },
{ G_ROOT, G_ROOT, G_ROOT, G_DIR, G_CAT }
} ;
static int
file_flags( ptr, len )
char *ptr;
int len;
{
if( !len )
return DIR_EMPTY;
if( len == 1 && ptr[0] == DELIM )
return DIR_DOT;
if( len == 2 && ptr[0] == DELIM && ptr[1] == DELIM )
return DIR_DOTDOT;
if( ptr[0] == DELIM )
return DIR_REL;
return DIR_ABS;
}
void
file_build( f, file, binding )
FILENAME *f;
char *file;
int binding;
{
char *ofile = file;
int dflag, rflag, act;
if( DEBUG_SEARCH )
{
printf("build file: ");
if( f->f_root.len )
printf( "root = '%.*s' ", f->f_root.len, f->f_root.ptr );
if( f->f_dir.len )
printf( "dir = '%.*s' ", f->f_dir.len, f->f_dir.ptr );
if( f->f_base.len )
printf( "base = '%.*s' ", f->f_base.len, f->f_base.ptr );
}
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++ = '>';
}
dflag = file_flags( f->f_dir.ptr, f->f_dir.len );
rflag = file_flags( f->f_root.ptr, f->f_root.len );
switch( act = grid[ rflag ][ dflag ] )
{
case G_DTDR:
*file++ = DELIM;
case G_DIR:
memcpy( file, f->f_dir.ptr, f->f_dir.len );
file += f->f_dir.len;
break;
case G_ROOT:
memcpy( file, f->f_root.ptr, f->f_root.len );
file += f->f_root.len;
break;
case G_CAT:
memcpy( file, f->f_root.ptr, f->f_root.len );
file += f->f_root.len;
if( file[-1] == DELIM ) --file;
memcpy( file, f->f_dir.ptr, f->f_dir.len );
file += f->f_dir.len;
break;
case G_DDDD:
strcpy( file, ":::" );
file += 3;
break;
}
if( act != G_MT &&
file[-1] != DELIM &&
( f->f_base.len || f->f_suffix.len ) )
{
*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;
if( DEBUG_SEARCH )
printf(" -> '%s'\n", ofile);
}
void
file_parent( f )
FILENAME *f;
{
f->f_base.ptr =
f->f_suffix.ptr =
f->f_member.ptr = "";
f->f_base.len =
f->f_suffix.len =
f->f_member.len = 0;
}
# endif