1
1
/* iter.c : iteration drivers
3
3
* ====================================================================
4
* Copyright (c) 2007 CollabNet. All rights reserved.
6
* This software is licensed as described in the file COPYING, which
7
* you should have received as part of this distribution. The terms
8
* are also available at http://subversion.tigris.org/license-1.html.
9
* If newer versions of this license are posted there, you may use a
10
* newer version instead, at your option.
12
* This software consists of voluntary contributions made by many
13
* individuals. For exact contribution history, see the revision
14
* history and logs, available at http://subversion.tigris.org/.
4
* Licensed to the Apache Software Foundation (ASF) under one
5
* or more contributor license agreements. See the NOTICE file
6
* distributed with this work for additional information
7
* regarding copyright ownership. The ASF licenses this file
8
* to you under the Apache License, Version 2.0 (the
9
* "License"); you may not use this file except in compliance
10
* with the License. You may obtain a copy of the License at
12
* http://www.apache.org/licenses/LICENSE-2.0
14
* Unless required by applicable law or agreed to in writing,
15
* software distributed under the License is distributed on an
16
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
17
* KIND, either express or implied. See the License for the
18
* specific language governing permissions and limitations
15
20
* ====================================================================
19
24
#include "svn_iter.h"
20
25
#include "svn_pools.h"
26
#include "private/svn_dep_compat.h"
22
28
#include "svn_error_codes.h"
31
37
__LINE__ /* line number */
40
#if APR_VERSION_AT_LEAST(1, 4, 0)
44
svn_iter_apr_hash_cb_t func;
50
int hash_do_callback(void *baton,
55
struct hash_do_baton *hdb = baton;
57
svn_pool_clear(hdb->iterpool);
58
hdb->err = (*hdb->func)(hdb->baton, key, klen, (void *)value, hdb->iterpool);
60
return hdb->err == SVN_NO_ERROR;
35
65
svn_iter_apr_hash(svn_boolean_t *completed,
71
#if APR_VERSION_AT_LEAST(1, 4, 0)
72
struct hash_do_baton hdb;
73
svn_boolean_t error_received;
77
hdb.iterpool = svn_pool_create(pool);
79
error_received = !apr_hash_do(hash_do_callback, &hdb, hash);
81
svn_pool_destroy(hdb.iterpool);
84
*completed = !error_received;
89
if (hdb.err->apr_err == SVN_ERR_ITER_BREAK
90
&& hdb.err != &internal_break_error)
92
/* Errors - except those created by svn_iter_break() -
93
need to be cleared when not further propagated. */
94
svn_error_clear(hdb.err);
96
hdb.err = SVN_NO_ERROR;
41
101
svn_error_t *err = SVN_NO_ERROR;
42
102
apr_pool_t *iterpool = svn_pool_create(pool);
43
103
apr_hash_index_t *hi;
93
154
svn_pool_clear(iterpool);
95
err = (*func)(baton, item, pool);
156
err = (*func)(baton, item, iterpool);
121
182
return &internal_break_error;
185
/* Note about the type casts: apr_hash_this() does not expect a const hash
186
* index pointer even though it does not modify the hash index. In
187
* Subversion we're trying to be const-correct, so these functions all take
188
* a const hash index and we cast away the const when passing it down to
189
* APR. (A compiler may warn about casting away 'const', but at least this
190
* cast is explicit and gathered in one place.) */
192
const void *svn__apr_hash_index_key(const apr_hash_index_t *hi)
196
apr_hash_this((apr_hash_index_t *)hi, &key, NULL, NULL);
200
apr_ssize_t svn__apr_hash_index_klen(const apr_hash_index_t *hi)
204
apr_hash_this((apr_hash_index_t *)hi, NULL, &klen, NULL);
208
void *svn__apr_hash_index_val(const apr_hash_index_t *hi)
212
apr_hash_this((apr_hash_index_t *)hi, NULL, NULL, &val);