Commit | Line | Data |
---|---|---|
530e741c JH |
1 | strbuf API |
2 | ========== | |
3 | ||
dd613e6b MV |
4 | strbuf's are meant to be used with all the usual C string and memory |
5 | APIs. Given that the length of the buffer is known, it's often better to | |
6 | use the mem* functions than a str* one (memchr vs. strchr e.g.). | |
7 | Though, one has to be careful about the fact that str* functions often | |
8 | stop on NULs and that strbufs may have embedded NULs. | |
530e741c | 9 | |
dd613e6b MV |
10 | An strbuf is NUL terminated for convenience, but no function in the |
11 | strbuf API actually relies on the string being free of NULs. | |
12 | ||
13 | strbufs has some invariants that are very important to keep in mind: | |
14 | ||
63b76948 | 15 | . The `buf` member is never NULL, so it can be used in any usual C |
dd613e6b MV |
16 | string operations safely. strbuf's _have_ to be initialized either by |
17 | `strbuf_init()` or by `= STRBUF_INIT` before the invariants, though. | |
18 | + | |
19 | Do *not* assume anything on what `buf` really is (e.g. if it is | |
20 | allocated memory or not), use `strbuf_detach()` to unwrap a memory | |
21 | buffer from its strbuf shell in a safe way. That is the sole supported | |
22 | way. This will give you a malloced buffer that you can later `free()`. | |
23 | + | |
c9a8abcf | 24 | However, it is totally safe to modify anything in the string pointed by |
dd613e6b MV |
25 | the `buf` member, between the indices `0` and `len-1` (inclusive). |
26 | ||
27 | . The `buf` member is a byte array that has at least `len + 1` bytes | |
28 | allocated. The extra byte is used to store a `'\0'`, allowing the | |
29 | `buf` member to be a valid C-string. Every strbuf function ensure this | |
30 | invariant is preserved. | |
31 | + | |
32 | NOTE: It is OK to "play" with the buffer directly if you work it this | |
33 | way: | |
34 | + | |
35 | ---- | |
36 | strbuf_grow(sb, SOME_SIZE); <1> | |
37 | strbuf_setlen(sb, sb->len + SOME_OTHER_SIZE); | |
38 | ---- | |
39 | <1> Here, the memory array starting at `sb->buf`, and of length | |
40 | `strbuf_avail(sb)` is all yours, and you can be sure that | |
41 | `strbuf_avail(sb)` is at least `SOME_SIZE`. | |
42 | + | |
43 | NOTE: `SOME_OTHER_SIZE` must be smaller or equal to `strbuf_avail(sb)`. | |
44 | + | |
45 | Doing so is safe, though if it has to be done in many places, adding the | |
46 | missing API to the strbuf module is the way to go. | |
47 | + | |
48 | WARNING: Do _not_ assume that the area that is yours is of size `alloc | |
49 | - 1` even if it's true in the current implementation. Alloc is somehow a | |
50 | "private" member that should not be messed with. Use `strbuf_avail()` | |
51 | instead. | |
52 | ||
53 | Data structures | |
54 | --------------- | |
55 | ||
56 | * `struct strbuf` | |
57 | ||
63b76948 | 58 | This is the string buffer structure. The `len` member can be used to |
dd613e6b MV |
59 | determine the current length of the string, and `buf` member provides access to |
60 | the string itself. | |
61 | ||
62 | Functions | |
63 | --------- | |
64 | ||
65 | * Life cycle | |
66 | ||
67 | `strbuf_init`:: | |
68 | ||
69 | Initialize the structure. The second parameter can be zero or a bigger | |
70 | number to allocate memory, in case you want to prevent further reallocs. | |
71 | ||
72 | `strbuf_release`:: | |
73 | ||
74 | Release a string buffer and the memory it used. You should not use the | |
75 | string buffer after using this function, unless you initialize it again. | |
76 | ||
77 | `strbuf_detach`:: | |
78 | ||
79 | Detach the string from the strbuf and returns it; you now own the | |
80 | storage the string occupies and it is your responsibility from then on | |
81 | to release it with `free(3)` when you are done with it. | |
82 | ||
83 | `strbuf_attach`:: | |
84 | ||
85 | Attach a string to a buffer. You should specify the string to attach, | |
86 | the current length of the string and the amount of allocated memory. | |
87 | The amount must be larger than the string length, because the string you | |
88 | pass is supposed to be a NUL-terminated string. This string _must_ be | |
89 | malloc()ed, and after attaching, the pointer cannot be relied upon | |
90 | anymore, and neither be free()d directly. | |
91 | ||
92 | `strbuf_swap`:: | |
93 | ||
94 | Swap the contents of two string buffers. | |
95 | ||
96 | * Related to the size of the buffer | |
97 | ||
98 | `strbuf_avail`:: | |
99 | ||
100 | Determine the amount of allocated but unused memory. | |
101 | ||
102 | `strbuf_grow`:: | |
103 | ||
104 | Ensure that at least this amount of unused memory is available after | |
105 | `len`. This is used when you know a typical size for what you will add | |
106 | and want to avoid repetitive automatic resizing of the underlying buffer. | |
107 | This is never a needed operation, but can be critical for performance in | |
108 | some cases. | |
109 | ||
110 | `strbuf_setlen`:: | |
111 | ||
112 | Set the length of the buffer to a given value. This function does *not* | |
113 | allocate new memory, so you should not perform a `strbuf_setlen()` to a | |
114 | length that is larger than `len + strbuf_avail()`. `strbuf_setlen()` is | |
115 | just meant as a 'please fix invariants from this strbuf I just messed | |
116 | with'. | |
117 | ||
118 | `strbuf_reset`:: | |
119 | ||
120 | Empty the buffer by setting the size of it to zero. | |
121 | ||
122 | * Related to the contents of the buffer | |
123 | ||
124 | `strbuf_rtrim`:: | |
125 | ||
126 | Strip whitespace from the end of a string. | |
127 | ||
128 | `strbuf_cmp`:: | |
129 | ||
130 | Compare two buffers. Returns an integer less than, equal to, or greater | |
131 | than zero if the first buffer is found, respectively, to be less than, | |
132 | to match, or be greater than the second buffer. | |
133 | ||
134 | * Adding data to the buffer | |
135 | ||
2fc64700 RS |
136 | NOTE: All of the functions in this section will grow the buffer as necessary. |
137 | If they fail for some reason other than memory shortage and the buffer hadn't | |
138 | been allocated before (i.e. the `struct strbuf` was set to `STRBUF_INIT`), | |
139 | then they will free() it. | |
dd613e6b MV |
140 | |
141 | `strbuf_addch`:: | |
142 | ||
143 | Add a single character to the buffer. | |
144 | ||
145 | `strbuf_insert`:: | |
146 | ||
147 | Insert data to the given position of the buffer. The remaining contents | |
148 | will be shifted, not overwritten. | |
149 | ||
150 | `strbuf_remove`:: | |
151 | ||
152 | Remove given amount of data from a given position of the buffer. | |
153 | ||
154 | `strbuf_splice`:: | |
155 | ||
156 | Remove the bytes between `pos..pos+len` and replace it with the given | |
157 | data. | |
158 | ||
eff80a9f JH |
159 | `strbuf_add_commented_lines`:: |
160 | ||
161 | Add a NUL-terminated string to the buffer. Each line will be prepended | |
162 | by a comment character and a blank. | |
163 | ||
dd613e6b MV |
164 | `strbuf_add`:: |
165 | ||
166 | Add data of given length to the buffer. | |
167 | ||
168 | `strbuf_addstr`:: | |
169 | ||
170 | Add a NUL-terminated string to the buffer. | |
171 | + | |
172 | NOTE: This function will *always* be implemented as an inline or a macro | |
173 | that expands to: | |
174 | + | |
175 | ---- | |
176 | strbuf_add(..., s, strlen(s)); | |
177 | ---- | |
178 | + | |
179 | Meaning that this is efficient to write things like: | |
180 | + | |
181 | ---- | |
182 | strbuf_addstr(sb, "immediate string"); | |
183 | ---- | |
184 | ||
185 | `strbuf_addbuf`:: | |
186 | ||
187 | Copy the contents of an other buffer at the end of the current one. | |
188 | ||
189 | `strbuf_adddup`:: | |
190 | ||
191 | Copy part of the buffer from a given position till a given length to the | |
192 | end of the buffer. | |
193 | ||
194 | `strbuf_expand`:: | |
195 | ||
196 | This function can be used to expand a format string containing | |
197 | placeholders. To that end, it parses the string and calls the specified | |
198 | function for every percent sign found. | |
199 | + | |
200 | The callback function is given a pointer to the character after the `%` | |
201 | and a pointer to the struct strbuf. It is expected to add the expanded | |
202 | version of the placeholder to the strbuf, e.g. to add a newline | |
203 | character if the letter `n` appears after a `%`. The function returns | |
204 | the length of the placeholder recognized and `strbuf_expand()` skips | |
205 | over it. | |
206 | + | |
0a0416a3 JK |
207 | The format `%%` is automatically expanded to a single `%` as a quoting |
208 | mechanism; callers do not need to handle the `%` placeholder themselves, | |
209 | and the callback function will not be invoked for this placeholder. | |
210 | + | |
dd613e6b MV |
211 | All other characters (non-percent and not skipped ones) are copied |
212 | verbatim to the strbuf. If the callback returned zero, meaning that the | |
213 | placeholder is unknown, then the percent sign is copied, too. | |
214 | + | |
215 | In order to facilitate caching and to make it possible to give | |
216 | parameters to the callback, `strbuf_expand()` passes a context pointer, | |
217 | which can be used by the programmer of the callback as she sees fit. | |
218 | ||
9b864e73 RS |
219 | `strbuf_expand_dict_cb`:: |
220 | ||
221 | Used as callback for `strbuf_expand()`, expects an array of | |
222 | struct strbuf_expand_dict_entry as context, i.e. pairs of | |
223 | placeholder and replacement string. The array needs to be | |
224 | terminated by an entry with placeholder set to NULL. | |
225 | ||
361df5df JK |
226 | `strbuf_addbuf_percentquote`:: |
227 | ||
228 | Append the contents of one strbuf to another, quoting any | |
229 | percent signs ("%") into double-percents ("%%") in the | |
230 | destination. This is useful for literal data to be fed to either | |
231 | strbuf_expand or to the *printf family of functions. | |
232 | ||
dd613e6b MV |
233 | `strbuf_addf`:: |
234 | ||
235 | Add a formatted string to the buffer. | |
236 | ||
eff80a9f JH |
237 | `strbuf_commented_addf`:: |
238 | ||
239 | Add a formatted string prepended by a comment character and a | |
240 | blank to the buffer. | |
241 | ||
dd613e6b MV |
242 | `strbuf_fread`:: |
243 | ||
244 | Read a given size of data from a FILE* pointer to the buffer. | |
245 | + | |
a1070d4c | 246 | NOTE: The buffer is rewound if the read fails. If -1 is returned, |
dd613e6b MV |
247 | `errno` must be consulted, like you would do for `read(3)`. |
248 | `strbuf_read()`, `strbuf_read_file()` and `strbuf_getline()` has the | |
249 | same behaviour as well. | |
250 | ||
251 | `strbuf_read`:: | |
252 | ||
253 | Read the contents of a given file descriptor. The third argument can be | |
254 | used to give a hint about the file size, to avoid reallocs. | |
255 | ||
256 | `strbuf_read_file`:: | |
257 | ||
258 | Read the contents of a file, specified by its path. The third argument | |
259 | can be used to give a hint about the file size, to avoid reallocs. | |
260 | ||
2fc64700 RS |
261 | `strbuf_readlink`:: |
262 | ||
263 | Read the target of a symbolic link, specified by its path. The third | |
264 | argument can be used to give a hint about the size, to avoid reallocs. | |
265 | ||
dd613e6b MV |
266 | `strbuf_getline`:: |
267 | ||
1c5f93b9 TR |
268 | Read a line from a FILE *, overwriting the existing contents |
269 | of the strbuf. The second argument specifies the line | |
dd613e6b | 270 | terminator character, typically `'\n'`. |
1c5f93b9 TR |
271 | Reading stops after the terminator or at EOF. The terminator |
272 | is removed from the buffer before returning. Returns 0 unless | |
273 | there was nothing left before EOF, in which case it returns `EOF`. | |
274 | ||
275 | `strbuf_getwholeline`:: | |
276 | ||
277 | Like `strbuf_getline`, but keeps the trailing terminator (if | |
278 | any) in the buffer. | |
279 | ||
280 | `strbuf_getwholeline_fd`:: | |
281 | ||
282 | Like `strbuf_getwholeline`, but operates on a file descriptor. | |
283 | It reads one character at a time, so it is very slow. Do not | |
284 | use it unless you need the correct position in the file | |
285 | descriptor. | |
dd613e6b MV |
286 | |
287 | `stripspace`:: | |
288 | ||
289 | Strip whitespace from a buffer. The second parameter controls if | |
290 | comments are considered contents to be removed or not. | |
291 | ||
06379a65 MH |
292 | `strbuf_split_buf`:: |
293 | `strbuf_split_str`:: | |
294 | `strbuf_split_max`:: | |
295 | `strbuf_split`:: | |
296 | ||
297 | Split a string or strbuf into a list of strbufs at a specified | |
298 | terminator character. The returned substrings include the | |
299 | terminator characters. Some of these functions take a `max` | |
300 | parameter, which, if positive, limits the output to that | |
301 | number of substrings. | |
302 | ||
303 | `strbuf_list_free`:: | |
304 | ||
305 | Free a list of strbufs (for example, the return values of the | |
306 | `strbuf_split()` functions). | |
307 | ||
dd613e6b | 308 | `launch_editor`:: |
63b76948 SB |
309 | |
310 | Launch the user preferred editor to edit a file and fill the buffer | |
311 | with the file's contents upon the user completing their editing. The | |
312 | third argument can be used to set the environment which the editor is | |
313 | run in. If the buffer is NULL the editor is launched as usual but the | |
314 | file's contents are not read into the buffer upon completion. |