From 7762d7122609207059cf5cf58fb2b9c2de98dd36 Mon Sep 17 00:00:00 2001 From: Simon Tatham Date: Mon, 27 Jul 2015 20:06:02 +0100 Subject: [PATCH] New centralised helper function dup_mb_to_wc(). 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. --- Recipe | 4 ++-- misc.h | 9 +++++++++ miscucs.c | 28 ++++++++++++++++++++++++++++ 3 files changed, 39 insertions(+), 2 deletions(-) create mode 100644 miscucs.c diff --git a/Recipe b/Recipe index 0ffaca3b..7e25b82b 100644 --- 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 f63cd969..8c8377f9 100644 --- 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 index 00000000..7785f9b6 --- /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)); +}