blob: 0ce4f4ab8d013153336d39c0242c8f41f4850bc4 [file] [log] [blame]
/*
* svn_sorts.h : all sorts of sorts.
*
* ====================================================================
* Copyright (c) 2000-2002 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/.
* ====================================================================
*/
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
#ifndef SVN_SORTS_H
#define SVN_SORTS_H
#include <apr_pools.h>
#include <apr_tables.h> /* for apr_array_header_t */
#include <apr_hash.h>
#include <apr_file_io.h>
/* This structure is used to hold a key/value from a hash table */
typedef struct {
const void *key; /* pointer to the key */
apr_ssize_t klen; /* size of the key */
void *value; /* pointer to the value */
} svn_item_t;
/* Compare two svn_stringbuf_t's, returning an integer greater than,
* equal to, or less than 0, according as A is greater than, equal to,
* or less than B.
*
* You can use this to do an in-place sort of an apr_array_header_t
* HDR of svn_stringbuf_t's like so:
*
* qsort (HDR->elts, HDR->nelts, HDR->elt_size,
* svn_path_compare_strings_as_paths);
*/
int svn_sort_compare_strings_as_paths (const void *a, const void *b);
/* Compare two svn_item_t's, returning an integer greater than,
* equal to, or less than 0, according as A is greater than, equal to,
* or less than B.
*
* This is useful for converting a hash into a sorted
* apr_array_header_t. For example, to convert hash HSH to a sorted
* array, do this:
*
* apr_array_header_t *HDR;
* HDR = apr_hash_sorted_keys (HSH, svn_sort_compare_items_as_paths, pool);
*/
int svn_sort_compare_items_as_paths (const svn_item_t *a, const svn_item_t *b);
/* Compare two svn_revnum_t's, returning an integer greater than, equal
* to, or less than 0, according as B is greater than, equal to, or less
* than A. Note that this sorts newest revsion to oldest (IOW, descending
* order).
*
* This is useful for converting an array of revisions into a sorted
* apr_array_header_t. You are responsible for detecting, preventing or
* removing duplicates.
*/
int svn_sort_compare_revisions (const void *a, const void *b);
#ifndef apr_hash_sorted_keys
/* Sort HT according to its keys, return an apr_array_header_t
containing svn_item_t structures holding those keys and values
(i.e. for each svn_item_t ITEM in the returned array, ITEM->key
and is the ITEM->size are the hash key, and ITEM->data points to
the hash value).
Storage is shared with the original hash, not copied.
COMPARISON_FUNC should take two svn_item_t's and return an integer
greater than, equal to, or less than 0, according as the first item
is greater than, equal to, or less than the second.
NOTE:
This function and the svn_item_t should go over to APR. Got a Round Tuit?
*/
apr_array_header_t *
apr_hash_sorted_keys (apr_hash_t *ht,
int (*comparison_func) (const svn_item_t *,
const svn_item_t *),
apr_pool_t *pool);
#endif /* apr_hash_sorted_keys */
#ifdef __cplusplus
}
#endif /* __cplusplus */
#endif /* SVN_SORTS_H */
/* ----------------------------------------------------------------
* local variables:
* eval: (load-file "../../tools/dev/svn-dev.el")
* end:
*/