sized_array.c revision 1fcced4c370617db71610fecffd5451a5894ca5e
5f0e2c8913fed44e1629f1367ce54e74ce2a2eb3Michael Graff/*
69fe9aaafdd6a141610e86a777d325db75422070Mark Andrews * CDDL HEADER START
499b34cea04a46823d003d4c0520c8b03e8513cbBrian Wellington *
40f53fa8d9c6a4fc38c0014495e7a42b08f52481David Lawrence * The contents of this file are subject to the terms of the
5f0e2c8913fed44e1629f1367ce54e74ce2a2eb3Michael Graff * Common Development and Distribution License (the "License").
5f0e2c8913fed44e1629f1367ce54e74ce2a2eb3Michael Graff * You may not use this file except in compliance with the License.
5f0e2c8913fed44e1629f1367ce54e74ce2a2eb3Michael Graff *
40f53fa8d9c6a4fc38c0014495e7a42b08f52481David Lawrence * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
dafcb997e390efa4423883dafd100c975c4095d6Mark Andrews * or http://www.opensolaris.org/os/licensing.
dafcb997e390efa4423883dafd100c975c4095d6Mark Andrews * See the License for the specific language governing permissions
dafcb997e390efa4423883dafd100c975c4095d6Mark Andrews * and limitations under the License.
dafcb997e390efa4423883dafd100c975c4095d6Mark Andrews *
dafcb997e390efa4423883dafd100c975c4095d6Mark Andrews * When distributing Covered Code, include this CDDL HEADER in each
dafcb997e390efa4423883dafd100c975c4095d6Mark Andrews * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
dafcb997e390efa4423883dafd100c975c4095d6Mark Andrews * If applicable, add the following below this CDDL HEADER, with the
5f0e2c8913fed44e1629f1367ce54e74ce2a2eb3Michael Graff * fields enclosed by brackets "[]" replaced with your own identifying
c4ef94b1a270ab01d0ca50ecbc1df7fcdf6fc44fMark Andrews * information: Portions Copyright [yyyy] [name of copyright owner]
29747dfe5e073a299b3681e01f5c55540f8bfed7Mark Andrews *
c4ef94b1a270ab01d0ca50ecbc1df7fcdf6fc44fMark Andrews * CDDL HEADER END
994a1996e46f035d6df8dce93ec386e1e154f9d6Andreas Gustafsson */
54a2e7e8a21ee765f41bd995101995613bff9e8cDavid Lawrence
c4ef94b1a270ab01d0ca50ecbc1df7fcdf6fc44fMark Andrews/*
c4ef94b1a270ab01d0ca50ecbc1df7fcdf6fc44fMark Andrews * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
6d208969b3ed736f434bc5120044f8fd2f595f22David Lawrence * Use is subject to license terms.
c4ef94b1a270ab01d0ca50ecbc1df7fcdf6fc44fMark Andrews */
29747dfe5e073a299b3681e01f5c55540f8bfed7Mark Andrews
ab023a65562e62b85a824509d829b6fad87e00b1Rob Austein/*
c4ef94b1a270ab01d0ca50ecbc1df7fcdf6fc44fMark Andrews * Much like calloc, but with functions to report the size of the
c4ef94b1a270ab01d0ca50ecbc1df7fcdf6fc44fMark Andrews * allocation given only the pointer.
c4ef94b1a270ab01d0ca50ecbc1df7fcdf6fc44fMark Andrews */
c4ef94b1a270ab01d0ca50ecbc1df7fcdf6fc44fMark Andrews
c4ef94b1a270ab01d0ca50ecbc1df7fcdf6fc44fMark Andrews#include <assert.h>
c4ef94b1a270ab01d0ca50ecbc1df7fcdf6fc44fMark Andrews#include <string.h>
c4ef94b1a270ab01d0ca50ecbc1df7fcdf6fc44fMark Andrews#include <malloc.h>
6d208969b3ed736f434bc5120044f8fd2f595f22David Lawrence#include "sized_array.h"
6d208969b3ed736f434bc5120044f8fd2f595f22David Lawrence
6d208969b3ed736f434bc5120044f8fd2f595f22David Lawrence/*
6d208969b3ed736f434bc5120044f8fd2f595f22David Lawrence * Assumes that int is at least 32 bits and that nothing needs more than
ab023a65562e62b85a824509d829b6fad87e00b1Rob Austein * 8-byte alignment.
c4ef94b1a270ab01d0ca50ecbc1df7fcdf6fc44fMark Andrews */
c4ef94b1a270ab01d0ca50ecbc1df7fcdf6fc44fMark Andrews
c4ef94b1a270ab01d0ca50ecbc1df7fcdf6fc44fMark Andrews/* COOKIE provides some bad-pointer protection. */
6d208969b3ed736f434bc5120044f8fd2f595f22David Lawrence#define COOKIE "SACOOKIE"
6d208969b3ed736f434bc5120044f8fd2f595f22David Lawrence
ab023a65562e62b85a824509d829b6fad87e00b1Rob Austeinstruct sized_array {
c4ef94b1a270ab01d0ca50ecbc1df7fcdf6fc44fMark Andrews int n;
c4ef94b1a270ab01d0ca50ecbc1df7fcdf6fc44fMark Andrews int sz;
c4ef94b1a270ab01d0ca50ecbc1df7fcdf6fc44fMark Andrews#if defined(COOKIE)
6d208969b3ed736f434bc5120044f8fd2f595f22David Lawrence char cookie[8];
6d208969b3ed736f434bc5120044f8fd2f595f22David Lawrence#endif
ab023a65562e62b85a824509d829b6fad87e00b1Rob Austein};
c4ef94b1a270ab01d0ca50ecbc1df7fcdf6fc44fMark Andrews
c4ef94b1a270ab01d0ca50ecbc1df7fcdf6fc44fMark Andrews
c4ef94b1a270ab01d0ca50ecbc1df7fcdf6fc44fMark Andrewsvoid *
6d208969b3ed736f434bc5120044f8fd2f595f22David Lawrencesized_array(size_t n, size_t sz)
6d208969b3ed736f434bc5120044f8fd2f595f22David Lawrence{
ab023a65562e62b85a824509d829b6fad87e00b1Rob Austein struct sized_array *sa;
c4ef94b1a270ab01d0ca50ecbc1df7fcdf6fc44fMark Andrews size_t total;
c4ef94b1a270ab01d0ca50ecbc1df7fcdf6fc44fMark Andrews
c4ef94b1a270ab01d0ca50ecbc1df7fcdf6fc44fMark Andrews total = sizeof (struct sized_array) + n*sz;
6d208969b3ed736f434bc5120044f8fd2f595f22David Lawrence
6d208969b3ed736f434bc5120044f8fd2f595f22David Lawrence sa = malloc(total);
ab023a65562e62b85a824509d829b6fad87e00b1Rob Austein
c4ef94b1a270ab01d0ca50ecbc1df7fcdf6fc44fMark Andrews if (sa == NULL)
c4ef94b1a270ab01d0ca50ecbc1df7fcdf6fc44fMark Andrews return (NULL);
c4ef94b1a270ab01d0ca50ecbc1df7fcdf6fc44fMark Andrews
6d208969b3ed736f434bc5120044f8fd2f595f22David Lawrence (void) memset(sa, 0, total);
6d208969b3ed736f434bc5120044f8fd2f595f22David Lawrence
ab023a65562e62b85a824509d829b6fad87e00b1Rob Austein sa->n = n;
c4ef94b1a270ab01d0ca50ecbc1df7fcdf6fc44fMark Andrews sa->sz = sz;
c4ef94b1a270ab01d0ca50ecbc1df7fcdf6fc44fMark Andrews
c4ef94b1a270ab01d0ca50ecbc1df7fcdf6fc44fMark Andrews#if defined(COOKIE)
c4ef94b1a270ab01d0ca50ecbc1df7fcdf6fc44fMark Andrews (void) memcpy(sa->cookie, COOKIE, sizeof (sa->cookie));
c4ef94b1a270ab01d0ca50ecbc1df7fcdf6fc44fMark Andrews#endif
994a1996e46f035d6df8dce93ec386e1e154f9d6Andreas Gustafsson
return ((void *)(sa + 1));
}
void
sized_array_free(void *p)
{
struct sized_array *sa;
if (p == NULL)
return;
sa = ((struct sized_array *)p)-1;
#if defined(COOKIE)
assert(memcmp(sa->cookie, COOKIE, sizeof (sa->cookie)) == 0);
#endif
free(sa);
}
size_t
sized_array_n(void *p)
{
struct sized_array *sa;
sa = ((struct sized_array *)p)-1;
#if defined(COOKIE)
assert(memcmp(sa->cookie, COOKIE, sizeof (sa->cookie)) == 0);
#endif
return (sa->n);
}
size_t
sized_array_sz(void *p)
{
struct sized_array *sa;
sa = ((struct sized_array *)p)-1;
#if defined(COOKIE)
assert(memcmp(sa->cookie, COOKIE, sizeof (sa->cookie)) == 0);
#endif
return (sa->sz);
}