File: buffer.h

package info (click to toggle)
vis 0.7-2
  • links: PTS, VCS
  • area: main
  • in suites: bullseye
  • size: 12,360 kB
  • sloc: ansic: 22,281; sh: 950; makefile: 356; python: 47
file content (83 lines) | stat: -rw-r--r-- 3,024 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
#ifndef BUFFER_H
#define BUFFER_H

#include <stddef.h>
#include <stdbool.h>
#include "text.h"

/**
 * @file
 * A dynamically growing buffer storing arbitrary data.
 * @rst
 * .. note:: Used for Register, *not* Text content.
 * @endrst
 */

/** A dynamically growing buffer storing arbitrary data. */
typedef struct {
	char *data;    /**< Data pointer, ``NULL`` if empty. */
	size_t len;    /**< Current length of data. */
	size_t size;   /**< Maximal capacity of the buffer. */
} Buffer;

/** Initalize a Buffer object. */
void buffer_init(Buffer*);
/** Release all resources, reinitialize buffer. */
void buffer_release(Buffer*);
/** Set buffer length to zero, keep allocated memory. */
void buffer_clear(Buffer*);
/** Reserve space to store at least ``size`` bytes.*/
bool buffer_reserve(Buffer*, size_t size);
/** Reserve space for at least ``len`` *more* bytes. */
bool buffer_grow(Buffer*, size_t len);
/** If buffer is non-empty, make sure it is ``NUL`` terminated. */
bool buffer_terminate(Buffer*);
/** Set buffer content, growing the buffer as needed. */
bool buffer_put(Buffer*, const void *data, size_t len);
/** Set buffer content to ``NUL`` terminated data. */
bool buffer_put0(Buffer*, const char *data);
/** Remove ``len`` bytes starting at ``pos``. */
bool buffer_remove(Buffer*, size_t pos, size_t len);
/** Insert ``len`` bytes of ``data`` at ``pos``. */
bool buffer_insert(Buffer*, size_t pos, const void *data, size_t len);
/** Insert NUL-terminated data at pos. */
bool buffer_insert0(Buffer*, size_t pos, const char *data);
/** Append further content to the end. */
bool buffer_append(Buffer*, const void *data, size_t len);
/** Append NUl-terminated data. */
bool buffer_append0(Buffer*, const char *data);
/** Insert ``len`` bytes of ``data`` at the begin. */
bool buffer_prepend(Buffer*, const void *data, size_t len);
/** Insert NUL-terminated data at the begin. */
bool buffer_prepend0(Buffer*, const char *data);
/** Set formatted buffer content, ensures NUL termination on success. */
bool buffer_printf(Buffer*, const char *fmt, ...) __attribute__((format(printf, 2, 3)));
/** Append formatted buffer content, ensures NUL termination on success. */
bool buffer_appendf(Buffer*, const char *fmt, ...) __attribute__((format(printf, 2, 3)));
/** Return length of a buffer without trailing NUL byte. */
size_t buffer_length0(Buffer*);
/** Return length of a buffer including possible NUL byte. */
size_t buffer_length(Buffer*);
/** Return current maximal capacity in bytes of this buffer. */
size_t buffer_capacity(Buffer*);
/**
 * Get pointer to buffer data.
 * Guaranteed to return a NUL terminated string even if buffer is empty.
 */
const char *buffer_content0(Buffer*);
/**
 * Get pointer to buffer data.
 * @rst
 * .. warning:: Might be NULL, if empty. Might not be NUL terminated.
 * @endrst
 */
const char *buffer_content(Buffer*);
/**
 * Borrow underlying buffer data.
 * @rst
 * .. warning:: The caller is responsible to ``free(3)`` it.
 * @endrst
 */
char *buffer_move(Buffer*);

#endif