Add wuffs_aux::private_impl::ErrorMessages type
diff --git a/internal/cgen/auxiliary/base.cc b/internal/cgen/auxiliary/base.cc
index 7de4143..a43a83e 100644
--- a/internal/cgen/auxiliary/base.cc
+++ b/internal/cgen/auxiliary/base.cc
@@ -166,23 +166,30 @@
 
 namespace private_impl {
 
-const char ErrMsg_MaxInclMetadataLengthExceeded[] =  //
-    "wuffs_aux::private_impl: max_incl_metadata_length exceeded";
-const char ErrMsg_OutOfMemory[] =  //
-    "wuffs_aux::private_impl: out of memory";
-const char ErrMsg_UnexpectedEndOfFile[] =  //
-    "wuffs_aux::private_impl: unexpected end of file";
-const char ErrMsg_UnsupportedMetadata[] =  //
-    "wuffs_aux::private_impl: unsupported metadata";
-const char ErrMsg_UnsupportedNegativeAdvance[] =  //
-    "wuffs_aux::private_impl: unsupported negative advance";
+struct ErrorMessages {
+  const char* max_incl_metadata_length_exceeded;
+  const char* out_of_memory;
+  const char* unexpected_end_of_file;
+  const char* unsupported_metadata;
+  const char* unsupported_negative_advance;
+
+  // If adding new "const char*" typed fields to this struct, either add them
+  // after existing fields or, if re-ordering fields, make sure that you update
+  // all of the "const private_impl::ErrorMessages FooBarErrorMessages" values
+  // in all of the sibling *.cc files.
+
+  static inline const char* resolve(const char* s) {
+    return s ? s : "wuffs_aux::private_impl: unknown error";
+  };
+};
 
 std::string  //
-AdvanceIOBufferTo(sync_io::Input& input,
+AdvanceIOBufferTo(const ErrorMessages& error_messages,
+                  sync_io::Input& input,
                   IOBuffer& io_buf,
                   uint64_t absolute_position) {
   if (absolute_position < io_buf.reader_position()) {
-    return ErrMsg_UnsupportedNegativeAdvance;
+    return error_messages.resolve(error_messages.unsupported_negative_advance);
   }
   while (true) {
     uint64_t relative_position = absolute_position - io_buf.reader_position();
@@ -190,7 +197,7 @@
       io_buf.meta.ri += (size_t)relative_position;
       break;
     } else if (io_buf.meta.closed) {
-      return ErrMsg_UnexpectedEndOfFile;
+      return error_messages.resolve(error_messages.unexpected_end_of_file);
     }
     io_buf.meta.ri = io_buf.meta.wi;
     if (!input.BringsItsOwnIOBuffer()) {
@@ -206,6 +213,7 @@
 
 std::string  //
 HandleMetadata(
+    const ErrorMessages& error_messages,
     sync_io::Input& input,
     wuffs_base__io_buffer& io_buf,
     sync_io::DynIOBuffer& raw,
@@ -239,23 +247,25 @@
         }
         uint64_t num_to_copy = r.length();
         if (num_to_copy > (raw.m_max_incl - raw.m_buf.meta.wi)) {
-          return ErrMsg_MaxInclMetadataLengthExceeded;
+          return error_messages.resolve(
+              error_messages.max_incl_metadata_length_exceeded);
         } else if (num_to_copy > (raw.m_buf.data.len - raw.m_buf.meta.wi)) {
           switch (raw.grow(num_to_copy + raw.m_buf.meta.wi)) {
             case sync_io::DynIOBuffer::GrowResult::OK:
               break;
             case sync_io::DynIOBuffer::GrowResult::FailedMaxInclExceeded:
-              return ErrMsg_MaxInclMetadataLengthExceeded;
+              return error_messages.resolve(
+                  error_messages.max_incl_metadata_length_exceeded);
             case sync_io::DynIOBuffer::GrowResult::FailedOutOfMemory:
-              return ErrMsg_OutOfMemory;
+              return error_messages.resolve(error_messages.out_of_memory);
           }
         }
 
         if (io_buf.reader_position() > r.min_incl) {
-          return ErrMsg_UnsupportedMetadata;
+          return error_messages.resolve(error_messages.unsupported_metadata);
         } else {
           std::string error_message =
-              AdvanceIOBufferTo(input, io_buf, r.min_incl);
+              AdvanceIOBufferTo(error_messages, input, io_buf, r.min_incl);
           if (!error_message.empty()) {
             return error_message;
           }
@@ -271,7 +281,8 @@
           if (num_to_copy == 0) {
             break;
           } else if (io_buf.meta.closed) {
-            return ErrMsg_UnexpectedEndOfFile;
+            return error_messages.resolve(
+                error_messages.unexpected_end_of_file);
           } else if (!input.BringsItsOwnIOBuffer()) {
             io_buf.compact();
           }
@@ -284,7 +295,7 @@
       }
 
       default:
-        return ErrMsg_UnsupportedMetadata;
+        return error_messages.resolve(error_messages.unsupported_metadata);
     }
 
     if (status.repr == nullptr) {
@@ -297,9 +308,10 @@
         case sync_io::DynIOBuffer::GrowResult::OK:
           break;
         case sync_io::DynIOBuffer::GrowResult::FailedMaxInclExceeded:
-          return ErrMsg_MaxInclMetadataLengthExceeded;
+          return error_messages.resolve(
+              error_messages.max_incl_metadata_length_exceeded);
         case sync_io::DynIOBuffer::GrowResult::FailedOutOfMemory:
-          return ErrMsg_OutOfMemory;
+          return error_messages.resolve(error_messages.out_of_memory);
       }
     }
   }
diff --git a/internal/cgen/auxiliary/image.cc b/internal/cgen/auxiliary/image.cc
index 5d75d22..8ac36ab 100644
--- a/internal/cgen/auxiliary/image.cc
+++ b/internal/cgen/auxiliary/image.cc
@@ -237,30 +237,20 @@
 
 namespace {
 
-std::string  //
-DecodeImageErrorMessage(std::string s) {
-  if (!s.empty()) {
-    if (s == private_impl::ErrMsg_MaxInclMetadataLengthExceeded) {
-      return DecodeImage_MaxInclMetadataLengthExceeded;
-    } else if (s == private_impl::ErrMsg_OutOfMemory) {
-      return DecodeImage_OutOfMemory;
-    } else if (s == private_impl::ErrMsg_UnexpectedEndOfFile) {
-      return DecodeImage_UnexpectedEndOfFile;
-    } else if (s == private_impl::ErrMsg_UnsupportedMetadata) {
-      return DecodeImage_UnsupportedMetadata;
-    } else if (s == private_impl::ErrMsg_UnsupportedNegativeAdvance) {
-      return DecodeImage_UnsupportedImageFormat;
-    }
-  }
-  return s;
-}
+const private_impl::ErrorMessages DecodeImageErrorMessages = {
+    DecodeImage_MaxInclMetadataLengthExceeded,  //
+    DecodeImage_OutOfMemory,                    //
+    DecodeImage_UnexpectedEndOfFile,            //
+    DecodeImage_UnsupportedMetadata,            //
+    DecodeImage_UnsupportedImageFormat,         //
+};
 
 std::string  //
 DecodeImageAdvanceIOBufferTo(sync_io::Input& input,
                              wuffs_base__io_buffer& io_buf,
                              uint64_t absolute_position) {
-  return DecodeImageErrorMessage(
-      private_impl::AdvanceIOBufferTo(input, io_buf, absolute_position));
+  return private_impl::AdvanceIOBufferTo(DecodeImageErrorMessages, input,
+                                         io_buf, absolute_position);
 }
 
 wuffs_base__status  //
@@ -285,10 +275,10 @@
                           sync_io::Input& input,
                           wuffs_base__io_buffer& io_buf,
                           sync_io::DynIOBuffer& raw_metadata_buf) {
-  return DecodeImageErrorMessage(
-      private_impl::HandleMetadata(input, io_buf, raw_metadata_buf, DIHM0,
-                                   static_cast<void*>(image_decoder.get()),
-                                   DIHM1, static_cast<void*>(&callbacks)));
+  return private_impl::HandleMetadata(DecodeImageErrorMessages, input, io_buf,
+                                      raw_metadata_buf, DIHM0,
+                                      static_cast<void*>(image_decoder.get()),
+                                      DIHM1, static_cast<void*>(&callbacks));
 }
 
 DecodeImageResult  //
diff --git a/release/c/wuffs-unsupported-snapshot.c b/release/c/wuffs-unsupported-snapshot.c
index 5a649fc..8974e21 100644
--- a/release/c/wuffs-unsupported-snapshot.c
+++ b/release/c/wuffs-unsupported-snapshot.c
@@ -42225,23 +42225,30 @@
 
 namespace private_impl {
 
-const char ErrMsg_MaxInclMetadataLengthExceeded[] =  //
-    "wuffs_aux::private_impl: max_incl_metadata_length exceeded";
-const char ErrMsg_OutOfMemory[] =  //
-    "wuffs_aux::private_impl: out of memory";
-const char ErrMsg_UnexpectedEndOfFile[] =  //
-    "wuffs_aux::private_impl: unexpected end of file";
-const char ErrMsg_UnsupportedMetadata[] =  //
-    "wuffs_aux::private_impl: unsupported metadata";
-const char ErrMsg_UnsupportedNegativeAdvance[] =  //
-    "wuffs_aux::private_impl: unsupported negative advance";
+struct ErrorMessages {
+  const char* max_incl_metadata_length_exceeded;
+  const char* out_of_memory;
+  const char* unexpected_end_of_file;
+  const char* unsupported_metadata;
+  const char* unsupported_negative_advance;
+
+  // If adding new "const char*" typed fields to this struct, either add them
+  // after existing fields or, if re-ordering fields, make sure that you update
+  // all of the "const private_impl::ErrorMessages FooBarErrorMessages" values
+  // in all of the sibling *.cc files.
+
+  static inline const char* resolve(const char* s) {
+    return s ? s : "wuffs_aux::private_impl: unknown error";
+  };
+};
 
 std::string  //
-AdvanceIOBufferTo(sync_io::Input& input,
+AdvanceIOBufferTo(const ErrorMessages& error_messages,
+                  sync_io::Input& input,
                   IOBuffer& io_buf,
                   uint64_t absolute_position) {
   if (absolute_position < io_buf.reader_position()) {
-    return ErrMsg_UnsupportedNegativeAdvance;
+    return error_messages.resolve(error_messages.unsupported_negative_advance);
   }
   while (true) {
     uint64_t relative_position = absolute_position - io_buf.reader_position();
@@ -42249,7 +42256,7 @@
       io_buf.meta.ri += (size_t)relative_position;
       break;
     } else if (io_buf.meta.closed) {
-      return ErrMsg_UnexpectedEndOfFile;
+      return error_messages.resolve(error_messages.unexpected_end_of_file);
     }
     io_buf.meta.ri = io_buf.meta.wi;
     if (!input.BringsItsOwnIOBuffer()) {
@@ -42265,6 +42272,7 @@
 
 std::string  //
 HandleMetadata(
+    const ErrorMessages& error_messages,
     sync_io::Input& input,
     wuffs_base__io_buffer& io_buf,
     sync_io::DynIOBuffer& raw,
@@ -42298,23 +42306,25 @@
         }
         uint64_t num_to_copy = r.length();
         if (num_to_copy > (raw.m_max_incl - raw.m_buf.meta.wi)) {
-          return ErrMsg_MaxInclMetadataLengthExceeded;
+          return error_messages.resolve(
+              error_messages.max_incl_metadata_length_exceeded);
         } else if (num_to_copy > (raw.m_buf.data.len - raw.m_buf.meta.wi)) {
           switch (raw.grow(num_to_copy + raw.m_buf.meta.wi)) {
             case sync_io::DynIOBuffer::GrowResult::OK:
               break;
             case sync_io::DynIOBuffer::GrowResult::FailedMaxInclExceeded:
-              return ErrMsg_MaxInclMetadataLengthExceeded;
+              return error_messages.resolve(
+                  error_messages.max_incl_metadata_length_exceeded);
             case sync_io::DynIOBuffer::GrowResult::FailedOutOfMemory:
-              return ErrMsg_OutOfMemory;
+              return error_messages.resolve(error_messages.out_of_memory);
           }
         }
 
         if (io_buf.reader_position() > r.min_incl) {
-          return ErrMsg_UnsupportedMetadata;
+          return error_messages.resolve(error_messages.unsupported_metadata);
         } else {
           std::string error_message =
-              AdvanceIOBufferTo(input, io_buf, r.min_incl);
+              AdvanceIOBufferTo(error_messages, input, io_buf, r.min_incl);
           if (!error_message.empty()) {
             return error_message;
           }
@@ -42330,7 +42340,8 @@
           if (num_to_copy == 0) {
             break;
           } else if (io_buf.meta.closed) {
-            return ErrMsg_UnexpectedEndOfFile;
+            return error_messages.resolve(
+                error_messages.unexpected_end_of_file);
           } else if (!input.BringsItsOwnIOBuffer()) {
             io_buf.compact();
           }
@@ -42343,7 +42354,7 @@
       }
 
       default:
-        return ErrMsg_UnsupportedMetadata;
+        return error_messages.resolve(error_messages.unsupported_metadata);
     }
 
     if (status.repr == nullptr) {
@@ -42356,9 +42367,10 @@
         case sync_io::DynIOBuffer::GrowResult::OK:
           break;
         case sync_io::DynIOBuffer::GrowResult::FailedMaxInclExceeded:
-          return ErrMsg_MaxInclMetadataLengthExceeded;
+          return error_messages.resolve(
+              error_messages.max_incl_metadata_length_exceeded);
         case sync_io::DynIOBuffer::GrowResult::FailedOutOfMemory:
-          return ErrMsg_OutOfMemory;
+          return error_messages.resolve(error_messages.out_of_memory);
       }
     }
   }
@@ -42961,30 +42973,20 @@
 
 namespace {
 
-std::string  //
-DecodeImageErrorMessage(std::string s) {
-  if (!s.empty()) {
-    if (s == private_impl::ErrMsg_MaxInclMetadataLengthExceeded) {
-      return DecodeImage_MaxInclMetadataLengthExceeded;
-    } else if (s == private_impl::ErrMsg_OutOfMemory) {
-      return DecodeImage_OutOfMemory;
-    } else if (s == private_impl::ErrMsg_UnexpectedEndOfFile) {
-      return DecodeImage_UnexpectedEndOfFile;
-    } else if (s == private_impl::ErrMsg_UnsupportedMetadata) {
-      return DecodeImage_UnsupportedMetadata;
-    } else if (s == private_impl::ErrMsg_UnsupportedNegativeAdvance) {
-      return DecodeImage_UnsupportedImageFormat;
-    }
-  }
-  return s;
-}
+const private_impl::ErrorMessages DecodeImageErrorMessages = {
+    DecodeImage_MaxInclMetadataLengthExceeded,  //
+    DecodeImage_OutOfMemory,                    //
+    DecodeImage_UnexpectedEndOfFile,            //
+    DecodeImage_UnsupportedMetadata,            //
+    DecodeImage_UnsupportedImageFormat,         //
+};
 
 std::string  //
 DecodeImageAdvanceIOBufferTo(sync_io::Input& input,
                              wuffs_base__io_buffer& io_buf,
                              uint64_t absolute_position) {
-  return DecodeImageErrorMessage(
-      private_impl::AdvanceIOBufferTo(input, io_buf, absolute_position));
+  return private_impl::AdvanceIOBufferTo(DecodeImageErrorMessages, input,
+                                         io_buf, absolute_position);
 }
 
 wuffs_base__status  //
@@ -43009,10 +43011,10 @@
                           sync_io::Input& input,
                           wuffs_base__io_buffer& io_buf,
                           sync_io::DynIOBuffer& raw_metadata_buf) {
-  return DecodeImageErrorMessage(
-      private_impl::HandleMetadata(input, io_buf, raw_metadata_buf, DIHM0,
-                                   static_cast<void*>(image_decoder.get()),
-                                   DIHM1, static_cast<void*>(&callbacks)));
+  return private_impl::HandleMetadata(DecodeImageErrorMessages, input, io_buf,
+                                      raw_metadata_buf, DIHM0,
+                                      static_cast<void*>(image_decoder.get()),
+                                      DIHM1, static_cast<void*>(&callbacks));
 }
 
 DecodeImageResult  //