Extract WUFFS_AUX__DECODE_JSON__GET_THE_NEXT_TOKEN
diff --git a/internal/cgen/auxiliary/json.cc b/internal/cgen/auxiliary/json.cc
index 7b8556d..1613ff5 100644
--- a/internal/cgen/auxiliary/json.cc
+++ b/internal/cgen/auxiliary/json.cc
@@ -37,6 +37,55 @@
                           sync_io::Input& input,
                           IOBuffer& buffer) {}
 
+#define WUFFS_AUX__DECODE_JSON__GET_THE_NEXT_TOKEN                       \
+  while (tok_buf.meta.ri >= tok_buf.meta.wi) {                           \
+    if (tok_status.repr == nullptr) {                                    \
+    } else if (tok_status.repr == wuffs_base__suspension__short_write) { \
+      tok_buf.compact();                                                 \
+    } else if (tok_status.repr == wuffs_base__suspension__short_read) {  \
+      if (!io_error_message.empty()) {                                   \
+        ret_error_message = std::move(io_error_message);                 \
+        goto done;                                                       \
+      } else if (cursor_index != io_buf->meta.ri) {                      \
+        ret_error_message =                                              \
+            "wuffs_aux::JsonDecoder: internal error: bad cursor_index";  \
+        goto done;                                                       \
+      } else if (io_buf->meta.closed) {                                  \
+        ret_error_message =                                              \
+            "wuffs_aux::JsonDecoder: internal error: io_buf is closed";  \
+        goto done;                                                       \
+      }                                                                  \
+      io_buf->compact();                                                 \
+      if (io_buf->meta.wi >= io_buf->data.len) {                         \
+        ret_error_message =                                              \
+            "wuffs_aux::JsonDecoder: internal error: io_buf is full";    \
+        goto done;                                                       \
+      }                                                                  \
+      cursor_index = io_buf->meta.ri;                                    \
+      io_error_message = input.CopyIn(io_buf);                           \
+    } else {                                                             \
+      ret_error_message = tok_status.message();                          \
+      goto done;                                                         \
+    }                                                                    \
+    if (WUFFS_JSON__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE != 0) {      \
+      ret_error_message =                                                \
+          "wuffs_aux::JsonDecoder: internal error: bad WORKBUF_LEN";     \
+      goto done;                                                         \
+    }                                                                    \
+    wuffs_base__slice_u8 work_buf = wuffs_base__empty_slice_u8();        \
+    tok_status = dec->decode_tokens(&tok_buf, io_buf, work_buf);         \
+  }                                                                      \
+  wuffs_base__token token = tok_buf.data.ptr[tok_buf.meta.ri++];         \
+  uint64_t token_len = token.length();                                   \
+  if ((io_buf->meta.ri < cursor_index) ||                                \
+      ((io_buf->meta.ri - cursor_index) < token_len)) {                  \
+    ret_error_message =                                                  \
+        "wuffs_aux::JsonDecoder: internal error: bad token indexes";     \
+    goto done;                                                           \
+  }                                                                      \
+  uint8_t* token_ptr = io_buf->data.ptr + cursor_index;                  \
+  cursor_index += token_len
+
 DecodeJsonResult  //
 DecodeJson(DecodeJsonCallbacks&& callbacks,
            sync_io::Input&& input,
@@ -80,61 +129,7 @@
     //  1. Get the next token.
     //  2. Process that token.
     while (true) {
-      // 1. Get the next token.
-
-      while (tok_buf.meta.ri >= tok_buf.meta.wi) {
-        if (tok_status.repr == nullptr) {
-          // No-op.
-        } else if (tok_status.repr == wuffs_base__suspension__short_write) {
-          tok_buf.compact();
-        } else if (tok_status.repr == wuffs_base__suspension__short_read) {
-          // Read from input to io_buf.
-          if (!io_error_message.empty()) {
-            ret_error_message = std::move(io_error_message);
-            goto done;
-          } else if (cursor_index != io_buf->meta.ri) {
-            ret_error_message =
-                "wuffs_aux::JsonDecoder: internal error: bad cursor_index";
-            goto done;
-          } else if (io_buf->meta.closed) {
-            ret_error_message =
-                "wuffs_aux::JsonDecoder: internal error: io_buf is closed";
-            goto done;
-          }
-          io_buf->compact();
-          if (io_buf->meta.wi >= io_buf->data.len) {
-            ret_error_message =
-                "wuffs_aux::JsonDecoder: internal error: io_buf is full";
-            goto done;
-          }
-          cursor_index = io_buf->meta.ri;
-          io_error_message = input.CopyIn(io_buf);
-        } else {
-          ret_error_message = tok_status.message();
-          goto done;
-        }
-
-        if (WUFFS_JSON__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE != 0) {
-          ret_error_message =
-              "wuffs_aux::JsonDecoder: internal error: bad WORKBUF_LEN";
-          goto done;
-        }
-        wuffs_base__slice_u8 work_buf = wuffs_base__empty_slice_u8();
-        tok_status = dec->decode_tokens(&tok_buf, io_buf, work_buf);
-      }
-
-      wuffs_base__token token = tok_buf.data.ptr[tok_buf.meta.ri++];
-      uint64_t token_len = token.length();
-      if ((io_buf->meta.ri < cursor_index) ||
-          ((io_buf->meta.ri - cursor_index) < token_len)) {
-        ret_error_message =
-            "wuffs_aux::JsonDecoder: internal error: bad token indexes";
-        goto done;
-      }
-      uint8_t* token_ptr = io_buf->data.ptr + cursor_index;
-      cursor_index += token_len;
-
-      // 2. Process that token.
+      WUFFS_AUX__DECODE_JSON__GET_THE_NEXT_TOKEN;
 
       int64_t vbc = token.value_base_category();
       uint64_t vbd = token.value_base_detail();
@@ -294,6 +289,8 @@
   return result;
 }
 
+#undef WUFFS_AUX__DECODE_JSON__GET_THE_NEXT_TOKEN
+
 }  // namespace wuffs_aux
 
 #endif  // !defined(WUFFS_CONFIG__MODULES) ||
diff --git a/internal/cgen/data/data.go b/internal/cgen/data/data.go
index 29974bd..d0fbc0f 100644
--- a/internal/cgen/data/data.go
+++ b/internal/cgen/data/data.go
@@ -648,17 +648,19 @@
 	""
 
 const AuxJsonCc = "" +
-	"// ---------------- Auxiliary - JSON\n\n#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__AUX__JSON)\n\n#include <utility>\n\nnamespace wuffs_aux {\n\nDecodeJsonResult::DecodeJsonResult(std::string&& error_message0,\n                                   uint64_t cursor_position0)\n    : error_message(std::move(error_message0)),\n      cursor_position(cursor_position0) {}\n\nstd::string  //\nDecodeJsonCallbacks::AppendByteString(std::string&& val) {\n  return \"wuffs_aux::JsonDecoder: unexpected JSON byte string\";\n}\n\nvoid  //\nDecodeJsonCallbacks::Done(DecodeJsonResult& result,\n                          sync_io::Input& input,\n                          IOBuffer& buffer) {}\n\nDecodeJsonResult  //\nDecodeJson(DecodeJsonCallbacks&& callbacks,\n           sync_io::Input&& input,\n           wuffs_base__slice_u32 quirks) {\n  // Prepare the wuffs_base__io_buffer and the resultant error_message.\n  wuffs_base__io_buffer* io_buf = input.BringsItsOwnIOBuffer();\n  wuffs_base__io_buffer fallback_io_buf = wuffs_base__empty_io_b" +
-	"uffer();\n  std::unique_ptr<uint8_t[]> fallback_io_array(nullptr);\n  if (!io_buf) {\n    fallback_io_array = std::unique_ptr<uint8_t[]>(new uint8_t[4096]);\n    fallback_io_buf = wuffs_base__ptr_u8__writer(fallback_io_array.get(), 4096);\n    io_buf = &fallback_io_buf;\n  }\n  size_t cursor_index = 0;\n  std::string ret_error_message;\n  std::string io_error_message;\n\n  do {\n    // Prepare the low-level JSON decoder.\n    wuffs_json__decoder::unique_ptr dec = wuffs_json__decoder::alloc();\n    if (!dec) {\n      ret_error_message = \"wuffs_aux::JsonDecoder: out of memory\";\n      goto done;\n    }\n    for (size_t i = 0; i < quirks.len; i++) {\n      dec->set_quirk_enabled(quirks.ptr[i], true);\n    }\n\n    // Prepare the wuffs_base__tok_buffer.\n    wuffs_base__token tok_array[256];\n    wuffs_base__token_buffer tok_buf =\n        wuffs_base__slice_token__writer(wuffs_base__make_slice_token(\n            &tok_array[0], (sizeof(tok_array) / sizeof(tok_array[0]))));\n    wuffs_base__status tok_status = wuffs_base__make_status(nullpt" +
-	"r);\n\n    // Prepare other state.\n    uint32_t depth = 0;\n    std::string str;\n\n    // Loop, doing these two things:\n    //  1. Get the next token.\n    //  2. Process that token.\n    while (true) {\n      // 1. Get the next token.\n\n      while (tok_buf.meta.ri >= tok_buf.meta.wi) {\n        if (tok_status.repr == nullptr) {\n          // No-op.\n        } else if (tok_status.repr == wuffs_base__suspension__short_write) {\n          tok_buf.compact();\n        } else if (tok_status.repr == wuffs_base__suspension__short_read) {\n          // Read from input to io_buf.\n          if (!io_error_message.empty()) {\n            ret_error_message = std::move(io_error_message);\n            goto done;\n          } else if (cursor_index != io_buf->meta.ri) {\n            ret_error_message =\n                \"wuffs_aux::JsonDecoder: internal error: bad cursor_index\";\n            goto done;\n          } else if (io_buf->meta.closed) {\n            ret_error_message =\n                \"wuffs_aux::JsonDecoder: internal error: io_buf is cl" +
-	"osed\";\n            goto done;\n          }\n          io_buf->compact();\n          if (io_buf->meta.wi >= io_buf->data.len) {\n            ret_error_message =\n                \"wuffs_aux::JsonDecoder: internal error: io_buf is full\";\n            goto done;\n          }\n          cursor_index = io_buf->meta.ri;\n          io_error_message = input.CopyIn(io_buf);\n        } else {\n          ret_error_message = tok_status.message();\n          goto done;\n        }\n\n        if (WUFFS_JSON__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE != 0) {\n          ret_error_message =\n              \"wuffs_aux::JsonDecoder: internal error: bad WORKBUF_LEN\";\n          goto done;\n        }\n        wuffs_base__slice_u8 work_buf = wuffs_base__empty_slice_u8();\n        tok_status = dec->decode_tokens(&tok_buf, io_buf, work_buf);\n      }\n\n      wuffs_base__token token = tok_buf.data.ptr[tok_buf.meta.ri++];\n      uint64_t token_len = token.length();\n      if ((io_buf->meta.ri < cursor_index) ||\n          ((io_buf->meta.ri - cursor_index) < token_l" +
-	"en)) {\n        ret_error_message =\n            \"wuffs_aux::JsonDecoder: internal error: bad token indexes\";\n        goto done;\n      }\n      uint8_t* token_ptr = io_buf->data.ptr + cursor_index;\n      cursor_index += token_len;\n\n      // 2. Process that token.\n\n      int64_t vbc = token.value_base_category();\n      uint64_t vbd = token.value_base_detail();\n      switch (vbc) {\n        case WUFFS_BASE__TOKEN__VBC__FILLER:\n          continue;\n\n        case WUFFS_BASE__TOKEN__VBC__STRUCTURE: {\n          if (vbd & WUFFS_BASE__TOKEN__VBD__STRUCTURE__PUSH) {\n            ret_error_message = callbacks.Push(static_cast<uint32_t>(vbd));\n            if (!ret_error_message.empty()) {\n              goto done;\n            }\n            depth++;\n            continue;\n          }\n          ret_error_message = callbacks.Pop(static_cast<uint32_t>(vbd));\n          depth--;\n          goto parsed_a_value;\n        }\n\n        case WUFFS_BASE__TOKEN__VBC__STRING: {\n          if (vbd & WUFFS_BASE__TOKEN__VBD__STRING__CONVERT_0_DST_1_" +
-	"SRC_DROP) {\n            // No-op.\n          } else if (vbd &\n                     WUFFS_BASE__TOKEN__VBD__STRING__CONVERT_1_DST_1_SRC_COPY) {\n            const char* ptr =  // Convert from (uint8_t*).\n                static_cast<const char*>(static_cast<void*>(token_ptr));\n            str.append(ptr, token_len);\n          } else if (\n              vbd &\n              WUFFS_BASE__TOKEN__VBD__STRING__CONVERT_1_DST_4_SRC_BACKSLASH_X) {\n            wuffs_base__slice_u8 encoded =\n                wuffs_base__make_slice_u8(token_ptr, token_len);\n            while (encoded.len > 0) {\n              uint8_t decoded[64];\n              constexpr bool src_closed = true;\n              wuffs_base__transform__output o = wuffs_base__base_16__decode4(\n                  wuffs_base__make_slice_u8(&decoded[0], sizeof decoded),\n                  encoded, src_closed, WUFFS_BASE__BASE_16__DEFAULT_OPTIONS);\n              if (o.status.is_error()) {\n                ret_error_message = o.status.message();\n                goto done;\n    " +
-	"          } else if ((o.num_dst > (sizeof decoded)) ||\n                         (o.num_src > encoded.len)) {\n                ret_error_message =\n                    \"wuffs_aux::JsonDecoder: internal error: inconsistent \"\n                    \"base16 decoding\";\n                goto done;\n              }\n              str.append(  // Convert from (uint8_t*).\n                  static_cast<const char*>(static_cast<void*>(&decoded[0])),\n                  o.num_dst);\n              encoded.ptr += o.num_src;\n              encoded.len -= o.num_src;\n            }\n          } else {\n            goto fail;\n          }\n          if (token.continued()) {\n            continue;\n          }\n          ret_error_message =\n              (vbd & WUFFS_BASE__TOKEN__VBD__STRING__CHAIN_MUST_BE_UTF_8)\n                  ? callbacks.AppendTextString(std::move(str))\n                  : callbacks.AppendByteString(std::move(str));\n          str.clear();\n          goto parsed_a_value;\n        }\n\n        case WUFFS_BASE__TOKEN__VBC__UNICODE_C" +
-	"ODE_POINT: {\n          uint8_t u[WUFFS_BASE__UTF_8__BYTE_LENGTH__MAX_INCL];\n          size_t n = wuffs_base__utf_8__encode(\n              wuffs_base__make_slice_u8(\n                  &u[0], WUFFS_BASE__UTF_8__BYTE_LENGTH__MAX_INCL),\n              static_cast<uint32_t>(vbd));\n          const char* ptr =  // Convert from (uint8_t*).\n              static_cast<const char*>(static_cast<void*>(&u[0]));\n          str.append(ptr, n);\n          if (token.continued()) {\n            continue;\n          }\n          goto fail;\n        }\n\n        case WUFFS_BASE__TOKEN__VBC__LITERAL: {\n          ret_error_message =\n              (vbd & WUFFS_BASE__TOKEN__VBD__LITERAL__NULL)\n                  ? callbacks.AppendNull()\n                  : callbacks.AppendBool(vbd &\n                                         WUFFS_BASE__TOKEN__VBD__LITERAL__TRUE);\n          goto parsed_a_value;\n        }\n\n        case WUFFS_BASE__TOKEN__VBC__NUMBER: {\n          if (vbd & WUFFS_BASE__TOKEN__VBD__NUMBER__FORMAT_TEXT) {\n            if (vbd & WUFFS_" +
-	"BASE__TOKEN__VBD__NUMBER__CONTENT_INTEGER_SIGNED) {\n              wuffs_base__result_i64 r = wuffs_base__parse_number_i64(\n                  wuffs_base__make_slice_u8(token_ptr, token_len),\n                  WUFFS_BASE__PARSE_NUMBER_XXX__DEFAULT_OPTIONS);\n              if (r.status.is_ok()) {\n                ret_error_message = callbacks.AppendI64(r.value);\n                goto parsed_a_value;\n              }\n            }\n            if (vbd & WUFFS_BASE__TOKEN__VBD__NUMBER__CONTENT_FLOATING_POINT) {\n              wuffs_base__result_f64 r = wuffs_base__parse_number_f64(\n                  wuffs_base__make_slice_u8(token_ptr, token_len),\n                  WUFFS_BASE__PARSE_NUMBER_XXX__DEFAULT_OPTIONS);\n              if (r.status.is_ok()) {\n                ret_error_message = callbacks.AppendF64(r.value);\n                goto parsed_a_value;\n              }\n            }\n          } else if (vbd & WUFFS_BASE__TOKEN__VBD__NUMBER__CONTENT_NEG_INF) {\n            ret_error_message = callbacks.AppendF64(\n           " +
-	"     wuffs_base__ieee_754_bit_representation__from_u64_to_f64(\n                    0xFFF0000000000000ul));\n            goto parsed_a_value;\n          } else if (vbd & WUFFS_BASE__TOKEN__VBD__NUMBER__CONTENT_POS_INF) {\n            ret_error_message = callbacks.AppendF64(\n                wuffs_base__ieee_754_bit_representation__from_u64_to_f64(\n                    0x7FF0000000000000ul));\n            goto parsed_a_value;\n          } else if (vbd & WUFFS_BASE__TOKEN__VBD__NUMBER__CONTENT_NEG_NAN) {\n            ret_error_message = callbacks.AppendF64(\n                wuffs_base__ieee_754_bit_representation__from_u64_to_f64(\n                    0xFFFFFFFFFFFFFFFFul));\n            goto parsed_a_value;\n          } else if (vbd & WUFFS_BASE__TOKEN__VBD__NUMBER__CONTENT_POS_NAN) {\n            ret_error_message = callbacks.AppendF64(\n                wuffs_base__ieee_754_bit_representation__from_u64_to_f64(\n                    0x7FFFFFFFFFFFFFFFul));\n            goto parsed_a_value;\n          }\n          goto fail;\n     " +
-	"   }\n      }\n\n    fail:\n      ret_error_message =\n          \"wuffs_aux::JsonDecoder: internal error: unexpected token\";\n      goto done;\n\n    parsed_a_value:\n      if (!ret_error_message.empty() || (depth == 0)) {\n        goto done;\n      }\n    }\n  } while (false);\n\ndone:\n  DecodeJsonResult result(\n      std::move(ret_error_message),\n      wuffs_base__u64__sat_add(io_buf->meta.pos, cursor_index));\n  callbacks.Done(result, input, *io_buf);\n  return result;\n}\n\n}  // namespace wuffs_aux\n\n#endif  // !defined(WUFFS_CONFIG__MODULES) ||\n        // defined(WUFFS_CONFIG__MODULE__AUX__JSON)\n" +
+	"// ---------------- Auxiliary - JSON\n\n#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__AUX__JSON)\n\n#include <utility>\n\nnamespace wuffs_aux {\n\nDecodeJsonResult::DecodeJsonResult(std::string&& error_message0,\n                                   uint64_t cursor_position0)\n    : error_message(std::move(error_message0)),\n      cursor_position(cursor_position0) {}\n\nstd::string  //\nDecodeJsonCallbacks::AppendByteString(std::string&& val) {\n  return \"wuffs_aux::JsonDecoder: unexpected JSON byte string\";\n}\n\nvoid  //\nDecodeJsonCallbacks::Done(DecodeJsonResult& result,\n                          sync_io::Input& input,\n                          IOBuffer& buffer) {}\n\n#define WUFFS_AUX__DECODE_JSON__GET_THE_NEXT_TOKEN                       \\\n  while (tok_buf.meta.ri >= tok_buf.meta.wi) {                           \\\n    if (tok_status.repr == nullptr) {                                    \\\n    } else if (tok_status.repr == wuffs_base__suspension__short_write) { \\\n      tok_buf.compact();                   " +
+	"                              \\\n    } else if (tok_status.repr == wuffs_base__suspension__short_read) {  \\\n      if (!io_error_message.empty()) {                                   \\\n        ret_error_message = std::move(io_error_message);                 \\\n        goto done;                                                       \\\n      } else if (cursor_index != io_buf->meta.ri) {                      \\\n        ret_error_message =                                              \\\n            \"wuffs_aux::JsonDecoder: internal error: bad cursor_index\";  \\\n        goto done;                                                       \\\n      } else if (io_buf->meta.closed) {                                  \\\n        ret_error_message =                                              \\\n            \"wuffs_aux::JsonDecoder: internal error: io_buf is closed\";  \\\n        goto done;                                                       \\\n      }                                                                  \\\n      io_buf->com" +
+	"pact();                                                 \\\n      if (io_buf->meta.wi >= io_buf->data.len) {                         \\\n        ret_error_message =                                              \\\n            \"wuffs_aux::JsonDecoder: internal error: io_buf is full\";    \\\n        goto done;                                                       \\\n      }                                                                  \\\n      cursor_index = io_buf->meta.ri;                                    \\\n      io_error_message = input.CopyIn(io_buf);                           \\\n    } else {                                                             \\\n      ret_error_message = tok_status.message();                          \\\n      goto done;                                                         \\\n    }                                                                    \\\n    if (WUFFS_JSON__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE != 0) {      \\\n      ret_error_message =                                         " +
+	"       \\\n          \"wuffs_aux::JsonDecoder: internal error: bad WORKBUF_LEN\";     \\\n      goto done;                                                         \\\n    }                                                                    \\\n    wuffs_base__slice_u8 work_buf = wuffs_base__empty_slice_u8();        \\\n    tok_status = dec->decode_tokens(&tok_buf, io_buf, work_buf);         \\\n  }                                                                      \\\n  wuffs_base__token token = tok_buf.data.ptr[tok_buf.meta.ri++];         \\\n  uint64_t token_len = token.length();                                   \\\n  if ((io_buf->meta.ri < cursor_index) ||                                \\\n      ((io_buf->meta.ri - cursor_index) < token_len)) {                  \\\n    ret_error_message =                                                  \\\n        \"wuffs_aux::JsonDecoder: internal error: bad token indexes\";     \\\n    goto done;                                                           \\\n  }                                     " +
+	"                                 \\\n  uint8_t* token_ptr = io_buf->data.ptr + cursor_index;                  \\\n  cursor_index += token_len\n\nDecodeJsonResult  //\nDecodeJson(DecodeJsonCallbacks&& callbacks,\n           sync_io::Input&& input,\n           wuffs_base__slice_u32 quirks) {\n  // Prepare the wuffs_base__io_buffer and the resultant error_message.\n  wuffs_base__io_buffer* io_buf = input.BringsItsOwnIOBuffer();\n  wuffs_base__io_buffer fallback_io_buf = wuffs_base__empty_io_buffer();\n  std::unique_ptr<uint8_t[]> fallback_io_array(nullptr);\n  if (!io_buf) {\n    fallback_io_array = std::unique_ptr<uint8_t[]>(new uint8_t[4096]);\n    fallback_io_buf = wuffs_base__ptr_u8__writer(fallback_io_array.get(), 4096);\n    io_buf = &fallback_io_buf;\n  }\n  size_t cursor_index = 0;\n  std::string ret_error_message;\n  std::string io_error_message;\n\n  do {\n    // Prepare the low-level JSON decoder.\n    wuffs_json__decoder::unique_ptr dec = wuffs_json__decoder::alloc();\n    if (!dec) {\n      ret_error_message = \"wuffs_aux::Jso" +
+	"nDecoder: out of memory\";\n      goto done;\n    }\n    for (size_t i = 0; i < quirks.len; i++) {\n      dec->set_quirk_enabled(quirks.ptr[i], true);\n    }\n\n    // Prepare the wuffs_base__tok_buffer.\n    wuffs_base__token tok_array[256];\n    wuffs_base__token_buffer tok_buf =\n        wuffs_base__slice_token__writer(wuffs_base__make_slice_token(\n            &tok_array[0], (sizeof(tok_array) / sizeof(tok_array[0]))));\n    wuffs_base__status tok_status = wuffs_base__make_status(nullptr);\n\n    // Prepare other state.\n    uint32_t depth = 0;\n    std::string str;\n\n    // Loop, doing these two things:\n    //  1. Get the next token.\n    //  2. Process that token.\n    while (true) {\n      WUFFS_AUX__DECODE_JSON__GET_THE_NEXT_TOKEN;\n\n      int64_t vbc = token.value_base_category();\n      uint64_t vbd = token.value_base_detail();\n      switch (vbc) {\n        case WUFFS_BASE__TOKEN__VBC__FILLER:\n          continue;\n\n        case WUFFS_BASE__TOKEN__VBC__STRUCTURE: {\n          if (vbd & WUFFS_BASE__TOKEN__VBD__STRUCTURE__PUSH)" +
+	" {\n            ret_error_message = callbacks.Push(static_cast<uint32_t>(vbd));\n            if (!ret_error_message.empty()) {\n              goto done;\n            }\n            depth++;\n            continue;\n          }\n          ret_error_message = callbacks.Pop(static_cast<uint32_t>(vbd));\n          depth--;\n          goto parsed_a_value;\n        }\n\n        case WUFFS_BASE__TOKEN__VBC__STRING: {\n          if (vbd & WUFFS_BASE__TOKEN__VBD__STRING__CONVERT_0_DST_1_SRC_DROP) {\n            // No-op.\n          } else if (vbd &\n                     WUFFS_BASE__TOKEN__VBD__STRING__CONVERT_1_DST_1_SRC_COPY) {\n            const char* ptr =  // Convert from (uint8_t*).\n                static_cast<const char*>(static_cast<void*>(token_ptr));\n            str.append(ptr, token_len);\n          } else if (\n              vbd &\n              WUFFS_BASE__TOKEN__VBD__STRING__CONVERT_1_DST_4_SRC_BACKSLASH_X) {\n            wuffs_base__slice_u8 encoded =\n                wuffs_base__make_slice_u8(token_ptr, token_len);\n           " +
+	" while (encoded.len > 0) {\n              uint8_t decoded[64];\n              constexpr bool src_closed = true;\n              wuffs_base__transform__output o = wuffs_base__base_16__decode4(\n                  wuffs_base__make_slice_u8(&decoded[0], sizeof decoded),\n                  encoded, src_closed, WUFFS_BASE__BASE_16__DEFAULT_OPTIONS);\n              if (o.status.is_error()) {\n                ret_error_message = o.status.message();\n                goto done;\n              } else if ((o.num_dst > (sizeof decoded)) ||\n                         (o.num_src > encoded.len)) {\n                ret_error_message =\n                    \"wuffs_aux::JsonDecoder: internal error: inconsistent \"\n                    \"base16 decoding\";\n                goto done;\n              }\n              str.append(  // Convert from (uint8_t*).\n                  static_cast<const char*>(static_cast<void*>(&decoded[0])),\n                  o.num_dst);\n              encoded.ptr += o.num_src;\n              encoded.len -= o.num_src;\n           " +
+	" }\n          } else {\n            goto fail;\n          }\n          if (token.continued()) {\n            continue;\n          }\n          ret_error_message =\n              (vbd & WUFFS_BASE__TOKEN__VBD__STRING__CHAIN_MUST_BE_UTF_8)\n                  ? callbacks.AppendTextString(std::move(str))\n                  : callbacks.AppendByteString(std::move(str));\n          str.clear();\n          goto parsed_a_value;\n        }\n\n        case WUFFS_BASE__TOKEN__VBC__UNICODE_CODE_POINT: {\n          uint8_t u[WUFFS_BASE__UTF_8__BYTE_LENGTH__MAX_INCL];\n          size_t n = wuffs_base__utf_8__encode(\n              wuffs_base__make_slice_u8(\n                  &u[0], WUFFS_BASE__UTF_8__BYTE_LENGTH__MAX_INCL),\n              static_cast<uint32_t>(vbd));\n          const char* ptr =  // Convert from (uint8_t*).\n              static_cast<const char*>(static_cast<void*>(&u[0]));\n          str.append(ptr, n);\n          if (token.continued()) {\n            continue;\n          }\n          goto fail;\n        }\n\n        case WUFFS_BASE__" +
+	"TOKEN__VBC__LITERAL: {\n          ret_error_message =\n              (vbd & WUFFS_BASE__TOKEN__VBD__LITERAL__NULL)\n                  ? callbacks.AppendNull()\n                  : callbacks.AppendBool(vbd &\n                                         WUFFS_BASE__TOKEN__VBD__LITERAL__TRUE);\n          goto parsed_a_value;\n        }\n\n        case WUFFS_BASE__TOKEN__VBC__NUMBER: {\n          if (vbd & WUFFS_BASE__TOKEN__VBD__NUMBER__FORMAT_TEXT) {\n            if (vbd & WUFFS_BASE__TOKEN__VBD__NUMBER__CONTENT_INTEGER_SIGNED) {\n              wuffs_base__result_i64 r = wuffs_base__parse_number_i64(\n                  wuffs_base__make_slice_u8(token_ptr, token_len),\n                  WUFFS_BASE__PARSE_NUMBER_XXX__DEFAULT_OPTIONS);\n              if (r.status.is_ok()) {\n                ret_error_message = callbacks.AppendI64(r.value);\n                goto parsed_a_value;\n              }\n            }\n            if (vbd & WUFFS_BASE__TOKEN__VBD__NUMBER__CONTENT_FLOATING_POINT) {\n              wuffs_base__result_f64 r = wuffs_ba" +
+	"se__parse_number_f64(\n                  wuffs_base__make_slice_u8(token_ptr, token_len),\n                  WUFFS_BASE__PARSE_NUMBER_XXX__DEFAULT_OPTIONS);\n              if (r.status.is_ok()) {\n                ret_error_message = callbacks.AppendF64(r.value);\n                goto parsed_a_value;\n              }\n            }\n          } else if (vbd & WUFFS_BASE__TOKEN__VBD__NUMBER__CONTENT_NEG_INF) {\n            ret_error_message = callbacks.AppendF64(\n                wuffs_base__ieee_754_bit_representation__from_u64_to_f64(\n                    0xFFF0000000000000ul));\n            goto parsed_a_value;\n          } else if (vbd & WUFFS_BASE__TOKEN__VBD__NUMBER__CONTENT_POS_INF) {\n            ret_error_message = callbacks.AppendF64(\n                wuffs_base__ieee_754_bit_representation__from_u64_to_f64(\n                    0x7FF0000000000000ul));\n            goto parsed_a_value;\n          } else if (vbd & WUFFS_BASE__TOKEN__VBD__NUMBER__CONTENT_NEG_NAN) {\n            ret_error_message = callbacks.AppendF64(\n   " +
+	"             wuffs_base__ieee_754_bit_representation__from_u64_to_f64(\n                    0xFFFFFFFFFFFFFFFFul));\n            goto parsed_a_value;\n          } else if (vbd & WUFFS_BASE__TOKEN__VBD__NUMBER__CONTENT_POS_NAN) {\n            ret_error_message = callbacks.AppendF64(\n                wuffs_base__ieee_754_bit_representation__from_u64_to_f64(\n                    0x7FFFFFFFFFFFFFFFul));\n            goto parsed_a_value;\n          }\n          goto fail;\n        }\n      }\n\n    fail:\n      ret_error_message =\n          \"wuffs_aux::JsonDecoder: internal error: unexpected token\";\n      goto done;\n\n    parsed_a_value:\n      if (!ret_error_message.empty() || (depth == 0)) {\n        goto done;\n      }\n    }\n  } while (false);\n\ndone:\n  DecodeJsonResult result(\n      std::move(ret_error_message),\n      wuffs_base__u64__sat_add(io_buf->meta.pos, cursor_index));\n  callbacks.Done(result, input, *io_buf);\n  return result;\n}\n\n#undef WUFFS_AUX__DECODE_JSON__GET_THE_NEXT_TOKEN\n\n}  // namespace wuffs_aux\n\n#endif  // !def" +
+	"ined(WUFFS_CONFIG__MODULES) ||\n        // defined(WUFFS_CONFIG__MODULE__AUX__JSON)\n" +
 	""
 
 const AuxJsonHh = "" +
diff --git a/release/c/wuffs-unsupported-snapshot.c b/release/c/wuffs-unsupported-snapshot.c
index 03baae5..80f5875 100644
--- a/release/c/wuffs-unsupported-snapshot.c
+++ b/release/c/wuffs-unsupported-snapshot.c
@@ -29363,6 +29363,55 @@
                           sync_io::Input& input,
                           IOBuffer& buffer) {}
 
+#define WUFFS_AUX__DECODE_JSON__GET_THE_NEXT_TOKEN                       \
+  while (tok_buf.meta.ri >= tok_buf.meta.wi) {                           \
+    if (tok_status.repr == nullptr) {                                    \
+    } else if (tok_status.repr == wuffs_base__suspension__short_write) { \
+      tok_buf.compact();                                                 \
+    } else if (tok_status.repr == wuffs_base__suspension__short_read) {  \
+      if (!io_error_message.empty()) {                                   \
+        ret_error_message = std::move(io_error_message);                 \
+        goto done;                                                       \
+      } else if (cursor_index != io_buf->meta.ri) {                      \
+        ret_error_message =                                              \
+            "wuffs_aux::JsonDecoder: internal error: bad cursor_index";  \
+        goto done;                                                       \
+      } else if (io_buf->meta.closed) {                                  \
+        ret_error_message =                                              \
+            "wuffs_aux::JsonDecoder: internal error: io_buf is closed";  \
+        goto done;                                                       \
+      }                                                                  \
+      io_buf->compact();                                                 \
+      if (io_buf->meta.wi >= io_buf->data.len) {                         \
+        ret_error_message =                                              \
+            "wuffs_aux::JsonDecoder: internal error: io_buf is full";    \
+        goto done;                                                       \
+      }                                                                  \
+      cursor_index = io_buf->meta.ri;                                    \
+      io_error_message = input.CopyIn(io_buf);                           \
+    } else {                                                             \
+      ret_error_message = tok_status.message();                          \
+      goto done;                                                         \
+    }                                                                    \
+    if (WUFFS_JSON__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE != 0) {      \
+      ret_error_message =                                                \
+          "wuffs_aux::JsonDecoder: internal error: bad WORKBUF_LEN";     \
+      goto done;                                                         \
+    }                                                                    \
+    wuffs_base__slice_u8 work_buf = wuffs_base__empty_slice_u8();        \
+    tok_status = dec->decode_tokens(&tok_buf, io_buf, work_buf);         \
+  }                                                                      \
+  wuffs_base__token token = tok_buf.data.ptr[tok_buf.meta.ri++];         \
+  uint64_t token_len = token.length();                                   \
+  if ((io_buf->meta.ri < cursor_index) ||                                \
+      ((io_buf->meta.ri - cursor_index) < token_len)) {                  \
+    ret_error_message =                                                  \
+        "wuffs_aux::JsonDecoder: internal error: bad token indexes";     \
+    goto done;                                                           \
+  }                                                                      \
+  uint8_t* token_ptr = io_buf->data.ptr + cursor_index;                  \
+  cursor_index += token_len
+
 DecodeJsonResult  //
 DecodeJson(DecodeJsonCallbacks&& callbacks,
            sync_io::Input&& input,
@@ -29406,61 +29455,7 @@
     //  1. Get the next token.
     //  2. Process that token.
     while (true) {
-      // 1. Get the next token.
-
-      while (tok_buf.meta.ri >= tok_buf.meta.wi) {
-        if (tok_status.repr == nullptr) {
-          // No-op.
-        } else if (tok_status.repr == wuffs_base__suspension__short_write) {
-          tok_buf.compact();
-        } else if (tok_status.repr == wuffs_base__suspension__short_read) {
-          // Read from input to io_buf.
-          if (!io_error_message.empty()) {
-            ret_error_message = std::move(io_error_message);
-            goto done;
-          } else if (cursor_index != io_buf->meta.ri) {
-            ret_error_message =
-                "wuffs_aux::JsonDecoder: internal error: bad cursor_index";
-            goto done;
-          } else if (io_buf->meta.closed) {
-            ret_error_message =
-                "wuffs_aux::JsonDecoder: internal error: io_buf is closed";
-            goto done;
-          }
-          io_buf->compact();
-          if (io_buf->meta.wi >= io_buf->data.len) {
-            ret_error_message =
-                "wuffs_aux::JsonDecoder: internal error: io_buf is full";
-            goto done;
-          }
-          cursor_index = io_buf->meta.ri;
-          io_error_message = input.CopyIn(io_buf);
-        } else {
-          ret_error_message = tok_status.message();
-          goto done;
-        }
-
-        if (WUFFS_JSON__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE != 0) {
-          ret_error_message =
-              "wuffs_aux::JsonDecoder: internal error: bad WORKBUF_LEN";
-          goto done;
-        }
-        wuffs_base__slice_u8 work_buf = wuffs_base__empty_slice_u8();
-        tok_status = dec->decode_tokens(&tok_buf, io_buf, work_buf);
-      }
-
-      wuffs_base__token token = tok_buf.data.ptr[tok_buf.meta.ri++];
-      uint64_t token_len = token.length();
-      if ((io_buf->meta.ri < cursor_index) ||
-          ((io_buf->meta.ri - cursor_index) < token_len)) {
-        ret_error_message =
-            "wuffs_aux::JsonDecoder: internal error: bad token indexes";
-        goto done;
-      }
-      uint8_t* token_ptr = io_buf->data.ptr + cursor_index;
-      cursor_index += token_len;
-
-      // 2. Process that token.
+      WUFFS_AUX__DECODE_JSON__GET_THE_NEXT_TOKEN;
 
       int64_t vbc = token.value_base_category();
       uint64_t vbd = token.value_base_detail();
@@ -29620,6 +29615,8 @@
   return result;
 }
 
+#undef WUFFS_AUX__DECODE_JSON__GET_THE_NEXT_TOKEN
+
 }  // namespace wuffs_aux
 
 #endif  // !defined(WUFFS_CONFIG__MODULES) ||