blob: 01679b9f88dc408d2ed7501e0582320cb8ad3812 [file] [log] [blame]
/**
* @copyright
* ====================================================================
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
* ====================================================================
* @endcopyright
*
* @file svn_fspath.h
* @brief Implementation of path manipulation functions similar to
* those in svn_dirent_uri.h (which see for details) but for
* the private fspath class of paths.
*/
#ifndef SVN_FSPATH_H
#define SVN_FSPATH_H
#include <apr.h>
#include <apr_pools.h>
#include "svn_types.h"
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
/** Return TRUE iff @a fspath is canonical.
* @a fspath need not be canonical, of course.
*
* @since New in 1.7.
*/
svn_boolean_t
svn_fspath__is_canonical(const char *fspath);
/** This function is similar to svn_relpath_canonicalize(), except
* that it returns an fspath (which is essentially just a relpath
* tacked onto a leading forward slash).
*
* The returned fspath may be statically allocated or allocated from
* @a pool.
*
* This is similar to svn_fs__canonicalize_abspath() but also treats "."
* segments as special.
*
* @since New in 1.7.
*/
const char *
svn_fspath__canonicalize(const char *fspath,
apr_pool_t *pool);
/** Return the dirname of @a fspath, defined as the path with its basename
* removed. If @a fspath is "/", return "/".
*
* Allocate the result in @a pool.
*
* @since New in 1.7.
*/
const char *
svn_fspath__dirname(const char *fspath,
apr_pool_t *pool);
/** Return the last component of @a fspath. The returned value will have no
* slashes in it. If @a fspath is "/", return "".
*
* If @a pool is NULL, return a pointer to within @a fspath, else allocate
* the result in @a pool.
*
* @since New in 1.7.
*/
const char *
svn_fspath__basename(const char *fspath,
apr_pool_t *pool);
/** Divide the canonical @a fspath into @a *dirpath and @a
* *base_name, allocated in @a pool.
*
* If @a dirpath or @a base_name is NULL, then don't set that one.
*
* Either @a dirpath or @a base_name may be @a fspath's own address, but they
* may not both be the same address, or the results are undefined.
*
* If @a fspath has two or more components, the separator between @a dirpath
* and @a base_name is not included in either of the new names.
*
* @since New in 1.7.
*/
void
svn_fspath__split(const char **dirpath,
const char **base_name,
const char *fspath,
apr_pool_t *result_pool);
/** Return the fspath composed of @a fspath with @a relpath appended.
* Allocate the result in @a result_pool.
*
* @since New in 1.7.
*/
char *
svn_fspath__join(const char *fspath,
const char *relpath,
apr_pool_t *result_pool);
/** Return TRUE if @a fspath (with length @a len) is the root
* directory; return FALSE otherwise.
*
* @since New in 1.7.
*/
svn_boolean_t
svn_fspath__is_root(const char *fspath,
apr_size_t len);
/** Return the relative path part of @a child_fspath that is below
* @a parent_fspath, or just "" if @a parent_fspath is equal to
* @a child_fspath. If @a child_fspath is not below @a parent_fspath
* or equal to it, return @c NULL.
*
* @since New in 1.7.
*/
const char *
svn_fspath__skip_ancestor(const char *parent_fspath,
const char *child_fspath);
/** Return the longest common path shared by two fspaths, @a fspath1 and
* @a fspath2. If there's no common ancestor, return "/".
*
* @since New in 1.7.
*/
char *
svn_fspath__get_longest_ancestor(const char *fspath1,
const char *fspath2,
apr_pool_t *result_pool);
/** A faux fspath API used by the DAV modules to help us distinguish
* between real URI-decoded fspaths and URI-encoded URL path-portions.
*/
#define svn_urlpath__basename svn_fspath__basename
#define svn_urlpath__dirname svn_fspath__dirname
#define svn_urlpath__get_longest_ancestor svn_fspath__get_longest_ancestor
#define svn_urlpath__is_canonical svn_fspath__is_canonical
#define svn_urlpath__is_root svn_fspath__is_root
#define svn_urlpath__join svn_fspath__join
#define svn_urlpath__skip_ancestor svn_fspath__skip_ancestor
#define svn_urlpath__split svn_fspath__split
/* Like svn_fspath__canonicalize(), but this one accepts both full
URLs and URL path-portions. */
const char *
svn_urlpath__canonicalize(const char *uri, apr_pool_t *pool);
#ifdef __cplusplus
}
#endif /* __cplusplus */
#endif /* SVN_FSPATH_H */