handle memory exhaustion, it's better to return an error code to
them than to call abort.
(obtain): If we cannot allocate more memory, don't call
abort. Instead, return non-zero iff the allocation is successful.
(get_more_space): If obtain fails, return zero.
(get_bloc): Return zero if we can't allocate the new bloc.
(r_alloc_sbrk): Return zero if we can't allocate more memory.
(r_alloc): If we can't allocate more memory, set *PTR to zero and
return zero.
(r_re_alloc): If we can't allocate more memory, leave *PTR
unchanged, and return zero.
* ralloc.c (warnfunction): Renamed to warn_function; users changed.
end of the heap, copying the data to it, and then freeing the
original bloc, just expand the original block. This saves a copy
and a call to sbrk, and also removes the large spike in memory
allocation that would occur when resizing large buffers. And it's
less code.