5
__w64crt_aligned_offset_realloc (void *ptr, size_t sz, size_t align, size_t off)
8
size_t pad_old, pad_new, sz_old;
11
return __w64crt_aligned_offset_malloc (sz, align, off);
13
if ((align & (align - 1)) != 0 || off >= sz)
15
__w64crt_set_errno(EINVAL);
21
__w64crt_aligned_free (ptr);
25
if (align < sizeof (void *))
26
align = sizeof (void *);
28
savep = (void **) SAVED_PTR (ptr);
29
if (ptr != ALIGN_PTR(*savep, align, off))
31
__w64crt_set_errno (EINVAL);
35
pad_old = (char *) ptr - (char *) *savep;
36
sz_old = _msize (*savep);
37
if (sz_old == SZ_MINUSONE || sz_old < pad_old)
39
__w64crt_set_errno (EINVAL);
45
tmp = __w64crt_realloc (*savep, sz + align + sizeof (void *));
50
ptr = ALIGN_PTR (tmp, align, off);
51
savep = (void **) SAVED_PTR (ptr);
52
pad_new = (char *) ptr - (char *) tmp;
54
if (pad_new != pad_old)
55
memmove ((char *) ptr, (char *) tmp + pad_old, (sz_old < sz ? sz_old : sz));