1*10122SJordan.Brown@Sun.COM /*
2*10122SJordan.Brown@Sun.COM * CDDL HEADER START
3*10122SJordan.Brown@Sun.COM *
4*10122SJordan.Brown@Sun.COM * The contents of this file are subject to the terms of the
5*10122SJordan.Brown@Sun.COM * Common Development and Distribution License (the "License").
6*10122SJordan.Brown@Sun.COM * You may not use this file except in compliance with the License.
7*10122SJordan.Brown@Sun.COM *
8*10122SJordan.Brown@Sun.COM * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9*10122SJordan.Brown@Sun.COM * or http://www.opensolaris.org/os/licensing.
10*10122SJordan.Brown@Sun.COM * See the License for the specific language governing permissions
11*10122SJordan.Brown@Sun.COM * and limitations under the License.
12*10122SJordan.Brown@Sun.COM *
13*10122SJordan.Brown@Sun.COM * When distributing Covered Code, include this CDDL HEADER in each
14*10122SJordan.Brown@Sun.COM * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15*10122SJordan.Brown@Sun.COM * If applicable, add the following below this CDDL HEADER, with the
16*10122SJordan.Brown@Sun.COM * fields enclosed by brackets "[]" replaced with your own identifying
17*10122SJordan.Brown@Sun.COM * information: Portions Copyright [yyyy] [name of copyright owner]
18*10122SJordan.Brown@Sun.COM *
19*10122SJordan.Brown@Sun.COM * CDDL HEADER END
20*10122SJordan.Brown@Sun.COM */
21*10122SJordan.Brown@Sun.COM
22*10122SJordan.Brown@Sun.COM /*
23*10122SJordan.Brown@Sun.COM * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
24*10122SJordan.Brown@Sun.COM * Use is subject to license terms.
25*10122SJordan.Brown@Sun.COM */
26*10122SJordan.Brown@Sun.COM
27*10122SJordan.Brown@Sun.COM /*
28*10122SJordan.Brown@Sun.COM * Much like calloc, but with functions to report the size of the
29*10122SJordan.Brown@Sun.COM * allocation given only the pointer.
30*10122SJordan.Brown@Sun.COM */
31*10122SJordan.Brown@Sun.COM
32*10122SJordan.Brown@Sun.COM #include <assert.h>
33*10122SJordan.Brown@Sun.COM #include <string.h>
34*10122SJordan.Brown@Sun.COM #include <malloc.h>
35*10122SJordan.Brown@Sun.COM #include "sized_array.h"
36*10122SJordan.Brown@Sun.COM
37*10122SJordan.Brown@Sun.COM /*
38*10122SJordan.Brown@Sun.COM * Assumes that int is at least 32 bits and that nothing needs more than
39*10122SJordan.Brown@Sun.COM * 8-byte alignment.
40*10122SJordan.Brown@Sun.COM */
41*10122SJordan.Brown@Sun.COM
42*10122SJordan.Brown@Sun.COM /* COOKIE provides some bad-pointer protection. */
43*10122SJordan.Brown@Sun.COM #define COOKIE "SACOOKIE"
44*10122SJordan.Brown@Sun.COM
45*10122SJordan.Brown@Sun.COM struct sized_array {
46*10122SJordan.Brown@Sun.COM int n;
47*10122SJordan.Brown@Sun.COM int sz;
48*10122SJordan.Brown@Sun.COM #if defined(COOKIE)
49*10122SJordan.Brown@Sun.COM char cookie[8];
50*10122SJordan.Brown@Sun.COM #endif
51*10122SJordan.Brown@Sun.COM };
52*10122SJordan.Brown@Sun.COM
53*10122SJordan.Brown@Sun.COM
54*10122SJordan.Brown@Sun.COM void *
sized_array(size_t n,size_t sz)55*10122SJordan.Brown@Sun.COM sized_array(size_t n, size_t sz)
56*10122SJordan.Brown@Sun.COM {
57*10122SJordan.Brown@Sun.COM struct sized_array *sa;
58*10122SJordan.Brown@Sun.COM size_t total;
59*10122SJordan.Brown@Sun.COM
60*10122SJordan.Brown@Sun.COM total = sizeof (struct sized_array) + n*sz;
61*10122SJordan.Brown@Sun.COM
62*10122SJordan.Brown@Sun.COM sa = malloc(total);
63*10122SJordan.Brown@Sun.COM
64*10122SJordan.Brown@Sun.COM if (sa == NULL)
65*10122SJordan.Brown@Sun.COM return (NULL);
66*10122SJordan.Brown@Sun.COM
67*10122SJordan.Brown@Sun.COM (void) memset(sa, 0, total);
68*10122SJordan.Brown@Sun.COM
69*10122SJordan.Brown@Sun.COM sa->n = n;
70*10122SJordan.Brown@Sun.COM sa->sz = sz;
71*10122SJordan.Brown@Sun.COM
72*10122SJordan.Brown@Sun.COM #if defined(COOKIE)
73*10122SJordan.Brown@Sun.COM (void) memcpy(sa->cookie, COOKIE, sizeof (sa->cookie));
74*10122SJordan.Brown@Sun.COM #endif
75*10122SJordan.Brown@Sun.COM
76*10122SJordan.Brown@Sun.COM return ((void *)(sa + 1));
77*10122SJordan.Brown@Sun.COM }
78*10122SJordan.Brown@Sun.COM
79*10122SJordan.Brown@Sun.COM void
sized_array_free(void * p)80*10122SJordan.Brown@Sun.COM sized_array_free(void *p)
81*10122SJordan.Brown@Sun.COM {
82*10122SJordan.Brown@Sun.COM struct sized_array *sa;
83*10122SJordan.Brown@Sun.COM
84*10122SJordan.Brown@Sun.COM if (p == NULL)
85*10122SJordan.Brown@Sun.COM return;
86*10122SJordan.Brown@Sun.COM
87*10122SJordan.Brown@Sun.COM sa = ((struct sized_array *)p)-1;
88*10122SJordan.Brown@Sun.COM
89*10122SJordan.Brown@Sun.COM #if defined(COOKIE)
90*10122SJordan.Brown@Sun.COM assert(memcmp(sa->cookie, COOKIE, sizeof (sa->cookie)) == 0);
91*10122SJordan.Brown@Sun.COM #endif
92*10122SJordan.Brown@Sun.COM
93*10122SJordan.Brown@Sun.COM free(sa);
94*10122SJordan.Brown@Sun.COM }
95*10122SJordan.Brown@Sun.COM
96*10122SJordan.Brown@Sun.COM size_t
sized_array_n(void * p)97*10122SJordan.Brown@Sun.COM sized_array_n(void *p)
98*10122SJordan.Brown@Sun.COM {
99*10122SJordan.Brown@Sun.COM struct sized_array *sa;
100*10122SJordan.Brown@Sun.COM
101*10122SJordan.Brown@Sun.COM sa = ((struct sized_array *)p)-1;
102*10122SJordan.Brown@Sun.COM
103*10122SJordan.Brown@Sun.COM #if defined(COOKIE)
104*10122SJordan.Brown@Sun.COM assert(memcmp(sa->cookie, COOKIE, sizeof (sa->cookie)) == 0);
105*10122SJordan.Brown@Sun.COM #endif
106*10122SJordan.Brown@Sun.COM
107*10122SJordan.Brown@Sun.COM return (sa->n);
108*10122SJordan.Brown@Sun.COM }
109*10122SJordan.Brown@Sun.COM
110*10122SJordan.Brown@Sun.COM size_t
sized_array_sz(void * p)111*10122SJordan.Brown@Sun.COM sized_array_sz(void *p)
112*10122SJordan.Brown@Sun.COM {
113*10122SJordan.Brown@Sun.COM struct sized_array *sa;
114*10122SJordan.Brown@Sun.COM
115*10122SJordan.Brown@Sun.COM sa = ((struct sized_array *)p)-1;
116*10122SJordan.Brown@Sun.COM
117*10122SJordan.Brown@Sun.COM #if defined(COOKIE)
118*10122SJordan.Brown@Sun.COM assert(memcmp(sa->cookie, COOKIE, sizeof (sa->cookie)) == 0);
119*10122SJordan.Brown@Sun.COM #endif
120*10122SJordan.Brown@Sun.COM
121*10122SJordan.Brown@Sun.COM return (sa->sz);
122*10122SJordan.Brown@Sun.COM }
123