bool calldata_getstring(calldata_t data, const char *name, const char **str) { uint8_t *pos; if (!data || !name || !*name) return false; if (!cd_getparam(data, name, &pos)) return false; *str = cd_serialize_string(&pos); return true; }
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)); } }
bool calldata_getdata(calldata_t data, const char *name, void *out, size_t size) { uint8_t *pos; size_t data_size; if (!data || !name || !*name) return false; if (!cd_getparam(data, name, &pos)) return false; data_size = cd_serialize_size(&pos); if (data_size != size) return false; memcpy(out, pos, size); return true; }