summaryrefslogtreecommitdiffstats
path: root/common
diff options
context:
space:
mode:
authorAlexander Larsson <alexl@redhat.com>2010-07-06 14:39:15 +0200
committerAlexander Larsson <alexl@redhat.com>2010-07-07 23:10:47 +0200
commita415c557657c2009798d086b229c17ac0d47a978 (patch)
treec4732d09b7fb8c54138f43234ebe6a883b42875f /common
parentf39d64f40bca094396d5002dcfcd38eaa281c9af (diff)
downloadspice-a415c557657c2009798d086b229c17ac0d47a978.tar.gz
spice-a415c557657c2009798d086b229c17ac0d47a978.tar.xz
spice-a415c557657c2009798d086b229c17ac0d47a978.zip
Add spice_chunks_* helpers
Diffstat (limited to 'common')
-rw-r--r--common/mem.c59
-rw-r--r--common/mem.h5
2 files changed, 64 insertions, 0 deletions
diff --git a/common/mem.c b/common/mem.c
index ffb2fa45..427ab43f 100644
--- a/common/mem.c
+++ b/common/mem.c
@@ -178,3 +178,62 @@ void *spice_realloc_n(void *mem, size_t n_blocks, size_t n_block_bytes)
return spice_realloc(mem, n_blocks * n_block_bytes);
}
+
+SpiceChunks *spice_chunks_new(uint32_t count)
+{
+ SpiceChunks *chunks;
+
+ chunks = (SpiceChunks *)spice_malloc_n_m(count, sizeof(SpiceChunk), sizeof(SpiceChunks));
+ chunks->flags = 0;
+ chunks->num_chunks = count;
+
+ return chunks;
+}
+
+SpiceChunks *spice_chunks_new_linear(uint8_t *data, uint32_t len)
+{
+ SpiceChunks *chunks;
+
+ chunks = spice_chunks_new(1);
+ chunks->data_size = chunks->chunk[0].len = len;
+ chunks->chunk[0].data = data;
+ return chunks;
+}
+
+void spice_chunks_destroy(SpiceChunks *chunks)
+{
+ int i;
+
+ if (chunks->flags & SPICE_CHUNKS_FLAGS_FREE) {
+ for (i = 0; i < chunks->num_chunks; i++) {
+ free(chunks->chunk[i].data);
+ }
+ }
+
+ free(chunks);
+}
+
+void spice_chunks_linearize(SpiceChunks *chunks)
+{
+ uint8_t *data, *p;
+ int i;
+
+ if (chunks->num_chunks > 1) {
+ data = (uint8_t*)spice_malloc(chunks->data_size);
+ for (p = data, i = 0; i < chunks->num_chunks; i++) {
+ memcpy(p, chunks->chunk[i].data,
+ chunks->chunk[i].len);
+ p += chunks->chunk[i].len;
+ }
+ if (chunks->flags & SPICE_CHUNKS_FLAGS_FREE) {
+ for (i = 0; i < chunks->num_chunks; i++) {
+ free(chunks->chunk[i].data);
+ }
+ }
+ chunks->num_chunks = 1;
+ chunks->flags |= SPICE_CHUNKS_FLAGS_FREE;
+ chunks->flags &= ~SPICE_CHUNKS_FLAGS_UNSTABLE;
+ chunks->chunk[0].data = data;
+ chunks->chunk[0].len = chunks->data_size;
+ }
+}
diff --git a/common/mem.h b/common/mem.h
index 9b257ade..ebf2fb8c 100644
--- a/common/mem.h
+++ b/common/mem.h
@@ -21,6 +21,7 @@
#include <stdlib.h>
#include <spice/macros.h>
+#include <spice/draw.h> /* for SpiceChunks, temporary */
char *spice_strdup(const char *str) SPICE_GNUC_MALLOC;
char *spice_strndup(const char *str, size_t n_bytes) SPICE_GNUC_MALLOC;
@@ -32,6 +33,10 @@ void *spice_malloc_n(size_t n_blocks, size_t n_block_bytes) SPICE_GNUC_MALLOC SP
void *spice_malloc_n_m(size_t n_blocks, size_t n_block_bytes, size_t extra_size) SPICE_GNUC_MALLOC;
void *spice_malloc0_n(size_t n_blocks, size_t n_block_bytes) SPICE_GNUC_MALLOC SPICE_GNUC_ALLOC_SIZE2(1,2);
void *spice_realloc_n(void *mem, size_t n_blocks, size_t n_block_bytes) SPICE_GNUC_WARN_UNUSED_RESULT;
+SpiceChunks *spice_chunks_new(uint32_t count) SPICE_GNUC_MALLOC;
+SpiceChunks *spice_chunks_new_linear(uint8_t *data, uint32_t len) SPICE_GNUC_MALLOC;
+void spice_chunks_destroy(SpiceChunks *chunks);
+void spice_chunks_linearize(SpiceChunks *chunks);
size_t spice_strnlen(const char *str, size_t max_len);