#include <stdint.h>
#include <stdlib.h>
#include <string.h>
+#include <limits.h>
#include "compat_ohash.h"
struct _ohash_record {
void
ohash_delete(struct ohash *h)
{
- (h->info.hfree)(h->t, sizeof(struct _ohash_record) * h->size,
- h->info.data);
+ (h->info.free)(h->t, h->info.data);
#ifndef NDEBUG
h->t = NULL;
#endif
ohash_resize(struct ohash *h)
{
struct _ohash_record *n;
- unsigned int ns, j;
+ size_t ns;
+ unsigned int j;
unsigned int i, incr;
- if (4 * h->deleted < h->total)
- ns = h->size << 1;
- else if (3 * h->deleted > 2 * h->total)
- ns = h->size >> 1;
+ if (4 * h->deleted < h->total) {
+ if (h->size >= (UINT_MAX >> 1U))
+ ns = UINT_MAX;
+ else
+ ns = h->size << 1U;
+ } else if (3 * h->deleted > 2 * h->total)
+ ns = h->size >> 1U;
else
ns = h->size;
if (ns < MINSIZE)
STAT_HASH_EXPAND++;
STAT_HASH_SIZE += ns - h->size;
#endif
- n = (h->info.halloc)(sizeof(struct _ohash_record) * ns, h->info.data);
+
+ n = (h->info.calloc)(ns, sizeof(struct _ohash_record), h->info.data);
if (!n)
return;
n[i].p = h->t[j].p;
}
}
- (h->info.hfree)(h->t, sizeof(struct _ohash_record) * h->size,
- h->info.data);
+ (h->info.free)(h->t, h->info.data);
h->t = n;
h->size = ns;
h->total -= h->deleted;
#endif
/* Copy info so that caller may free it. */
h->info.key_offset = info->key_offset;
- h->info.halloc = info->halloc;
- h->info.hfree = info->hfree;
+ h->info.calloc = info->calloc;
+ h->info.free = info->free;
h->info.alloc = info->alloc;
h->info.data = info->data;
- h->t = (h->info.halloc)(sizeof(struct _ohash_record) * h->size,
- h->info.data);
+ h->t = (h->info.calloc)(h->size, sizeof(struct _ohash_record),
+ h->info.data);
h->total = h->deleted = 0;
}
struct ohash_info {
ptrdiff_t key_offset;
void *data; /* user data */
- void *(*halloc)(size_t, void *);
- void (*hfree)(void *, size_t, void *);
+ void *(*calloc)(size_t, size_t, void *);
+ void (*free)(void *, void *);
void *(*alloc)(size_t, void *);
};
-/* $Id: mandocdb.c,v 1.151 2014/06/20 01:21:48 schwarze Exp $ */
+/* $Id: mandocdb.c,v 1.152 2014/06/20 02:24:40 schwarze Exp $ */
/*
* Copyright (c) 2011, 2012 Kristaps Dzonsons <kristaps@bsd.lv>
* Copyright (c) 2011, 2012, 2013, 2014 Ingo Schwarze <schwarze@openbsd.org>
static void dbprune(void);
static void filescan(const char *);
static void *hash_alloc(size_t, void *);
-static void hash_free(void *, size_t, void *);
-static void *hash_halloc(size_t, void *);
+static void hash_free(void *, void *);
+static void *hash_calloc(size_t, size_t, void *);
static void mlink_add(struct mlink *, const struct stat *);
static void mlink_check(struct mpage *, struct mlink *);
static void mlink_free(struct mlink *);
memset(&dirs, 0, sizeof(struct manpaths));
mpages_info.alloc = mlinks_info.alloc = hash_alloc;
- mpages_info.halloc = mlinks_info.halloc = hash_halloc;
- mpages_info.hfree = mlinks_info.hfree = hash_free;
+ mpages_info.calloc = mlinks_info.calloc = hash_calloc;
+ mpages_info.free = mlinks_info.free = hash_free;
mpages_info.key_offset = offsetof(struct mpage, inodev);
mlinks_info.key_offset = offsetof(struct mlink, file);
enum mandoclevel lvl;
str_info.alloc = hash_alloc;
- str_info.halloc = hash_halloc;
- str_info.hfree = hash_free;
+ str_info.calloc = hash_calloc;
+ str_info.free = hash_free;
str_info.key_offset = offsetof(struct str, key);
if (0 == nodb)
}
static void *
-hash_halloc(size_t sz, void *arg)
+hash_calloc(size_t n, size_t sz, void *arg)
{
- return(mandoc_calloc(1, sz));
+ return(mandoc_calloc(n, sz));
}
static void *
}
static void
-hash_free(void *p, size_t sz, void *arg)
+hash_free(void *p, void *arg)
{
free(p);
-/* $Id: mansearch.c,v 1.36 2014/04/23 21:06:41 schwarze Exp $ */
+/* $Id: mansearch.c,v 1.37 2014/06/20 02:24:40 schwarze Exp $ */
/*
* Copyright (c) 2012 Kristaps Dzonsons <kristaps@bsd.lv>
* Copyright (c) 2013, 2014 Ingo Schwarze <schwarze@openbsd.org>
static char *buildoutput(sqlite3 *, sqlite3_stmt *,
uint64_t, uint64_t);
static void *hash_alloc(size_t, void *);
-static void hash_free(void *, size_t, void *);
-static void *hash_halloc(size_t, void *);
+static void hash_free(void *, void *);
+static void *hash_calloc(size_t, size_t, void *);
static struct expr *exprcomp(const struct mansearch *,
int, char *[]);
static void exprfree(struct expr *);
unsigned int idx;
size_t i, j, cur, maxres;
- memset(&info, 0, sizeof(struct ohash_info));
-
- info.halloc = hash_halloc;
+ info.calloc = hash_calloc;
info.alloc = hash_alloc;
- info.hfree = hash_free;
+ info.free = hash_free;
info.key_offset = offsetof(struct match, pageid);
*sz = cur = maxres = 0;
}
static void *
-hash_halloc(size_t sz, void *arg)
+hash_calloc(size_t nmemb, size_t sz, void *arg)
{
- return(mandoc_calloc(1, sz));
+ return(mandoc_calloc(nmemb, sz));
}
static void *
}
static void
-hash_free(void *p, size_t sz, void *arg)
+hash_free(void *p, void *arg)
{
free(p);