diff options
author | Christian Neukirchen <chneukirchen@gmail.com> | 2016-01-15 21:56:41 +0100 |
---|---|---|
committer | Christian Neukirchen <chneukirchen@gmail.com> | 2016-01-15 21:56:41 +0100 |
commit | 193f150ac3a87fad164b3911bb69280b0728f6f1 (patch) | |
tree | 822f28f8950430e2f43d76439e6bee8e6dde71ac /src/usr.bin/rs/utf8.c | |
parent | 3c57c4d0031b7206ced8f313e3efa02dbcf88f78 (diff) | |
download | outils-193f150ac3a87fad164b3911bb69280b0728f6f1.tar.gz outils-193f150ac3a87fad164b3911bb69280b0728f6f1.tar.xz outils-193f150ac3a87fad164b3911bb69280b0728f6f1.zip |
cvs update
Diffstat (limited to 'src/usr.bin/rs/utf8.c')
-rw-r--r-- | src/usr.bin/rs/utf8.c | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/src/usr.bin/rs/utf8.c b/src/usr.bin/rs/utf8.c new file mode 100644 index 0000000..c779d74 --- /dev/null +++ b/src/usr.bin/rs/utf8.c @@ -0,0 +1,61 @@ +/* + * Copyright (c) 2015 Ingo Schwarze <schwarze@openbsd.org> + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include <err.h> +#include <stdlib.h> +#include <string.h> +#include <wchar.h> + +int +mbsavis(char** outp, const char *mbs) +{ + const char *src; /* Iterate mbs. */ + char *dst; /* Iterate *outp. */ + wchar_t wc; + int total_width; /* Display width of the whole string. */ + int width; /* Display width of a single Unicode char. */ + int len; /* Length in bytes of UTF-8 encoded string. */ + + len = strlen(mbs); + if ((*outp = malloc(len + 1)) == NULL) + err(1, NULL); + + if (MB_CUR_MAX == 1) { + memcpy(*outp, mbs, len + 1); + return len; + } + + src = mbs; + dst = *outp; + total_width = 0; + while (*src != '\0') { + if ((len = mbtowc(&wc, src, MB_CUR_MAX)) == -1) { + total_width++; + *dst++ = '?'; + src++; + } else if ((width = wcwidth(wc)) == -1) { + total_width++; + *dst++ = '?'; + src += len; + } else { + total_width += width; + while (len-- > 0) + *dst++ = *src++; + } + } + *dst = '\0'; + return total_width; +} |