+ buffer[link_length++] = '\0';
+
+ /* Return it in a chunk of memory as small as possible. */
+ if (buffer == initial_buf)
+ {
+ buffer = (char *) xmalloc (link_length);
+#ifdef NO_XMALLOC
+ if (buffer == NULL)
+ return NULL;
+#endif
+ memcpy (buffer, initial_buf, link_length);
+ }
+ else
+ {
+ /* Shrink buffer before returning it. */
+ if ((size_t) link_length < buf_size)
+ {
+ char *smaller_buffer = (char *) realloc (buffer, link_length);
+
+ if (smaller_buffer != NULL)
+ buffer = smaller_buffer;
+ }
+ }