void calldata_set_data(calldata_t *data, const char *name, const void *in, size_t size) { uint8_t *pos = NULL; if (!data || !name || !*name) return; if (!data->fixed && !data->stack) { cd_set_first_param(data, name, in, size); return; } if (cd_getparam(data, name, &pos)) { size_t cur_size; memcpy(&cur_size, pos, sizeof(size_t)); if (cur_size < size) { size_t offset = size - cur_size; size_t bytes = data->size; if (!cd_ensure_capacity(data, &pos, bytes + offset)) return; memmove(pos+offset, pos, bytes - (pos - data->stack)); data->size += offset; } else if (cur_size > size) { size_t offset = cur_size - size; size_t bytes = data->size - offset; memmove(pos, pos+offset, bytes - (pos - data->stack)); data->size -= offset; } cd_copy_data(&pos, in, size); } else { size_t name_len = strlen(name)+1; size_t offset = name_len + size + sizeof(size_t)*2; if (!cd_ensure_capacity(data, &pos, data->size + offset)) return; data->size += offset; cd_copy_string(&pos, name, 0); cd_copy_data(&pos, in, size); memset(pos, 0, sizeof(size_t)); } }
static inline void cd_set_first_param(calldata_t data, const char *name, const void *in, size_t size) { uint8_t *pos; size_t capacity; size_t name_len = strlen(name)+1; capacity = sizeof(size_t)*3 + name_len + size; data->size = capacity; if (capacity < 128) capacity = 128; data->capacity = capacity; data->stack = bmalloc(capacity); pos = data->stack; cd_copy_string(&pos, name, name_len); cd_copy_data(&pos, in, size); *(size_t*)pos = 0; }