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