summaryrefslogtreecommitdiff
path: root/libmailutils/filter/binflt.c
diff options
context:
space:
mode:
Diffstat (limited to 'libmailutils/filter/binflt.c')
-rw-r--r--libmailutils/filter/binflt.c113
1 files changed, 113 insertions, 0 deletions
diff --git a/libmailutils/filter/binflt.c b/libmailutils/filter/binflt.c
new file mode 100644
index 000000000..d3de5185c
--- /dev/null
+++ b/libmailutils/filter/binflt.c
@@ -0,0 +1,113 @@
+/* GNU Mailutils -- a suite of utilities for electronic mail
+ Copyright (C) 2009, 2010 Free Software Foundation, Inc.
+
+ This library is free software; you can redistribute it and/or modify
+ it under the terms of the GNU Lesser General Public License as published by
+ the Free Software Foundation; either version 3, or (at your option)
+ any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with GNU Mailutils. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+#include <stdlib.h>
+#include <string.h>
+#include <mailutils/errno.h>
+#include <mailutils/filter.h>
+
+static enum mu_filter_result
+_copy_codec (void *xd MU_ARG_UNUSED,
+ enum mu_filter_command cmd,
+ struct mu_filter_io *iobuf)
+{
+ size_t osize;
+
+ switch (cmd)
+ {
+ case mu_filter_init:
+ case mu_filter_done:
+ return mu_filter_ok;
+ default:
+ break;
+ }
+
+ osize = iobuf->osize;
+ if (osize > iobuf->isize)
+ osize = iobuf->isize;
+ memcpy (iobuf->output, iobuf->input, osize);
+ iobuf->isize = osize;
+ iobuf->osize = osize;
+ return mu_filter_ok;
+}
+
+static enum mu_filter_result
+_bit7_coder (void *xd MU_ARG_UNUSED,
+ enum mu_filter_command cmd,
+ struct mu_filter_io *iobuf)
+{
+ size_t i;
+ const unsigned char *iptr;
+ size_t isize;
+ char *optr;
+ size_t osize;
+
+ switch (cmd)
+ {
+ case mu_filter_init:
+ case mu_filter_done:
+ return mu_filter_ok;
+ default:
+ break;
+ }
+
+ iptr = (const unsigned char *) iobuf->input;
+ isize = iobuf->isize;
+ optr = iobuf->output;
+ osize = iobuf->osize;
+
+ if (osize > isize)
+ osize = isize;
+ for (i = 0; i < osize; i++)
+ *optr++ = *iptr++ & 0x7f;
+ iobuf->isize = osize;
+ iobuf->osize = osize;
+ return mu_filter_ok;
+}
+
+static struct _mu_filter_record _binary_filter = {
+ "binary",
+ 0,
+ NULL,
+ _copy_codec,
+ _copy_codec
+};
+
+mu_filter_record_t mu_binary_filter = &_binary_filter;
+
+
+static struct _mu_filter_record _bit8_filter = {
+ "bit8",
+ 0,
+ NULL,
+ _copy_codec,
+ _copy_codec
+};
+
+mu_filter_record_t mu_bit8_filter = &_bit8_filter;
+
+static struct _mu_filter_record _bit7_filter = {
+ "bit7",
+ 0,
+ NULL,
+ _bit7_coder,
+ _copy_codec
+};
+
+mu_filter_record_t mu_bit7_filter = &_bit7_filter;

Return to:

Send suggestions and report system problems to the System administrator.