Mercurial > libjeffpc
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 |
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 |