diff uptools/libcoding/decode_helpers.c @ 328:978571e23318

uptools started with libcoding
author Mychaela Falconia <falcon@freecalypso.org>
date Sat, 03 Feb 2018 20:07:05 +0000
parents
children 1c599681fd60
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/uptools/libcoding/decode_helpers.c	Sat Feb 03 20:07:05 2018 +0000
@@ -0,0 +1,55 @@
+/*
+ * This library module implements the is_decoded_char_ok() and emit_utf8_char()
+ * functions used by gsm7_to_ascii_or_ext() and ucs2_to_ascii_or_ext().
+ */
+
+#include <sys/types.h>
+
+is_decoded_char_ok(uni, ascii_ext)
+	unsigned uni;
+{
+	unsigned upper_limit;
+
+	/* weed out control chars first */
+	if (uni < 0x20)
+		return(0);
+	if (uni >= 0x7F && uni <= 0x9F)
+		return(0);
+	/* see what range our output encoding allows */
+	switch (ascii_ext) {
+	case 0:
+		upper_limit = 0x7F;
+		break;
+	case 1:
+		upper_limit = 0xFF;
+		break;
+	case 2:
+		upper_limit = 0xFFFF;
+		break;
+	default:
+		upper_limit = 0;
+	}
+	if (uni <= upper_limit)
+		return(1);
+	else
+		return(0);
+}
+
+emit_utf8_char(uni, outp)
+	unsigned uni;
+	u_char *outp;
+{
+	if (uni < 0x80) {
+		*outp = uni;
+		return(1);
+	}
+	if (uni < 0x800) {
+		outp[0] = 0xC0 | (uni >> 6);
+		outp[1] = 0x80 | (uni & 0x3F);
+		return(2);
+	}
+	outp[0] = 0xE0 | (uni >> 12);
+	outp[1] = 0x80 | ((uni >> 6) & 0x3F);
+	outp[2] = 0x80 | (uni & 0x3F);
+	return(3);
+}