diff f-demime/qpdec.c @ 0:7e0d08176f32

f-demime starting code
author Mychaela Falconia <falcon@freecalypso.org>
date Sat, 06 May 2023 06:14:03 +0000
parents
children 05651a1b8ba8
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/f-demime/qpdec.c	Sat May 06 06:14:03 2023 +0000
@@ -0,0 +1,76 @@
+/*
+ * This module implements quoted-printable decoding.
+ */
+
+#include <ctype.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <strings.h>
+#include "defs.h"
+
+extern void (*dec_outf)();
+
+int qpdec_err_flag;
+
+static void
+strip_trailing_lwsp(line)
+	char *line;
+{
+	char *cp;
+
+	cp = index(line, '\0');
+	while (cp > line && isspace(cp[-1])
+		cp--;
+	*cp = '\0';
+}
+
+static int
+decode_hex_digit(c)
+{
+	if (isdigit(c))
+		return(c - '0');
+	else if (isupper(c))
+		return(c - 'A' + 10);
+	else
+		return(c - 'a' + 10);
+}
+
+static int
+decode_hex_byte(cp)
+	char *cp;
+{
+	int u, l;
+
+	u = decode_hex_digit(cp[0]);
+	l = decode_hex_digit(cp[1]);
+	return (u << 4) | l;
+}
+
+void
+qpdec_input_line(line)
+	char *line;
+{
+	char *cp;
+	int c;
+
+	strip_trailing_lwsp(line);
+	for (cp = line; *cp; ) {
+		c = *cp++ & 0xFF;
+		if (c != '=') {
+			dec_outf(c);
+			continue;
+		}
+		if (!*cp)
+			return;
+		if (isxdigit(cp[0]) && isxdigit(cp[1])) {
+			c = decode_hex_byte(cp);
+			cp += 2;
+			dec_outf(c);
+			continue;
+		}
+		qpdec_err_flag = 1;
+		dec_outf('=');
+	}
+	dec_outf('\n');
+}