* Copyright (C) 1996-2000 Andrew Tridgell
* Copyright (C) 1996 Paul Mackerras
* Copyright (C) 2001, 2002 Martin Pool <mbp@samba.org>
- * Copyright (C) 2003, 2004, 2005, 2006 Wayne Davison
+ * Copyright (C) 2003-2007 Wayne Davison
*
* This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
{
if (num >= MALLOC_MAX/size)
return NULL;
- /* No realloc should need this, but just in case... */
if (!ptr)
return malloc(size * num);
return realloc(ptr, size * num);
return -1;
}
+
+void *expand_item_list(item_list *lp, size_t item_size,
+ const char *desc, int incr)
+{
+ /* First time through, 0 <= 0, so list is expanded. */
+ if (lp->malloced <= lp->count) {
+ void *new_ptr;
+ size_t new_size = lp->malloced;
+ if (incr < 0)
+ new_size -= incr; /* increase slowly */
+ else if (new_size < (size_t)incr)
+ new_size += incr;
+ else
+ new_size *= 2;
+ new_ptr = realloc_array(lp->items, char, new_size * item_size);
+ if (verbose >= 4) {
+ rprintf(FINFO, "[%s] expand %s to %.0f bytes, did%s move\n",
+ who_am_i(), desc, (double)new_size * item_size,
+ new_ptr == lp->items ? " not" : "");
+ }
+ if (!new_ptr)
+ out_of_memory("expand_item_list");
+
+ lp->items = new_ptr;
+ lp->malloced = new_size;
+ }
+ return (char*)lp->items + (lp->count++ * item_size);
+}