1*6236dae4SAndroid Build Coastguard Worker<!-- 2*6236dae4SAndroid Build Coastguard WorkerCopyright (C) Daniel Stenberg, <[email protected]>, et al. 3*6236dae4SAndroid Build Coastguard Worker 4*6236dae4SAndroid Build Coastguard WorkerSPDX-License-Identifier: curl 5*6236dae4SAndroid Build Coastguard Worker--> 6*6236dae4SAndroid Build Coastguard Worker 7*6236dae4SAndroid Build Coastguard Worker# dynbuf 8*6236dae4SAndroid Build Coastguard Worker 9*6236dae4SAndroid Build Coastguard WorkerThis is the internal module for creating and handling "dynamic buffers". This 10*6236dae4SAndroid Build Coastguard Workermeans buffers that can be appended to, dynamically and grow to adapt. 11*6236dae4SAndroid Build Coastguard Worker 12*6236dae4SAndroid Build Coastguard WorkerThere is always a terminating zero put at the end of the dynamic buffer. 13*6236dae4SAndroid Build Coastguard Worker 14*6236dae4SAndroid Build Coastguard WorkerThe `struct dynbuf` is used to hold data for each instance of a dynamic 15*6236dae4SAndroid Build Coastguard Workerbuffer. The members of that struct **MUST NOT** be accessed or modified 16*6236dae4SAndroid Build Coastguard Workerwithout using the dedicated dynbuf API. 17*6236dae4SAndroid Build Coastguard Worker 18*6236dae4SAndroid Build Coastguard Worker## `Curl_dyn_init` 19*6236dae4SAndroid Build Coastguard Worker 20*6236dae4SAndroid Build Coastguard Worker```c 21*6236dae4SAndroid Build Coastguard Workervoid Curl_dyn_init(struct dynbuf *s, size_t toobig); 22*6236dae4SAndroid Build Coastguard Worker``` 23*6236dae4SAndroid Build Coastguard Worker 24*6236dae4SAndroid Build Coastguard WorkerThis initializes a struct to use for dynbuf and it cannot fail. The `toobig` 25*6236dae4SAndroid Build Coastguard Workervalue **must** be set to the maximum size we allow this buffer instance to 26*6236dae4SAndroid Build Coastguard Workergrow to. The functions below return `CURLE_OUT_OF_MEMORY` when hitting this 27*6236dae4SAndroid Build Coastguard Workerlimit. 28*6236dae4SAndroid Build Coastguard Worker 29*6236dae4SAndroid Build Coastguard Worker## `Curl_dyn_free` 30*6236dae4SAndroid Build Coastguard Worker 31*6236dae4SAndroid Build Coastguard Worker```c 32*6236dae4SAndroid Build Coastguard Workervoid Curl_dyn_free(struct dynbuf *s); 33*6236dae4SAndroid Build Coastguard Worker``` 34*6236dae4SAndroid Build Coastguard Worker 35*6236dae4SAndroid Build Coastguard WorkerFree the associated memory and clean up. After a free, the `dynbuf` struct can 36*6236dae4SAndroid Build Coastguard Workerbe reused to start appending new data to. 37*6236dae4SAndroid Build Coastguard Worker 38*6236dae4SAndroid Build Coastguard Worker## `Curl_dyn_addn` 39*6236dae4SAndroid Build Coastguard Worker 40*6236dae4SAndroid Build Coastguard Worker```c 41*6236dae4SAndroid Build Coastguard WorkerCURLcode Curl_dyn_addn(struct dynbuf *s, const void *mem, size_t len); 42*6236dae4SAndroid Build Coastguard Worker``` 43*6236dae4SAndroid Build Coastguard Worker 44*6236dae4SAndroid Build Coastguard WorkerAppend arbitrary data of a given length to the end of the buffer. 45*6236dae4SAndroid Build Coastguard Worker 46*6236dae4SAndroid Build Coastguard WorkerIf this function fails it calls `Curl_dyn_free` on `dynbuf`. 47*6236dae4SAndroid Build Coastguard Worker 48*6236dae4SAndroid Build Coastguard Worker## `Curl_dyn_add` 49*6236dae4SAndroid Build Coastguard Worker 50*6236dae4SAndroid Build Coastguard Worker```c 51*6236dae4SAndroid Build Coastguard WorkerCURLcode Curl_dyn_add(struct dynbuf *s, const char *str); 52*6236dae4SAndroid Build Coastguard Worker``` 53*6236dae4SAndroid Build Coastguard Worker 54*6236dae4SAndroid Build Coastguard WorkerAppend a C string to the end of the buffer. 55*6236dae4SAndroid Build Coastguard Worker 56*6236dae4SAndroid Build Coastguard WorkerIf this function fails it calls `Curl_dyn_free` on `dynbuf`. 57*6236dae4SAndroid Build Coastguard Worker 58*6236dae4SAndroid Build Coastguard Worker## `Curl_dyn_addf` 59*6236dae4SAndroid Build Coastguard Worker 60*6236dae4SAndroid Build Coastguard Worker```c 61*6236dae4SAndroid Build Coastguard WorkerCURLcode Curl_dyn_addf(struct dynbuf *s, const char *fmt, ...); 62*6236dae4SAndroid Build Coastguard Worker``` 63*6236dae4SAndroid Build Coastguard Worker 64*6236dae4SAndroid Build Coastguard WorkerAppend a `printf()`-style string to the end of the buffer. 65*6236dae4SAndroid Build Coastguard Worker 66*6236dae4SAndroid Build Coastguard WorkerIf this function fails it calls `Curl_dyn_free` on `dynbuf`. 67*6236dae4SAndroid Build Coastguard Worker 68*6236dae4SAndroid Build Coastguard Worker## `Curl_dyn_vaddf` 69*6236dae4SAndroid Build Coastguard Worker 70*6236dae4SAndroid Build Coastguard Worker```c 71*6236dae4SAndroid Build Coastguard WorkerCURLcode Curl_dyn_vaddf(struct dynbuf *s, const char *fmt, va_list ap); 72*6236dae4SAndroid Build Coastguard Worker``` 73*6236dae4SAndroid Build Coastguard Worker 74*6236dae4SAndroid Build Coastguard WorkerAppend a `vprintf()`-style string to the end of the buffer. 75*6236dae4SAndroid Build Coastguard Worker 76*6236dae4SAndroid Build Coastguard WorkerIf this function fails it calls `Curl_dyn_free` on `dynbuf`. 77*6236dae4SAndroid Build Coastguard Worker 78*6236dae4SAndroid Build Coastguard Worker## `Curl_dyn_reset` 79*6236dae4SAndroid Build Coastguard Worker 80*6236dae4SAndroid Build Coastguard Worker```c 81*6236dae4SAndroid Build Coastguard Workervoid Curl_dyn_reset(struct dynbuf *s); 82*6236dae4SAndroid Build Coastguard Worker``` 83*6236dae4SAndroid Build Coastguard Worker 84*6236dae4SAndroid Build Coastguard WorkerReset the buffer length, but leave the allocation. 85*6236dae4SAndroid Build Coastguard Worker 86*6236dae4SAndroid Build Coastguard Worker## `Curl_dyn_tail` 87*6236dae4SAndroid Build Coastguard Worker 88*6236dae4SAndroid Build Coastguard Worker```c 89*6236dae4SAndroid Build Coastguard WorkerCURLcode Curl_dyn_tail(struct dynbuf *s, size_t length); 90*6236dae4SAndroid Build Coastguard Worker``` 91*6236dae4SAndroid Build Coastguard Worker 92*6236dae4SAndroid Build Coastguard WorkerKeep `length` bytes of the buffer tail (the last `length` bytes of the 93*6236dae4SAndroid Build Coastguard Workerbuffer). The rest of the buffer is dropped. The specified `length` must not be 94*6236dae4SAndroid Build Coastguard Workerlarger than the buffer length. To instead keep the leading part, see 95*6236dae4SAndroid Build Coastguard Worker`Curl_dyn_setlen()`. 96*6236dae4SAndroid Build Coastguard Worker 97*6236dae4SAndroid Build Coastguard Worker## `Curl_dyn_ptr` 98*6236dae4SAndroid Build Coastguard Worker 99*6236dae4SAndroid Build Coastguard Worker```c 100*6236dae4SAndroid Build Coastguard Workerchar *Curl_dyn_ptr(const struct dynbuf *s); 101*6236dae4SAndroid Build Coastguard Worker``` 102*6236dae4SAndroid Build Coastguard Worker 103*6236dae4SAndroid Build Coastguard WorkerReturns a `char *` to the buffer if it has a length, otherwise may return 104*6236dae4SAndroid Build Coastguard WorkerNULL. Since the buffer may be reallocated, this pointer should not be trusted 105*6236dae4SAndroid Build Coastguard Workeror used anymore after the next buffer manipulation call. 106*6236dae4SAndroid Build Coastguard Worker 107*6236dae4SAndroid Build Coastguard Worker## `Curl_dyn_uptr` 108*6236dae4SAndroid Build Coastguard Worker 109*6236dae4SAndroid Build Coastguard Worker```c 110*6236dae4SAndroid Build Coastguard Workerunsigned char *Curl_dyn_uptr(const struct dynbuf *s); 111*6236dae4SAndroid Build Coastguard Worker``` 112*6236dae4SAndroid Build Coastguard Worker 113*6236dae4SAndroid Build Coastguard WorkerReturns an `unsigned char *` to the buffer if it has a length, otherwise may 114*6236dae4SAndroid Build Coastguard Workerreturn NULL. Since the buffer may be reallocated, this pointer should not be 115*6236dae4SAndroid Build Coastguard Workertrusted or used anymore after the next buffer manipulation call. 116*6236dae4SAndroid Build Coastguard Worker 117*6236dae4SAndroid Build Coastguard Worker## `Curl_dyn_len` 118*6236dae4SAndroid Build Coastguard Worker 119*6236dae4SAndroid Build Coastguard Worker```c 120*6236dae4SAndroid Build Coastguard Workersize_t Curl_dyn_len(const struct dynbuf *s); 121*6236dae4SAndroid Build Coastguard Worker``` 122*6236dae4SAndroid Build Coastguard Worker 123*6236dae4SAndroid Build Coastguard WorkerReturns the length of the buffer in bytes. Does not include the terminating 124*6236dae4SAndroid Build Coastguard Workerzero byte. 125*6236dae4SAndroid Build Coastguard Worker 126*6236dae4SAndroid Build Coastguard Worker## `Curl_dyn_setlen` 127*6236dae4SAndroid Build Coastguard Worker 128*6236dae4SAndroid Build Coastguard Worker```c 129*6236dae4SAndroid Build Coastguard WorkerCURLcode Curl_dyn_setlen(struct dynbuf *s, size_t len); 130*6236dae4SAndroid Build Coastguard Worker``` 131*6236dae4SAndroid Build Coastguard Worker 132*6236dae4SAndroid Build Coastguard WorkerSets the new shorter length of the buffer in number of bytes. Keeps the 133*6236dae4SAndroid Build Coastguard Workerleftmost set number of bytes, discards the rest. To instead keep the tail part 134*6236dae4SAndroid Build Coastguard Workerof the buffer, see `Curl_dyn_tail()`. 135