Mercurial > libjeffpc
annotate buffer.c @ 442:0d09c7592828
buffer: introduce a stdio buffer type
Instead of buffering the appended data, the data is written to a FILE *
using fwrite(3).
Signed-off-by: Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
author | Josef 'Jeff' Sipek <jeffpc@josefsipek.net> |
---|---|
date | Sun, 01 Apr 2018 14:24:56 -0400 |
parents | df90b1b883d8 |
children | 584def85123e |
rev | line source |
---|---|
250
0e4e45813eb9
buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff
changeset
|
1 /* |
440
df90b1b883d8
buffer: allow implementations to refuse seeks
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
278
diff
changeset
|
2 * Copyright (c) 2017-2018 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; |
0e4e45813eb9
buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff
changeset
|
32 |
0e4e45813eb9
buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff
changeset
|
33 buffer = malloc(sizeof(struct buffer)); |
0e4e45813eb9
buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff
changeset
|
34 if (!buffer) |
0e4e45813eb9
buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff
changeset
|
35 return ERR_PTR(-ENOMEM); |
0e4e45813eb9
buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff
changeset
|
36 |
0e4e45813eb9
buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff
changeset
|
37 buffer->data = malloc(expected_size ? expected_size : 1); |
0e4e45813eb9
buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff
changeset
|
38 if (!buffer->data) { |
0e4e45813eb9
buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff
changeset
|
39 free(buffer); |
0e4e45813eb9
buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff
changeset
|
40 return ERR_PTR(-ENOMEM); |
0e4e45813eb9
buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff
changeset
|
41 } |
0e4e45813eb9
buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff
changeset
|
42 |
260
8e6dcacf8620
buffer: implement the concept of seeking in a buffer
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
256
diff
changeset
|
43 buffer->off = 0; |
250
0e4e45813eb9
buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff
changeset
|
44 buffer->used = 0; |
0e4e45813eb9
buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff
changeset
|
45 buffer->allocsize = expected_size; |
256
f82b45b662c9
buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
254
diff
changeset
|
46 buffer->ops = &heap_buffer; |
250
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 return buffer; |
0e4e45813eb9
buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff
changeset
|
49 } |
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 void buffer_free(struct buffer *buffer) |
0e4e45813eb9
buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff
changeset
|
52 { |
0e4e45813eb9
buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff
changeset
|
53 if (!buffer) |
0e4e45813eb9
buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff
changeset
|
54 return; |
0e4e45813eb9
buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff
changeset
|
55 |
256
f82b45b662c9
buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
254
diff
changeset
|
56 if (buffer->ops->free) |
f82b45b662c9
buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
254
diff
changeset
|
57 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
|
58 |
250
0e4e45813eb9
buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff
changeset
|
59 free(buffer); |
0e4e45813eb9
buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff
changeset
|
60 } |
0e4e45813eb9
buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff
changeset
|
61 |
251
5f9eebf77662
buffer: add a sinkhole buffer type
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
250
diff
changeset
|
62 void buffer_init_sink(struct buffer *buffer) |
5f9eebf77662
buffer: add a sinkhole buffer type
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
250
diff
changeset
|
63 { |
5f9eebf77662
buffer: add a sinkhole buffer type
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
250
diff
changeset
|
64 buffer->data = NULL; |
260
8e6dcacf8620
buffer: implement the concept of seeking in a buffer
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
256
diff
changeset
|
65 buffer->off = 0; |
251
5f9eebf77662
buffer: add a sinkhole buffer type
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
250
diff
changeset
|
66 buffer->used = 0; |
5f9eebf77662
buffer: add a sinkhole buffer type
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
250
diff
changeset
|
67 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
|
68 buffer->ops = &sink_buffer; |
254
de0709ff0895
buffer: add a borrowed-const-data buffer type
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
251
diff
changeset
|
69 } |
de0709ff0895
buffer: add a borrowed-const-data buffer type
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
251
diff
changeset
|
70 |
de0709ff0895
buffer: add a borrowed-const-data buffer type
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
251
diff
changeset
|
71 void buffer_init_const(struct buffer *buffer, const void *data, size_t size) |
de0709ff0895
buffer: add a borrowed-const-data buffer type
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
251
diff
changeset
|
72 { |
de0709ff0895
buffer: add a borrowed-const-data buffer type
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
251
diff
changeset
|
73 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
|
74 buffer->off = 0; |
254
de0709ff0895
buffer: add a borrowed-const-data buffer type
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
251
diff
changeset
|
75 buffer->used = size; |
de0709ff0895
buffer: add a borrowed-const-data buffer type
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
251
diff
changeset
|
76 buffer->allocsize = size; |
256
f82b45b662c9
buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
254
diff
changeset
|
77 buffer->ops = &const_buffer; |
251
5f9eebf77662
buffer: add a sinkhole buffer type
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
250
diff
changeset
|
78 } |
5f9eebf77662
buffer: add a sinkhole buffer type
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
250
diff
changeset
|
79 |
442
0d09c7592828
buffer: introduce a stdio buffer type
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
440
diff
changeset
|
80 void buffer_init_stdio(struct buffer *buffer, FILE *f) |
0d09c7592828
buffer: introduce a stdio buffer type
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
440
diff
changeset
|
81 { |
0d09c7592828
buffer: introduce a stdio buffer type
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
440
diff
changeset
|
82 buffer->data = NULL; |
0d09c7592828
buffer: introduce a stdio buffer type
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
440
diff
changeset
|
83 buffer->off = 0; |
0d09c7592828
buffer: introduce a stdio buffer type
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
440
diff
changeset
|
84 buffer->used = 0; |
0d09c7592828
buffer: introduce a stdio buffer type
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
440
diff
changeset
|
85 buffer->allocsize = SIZE_MAX; |
0d09c7592828
buffer: introduce a stdio buffer type
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
440
diff
changeset
|
86 buffer->ops = &stdio_buffer; |
0d09c7592828
buffer: introduce a stdio buffer type
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
440
diff
changeset
|
87 buffer->private = f; |
0d09c7592828
buffer: introduce a stdio buffer type
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
440
diff
changeset
|
88 } |
0d09c7592828
buffer: introduce a stdio buffer type
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
440
diff
changeset
|
89 |
250
0e4e45813eb9
buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff
changeset
|
90 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
|
91 { |
0e4e45813eb9
buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff
changeset
|
92 void *tmp; |
0e4e45813eb9
buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff
changeset
|
93 |
0e4e45813eb9
buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff
changeset
|
94 if (newsize <= buffer->allocsize) |
0e4e45813eb9
buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff
changeset
|
95 return 0; |
0e4e45813eb9
buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff
changeset
|
96 |
256
f82b45b662c9
buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
254
diff
changeset
|
97 if (!buffer->ops->realloc) |
f82b45b662c9
buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
254
diff
changeset
|
98 return -ENOTSUP; |
f82b45b662c9
buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
254
diff
changeset
|
99 |
f82b45b662c9
buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
254
diff
changeset
|
100 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
|
101 if (!tmp) |
0e4e45813eb9
buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff
changeset
|
102 return -ENOMEM; |
0e4e45813eb9
buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff
changeset
|
103 |
0e4e45813eb9
buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff
changeset
|
104 buffer->data = tmp; |
256
f82b45b662c9
buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
254
diff
changeset
|
105 buffer->allocsize = newsize; |
250
0e4e45813eb9
buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff
changeset
|
106 |
0e4e45813eb9
buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff
changeset
|
107 return 0; |
0e4e45813eb9
buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff
changeset
|
108 } |
0e4e45813eb9
buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff
changeset
|
109 |
0e4e45813eb9
buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff
changeset
|
110 int buffer_append(struct buffer *buffer, const void *data, size_t size) |
0e4e45813eb9
buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff
changeset
|
111 { |
0e4e45813eb9
buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff
changeset
|
112 int ret; |
0e4e45813eb9
buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff
changeset
|
113 |
256
f82b45b662c9
buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
254
diff
changeset
|
114 if (!buffer) |
f82b45b662c9
buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
254
diff
changeset
|
115 return -EINVAL; |
f82b45b662c9
buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
254
diff
changeset
|
116 |
278
47df3cfdeca7
buffer: allow zero length append
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
261
diff
changeset
|
117 if (!data && size) |
250
0e4e45813eb9
buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff
changeset
|
118 return -EINVAL; |
0e4e45813eb9
buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff
changeset
|
119 |
256
f82b45b662c9
buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
254
diff
changeset
|
120 if (buffer->ops->check_append) { |
f82b45b662c9
buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
254
diff
changeset
|
121 ret = buffer->ops->check_append(buffer, data, size); |
f82b45b662c9
buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
254
diff
changeset
|
122 if (ret) |
f82b45b662c9
buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
254
diff
changeset
|
123 return ret; |
f82b45b662c9
buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
254
diff
changeset
|
124 } |
f82b45b662c9
buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
254
diff
changeset
|
125 |
278
47df3cfdeca7
buffer: allow zero length append
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
261
diff
changeset
|
126 if (!size) |
47df3cfdeca7
buffer: allow zero length append
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
261
diff
changeset
|
127 return 0; /* append(..., 0) is a no-op */ |
250
0e4e45813eb9
buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff
changeset
|
128 |
256
f82b45b662c9
buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
254
diff
changeset
|
129 ret = resize(buffer, buffer->used + size); |
f82b45b662c9
buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
254
diff
changeset
|
130 if (ret) |
f82b45b662c9
buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
254
diff
changeset
|
131 return ret; |
250
0e4e45813eb9
buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff
changeset
|
132 |
256
f82b45b662c9
buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
254
diff
changeset
|
133 buffer->ops->copyin(buffer, buffer->used, data, size); |
250
0e4e45813eb9
buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff
changeset
|
134 |
0e4e45813eb9
buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff
changeset
|
135 buffer->used += size; |
0e4e45813eb9
buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff
changeset
|
136 |
0e4e45813eb9
buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff
changeset
|
137 return 0; |
0e4e45813eb9
buffer: introduce a simple growing memory buffer API
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff
changeset
|
138 } |
256
f82b45b662c9
buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
254
diff
changeset
|
139 |
260
8e6dcacf8620
buffer: implement the concept of seeking in a buffer
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
256
diff
changeset
|
140 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
|
141 { |
8e6dcacf8620
buffer: implement the concept of seeking in a buffer
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
256
diff
changeset
|
142 size_t newoff; |
8e6dcacf8620
buffer: implement the concept of seeking in a buffer
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
256
diff
changeset
|
143 |
8e6dcacf8620
buffer: implement the concept of seeking in a buffer
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
256
diff
changeset
|
144 if (!buffer) |
8e6dcacf8620
buffer: implement the concept of seeking in a buffer
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
256
diff
changeset
|
145 return -EINVAL; |
8e6dcacf8620
buffer: implement the concept of seeking in a buffer
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
256
diff
changeset
|
146 |
8e6dcacf8620
buffer: implement the concept of seeking in a buffer
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
256
diff
changeset
|
147 switch (whence) { |
8e6dcacf8620
buffer: implement the concept of seeking in a buffer
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
256
diff
changeset
|
148 case SEEK_SET: |
8e6dcacf8620
buffer: implement the concept of seeking in a buffer
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
256
diff
changeset
|
149 if (offset < 0) |
8e6dcacf8620
buffer: implement the concept of seeking in a buffer
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
256
diff
changeset
|
150 return -EINVAL; |
8e6dcacf8620
buffer: implement the concept of seeking in a buffer
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
256
diff
changeset
|
151 if (offset > buffer->used) |
8e6dcacf8620
buffer: implement the concept of seeking in a buffer
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
256
diff
changeset
|
152 return -EINVAL; |
8e6dcacf8620
buffer: implement the concept of seeking in a buffer
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
256
diff
changeset
|
153 |
8e6dcacf8620
buffer: implement the concept of seeking in a buffer
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
256
diff
changeset
|
154 newoff = offset; |
8e6dcacf8620
buffer: implement the concept of seeking in a buffer
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
256
diff
changeset
|
155 break; |
8e6dcacf8620
buffer: implement the concept of seeking in a buffer
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
256
diff
changeset
|
156 case SEEK_CUR: |
8e6dcacf8620
buffer: implement the concept of seeking in a buffer
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
256
diff
changeset
|
157 if ((offset > 0) && |
8e6dcacf8620
buffer: implement the concept of seeking in a buffer
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
256
diff
changeset
|
158 (offset > buffer->used - buffer->off)) |
8e6dcacf8620
buffer: implement the concept of seeking in a buffer
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
256
diff
changeset
|
159 return -EINVAL; |
8e6dcacf8620
buffer: implement the concept of seeking in a buffer
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
256
diff
changeset
|
160 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
|
161 return -EINVAL; |
8e6dcacf8620
buffer: implement the concept of seeking in a buffer
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
256
diff
changeset
|
162 |
8e6dcacf8620
buffer: implement the concept of seeking in a buffer
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
256
diff
changeset
|
163 newoff = buffer->off + offset; |
8e6dcacf8620
buffer: implement the concept of seeking in a buffer
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
256
diff
changeset
|
164 break; |
8e6dcacf8620
buffer: implement the concept of seeking in a buffer
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
256
diff
changeset
|
165 case SEEK_END: |
8e6dcacf8620
buffer: implement the concept of seeking in a buffer
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
256
diff
changeset
|
166 if (offset > 0) |
8e6dcacf8620
buffer: implement the concept of seeking in a buffer
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
256
diff
changeset
|
167 return -EINVAL; |
8e6dcacf8620
buffer: implement the concept of seeking in a buffer
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
256
diff
changeset
|
168 if (-offset > buffer->used) |
8e6dcacf8620
buffer: implement the concept of seeking in a buffer
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
256
diff
changeset
|
169 return -EINVAL; |
8e6dcacf8620
buffer: implement the concept of seeking in a buffer
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
256
diff
changeset
|
170 |
8e6dcacf8620
buffer: implement the concept of seeking in a buffer
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
256
diff
changeset
|
171 newoff = buffer->off + offset; |
8e6dcacf8620
buffer: implement the concept of seeking in a buffer
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
256
diff
changeset
|
172 break; |
8e6dcacf8620
buffer: implement the concept of seeking in a buffer
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
256
diff
changeset
|
173 default: |
8e6dcacf8620
buffer: implement the concept of seeking in a buffer
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
256
diff
changeset
|
174 return -EINVAL; |
8e6dcacf8620
buffer: implement the concept of seeking in a buffer
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
256
diff
changeset
|
175 } |
8e6dcacf8620
buffer: implement the concept of seeking in a buffer
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
256
diff
changeset
|
176 |
8e6dcacf8620
buffer: implement the concept of seeking in a buffer
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
256
diff
changeset
|
177 if (newoff > SSIZE_MAX) |
8e6dcacf8620
buffer: implement the concept of seeking in a buffer
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
256
diff
changeset
|
178 return -EOVERFLOW; |
8e6dcacf8620
buffer: implement the concept of seeking in a buffer
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
256
diff
changeset
|
179 |
440
df90b1b883d8
buffer: allow implementations to refuse seeks
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
278
diff
changeset
|
180 if (buffer->ops->check_seek) { |
df90b1b883d8
buffer: allow implementations to refuse seeks
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
278
diff
changeset
|
181 ssize_t ret; |
df90b1b883d8
buffer: allow implementations to refuse seeks
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
278
diff
changeset
|
182 |
df90b1b883d8
buffer: allow implementations to refuse seeks
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
278
diff
changeset
|
183 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
|
184 if (ret) |
df90b1b883d8
buffer: allow implementations to refuse seeks
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
278
diff
changeset
|
185 return ret; |
df90b1b883d8
buffer: allow implementations to refuse seeks
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
278
diff
changeset
|
186 } |
df90b1b883d8
buffer: allow implementations to refuse seeks
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
278
diff
changeset
|
187 |
260
8e6dcacf8620
buffer: implement the concept of seeking in a buffer
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
256
diff
changeset
|
188 buffer->off = newoff; |
8e6dcacf8620
buffer: implement the concept of seeking in a buffer
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
256
diff
changeset
|
189 |
8e6dcacf8620
buffer: implement the concept of seeking in a buffer
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
256
diff
changeset
|
190 return newoff; |
8e6dcacf8620
buffer: implement the concept of seeking in a buffer
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
256
diff
changeset
|
191 } |
8e6dcacf8620
buffer: implement the concept of seeking in a buffer
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
256
diff
changeset
|
192 |
261
6795f8427fed
buffer: allow buffer truncation
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
260
diff
changeset
|
193 int buffer_truncate(struct buffer *buffer, size_t size) |
6795f8427fed
buffer: allow buffer truncation
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
260
diff
changeset
|
194 { |
6795f8427fed
buffer: allow buffer truncation
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
260
diff
changeset
|
195 int ret; |
6795f8427fed
buffer: allow buffer truncation
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
260
diff
changeset
|
196 |
6795f8427fed
buffer: allow buffer truncation
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
260
diff
changeset
|
197 if (!buffer) |
6795f8427fed
buffer: allow buffer truncation
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
260
diff
changeset
|
198 return -EINVAL; |
6795f8427fed
buffer: allow buffer truncation
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
260
diff
changeset
|
199 |
6795f8427fed
buffer: allow buffer truncation
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
260
diff
changeset
|
200 if (buffer->ops->check_truncate) { |
6795f8427fed
buffer: allow buffer truncation
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
260
diff
changeset
|
201 ret = buffer->ops->check_truncate(buffer, size); |
6795f8427fed
buffer: allow buffer truncation
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
260
diff
changeset
|
202 if (ret) |
6795f8427fed
buffer: allow buffer truncation
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
260
diff
changeset
|
203 return ret; |
6795f8427fed
buffer: allow buffer truncation
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
260
diff
changeset
|
204 } |
6795f8427fed
buffer: allow buffer truncation
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
260
diff
changeset
|
205 |
6795f8427fed
buffer: allow buffer truncation
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
260
diff
changeset
|
206 ret = resize(buffer, size); |
6795f8427fed
buffer: allow buffer truncation
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
260
diff
changeset
|
207 if (ret) |
6795f8427fed
buffer: allow buffer truncation
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
260
diff
changeset
|
208 return ret; |
6795f8427fed
buffer: allow buffer truncation
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
260
diff
changeset
|
209 |
6795f8427fed
buffer: allow buffer truncation
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
260
diff
changeset
|
210 if (buffer->used < size) |
6795f8427fed
buffer: allow buffer truncation
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
260
diff
changeset
|
211 buffer->ops->clear(buffer, buffer->used, size - buffer->used); |
6795f8427fed
buffer: allow buffer truncation
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
260
diff
changeset
|
212 |
6795f8427fed
buffer: allow buffer truncation
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
260
diff
changeset
|
213 buffer->used = size; |
6795f8427fed
buffer: allow buffer truncation
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
260
diff
changeset
|
214 |
6795f8427fed
buffer: allow buffer truncation
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
260
diff
changeset
|
215 return 0; |
6795f8427fed
buffer: allow buffer truncation
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
260
diff
changeset
|
216 } |
6795f8427fed
buffer: allow buffer truncation
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
260
diff
changeset
|
217 |
256
f82b45b662c9
buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
254
diff
changeset
|
218 /* |
f82b45b662c9
buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
254
diff
changeset
|
219 * Generic implementations |
f82b45b662c9
buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
254
diff
changeset
|
220 */ |
f82b45b662c9
buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
254
diff
changeset
|
221 |
261
6795f8427fed
buffer: allow buffer truncation
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
260
diff
changeset
|
222 /* clear implementations */ |
6795f8427fed
buffer: allow buffer truncation
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
260
diff
changeset
|
223 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
|
224 { |
6795f8427fed
buffer: allow buffer truncation
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
260
diff
changeset
|
225 memset(buffer->data + off, 0, len); |
6795f8427fed
buffer: allow buffer truncation
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
260
diff
changeset
|
226 } |
6795f8427fed
buffer: allow buffer truncation
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
260
diff
changeset
|
227 |
6795f8427fed
buffer: allow buffer truncation
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
260
diff
changeset
|
228 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
|
229 { |
6795f8427fed
buffer: allow buffer truncation
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
260
diff
changeset
|
230 } |
6795f8427fed
buffer: allow buffer truncation
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
260
diff
changeset
|
231 |
6795f8427fed
buffer: allow buffer truncation
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
260
diff
changeset
|
232 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
|
233 { |
6795f8427fed
buffer: allow buffer truncation
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
260
diff
changeset
|
234 panic("buffer clear called"); |
6795f8427fed
buffer: allow buffer truncation
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
260
diff
changeset
|
235 } |
6795f8427fed
buffer: allow buffer truncation
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
260
diff
changeset
|
236 |
256
f82b45b662c9
buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
254
diff
changeset
|
237 /* copyin implementations */ |
f82b45b662c9
buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
254
diff
changeset
|
238 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
|
239 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
|
240 { |
f82b45b662c9
buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
254
diff
changeset
|
241 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
|
242 } |
f82b45b662c9
buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
254
diff
changeset
|
243 |
f82b45b662c9
buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
254
diff
changeset
|
244 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
|
245 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
|
246 { |
f82b45b662c9
buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
254
diff
changeset
|
247 } |
f82b45b662c9
buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
254
diff
changeset
|
248 |
f82b45b662c9
buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
254
diff
changeset
|
249 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
|
250 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
|
251 { |
f82b45b662c9
buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
254
diff
changeset
|
252 panic("buffer copyin called"); |
f82b45b662c9
buffer: use an ops vector to customize buffer behavior
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
254
diff
changeset
|
253 } |