annotate buffer.c @ 849:1c4d7ff0a682

buffer: add buffer_insert & buffer_insert_c Like appending, but at any offset - not just at the end of existing data. Signed-off-by: Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
author Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
date Thu, 16 Sep 2021 22:39:12 -0400
parents 3fa2ebce953c
children 3a53836f2274
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 /*
849
1c4d7ff0a682 buffer: add buffer_insert & buffer_insert_c
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 828
diff changeset
2 * Copyright (c) 2017-2021 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 #include <stdbool.h>
0e4e45813eb9 buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
24
260
8e6dcacf8620 buffer: implement the concept of seeking in a buffer
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 256
diff changeset
25 #include <jeffpc/int.h>
8e6dcacf8620 buffer: implement the concept of seeking in a buffer
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 256
diff changeset
26
256
f82b45b662c9 buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 254
diff changeset
27 #include "buffer_impl.h"
250
0e4e45813eb9 buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
28
0e4e45813eb9 buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
29 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
30 {
0e4e45813eb9 buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
31 struct buffer *buffer;
798
29db876d8157 buffer: add buffer_init_heap to support stack allocated heap buffers
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 797
diff changeset
32 int ret;
250
0e4e45813eb9 buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
33
0e4e45813eb9 buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
34 buffer = malloc(sizeof(struct buffer));
0e4e45813eb9 buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
35 if (!buffer)
0e4e45813eb9 buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
36 return ERR_PTR(-ENOMEM);
0e4e45813eb9 buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
37
798
29db876d8157 buffer: add buffer_init_heap to support stack allocated heap buffers
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 797
diff changeset
38 ret = buffer_init_heap(buffer, expected_size);
29db876d8157 buffer: add buffer_init_heap to support stack allocated heap buffers
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 797
diff changeset
39 if (ret) {
250
0e4e45813eb9 buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
40 free(buffer);
798
29db876d8157 buffer: add buffer_init_heap to support stack allocated heap buffers
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 797
diff changeset
41 return ERR_PTR(ret);
250
0e4e45813eb9 buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
42 }
0e4e45813eb9 buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
43
797
4c0939533a78 buffer: allow buffer_free calls on stack allocated buffer structures
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 752
diff changeset
44 buffer->heap = true;
250
0e4e45813eb9 buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
45
0e4e45813eb9 buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
46 return buffer;
0e4e45813eb9 buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
47 }
0e4e45813eb9 buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
48
0e4e45813eb9 buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
49 void buffer_free(struct buffer *buffer)
0e4e45813eb9 buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
50 {
0e4e45813eb9 buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
51 if (!buffer)
0e4e45813eb9 buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
52 return;
0e4e45813eb9 buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
53
256
f82b45b662c9 buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 254
diff changeset
54 if (buffer->ops->free)
f82b45b662c9 buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 254
diff changeset
55 buffer->ops->free(buffer->data);
f82b45b662c9 buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 254
diff changeset
56
797
4c0939533a78 buffer: allow buffer_free calls on stack allocated buffer structures
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 752
diff changeset
57 if (buffer->heap)
4c0939533a78 buffer: allow buffer_free calls on stack allocated buffer structures
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 752
diff changeset
58 free(buffer);
250
0e4e45813eb9 buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
59 }
0e4e45813eb9 buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
60
798
29db876d8157 buffer: add buffer_init_heap to support stack allocated heap buffers
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 797
diff changeset
61 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
62 {
29db876d8157 buffer: add buffer_init_heap to support stack allocated heap buffers
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 797
diff changeset
63 buffer->data = malloc(expected_size ? expected_size : 1);
29db876d8157 buffer: add buffer_init_heap to support stack allocated heap buffers
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 797
diff changeset
64 if (!buffer->data)
29db876d8157 buffer: add buffer_init_heap to support stack allocated heap buffers
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 797
diff changeset
65 return -ENOMEM;
29db876d8157 buffer: add buffer_init_heap to support stack allocated heap buffers
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 797
diff changeset
66
29db876d8157 buffer: add buffer_init_heap to support stack allocated heap buffers
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 797
diff changeset
67 buffer->off = 0;
29db876d8157 buffer: add buffer_init_heap to support stack allocated heap buffers
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 797
diff changeset
68 buffer->size = 0;
29db876d8157 buffer: add buffer_init_heap to support stack allocated heap buffers
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 797
diff changeset
69 buffer->allocsize = expected_size;
29db876d8157 buffer: add buffer_init_heap to support stack allocated heap buffers
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 797
diff changeset
70 buffer->ops = &heap_buffer;
29db876d8157 buffer: add buffer_init_heap to support stack allocated heap buffers
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 797
diff changeset
71 buffer->heap = false;
29db876d8157 buffer: add buffer_init_heap to support stack allocated heap buffers
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 797
diff changeset
72
29db876d8157 buffer: add buffer_init_heap to support stack allocated heap buffers
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 797
diff changeset
73 return 0;
29db876d8157 buffer: add buffer_init_heap to support stack allocated heap buffers
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 797
diff changeset
74 }
29db876d8157 buffer: add buffer_init_heap to support stack allocated heap buffers
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 797
diff changeset
75
251
5f9eebf77662 buffer: add a sinkhole buffer type
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 250
diff changeset
76 void buffer_init_sink(struct buffer *buffer)
5f9eebf77662 buffer: add a sinkhole buffer type
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 250
diff changeset
77 {
5f9eebf77662 buffer: add a sinkhole buffer type
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 250
diff changeset
78 buffer->data = NULL;
260
8e6dcacf8620 buffer: implement the concept of seeking in a buffer
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 256
diff changeset
79 buffer->off = 0;
712
8295148e8f44 buffer: rename internal 'used' member to a more obvious name
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 710
diff changeset
80 buffer->size = 0;
251
5f9eebf77662 buffer: add a sinkhole buffer type
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 250
diff changeset
81 buffer->allocsize = SIZE_MAX;
256
f82b45b662c9 buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 254
diff changeset
82 buffer->ops = &sink_buffer;
797
4c0939533a78 buffer: allow buffer_free calls on stack allocated buffer structures
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 752
diff changeset
83 buffer->heap = false;
254
de0709ff0895 buffer: add a borrowed-const-data buffer type
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 251
diff changeset
84 }
de0709ff0895 buffer: add a borrowed-const-data buffer type
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 251
diff changeset
85
563
bc0841b964fb buffer: combine implementations of const and static buffers
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 562
diff changeset
86 void buffer_init_static(struct buffer *buffer, const void *data, size_t size,
799
6371fb111e27 buffer: add buffer size argument to buffer_init_static
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 798
diff changeset
87 size_t bufsize, bool writable)
254
de0709ff0895 buffer: add a borrowed-const-data buffer type
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 251
diff changeset
88 {
799
6371fb111e27 buffer: add buffer size argument to buffer_init_static
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 798
diff changeset
89 ASSERT3U(size, <=, bufsize);
6371fb111e27 buffer: add buffer size argument to buffer_init_static
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 798
diff changeset
90
254
de0709ff0895 buffer: add a borrowed-const-data buffer type
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 251
diff changeset
91 buffer->data = (void *) data;
260
8e6dcacf8620 buffer: implement the concept of seeking in a buffer
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 256
diff changeset
92 buffer->off = 0;
712
8295148e8f44 buffer: rename internal 'used' member to a more obvious name
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 710
diff changeset
93 buffer->size = size;
799
6371fb111e27 buffer: add buffer size argument to buffer_init_static
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 798
diff changeset
94 buffer->allocsize = bufsize;
563
bc0841b964fb buffer: combine implementations of const and static buffers
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 562
diff changeset
95 buffer->ops = writable ? &static_buffer_rw : &static_buffer_ro;
797
4c0939533a78 buffer: allow buffer_free calls on stack allocated buffer structures
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 752
diff changeset
96 buffer->heap = false;
562
584def85123e buffer: introduce a static read-write buffer type
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 442
diff changeset
97 }
584def85123e buffer: introduce a static read-write buffer type
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 442
diff changeset
98
250
0e4e45813eb9 buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
99 static int resize(struct buffer *buffer, size_t newsize)
0e4e45813eb9 buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
100 {
0e4e45813eb9 buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
101 void *tmp;
0e4e45813eb9 buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
102
0e4e45813eb9 buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
103 if (newsize <= buffer->allocsize)
0e4e45813eb9 buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
104 return 0;
0e4e45813eb9 buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
105
256
f82b45b662c9 buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 254
diff changeset
106 if (!buffer->ops->realloc)
f82b45b662c9 buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 254
diff changeset
107 return -ENOTSUP;
f82b45b662c9 buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 254
diff changeset
108
f82b45b662c9 buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 254
diff changeset
109 tmp = buffer->ops->realloc(buffer->data, newsize);
250
0e4e45813eb9 buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
110 if (!tmp)
0e4e45813eb9 buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
111 return -ENOMEM;
0e4e45813eb9 buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
112
0e4e45813eb9 buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
113 buffer->data = tmp;
256
f82b45b662c9 buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 254
diff changeset
114 buffer->allocsize = newsize;
250
0e4e45813eb9 buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
115
0e4e45813eb9 buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
116 return 0;
0e4e45813eb9 buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
117 }
0e4e45813eb9 buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
118
849
1c4d7ff0a682 buffer: add buffer_insert & buffer_insert_c
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 828
diff changeset
119 int buffer_insert(struct buffer *buffer, const void *data, size_t size,
1c4d7ff0a682 buffer: add buffer_insert & buffer_insert_c
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 828
diff changeset
120 size_t off)
250
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 int ret;
0e4e45813eb9 buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
123
256
f82b45b662c9 buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 254
diff changeset
124 if (!buffer)
f82b45b662c9 buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 254
diff changeset
125 return -EINVAL;
f82b45b662c9 buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 254
diff changeset
126
278
47df3cfdeca7 buffer: allow zero length append
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 261
diff changeset
127 if (!data && size)
250
0e4e45813eb9 buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
128 return -EINVAL;
0e4e45813eb9 buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
129
849
1c4d7ff0a682 buffer: add buffer_insert & buffer_insert_c
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 828
diff changeset
130 if (buffer->ops->check_insert) {
1c4d7ff0a682 buffer: add buffer_insert & buffer_insert_c
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 828
diff changeset
131 ret = buffer->ops->check_insert(buffer, data, size, off);
256
f82b45b662c9 buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 254
diff changeset
132 if (ret)
f82b45b662c9 buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 254
diff changeset
133 return ret;
f82b45b662c9 buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 254
diff changeset
134 }
f82b45b662c9 buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 254
diff changeset
135
849
1c4d7ff0a682 buffer: add buffer_insert & buffer_insert_c
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 828
diff changeset
136 if (off > buffer->size)
1c4d7ff0a682 buffer: add buffer_insert & buffer_insert_c
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 828
diff changeset
137 return -EINVAL; /* can't insert past EOF */
1c4d7ff0a682 buffer: add buffer_insert & buffer_insert_c
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 828
diff changeset
138
278
47df3cfdeca7 buffer: allow zero length append
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 261
diff changeset
139 if (!size)
849
1c4d7ff0a682 buffer: add buffer_insert & buffer_insert_c
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 828
diff changeset
140 return 0; /* insert(..., 0, ...) is a no-op */
250
0e4e45813eb9 buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
141
712
8295148e8f44 buffer: rename internal 'used' member to a more obvious name
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 710
diff changeset
142 ret = resize(buffer, buffer->size + size);
256
f82b45b662c9 buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 254
diff changeset
143 if (ret)
f82b45b662c9 buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 254
diff changeset
144 return ret;
250
0e4e45813eb9 buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
145
849
1c4d7ff0a682 buffer: add buffer_insert & buffer_insert_c
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 828
diff changeset
146 if (off < buffer->size)
1c4d7ff0a682 buffer: add buffer_insert & buffer_insert_c
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 828
diff changeset
147 buffer->ops->move(buffer, off + size, off, buffer->size - off);
1c4d7ff0a682 buffer: add buffer_insert & buffer_insert_c
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 828
diff changeset
148
1c4d7ff0a682 buffer: add buffer_insert & buffer_insert_c
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 828
diff changeset
149 buffer->ops->copyin(buffer, off, data, size);
250
0e4e45813eb9 buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
150
712
8295148e8f44 buffer: rename internal 'used' member to a more obvious name
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 710
diff changeset
151 buffer->size += size;
250
0e4e45813eb9 buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
152
0e4e45813eb9 buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
153 return 0;
0e4e45813eb9 buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff changeset
154 }
256
f82b45b662c9 buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 254
diff changeset
155
817
013adc5c54dd buffer: add function to copy between two buffers
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 799
diff changeset
156 int buffer_copy(struct buffer *dst, struct buffer *src, size_t len)
013adc5c54dd buffer: add function to copy between two buffers
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 799
diff changeset
157 {
013adc5c54dd buffer: add function to copy between two buffers
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 799
diff changeset
158 /*
013adc5c54dd buffer: add function to copy between two buffers
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 799
diff changeset
159 * TODO: we could make this more efficient by growing the
013adc5c54dd buffer: add function to copy between two buffers
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 799
diff changeset
160 * destination buffer only once
013adc5c54dd buffer: add function to copy between two buffers
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 799
diff changeset
161 */
013adc5c54dd buffer: add function to copy between two buffers
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 799
diff changeset
162
013adc5c54dd buffer: add function to copy between two buffers
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 799
diff changeset
163 while (len) {
013adc5c54dd buffer: add function to copy between two buffers
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 799
diff changeset
164 uint8_t tmp[4096];
013adc5c54dd buffer: add function to copy between two buffers
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 799
diff changeset
165 ssize_t ret;
013adc5c54dd buffer: add function to copy between two buffers
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 799
diff changeset
166
013adc5c54dd buffer: add function to copy between two buffers
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 799
diff changeset
167 /* read in a bunch */
013adc5c54dd buffer: add function to copy between two buffers
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 799
diff changeset
168 ret = buffer_read(src, tmp, MIN(sizeof(tmp), len));
013adc5c54dd buffer: add function to copy between two buffers
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 799
diff changeset
169 if (ret < 0)
013adc5c54dd buffer: add function to copy between two buffers
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 799
diff changeset
170 return ret;
013adc5c54dd buffer: add function to copy between two buffers
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 799
diff changeset
171
013adc5c54dd buffer: add function to copy between two buffers
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 799
diff changeset
172 /* decrement now, so we can reuse ret below */
013adc5c54dd buffer: add function to copy between two buffers
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 799
diff changeset
173 len -= ret;
013adc5c54dd buffer: add function to copy between two buffers
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 799
diff changeset
174
013adc5c54dd buffer: add function to copy between two buffers
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 799
diff changeset
175 /* and append whatever we read */
013adc5c54dd buffer: add function to copy between two buffers
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 799
diff changeset
176 ret = buffer_append(dst, tmp, ret);
013adc5c54dd buffer: add function to copy between two buffers
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 799
diff changeset
177 if (ret)
013adc5c54dd buffer: add function to copy between two buffers
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 799
diff changeset
178 return ret;
013adc5c54dd buffer: add function to copy between two buffers
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 799
diff changeset
179 }
013adc5c54dd buffer: add function to copy between two buffers
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 799
diff changeset
180
013adc5c54dd buffer: add function to copy between two buffers
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 799
diff changeset
181 return 0;
013adc5c54dd buffer: add function to copy between two buffers
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 799
diff changeset
182 }
013adc5c54dd buffer: add function to copy between two buffers
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 799
diff changeset
183
260
8e6dcacf8620 buffer: implement the concept of seeking in a buffer
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 256
diff changeset
184 ssize_t buffer_seek(struct buffer *buffer, off_t offset, int whence)
8e6dcacf8620 buffer: implement the concept of seeking in a buffer
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 256
diff changeset
185 {
8e6dcacf8620 buffer: implement the concept of seeking in a buffer
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 256
diff changeset
186 size_t newoff;
8e6dcacf8620 buffer: implement the concept of seeking in a buffer
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 256
diff changeset
187
8e6dcacf8620 buffer: implement the concept of seeking in a buffer
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 256
diff changeset
188 if (!buffer)
8e6dcacf8620 buffer: implement the concept of seeking in a buffer
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 256
diff changeset
189 return -EINVAL;
8e6dcacf8620 buffer: implement the concept of seeking in a buffer
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 256
diff changeset
190
8e6dcacf8620 buffer: implement the concept of seeking in a buffer
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 256
diff changeset
191 switch (whence) {
8e6dcacf8620 buffer: implement the concept of seeking in a buffer
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 256
diff changeset
192 case SEEK_SET:
8e6dcacf8620 buffer: implement the concept of seeking in a buffer
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 256
diff changeset
193 if (offset < 0)
8e6dcacf8620 buffer: implement the concept of seeking in a buffer
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 256
diff changeset
194 return -EINVAL;
712
8295148e8f44 buffer: rename internal 'used' member to a more obvious name
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 710
diff changeset
195 if (offset > buffer->size)
260
8e6dcacf8620 buffer: implement the concept of seeking in a buffer
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 256
diff changeset
196 return -EINVAL;
8e6dcacf8620 buffer: implement the concept of seeking in a buffer
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 256
diff changeset
197
8e6dcacf8620 buffer: implement the concept of seeking in a buffer
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 256
diff changeset
198 newoff = offset;
8e6dcacf8620 buffer: implement the concept of seeking in a buffer
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 256
diff changeset
199 break;
8e6dcacf8620 buffer: implement the concept of seeking in a buffer
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 256
diff changeset
200 case SEEK_CUR:
8e6dcacf8620 buffer: implement the concept of seeking in a buffer
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 256
diff changeset
201 if ((offset > 0) &&
712
8295148e8f44 buffer: rename internal 'used' member to a more obvious name
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 710
diff changeset
202 (offset > (buffer->size - buffer->off)))
260
8e6dcacf8620 buffer: implement the concept of seeking in a buffer
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 256
diff changeset
203 return -EINVAL;
8e6dcacf8620 buffer: implement the concept of seeking in a buffer
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 256
diff changeset
204 if ((offset < 0) && (-offset > buffer->off))
8e6dcacf8620 buffer: implement the concept of seeking in a buffer
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 256
diff changeset
205 return -EINVAL;
8e6dcacf8620 buffer: implement the concept of seeking in a buffer
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 256
diff changeset
206
8e6dcacf8620 buffer: implement the concept of seeking in a buffer
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 256
diff changeset
207 newoff = buffer->off + offset;
8e6dcacf8620 buffer: implement the concept of seeking in a buffer
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 256
diff changeset
208 break;
8e6dcacf8620 buffer: implement the concept of seeking in a buffer
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 256
diff changeset
209 case SEEK_END:
8e6dcacf8620 buffer: implement the concept of seeking in a buffer
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 256
diff changeset
210 if (offset > 0)
8e6dcacf8620 buffer: implement the concept of seeking in a buffer
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 256
diff changeset
211 return -EINVAL;
712
8295148e8f44 buffer: rename internal 'used' member to a more obvious name
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 710
diff changeset
212 if (-offset > buffer->size)
260
8e6dcacf8620 buffer: implement the concept of seeking in a buffer
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 256
diff changeset
213 return -EINVAL;
8e6dcacf8620 buffer: implement the concept of seeking in a buffer
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 256
diff changeset
214
751
4e141f41f8f1 buffer: correct buffer_seek(..., SEEK_END) offset calculation
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 712
diff changeset
215 newoff = buffer->size + offset;
260
8e6dcacf8620 buffer: implement the concept of seeking in a buffer
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 256
diff changeset
216 break;
8e6dcacf8620 buffer: implement the concept of seeking in a buffer
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 256
diff changeset
217 default:
8e6dcacf8620 buffer: implement the concept of seeking in a buffer
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 256
diff changeset
218 return -EINVAL;
8e6dcacf8620 buffer: implement the concept of seeking in a buffer
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 256
diff changeset
219 }
8e6dcacf8620 buffer: implement the concept of seeking in a buffer
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 256
diff changeset
220
8e6dcacf8620 buffer: implement the concept of seeking in a buffer
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 256
diff changeset
221 if (newoff > SSIZE_MAX)
8e6dcacf8620 buffer: implement the concept of seeking in a buffer
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 256
diff changeset
222 return -EOVERFLOW;
8e6dcacf8620 buffer: implement the concept of seeking in a buffer
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 256
diff changeset
223
440
df90b1b883d8 buffer: allow implementations to refuse seeks
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 278
diff changeset
224 if (buffer->ops->check_seek) {
df90b1b883d8 buffer: allow implementations to refuse seeks
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 278
diff changeset
225 ssize_t ret;
df90b1b883d8 buffer: allow implementations to refuse seeks
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 278
diff changeset
226
df90b1b883d8 buffer: allow implementations to refuse seeks
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 278
diff changeset
227 ret = buffer->ops->check_seek(buffer, offset, whence, newoff);
df90b1b883d8 buffer: allow implementations to refuse seeks
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 278
diff changeset
228 if (ret)
df90b1b883d8 buffer: allow implementations to refuse seeks
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 278
diff changeset
229 return ret;
df90b1b883d8 buffer: allow implementations to refuse seeks
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 278
diff changeset
230 }
df90b1b883d8 buffer: allow implementations to refuse seeks
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 278
diff changeset
231
260
8e6dcacf8620 buffer: implement the concept of seeking in a buffer
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 256
diff changeset
232 buffer->off = newoff;
8e6dcacf8620 buffer: implement the concept of seeking in a buffer
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 256
diff changeset
233
8e6dcacf8620 buffer: implement the concept of seeking in a buffer
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 256
diff changeset
234 return newoff;
8e6dcacf8620 buffer: implement the concept of seeking in a buffer
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 256
diff changeset
235 }
8e6dcacf8620 buffer: implement the concept of seeking in a buffer
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 256
diff changeset
236
261
6795f8427fed buffer: allow buffer truncation
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 260
diff changeset
237 int buffer_truncate(struct buffer *buffer, size_t size)
6795f8427fed buffer: allow buffer truncation
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 260
diff changeset
238 {
6795f8427fed buffer: allow buffer truncation
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 260
diff changeset
239 int ret;
6795f8427fed buffer: allow buffer truncation
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 260
diff changeset
240
6795f8427fed buffer: allow buffer truncation
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 260
diff changeset
241 if (!buffer)
6795f8427fed buffer: allow buffer truncation
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 260
diff changeset
242 return -EINVAL;
6795f8427fed buffer: allow buffer truncation
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 260
diff changeset
243
6795f8427fed buffer: allow buffer truncation
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 260
diff changeset
244 if (buffer->ops->check_truncate) {
6795f8427fed buffer: allow buffer truncation
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 260
diff changeset
245 ret = buffer->ops->check_truncate(buffer, size);
6795f8427fed buffer: allow buffer truncation
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 260
diff changeset
246 if (ret)
6795f8427fed buffer: allow buffer truncation
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 260
diff changeset
247 return ret;
6795f8427fed buffer: allow buffer truncation
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 260
diff changeset
248 }
6795f8427fed buffer: allow buffer truncation
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 260
diff changeset
249
6795f8427fed buffer: allow buffer truncation
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 260
diff changeset
250 ret = resize(buffer, size);
6795f8427fed buffer: allow buffer truncation
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 260
diff changeset
251 if (ret)
6795f8427fed buffer: allow buffer truncation
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 260
diff changeset
252 return ret;
6795f8427fed buffer: allow buffer truncation
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 260
diff changeset
253
630
28dcffaf40b5 buffer: add a comment explaining the call to clear in truncate
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 629
diff changeset
254 /* clear any expansion */
712
8295148e8f44 buffer: rename internal 'used' member to a more obvious name
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 710
diff changeset
255 if (buffer->size < size)
8295148e8f44 buffer: rename internal 'used' member to a more obvious name
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 710
diff changeset
256 buffer->ops->clear(buffer, buffer->size, size - buffer->size);
261
6795f8427fed buffer: allow buffer truncation
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 260
diff changeset
257
712
8295148e8f44 buffer: rename internal 'used' member to a more obvious name
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 710
diff changeset
258 buffer->size = size;
752
b9db76d1dd5b buffer: move buffer offset on truncation
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 751
diff changeset
259 buffer->off = MIN(buffer->off, size);
261
6795f8427fed buffer: allow buffer truncation
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 260
diff changeset
260
6795f8427fed buffer: allow buffer truncation
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 260
diff changeset
261 return 0;
6795f8427fed buffer: allow buffer truncation
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 260
diff changeset
262 }
6795f8427fed buffer: allow buffer truncation
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 260
diff changeset
263
611
0fa2f6606c5e buffer: read and write
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 563
diff changeset
264 ssize_t buffer_pread(struct buffer *buffer, void *buf, size_t len, size_t off)
0fa2f6606c5e buffer: read and write
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 563
diff changeset
265 {
0fa2f6606c5e buffer: read and write
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 563
diff changeset
266 ssize_t ret;
0fa2f6606c5e buffer: read and write
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 563
diff changeset
267
0fa2f6606c5e buffer: read and write
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 563
diff changeset
268 if (!buffer || !buf)
0fa2f6606c5e buffer: read and write
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 563
diff changeset
269 return -EINVAL;
0fa2f6606c5e buffer: read and write
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 563
diff changeset
270
0fa2f6606c5e buffer: read and write
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 563
diff changeset
271 if (buffer->ops->check_read) {
0fa2f6606c5e buffer: read and write
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 563
diff changeset
272 ret = buffer->ops->check_read(buffer, buf, len, off);
0fa2f6606c5e buffer: read and write
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 563
diff changeset
273 if (ret)
0fa2f6606c5e buffer: read and write
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 563
diff changeset
274 return ret;
0fa2f6606c5e buffer: read and write
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 563
diff changeset
275 }
0fa2f6606c5e buffer: read and write
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 563
diff changeset
276
712
8295148e8f44 buffer: rename internal 'used' member to a more obvious name
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 710
diff changeset
277 if (off >= buffer->size)
611
0fa2f6606c5e buffer: read and write
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 563
diff changeset
278 ret = 0;
712
8295148e8f44 buffer: rename internal 'used' member to a more obvious name
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 710
diff changeset
279 else if ((off + len) > buffer->size)
8295148e8f44 buffer: rename internal 'used' member to a more obvious name
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 710
diff changeset
280 ret = buffer->size - off;
611
0fa2f6606c5e buffer: read and write
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 563
diff changeset
281 else
0fa2f6606c5e buffer: read and write
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 563
diff changeset
282 ret = len;
0fa2f6606c5e buffer: read and write
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 563
diff changeset
283
0fa2f6606c5e buffer: read and write
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 563
diff changeset
284 if (ret)
0fa2f6606c5e buffer: read and write
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 563
diff changeset
285 buffer->ops->copyout(buffer, off, buf, ret);
0fa2f6606c5e buffer: read and write
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 563
diff changeset
286
0fa2f6606c5e buffer: read and write
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 563
diff changeset
287 return ret;
0fa2f6606c5e buffer: read and write
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 563
diff changeset
288 }
0fa2f6606c5e buffer: read and write
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 563
diff changeset
289
0fa2f6606c5e buffer: read and write
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 563
diff changeset
290 ssize_t buffer_pwrite(struct buffer *buffer, const void *buf, size_t len,
0fa2f6606c5e buffer: read and write
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 563
diff changeset
291 size_t off)
0fa2f6606c5e buffer: read and write
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 563
diff changeset
292 {
0fa2f6606c5e buffer: read and write
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 563
diff changeset
293 ssize_t ret;
0fa2f6606c5e buffer: read and write
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 563
diff changeset
294
0fa2f6606c5e buffer: read and write
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 563
diff changeset
295 if (!buffer || !buf)
0fa2f6606c5e buffer: read and write
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 563
diff changeset
296 return -EINVAL;
0fa2f6606c5e buffer: read and write
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 563
diff changeset
297
0fa2f6606c5e buffer: read and write
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 563
diff changeset
298 if (buffer->ops->check_write) {
0fa2f6606c5e buffer: read and write
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 563
diff changeset
299 ret = buffer->ops->check_write(buffer, buf, len, off);
0fa2f6606c5e buffer: read and write
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 563
diff changeset
300 if (ret)
0fa2f6606c5e buffer: read and write
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 563
diff changeset
301 return ret;
0fa2f6606c5e buffer: read and write
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 563
diff changeset
302 }
0fa2f6606c5e buffer: read and write
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 563
diff changeset
303
0fa2f6606c5e buffer: read and write
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 563
diff changeset
304 ret = resize(buffer, off + len);
0fa2f6606c5e buffer: read and write
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 563
diff changeset
305 if (ret)
0fa2f6606c5e buffer: read and write
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 563
diff changeset
306 return ret;
0fa2f6606c5e buffer: read and write
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 563
diff changeset
307
629
3e73334cb29c buffer: zero out any holes created during buffer write
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 611
diff changeset
308 /* clear any holes */
712
8295148e8f44 buffer: rename internal 'used' member to a more obvious name
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 710
diff changeset
309 if (buffer->size < off)
8295148e8f44 buffer: rename internal 'used' member to a more obvious name
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 710
diff changeset
310 buffer->ops->clear(buffer, buffer->size, off - buffer->size);
629
3e73334cb29c buffer: zero out any holes created during buffer write
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 611
diff changeset
311
611
0fa2f6606c5e buffer: read and write
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 563
diff changeset
312 buffer->ops->copyin(buffer, off, buf, len);
0fa2f6606c5e buffer: read and write
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 563
diff changeset
313
712
8295148e8f44 buffer: rename internal 'used' member to a more obvious name
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 710
diff changeset
314 buffer->size = MAX(buffer->size, off + len);
611
0fa2f6606c5e buffer: read and write
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 563
diff changeset
315
0fa2f6606c5e buffer: read and write
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 563
diff changeset
316 return len;
0fa2f6606c5e buffer: read and write
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 563
diff changeset
317 }
0fa2f6606c5e buffer: read and write
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 563
diff changeset
318
256
f82b45b662c9 buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 254
diff changeset
319 /*
f82b45b662c9 buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 254
diff changeset
320 * Generic implementations
f82b45b662c9 buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 254
diff changeset
321 */
f82b45b662c9 buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 254
diff changeset
322
261
6795f8427fed buffer: allow buffer truncation
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 260
diff changeset
323 /* clear implementations */
6795f8427fed buffer: allow buffer truncation
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 260
diff changeset
324 void generic_buffer_clear_memset(struct buffer *buffer, size_t off, size_t len)
6795f8427fed buffer: allow buffer truncation
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 260
diff changeset
325 {
6795f8427fed buffer: allow buffer truncation
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 260
diff changeset
326 memset(buffer->data + off, 0, len);
6795f8427fed buffer: allow buffer truncation
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 260
diff changeset
327 }
6795f8427fed buffer: allow buffer truncation
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 260
diff changeset
328
6795f8427fed buffer: allow buffer truncation
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 260
diff changeset
329 void generic_buffer_clear_nop(struct buffer *buffer, size_t off, size_t len)
6795f8427fed buffer: allow buffer truncation
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 260
diff changeset
330 {
6795f8427fed buffer: allow buffer truncation
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 260
diff changeset
331 }
6795f8427fed buffer: allow buffer truncation
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 260
diff changeset
332
6795f8427fed buffer: allow buffer truncation
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 260
diff changeset
333 void generic_buffer_clear_panic(struct buffer *buffer, size_t off, size_t len)
6795f8427fed buffer: allow buffer truncation
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 260
diff changeset
334 {
6795f8427fed buffer: allow buffer truncation
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 260
diff changeset
335 panic("buffer clear called");
6795f8427fed buffer: allow buffer truncation
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 260
diff changeset
336 }
6795f8427fed buffer: allow buffer truncation
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 260
diff changeset
337
256
f82b45b662c9 buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 254
diff changeset
338 /* copyin implementations */
f82b45b662c9 buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 254
diff changeset
339 void generic_buffer_copyin_memcpy(struct buffer *buffer, size_t off,
f82b45b662c9 buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 254
diff changeset
340 const void *newdata, size_t newdatalen)
f82b45b662c9 buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 254
diff changeset
341 {
f82b45b662c9 buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 254
diff changeset
342 memcpy(buffer->data + off, newdata, newdatalen);
f82b45b662c9 buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 254
diff changeset
343 }
f82b45b662c9 buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 254
diff changeset
344
f82b45b662c9 buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 254
diff changeset
345 void generic_buffer_copyin_nop(struct buffer *buffer, size_t off,
f82b45b662c9 buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 254
diff changeset
346 const void *newdata, size_t newdatalen)
f82b45b662c9 buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 254
diff changeset
347 {
f82b45b662c9 buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 254
diff changeset
348 }
f82b45b662c9 buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 254
diff changeset
349
f82b45b662c9 buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 254
diff changeset
350 void generic_buffer_copyin_panic(struct buffer *buffer, size_t off,
f82b45b662c9 buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 254
diff changeset
351 const void *newdata, size_t newdatalen)
f82b45b662c9 buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 254
diff changeset
352 {
f82b45b662c9 buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 254
diff changeset
353 panic("buffer copyin called");
f82b45b662c9 buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 254
diff changeset
354 }
611
0fa2f6606c5e buffer: read and write
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 563
diff changeset
355
0fa2f6606c5e buffer: read and write
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 563
diff changeset
356 /* copyout implementations */
0fa2f6606c5e buffer: read and write
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 563
diff changeset
357 void generic_buffer_copyout_memcpy(struct buffer *buffer, size_t off,
0fa2f6606c5e buffer: read and write
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 563
diff changeset
358 void *data, size_t datalen)
0fa2f6606c5e buffer: read and write
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 563
diff changeset
359 {
0fa2f6606c5e buffer: read and write
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 563
diff changeset
360 memcpy(data, buffer->data + off, datalen);
0fa2f6606c5e buffer: read and write
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 563
diff changeset
361 }
0fa2f6606c5e buffer: read and write
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 563
diff changeset
362
0fa2f6606c5e buffer: read and write
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 563
diff changeset
363 void generic_buffer_copyout_nop(struct buffer *buffer, size_t off, void *data,
0fa2f6606c5e buffer: read and write
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 563
diff changeset
364 size_t datalen)
0fa2f6606c5e buffer: read and write
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 563
diff changeset
365 {
0fa2f6606c5e buffer: read and write
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 563
diff changeset
366 }
0fa2f6606c5e buffer: read and write
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 563
diff changeset
367
0fa2f6606c5e buffer: read and write
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 563
diff changeset
368 void generic_buffer_copyout_panic(struct buffer *buffer, size_t off, void *data,
0fa2f6606c5e buffer: read and write
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 563
diff changeset
369 size_t datalen)
0fa2f6606c5e buffer: read and write
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 563
diff changeset
370 {
0fa2f6606c5e buffer: read and write
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 563
diff changeset
371 panic("buffer copyout called");
0fa2f6606c5e buffer: read and write
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 563
diff changeset
372 }
849
1c4d7ff0a682 buffer: add buffer_insert & buffer_insert_c
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 828
diff changeset
373
1c4d7ff0a682 buffer: add buffer_insert & buffer_insert_c
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 828
diff changeset
374 /* move implementations */
1c4d7ff0a682 buffer: add buffer_insert & buffer_insert_c
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 828
diff changeset
375 void generic_buffer_move_memmove(struct buffer *buffer, size_t dst,
1c4d7ff0a682 buffer: add buffer_insert & buffer_insert_c
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 828
diff changeset
376 size_t src, size_t len)
1c4d7ff0a682 buffer: add buffer_insert & buffer_insert_c
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 828
diff changeset
377 {
1c4d7ff0a682 buffer: add buffer_insert & buffer_insert_c
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 828
diff changeset
378 memmove(buffer->data + dst, buffer->data + src, len);
1c4d7ff0a682 buffer: add buffer_insert & buffer_insert_c
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 828
diff changeset
379 }
1c4d7ff0a682 buffer: add buffer_insert & buffer_insert_c
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 828
diff changeset
380
1c4d7ff0a682 buffer: add buffer_insert & buffer_insert_c
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 828
diff changeset
381 void generic_buffer_move_nop(struct buffer *buffer, size_t dst,
1c4d7ff0a682 buffer: add buffer_insert & buffer_insert_c
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 828
diff changeset
382 size_t src, size_t len)
1c4d7ff0a682 buffer: add buffer_insert & buffer_insert_c
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 828
diff changeset
383 {
1c4d7ff0a682 buffer: add buffer_insert & buffer_insert_c
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 828
diff changeset
384 }
1c4d7ff0a682 buffer: add buffer_insert & buffer_insert_c
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 828
diff changeset
385
1c4d7ff0a682 buffer: add buffer_insert & buffer_insert_c
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 828
diff changeset
386 void generic_buffer_move_panic(struct buffer *buffer, size_t dst,
1c4d7ff0a682 buffer: add buffer_insert & buffer_insert_c
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 828
diff changeset
387 size_t src, size_t len)
1c4d7ff0a682 buffer: add buffer_insert & buffer_insert_c
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 828
diff changeset
388 {
1c4d7ff0a682 buffer: add buffer_insert & buffer_insert_c
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 828
diff changeset
389 panic("buffer move called");
1c4d7ff0a682 buffer: add buffer_insert & buffer_insert_c
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 828
diff changeset
390 }
1c4d7ff0a682 buffer: add buffer_insert & buffer_insert_c
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents: 828
diff changeset
391