+ assert (val_type_from_width (old_width) == val_type_from_width (new_width));
+
+ /* We need to call value_resize if either the new width is
+ longer than the old width (in which case the new characters
+ must be set to spaces) or if either width is a long string.
+ (We could omit resizing if both the old and new widths were
+ long and the new width was shorter, but we choose to do so
+ anyway in hopes of saving memory.) */
+ return (old_width != new_width
+ && (new_width > old_width
+ || old_width > MAX_SHORT_STRING
+ || new_width > MAX_SHORT_STRING));
+}
+
+/* Same as value_init, 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_init_pool (struct pool *pool, union value *value, int width)
+{
+ 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);