AmendHub

Download:

jcs

/

subtext

/

amendments

/

111

bile: Allow shallow unmarshalling

When quickly iterating over a bunch of objects, it's useful to be
able to avoid all the malloc/free of unmarshalling objects that have
dynamic-length strings

jcs made amendment 111 about 1 year ago
--- bile.c Sun May 22 21:14:06 2022 +++ bile.c Wed Jun 1 16:39:17 2022 @@ -590,7 +590,7 @@ bile_marshall_object(struct bile *bile, { char *data, *ptr; size_t size = 0, fsize = 0, n; - bool write = 0; + bool write = false; if (ret == NULL) panic("bile_pack_object invalid ret"); @@ -638,7 +638,7 @@ iterate_fields: if (!write) { data = xmalloc(size); - write = 1; + write = true; size = 0; goto iterate_fields; } @@ -652,7 +652,7 @@ iterate_fields: short bile_unmarshall_object(struct bile *bile, const struct bile_object_field *fields, const size_t nfields, - const char *data, const size_t size, void *object) + const char *data, const size_t size, void *object, bool deep) { size_t off, fsize = 0, n; char *ptr, *dptr; @@ -671,13 +671,17 @@ bile_unmarshall_object(struct bile *bile, ptr = (char *)object + fields[n].struct_off; - if (fields[n].size < 0) { + if (fields[n].size < 0 && deep) { dptr = xmalloc(fsize); memcpy(ptr, &dptr, sizeof(dptr)); ptr = dptr; } - memcpy(ptr, data + off, fsize); + if (fields[n].size < 0 && !deep) + memset(ptr, 0, sizeof(dptr)); + else + memcpy(ptr, data + off, fsize); + off += fsize; } @@ -855,7 +859,7 @@ bile_write_map(struct bile *bile) new_map_size = BILE_OBJECT_SIZE * new_nobjects; new_map_obj = bile_alloc(bile, BILE_TYPE_MAP, new_map_id, new_map_size); - new_map = xmallocarray(BILE_OBJECT_SIZE, new_nobjects); + new_map = xcalloc(BILE_OBJECT_SIZE, new_nobjects); for (n = 0, new_nobjects = 0; n < bile->nobjects; n++) { obj = &bile->map[n]; @@ -977,7 +981,7 @@ bile_xwriteat(struct bile *bile, const size_t pos, con void bile_sort_by_pos(struct bile *bile) { - size_t n, j; + ssize_t n, j; struct bile_object o; if (bile == NULL) --- bile.h Sat May 21 21:49:37 2022 +++ bile.h Wed May 25 13:35:51 2022 @@ -133,6 +133,6 @@ short bile_marshall_object(struct bile *bile, short bile_unmarshall_object(struct bile *bile, const struct bile_object_field *fields, const size_t nfields, const char *data, - const size_t size, void *object); + const size_t size, void *object, bool deep); #endif