.B "#include <mLib/base64.h>"
.B "#include <mLib/base32.h>"
.B "#include <mLib/hex.h>"
-
+.PP
.B "#define CDCF_LOWERC ..."
.B "#define CDCF_IGNCASE ..."
.B "#define CDCF_NOEQPAD ..."
.B "#define CDCF_IGNINVCH ..."
.B "#define CDCF_IGNSPC ..."
.B "#define CDCF_IGNJUNK ..."
-
+.PP
.ta 2n
.B "enum {"
.B " CDCERR_OK = ...,"
.B " CDCERR_INVEQPAD = ...,"
.B " CDCERR_INVZPAD = ..."
.B "};"
-
+.PP
.B "typedef struct {"
.B " const char *name;"
.ta 2n +\w'\fBcodec *(*encoder)('u
.BI " codec *(*decoder)(unsigned " flags );
.B " ...\&"
.B "} codec_class;"
-
+.PP
.B "typedef struct {"
.B " const codec_ops *ops;"
.B "} codec;"
-
+.PP
.B "typedef struct {"
.B " const codec_class *c;"
.BI " int (*code)(codec *" c ", const void *" p ", size_t " sz ", dstr *" d );
.BI " void (*destroy)(codec *" c );
.B "} codec_ops;"
-
+.PP
.B "codec_class null_codec_class;"
.B "codec_class base64_class, file64_class, base64url_class;"
.B "codec_class base32_class, base32hex_class;"
.B "codec_class hex_class;"
-
+.PP
.BI "const char *codec_strerror(int " err ");"
.fi
.SH DESCRIPTION