diff options
author | Ulrich Drepper <drepper@redhat.com> | 2004-06-30 07:43:11 +0000 |
---|---|---|
committer | Ulrich Drepper <drepper@redhat.com> | 2004-06-30 07:43:11 +0000 |
commit | f5164429135806c41da679afb662d8482eec0a41 (patch) | |
tree | 3cd260d001c1fdb72635223a258d066e989337dd /iconv | |
parent | 606135cf62624432a4b6fac724cad0e23b01202a (diff) | |
download | glibc-f5164429135806c41da679afb662d8482eec0a41.tar glibc-f5164429135806c41da679afb662d8482eec0a41.tar.gz glibc-f5164429135806c41da679afb662d8482eec0a41.tar.bz2 glibc-f5164429135806c41da679afb662d8482eec0a41.zip |
Update.
2004-06-30 Ulrich Drepper <drepper@redhat.com>
* include/net/if.h: Handle if_nameindex and if_freenameindex with
libc_proto_hidden.
* sysdeps/unix/sysv/linux/netlinkaccess.h: New file.
* sysdeps/unix/sysv/linux/ifaddrs.c: Export netlink handling functions.
* sysdeps/unix/sysv/linux/if_index.c (if_nameindex): Implement using
netlink if possible. Fall back on ioctl method if necessary.
* include/unistd.h: Declare __truncate.
* sysdeps/generic/truncate.c: Also define __truncate.
* sysdeps/mach/hurd/truncate.c: Likewise.
* sysdeps/unix/common/syscalls.list: Likewise.
* sysdeps/unix/sysv/linux/truncate64.c: Use __truncate, not truncate.
Diffstat (limited to 'iconv')
-rw-r--r-- | iconv/Makefile | 2 | ||||
-rw-r--r-- | iconv/tst-iconv5.c | 158 |
2 files changed, 159 insertions, 1 deletions
diff --git a/iconv/Makefile b/iconv/Makefile index 9fb41db9df..c245ff727f 100644 --- a/iconv/Makefile +++ b/iconv/Makefile @@ -49,7 +49,7 @@ CFLAGS-charmap.c = -DCHARMAP_PATH='"$(i18ndir)/charmaps"' \ CFLAGS-linereader.c = -DNO_TRANSLITERATION CFLAGS-simple-hash.c = -I../locale -tests = tst-iconv1 tst-iconv2 tst-iconv3 +tests = tst-iconv1 tst-iconv2 tst-iconv3 tst-iconv5 distribute = gconv_builtin.h gconv_int.h loop.c skeleton.c iconv_prog.h \ iconv_charmap.c dummy-repertoire.c gconv_charset.h strtab.c \ diff --git a/iconv/tst-iconv5.c b/iconv/tst-iconv5.c new file mode 100644 index 0000000000..013a48b7ef --- /dev/null +++ b/iconv/tst-iconv5.c @@ -0,0 +1,158 @@ +/* Copyright (C) 2004 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by GOTO Masanori <gotom@debian.or.jp>, 2004 + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +#include <iconv.h> +#include <string.h> +#include <stdlib.h> +#include <stdio.h> +#include <errno.h> + +#define SIZE 256 /* enough room for conversion */ +#define SAMPLESTR "abc" + +struct unalign +{ + char str1[1]; + char str2[SIZE]; +}; + +struct convcode +{ + const char *tocode; + const char *fromcode; +}; + +/* test builtin transformation */ +struct convcode testcode[] = { + {"ASCII", "ASCII"}, + {"UTF-8", "ASCII"}, + {"UCS-2BE", "ASCII"}, + {"UCS-2LE", "ASCII"}, + {"UCS-4BE", "ASCII"}, + {"UCS-4LE", "ASCII"}, +}; + +int number = (int) sizeof (testcode) / sizeof (struct convcode); + +int +convert (const char *tocode, const char *fromcode, char *inbufp, + size_t inbytesleft, char *outbufp, size_t outbytesleft) +{ + iconv_t *ic; + size_t outbytes = outbytesleft; + int ret; + + ic = iconv_open (tocode, fromcode); + if (ic == (iconv_t *) - 1) + { + printf ("iconv_open failed: from: %s, to: %s: %s", + fromcode, tocode, strerror (errno)); + return -1; + } + + while (inbytesleft > 0) + { + ret = iconv (ic, &inbufp, &inbytesleft, &outbufp, &outbytes); + if (ret == -1) + { + printf ("iconv failed: from: %s, to: %s: %s", + fromcode, tocode, strerror (errno)); + return -1; + } + } + + ret = iconv_close (ic); + if (ret == -1) + { + printf ("iconv_close failed: from: %s, to: %s: %s", + fromcode, tocode, strerror (errno)); + return -1; + } + + return outbytesleft - outbytes; +} + + +int +test_unalign (struct convcode *codes, char *str, int len) +{ + struct unalign *inbufp, *outbufp; + char *inbuf, *outbuf; + size_t inbytesleft, outbytesleft; + int retlen; + + /* allocating unaligned buffer for both inbuf and outbuf */ + inbufp = (struct unalign *) malloc (sizeof (struct unalign)); + if (!inbufp) + { + printf ("no memory available\n"); + exit (1); + } + inbuf = inbufp->str2; + + outbufp = (struct unalign *) malloc (sizeof (struct unalign)); + if (!outbufp) + { + printf ("no memory available\n"); + exit (1); + } + outbuf = outbufp->str2; + + /* first iconv phase */ + memcpy (inbuf, str, len); + inbytesleft = len; + outbytesleft = sizeof (struct unalign); + retlen = convert (codes->tocode, codes->fromcode, inbuf, inbytesleft, + outbuf, outbytesleft); + if (retlen == -1) /* failed */ + return 1; + + /* second round trip iconv phase */ + memcpy (inbuf, outbuf, retlen); + inbytesleft = retlen; + outbytesleft = sizeof (struct unalign); + retlen = convert (codes->fromcode, codes->tocode, inbuf, inbytesleft, + outbuf, outbytesleft); + if (retlen == -1) /* failed */ + return 1; + + free (inbufp); + free (outbufp); + + return 0; +} + +int +main (int argc, char *argv[]) +{ + int i; + int ret = 0; + + for (i = 0; i < number; i++) + { + ret = test_unalign (&testcode[i], (char *) SAMPLESTR, sizeof (SAMPLESTR)); + if (ret) + break; + printf ("iconv: %s <-> %s: ok\n", + testcode[i].fromcode, testcode[i].tocode); + } + printf ("Succeeded.\n"); + + return ret; +} |