annotate include/jeffpc/buffer.h @ 809:1d716f721c5c

buffer: remove obsolete comment Signed-off-by: Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
author Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
date Sat, 18 Apr 2020 21:50:06 -0400
parents 6371fb111e27
children 013adc5c54dd
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
250
0e4e45813eb9 buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
1 /*
797
4c0939533a78 buffer: allow buffer_free calls on stack allocated buffer structures
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 713
diff changeset
2 * Copyright (c) 2017-2020 Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
250
0e4e45813eb9 buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
3 *
0e4e45813eb9 buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
4 * Permission is hereby granted, free of charge, to any person obtaining a copy
0e4e45813eb9 buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
5 * of this software and associated documentation files (the "Software"), to deal
0e4e45813eb9 buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
6 * in the Software without restriction, including without limitation the rights
0e4e45813eb9 buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
7 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
0e4e45813eb9 buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
8 * copies of the Software, and to permit persons to whom the Software is
0e4e45813eb9 buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
9 * furnished to do so, subject to the following conditions:
0e4e45813eb9 buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
10 *
0e4e45813eb9 buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
11 * The above copyright notice and this permission notice shall be included in
0e4e45813eb9 buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
12 * all copies or substantial portions of the Software.
0e4e45813eb9 buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
13 *
0e4e45813eb9 buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
0e4e45813eb9 buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
0e4e45813eb9 buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
0e4e45813eb9 buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
17 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
0e4e45813eb9 buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
18 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
0e4e45813eb9 buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
19 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
0e4e45813eb9 buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
20 * SOFTWARE.
0e4e45813eb9 buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
21 */
0e4e45813eb9 buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
22
0e4e45813eb9 buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
23 #ifndef __JEFFPC_BUFFER_H
0e4e45813eb9 buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
24 #define __JEFFPC_BUFFER_H
0e4e45813eb9 buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
25
442
0d09c7592828 buffer: introduce a stdio buffer type
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 441
diff changeset
26 #include <stdio.h>
250
0e4e45813eb9 buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
27 #include <stdlib.h>
251
5f9eebf77662 buffer: add a sinkhole buffer type
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 250
diff changeset
28 #include <stdbool.h>
260
8e6dcacf8620 buffer: implement the concept of seeking in a buffer
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 256
diff changeset
29 #include <fcntl.h>
250
0e4e45813eb9 buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
30
0e4e45813eb9 buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
31 #include <jeffpc/error.h>
359
7544e9990bc1 str: implement struct str in terms of struct val
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 346
diff changeset
32 #include <jeffpc/val.h>
250
0e4e45813eb9 buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
33
256
f82b45b662c9 buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 254
diff changeset
34 struct buffer;
f82b45b662c9 buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 254
diff changeset
35
f82b45b662c9 buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 254
diff changeset
36 struct buffer_ops {
f82b45b662c9 buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 254
diff changeset
37 /* op checking */
f82b45b662c9 buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 254
diff changeset
38 int (*check_append)(struct buffer *, const void *, size_t);
611
0fa2f6606c5e buffer: read and write
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 563
diff changeset
39 int (*check_read)(struct buffer *, void *, size_t, size_t);
261
6795f8427fed buffer: allow buffer truncation
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 260
diff changeset
40 int (*check_truncate)(struct buffer *, size_t);
611
0fa2f6606c5e buffer: read and write
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 563
diff changeset
41 int (*check_write)(struct buffer *, const void *, size_t, size_t);
440
df90b1b883d8 buffer: allow implementations to refuse seeks
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 359
diff changeset
42 ssize_t (*check_seek)(struct buffer *, off_t, int, size_t);
256
f82b45b662c9 buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 254
diff changeset
43
f82b45b662c9 buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 254
diff changeset
44 /* data manipulation */
f82b45b662c9 buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 254
diff changeset
45 void *(*realloc)(void *, size_t);
f82b45b662c9 buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 254
diff changeset
46 void (*free)(void *);
261
6795f8427fed buffer: allow buffer truncation
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 260
diff changeset
47 void (*clear)(struct buffer *, size_t, size_t);
256
f82b45b662c9 buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 254
diff changeset
48 void (*copyin)(struct buffer *, size_t, const void *, size_t);
611
0fa2f6606c5e buffer: read and write
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 563
diff changeset
49 void (*copyout)(struct buffer *, size_t, void *, size_t);
256
f82b45b662c9 buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 254
diff changeset
50 };
f82b45b662c9 buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 254
diff changeset
51
250
0e4e45813eb9 buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
52 struct buffer {
0e4e45813eb9 buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
53 void *data; /* the data itself */
260
8e6dcacf8620 buffer: implement the concept of seeking in a buffer
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 256
diff changeset
54 size_t off; /* current pointer */
712
8295148e8f44 buffer: rename internal 'used' member to a more obvious name
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 711
diff changeset
55 size_t size; /* bytes filled */
250
0e4e45813eb9 buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
56 size_t allocsize; /* allocated buffer size */
256
f82b45b662c9 buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 254
diff changeset
57 const struct buffer_ops *ops;
441
86cfab08dffd buffer: add a private void * to buffer structure
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 440
diff changeset
58 void *private; /* private data for implementation */
797
4c0939533a78 buffer: allow buffer_free calls on stack allocated buffer structures
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 713
diff changeset
59 bool heap:1; /* struct buffer is on the heap */
250
0e4e45813eb9 buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
60 };
0e4e45813eb9 buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
61
0e4e45813eb9 buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
62 extern struct buffer *buffer_alloc(size_t expected_size);
0e4e45813eb9 buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
63 extern void buffer_free(struct buffer *buffer);
0e4e45813eb9 buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
64
798
29db876d8157 buffer: add buffer_init_heap to support stack allocated heap buffers
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 797
diff changeset
65 /* a buffer that uses a growable heap buffer */
29db876d8157 buffer: add buffer_init_heap to support stack allocated heap buffers
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 797
diff changeset
66 extern int buffer_init_heap(struct buffer *buffer, size_t expected_size);
29db876d8157 buffer: add buffer_init_heap to support stack allocated heap buffers
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 797
diff changeset
67
251
5f9eebf77662 buffer: add a sinkhole buffer type
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 250
diff changeset
68 /* a buffer that behaves similarly to /dev/null - all appends are lost */
5f9eebf77662 buffer: add a sinkhole buffer type
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 250
diff changeset
69 extern void buffer_init_sink(struct buffer *buffer);
563
bc0841b964fb buffer: combine implementations of const and static buffers
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 562
diff changeset
70 /*
bc0841b964fb buffer: combine implementations of const and static buffers
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 562
diff changeset
71 * a buffer that wraps a data pointer (we use const void * to allow passing
bc0841b964fb buffer: combine implementations of const and static buffers
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 562
diff changeset
72 * in both void * and const void *)
799
6371fb111e27 buffer: add buffer size argument to buffer_init_static
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 798
diff changeset
73 *
6371fb111e27 buffer: add buffer size argument to buffer_init_static
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 798
diff changeset
74 * size is the "written" size while bufsize is the actual size of the
6371fb111e27 buffer: add buffer size argument to buffer_init_static
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 798
diff changeset
75 * backing buffer - beyond which we cannot write/grow
563
bc0841b964fb buffer: combine implementations of const and static buffers
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 562
diff changeset
76 */
bc0841b964fb buffer: combine implementations of const and static buffers
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 562
diff changeset
77 extern void buffer_init_static(struct buffer *buffer, const void *data,
799
6371fb111e27 buffer: add buffer size argument to buffer_init_static
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 798
diff changeset
78 size_t size, size_t allocsize, bool writable);
442
0d09c7592828 buffer: introduce a stdio buffer type
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 441
diff changeset
79 /* a buffer that writes to a FILE * */
0d09c7592828 buffer: introduce a stdio buffer type
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 441
diff changeset
80 extern void buffer_init_stdio(struct buffer *buffer, FILE *f);
251
5f9eebf77662 buffer: add a sinkhole buffer type
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 250
diff changeset
81
250
0e4e45813eb9 buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
82 extern int buffer_append(struct buffer *buffer, const void *data, size_t size);
260
8e6dcacf8620 buffer: implement the concept of seeking in a buffer
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 256
diff changeset
83 extern ssize_t buffer_seek(struct buffer *buffer, off_t offset, int whence);
261
6795f8427fed buffer: allow buffer truncation
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 260
diff changeset
84 extern int buffer_truncate(struct buffer *buffer, size_t size);
611
0fa2f6606c5e buffer: read and write
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 563
diff changeset
85 extern ssize_t buffer_pread(struct buffer *buffer, void *data, size_t len,
0fa2f6606c5e buffer: read and write
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 563
diff changeset
86 size_t off);
0fa2f6606c5e buffer: read and write
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 563
diff changeset
87 extern ssize_t buffer_pwrite(struct buffer *buffer, const void *data, size_t len,
0fa2f6606c5e buffer: read and write
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 563
diff changeset
88 size_t off);
250
0e4e45813eb9 buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
89
711
f2cc03ad4b1f buffer: rename buffer_used to buffer_size
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 611
diff changeset
90 static inline size_t buffer_size(struct buffer *buffer)
250
0e4e45813eb9 buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
91 {
712
8295148e8f44 buffer: rename internal 'used' member to a more obvious name
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 711
diff changeset
92 return buffer->size;
250
0e4e45813eb9 buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
93 }
0e4e45813eb9 buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
94
712
8295148e8f44 buffer: rename internal 'used' member to a more obvious name
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 711
diff changeset
95 /* number of bytes between current location and the end of data */
346
0d9af0f9cbeb buffer: add buffer_remain to return number of bytes remaining
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 280
diff changeset
96 static inline size_t buffer_remain(struct buffer *buffer)
0d9af0f9cbeb buffer: add buffer_remain to return number of bytes remaining
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 280
diff changeset
97 {
712
8295148e8f44 buffer: rename internal 'used' member to a more obvious name
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 711
diff changeset
98 return buffer->size - buffer->off;
346
0d9af0f9cbeb buffer: add buffer_remain to return number of bytes remaining
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 280
diff changeset
99 }
0d9af0f9cbeb buffer: add buffer_remain to return number of bytes remaining
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 280
diff changeset
100
713
c5d55b7efb04 buffer: add buffer_offset that returns the current offset in a buffer
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 712
diff changeset
101 static inline size_t buffer_offset(struct buffer *buffer)
c5d55b7efb04 buffer: add buffer_offset that returns the current offset in a buffer
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 712
diff changeset
102 {
c5d55b7efb04 buffer: add buffer_offset that returns the current offset in a buffer
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 712
diff changeset
103 return buffer->off;
c5d55b7efb04 buffer: add buffer_offset that returns the current offset in a buffer
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 712
diff changeset
104 }
c5d55b7efb04 buffer: add buffer_offset that returns the current offset in a buffer
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 712
diff changeset
105
250
0e4e45813eb9 buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
106 static inline const void *buffer_data(struct buffer *buffer)
0e4e45813eb9 buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
107 {
0e4e45813eb9 buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
108 return buffer->data;
0e4e45813eb9 buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
109 }
0e4e45813eb9 buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
110
260
8e6dcacf8620 buffer: implement the concept of seeking in a buffer
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 256
diff changeset
111 static inline const void *buffer_data_current(struct buffer *buffer)
8e6dcacf8620 buffer: implement the concept of seeking in a buffer
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 256
diff changeset
112 {
8e6dcacf8620 buffer: implement the concept of seeking in a buffer
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 256
diff changeset
113 if (!buffer->data)
8e6dcacf8620 buffer: implement the concept of seeking in a buffer
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 256
diff changeset
114 return NULL;
712
8295148e8f44 buffer: rename internal 'used' member to a more obvious name
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 711
diff changeset
115 if (buffer->off == buffer->size)
260
8e6dcacf8620 buffer: implement the concept of seeking in a buffer
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 256
diff changeset
116 return NULL;
8e6dcacf8620 buffer: implement the concept of seeking in a buffer
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 256
diff changeset
117 return buffer->data + buffer->off;
8e6dcacf8620 buffer: implement the concept of seeking in a buffer
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 256
diff changeset
118 }
8e6dcacf8620 buffer: implement the concept of seeking in a buffer
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 256
diff changeset
119
250
0e4e45813eb9 buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
120 static inline int buffer_append_c(struct buffer *buffer, char c)
0e4e45813eb9 buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
121 {
0e4e45813eb9 buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
122 return buffer_append(buffer, &c, 1);
0e4e45813eb9 buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
123 }
0e4e45813eb9 buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
124
279
18c61a195c7e buffer: rename buffer_append_str to buffer_append_cstr
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 261
diff changeset
125 static inline int buffer_append_cstr(struct buffer *buffer, const char *str)
250
0e4e45813eb9 buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
126 {
0e4e45813eb9 buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
127 return buffer_append(buffer, str, strlen(str));
0e4e45813eb9 buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
128 }
0e4e45813eb9 buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
129
280
dba3d6a23b52 buffer: allow appending struct str strings
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 279
diff changeset
130 static inline int buffer_append_str(struct buffer *buffer, const struct str *s)
dba3d6a23b52 buffer: allow appending struct str strings
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 279
diff changeset
131 {
dba3d6a23b52 buffer: allow appending struct str strings
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 279
diff changeset
132 const char *str = str_cstr(s);
dba3d6a23b52 buffer: allow appending struct str strings
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 279
diff changeset
133
dba3d6a23b52 buffer: allow appending struct str strings
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 279
diff changeset
134 if (!str)
dba3d6a23b52 buffer: allow appending struct str strings
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 279
diff changeset
135 return 0;
dba3d6a23b52 buffer: allow appending struct str strings
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 279
diff changeset
136
dba3d6a23b52 buffer: allow appending struct str strings
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 279
diff changeset
137 return buffer_append_cstr(buffer, str);
dba3d6a23b52 buffer: allow appending struct str strings
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 279
diff changeset
138 }
dba3d6a23b52 buffer: allow appending struct str strings
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 279
diff changeset
139
611
0fa2f6606c5e buffer: read and write
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 563
diff changeset
140 /* same as buffer_pread(), but it uses and updates current offset */
0fa2f6606c5e buffer: read and write
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 563
diff changeset
141 static inline ssize_t buffer_read(struct buffer *buffer, void *buf, size_t len)
0fa2f6606c5e buffer: read and write
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 563
diff changeset
142 {
0fa2f6606c5e buffer: read and write
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 563
diff changeset
143 ssize_t ret;
0fa2f6606c5e buffer: read and write
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 563
diff changeset
144
0fa2f6606c5e buffer: read and write
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 563
diff changeset
145 ret = buffer_pread(buffer, buf, len, buffer->off);
0fa2f6606c5e buffer: read and write
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 563
diff changeset
146
0fa2f6606c5e buffer: read and write
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 563
diff changeset
147 if (ret >= 0)
0fa2f6606c5e buffer: read and write
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 563
diff changeset
148 buffer->off += ret;
0fa2f6606c5e buffer: read and write
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 563
diff changeset
149
0fa2f6606c5e buffer: read and write
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 563
diff changeset
150 return ret;
0fa2f6606c5e buffer: read and write
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 563
diff changeset
151 }
0fa2f6606c5e buffer: read and write
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 563
diff changeset
152
0fa2f6606c5e buffer: read and write
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 563
diff changeset
153 /* same as buffer_pwrite(), but it uses and updates current offset */
0fa2f6606c5e buffer: read and write
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 563
diff changeset
154 static inline ssize_t buffer_write(struct buffer *buffer, const void *buf,
0fa2f6606c5e buffer: read and write
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 563
diff changeset
155 size_t len)
0fa2f6606c5e buffer: read and write
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 563
diff changeset
156 {
0fa2f6606c5e buffer: read and write
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 563
diff changeset
157 ssize_t ret;
0fa2f6606c5e buffer: read and write
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 563
diff changeset
158
0fa2f6606c5e buffer: read and write
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 563
diff changeset
159 ret = buffer_pwrite(buffer, buf, len, buffer->off);
0fa2f6606c5e buffer: read and write
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 563
diff changeset
160
0fa2f6606c5e buffer: read and write
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 563
diff changeset
161 if (ret >= 0)
0fa2f6606c5e buffer: read and write
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 563
diff changeset
162 buffer->off += ret;
0fa2f6606c5e buffer: read and write
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 563
diff changeset
163
0fa2f6606c5e buffer: read and write
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 563
diff changeset
164 return ret;
0fa2f6606c5e buffer: read and write
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 563
diff changeset
165 }
0fa2f6606c5e buffer: read and write
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 563
diff changeset
166
250
0e4e45813eb9 buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
167 #endif