1 /* iter.c : iteration drivers
3 * ====================================================================
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
20 * ====================================================================
25 #include "svn_pools.h"
26 #include "private/svn_dep_compat.h"
28 #include "svn_error_codes.h"
30 static svn_error_t internal_break_error
=
32 SVN_ERR_ITER_BREAK
, /* APR status */
34 NULL
, /* child error */
36 __FILE__
, /* file name */
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
;
65 svn_iter_apr_hash(svn_boolean_t
*completed
,
67 svn_iter_apr_hash_cb_t func
,
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
;
101 svn_error_t
*err
= SVN_NO_ERROR
;
102 apr_pool_t
*iterpool
= svn_pool_create(pool
);
103 apr_hash_index_t
*hi
;
105 for (hi
= apr_hash_first(pool
, hash
);
106 ! err
&& hi
; hi
= apr_hash_next(hi
))
112 svn_pool_clear(iterpool
);
114 apr_hash_this(hi
, &key
, &len
, &val
);
115 err
= (*func
)(baton
, key
, len
, val
, iterpool
);
121 if (err
&& err
->apr_err
== SVN_ERR_ITER_BREAK
)
123 if (err
!= &internal_break_error
)
124 /* Errors - except those created by svn_iter_break() -
125 need to be cleared when not further propagated. */
126 svn_error_clear(err
);
131 /* Clear iterpool, because callers may clear the error but have no way
132 to clear the iterpool with potentially lots of allocated memory */
133 svn_pool_destroy(iterpool
);
140 svn_iter_apr_array(svn_boolean_t
*completed
,
141 const apr_array_header_t
*array
,
142 svn_iter_apr_array_cb_t func
,
146 svn_error_t
*err
= SVN_NO_ERROR
;
147 apr_pool_t
*iterpool
= svn_pool_create(pool
);
150 for (i
= 0; (! err
) && i
< array
->nelts
; ++i
)
152 void *item
= array
->elts
+ array
->elt_size
*i
;
154 svn_pool_clear(iterpool
);
156 err
= (*func
)(baton
, item
, iterpool
);
162 if (err
&& err
->apr_err
== SVN_ERR_ITER_BREAK
)
164 if (err
!= &internal_break_error
)
165 /* Errors - except those created by svn_iter_break() -
166 need to be cleared when not further propagated. */
167 svn_error_clear(err
);
172 /* Clear iterpool, because callers may clear the error but have no way
173 to clear the iterpool with potentially lots of allocated memory */
174 svn_pool_destroy(iterpool
);
179 /* Note: Although this is a "__" function, it is in the public ABI, so
180 * we can never remove it or change its signature. */
182 svn_iter__break(void)
184 return &internal_break_error
;
187 /* Note about the type casts: apr_hash_this() does not expect a const hash
188 * index pointer even though it does not modify the hash index. In
189 * Subversion we're trying to be const-correct, so these functions all take
190 * a const hash index and we cast away the const when passing it down to
191 * APR. (A compiler may warn about casting away 'const', but at least this
192 * cast is explicit and gathered in one place.) */
194 const void *svn__apr_hash_index_key(const apr_hash_index_t
*hi
)
198 apr_hash_this((apr_hash_index_t
*)hi
, &key
, NULL
, NULL
);
202 apr_ssize_t
svn__apr_hash_index_klen(const apr_hash_index_t
*hi
)
206 apr_hash_this((apr_hash_index_t
*)hi
, NULL
, &klen
, NULL
);
210 void *svn__apr_hash_index_val(const apr_hash_index_t
*hi
)
214 apr_hash_this((apr_hash_index_t
*)hi
, NULL
, NULL
, &val
);