/**
* @copyright
* ====================================================================
* Copyright (c) 2009 CollabNet. All rights reserved.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
* are also available at http://subversion.tigris.org/license-1.html.
* If newer versions of this license are posted there, you may use a
* newer version instead, at your option.
*
* This software consists of voluntary contributions made by many
* individuals. For exact contribution history, see the revision
* history and logs, available at http://subversion.tigris.org/.
* ====================================================================
* @endcopyright
*
* @file private_uri.h
* @brief Header file for currently internal svn_uri_*() API
*
* ### These Functions will be added to the public API in 1.7
* but because their is some discussion on how they should work
* this api has been removed from 1.6 to allow future redesign.
*/
#ifndef SVN_LIBSVN_SUBR_PRIVATE_URI_H
#define SVN_LIBSVN_SUBR_PRIVATE_URI_H
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
/** Convert @a uri from the local style to the canonical internal style.
*/
const char *
svn_uri_internal_style(const char *uri,
apr_pool_t *pool);
/** Convert @a uri from the canonical internal style to the local style.
*/
const char *
svn_uri_local_style(const char *uri,
apr_pool_t *pool);
/** Get the dirname of the specified canonicalized @a uri, defined as
* the dirent with its basename removed.
*
* If @a dirent is root (e.g. "http://server"), it is returned
* unchanged.
*
* The returned dirname will be allocated in @a pool.
*/
char *
svn_uri_dirname(const char *dirent,
apr_pool_t *pool);
/** Return TRUE if @a uri is considered absolute or is a URL.
*/
svn_boolean_t
svn_uri_is_absolute(const char *dirent);
/** Return TRUE if @a uri is a root path, so starts with '/'.
*
* Do not use this function with URLs.
*/
svn_boolean_t
svn_uri_is_root(const char *uri,
apr_size_t len);
/** Return a new uri like @a uri, but transformed such that some types
* of uri specification redundancies are removed.
*
* This involves collapsing redundant "/./" elements, removing
* multiple adjacent separator characters, removing trailing
* separator characters, and possibly other semantically inoperative
* transformations.
*
* This functions supports URLs.
*
* The returned uri may be statically allocated, equal to @a uri, or
* allocated from @a pool.
*/
const char *
svn_uri_canonicalize(const char *uri,
apr_pool_t *pool);
/** Return @c TRUE iff @a uri is canonical. Use @a pool for temporary
* allocations.
*/
svn_boolean_t
svn_uri_is_canonical(const char *uri,
apr_pool_t *pool);
/** Return the longest common path shared by two canonicalized uris,
* @a uri1 and @a uri2. If there's no common ancestor, return the
* empty path.
*
* @a path1 and @a path2 may be URLs. In order for two URLs to have
* a common ancestor, they must (a) have the same protocol (since two URLs
* with the same path but different protocols may point at completely
* different resources), and (b) share a common ancestor in their path
* component, i.e. 'protocol://' is not a sufficient ancestor.
*/
char *
svn_uri_get_longest_ancestor(const char *path1,
const char *path2,
apr_pool_t *pool);
/** Test if @a uri2 is a child of @a uri1.
* If not, return @c NULL.
* If so, return a copy of the remainder uri, allocated in @a pool.
* (The remainder is the component which, added to @a uri1, yields
* @a uri2. The remainder does not begin with a dir separator.)
*
* Both uris must be in canonical form, and must either be absolute,
* or contain no ".." components.
*
* If @a uri2 is the same as @a uri1, it is not considered a child,
* so the result is @c NULL; an empty string is never returned.
*
* If @a pool is @c NULL , a pointer into @a uri2 will be returned to
* identify the remainder uri.
*
* ### @todo the ".." restriction is unfortunate, and would ideally
* be lifted by making the implementation smarter. But this is not
* trivial: if the uri is "../foo", how do you know whether or not
* the current directory is named "foo" in its parent?
*/
const char *
svn_uri_is_child(const char *uri1,
const char *uri2,
apr_pool_t *pool);
/** Return TRUE if @a uri1 is an ancestor of @a uri2 or the uris are
* equal and FALSE otherwise.
*
* This function supports URLs.
*/
svn_boolean_t
svn_uri_is_ancestor(const char *path1,
const char *path2);
#ifdef __cplusplus
}
#endif /* __cplusplus */
#endif /* SVN_LIBSVN_SUBR_PRIVATE_URI_H */