* #31630: added libgsm
diff --git a/jni/libgsm/tls/ginger.c b/jni/libgsm/tls/ginger.c
new file mode 100644
index 0000000..579e4cf
--- /dev/null
+++ b/jni/libgsm/tls/ginger.c
@@ -0,0 +1,54 @@
+/*
+ * Copyright 1996 by Jutta Degener and Carsten Bormann, Technische
+ * Universitaet Berlin.  See the accompanying file "COPYRIGHT" for
+ * details.  THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
+ */
+
+/*$Header*/
+
+/* Generate code to pack a bit array from a name:#bits description */
+
+#include	<stdio.h>
+#include	"taste.h"
+#include	"proto.h"
+#include	<limits.h>
+
+/* This module is the opposite of sour.   Sweet was already taken,
+ * that's why it's called ginger.  (Add one point if that reminds
+ * you of Gary Larson.)
+ */
+
+#define WORD_BITS	16	/* sizeof(uword) * CHAR_BIT on the 
+				 * target architecture---if this isn't 16,
+				 * you're in trouble with this library anyway.
+				 */
+
+#define CHAR_BITS	 8	/* CHAR_BIT on the target architecture---
+				 * if this isn't 8, you're in *deep* trouble.
+				 */
+
+void write_code P2((s_spex, n_spex), struct spex * s_spex, int n_spex)
+{
+	struct spex	* sp = s_spex;
+	int		  n_in = 0;
+
+	printf("uword sr = 0;\n");
+
+	for (; n_spex > 0; n_spex--, sp++) {
+
+		while (n_in < sp->varsize) {
+			if (n_in) printf("sr |= (uword)*c++ << %d;\n", n_in);
+			else printf("sr = *c++;\n");
+			n_in += CHAR_BITS;
+		}
+
+		printf("%s = sr & %#x;  sr >>= %d;\n",
+			sp->var, ~(~0U << sp->varsize), sp->varsize);
+
+		n_in -= sp->varsize;
+	}
+
+	if (n_in > 0) {
+		fprintf(stderr, "%d bits left over\n", n_in);
+	}
+}