| <!-- |
| Copyright (C) Daniel Stenberg, <daniel@haxx.se>, et al. |
| |
| SPDX-License-Identifier: curl |
| --> |
| |
| # bufref |
| |
| This is an internal module for handling buffer references. A referenced |
| buffer is associated with its destructor function that is implicitly called |
| when the reference is invalidated. Once referenced, a buffer cannot be |
| reallocated. |
| |
| A data length is stored within the reference for binary data handling |
| purposes; it is not used by the bufref API. |
| |
| The `struct bufref` is used to hold data referencing a buffer. The members of |
| that structure **MUST NOT** be accessed or modified without using the dedicated |
| bufref API. |
| |
| ## `init` |
| |
| ```c |
| void Curl_bufref_init(struct bufref *br); |
| ``` |
| |
| Initializes a `bufref` structure. This function **MUST** be called before any |
| other operation is performed on the structure. |
| |
| Upon completion, the referenced buffer is `NULL` and length is zero. |
| |
| This function may also be called to bypass referenced buffer destruction while |
| invalidating the current reference. |
| |
| ## `free` |
| |
| ```c |
| void Curl_bufref_free(struct bufref *br); |
| ``` |
| |
| Destroys the previously referenced buffer using its destructor and |
| reinitializes the structure for a possible subsequent reuse. |
| |
| ## `set` |
| |
| ```c |
| void Curl_bufref_set(struct bufref *br, const void *buffer, size_t length, |
| void (*destructor)(void *)); |
| ``` |
| |
| Releases the previously referenced buffer, then assigns the new `buffer` to |
| the structure, associated with its `destructor` function. The latter can be |
| specified as `NULL`: this is the case when the referenced buffer is static. |
| |
| if `buffer` is NULL, `length` must be zero. |
| |
| ## `memdup0` |
| |
| ```c |
| CURLcode Curl_bufref_memdup0(struct bufref *br, const void *data, |
| size_t length); |
| ``` |
| |
| Releases the previously referenced buffer, then duplicates the `length`-byte |
| `data` into a buffer allocated via `malloc()` and references the latter |
| associated with destructor `curl_free()`. |
| |
| An additional trailing byte is allocated and set to zero as a possible string |
| null-terminator; it is not counted in the stored length. |
| |
| Returns `CURLE_OK` if successful, else `CURLE_OUT_OF_MEMORY`. |
| |
| ## `ptr` |
| |
| ```c |
| const char *Curl_bufref_ptr(const struct bufref *br); |
| ``` |
| |
| Returns a `const char *` to the referenced buffer. |
| |
| ## `uptr` |
| |
| ```c |
| const unsigned char *Curl_bufref_uptr(const struct bufref *br); |
| ``` |
| |
| Returns a `const unsigned char *` to the referenced buffer. |
| |
| ## `len` |
| |
| ```c |
| size_t Curl_bufref_len(const struct bufref *br); |
| ``` |
| |
| Returns the stored length of the referenced buffer. |
| |
| ## `dup` |
| |
| ```c |
| char *Curl_bufref_dup(const struct bufref *br); |
| ``` |
| |
| Returns a strdup() version of the buffer. Note that this assumes that the |
| bufref is null terminated. |