OSDN Git Service

Add PuTTY 0.61 to contrib directory.
[ffftp/ffftp.git] / contrib / putty / LDISCUCS.C
diff --git a/contrib/putty/LDISCUCS.C b/contrib/putty/LDISCUCS.C
new file mode 100644 (file)
index 0000000..eda383b
--- /dev/null
@@ -0,0 +1,100 @@
+/*\r
+ * ldisc.c: PuTTY line discipline. Sits between the input coming\r
+ * from keypresses in the window, and the output channel leading to\r
+ * the back end. Implements echo and/or local line editing,\r
+ * depending on what's currently configured.\r
+ */\r
+\r
+#include <stdio.h>\r
+#include <ctype.h>\r
+\r
+#include "putty.h"\r
+#include "terminal.h"\r
+#include "ldisc.h"\r
+\r
+void lpage_send(void *handle,\r
+               int codepage, char *buf, int len, int interactive)\r
+{\r
+    Ldisc ldisc = (Ldisc)handle;\r
+    wchar_t *widebuffer = 0;\r
+    int widesize = 0;\r
+    int wclen;\r
+\r
+    if (codepage < 0) {\r
+       ldisc_send(ldisc, buf, len, interactive);\r
+       return;\r
+    }\r
+\r
+    widesize = len * 2;\r
+    widebuffer = snewn(widesize, wchar_t);\r
+\r
+    wclen = mb_to_wc(codepage, 0, buf, len, widebuffer, widesize);\r
+    luni_send(ldisc, widebuffer, wclen, interactive);\r
+\r
+    sfree(widebuffer);\r
+}\r
+\r
+void luni_send(void *handle, wchar_t * widebuf, int len, int interactive)\r
+{\r
+    Ldisc ldisc = (Ldisc)handle;\r
+    int ratio = (in_utf(ldisc->term))?3:1;\r
+    char *linebuffer;\r
+    int linesize;\r
+    int i;\r
+    char *p;\r
+\r
+    linesize = len * ratio * 2;\r
+    linebuffer = snewn(linesize, char);\r
+\r
+    if (in_utf(ldisc->term)) {\r
+       /* UTF is a simple algorithm */\r
+       for (p = linebuffer, i = 0; i < len; i++) {\r
+           unsigned long ch = widebuf[i];\r
+\r
+           if ((ch & 0xF800) == 0xD800) {\r
+#ifdef PLATFORM_IS_UTF16\r
+               if (i+1 < len) {\r
+                   unsigned long ch2 = widebuf[i+1];\r
+                   if ((ch & 0xFC00) == 0xD800 &&\r
+                       (ch2 & 0xFC00) == 0xDC00) {\r
+                       ch = 0x10000 + ((ch & 0x3FF) << 10) + (ch2 & 0x3FF);\r
+                       i++;\r
+                   }\r
+               } else\r
+#endif\r
+               {\r
+                   /* Unrecognised UTF-16 sequence */\r
+                   ch = '.';\r
+               }\r
+           }\r
+\r
+           if (ch < 0x80) {\r
+               *p++ = (char) (ch);\r
+           } else if (ch < 0x800) {\r
+               *p++ = (char) (0xC0 | (ch >> 6));\r
+               *p++ = (char) (0x80 | (ch & 0x3F));\r
+           } else if (ch < 0x10000) {\r
+               *p++ = (char) (0xE0 | (ch >> 12));\r
+               *p++ = (char) (0x80 | ((ch >> 6) & 0x3F));\r
+               *p++ = (char) (0x80 | (ch & 0x3F));\r
+           } else {\r
+               *p++ = (char) (0xF0 | (ch >> 18));\r
+               *p++ = (char) (0x80 | ((ch >> 12) & 0x3F));\r
+               *p++ = (char) (0x80 | ((ch >> 6) & 0x3F));\r
+               *p++ = (char) (0x80 | (ch & 0x3F));\r
+           }\r
+       }\r
+    } else {\r
+       int rv;\r
+       rv = wc_to_mb(ldisc->term->ucsdata->line_codepage, 0, widebuf, len,\r
+                     linebuffer, linesize, NULL, NULL, ldisc->term->ucsdata);\r
+       if (rv >= 0)\r
+           p = linebuffer + rv;\r
+       else\r
+           p = linebuffer;\r
+    }\r
+    if (p > linebuffer)\r
+       ldisc_send(ldisc, linebuffer, p - linebuffer, interactive);\r
+\r
+    sfree(linebuffer);\r
+}\r