xref: /aosp_15_r20/external/curl/docs/internals/DYNBUF.md (revision 6236dae45794135f37c4eb022389c904c8b0090d)
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