Rename decode_io_writer methods to transform_io
diff --git a/doc/changelog.md b/doc/changelog.md
index 5f54bdf..0f07ac9 100644
--- a/doc/changelog.md
+++ b/doc/changelog.md
@@ -3,6 +3,7 @@
 
 ## Work In Progress
 
+- Renamed `decode_io_writer?` methods to `transform_io?`.
 - Added interfaces.
 - Renamed warnings to notes.
 - Made `wuffs_base__pixel_format` a struct.
diff --git a/doc/std/README.md b/doc/std/README.md
index 17c5a2f..d6e52e2 100644
--- a/doc/std/README.md
+++ b/doc/std/README.md
@@ -11,20 +11,20 @@
 The general pattern is that a package `foo` (e.g. `jpeg`, `png`) contains a
 struct `bar` (e.g. `hasher`, `decoder`, etc) that implements a
 package-independent interface. For example, every compression decoder struct
-would have a `decode_io_writer` method. In C, this would be invoked as
+would have a `transform_io` method. In C, this would be invoked as
 
 ```
 // Allocate and initialize the struct.
 wuffs_foo__decoder* dec = etc;
 
 // Do the work. Error checking is not shown, for brevity.
-const char* status = wuffs_foo__decoder__decode_io_writer(dec, etc);
+const char* status = wuffs_foo__decoder__transform_io(dec, etc);
 ```
 
 When that C library is used as C++, that last line can be shortened:
 
 ```
-const char* status = dec->decode_io_writer(etc);
+const char* status = dec->transform_io(etc);
 ```
 
 See also the [glossary](/doc/glossary.md), as well as the notes on:
diff --git a/doc/std/compression-decoders.md b/doc/std/compression-decoders.md
index 9fe447a..8dac8e4 100644
--- a/doc/std/compression-decoders.md
+++ b/doc/std/compression-decoders.md
@@ -2,10 +2,8 @@
 
 Compression decoders read from one input stream (an `io_reader` called `src`)
 and write to an output stream (an `io_writer` called `dst`). Wuffs'
-implementations have one key method: `decode_io_writer`, named after the
-operation (decoding) and the type of the destination (an
-[`io_writer`](/doc/note/io-input-output.md)). It incrementally decompresses the
-source data.
+implementations have one key method: `transform_io`. It incrementally
+decompresses the source data.
 
 This method is a [coroutine](/doc/note/coroutines.md), and does not require
 either all of the input or all of the output to fit in a single contiguous
diff --git a/example/library/library.c b/example/library/library.c
index 0fa24d9..4cc426c 100644
--- a/example/library/library.c
+++ b/example/library/library.c
@@ -105,7 +105,7 @@
     free(dec);
     return wuffs_base__status__message(&status);
   }
-  status = wuffs_gzip__decoder__decode_io_writer(
+  status = wuffs_gzip__decoder__transform_io(
       dec, &dst, &src,
       wuffs_base__make_slice_u8(work_buffer, WORK_BUFFER_SIZE));
   if (!wuffs_base__status__is_ok(&status)) {
diff --git a/example/zcat/zcat.c b/example/zcat/zcat.c
index c7a1dfa..6cc9031 100644
--- a/example/zcat/zcat.c
+++ b/example/zcat/zcat.c
@@ -123,7 +123,7 @@
     }
 
     while (true) {
-      status = wuffs_gzip__decoder__decode_io_writer(
+      status = wuffs_gzip__decoder__transform_io(
           &dec, &dst, &src,
           wuffs_base__make_slice_u8(work_buffer, WORK_BUFFER_SIZE));
 
diff --git a/fuzz/c/std/zlib_fuzzer.c b/fuzz/c/std/zlib_fuzzer.c
index 80a75a2..785aa14 100644
--- a/fuzz/c/std/zlib_fuzzer.c
+++ b/fuzz/c/std/zlib_fuzzer.c
@@ -84,17 +84,16 @@
 
   while (true) {
     dst.meta.wi = 0;
-    status = wuffs_zlib__decoder__decode_io_writer(&dec, &dst, src,
-                                                   ((wuffs_base__slice_u8){
-                                                       .ptr = work_buffer,
-                                                       .len = WORK_BUFFER_SIZE,
-                                                   }));
+    status = wuffs_zlib__decoder__transform_io(&dec, &dst, src,
+                                               ((wuffs_base__slice_u8){
+                                                   .ptr = work_buffer,
+                                                   .len = WORK_BUFFER_SIZE,
+                                               }));
     if (status.repr != wuffs_base__suspension__short_write) {
       break;
     }
     if (dst.meta.wi == 0) {
-      fprintf(stderr,
-              "wuffs_zlib__decoder__decode_io_writer made no progress\n");
+      fprintf(stderr, "wuffs_zlib__decoder__transform_io made no progress\n");
       intentional_segfault();
     }
   }
diff --git a/release/c/wuffs-unsupported-snapshot.c b/release/c/wuffs-unsupported-snapshot.c
index 93cbc3c..4ba7ac8 100644
--- a/release/c/wuffs-unsupported-snapshot.c
+++ b/release/c/wuffs-unsupported-snapshot.c
@@ -2901,10 +2901,10 @@
 wuffs_deflate__decoder__workbuf_len(const wuffs_deflate__decoder* self);
 
 WUFFS_BASE__MAYBE_STATIC wuffs_base__status  //
-wuffs_deflate__decoder__decode_io_writer(wuffs_deflate__decoder* self,
-                                         wuffs_base__io_buffer* a_dst,
-                                         wuffs_base__io_buffer* a_src,
-                                         wuffs_base__slice_u8 a_workbuf);
+wuffs_deflate__decoder__transform_io(wuffs_deflate__decoder* self,
+                                     wuffs_base__io_buffer* a_dst,
+                                     wuffs_base__io_buffer* a_src,
+                                     wuffs_base__slice_u8 a_workbuf);
 
 // ---------------- Struct Definitions
 
@@ -2934,7 +2934,7 @@
     uint32_t f_n_huffs_bits[2];
     bool f_end_of_block;
 
-    uint32_t p_decode_io_writer[1];
+    uint32_t p_transform_io[1];
     uint32_t p_decode_blocks[1];
     uint32_t p_decode_uncompressed[1];
     uint32_t p_init_dynamic_huffman[1];
@@ -3021,11 +3021,10 @@
   }
 
   inline wuffs_base__status  //
-  decode_io_writer(wuffs_base__io_buffer* a_dst,
-                   wuffs_base__io_buffer* a_src,
-                   wuffs_base__slice_u8 a_workbuf) {
-    return wuffs_deflate__decoder__decode_io_writer(this, a_dst, a_src,
-                                                    a_workbuf);
+  transform_io(wuffs_base__io_buffer* a_dst,
+               wuffs_base__io_buffer* a_src,
+               wuffs_base__slice_u8 a_workbuf) {
+    return wuffs_deflate__decoder__transform_io(this, a_dst, a_src, a_workbuf);
   }
 
 #endif  // __cplusplus
@@ -3082,10 +3081,10 @@
 wuffs_lzw__decoder__workbuf_len(const wuffs_lzw__decoder* self);
 
 WUFFS_BASE__MAYBE_STATIC wuffs_base__status  //
-wuffs_lzw__decoder__decode_io_writer(wuffs_lzw__decoder* self,
-                                     wuffs_base__io_buffer* a_dst,
-                                     wuffs_base__io_buffer* a_src,
-                                     wuffs_base__slice_u8 a_workbuf);
+wuffs_lzw__decoder__transform_io(wuffs_lzw__decoder* self,
+                                 wuffs_base__io_buffer* a_dst,
+                                 wuffs_base__io_buffer* a_src,
+                                 wuffs_base__slice_u8 a_workbuf);
 
 WUFFS_BASE__MAYBE_STATIC wuffs_base__slice_u8  //
 wuffs_lzw__decoder__flush(wuffs_lzw__decoder* self);
@@ -3126,7 +3125,7 @@
     uint32_t f_read_from_return_value;
     uint16_t f_prefixes[4096];
 
-    uint32_t p_decode_io_writer[1];
+    uint32_t p_transform_io[1];
     uint32_t p_write_to[1];
   } private_impl;
 
@@ -3175,10 +3174,10 @@
   }
 
   inline wuffs_base__status  //
-  decode_io_writer(wuffs_base__io_buffer* a_dst,
-                   wuffs_base__io_buffer* a_src,
-                   wuffs_base__slice_u8 a_workbuf) {
-    return wuffs_lzw__decoder__decode_io_writer(this, a_dst, a_src, a_workbuf);
+  transform_io(wuffs_base__io_buffer* a_dst,
+               wuffs_base__io_buffer* a_src,
+               wuffs_base__slice_u8 a_workbuf) {
+    return wuffs_lzw__decoder__transform_io(this, a_dst, a_src, a_workbuf);
   }
 
   inline wuffs_base__slice_u8  //
@@ -3609,10 +3608,10 @@
 wuffs_gzip__decoder__workbuf_len(const wuffs_gzip__decoder* self);
 
 WUFFS_BASE__MAYBE_STATIC wuffs_base__status  //
-wuffs_gzip__decoder__decode_io_writer(wuffs_gzip__decoder* self,
-                                      wuffs_base__io_buffer* a_dst,
-                                      wuffs_base__io_buffer* a_src,
-                                      wuffs_base__slice_u8 a_workbuf);
+wuffs_gzip__decoder__transform_io(wuffs_gzip__decoder* self,
+                                  wuffs_base__io_buffer* a_dst,
+                                  wuffs_base__io_buffer* a_src,
+                                  wuffs_base__slice_u8 a_workbuf);
 
 // ---------------- Struct Definitions
 
@@ -3638,7 +3637,7 @@
 
     bool f_ignore_checksum;
 
-    uint32_t p_decode_io_writer[1];
+    uint32_t p_transform_io[1];
   } private_impl;
 
   struct {
@@ -3651,7 +3650,7 @@
       uint32_t v_decoded_length_got;
       uint32_t v_checksum_want;
       uint64_t scratch;
-    } s_decode_io_writer[1];
+    } s_transform_io[1];
   } private_data;
 
 #ifdef __cplusplus
@@ -3692,10 +3691,10 @@
   }
 
   inline wuffs_base__status  //
-  decode_io_writer(wuffs_base__io_buffer* a_dst,
-                   wuffs_base__io_buffer* a_src,
-                   wuffs_base__slice_u8 a_workbuf) {
-    return wuffs_gzip__decoder__decode_io_writer(this, a_dst, a_src, a_workbuf);
+  transform_io(wuffs_base__io_buffer* a_dst,
+               wuffs_base__io_buffer* a_src,
+               wuffs_base__slice_u8 a_workbuf) {
+    return wuffs_gzip__decoder__transform_io(this, a_dst, a_src, a_workbuf);
   }
 
 #endif  // __cplusplus
@@ -3764,10 +3763,10 @@
 wuffs_zlib__decoder__workbuf_len(const wuffs_zlib__decoder* self);
 
 WUFFS_BASE__MAYBE_STATIC wuffs_base__status  //
-wuffs_zlib__decoder__decode_io_writer(wuffs_zlib__decoder* self,
-                                      wuffs_base__io_buffer* a_dst,
-                                      wuffs_base__io_buffer* a_src,
-                                      wuffs_base__slice_u8 a_workbuf);
+wuffs_zlib__decoder__transform_io(wuffs_zlib__decoder* self,
+                                  wuffs_base__io_buffer* a_dst,
+                                  wuffs_base__io_buffer* a_src,
+                                  wuffs_base__slice_u8 a_workbuf);
 
 // ---------------- Struct Definitions
 
@@ -3799,7 +3798,7 @@
     uint32_t f_dict_id_got;
     uint32_t f_dict_id_want;
 
-    uint32_t p_decode_io_writer[1];
+    uint32_t p_transform_io[1];
   } private_impl;
 
   struct {
@@ -3810,7 +3809,7 @@
     struct {
       uint32_t v_checksum_got;
       uint64_t scratch;
-    } s_decode_io_writer[1];
+    } s_transform_io[1];
   } private_data;
 
 #ifdef __cplusplus
@@ -3861,10 +3860,10 @@
   }
 
   inline wuffs_base__status  //
-  decode_io_writer(wuffs_base__io_buffer* a_dst,
-                   wuffs_base__io_buffer* a_src,
-                   wuffs_base__slice_u8 a_workbuf) {
-    return wuffs_zlib__decoder__decode_io_writer(this, a_dst, a_src, a_workbuf);
+  transform_io(wuffs_base__io_buffer* a_dst,
+               wuffs_base__io_buffer* a_src,
+               wuffs_base__slice_u8 a_workbuf) {
+    return wuffs_zlib__decoder__transform_io(this, a_dst, a_src, a_workbuf);
   }
 
 #endif  // __cplusplus
@@ -6353,13 +6352,13 @@
   return wuffs_base__utility__make_range_ii_u64(1, 1);
 }
 
-// -------- func deflate.decoder.decode_io_writer
+// -------- func deflate.decoder.transform_io
 
 WUFFS_BASE__MAYBE_STATIC wuffs_base__status  //
-wuffs_deflate__decoder__decode_io_writer(wuffs_deflate__decoder* self,
-                                         wuffs_base__io_buffer* a_dst,
-                                         wuffs_base__io_buffer* a_src,
-                                         wuffs_base__slice_u8 a_workbuf) {
+wuffs_deflate__decoder__transform_io(wuffs_deflate__decoder* self,
+                                     wuffs_base__io_buffer* a_dst,
+                                     wuffs_base__io_buffer* a_src,
+                                     wuffs_base__slice_u8 a_workbuf) {
   if (!self) {
     return wuffs_base__make_status(wuffs_base__error__bad_receiver);
   }
@@ -6399,7 +6398,7 @@
     }
   }
 
-  uint32_t coro_susp_point = self->private_impl.p_decode_io_writer[0];
+  uint32_t coro_susp_point = self->private_impl.p_transform_io[0];
   if (coro_susp_point) {
   }
   switch (coro_susp_point) {
@@ -6438,13 +6437,13 @@
 
     goto ok;
   ok:
-    self->private_impl.p_decode_io_writer[0] = 0;
+    self->private_impl.p_transform_io[0] = 0;
     goto exit;
   }
 
   goto suspend;
 suspend:
-  self->private_impl.p_decode_io_writer[0] =
+  self->private_impl.p_transform_io[0] =
       wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
   self->private_impl.active_coroutine =
       wuffs_base__status__is_suspension(&status) ? 1 : 0;
@@ -8144,13 +8143,13 @@
   return wuffs_base__utility__make_range_ii_u64(0, 0);
 }
 
-// -------- func lzw.decoder.decode_io_writer
+// -------- func lzw.decoder.transform_io
 
 WUFFS_BASE__MAYBE_STATIC wuffs_base__status  //
-wuffs_lzw__decoder__decode_io_writer(wuffs_lzw__decoder* self,
-                                     wuffs_base__io_buffer* a_dst,
-                                     wuffs_base__io_buffer* a_src,
-                                     wuffs_base__slice_u8 a_workbuf) {
+wuffs_lzw__decoder__transform_io(wuffs_lzw__decoder* self,
+                                 wuffs_base__io_buffer* a_dst,
+                                 wuffs_base__io_buffer* a_src,
+                                 wuffs_base__slice_u8 a_workbuf) {
   if (!self) {
     return wuffs_base__make_status(wuffs_base__error__bad_receiver);
   }
@@ -8175,7 +8174,7 @@
 
   uint32_t v_i = 0;
 
-  uint32_t coro_susp_point = self->private_impl.p_decode_io_writer[0];
+  uint32_t coro_susp_point = self->private_impl.p_transform_io[0];
   if (coro_susp_point) {
   }
   switch (coro_susp_point) {
@@ -8232,13 +8231,13 @@
 
     goto ok;
   ok:
-    self->private_impl.p_decode_io_writer[0] = 0;
+    self->private_impl.p_transform_io[0] = 0;
     goto exit;
   }
 
   goto suspend;
 suspend:
-  self->private_impl.p_decode_io_writer[0] =
+  self->private_impl.p_transform_io[0] =
       wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
   self->private_impl.active_coroutine =
       wuffs_base__status__is_suspension(&status) ? 1 : 0;
@@ -10967,7 +10966,7 @@
           v_mark = ((uint64_t)(iop_v_r - io0_v_r));
           {
             u_r.meta.ri = ((size_t)(iop_v_r - u_r.data.ptr));
-            wuffs_base__status t_1 = wuffs_lzw__decoder__decode_io_writer(
+            wuffs_base__status t_1 = wuffs_lzw__decoder__transform_io(
                 &self->private_data.f_lzw, &empty_io_buffer, v_r,
                 wuffs_base__utility__empty_slice_u8());
             iop_v_r = u_r.data.ptr + u_r.meta.ri;
@@ -11361,13 +11360,13 @@
   return wuffs_base__utility__make_range_ii_u64(1, 1);
 }
 
-// -------- func gzip.decoder.decode_io_writer
+// -------- func gzip.decoder.transform_io
 
 WUFFS_BASE__MAYBE_STATIC wuffs_base__status  //
-wuffs_gzip__decoder__decode_io_writer(wuffs_gzip__decoder* self,
-                                      wuffs_base__io_buffer* a_dst,
-                                      wuffs_base__io_buffer* a_src,
-                                      wuffs_base__slice_u8 a_workbuf) {
+wuffs_gzip__decoder__transform_io(wuffs_gzip__decoder* self,
+                                  wuffs_base__io_buffer* a_dst,
+                                  wuffs_base__io_buffer* a_src,
+                                  wuffs_base__slice_u8 a_workbuf) {
   if (!self) {
     return wuffs_base__make_status(wuffs_base__error__bad_receiver);
   }
@@ -11424,13 +11423,13 @@
     io2_a_src = io0_a_src + a_src->meta.wi;
   }
 
-  uint32_t coro_susp_point = self->private_impl.p_decode_io_writer[0];
+  uint32_t coro_susp_point = self->private_impl.p_transform_io[0];
   if (coro_susp_point) {
-    v_flags = self->private_data.s_decode_io_writer[0].v_flags;
-    v_checksum_got = self->private_data.s_decode_io_writer[0].v_checksum_got;
+    v_flags = self->private_data.s_transform_io[0].v_flags;
+    v_checksum_got = self->private_data.s_transform_io[0].v_checksum_got;
     v_decoded_length_got =
-        self->private_data.s_decode_io_writer[0].v_decoded_length_got;
-    v_checksum_want = self->private_data.s_decode_io_writer[0].v_checksum_want;
+        self->private_data.s_transform_io[0].v_decoded_length_got;
+    v_checksum_want = self->private_data.s_transform_io[0].v_checksum_want;
   }
   switch (coro_susp_point) {
     WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
@@ -11484,17 +11483,17 @@
       uint8_t t_3 = *iop_a_src++;
       v_flags = t_3;
     }
-    self->private_data.s_decode_io_writer[0].scratch = 6;
+    self->private_data.s_transform_io[0].scratch = 6;
     WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5);
-    if (self->private_data.s_decode_io_writer[0].scratch >
+    if (self->private_data.s_transform_io[0].scratch >
         ((uint64_t)(io2_a_src - iop_a_src))) {
-      self->private_data.s_decode_io_writer[0].scratch -=
+      self->private_data.s_transform_io[0].scratch -=
           ((uint64_t)(io2_a_src - iop_a_src));
       iop_a_src = io2_a_src;
       status = wuffs_base__make_status(wuffs_base__suspension__short_read);
       goto suspend;
     }
-    iop_a_src += self->private_data.s_decode_io_writer[0].scratch;
+    iop_a_src += self->private_data.s_transform_io[0].scratch;
     if ((v_flags & 4) != 0) {
       {
         WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6);
@@ -11503,7 +11502,7 @@
           t_4 = wuffs_base__load_u16le(iop_a_src);
           iop_a_src += 2;
         } else {
-          self->private_data.s_decode_io_writer[0].scratch = 0;
+          self->private_data.s_transform_io[0].scratch = 0;
           WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7);
           while (true) {
             if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
@@ -11511,8 +11510,7 @@
                   wuffs_base__make_status(wuffs_base__suspension__short_read);
               goto suspend;
             }
-            uint64_t* scratch =
-                &self->private_data.s_decode_io_writer[0].scratch;
+            uint64_t* scratch = &self->private_data.s_transform_io[0].scratch;
             uint32_t num_bits_4 = ((uint32_t)(*scratch >> 56));
             *scratch <<= 8;
             *scratch >>= 8;
@@ -11527,17 +11525,17 @@
         }
         v_xlen = t_4;
       }
-      self->private_data.s_decode_io_writer[0].scratch = ((uint32_t)(v_xlen));
+      self->private_data.s_transform_io[0].scratch = ((uint32_t)(v_xlen));
       WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8);
-      if (self->private_data.s_decode_io_writer[0].scratch >
+      if (self->private_data.s_transform_io[0].scratch >
           ((uint64_t)(io2_a_src - iop_a_src))) {
-        self->private_data.s_decode_io_writer[0].scratch -=
+        self->private_data.s_transform_io[0].scratch -=
             ((uint64_t)(io2_a_src - iop_a_src));
         iop_a_src = io2_a_src;
         status = wuffs_base__make_status(wuffs_base__suspension__short_read);
         goto suspend;
       }
-      iop_a_src += self->private_data.s_decode_io_writer[0].scratch;
+      iop_a_src += self->private_data.s_transform_io[0].scratch;
     }
     if ((v_flags & 8) != 0) {
       while (true) {
@@ -11576,17 +11574,17 @@
     label_1_break:;
     }
     if ((v_flags & 2) != 0) {
-      self->private_data.s_decode_io_writer[0].scratch = 2;
+      self->private_data.s_transform_io[0].scratch = 2;
       WUFFS_BASE__COROUTINE_SUSPENSION_POINT(11);
-      if (self->private_data.s_decode_io_writer[0].scratch >
+      if (self->private_data.s_transform_io[0].scratch >
           ((uint64_t)(io2_a_src - iop_a_src))) {
-        self->private_data.s_decode_io_writer[0].scratch -=
+        self->private_data.s_transform_io[0].scratch -=
             ((uint64_t)(io2_a_src - iop_a_src));
         iop_a_src = io2_a_src;
         status = wuffs_base__make_status(wuffs_base__suspension__short_read);
         goto suspend;
       }
-      iop_a_src += self->private_data.s_decode_io_writer[0].scratch;
+      iop_a_src += self->private_data.s_transform_io[0].scratch;
     }
     if ((v_flags & 224) != 0) {
       status = wuffs_base__make_status(wuffs_gzip__error__bad_encoding_flags);
@@ -11601,7 +11599,7 @@
         if (a_src) {
           a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
         }
-        wuffs_base__status t_7 = wuffs_deflate__decoder__decode_io_writer(
+        wuffs_base__status t_7 = wuffs_deflate__decoder__transform_io(
             &self->private_data.f_flate, a_dst, a_src, a_workbuf);
         if (a_dst) {
           iop_a_dst = a_dst->data.ptr + a_dst->meta.wi;
@@ -11635,7 +11633,7 @@
         t_8 = wuffs_base__load_u32le(iop_a_src);
         iop_a_src += 4;
       } else {
-        self->private_data.s_decode_io_writer[0].scratch = 0;
+        self->private_data.s_transform_io[0].scratch = 0;
         WUFFS_BASE__COROUTINE_SUSPENSION_POINT(14);
         while (true) {
           if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
@@ -11643,7 +11641,7 @@
                 wuffs_base__make_status(wuffs_base__suspension__short_read);
             goto suspend;
           }
-          uint64_t* scratch = &self->private_data.s_decode_io_writer[0].scratch;
+          uint64_t* scratch = &self->private_data.s_transform_io[0].scratch;
           uint32_t num_bits_8 = ((uint32_t)(*scratch >> 56));
           *scratch <<= 8;
           *scratch >>= 8;
@@ -11665,7 +11663,7 @@
         t_9 = wuffs_base__load_u32le(iop_a_src);
         iop_a_src += 4;
       } else {
-        self->private_data.s_decode_io_writer[0].scratch = 0;
+        self->private_data.s_transform_io[0].scratch = 0;
         WUFFS_BASE__COROUTINE_SUSPENSION_POINT(16);
         while (true) {
           if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
@@ -11673,7 +11671,7 @@
                 wuffs_base__make_status(wuffs_base__suspension__short_read);
             goto suspend;
           }
-          uint64_t* scratch = &self->private_data.s_decode_io_writer[0].scratch;
+          uint64_t* scratch = &self->private_data.s_transform_io[0].scratch;
           uint32_t num_bits_9 = ((uint32_t)(*scratch >> 56));
           *scratch <<= 8;
           *scratch >>= 8;
@@ -11697,21 +11695,21 @@
 
     goto ok;
   ok:
-    self->private_impl.p_decode_io_writer[0] = 0;
+    self->private_impl.p_transform_io[0] = 0;
     goto exit;
   }
 
   goto suspend;
 suspend:
-  self->private_impl.p_decode_io_writer[0] =
+  self->private_impl.p_transform_io[0] =
       wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
   self->private_impl.active_coroutine =
       wuffs_base__status__is_suspension(&status) ? 1 : 0;
-  self->private_data.s_decode_io_writer[0].v_flags = v_flags;
-  self->private_data.s_decode_io_writer[0].v_checksum_got = v_checksum_got;
-  self->private_data.s_decode_io_writer[0].v_decoded_length_got =
+  self->private_data.s_transform_io[0].v_flags = v_flags;
+  self->private_data.s_transform_io[0].v_checksum_got = v_checksum_got;
+  self->private_data.s_transform_io[0].v_decoded_length_got =
       v_decoded_length_got;
-  self->private_data.s_decode_io_writer[0].v_checksum_want = v_checksum_want;
+  self->private_data.s_transform_io[0].v_checksum_want = v_checksum_want;
 
   goto exit;
 exit:
@@ -11900,13 +11898,13 @@
   return wuffs_base__utility__make_range_ii_u64(1, 1);
 }
 
-// -------- func zlib.decoder.decode_io_writer
+// -------- func zlib.decoder.transform_io
 
 WUFFS_BASE__MAYBE_STATIC wuffs_base__status  //
-wuffs_zlib__decoder__decode_io_writer(wuffs_zlib__decoder* self,
-                                      wuffs_base__io_buffer* a_dst,
-                                      wuffs_base__io_buffer* a_src,
-                                      wuffs_base__slice_u8 a_workbuf) {
+wuffs_zlib__decoder__transform_io(wuffs_zlib__decoder* self,
+                                  wuffs_base__io_buffer* a_dst,
+                                  wuffs_base__io_buffer* a_src,
+                                  wuffs_base__slice_u8 a_workbuf) {
   if (!self) {
     return wuffs_base__make_status(wuffs_base__error__bad_receiver);
   }
@@ -11959,9 +11957,9 @@
     io2_a_src = io0_a_src + a_src->meta.wi;
   }
 
-  uint32_t coro_susp_point = self->private_impl.p_decode_io_writer[0];
+  uint32_t coro_susp_point = self->private_impl.p_transform_io[0];
   if (coro_susp_point) {
-    v_checksum_got = self->private_data.s_decode_io_writer[0].v_checksum_got;
+    v_checksum_got = self->private_data.s_transform_io[0].v_checksum_got;
   }
   switch (coro_susp_point) {
     WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
@@ -11977,7 +11975,7 @@
           t_0 = wuffs_base__load_u16be(iop_a_src);
           iop_a_src += 2;
         } else {
-          self->private_data.s_decode_io_writer[0].scratch = 0;
+          self->private_data.s_transform_io[0].scratch = 0;
           WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
           while (true) {
             if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
@@ -11985,8 +11983,7 @@
                   wuffs_base__make_status(wuffs_base__suspension__short_read);
               goto suspend;
             }
-            uint64_t* scratch =
-                &self->private_data.s_decode_io_writer[0].scratch;
+            uint64_t* scratch = &self->private_data.s_transform_io[0].scratch;
             uint32_t num_bits_0 = ((uint32_t)(*scratch & 0xFF));
             *scratch >>= 8;
             *scratch <<= 8;
@@ -12025,7 +12022,7 @@
             t_1 = wuffs_base__load_u32be(iop_a_src);
             iop_a_src += 4;
           } else {
-            self->private_data.s_decode_io_writer[0].scratch = 0;
+            self->private_data.s_transform_io[0].scratch = 0;
             WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
             while (true) {
               if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
@@ -12033,8 +12030,7 @@
                     wuffs_base__make_status(wuffs_base__suspension__short_read);
                 goto suspend;
               }
-              uint64_t* scratch =
-                  &self->private_data.s_decode_io_writer[0].scratch;
+              uint64_t* scratch = &self->private_data.s_transform_io[0].scratch;
               uint32_t num_bits_1 = ((uint32_t)(*scratch & 0xFF));
               *scratch >>= 8;
               *scratch <<= 8;
@@ -12076,7 +12072,7 @@
         if (a_src) {
           a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
         }
-        wuffs_base__status t_2 = wuffs_deflate__decoder__decode_io_writer(
+        wuffs_base__status t_2 = wuffs_deflate__decoder__transform_io(
             &self->private_data.f_flate, a_dst, a_src, a_workbuf);
         if (a_dst) {
           iop_a_dst = a_dst->data.ptr + a_dst->meta.wi;
@@ -12106,7 +12102,7 @@
         t_3 = wuffs_base__load_u32be(iop_a_src);
         iop_a_src += 4;
       } else {
-        self->private_data.s_decode_io_writer[0].scratch = 0;
+        self->private_data.s_transform_io[0].scratch = 0;
         WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7);
         while (true) {
           if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
@@ -12114,7 +12110,7 @@
                 wuffs_base__make_status(wuffs_base__suspension__short_read);
             goto suspend;
           }
-          uint64_t* scratch = &self->private_data.s_decode_io_writer[0].scratch;
+          uint64_t* scratch = &self->private_data.s_transform_io[0].scratch;
           uint32_t num_bits_3 = ((uint32_t)(*scratch & 0xFF));
           *scratch >>= 8;
           *scratch <<= 8;
@@ -12137,17 +12133,17 @@
 
     goto ok;
   ok:
-    self->private_impl.p_decode_io_writer[0] = 0;
+    self->private_impl.p_transform_io[0] = 0;
     goto exit;
   }
 
   goto suspend;
 suspend:
-  self->private_impl.p_decode_io_writer[0] =
+  self->private_impl.p_transform_io[0] =
       wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
   self->private_impl.active_coroutine =
       wuffs_base__status__is_suspension(&status) ? 1 : 0;
-  self->private_data.s_decode_io_writer[0].v_checksum_got = v_checksum_got;
+  self->private_data.s_transform_io[0].v_checksum_got = v_checksum_got;
 
   goto exit;
 exit:
diff --git a/script/bench-c-deflate-fragmentation.c b/script/bench-c-deflate-fragmentation.c
index c49aa9a..429fa7c 100644
--- a/script/bench-c-deflate-fragmentation.c
+++ b/script/bench-c-deflate-fragmentation.c
@@ -227,10 +227,10 @@
 
 const char* decode_once(bool frag_dst, bool frag_idat) {
   wuffs_zlib__decoder dec;
-  const char* status =
+  wuffs_base__status status =
       wuffs_zlib__decoder__initialize(&dec, sizeof dec, WUFFS_VERSION, 0);
-  if (status) {
-    return status;
+  if (!wuffs_base__status__is_ok(&status)) {
+    return wuffs_base__status__message(&status);
   }
 
   wuffs_base__io_buffer dst = ((wuffs_base__io_buffer){
@@ -251,8 +251,6 @@
           .closed = true,
       }),
   });
-  wuffs_base__io_writer dst_writer = wuffs_base__io_buffer__writer(&dst);
-  wuffs_base__io_reader idat_reader = wuffs_base__io_buffer__reader(&idat);
 
   uint32_t i = 0;  // Number of dst fragments processed, if frag_dst.
   if (frag_dst) {
@@ -266,30 +264,29 @@
   }
 
   while (true) {
-    status =
-        wuffs_zlib__decoder__decode_io_writer(&dec, dst_writer, idat_reader,
-                                              ((wuffs_base__slice_u8){
-                                                  .ptr = work_buffer,
-                                                  .len = WORK_BUFFER_SIZE,
-                                              }));
+    status = wuffs_zlib__decoder__transform_io(&dec, &dst, &idat,
+                                               ((wuffs_base__slice_u8){
+                                                   .ptr = work_buffer,
+                                                   .len = WORK_BUFFER_SIZE,
+                                               }));
 
-    if (!status) {
+    if (wuffs_base__status__is_ok(&status)) {
       break;
     }
-    if ((status == wuffs_base__suspension__short_write) && frag_dst &&
+    if ((status.repr == wuffs_base__suspension__short_write) && frag_dst &&
         (i < height - 1)) {
       i++;
       dst.data.len = bytes_per_row * (i + 1);
       continue;
     }
-    if ((status == wuffs_base__suspension__short_read) && frag_idat &&
+    if ((status.repr == wuffs_base__suspension__short_read) && frag_idat &&
         (j < num_idat_chunks - 1)) {
       j++;
       idat.meta.wi = idat_splits[j + 1];
       idat.meta.closed = (num_idat_chunks == j + 1);
       continue;
     }
-    return status;
+    return wuffs_base__status__message(&status);
   }
 
   if (dst.meta.wi != bytes_per_frame) {
diff --git a/std/deflate/decode_deflate.wuffs b/std/deflate/decode_deflate.wuffs
index e77c615..4660ba5 100644
--- a/std/deflate/decode_deflate.wuffs
+++ b/std/deflate/decode_deflate.wuffs
@@ -186,7 +186,7 @@
 		max_incl: decoder_workbuf_len_max_incl_worst_case)
 }
 
-pub func decoder.decode_io_writer?(dst: base.io_writer, src: base.io_reader, workbuf: slice base.u8) {
+pub func decoder.transform_io?(dst: base.io_writer, src: base.io_reader, workbuf: slice base.u8) {
 	var mark   : base.u64
 	var status : base.status
 
diff --git a/std/gif/decode_gif.wuffs b/std/gif/decode_gif.wuffs
index 9ca9d35..2019331 100644
--- a/std/gif/decode_gif.wuffs
+++ b/std/gif/decode_gif.wuffs
@@ -976,7 +976,7 @@
 			}
 			io_bind (io: r, data: this.compressed[this.compressed_ri .. this.compressed_wi]) {
 				mark = r.mark()
-				lzw_status =? this.lzw.decode_io_writer?(
+				lzw_status =? this.lzw.transform_io?(
 					dst: this.util.empty_io_writer(), src: r, workbuf: this.util.empty_slice_u8())
 				this.compressed_ri ~sat+= r.count_since(mark: mark)
 			}
diff --git a/std/gzip/decode_gzip.wuffs b/std/gzip/decode_gzip.wuffs
index bd7f5ce..78467d5 100644
--- a/std/gzip/decode_gzip.wuffs
+++ b/std/gzip/decode_gzip.wuffs
@@ -42,7 +42,7 @@
 		max_incl: decoder_workbuf_len_max_incl_worst_case)
 }
 
-pub func decoder.decode_io_writer?(dst: base.io_writer, src: base.io_reader, workbuf: slice base.u8) {
+pub func decoder.transform_io?(dst: base.io_writer, src: base.io_reader, workbuf: slice base.u8) {
 	var c                   : base.u8
 	var flags               : base.u8
 	var xlen                : base.u16
@@ -113,7 +113,7 @@
 	// Decode and checksum the DEFLATE-encoded payload.
 	while true {
 		mark = args.dst.mark()
-		status =? this.flate.decode_io_writer?(dst: args.dst, src: args.src, workbuf: args.workbuf)
+		status =? this.flate.transform_io?(dst: args.dst, src: args.src, workbuf: args.workbuf)
 		if not this.ignore_checksum {
 			checksum_got = this.checksum.update_u32!(x: args.dst.since(mark: mark))
 			decoded_length_got ~mod+= ((args.dst.count_since(mark: mark) & 0xFFFFFFFF) as base.u32)
diff --git a/std/lzw/decode_lzw.wuffs b/std/lzw/decode_lzw.wuffs
index af4ae4d..40fce29 100644
--- a/std/lzw/decode_lzw.wuffs
+++ b/std/lzw/decode_lzw.wuffs
@@ -29,7 +29,7 @@
 pub struct decoder?(
 	// set_literal_width_arg is 1 plus the saved argument passed to
 	// set_literal_width. This is assigned to the literal_width field at the
-	// start of decode_io_writer. During that method, calling set_literal_width
+	// start of transform_io. During that method, calling set_literal_width
 	// will change set_literal_width_arg but not literal_width.
 	set_literal_width_arg : base.u32[..= 9],
 
@@ -77,7 +77,7 @@
 	return this.util.make_range_ii_u64(min_incl: 0, max_incl: 0)
 }
 
-pub func decoder.decode_io_writer?(dst: base.io_writer, src: base.io_reader, workbuf: slice base.u8) {
+pub func decoder.transform_io?(dst: base.io_writer, src: base.io_reader, workbuf: slice base.u8) {
 	var i : base.u32[..= 8191]
 
 	// Initialize read_from state.
diff --git a/std/zlib/decode_zlib.wuffs b/std/zlib/decode_zlib.wuffs
index 6d9a47c..235ea5a 100644
--- a/std/zlib/decode_zlib.wuffs
+++ b/std/zlib/decode_zlib.wuffs
@@ -69,7 +69,7 @@
 		max_incl: decoder_workbuf_len_max_incl_worst_case)
 }
 
-pub func decoder.decode_io_writer?(dst: base.io_writer, src: base.io_reader, workbuf: slice base.u8) {
+pub func decoder.transform_io?(dst: base.io_writer, src: base.io_reader, workbuf: slice base.u8) {
 	var x             : base.u16
 	var checksum_got  : base.u32
 	var status        : base.status
@@ -109,7 +109,7 @@
 	// Decode and checksum the DEFLATE-encoded payload.
 	while true {
 		mark = args.dst.mark()
-		status =? this.flate.decode_io_writer?(dst: args.dst, src: args.src, workbuf: args.workbuf)
+		status =? this.flate.transform_io?(dst: args.dst, src: args.src, workbuf: args.workbuf)
 		if not this.ignore_checksum {
 			checksum_got = this.checksum.update_u32!(x: args.dst.since(mark: mark))
 		}
diff --git a/test/c/std/deflate.c b/test/c/std/deflate.c
index 59a690a..e86eb41 100644
--- a/test/c/std/deflate.c
+++ b/test/c/std/deflate.c
@@ -169,7 +169,7 @@
     wuffs_base__io_buffer limited_dst = make_limited_writer(*dst, wlimit);
     wuffs_base__io_buffer limited_src = make_limited_reader(*src, rlimit);
 
-    wuffs_base__status status = wuffs_deflate__decoder__decode_io_writer(
+    wuffs_base__status status = wuffs_deflate__decoder__transform_io(
         &dec, &limited_dst, &limited_src, global_work_slice);
 
     dst->meta.wi += limited_dst.meta.wi;
@@ -248,8 +248,8 @@
   CHECK_STATUS("initialize", wuffs_deflate__decoder__initialize(
                                  &dec, sizeof dec, WUFFS_VERSION,
                                  WUFFS_INITIALIZE__DEFAULT_OPTIONS));
-  CHECK_STATUS("decode_io_writer", wuffs_deflate__decoder__decode_io_writer(
-                                       &dec, &got, &src, global_work_slice));
+  CHECK_STATUS("transform_io", wuffs_deflate__decoder__transform_io(
+                                   &dec, &got, &src, global_work_slice));
 
   int i;
   for (i = 0; i < 2; i++) {
@@ -345,13 +345,13 @@
     src.meta.closed = false;
     src.meta.ri = gt->src_offset0;
     src.meta.wi = split;
-    wuffs_base__status z0 = wuffs_deflate__decoder__decode_io_writer(
+    wuffs_base__status z0 = wuffs_deflate__decoder__transform_io(
         &dec, &got, &src, global_work_slice);
 
     src.meta.closed = true;
     src.meta.ri = split;
     src.meta.wi = gt->src_offset1;
-    wuffs_base__status z1 = wuffs_deflate__decoder__decode_io_writer(
+    wuffs_base__status z1 = wuffs_deflate__decoder__transform_io(
         &dec, &got, &src, global_work_slice);
 
     if (z0.repr != wuffs_base__suspension__short_read) {
@@ -387,7 +387,7 @@
 
   dec->private_impl.f_history_index = starting_history_index;
 
-  wuffs_base__status got_z = wuffs_deflate__decoder__decode_io_writer(
+  wuffs_base__status got_z = wuffs_deflate__decoder__transform_io(
       dec, &limited_got, src, global_work_slice);
   got->meta.wi += limited_got.meta.wi;
   if (got_z.repr != want_z) {
diff --git a/test/c/std/gzip.c b/test/c/std/gzip.c
index a76f668..88786b9 100644
--- a/test/c/std/gzip.c
+++ b/test/c/std/gzip.c
@@ -97,7 +97,7 @@
     wuffs_base__io_buffer limited_dst = make_limited_writer(*dst, wlimit);
     wuffs_base__io_buffer limited_src = make_limited_reader(*src, rlimit);
 
-    wuffs_base__status status = wuffs_gzip__decoder__decode_io_writer(
+    wuffs_base__status status = wuffs_gzip__decoder__transform_io(
         &dec, &limited_dst, &limited_src, global_work_slice);
 
     dst->meta.wi += limited_dst.meta.wi;
@@ -165,7 +165,7 @@
       }
 
       wuffs_base__io_buffer limited_src = make_limited_reader(src, rlimit);
-      wuffs_base__status got_z = wuffs_gzip__decoder__decode_io_writer(
+      wuffs_base__status got_z = wuffs_gzip__decoder__transform_io(
           &dec, &got, &limited_src, global_work_slice);
       src.meta.ri += limited_src.meta.ri;
       if (got_z.repr != want_z) {
diff --git a/test/c/std/lzw.c b/test/c/std/lzw.c
index 6685ad7..6bb8f8a 100644
--- a/test/c/std/lzw.c
+++ b/test/c/std/lzw.c
@@ -115,20 +115,19 @@
     size_t old_wi = got.meta.wi;
     size_t old_ri = src.meta.ri;
 
-    wuffs_base__status status = wuffs_lzw__decoder__decode_io_writer(
+    wuffs_base__status status = wuffs_lzw__decoder__transform_io(
         &dec, &limited_got, &limited_src, global_work_slice);
     got.meta.wi += limited_got.meta.wi;
     src.meta.ri += limited_src.meta.ri;
     if (wuffs_base__status__is_ok(&status)) {
       if (src.meta.ri != src.meta.wi) {
-        RETURN_FAIL(
-            "decode_io_writer returned \"ok\" but src was not exhausted");
+        RETURN_FAIL("transform_io returned \"ok\" but src was not exhausted");
       }
       break;
     }
     if ((status.repr != wuffs_base__suspension__short_read) &&
         (status.repr != wuffs_base__suspension__short_write)) {
-      RETURN_FAIL("decode_io_writer: got \"%s\", want \"%s\" or \"%s\"",
+      RETURN_FAIL("transform_io: got \"%s\", want \"%s\" or \"%s\"",
                   status.repr, wuffs_base__suspension__short_read,
                   wuffs_base__suspension__short_write);
     }
@@ -223,9 +222,9 @@
   wuffs_lzw__decoder__set_literal_width(&dec, 7);
 
   wuffs_base__status status =
-      wuffs_lzw__decoder__decode_io_writer(&dec, &got, &src, global_work_slice);
+      wuffs_lzw__decoder__transform_io(&dec, &got, &src, global_work_slice);
   if (status.repr != wuffs_lzw__error__bad_code) {
-    RETURN_FAIL("decode_io_writer: got \"%s\", want \"%s\"", status.repr,
+    RETURN_FAIL("transform_io: got \"%s\", want \"%s\"", status.repr,
                 wuffs_lzw__error__bad_code);
   }
 
@@ -265,8 +264,8 @@
                    WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED));
   wuffs_lzw__decoder__set_literal_width(&dec, 8);
 
-  CHECK_STATUS("decode_io_writer", wuffs_lzw__decoder__decode_io_writer(
-                                       &dec, &got, &src, global_work_slice));
+  CHECK_STATUS("transform_io", wuffs_lzw__decoder__transform_io(
+                                   &dec, &got, &src, global_work_slice));
 
   if (got.meta.wi != 0) {
     RETURN_FAIL("got.meta.wi: got %d, want 0", (int)(got.meta.wi));
@@ -290,8 +289,8 @@
   wuffs_base__io_buffer got = ((wuffs_base__io_buffer){
       .data = global_got_slice,
   });
-  CHECK_STATUS("decode_io_writer", wuffs_lzw__decoder__decode_io_writer(
-                                       &dec, &got, &src, global_work_slice));
+  CHECK_STATUS("transform_io", wuffs_lzw__decoder__transform_io(
+                                   &dec, &got, &src, global_work_slice));
 
   return check_io_buffers_equal("", &got, &want);
 }
@@ -392,8 +391,8 @@
                  wuffs_lzw__decoder__initialize(
                      &dec, sizeof dec, WUFFS_VERSION,
                      WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED));
-    CHECK_STATUS("decode_io_writer", wuffs_lzw__decoder__decode_io_writer(
-                                         &dec, &got, &src, global_work_slice));
+    CHECK_STATUS("transform_io", wuffs_lzw__decoder__transform_io(
+                                     &dec, &got, &src, global_work_slice));
     n_bytes += got.meta.wi;
   }
   bench_finish(iters, n_bytes);
diff --git a/test/c/std/zlib.c b/test/c/std/zlib.c
index 236bc9c..987b25e 100644
--- a/test/c/std/zlib.c
+++ b/test/c/std/zlib.c
@@ -108,7 +108,7 @@
     wuffs_base__io_buffer limited_dst = make_limited_writer(*dst, wlimit);
     wuffs_base__io_buffer limited_src = make_limited_reader(*src, rlimit);
 
-    wuffs_base__status status = wuffs_zlib__decoder__decode_io_writer(
+    wuffs_base__status status = wuffs_zlib__decoder__transform_io(
         &dec, &limited_dst, &limited_src, global_work_slice);
 
     dst->meta.wi += limited_dst.meta.wi;
@@ -176,7 +176,7 @@
 
       wuffs_base__io_buffer limited_src = make_limited_reader(src, rlimit);
 
-      wuffs_base__status got_z = wuffs_zlib__decoder__decode_io_writer(
+      wuffs_base__status got_z = wuffs_zlib__decoder__transform_io(
           &dec, &got, &limited_src, global_work_slice);
       src.meta.ri += limited_src.meta.ri;
       if (got_z.repr != want_z) {
@@ -235,11 +235,11 @@
 
   int i;
   for (i = 0; i < 3; i++) {
-    wuffs_base__status status = wuffs_zlib__decoder__decode_io_writer(
-        &dec, &got, &src, global_work_slice);
+    wuffs_base__status status =
+        wuffs_zlib__decoder__transform_io(&dec, &got, &src, global_work_slice);
 
     if (status.repr != wuffs_zlib__note__dictionary_required) {
-      RETURN_FAIL("decode_io_writer (before dict): got \"%s\", want \"%s\"",
+      RETURN_FAIL("transform_io (before dict): got \"%s\", want \"%s\"",
                   status.repr, wuffs_zlib__note__dictionary_required);
     }
 
@@ -257,9 +257,9 @@
                 .len = zlib_sheep_dict_len,
             }));
 
-  CHECK_STATUS("decode_io_writer (after dict)",
-               wuffs_zlib__decoder__decode_io_writer(&dec, &got, &src,
-                                                     global_work_slice));
+  CHECK_STATUS(
+      "transform_io (after dict)",
+      wuffs_zlib__decoder__transform_io(&dec, &got, &src, global_work_slice));
 
   wuffs_base__io_buffer want =
       make_io_buffer_from_string(zlib_sheep_want_ptr, zlib_sheep_want_len);