3 Ben Kibbey <bjk@luxsci.net>
5 This file is part of libpwmd.
7 Libpwmd is free software: you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation, either version 2 of the License, or
10 (at your option) any later version.
12 Libpwmd is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with libpwmd. If not, see <http://www.gnu.org/licenses/>.
33 _xrealloc_gpgrt (void *p
, size_t n
)
44 return _xrealloc (p
, n
);
49 /* To avoid that a compiler optimizes certain memset calls away, these
50 macros may be used instead. Thanks g10Code. */
51 #define wipememory(_ptr,_set,_len) do { \
52 volatile char *_vptr=(volatile char *)(_ptr); \
53 size_t _vlen=(_len); \
54 while(_vlen) { *_vptr=(_set); _vptr++; _vlen--; } \
72 m
= (struct memchunk_s
*)((void *)ptr
-(offsetof (struct memchunk_s
, data
)));
73 p
= (void *)m
+(offsetof (struct memchunk_s
, data
));
74 wipememory (p
, 0, m
->size
);
79 _xmalloc (size_t size
)
86 m
= malloc (sizeof (struct memchunk_s
)+size
);
91 return (void *)m
+(offsetof (struct memchunk_s
, data
));
95 _xcalloc (size_t nmemb
, size_t size
)
100 m
= malloc (sizeof (struct memchunk_s
)+(nmemb
*size
));
104 m
->size
= nmemb
*size
;
105 p
= (void *)m
+(offsetof (struct memchunk_s
, data
));
106 memset (p
, 0, m
->size
);
111 _xrealloc (void *ptr
, size_t size
)
114 struct memchunk_s
*m
, *mp
;
119 m
= (struct memchunk_s
*)((void *)ptr
-(offsetof (struct memchunk_s
, data
)));
120 p
= (void *)m
+(offsetof (struct memchunk_s
, data
));
121 wipememory (p
, 0, m
->size
);
126 return _xmalloc (size
);
128 m
= malloc (sizeof (struct memchunk_s
)+size
);
133 np
= (void *)m
+(offsetof (struct memchunk_s
, data
));
135 mp
= (struct memchunk_s
*)((void *)ptr
-(offsetof (struct memchunk_s
, data
)));
136 p
= (void *)mp
+(offsetof (struct memchunk_s
, data
));
138 n
= size
> mp
->size
? mp
->size
: size
;
140 wipememory (p
, 0, mp
->size
);
143 return (void *)m
+(offsetof (struct memchunk_s
, data
));