Import ezmlm-idx 0.40
[ezmlm] / encodeQ.c
diff --git a/encodeQ.c b/encodeQ.c
new file mode 100644 (file)
index 0000000..080b875
--- /dev/null
+++ b/encodeQ.c
@@ -0,0 +1,58 @@
+/* $Id: encodeQ.c,v 1.2 1998/02/28 19:03:02 lindberg Exp $*/
+/* $Name: ezmlm-idx-040 $*/
+
+#include "errtxt.h"
+#include "mime.h"
+#include "stralloc.h"
+#include "strerr.h"
+
+static void die_nomem(fatal)
+  char *fatal;
+{
+  strerr_die2x(111,fatal,ERR_NOMEM);
+}
+
+static char *hexchar = "0123456789ABCDEF";
+
+void encodeQ(indata,n,outdata,fatal)
+char *indata;
+unsigned int n;
+stralloc *outdata;
+char *fatal;
+
+       /* converts any character with the high order bit set to */
+       /* quoted printable. In: n chars of indata, out: stralloc outdata*/
+
+{
+  register char *cpout;
+  register char ch;
+  unsigned int i;
+  char *cpin;
+
+  cpin = indata;
+  i = 0;
+       /* max 3 outchars per inchar  & 2 char newline per 72 chars */
+  if (!stralloc_copys(outdata,"")) die_nomem(fatal);
+  if (!stralloc_ready(outdata,n * 3 + n/36)) die_nomem(fatal); /* worst case */
+  cpout = outdata->s;
+  while (n--) {
+    ch = *cpin++;
+    if (ch != ' ' && ch != '\n' && ch != '\t' &&
+          (ch > 126 || ch < 33 || ch == 61)) {
+      *(cpout++) = '=';
+      *(cpout++) = hexchar[(ch >> 4) & 0xf];
+      *(cpout++) = hexchar[ch & 0xf];
+      i += 3;
+    } else {
+      if (ch == '\n')
+        i = 0;
+      *(cpout++) = ch;
+    }
+    if (i >= 72) {
+      *(cpout++) = '=';
+      *(cpout++) = '\n';
+      i = 0;
+    }
+  }
+  outdata->len = (unsigned int) (cpout - outdata->s);
+}