From 3dabee6dde5553cfbb5f1e6344ece53997eb2885 Mon Sep 17 00:00:00 2001 From: Bruno Haible Date: Tue, 9 Jan 2007 14:10:35 +0000 Subject: [PATCH] New modules 'unistr/u8-uctomb', 'unistr/u16-uctomb', 'unistr/u32-uctomb'. --- lib/unistr/u16-uctomb.c | 69 ++++++++++++++++++++++++++++++++++++++ lib/unistr/u32-uctomb.c | 44 ++++++++++++++++++++++++ lib/unistr/u8-uctomb.c | 85 +++++++++++++++++++++++++++++++++++++++++++++++ modules/unistr/u16-uctomb | 24 +++++++++++++ modules/unistr/u32-uctomb | 24 +++++++++++++ modules/unistr/u8-uctomb | 24 +++++++++++++ 6 files changed, 270 insertions(+) create mode 100644 lib/unistr/u16-uctomb.c create mode 100644 lib/unistr/u32-uctomb.c create mode 100644 lib/unistr/u8-uctomb.c create mode 100644 modules/unistr/u16-uctomb create mode 100644 modules/unistr/u32-uctomb create mode 100644 modules/unistr/u8-uctomb diff --git a/lib/unistr/u16-uctomb.c b/lib/unistr/u16-uctomb.c new file mode 100644 index 000000000..ec2185765 --- /dev/null +++ b/lib/unistr/u16-uctomb.c @@ -0,0 +1,69 @@ +/* Store a character in UTF-16 string. + Copyright (C) 2002, 2005-2006 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public License as published + by the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, + USA. */ + +#include + +/* Specification. */ +#include "unistr.h" + +#if !HAVE_INLINE + +int +u16_uctomb (uint16_t *s, ucs4_t uc, int n) +{ + if (uc < 0xd800) + { + if (n > 0) + { + s[0] = uc; + return 1; + } + /* else return -2, below. */ + } + else if (uc < 0x10000) + { + if (uc >= 0xe000) + { + if (n >= 1) + { + s[0] = uc; + return 1; + } + } + else + return -1; + } + else + { + if (uc < 0x110000) + { + if (n >= 2) + { + s[0] = 0xd800 + ((uc - 0x10000) >> 10); + s[1] = 0xdc00 + ((uc - 0x10000) & 0x3ff); + return 2; + } + } + else + return -1; + } + return -2; +} + +#endif diff --git a/lib/unistr/u32-uctomb.c b/lib/unistr/u32-uctomb.c new file mode 100644 index 000000000..4faacc61b --- /dev/null +++ b/lib/unistr/u32-uctomb.c @@ -0,0 +1,44 @@ +/* Store a character in UTF-32 string. + Copyright (C) 2002, 2005-2006 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public License as published + by the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, + USA. */ + +#include + +/* Specification. */ +#include "unistr.h" + +#if !HAVE_INLINE + +int +u32_uctomb (uint32_t *s, ucs4_t uc, int n) +{ + if (uc < 0xd800 || (uc >= 0xe000 && uc < 0x110000)) + { + if (n > 0) + { + *s = uc; + return 1; + } + else + return -2; + } + else + return -1; +} + +#endif diff --git a/lib/unistr/u8-uctomb.c b/lib/unistr/u8-uctomb.c new file mode 100644 index 000000000..412ca14b0 --- /dev/null +++ b/lib/unistr/u8-uctomb.c @@ -0,0 +1,85 @@ +/* Store a character in UTF-8 string. + Copyright (C) 2002, 2005-2006 Free Software Foundation, Inc. + Written by Bruno Haible , 2002. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public License as published + by the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, + USA. */ + +#include + +/* Specification. */ +#include "unistr.h" + +#if !HAVE_INLINE + +int +u8_uctomb (uint8_t *s, ucs4_t uc, int n) +{ + if (uc < 0x80) + { + if (n > 0) + { + s[0] = uc; + return 1; + } + /* else return -2, below. */ + } + else + { + int count; + + if (uc < 0x800) + count = 2; + else if (uc < 0x10000) + { + if (uc < 0xd800 || uc >= 0xe000) + count = 3; + else + return -1; + } +#if 0 + else if (uc < 0x200000) + count = 4; + else if (uc < 0x4000000) + count = 5; + else if (uc <= 0x7fffffff) + count = 6; +#else + else if (uc < 0x110000) + count = 4; +#endif + else + return -1; + + if (n >= count) + { + switch (count) /* note: code falls through cases! */ + { +#if 0 + case 6: s[5] = 0x80 | (uc & 0x3f); uc = uc >> 6; uc |= 0x4000000; + case 5: s[4] = 0x80 | (uc & 0x3f); uc = uc >> 6; uc |= 0x200000; +#endif + case 4: s[3] = 0x80 | (uc & 0x3f); uc = uc >> 6; uc |= 0x10000; + case 3: s[2] = 0x80 | (uc & 0x3f); uc = uc >> 6; uc |= 0x800; + case 2: s[1] = 0x80 | (uc & 0x3f); uc = uc >> 6; uc |= 0xc0; + /*case 1:*/ s[0] = uc; + } + return count; + } + } + return -2; +} + +#endif diff --git a/modules/unistr/u16-uctomb b/modules/unistr/u16-uctomb new file mode 100644 index 000000000..e61b6eea7 --- /dev/null +++ b/modules/unistr/u16-uctomb @@ -0,0 +1,24 @@ +Description: +Store a character in UTF-16 string. + +Files: +lib/unistr/u16-uctomb.c + +Depends-on: +unistr/base + +configure.ac: +gl_MODULE_INDICATOR([unistr/u16-uctomb]) + +Makefile.am: +lib_SOURCES += unistr/u16-uctomb.c + +Include: +"unistr.h" + +License: +LGPL + +Maintainer: +Bruno Haible + diff --git a/modules/unistr/u32-uctomb b/modules/unistr/u32-uctomb new file mode 100644 index 000000000..c81cd36bd --- /dev/null +++ b/modules/unistr/u32-uctomb @@ -0,0 +1,24 @@ +Description: +Store a character in UTF-32 string. + +Files: +lib/unistr/u32-uctomb.c + +Depends-on: +unistr/base + +configure.ac: +gl_MODULE_INDICATOR([unistr/u32-uctomb]) + +Makefile.am: +lib_SOURCES += unistr/u32-uctomb.c + +Include: +"unistr.h" + +License: +LGPL + +Maintainer: +Bruno Haible + diff --git a/modules/unistr/u8-uctomb b/modules/unistr/u8-uctomb new file mode 100644 index 000000000..59f650eab --- /dev/null +++ b/modules/unistr/u8-uctomb @@ -0,0 +1,24 @@ +Description: +Store a character in UTF-8 string. + +Files: +lib/unistr/u8-uctomb.c + +Depends-on: +unistr/base + +configure.ac: +gl_MODULE_INDICATOR([unistr/u8-uctomb]) + +Makefile.am: +lib_SOURCES += unistr/u8-uctomb.c + +Include: +"unistr.h" + +License: +LGPL + +Maintainer: +Bruno Haible + -- 2.11.0