void path_build( PATHNAME * f, string * file ) { file_build1( f, file ); /* Do not prepend root if it is '.' or the directory is rooted. */ if ( f->f_root.len && !( f->f_root.len == 1 && f->f_root.ptr[ 0 ] == '.' ) && !( f->f_dir.len && f->f_dir.ptr[ 0 ] == '/' ) #if PATH_DELIM == '\\' && !( f->f_dir.len && f->f_dir.ptr[ 0 ] == '\\' ) && !( f->f_dir.len && f->f_dir.ptr[ 1 ] == ':' ) #endif ) { string_append_range( file, f->f_root.ptr, f->f_root.ptr + f->f_root.len ); /* If 'root' already ends with a path delimeter, do not add another one. */ if ( !is_path_delim( f->f_root.ptr[ f->f_root.len - 1 ] ) ) string_push_back( file, as_path_delim( f->f_root.ptr[ f->f_root.len ] ) ); } if ( f->f_dir.len ) string_append_range( file, f->f_dir.ptr, f->f_dir.ptr + f->f_dir.len ); /* Put path separator between dir and file. */ /* Special case for root dir: do not add another path separator. */ if ( f->f_dir.len && ( f->f_base.len || f->f_suffix.len ) #if PATH_DELIM == '\\' && !( f->f_dir.len == 3 && f->f_dir.ptr[ 1 ] == ':' ) #endif && !( f->f_dir.len == 1 && is_path_delim( f->f_dir.ptr[ 0 ] ) ) ) string_push_back( file, as_path_delim( f->f_dir.ptr[ f->f_dir.len ] ) ); if ( f->f_base.len ) string_append_range( file, f->f_base.ptr, f->f_base.ptr + f->f_base.len ); if ( f->f_suffix.len ) string_append_range( file, f->f_suffix.ptr, f->f_suffix.ptr + f->f_suffix.len ); if ( f->f_member.len ) { string_push_back( file, '(' ); string_append_range( file, f->f_member.ptr, f->f_member.ptr + f->f_member.len ); string_push_back( file, ')' ); } }
void path_build( PATHNAME *f, string *file, int binding ) { file_build1( f, file ); /* Don't prepend root if it's . or directory is rooted */ # if PATH_DELIM == '/' 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 /* 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] == '/' ) && !( f->f_dir.len && f->f_dir.ptr[0] == '\\' ) && !( f->f_dir.len && f->f_dir.ptr[1] == ':' ) ) # endif /* unix */ { string_append_range( file, f->f_root.ptr, f->f_root.ptr + f->f_root.len ); /* If 'root' already ends with path delimeter, don't add yet another one. */ if ( ! is_path_delim( f->f_root.ptr[f->f_root.len-1] ) ) string_push_back( file, as_path_delim( f->f_root.ptr[f->f_root.len] ) ); } if ( f->f_dir.len ) string_append_range( file, f->f_dir.ptr, f->f_dir.ptr + f->f_dir.len ); /* UNIX: Put / between dir and file */ /* NT: Put \ between dir and file */ if ( f->f_dir.len && ( f->f_base.len || f->f_suffix.len ) ) { /* UNIX: Special case for dir \ : don't add another \ */ /* NT: Special case for dir / : don't add another / */ # if PATH_DELIM == '\\' if ( !( f->f_dir.len == 3 && f->f_dir.ptr[1] == ':' ) ) # endif if ( !( f->f_dir.len == 1 && is_path_delim( f->f_dir.ptr[0] ) ) ) string_push_back( file, as_path_delim( f->f_dir.ptr[f->f_dir.len] ) ); } if ( f->f_base.len ) { string_append_range( file, f->f_base.ptr, f->f_base.ptr + f->f_base.len ); } if ( f->f_suffix.len ) { string_append_range( file, f->f_suffix.ptr, f->f_suffix.ptr + f->f_suffix.len ); } if ( f->f_member.len ) { string_push_back( file, '(' ); string_append_range( file, f->f_member.ptr, f->f_member.ptr + f->f_member.len ); string_push_back( file, ')' ); } }