Allow calling pure functions after seeing an error

Updates #20
diff --git a/cmd/wuffs-c/internal/cgen/func.go b/cmd/wuffs-c/internal/cgen/func.go
index 7809567..f37e316 100644
--- a/cmd/wuffs-c/internal/cgen/func.go
+++ b/cmd/wuffs-c/internal/cgen/func.go
@@ -244,7 +244,13 @@
 		}
 		b.writes(";}")
 
-		b.writes("if (self->private_impl.magic != WUFFS_BASE__MAGIC) { return ")
+		if g.currFunk.astFunc.Effect().Pure() {
+			b.writes("if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&")
+			b.writes("    (self->private_impl.magic != WUFFS_BASE__DISABLED)) {")
+		} else {
+			b.writes("if (self->private_impl.magic != WUFFS_BASE__MAGIC) {")
+		}
+		b.writes("return ")
 		if g.currFunk.returnsStatus {
 			b.writes("(self->private_impl.magic == WUFFS_BASE__DISABLED) " +
 				"? wuffs_base__error__disabled_by_previous_error " +
diff --git a/release/c/wuffs-unsupported-snapshot.c b/release/c/wuffs-unsupported-snapshot.c
index aefde45..bb4fa0a 100644
--- a/release/c/wuffs-unsupported-snapshot.c
+++ b/release/c/wuffs-unsupported-snapshot.c
@@ -6339,7 +6339,8 @@
   if (!self) {
     return ((wuffs_base__range_ii_u64){0});
   }
-  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
+  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
+      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
     return ((wuffs_base__range_ii_u64){0});
   }
 
@@ -8155,7 +8156,8 @@
   if (!self) {
     return ((wuffs_base__range_ii_u64){0});
   }
-  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
+  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
+      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
     return ((wuffs_base__range_ii_u64){0});
   }
 
@@ -8811,7 +8813,8 @@
   if (!self) {
     return 0;
   }
-  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
+  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
+      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
     return 0;
   }
 
@@ -8828,7 +8831,8 @@
   if (!self) {
     return 0;
   }
-  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
+  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
+      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
     return 0;
   }
 
@@ -8842,7 +8846,8 @@
   if (!self) {
     return 0;
   }
-  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
+  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
+      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
     return 0;
   }
 
@@ -8856,7 +8861,8 @@
   if (!self) {
     return ((wuffs_base__rect_ie_u32){0});
   }
-  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
+  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
+      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
     return ((wuffs_base__rect_ie_u32){0});
   }
 
@@ -8876,7 +8882,8 @@
   if (!self) {
     return ((wuffs_base__range_ii_u64){0});
   }
-  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
+  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
+      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
     return ((wuffs_base__range_ii_u64){0});
   }
 
@@ -10925,7 +10932,8 @@
   if (!self) {
     return ((wuffs_base__range_ii_u64){0});
   }
-  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
+  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
+      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
     return ((wuffs_base__range_ii_u64){0});
   }
 
@@ -11410,7 +11418,8 @@
   if (!self) {
     return ((wuffs_base__range_ii_u64){0});
   }
-  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
+  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
+      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
     return ((wuffs_base__range_ii_u64){0});
   }
 
diff --git a/test/c/std/gif.c b/test/c/std/gif.c
index c81f937..dbd0284 100644
--- a/test/c/std/gif.c
+++ b/test/c/std/gif.c
@@ -1032,16 +1032,8 @@
     return status;
   }
 
-  // TODO: want_dirty_rect_is_empty should probably be false, not true. It's
-  // true because the error sets the decoder state (specifically, the
-  // private_impl.magic field) to WUFFS_BASE__DISABLED, so that
-  // frame_dirty_rect returns the zero value (an empty rect).
-  //
-  // Perhaps "not enough data" should be a warning, not an error??
-  //
-  // Ditto for the "too much data" test.
   return do_test_wuffs_gif_decode_expecting(
-      src, wuffs_base__error__not_enough_data, true);
+      src, wuffs_base__error__not_enough_data, false);
 }
 
 const char* test_wuffs_gif_decode_too_much_data() {
@@ -1058,7 +1050,7 @@
   }
 
   return do_test_wuffs_gif_decode_expecting(
-      src, wuffs_base__error__too_much_data, true);
+      src, wuffs_base__error__too_much_data, false);
 }
 
 const char* test_wuffs_gif_frame_dirty_rect() {