Remove use of wuffs_base__token__link_prev
diff --git a/example/jsonptr/jsonptr.cc b/example/jsonptr/jsonptr.cc
index f5d72ab..e4aa8a7 100644
--- a/example/jsonptr/jsonptr.cc
+++ b/example/jsonptr/jsonptr.cc
@@ -838,7 +838,7 @@
 }
 
 const char*  //
-handle_token(wuffs_base__token t) {
+handle_token(wuffs_base__token t, bool start_of_token_chain) {
   do {
     int64_t vbc = t.value_base_category();
     uint64_t vbd = t.value_base_detail();
@@ -888,7 +888,7 @@
 
     // Write preceding whitespace and punctuation, if it wasn't ']', '}' or a
     // continuation of a multi-token chain.
-    if (!t.link_prev()) {
+    if (start_of_token_chain) {
       if (g_ctx == context::in_dict_after_key) {
         TRY(write_dst(": ", g_flags.compact_output ? 1 : 2));
       } else if (g_ctx != context::none) {
@@ -962,7 +962,7 @@
         return nullptr;
 
       case WUFFS_BASE__TOKEN__VBC__STRING:
-        if (!t.link_prev()) {
+        if (start_of_token_chain) {
           TRY(write_dst("\"", 1));
           g_query.restart_fragment(in_dict_before_key() &&
                                    g_query.is_at(g_depth));
@@ -986,7 +986,7 @@
         goto after_value;
 
       case WUFFS_BASE__TOKEN__VBC__UNICODE_CODE_POINT:
-        if (!t.link_prev() || !t.link_next()) {
+        if (!t.link_next()) {
           return "main: internal error: unexpected unlinked token";
         }
         TRY(handle_unicode_code_point(vbd));
@@ -1033,6 +1033,7 @@
 main1(int argc, char** argv) {
   TRY(initialize_globals(argc, argv));
 
+  bool start_of_token_chain = false;
   while (true) {
     wuffs_base__status status = g_dec.decode_tokens(
         &g_tok, &g_src,
@@ -1048,10 +1049,12 @@
 
       // Skip filler tokens (e.g. whitespace).
       if (t.value() == 0) {
+        start_of_token_chain = !t.link_next();
         continue;
       }
 
-      const char* z = handle_token(t);
+      const char* z = handle_token(t, start_of_token_chain);
+      start_of_token_chain = !t.link_next();
       if (z == nullptr) {
         continue;
       } else if (z == g_eod) {
diff --git a/fuzz/c/std/json_fuzzer.c b/fuzz/c/std/json_fuzzer.c
index 9ccbbe1..c3ae16e 100644
--- a/fuzz/c/std/json_fuzzer.c
+++ b/fuzz/c/std/json_fuzzer.c
@@ -85,7 +85,6 @@
 
 const char*  //
 fuzz_one_token(wuffs_base__token t,
-               wuffs_base__token* prev_token,
                wuffs_base__io_buffer* src,
                size_t* ti,
                stack_element* stack,
@@ -102,11 +101,6 @@
     return "fuzz: internal error: token high bit was not zero";
   }
 
-  if (wuffs_base__token__link_next(prev_token) !=
-      (wuffs_base__token__link_prev(&t))) {
-    return "fuzz: internal error: inconsistent link bits";
-  }
-
   int64_t vbc = wuffs_base__token__value_base_category(&t);
   uint64_t vbd = wuffs_base__token__value_base_detail(&t);
 
@@ -290,7 +284,7 @@
       }),
   });
 
-  wuffs_base__token prev_token = wuffs_base__make_token(0);
+  wuffs_base__token final_token = wuffs_base__make_token(0);
   uint32_t no_progress_count = 0;
 
   stack_element stack[STACK_SIZE];
@@ -335,12 +329,11 @@
 
     while (tok.meta.ri < tok.meta.wi) {  // Inner loop.
       wuffs_base__token t = tok.data.ptr[tok.meta.ri++];
-      const char* z =
-          fuzz_one_token(t, &prev_token, &src, &ti, &stack[0], &depth);
+      const char* z = fuzz_one_token(t, &src, &ti, &stack[0], &depth);
       if (z != NULL) {
         return z;
       }
-      prev_token = t;
+      final_token = t;
     }  // Inner loop.
 
     // ----
@@ -375,7 +368,7 @@
 
   if (depth != 0) {
     return "fuzz: internal error: decoded OK but final depth was not zero";
-  } else if (wuffs_base__token__link_next(&prev_token)) {
+  } else if (wuffs_base__token__link_next(&final_token)) {
     return "fuzz: internal error: decoded OK but final token had link_next";
   }
   return NULL;