]> asedeno.scripts.mit.edu Git - PuTTY.git/commitdiff
New centralised helper function dup_mb_to_wc().
authorSimon Tatham <anakin@pobox.com>
Mon, 27 Jul 2015 19:06:02 +0000 (20:06 +0100)
committerSimon Tatham <anakin@pobox.com>
Sat, 17 Oct 2015 16:30:16 +0000 (17:30 +0100)
PuTTY's main mb_to_wc() function is all very well for embedding in
fiddly data pipelines, but for the simple job of turning a C string
into a C wide string, really I want something much more like
dupprintf. So here is one.

I've had to put it in a new separate source file miscucs.c rather than
throwing it into misc.c, because misc.c is linked into tools that
don't also include a module providing the internal Unicode API (winucs
or uxucs). The new miscucs.c appears only in Unicode-using tools.

(cherry picked from commit 7762d7122609207059cf5cf58fb2b9c2de98dd36)

Recipe
misc.h
miscucs.c [new file with mode: 0644]

diff --git a/Recipe b/Recipe
index ca6369d528c7b5279df562267be49ddf2c4cac0c..fc663296670c87aa1e7f81e2eb1a0a79c54b035b 100644 (file)
--- a/Recipe
+++ b/Recipe
@@ -203,10 +203,10 @@ TERMINAL = terminal wcwidth ldiscucs logging tree234 minibidi
 
 # GUI front end and terminal emulator (putty, puttytel).
 GUITERM  = TERMINAL window windlg winctrls sizetip winucs winprint
-         + winutils wincfg sercfg winhelp winjump
+         + winutils wincfg sercfg winhelp winjump miscucs
 
 # Same thing on Unix.
-UXTERM   = TERMINAL uxcfg sercfg uxucs uxprint timing callback
+UXTERM   = TERMINAL uxcfg sercfg uxucs uxprint timing callback miscucs
 GTKTERM  = UXTERM gtkwin gtkcfg gtkdlg gtkfont gtkcols xkeysym
 OSXTERM  = UXTERM osxwin osxdlg osxctrls
 
diff --git a/misc.h b/misc.h
index c38266d04e4ea1dcb51d48a1f1bc07f82fe34231..a16a2fa0f5896c7f19d009fbd10e2c9f84da3122 100644 (file)
--- a/misc.h
+++ b/misc.h
@@ -39,6 +39,15 @@ char *dupprintf(const char *fmt, ...)
 char *dupvprintf(const char *fmt, va_list ap);
 void burnstr(char *string);
 
+/* String-to-Unicode converters that auto-allocate the destination and
+ * work around the rather deficient interface of mb_to_wc.
+ *
+ * These actually live in miscucs.c, not misc.c (the distinction being
+ * that the former is only linked into tools that also have the main
+ * Unicode support). */
+wchar_t *dup_mb_to_wc_c(int codepage, int flags, const char *string, int len);
+wchar_t *dup_mb_to_wc(int codepage, int flags, const char *string);
+
 int toint(unsigned);
 
 char *fgetline(FILE *fp);
diff --git a/miscucs.c b/miscucs.c
new file mode 100644 (file)
index 0000000..7785f9b
--- /dev/null
+++ b/miscucs.c
@@ -0,0 +1,28 @@
+/*
+ * Centralised Unicode-related helper functions, separate from misc.c
+ * so that they can be omitted from tools that aren't including
+ * Unicode handling.
+ */
+
+#include "putty.h"
+#include "misc.h"
+
+wchar_t *dup_mb_to_wc_c(int codepage, int flags, const char *string, int len)
+{
+    int mult;
+    for (mult = 1 ;; mult++) {
+        wchar_t *ret = snewn(mult*len + 2, wchar_t);
+        int outlen;
+        outlen = mb_to_wc(codepage, flags, string, len, ret, mult*len + 1);
+        if (outlen < mult*len+1) {
+            ret[outlen] = L'\0';
+            return ret;
+        }
+        sfree(ret);
+    }
+}
+
+wchar_t *dup_mb_to_wc(int codepage, int flags, const char *string)
+{
+    return dup_mb_to_wc_c(codepage, flags, string, strlen(string));
+}