diff options
author | Lorry Tar Creator <lorry-tar-importer@lorry> | 2016-05-16 09:22:21 +0000 |
---|---|---|
committer | Lorry Tar Creator <lorry-tar-importer@lorry> | 2016-05-16 09:22:21 +0000 |
commit | d4fdeab4db0d0e699c8fbbb07f12c4e1f64d0f94 (patch) | |
tree | 72231a38ed1cdd48ac6e02acb8b3917acb9dbcf4 /src/utf8.c | |
download | tar-tarball-master.tar.gz |
Diffstat (limited to 'src/utf8.c')
-rw-r--r-- | src/utf8.c | 99 |
1 files changed, 99 insertions, 0 deletions
diff --git a/src/utf8.c b/src/utf8.c new file mode 100644 index 0000000..195fef5 --- /dev/null +++ b/src/utf8.c @@ -0,0 +1,99 @@ +/* Charset handling for GNU tar. + + Copyright 2004, 2006-2007, 2013-2014, 2016 Free Software Foundation, + Inc. + + This file is part of GNU tar. + + GNU tar is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + GNU tar is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. */ + +#include <system.h> +#include <quotearg.h> +#include <localcharset.h> +#include "common.h" +#ifdef HAVE_ICONV_H +# include <iconv.h> +#endif + +#ifndef ICONV_CONST +# define ICONV_CONST +#endif + +#ifndef HAVE_ICONV + +# undef iconv_open +# define iconv_open(tocode, fromcode) ((iconv_t) -1) + +# undef iconv +# define iconv(cd, inbuf, inbytesleft, outbuf, outbytesleft) ((size_t) 0) + +# undef iconv_close +# define iconv_close(cd) 0 + +#endif + + + + +static iconv_t conv_desc[2] = { (iconv_t) -1, (iconv_t) -1 }; + +static iconv_t +utf8_init (bool to_utf) +{ + if (conv_desc[(int) to_utf] == (iconv_t) -1) + { + if (to_utf) + conv_desc[(int) to_utf] = iconv_open ("UTF-8", locale_charset ()); + else + conv_desc[(int) to_utf] = iconv_open (locale_charset (), "UTF-8"); + } + return conv_desc[(int) to_utf]; +} + +bool +utf8_convert (bool to_utf, char const *input, char **output) +{ + char ICONV_CONST *ib; + char *ob; + size_t inlen; + size_t outlen; + size_t rc; + iconv_t cd = utf8_init (to_utf); + + if (cd == 0) + { + *output = xstrdup (input); + return true; + } + else if (cd == (iconv_t)-1) + return false; + + inlen = strlen (input) + 1; + outlen = inlen * MB_LEN_MAX + 1; + ob = *output = xmalloc (outlen); + ib = (char ICONV_CONST *) input; + rc = iconv (cd, &ib, &inlen, &ob, &outlen); + *ob = 0; + return rc != -1; +} + + +bool +string_ascii_p (char const *p) +{ + for (; *p; p++) + if (*p & ~0x7f) + return false; + return true; +} |