#include "xbt/dynar_private.h" /* type definition, which we share with the
code in charge of sending this across the net */
-XBT_LOG_NEW_DEFAULT_SUBCATEGORY(dynar,xbt,"Dynamic arrays");
+XBT_LOG_NEW_DEFAULT_SUBCATEGORY(xbt_dyn,xbt,"Dynamic arrays");
#define __sanity_check_dynar(dynar) \
(int) (idx), (unsigned long) dynar->used)
#define __check_sloppy_inbound_idx(dynar, idx) \
xbt_assert2(idx <= dynar->used, \
- "dynar is not that long. You asked %d, but it's only %lu long", \
+ "dynar is not that long. You asked %d, but it's only %lu long (could have been equal to it)", \
(int) (idx), (unsigned long) dynar->used)
#define __check_populated_dynar(dynar) \
xbt_assert1(dynar->used, \
* types (int, char, double, etc) or pointer of pointers (struct **).
*/
xbt_dynar_t
-xbt_dynar_new(const unsigned long elmsize,
+xbt_dynar_new(const unsigned long elmsize,
void_f_pvoid_t * const free_f) {
xbt_dynar_t dynar = xbt_new0(s_xbt_dynar_t,1);
* Make a copy before fooling with it.
*/
void*
-xbt_dynar_get_ptr(const xbt_dynar_t dynar,
- const int idx) {
+xbt_dynar_get_ptr(const xbt_dynar_t dynar, const int idx) {
__sanity_check_dynar(dynar);
__sanity_check_idx(idx);
if (object) {
_xbt_dynar_get_elm(object, dynar, idx);
} else if (dynar->free_f) {
- char elm[SIZEOF_MAX];
- _xbt_dynar_get_elm(elm, dynar, idx);
- (*dynar->free_f)(elm);
+ if (dynar->elmsize <= SIZEOF_MAX) {
+ char elm[SIZEOF_MAX];
+ _xbt_dynar_get_elm(elm, dynar, idx);
+ (*dynar->free_f)(elm);
+ } else {
+ char *elm=malloc(dynar->elmsize);
+ _xbt_dynar_get_elm(elm, dynar, idx);
+ (*dynar->free_f)(elm);
+ free(elm);
+ }
}
nb_shift = dynar->used-1 - idx;
#define NB_ELEM 5000
XBT_TEST_SUITE("dynar","Dynar data container");
-XBT_LOG_EXTERNAL_CATEGORY(dynar);
-XBT_LOG_DEFAULT_CATEGORY(dynar);
+XBT_LOG_EXTERNAL_CATEGORY(xbt_dyn);
+XBT_LOG_DEFAULT_CATEGORY(xbt_dyn);
XBT_TEST_UNIT("int",test_dynar_int,"Dyars of integers") {
/* Vars_decl [doxygen cruft] */