From b4a1aa90519d34c87b3a6699b77a24f39b1b22c1 Mon Sep 17 00:00:00 2001 From: "Arnold D. Robbins" Date: Wed, 19 Jan 2011 20:22:04 +0200 Subject: Simplify code for do_tolower, do_toupper. --- node.c | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) (limited to 'node.c') diff --git a/node.c b/node.c index bbeb629c..cf16f794 100644 --- a/node.c +++ b/node.c @@ -761,6 +761,47 @@ str2wstr(NODE *n, size_t **ptr) return n; } +/* wstr2str --- convert a wide string back into multibyte one */ + +NODE * +wstr2str(NODE *n) +{ + size_t result; + size_t length; + wchar_t *wp; + mbstate_t mbs; + char *newval, *cp; + + assert(n->valref == 1); + assert((n->flags & WSTRCUR) != 0); + + /* + * Convert the wide chars in t1->wstptr back into m.b. chars. + * This is pretty grotty, but it's the most straightforward + * way to do things. + */ + memset(& mbs, 0, sizeof(mbs)); + + length = n->wstlen; + emalloc(newval, char *, (length * gawk_mb_cur_max) + 2, "wstr2str"); + + wp = n->wstptr; + for (cp = newval; length > 0; length--) { + result = wcrtomb(cp, *wp, & mbs); + if (result == (size_t) -1) /* what to do? break seems best */ + break; + cp += result; + wp++; + } + *cp = '\0'; + + efree(n->stptr); + n->stptr = newval; + n->stlen = cp - newval; + + return n; +} + /* free_wstr --- release the wide string part of a node */ void -- cgit v1.2.3