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 ) { struct dirinf root; struct dirinf dir; int g; file_build1( f, file ); /* Get info on root and dir for combining. */ dir_flags( f->f_root.ptr, f->f_root.len, &root ); dir_flags( f->f_dir.ptr, f->f_dir.len, &dir ); /* Combine. */ switch ( g = grid[ root.flags ][ dir.flags ] ) { case G_DIR: /* take dir */ string_append_range( file, f->f_dir.ptr, f->f_dir.ptr + f->f_dir.len ); break; case G_ROOT: /* take root */ string_append_range( file, f->f_root.ptr, f->f_root.ptr + f->f_root.len ); break; case G_VAD: /* root's dev + abs directory */ string_append_range( file, root.dev.ptr, root.dev.ptr + root.dev.len ); string_append_range( file, dir.dir.ptr, dir.dir.ptr + dir.dir.len ); break; case G_DRD: case G_DDD: /* root's dev:[dir] + rel directory */ string_append_range( file, f->f_root.ptr, f->f_root.ptr + f->f_root.len ); /* sanity checks: root ends with ] */ if ( file->value[file->size - 1] == ']' ) string_pop_back( file ); /* Add . if separating two -'s */ if ( g == G_DDD ) string_push_back( file, '.' ); /* skip [ of dir */ string_append_range( file, dir.dir.ptr + 1, dir.dir.ptr + 1 + dir.dir.len - 1 ); break; case G_VRD: /* root's dev + rel directory made abs */ string_append_range( file, root.dev.ptr, root.dev.ptr + root.dev.len ); string_push_back( file, '[' ); /* skip [. of rel dir */ string_append_range( file, dir.dir.ptr + 2, dir.dir.ptr + 2 + dir.dir.len - 2 ); break; } # ifdef DEBUG if ( DEBUG_SEARCH && ( root.flags || dir.flags ) ) printf( "%d x %d = %d (%s)\n", root.flags, dir.flags, grid[ root.flags ][ dir.flags ], file->value ); # endif /* * Now do the special :P modifier when no file was present. * (none) (none) * [dir1.dir2] [dir1] * [dir] [000000] * [.dir] (none) * [] [] */ if ( ( file->value[ file->size - 1 ] == ']' ) && f->parent ) { char * p = file->value + file->size; while ( p-- > file->value ) { if ( *p == '.' ) { /* If we've truncated everything and left with '[', return empty string. */ if ( p == file->value + 1 ) string_truncate( file, 0 ); else { string_truncate( file, p - file->value ); string_push_back( file, ']' ); } break; } if ( *p == '-' ) { /* handle .- or - */ if ( ( p > file->value ) && ( p[ -1 ] == '.' ) ) --p; *p++ = ']'; break; } if ( *p == '[' ) { if ( p[ 1 ] == ']' ) { /* CONSIDER: I don't see any use of this code. We immediately break, and 'p' is a local variable. */ p += 2; } else { string_truncate( file, p - file->value ); string_append( file, "[000000]" ); } break; } } } /* Now copy the file pieces. */ if ( f->f_base.len ) { string_append_range( file, f->f_base.ptr, f->f_base.ptr + f->f_base.len ); } /* If there is no suffix, we append a "." onto all generated names. This * keeps VMS from appending its own (wrong) idea of what the suffix should * be. */ if ( f->f_suffix.len ) string_append_range( file, f->f_suffix.ptr, f->f_suffix.ptr + f->f_suffix.len ); else if ( binding && f->f_base.len ) string_push_back( file, '.' ); 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, ')' ); } # ifdef DEBUG if ( DEBUG_SEARCH ) printf( "built %.*s + %.*s / %.*s suf %.*s mem %.*s -> %s\n", f->f_root.len, f->f_root.ptr, f->f_dir.len, f->f_dir.ptr, f->f_base.len, f->f_base.ptr, f->f_suffix.len, f->f_suffix.ptr, f->f_member.len, f->f_member.ptr, file->value ); # endif }
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, ')' ); } }
void path_build( PATHNAME *f, string* file, int binding ) { int dflag, rflag, act; file_build1( f, file ); /* Combine root & directory, according to the grid. */ 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: { /* :: of rel dir */ string_push_back( file, DELIM ); } /* fall through */ case G_DIR: /* take dir */ string_append_range( file, f->f_dir.ptr, f->f_dir.ptr + f->f_dir.len ); break; case G_ROOT: /* take root */ string_append_range( file, f->f_root.ptr, f->f_root.ptr + f->f_root.len ); break; case G_CAT: /* prepend root to dir */ string_append_range( file, f->f_root.ptr, f->f_root.ptr + f->f_root.len ); if( file->value[file->size - 1] == DELIM ) string_pop_back( file ); string_append_range( file, f->f_dir.ptr, f->f_dir.ptr + f->f_dir.len ); break; case G_DDDD: /* make it ::: (../..) */ string_append( file, ":::" ); break; } /* Put : between dir and file (if none already) */ if( act != G_MT && file->value[file->size - 1] != DELIM && ( f->f_base.len || f->f_suffix.len ) ) { string_push_back( file, DELIM ); } 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, ')' ); } if( DEBUG_SEARCH ) printf(" -> '%s'\n", file->value); }