From c02c2a767745cd9ae29179e5d9c788bd31d361c8 Mon Sep 17 00:00:00 2001 From: Bruno Haible Date: Tue, 9 Jan 2007 14:09:36 +0000 Subject: [PATCH] New modules 'unistr/u8-strchr', 'unistr/u16-strchr', 'unistr/u32-strchr'. --- lib/unistr/u16-strchr.c | 67 +++++++++++++++++++++++++++++ lib/unistr/u32-strchr.c | 38 +++++++++++++++++ lib/unistr/u8-strchr.c | 104 ++++++++++++++++++++++++++++++++++++++++++++++ modules/unistr/u16-strchr | 24 +++++++++++ modules/unistr/u32-strchr | 23 ++++++++++ modules/unistr/u8-strchr | 24 +++++++++++ 6 files changed, 280 insertions(+) create mode 100644 lib/unistr/u16-strchr.c create mode 100644 lib/unistr/u32-strchr.c create mode 100644 lib/unistr/u8-strchr.c create mode 100644 modules/unistr/u16-strchr create mode 100644 modules/unistr/u32-strchr create mode 100644 modules/unistr/u8-strchr diff --git a/lib/unistr/u16-strchr.c b/lib/unistr/u16-strchr.c new file mode 100644 index 000000000..4b152ecab --- /dev/null +++ b/lib/unistr/u16-strchr.c @@ -0,0 +1,67 @@ +/* Search character in UTF-16 string. + Copyright (C) 1999, 2002, 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" + +#include "ucs4-utf16.h" + +uint16_t * +u16_strchr (const uint16_t *s, ucs4_t uc) +{ + uint16_t c[2]; + + if (uc < 0x10000) + { + uint16_t c0 = uc; + + for (;; s++) + { + if (*s == c0) + break; + if (*s == 0) + goto notfound; + } + return (uint16_t *) s; + } + else + switch (u16_uctomb_aux (c, uc, 2)) + { + case 2: + if (*s == 0) + goto notfound; + { + uint16_t c0 = c[0]; + uint16_t c1 = c[1]; + + for (;; s++) + { + if (s[1] == 0) + goto notfound; + if (*s == c0 && s[1] == c1) + break; + } + return (uint16_t *) s; + } + } +notfound: + return NULL; +} diff --git a/lib/unistr/u32-strchr.c b/lib/unistr/u32-strchr.c new file mode 100644 index 000000000..ef2a12bb2 --- /dev/null +++ b/lib/unistr/u32-strchr.c @@ -0,0 +1,38 @@ +/* Search character in UTF-32 string. + Copyright (C) 1999, 2002, 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" + +uint32_t * +u32_strchr (const uint32_t *s, ucs4_t uc) +{ + for (;; s++) + { + if (*s == uc) + break; + if (*s == 0) + goto notfound; + } + return (uint32_t *) s; +notfound: + return NULL; +} diff --git a/lib/unistr/u8-strchr.c b/lib/unistr/u8-strchr.c new file mode 100644 index 000000000..cce594cb4 --- /dev/null +++ b/lib/unistr/u8-strchr.c @@ -0,0 +1,104 @@ +/* Search character in UTF-8 string. + Copyright (C) 1999, 2002, 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" + +#include "ucs4-utf8.h" + +uint8_t * +u8_strchr (const uint8_t *s, ucs4_t uc) +{ + uint8_t c[6]; + + if (uc < 0x80) + { + uint8_t c0 = uc; + + for (;; s++) + { + if (*s == c0) + break; + if (*s == 0) + goto notfound; + } + return (uint8_t *) s; + } + else + switch (u8_uctomb_aux (c, uc, 6)) + { + case 2: + if (*s == 0) + goto notfound; + { + uint8_t c0 = c[0]; + uint8_t c1 = c[1]; + + for (;; s++) + { + if (s[1] == 0) + goto notfound; + if (*s == c0 && s[1] == c1) + break; + } + return (uint8_t *) s; + } + + case 3: + if (*s == 0 || s[1] == 0) + goto notfound; + { + uint8_t c0 = c[0]; + uint8_t c1 = c[1]; + uint8_t c2 = c[2]; + + for (;; s++) + { + if (s[2] == 0) + goto notfound; + if (*s == c0 && s[1] == c1 && s[2] == c2) + break; + } + return (uint8_t *) s; + } + + case 4: + if (*s == 0 || s[1] == 0 || s[2] == 0) + goto notfound; + { + uint8_t c0 = c[0]; + uint8_t c1 = c[1]; + uint8_t c2 = c[2]; + uint8_t c3 = c[3]; + + for (;; s++) + { + if (s[3] == 0) + goto notfound; + if (*s == c0 && s[1] == c1 && s[2] == c2 && s[3] == c3) + break; + } + return (uint8_t *) s; + } + } +notfound: + return NULL; +} diff --git a/modules/unistr/u16-strchr b/modules/unistr/u16-strchr new file mode 100644 index 000000000..c4114b467 --- /dev/null +++ b/modules/unistr/u16-strchr @@ -0,0 +1,24 @@ +Description: +Search character in UTF-16 string. + +Files: +lib/unistr/u16-strchr.c + +Depends-on: +unistr/base +ucs4-utf16 + +configure.ac: + +Makefile.am: +lib_SOURCES += unistr/u16-strchr.c + +Include: +"unistr.h" + +License: +LGPL + +Maintainer: +Bruno Haible + diff --git a/modules/unistr/u32-strchr b/modules/unistr/u32-strchr new file mode 100644 index 000000000..01f0580c7 --- /dev/null +++ b/modules/unistr/u32-strchr @@ -0,0 +1,23 @@ +Description: +Search character in UTF-32 string. + +Files: +lib/unistr/u32-strchr.c + +Depends-on: +unistr/base + +configure.ac: + +Makefile.am: +lib_SOURCES += unistr/u32-strchr.c + +Include: +"unistr.h" + +License: +LGPL + +Maintainer: +Bruno Haible + diff --git a/modules/unistr/u8-strchr b/modules/unistr/u8-strchr new file mode 100644 index 000000000..a85cc9f81 --- /dev/null +++ b/modules/unistr/u8-strchr @@ -0,0 +1,24 @@ +Description: +Search character in UTF-8 string. + +Files: +lib/unistr/u8-strchr.c + +Depends-on: +unistr/base +ucs4-utf8 + +configure.ac: + +Makefile.am: +lib_SOURCES += unistr/u8-strchr.c + +Include: +"unistr.h" + +License: +LGPL + +Maintainer: +Bruno Haible + -- 2.11.0