+ if (width > MAX_SHORT_STRING)
+ value->long_string = pool_alloc_unaligned (pool, width);
+}
+
+/* Same as value_clone(), except that memory for VALUE (if necessary) is
+ allocated from POOL and will be freed automatically when POOL is destroyed.
+
+ VALUE must not be freed manually by calling value_destroy(). If it needs to
+ be resized, it must be done using value_resize_pool() instead of
+ value_resize(). */
+void
+value_clone_pool (struct pool *pool,
+ union value *value, const union value *src, int width)
+{
+ if (width > MAX_SHORT_STRING)
+ value->long_string = pool_clone_unaligned (pool, src->long_string, width);
+ else
+ *value = *src;
+}
+
+/* Same as value_resize, except that VALUE must have been
+ allocated from POOL using value_init_pool.
+
+ This function causes some memory in POOL to be wasted in some
+ cases (until the pool is freed), so it should only be done if
+ this is acceptable. */
+void
+value_resize_pool (struct pool *pool, union value *value,
+ int old_width, int new_width)
+{
+ assert (value_is_resizable (value, old_width, new_width));
+ if (new_width > old_width)
+ {
+ if (new_width > MAX_SHORT_STRING)
+ {
+ uint8_t *new_long_string = pool_alloc_unaligned (pool, new_width);
+ memcpy (new_long_string, value_str (value, old_width), old_width);
+ value->long_string = new_long_string;
+ }
+ memset (value_str_rw (value, new_width) + old_width, ' ',
+ new_width - old_width);
+ }