X-Git-Url: https://sigrok.org/gitweb/?a=blobdiff_plain;f=datastore.c;h=c7ace06faee0b104addce464750b2c4d044f6e4a;hb=59df0c77e2906323290544ea62801831818ec096;hp=683a8abef1f3d7a65b99af5edc2ecb2d1cb8239f;hpb=afc8e4deb68271ba7696e38cc02053b97cfc1a19;p=libsigrok.git diff --git a/datastore.c b/datastore.c index 683a8abe..c7ace06f 100644 --- a/datastore.c +++ b/datastore.c @@ -21,85 +21,93 @@ #include #include #include -#include "sigrok.h" +#include -static gpointer new_chunk(struct datastore **ds); +static gpointer new_chunk(struct sr_datastore **ds); +int sr_datastore_new(int unitsize, struct sr_datastore **ds) +{ + if (!ds) + return SR_ERR; + if (unitsize <= 0) + return SR_ERR; /* TODO: Different error? */ -struct datastore *datastore_new(int unitsize) -{ - struct datastore *ds; + if (!(*ds = g_malloc(sizeof(struct sr_datastore)))) + return SR_ERR_MALLOC; - ds = g_malloc(sizeof(struct datastore)); - ds->ds_unitsize = unitsize; - ds->num_units = 0; - ds->chunklist = NULL; + (*ds)->ds_unitsize = unitsize; + (*ds)->num_units = 0; + (*ds)->chunklist = NULL; - return ds; + return SR_OK; } - -void datastore_destroy(struct datastore *ds) +int sr_datastore_destroy(struct sr_datastore *ds) { GSList *chunk; - for(chunk = ds->chunklist; chunk; chunk = chunk->next) + if (!ds) + return SR_ERR; + + for (chunk = ds->chunklist; chunk; chunk = chunk->next) g_free(chunk->data); g_slist_free(ds->chunklist); g_free(ds); + return SR_OK; } - -void datastore_put(struct datastore *ds, void *data, unsigned int length, int in_unitsize, int *probelist) +void sr_datastore_put(struct sr_datastore *ds, void *data, unsigned int length, + int in_unitsize, int *probelist) { unsigned int stored; int capacity, size, num_chunks, chunk_bytes_free, chunk_offset; gpointer chunk; - /* QUICK HACK */ + /* Avoid compiler warnings. */ in_unitsize = in_unitsize; probelist = probelist; - if(ds->chunklist == NULL) + if (ds->chunklist == NULL) chunk = new_chunk(&ds); else chunk = g_slist_last(ds->chunklist)->data; + num_chunks = g_slist_length(ds->chunklist); capacity = (num_chunks * DATASTORE_CHUNKSIZE); chunk_bytes_free = capacity - (ds->ds_unitsize * ds->num_units); - chunk_offset = capacity - (DATASTORE_CHUNKSIZE * (num_chunks - 1)) - chunk_bytes_free; + chunk_offset = capacity - (DATASTORE_CHUNKSIZE * (num_chunks - 1)) + - chunk_bytes_free; stored = 0; - while(stored < length) { - if(chunk_bytes_free == 0) { + while (stored < length) { + if (chunk_bytes_free == 0) { chunk = new_chunk(&ds); chunk_bytes_free = DATASTORE_CHUNKSIZE; chunk_offset = 0; } - if(length - stored > (unsigned int)chunk_bytes_free) + if (length - stored > (unsigned int)chunk_bytes_free) size = chunk_bytes_free; else - /* last part, won't fill up this chunk */ + /* Last part, won't fill up this chunk. */ size = length - stored; + memcpy(chunk + chunk_offset, data + stored, size); chunk_bytes_free -= size; stored += size; } ds->num_units += stored / ds->ds_unitsize; - } - -static gpointer new_chunk(struct datastore **ds) +static gpointer new_chunk(struct sr_datastore **ds) { gpointer chunk; - chunk = g_malloc(DATASTORE_CHUNKSIZE * (*ds)->ds_unitsize); + if (!(chunk = malloc(DATASTORE_CHUNKSIZE * (*ds)->ds_unitsize))) + return NULL; + (*ds)->chunklist = g_slist_append((*ds)->chunklist, chunk); return chunk; } - -