mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-04-30 03:40:34 +02:00
Avoid Gnulib unistr/* modules
(unistr/base, unistr/u8-mbtouc, unistr/u8-mbtouc-unsafe) (unistr/u8-mbtoucr, unistr/u8-prev unistr/u8-uctomb, unitypes): --avoid these modules.
This commit is contained in:
parent
d484bfbace
commit
b05b67b2b3
16 changed files with 4 additions and 2705 deletions
|
@ -1,36 +0,0 @@
|
|||
/* A C macro for declaring that specific function parameters are not used.
|
||||
Copyright (C) 2008-2016 Free Software Foundation, Inc.
|
||||
|
||||
This program 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.
|
||||
|
||||
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
|
||||
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/>. */
|
||||
|
||||
/* _GL_UNUSED_PARAMETER is a marker that can be appended to function parameter
|
||||
declarations for parameters that are not used. This helps to reduce
|
||||
warnings, such as from GCC -Wunused-parameter. The syntax is as follows:
|
||||
type param _GL_UNUSED_PARAMETER
|
||||
or more generally
|
||||
param_decl _GL_UNUSED_PARAMETER
|
||||
For example:
|
||||
int param _GL_UNUSED_PARAMETER
|
||||
int *(*param)(void) _GL_UNUSED_PARAMETER
|
||||
Other possible, but obscure and discouraged syntaxes:
|
||||
int _GL_UNUSED_PARAMETER *(*param)(void)
|
||||
_GL_UNUSED_PARAMETER int *(*param)(void)
|
||||
*/
|
||||
#ifndef _GL_UNUSED_PARAMETER
|
||||
# if __GNUC__ >= 3 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 7)
|
||||
# define _GL_UNUSED_PARAMETER __attribute__ ((__unused__))
|
||||
# else
|
||||
# define _GL_UNUSED_PARAMETER
|
||||
# endif
|
||||
#endif
|
101
lib/Makefile.am
101
lib/Makefile.am
|
@ -21,9 +21,9 @@
|
|||
# the same distribution terms as the rest of that program.
|
||||
#
|
||||
# Generated by gnulib-tool.
|
||||
# Reproduce by: gnulib-tool --import --local-dir=gnulib-local --lib=libgnu --source-base=lib --m4-base=m4 --doc-base=doc --tests-base=tests --aux-dir=build-aux --avoid=lock --lgpl=3 --conditional-dependencies --libtool --macro-prefix=gl --no-vc-files accept alignof alloca-opt announce-gen autobuild bind byteswap c-strcase canonicalize-lgpl ceil clock-time close connect copysign dirfd duplocale environ extensions flock floor fpieee frexp fstat fsync full-read full-write func gendocs getaddrinfo getlogin getpeername getsockname getsockopt git-version-gen gitlog-to-changelog gnu-web-doc-update gnupload havelib iconv_open-utf inet_ntop inet_pton isfinite isinf isnan ldexp lib-symbol-versions lib-symbol-visibility libunistring link listen localcharset locale log1p lstat maintainer-makefile malloc-gnu malloca mkdir mkstemp nl_langinfo nproc open pipe-posix pipe2 poll putenv readlink recv recvfrom regex rename rmdir select send sendto setenv setsockopt shutdown socket stat-time stdlib strftime striconveh string sys_stat time times trunc unistd verify vsnprintf warnings wchar
|
||||
# Reproduce by: gnulib-tool --import --local-dir=gnulib-local --lib=libgnu --source-base=lib --m4-base=m4 --doc-base=doc --tests-base=tests --aux-dir=build-aux --avoid=lock --avoid=unistr/base --avoid=unistr/u8-mbtouc --avoid=unistr/u8-mbtouc-unsafe --avoid=unistr/u8-mbtoucr --avoid=unistr/u8-prev --avoid=unistr/u8-uctomb --avoid=unitypes --lgpl=3 --conditional-dependencies --libtool --macro-prefix=gl --no-vc-files accept alignof alloca-opt announce-gen autobuild bind byteswap c-strcase canonicalize-lgpl ceil clock-time close connect copysign dirfd duplocale environ extensions flock floor fpieee frexp fstat fsync full-read full-write func gendocs getaddrinfo getlogin getpeername getsockname getsockopt git-version-gen gitlog-to-changelog gnu-web-doc-update gnupload havelib iconv_open-utf inet_ntop inet_pton isfinite isinf isnan ldexp lib-symbol-versions lib-symbol-visibility libunistring link listen localcharset locale log1p lstat maintainer-makefile malloc-gnu malloca mkdir mkstemp nl_langinfo nproc open pipe-posix pipe2 poll putenv readlink recv recvfrom regex rename rmdir select send sendto setenv setsockopt shutdown socket stat-time stdlib strftime striconveh string sys_stat time times trunc unistd verify vsnprintf warnings wchar
|
||||
|
||||
AUTOMAKE_OPTIONS = 1.9.6 gnits subdir-objects
|
||||
AUTOMAKE_OPTIONS = 1.9.6 gnits
|
||||
|
||||
SUBDIRS =
|
||||
noinst_HEADERS =
|
||||
|
@ -2014,31 +2014,6 @@ EXTRA_DIST += $(top_srcdir)/build-aux/snippet/c++defs.h
|
|||
|
||||
## end gnulib module snippet/c++defs
|
||||
|
||||
## begin gnulib module snippet/unused-parameter
|
||||
|
||||
# The BUILT_SOURCES created by this Makefile snippet are not used via #include
|
||||
# statements but through direct file reference. Therefore this snippet must be
|
||||
# present in all Makefile.am that need it. This is ensured by the applicability
|
||||
# 'all' defined above.
|
||||
|
||||
BUILT_SOURCES += unused-parameter.h
|
||||
# The unused-parameter.h that gets inserted into generated .h files is the same
|
||||
# as build-aux/snippet/unused-parameter.h, except that it has the copyright
|
||||
# header cut off.
|
||||
unused-parameter.h: $(top_srcdir)/build-aux/snippet/unused-parameter.h
|
||||
$(AM_V_GEN)rm -f $@-t $@ && \
|
||||
sed -n -e '/GL_UNUSED_PARAMETER/,$$p' \
|
||||
< $(top_srcdir)/build-aux/snippet/unused-parameter.h \
|
||||
> $@-t && \
|
||||
mv $@-t $@
|
||||
MOSTLYCLEANFILES += unused-parameter.h unused-parameter.h-t
|
||||
|
||||
UNUSED_PARAMETER_H=unused-parameter.h
|
||||
|
||||
EXTRA_DIST += $(top_srcdir)/build-aux/snippet/unused-parameter.h
|
||||
|
||||
## end gnulib module snippet/unused-parameter
|
||||
|
||||
## begin gnulib module snippet/warn-on-use
|
||||
|
||||
BUILT_SOURCES += warn-on-use.h
|
||||
|
@ -3161,78 +3136,6 @@ EXTRA_DIST += unistd.in.h
|
|||
|
||||
## end gnulib module unistd
|
||||
|
||||
## begin gnulib module unistr/base
|
||||
|
||||
BUILT_SOURCES += $(LIBUNISTRING_UNISTR_H)
|
||||
|
||||
unistr.h: unistr.in.h
|
||||
$(AM_V_GEN)rm -f $@-t $@ && \
|
||||
{ echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
|
||||
cat $(srcdir)/unistr.in.h; \
|
||||
} > $@-t && \
|
||||
mv -f $@-t $@
|
||||
MOSTLYCLEANFILES += unistr.h unistr.h-t
|
||||
|
||||
EXTRA_DIST += unistr.in.h
|
||||
|
||||
## end gnulib module unistr/base
|
||||
|
||||
## begin gnulib module unistr/u8-mbtouc
|
||||
|
||||
if LIBUNISTRING_COMPILE_UNISTR_U8_MBTOUC
|
||||
libgnu_la_SOURCES += unistr/u8-mbtouc.c unistr/u8-mbtouc-aux.c
|
||||
endif
|
||||
|
||||
## end gnulib module unistr/u8-mbtouc
|
||||
|
||||
## begin gnulib module unistr/u8-mbtouc-unsafe
|
||||
|
||||
if LIBUNISTRING_COMPILE_UNISTR_U8_MBTOUC_UNSAFE
|
||||
libgnu_la_SOURCES += unistr/u8-mbtouc-unsafe.c unistr/u8-mbtouc-unsafe-aux.c
|
||||
endif
|
||||
|
||||
## end gnulib module unistr/u8-mbtouc-unsafe
|
||||
|
||||
## begin gnulib module unistr/u8-mbtoucr
|
||||
|
||||
if LIBUNISTRING_COMPILE_UNISTR_U8_MBTOUCR
|
||||
libgnu_la_SOURCES += unistr/u8-mbtoucr.c
|
||||
endif
|
||||
|
||||
## end gnulib module unistr/u8-mbtoucr
|
||||
|
||||
## begin gnulib module unistr/u8-prev
|
||||
|
||||
if LIBUNISTRING_COMPILE_UNISTR_U8_PREV
|
||||
libgnu_la_SOURCES += unistr/u8-prev.c
|
||||
endif
|
||||
|
||||
## end gnulib module unistr/u8-prev
|
||||
|
||||
## begin gnulib module unistr/u8-uctomb
|
||||
|
||||
if LIBUNISTRING_COMPILE_UNISTR_U8_UCTOMB
|
||||
libgnu_la_SOURCES += unistr/u8-uctomb.c unistr/u8-uctomb-aux.c
|
||||
endif
|
||||
|
||||
## end gnulib module unistr/u8-uctomb
|
||||
|
||||
## begin gnulib module unitypes
|
||||
|
||||
BUILT_SOURCES += $(LIBUNISTRING_UNITYPES_H)
|
||||
|
||||
unitypes.h: unitypes.in.h
|
||||
$(AM_V_GEN)rm -f $@-t $@ && \
|
||||
{ echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
|
||||
cat $(srcdir)/unitypes.in.h; \
|
||||
} > $@-t && \
|
||||
mv -f $@-t $@
|
||||
MOSTLYCLEANFILES += unitypes.h unitypes.h-t
|
||||
|
||||
EXTRA_DIST += unitypes.in.h
|
||||
|
||||
## end gnulib module unitypes
|
||||
|
||||
## begin gnulib module unsetenv
|
||||
|
||||
if gl_GNULIB_ENABLED_unsetenv
|
||||
|
|
750
lib/unistr.in.h
750
lib/unistr.in.h
|
@ -1,750 +0,0 @@
|
|||
/* Elementary Unicode string functions.
|
||||
Copyright (C) 2001-2002, 2005-2016 Free Software Foundation, Inc.
|
||||
|
||||
This program 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 3 of the License, 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
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
||||
|
||||
#ifndef _UNISTR_H
|
||||
#define _UNISTR_H
|
||||
|
||||
#include "unitypes.h"
|
||||
|
||||
/* Get common macros for C. */
|
||||
#include "unused-parameter.h"
|
||||
|
||||
/* Get bool. */
|
||||
#include <stdbool.h>
|
||||
|
||||
/* Get size_t. */
|
||||
#include <stddef.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
|
||||
/* Conventions:
|
||||
|
||||
All functions prefixed with u8_ operate on UTF-8 encoded strings.
|
||||
Their unit is an uint8_t (1 byte).
|
||||
|
||||
All functions prefixed with u16_ operate on UTF-16 encoded strings.
|
||||
Their unit is an uint16_t (a 2-byte word).
|
||||
|
||||
All functions prefixed with u32_ operate on UCS-4 encoded strings.
|
||||
Their unit is an uint32_t (a 4-byte word).
|
||||
|
||||
All argument pairs (s, n) denote a Unicode string s[0..n-1] with exactly
|
||||
n units.
|
||||
|
||||
All arguments starting with "str" and the arguments of functions starting
|
||||
with u8_str/u16_str/u32_str denote a NUL terminated string, i.e. a string
|
||||
which terminates at the first NUL unit. This termination unit is
|
||||
considered part of the string for all memory allocation purposes, but
|
||||
is not considered part of the string for all other logical purposes.
|
||||
|
||||
Functions returning a string result take a (resultbuf, lengthp) argument
|
||||
pair. If resultbuf is not NULL and the result fits into *lengthp units,
|
||||
it is put in resultbuf, and resultbuf is returned. Otherwise, a freshly
|
||||
allocated string is returned. In both cases, *lengthp is set to the
|
||||
length (number of units) of the returned string. In case of error,
|
||||
NULL is returned and errno is set. */
|
||||
|
||||
|
||||
/* Elementary string checks. */
|
||||
|
||||
/* Check whether an UTF-8 string is well-formed.
|
||||
Return NULL if valid, or a pointer to the first invalid unit otherwise. */
|
||||
extern const uint8_t *
|
||||
u8_check (const uint8_t *s, size_t n)
|
||||
_UC_ATTRIBUTE_PURE;
|
||||
|
||||
/* Check whether an UTF-16 string is well-formed.
|
||||
Return NULL if valid, or a pointer to the first invalid unit otherwise. */
|
||||
extern const uint16_t *
|
||||
u16_check (const uint16_t *s, size_t n)
|
||||
_UC_ATTRIBUTE_PURE;
|
||||
|
||||
/* Check whether an UCS-4 string is well-formed.
|
||||
Return NULL if valid, or a pointer to the first invalid unit otherwise. */
|
||||
extern const uint32_t *
|
||||
u32_check (const uint32_t *s, size_t n)
|
||||
_UC_ATTRIBUTE_PURE;
|
||||
|
||||
|
||||
/* Elementary string conversions. */
|
||||
|
||||
/* Convert an UTF-8 string to an UTF-16 string. */
|
||||
extern uint16_t *
|
||||
u8_to_u16 (const uint8_t *s, size_t n, uint16_t *resultbuf,
|
||||
size_t *lengthp);
|
||||
|
||||
/* Convert an UTF-8 string to an UCS-4 string. */
|
||||
extern uint32_t *
|
||||
u8_to_u32 (const uint8_t *s, size_t n, uint32_t *resultbuf,
|
||||
size_t *lengthp);
|
||||
|
||||
/* Convert an UTF-16 string to an UTF-8 string. */
|
||||
extern uint8_t *
|
||||
u16_to_u8 (const uint16_t *s, size_t n, uint8_t *resultbuf,
|
||||
size_t *lengthp);
|
||||
|
||||
/* Convert an UTF-16 string to an UCS-4 string. */
|
||||
extern uint32_t *
|
||||
u16_to_u32 (const uint16_t *s, size_t n, uint32_t *resultbuf,
|
||||
size_t *lengthp);
|
||||
|
||||
/* Convert an UCS-4 string to an UTF-8 string. */
|
||||
extern uint8_t *
|
||||
u32_to_u8 (const uint32_t *s, size_t n, uint8_t *resultbuf,
|
||||
size_t *lengthp);
|
||||
|
||||
/* Convert an UCS-4 string to an UTF-16 string. */
|
||||
extern uint16_t *
|
||||
u32_to_u16 (const uint32_t *s, size_t n, uint16_t *resultbuf,
|
||||
size_t *lengthp);
|
||||
|
||||
|
||||
/* Elementary string functions. */
|
||||
|
||||
/* Return the length (number of units) of the first character in S, which is
|
||||
no longer than N. Return 0 if it is the NUL character. Return -1 upon
|
||||
failure. */
|
||||
/* Similar to mblen(), except that s must not be NULL. */
|
||||
extern int
|
||||
u8_mblen (const uint8_t *s, size_t n)
|
||||
_UC_ATTRIBUTE_PURE;
|
||||
extern int
|
||||
u16_mblen (const uint16_t *s, size_t n)
|
||||
_UC_ATTRIBUTE_PURE;
|
||||
extern int
|
||||
u32_mblen (const uint32_t *s, size_t n)
|
||||
_UC_ATTRIBUTE_PURE;
|
||||
|
||||
/* Return the length (number of units) of the first character in S, putting
|
||||
its 'ucs4_t' representation in *PUC. Upon failure, *PUC is set to 0xfffd,
|
||||
and an appropriate number of units is returned.
|
||||
The number of available units, N, must be > 0. */
|
||||
/* Similar to mbtowc(), except that puc and s must not be NULL, n must be > 0,
|
||||
and the NUL character is not treated specially. */
|
||||
/* The variants with _safe suffix are safe, even if the library is compiled
|
||||
without --enable-safety. */
|
||||
|
||||
#if GNULIB_UNISTR_U8_MBTOUC_UNSAFE || HAVE_LIBUNISTRING
|
||||
# if !HAVE_INLINE
|
||||
extern int
|
||||
u8_mbtouc_unsafe (ucs4_t *puc, const uint8_t *s, size_t n);
|
||||
# else
|
||||
extern int
|
||||
u8_mbtouc_unsafe_aux (ucs4_t *puc, const uint8_t *s, size_t n);
|
||||
static inline int
|
||||
u8_mbtouc_unsafe (ucs4_t *puc, const uint8_t *s, size_t n)
|
||||
{
|
||||
uint8_t c = *s;
|
||||
|
||||
if (c < 0x80)
|
||||
{
|
||||
*puc = c;
|
||||
return 1;
|
||||
}
|
||||
else
|
||||
return u8_mbtouc_unsafe_aux (puc, s, n);
|
||||
}
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#if GNULIB_UNISTR_U16_MBTOUC_UNSAFE || HAVE_LIBUNISTRING
|
||||
# if !HAVE_INLINE
|
||||
extern int
|
||||
u16_mbtouc_unsafe (ucs4_t *puc, const uint16_t *s, size_t n);
|
||||
# else
|
||||
extern int
|
||||
u16_mbtouc_unsafe_aux (ucs4_t *puc, const uint16_t *s, size_t n);
|
||||
static inline int
|
||||
u16_mbtouc_unsafe (ucs4_t *puc, const uint16_t *s, size_t n)
|
||||
{
|
||||
uint16_t c = *s;
|
||||
|
||||
if (c < 0xd800 || c >= 0xe000)
|
||||
{
|
||||
*puc = c;
|
||||
return 1;
|
||||
}
|
||||
else
|
||||
return u16_mbtouc_unsafe_aux (puc, s, n);
|
||||
}
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#if GNULIB_UNISTR_U32_MBTOUC_UNSAFE || HAVE_LIBUNISTRING
|
||||
# if !HAVE_INLINE
|
||||
extern int
|
||||
u32_mbtouc_unsafe (ucs4_t *puc, const uint32_t *s, size_t n);
|
||||
# else
|
||||
static inline int
|
||||
u32_mbtouc_unsafe (ucs4_t *puc,
|
||||
const uint32_t *s, size_t n _GL_UNUSED_PARAMETER)
|
||||
{
|
||||
uint32_t c = *s;
|
||||
|
||||
# if CONFIG_UNICODE_SAFETY
|
||||
if (c < 0xd800 || (c >= 0xe000 && c < 0x110000))
|
||||
# endif
|
||||
*puc = c;
|
||||
# if CONFIG_UNICODE_SAFETY
|
||||
else
|
||||
/* invalid multibyte character */
|
||||
*puc = 0xfffd;
|
||||
# endif
|
||||
return 1;
|
||||
}
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#if GNULIB_UNISTR_U8_MBTOUC || HAVE_LIBUNISTRING
|
||||
# if !HAVE_INLINE
|
||||
extern int
|
||||
u8_mbtouc (ucs4_t *puc, const uint8_t *s, size_t n);
|
||||
# else
|
||||
extern int
|
||||
u8_mbtouc_aux (ucs4_t *puc, const uint8_t *s, size_t n);
|
||||
static inline int
|
||||
u8_mbtouc (ucs4_t *puc, const uint8_t *s, size_t n)
|
||||
{
|
||||
uint8_t c = *s;
|
||||
|
||||
if (c < 0x80)
|
||||
{
|
||||
*puc = c;
|
||||
return 1;
|
||||
}
|
||||
else
|
||||
return u8_mbtouc_aux (puc, s, n);
|
||||
}
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#if GNULIB_UNISTR_U16_MBTOUC || HAVE_LIBUNISTRING
|
||||
# if !HAVE_INLINE
|
||||
extern int
|
||||
u16_mbtouc (ucs4_t *puc, const uint16_t *s, size_t n);
|
||||
# else
|
||||
extern int
|
||||
u16_mbtouc_aux (ucs4_t *puc, const uint16_t *s, size_t n);
|
||||
static inline int
|
||||
u16_mbtouc (ucs4_t *puc, const uint16_t *s, size_t n)
|
||||
{
|
||||
uint16_t c = *s;
|
||||
|
||||
if (c < 0xd800 || c >= 0xe000)
|
||||
{
|
||||
*puc = c;
|
||||
return 1;
|
||||
}
|
||||
else
|
||||
return u16_mbtouc_aux (puc, s, n);
|
||||
}
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#if GNULIB_UNISTR_U32_MBTOUC || HAVE_LIBUNISTRING
|
||||
# if !HAVE_INLINE
|
||||
extern int
|
||||
u32_mbtouc (ucs4_t *puc, const uint32_t *s, size_t n);
|
||||
# else
|
||||
static inline int
|
||||
u32_mbtouc (ucs4_t *puc, const uint32_t *s, size_t n _GL_UNUSED_PARAMETER)
|
||||
{
|
||||
uint32_t c = *s;
|
||||
|
||||
if (c < 0xd800 || (c >= 0xe000 && c < 0x110000))
|
||||
*puc = c;
|
||||
else
|
||||
/* invalid multibyte character */
|
||||
*puc = 0xfffd;
|
||||
return 1;
|
||||
}
|
||||
# endif
|
||||
#endif
|
||||
|
||||
/* Return the length (number of units) of the first character in S, putting
|
||||
its 'ucs4_t' representation in *PUC. Upon failure, *PUC is set to 0xfffd,
|
||||
and -1 is returned for an invalid sequence of units, -2 is returned for an
|
||||
incomplete sequence of units.
|
||||
The number of available units, N, must be > 0. */
|
||||
/* Similar to u*_mbtouc(), except that the return value gives more details
|
||||
about the failure, similar to mbrtowc(). */
|
||||
|
||||
#if GNULIB_UNISTR_U8_MBTOUCR || HAVE_LIBUNISTRING
|
||||
extern int
|
||||
u8_mbtoucr (ucs4_t *puc, const uint8_t *s, size_t n);
|
||||
#endif
|
||||
|
||||
#if GNULIB_UNISTR_U16_MBTOUCR || HAVE_LIBUNISTRING
|
||||
extern int
|
||||
u16_mbtoucr (ucs4_t *puc, const uint16_t *s, size_t n);
|
||||
#endif
|
||||
|
||||
#if GNULIB_UNISTR_U32_MBTOUCR || HAVE_LIBUNISTRING
|
||||
extern int
|
||||
u32_mbtoucr (ucs4_t *puc, const uint32_t *s, size_t n);
|
||||
#endif
|
||||
|
||||
/* Put the multibyte character represented by UC in S, returning its
|
||||
length. Return -1 upon failure, -2 if the number of available units, N,
|
||||
is too small. The latter case cannot occur if N >= 6/2/1, respectively. */
|
||||
/* Similar to wctomb(), except that s must not be NULL, and the argument n
|
||||
must be specified. */
|
||||
|
||||
#if GNULIB_UNISTR_U8_UCTOMB || HAVE_LIBUNISTRING
|
||||
/* Auxiliary function, also used by u8_chr, u8_strchr, u8_strrchr. */
|
||||
extern int
|
||||
u8_uctomb_aux (uint8_t *s, ucs4_t uc, int n);
|
||||
# if !HAVE_INLINE
|
||||
extern int
|
||||
u8_uctomb (uint8_t *s, ucs4_t uc, int n);
|
||||
# else
|
||||
static inline int
|
||||
u8_uctomb (uint8_t *s, ucs4_t uc, int n)
|
||||
{
|
||||
if (uc < 0x80 && n > 0)
|
||||
{
|
||||
s[0] = uc;
|
||||
return 1;
|
||||
}
|
||||
else
|
||||
return u8_uctomb_aux (s, uc, n);
|
||||
}
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#if GNULIB_UNISTR_U16_UCTOMB || HAVE_LIBUNISTRING
|
||||
/* Auxiliary function, also used by u16_chr, u16_strchr, u16_strrchr. */
|
||||
extern int
|
||||
u16_uctomb_aux (uint16_t *s, ucs4_t uc, int n);
|
||||
# if !HAVE_INLINE
|
||||
extern int
|
||||
u16_uctomb (uint16_t *s, ucs4_t uc, int n);
|
||||
# else
|
||||
static inline int
|
||||
u16_uctomb (uint16_t *s, ucs4_t uc, int n)
|
||||
{
|
||||
if (uc < 0xd800 && n > 0)
|
||||
{
|
||||
s[0] = uc;
|
||||
return 1;
|
||||
}
|
||||
else
|
||||
return u16_uctomb_aux (s, uc, n);
|
||||
}
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#if GNULIB_UNISTR_U32_UCTOMB || HAVE_LIBUNISTRING
|
||||
# if !HAVE_INLINE
|
||||
extern int
|
||||
u32_uctomb (uint32_t *s, ucs4_t uc, int n);
|
||||
# else
|
||||
static 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
|
||||
#endif
|
||||
|
||||
/* Copy N units from SRC to DEST. */
|
||||
/* Similar to memcpy(). */
|
||||
extern uint8_t *
|
||||
u8_cpy (uint8_t *dest, const uint8_t *src, size_t n);
|
||||
extern uint16_t *
|
||||
u16_cpy (uint16_t *dest, const uint16_t *src, size_t n);
|
||||
extern uint32_t *
|
||||
u32_cpy (uint32_t *dest, const uint32_t *src, size_t n);
|
||||
|
||||
/* Copy N units from SRC to DEST, guaranteeing correct behavior for
|
||||
overlapping memory areas. */
|
||||
/* Similar to memmove(). */
|
||||
extern uint8_t *
|
||||
u8_move (uint8_t *dest, const uint8_t *src, size_t n);
|
||||
extern uint16_t *
|
||||
u16_move (uint16_t *dest, const uint16_t *src, size_t n);
|
||||
extern uint32_t *
|
||||
u32_move (uint32_t *dest, const uint32_t *src, size_t n);
|
||||
|
||||
/* Set the first N characters of S to UC. UC should be a character that
|
||||
occupies only 1 unit. */
|
||||
/* Similar to memset(). */
|
||||
extern uint8_t *
|
||||
u8_set (uint8_t *s, ucs4_t uc, size_t n);
|
||||
extern uint16_t *
|
||||
u16_set (uint16_t *s, ucs4_t uc, size_t n);
|
||||
extern uint32_t *
|
||||
u32_set (uint32_t *s, ucs4_t uc, size_t n);
|
||||
|
||||
/* Compare S1 and S2, each of length N. */
|
||||
/* Similar to memcmp(). */
|
||||
extern int
|
||||
u8_cmp (const uint8_t *s1, const uint8_t *s2, size_t n)
|
||||
_UC_ATTRIBUTE_PURE;
|
||||
extern int
|
||||
u16_cmp (const uint16_t *s1, const uint16_t *s2, size_t n)
|
||||
_UC_ATTRIBUTE_PURE;
|
||||
extern int
|
||||
u32_cmp (const uint32_t *s1, const uint32_t *s2, size_t n)
|
||||
_UC_ATTRIBUTE_PURE;
|
||||
|
||||
/* Compare S1 and S2. */
|
||||
/* Similar to the gnulib function memcmp2(). */
|
||||
extern int
|
||||
u8_cmp2 (const uint8_t *s1, size_t n1, const uint8_t *s2, size_t n2)
|
||||
_UC_ATTRIBUTE_PURE;
|
||||
extern int
|
||||
u16_cmp2 (const uint16_t *s1, size_t n1, const uint16_t *s2, size_t n2)
|
||||
_UC_ATTRIBUTE_PURE;
|
||||
extern int
|
||||
u32_cmp2 (const uint32_t *s1, size_t n1, const uint32_t *s2, size_t n2)
|
||||
_UC_ATTRIBUTE_PURE;
|
||||
|
||||
/* Search the string at S for UC. */
|
||||
/* Similar to memchr(). */
|
||||
extern uint8_t *
|
||||
u8_chr (const uint8_t *s, size_t n, ucs4_t uc)
|
||||
_UC_ATTRIBUTE_PURE;
|
||||
extern uint16_t *
|
||||
u16_chr (const uint16_t *s, size_t n, ucs4_t uc)
|
||||
_UC_ATTRIBUTE_PURE;
|
||||
extern uint32_t *
|
||||
u32_chr (const uint32_t *s, size_t n, ucs4_t uc)
|
||||
_UC_ATTRIBUTE_PURE;
|
||||
|
||||
/* Count the number of Unicode characters in the N units from S. */
|
||||
/* Similar to mbsnlen(). */
|
||||
extern size_t
|
||||
u8_mbsnlen (const uint8_t *s, size_t n)
|
||||
_UC_ATTRIBUTE_PURE;
|
||||
extern size_t
|
||||
u16_mbsnlen (const uint16_t *s, size_t n)
|
||||
_UC_ATTRIBUTE_PURE;
|
||||
extern size_t
|
||||
u32_mbsnlen (const uint32_t *s, size_t n)
|
||||
_UC_ATTRIBUTE_PURE;
|
||||
|
||||
/* Elementary string functions with memory allocation. */
|
||||
|
||||
/* Make a freshly allocated copy of S, of length N. */
|
||||
extern uint8_t *
|
||||
u8_cpy_alloc (const uint8_t *s, size_t n);
|
||||
extern uint16_t *
|
||||
u16_cpy_alloc (const uint16_t *s, size_t n);
|
||||
extern uint32_t *
|
||||
u32_cpy_alloc (const uint32_t *s, size_t n);
|
||||
|
||||
/* Elementary string functions on NUL terminated strings. */
|
||||
|
||||
/* Return the length (number of units) of the first character in S.
|
||||
Return 0 if it is the NUL character. Return -1 upon failure. */
|
||||
extern int
|
||||
u8_strmblen (const uint8_t *s)
|
||||
_UC_ATTRIBUTE_PURE;
|
||||
extern int
|
||||
u16_strmblen (const uint16_t *s)
|
||||
_UC_ATTRIBUTE_PURE;
|
||||
extern int
|
||||
u32_strmblen (const uint32_t *s)
|
||||
_UC_ATTRIBUTE_PURE;
|
||||
|
||||
/* Return the length (number of units) of the first character in S, putting
|
||||
its 'ucs4_t' representation in *PUC. Return 0 if it is the NUL
|
||||
character. Return -1 upon failure. */
|
||||
extern int
|
||||
u8_strmbtouc (ucs4_t *puc, const uint8_t *s);
|
||||
extern int
|
||||
u16_strmbtouc (ucs4_t *puc, const uint16_t *s);
|
||||
extern int
|
||||
u32_strmbtouc (ucs4_t *puc, const uint32_t *s);
|
||||
|
||||
/* Forward iteration step. Advances the pointer past the next character,
|
||||
or returns NULL if the end of the string has been reached. Puts the
|
||||
character's 'ucs4_t' representation in *PUC. */
|
||||
extern const uint8_t *
|
||||
u8_next (ucs4_t *puc, const uint8_t *s);
|
||||
extern const uint16_t *
|
||||
u16_next (ucs4_t *puc, const uint16_t *s);
|
||||
extern const uint32_t *
|
||||
u32_next (ucs4_t *puc, const uint32_t *s);
|
||||
|
||||
/* Backward iteration step. Advances the pointer to point to the previous
|
||||
character, or returns NULL if the beginning of the string had been reached.
|
||||
Puts the character's 'ucs4_t' representation in *PUC. */
|
||||
extern const uint8_t *
|
||||
u8_prev (ucs4_t *puc, const uint8_t *s, const uint8_t *start);
|
||||
extern const uint16_t *
|
||||
u16_prev (ucs4_t *puc, const uint16_t *s, const uint16_t *start);
|
||||
extern const uint32_t *
|
||||
u32_prev (ucs4_t *puc, const uint32_t *s, const uint32_t *start);
|
||||
|
||||
/* Return the number of units in S. */
|
||||
/* Similar to strlen(), wcslen(). */
|
||||
extern size_t
|
||||
u8_strlen (const uint8_t *s)
|
||||
_UC_ATTRIBUTE_PURE;
|
||||
extern size_t
|
||||
u16_strlen (const uint16_t *s)
|
||||
_UC_ATTRIBUTE_PURE;
|
||||
extern size_t
|
||||
u32_strlen (const uint32_t *s)
|
||||
_UC_ATTRIBUTE_PURE;
|
||||
|
||||
/* Return the number of units in S, but at most MAXLEN. */
|
||||
/* Similar to strnlen(), wcsnlen(). */
|
||||
extern size_t
|
||||
u8_strnlen (const uint8_t *s, size_t maxlen)
|
||||
_UC_ATTRIBUTE_PURE;
|
||||
extern size_t
|
||||
u16_strnlen (const uint16_t *s, size_t maxlen)
|
||||
_UC_ATTRIBUTE_PURE;
|
||||
extern size_t
|
||||
u32_strnlen (const uint32_t *s, size_t maxlen)
|
||||
_UC_ATTRIBUTE_PURE;
|
||||
|
||||
/* Copy SRC to DEST. */
|
||||
/* Similar to strcpy(), wcscpy(). */
|
||||
extern uint8_t *
|
||||
u8_strcpy (uint8_t *dest, const uint8_t *src);
|
||||
extern uint16_t *
|
||||
u16_strcpy (uint16_t *dest, const uint16_t *src);
|
||||
extern uint32_t *
|
||||
u32_strcpy (uint32_t *dest, const uint32_t *src);
|
||||
|
||||
/* Copy SRC to DEST, returning the address of the terminating NUL in DEST. */
|
||||
/* Similar to stpcpy(). */
|
||||
extern uint8_t *
|
||||
u8_stpcpy (uint8_t *dest, const uint8_t *src);
|
||||
extern uint16_t *
|
||||
u16_stpcpy (uint16_t *dest, const uint16_t *src);
|
||||
extern uint32_t *
|
||||
u32_stpcpy (uint32_t *dest, const uint32_t *src);
|
||||
|
||||
/* Copy no more than N units of SRC to DEST. */
|
||||
/* Similar to strncpy(), wcsncpy(). */
|
||||
extern uint8_t *
|
||||
u8_strncpy (uint8_t *dest, const uint8_t *src, size_t n);
|
||||
extern uint16_t *
|
||||
u16_strncpy (uint16_t *dest, const uint16_t *src, size_t n);
|
||||
extern uint32_t *
|
||||
u32_strncpy (uint32_t *dest, const uint32_t *src, size_t n);
|
||||
|
||||
/* Copy no more than N units of SRC to DEST. Return a pointer past the last
|
||||
non-NUL unit written into DEST. */
|
||||
/* Similar to stpncpy(). */
|
||||
extern uint8_t *
|
||||
u8_stpncpy (uint8_t *dest, const uint8_t *src, size_t n);
|
||||
extern uint16_t *
|
||||
u16_stpncpy (uint16_t *dest, const uint16_t *src, size_t n);
|
||||
extern uint32_t *
|
||||
u32_stpncpy (uint32_t *dest, const uint32_t *src, size_t n);
|
||||
|
||||
/* Append SRC onto DEST. */
|
||||
/* Similar to strcat(), wcscat(). */
|
||||
extern uint8_t *
|
||||
u8_strcat (uint8_t *dest, const uint8_t *src);
|
||||
extern uint16_t *
|
||||
u16_strcat (uint16_t *dest, const uint16_t *src);
|
||||
extern uint32_t *
|
||||
u32_strcat (uint32_t *dest, const uint32_t *src);
|
||||
|
||||
/* Append no more than N units of SRC onto DEST. */
|
||||
/* Similar to strncat(), wcsncat(). */
|
||||
extern uint8_t *
|
||||
u8_strncat (uint8_t *dest, const uint8_t *src, size_t n);
|
||||
extern uint16_t *
|
||||
u16_strncat (uint16_t *dest, const uint16_t *src, size_t n);
|
||||
extern uint32_t *
|
||||
u32_strncat (uint32_t *dest, const uint32_t *src, size_t n);
|
||||
|
||||
/* Compare S1 and S2. */
|
||||
/* Similar to strcmp(), wcscmp(). */
|
||||
#ifdef __sun
|
||||
/* Avoid a collision with the u8_strcmp() function in Solaris 11 libc. */
|
||||
extern int
|
||||
u8_strcmp_gnu (const uint8_t *s1, const uint8_t *s2)
|
||||
_UC_ATTRIBUTE_PURE;
|
||||
# define u8_strcmp u8_strcmp_gnu
|
||||
#else
|
||||
extern int
|
||||
u8_strcmp (const uint8_t *s1, const uint8_t *s2)
|
||||
_UC_ATTRIBUTE_PURE;
|
||||
#endif
|
||||
extern int
|
||||
u16_strcmp (const uint16_t *s1, const uint16_t *s2)
|
||||
_UC_ATTRIBUTE_PURE;
|
||||
extern int
|
||||
u32_strcmp (const uint32_t *s1, const uint32_t *s2)
|
||||
_UC_ATTRIBUTE_PURE;
|
||||
|
||||
/* Compare S1 and S2 using the collation rules of the current locale.
|
||||
Return -1 if S1 < S2, 0 if S1 = S2, 1 if S1 > S2.
|
||||
Upon failure, set errno and return any value. */
|
||||
/* Similar to strcoll(), wcscoll(). */
|
||||
extern int
|
||||
u8_strcoll (const uint8_t *s1, const uint8_t *s2);
|
||||
extern int
|
||||
u16_strcoll (const uint16_t *s1, const uint16_t *s2);
|
||||
extern int
|
||||
u32_strcoll (const uint32_t *s1, const uint32_t *s2);
|
||||
|
||||
/* Compare no more than N units of S1 and S2. */
|
||||
/* Similar to strncmp(), wcsncmp(). */
|
||||
extern int
|
||||
u8_strncmp (const uint8_t *s1, const uint8_t *s2, size_t n)
|
||||
_UC_ATTRIBUTE_PURE;
|
||||
extern int
|
||||
u16_strncmp (const uint16_t *s1, const uint16_t *s2, size_t n)
|
||||
_UC_ATTRIBUTE_PURE;
|
||||
extern int
|
||||
u32_strncmp (const uint32_t *s1, const uint32_t *s2, size_t n)
|
||||
_UC_ATTRIBUTE_PURE;
|
||||
|
||||
/* Duplicate S, returning an identical malloc'd string. */
|
||||
/* Similar to strdup(), wcsdup(). */
|
||||
extern uint8_t *
|
||||
u8_strdup (const uint8_t *s);
|
||||
extern uint16_t *
|
||||
u16_strdup (const uint16_t *s);
|
||||
extern uint32_t *
|
||||
u32_strdup (const uint32_t *s);
|
||||
|
||||
/* Find the first occurrence of UC in STR. */
|
||||
/* Similar to strchr(), wcschr(). */
|
||||
extern uint8_t *
|
||||
u8_strchr (const uint8_t *str, ucs4_t uc)
|
||||
_UC_ATTRIBUTE_PURE;
|
||||
extern uint16_t *
|
||||
u16_strchr (const uint16_t *str, ucs4_t uc)
|
||||
_UC_ATTRIBUTE_PURE;
|
||||
extern uint32_t *
|
||||
u32_strchr (const uint32_t *str, ucs4_t uc)
|
||||
_UC_ATTRIBUTE_PURE;
|
||||
|
||||
/* Find the last occurrence of UC in STR. */
|
||||
/* Similar to strrchr(), wcsrchr(). */
|
||||
extern uint8_t *
|
||||
u8_strrchr (const uint8_t *str, ucs4_t uc)
|
||||
_UC_ATTRIBUTE_PURE;
|
||||
extern uint16_t *
|
||||
u16_strrchr (const uint16_t *str, ucs4_t uc)
|
||||
_UC_ATTRIBUTE_PURE;
|
||||
extern uint32_t *
|
||||
u32_strrchr (const uint32_t *str, ucs4_t uc)
|
||||
_UC_ATTRIBUTE_PURE;
|
||||
|
||||
/* Return the length of the initial segment of STR which consists entirely
|
||||
of Unicode characters not in REJECT. */
|
||||
/* Similar to strcspn(), wcscspn(). */
|
||||
extern size_t
|
||||
u8_strcspn (const uint8_t *str, const uint8_t *reject)
|
||||
_UC_ATTRIBUTE_PURE;
|
||||
extern size_t
|
||||
u16_strcspn (const uint16_t *str, const uint16_t *reject)
|
||||
_UC_ATTRIBUTE_PURE;
|
||||
extern size_t
|
||||
u32_strcspn (const uint32_t *str, const uint32_t *reject)
|
||||
_UC_ATTRIBUTE_PURE;
|
||||
|
||||
/* Return the length of the initial segment of STR which consists entirely
|
||||
of Unicode characters in ACCEPT. */
|
||||
/* Similar to strspn(), wcsspn(). */
|
||||
extern size_t
|
||||
u8_strspn (const uint8_t *str, const uint8_t *accept)
|
||||
_UC_ATTRIBUTE_PURE;
|
||||
extern size_t
|
||||
u16_strspn (const uint16_t *str, const uint16_t *accept)
|
||||
_UC_ATTRIBUTE_PURE;
|
||||
extern size_t
|
||||
u32_strspn (const uint32_t *str, const uint32_t *accept)
|
||||
_UC_ATTRIBUTE_PURE;
|
||||
|
||||
/* Find the first occurrence in STR of any character in ACCEPT. */
|
||||
/* Similar to strpbrk(), wcspbrk(). */
|
||||
extern uint8_t *
|
||||
u8_strpbrk (const uint8_t *str, const uint8_t *accept)
|
||||
_UC_ATTRIBUTE_PURE;
|
||||
extern uint16_t *
|
||||
u16_strpbrk (const uint16_t *str, const uint16_t *accept)
|
||||
_UC_ATTRIBUTE_PURE;
|
||||
extern uint32_t *
|
||||
u32_strpbrk (const uint32_t *str, const uint32_t *accept)
|
||||
_UC_ATTRIBUTE_PURE;
|
||||
|
||||
/* Find the first occurrence of NEEDLE in HAYSTACK. */
|
||||
/* Similar to strstr(), wcsstr(). */
|
||||
extern uint8_t *
|
||||
u8_strstr (const uint8_t *haystack, const uint8_t *needle)
|
||||
_UC_ATTRIBUTE_PURE;
|
||||
extern uint16_t *
|
||||
u16_strstr (const uint16_t *haystack, const uint16_t *needle)
|
||||
_UC_ATTRIBUTE_PURE;
|
||||
extern uint32_t *
|
||||
u32_strstr (const uint32_t *haystack, const uint32_t *needle)
|
||||
_UC_ATTRIBUTE_PURE;
|
||||
|
||||
/* Test whether STR starts with PREFIX. */
|
||||
extern bool
|
||||
u8_startswith (const uint8_t *str, const uint8_t *prefix)
|
||||
_UC_ATTRIBUTE_PURE;
|
||||
extern bool
|
||||
u16_startswith (const uint16_t *str, const uint16_t *prefix)
|
||||
_UC_ATTRIBUTE_PURE;
|
||||
extern bool
|
||||
u32_startswith (const uint32_t *str, const uint32_t *prefix)
|
||||
_UC_ATTRIBUTE_PURE;
|
||||
|
||||
/* Test whether STR ends with SUFFIX. */
|
||||
extern bool
|
||||
u8_endswith (const uint8_t *str, const uint8_t *suffix)
|
||||
_UC_ATTRIBUTE_PURE;
|
||||
extern bool
|
||||
u16_endswith (const uint16_t *str, const uint16_t *suffix)
|
||||
_UC_ATTRIBUTE_PURE;
|
||||
extern bool
|
||||
u32_endswith (const uint32_t *str, const uint32_t *suffix)
|
||||
_UC_ATTRIBUTE_PURE;
|
||||
|
||||
/* Divide STR into tokens separated by characters in DELIM.
|
||||
This interface is actually more similar to wcstok than to strtok. */
|
||||
/* Similar to strtok_r(), wcstok(). */
|
||||
extern uint8_t *
|
||||
u8_strtok (uint8_t *str, const uint8_t *delim, uint8_t **ptr);
|
||||
extern uint16_t *
|
||||
u16_strtok (uint16_t *str, const uint16_t *delim, uint16_t **ptr);
|
||||
extern uint32_t *
|
||||
u32_strtok (uint32_t *str, const uint32_t *delim, uint32_t **ptr);
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* _UNISTR_H */
|
|
@ -1,240 +0,0 @@
|
|||
/* Conversion UTF-8 to UCS-4.
|
||||
Copyright (C) 2001-2002, 2006-2007, 2009-2016 Free Software Foundation, Inc.
|
||||
Written by Bruno Haible <bruno@clisp.org>, 2001.
|
||||
|
||||
This program 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 3 of the License, 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
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
||||
|
||||
#include <config.h>
|
||||
|
||||
/* Specification. */
|
||||
#include "unistr.h"
|
||||
|
||||
#if defined IN_LIBUNISTRING || HAVE_INLINE
|
||||
|
||||
int
|
||||
u8_mbtouc_aux (ucs4_t *puc, const uint8_t *s, size_t n)
|
||||
{
|
||||
uint8_t c = *s;
|
||||
|
||||
if (c >= 0xc2)
|
||||
{
|
||||
if (c < 0xe0)
|
||||
{
|
||||
if (n >= 2)
|
||||
{
|
||||
if ((s[1] ^ 0x80) < 0x40)
|
||||
{
|
||||
*puc = ((unsigned int) (c & 0x1f) << 6)
|
||||
| (unsigned int) (s[1] ^ 0x80);
|
||||
return 2;
|
||||
}
|
||||
/* invalid multibyte character */
|
||||
}
|
||||
else
|
||||
{
|
||||
/* incomplete multibyte character */
|
||||
*puc = 0xfffd;
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
else if (c < 0xf0)
|
||||
{
|
||||
if (n >= 3)
|
||||
{
|
||||
if ((s[1] ^ 0x80) < 0x40)
|
||||
{
|
||||
if ((s[2] ^ 0x80) < 0x40)
|
||||
{
|
||||
if ((c >= 0xe1 || s[1] >= 0xa0)
|
||||
&& (c != 0xed || s[1] < 0xa0))
|
||||
{
|
||||
*puc = ((unsigned int) (c & 0x0f) << 12)
|
||||
| ((unsigned int) (s[1] ^ 0x80) << 6)
|
||||
| (unsigned int) (s[2] ^ 0x80);
|
||||
return 3;
|
||||
}
|
||||
/* invalid multibyte character */
|
||||
*puc = 0xfffd;
|
||||
return 3;
|
||||
}
|
||||
/* invalid multibyte character */
|
||||
*puc = 0xfffd;
|
||||
return 2;
|
||||
}
|
||||
/* invalid multibyte character */
|
||||
}
|
||||
else
|
||||
{
|
||||
/* incomplete multibyte character */
|
||||
*puc = 0xfffd;
|
||||
if (n == 1 || (s[1] ^ 0x80) >= 0x40)
|
||||
return 1;
|
||||
else
|
||||
return 2;
|
||||
}
|
||||
}
|
||||
else if (c < 0xf8)
|
||||
{
|
||||
if (n >= 4)
|
||||
{
|
||||
if ((s[1] ^ 0x80) < 0x40)
|
||||
{
|
||||
if ((s[2] ^ 0x80) < 0x40)
|
||||
{
|
||||
if ((s[3] ^ 0x80) < 0x40)
|
||||
{
|
||||
if ((c >= 0xf1 || s[1] >= 0x90)
|
||||
#if 1
|
||||
&& (c < 0xf4 || (c == 0xf4 && s[1] < 0x90))
|
||||
#endif
|
||||
)
|
||||
{
|
||||
*puc = ((unsigned int) (c & 0x07) << 18)
|
||||
| ((unsigned int) (s[1] ^ 0x80) << 12)
|
||||
| ((unsigned int) (s[2] ^ 0x80) << 6)
|
||||
| (unsigned int) (s[3] ^ 0x80);
|
||||
return 4;
|
||||
}
|
||||
/* invalid multibyte character */
|
||||
*puc = 0xfffd;
|
||||
return 4;
|
||||
}
|
||||
/* invalid multibyte character */
|
||||
*puc = 0xfffd;
|
||||
return 3;
|
||||
}
|
||||
/* invalid multibyte character */
|
||||
*puc = 0xfffd;
|
||||
return 2;
|
||||
}
|
||||
/* invalid multibyte character */
|
||||
}
|
||||
else
|
||||
{
|
||||
/* incomplete multibyte character */
|
||||
*puc = 0xfffd;
|
||||
if (n == 1 || (s[1] ^ 0x80) >= 0x40)
|
||||
return 1;
|
||||
else if (n == 2 || (s[2] ^ 0x80) >= 0x40)
|
||||
return 2;
|
||||
else
|
||||
return 3;
|
||||
}
|
||||
}
|
||||
#if 0
|
||||
else if (c < 0xfc)
|
||||
{
|
||||
if (n >= 5)
|
||||
{
|
||||
if ((s[1] ^ 0x80) < 0x40)
|
||||
{
|
||||
if ((s[2] ^ 0x80) < 0x40)
|
||||
{
|
||||
if ((s[3] ^ 0x80) < 0x40)
|
||||
{
|
||||
if ((s[4] ^ 0x80) < 0x40)
|
||||
{
|
||||
if (c >= 0xf9 || s[1] >= 0x88)
|
||||
{
|
||||
*puc = ((unsigned int) (c & 0x03) << 24)
|
||||
| ((unsigned int) (s[1] ^ 0x80) << 18)
|
||||
| ((unsigned int) (s[2] ^ 0x80) << 12)
|
||||
| ((unsigned int) (s[3] ^ 0x80) << 6)
|
||||
| (unsigned int) (s[4] ^ 0x80);
|
||||
return 5;
|
||||
}
|
||||
/* invalid multibyte character */
|
||||
*puc = 0xfffd;
|
||||
return 5;
|
||||
}
|
||||
/* invalid multibyte character */
|
||||
*puc = 0xfffd;
|
||||
return 4;
|
||||
}
|
||||
/* invalid multibyte character */
|
||||
*puc = 0xfffd;
|
||||
return 3;
|
||||
}
|
||||
/* invalid multibyte character */
|
||||
return 2;
|
||||
}
|
||||
/* invalid multibyte character */
|
||||
}
|
||||
else
|
||||
{
|
||||
/* incomplete multibyte character */
|
||||
*puc = 0xfffd;
|
||||
return n;
|
||||
}
|
||||
}
|
||||
else if (c < 0xfe)
|
||||
{
|
||||
if (n >= 6)
|
||||
{
|
||||
if ((s[1] ^ 0x80) < 0x40)
|
||||
{
|
||||
if ((s[2] ^ 0x80) < 0x40)
|
||||
{
|
||||
if ((s[3] ^ 0x80) < 0x40)
|
||||
{
|
||||
if ((s[4] ^ 0x80) < 0x40)
|
||||
{
|
||||
if ((s[5] ^ 0x80) < 0x40)
|
||||
{
|
||||
if (c >= 0xfd || s[1] >= 0x84)
|
||||
{
|
||||
*puc = ((unsigned int) (c & 0x01) << 30)
|
||||
| ((unsigned int) (s[1] ^ 0x80) << 24)
|
||||
| ((unsigned int) (s[2] ^ 0x80) << 18)
|
||||
| ((unsigned int) (s[3] ^ 0x80) << 12)
|
||||
| ((unsigned int) (s[4] ^ 0x80) << 6)
|
||||
| (unsigned int) (s[5] ^ 0x80);
|
||||
return 6;
|
||||
}
|
||||
/* invalid multibyte character */
|
||||
*puc = 0xfffd;
|
||||
return 6;
|
||||
}
|
||||
/* invalid multibyte character */
|
||||
*puc = 0xfffd;
|
||||
return 5;
|
||||
}
|
||||
/* invalid multibyte character */
|
||||
*puc = 0xfffd;
|
||||
return 4;
|
||||
}
|
||||
/* invalid multibyte character */
|
||||
*puc = 0xfffd;
|
||||
return 3;
|
||||
}
|
||||
/* invalid multibyte character */
|
||||
return 2;
|
||||
}
|
||||
/* invalid multibyte character */
|
||||
}
|
||||
else
|
||||
{
|
||||
/* incomplete multibyte character */
|
||||
*puc = 0xfffd;
|
||||
return n;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
}
|
||||
/* invalid multibyte character */
|
||||
*puc = 0xfffd;
|
||||
return 1;
|
||||
}
|
||||
|
||||
#endif
|
|
@ -1,260 +0,0 @@
|
|||
/* Conversion UTF-8 to UCS-4.
|
||||
Copyright (C) 2001-2002, 2006-2007, 2009-2016 Free Software Foundation, Inc.
|
||||
Written by Bruno Haible <bruno@clisp.org>, 2001.
|
||||
|
||||
This program 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 3 of the License, 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
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
||||
|
||||
#include <config.h>
|
||||
|
||||
/* Specification. */
|
||||
#include "unistr.h"
|
||||
|
||||
#if defined IN_LIBUNISTRING || HAVE_INLINE
|
||||
|
||||
int
|
||||
u8_mbtouc_unsafe_aux (ucs4_t *puc, const uint8_t *s, size_t n)
|
||||
{
|
||||
uint8_t c = *s;
|
||||
|
||||
if (c >= 0xc2)
|
||||
{
|
||||
if (c < 0xe0)
|
||||
{
|
||||
if (n >= 2)
|
||||
{
|
||||
#if CONFIG_UNICODE_SAFETY
|
||||
if ((s[1] ^ 0x80) < 0x40)
|
||||
#endif
|
||||
{
|
||||
*puc = ((unsigned int) (c & 0x1f) << 6)
|
||||
| (unsigned int) (s[1] ^ 0x80);
|
||||
return 2;
|
||||
}
|
||||
#if CONFIG_UNICODE_SAFETY
|
||||
/* invalid multibyte character */
|
||||
#endif
|
||||
}
|
||||
else
|
||||
{
|
||||
/* incomplete multibyte character */
|
||||
*puc = 0xfffd;
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
else if (c < 0xf0)
|
||||
{
|
||||
if (n >= 3)
|
||||
{
|
||||
#if CONFIG_UNICODE_SAFETY
|
||||
if ((s[1] ^ 0x80) < 0x40)
|
||||
{
|
||||
if ((s[2] ^ 0x80) < 0x40)
|
||||
{
|
||||
if ((c >= 0xe1 || s[1] >= 0xa0)
|
||||
&& (c != 0xed || s[1] < 0xa0))
|
||||
#endif
|
||||
{
|
||||
*puc = ((unsigned int) (c & 0x0f) << 12)
|
||||
| ((unsigned int) (s[1] ^ 0x80) << 6)
|
||||
| (unsigned int) (s[2] ^ 0x80);
|
||||
return 3;
|
||||
}
|
||||
#if CONFIG_UNICODE_SAFETY
|
||||
/* invalid multibyte character */
|
||||
*puc = 0xfffd;
|
||||
return 3;
|
||||
}
|
||||
/* invalid multibyte character */
|
||||
*puc = 0xfffd;
|
||||
return 2;
|
||||
}
|
||||
/* invalid multibyte character */
|
||||
#endif
|
||||
}
|
||||
else
|
||||
{
|
||||
/* incomplete multibyte character */
|
||||
*puc = 0xfffd;
|
||||
if (n == 1 || (s[1] ^ 0x80) >= 0x40)
|
||||
return 1;
|
||||
else
|
||||
return 2;
|
||||
}
|
||||
}
|
||||
else if (c < 0xf8)
|
||||
{
|
||||
if (n >= 4)
|
||||
{
|
||||
#if CONFIG_UNICODE_SAFETY
|
||||
if ((s[1] ^ 0x80) < 0x40)
|
||||
{
|
||||
if ((s[2] ^ 0x80) < 0x40)
|
||||
{
|
||||
if ((s[3] ^ 0x80) < 0x40)
|
||||
{
|
||||
if ((c >= 0xf1 || s[1] >= 0x90)
|
||||
#if 1
|
||||
&& (c < 0xf4 || (c == 0xf4 && s[1] < 0x90))
|
||||
#endif
|
||||
)
|
||||
#endif
|
||||
{
|
||||
*puc = ((unsigned int) (c & 0x07) << 18)
|
||||
| ((unsigned int) (s[1] ^ 0x80) << 12)
|
||||
| ((unsigned int) (s[2] ^ 0x80) << 6)
|
||||
| (unsigned int) (s[3] ^ 0x80);
|
||||
return 4;
|
||||
}
|
||||
#if CONFIG_UNICODE_SAFETY
|
||||
/* invalid multibyte character */
|
||||
*puc = 0xfffd;
|
||||
return 4;
|
||||
}
|
||||
/* invalid multibyte character */
|
||||
*puc = 0xfffd;
|
||||
return 3;
|
||||
}
|
||||
/* invalid multibyte character */
|
||||
*puc = 0xfffd;
|
||||
return 2;
|
||||
}
|
||||
/* invalid multibyte character */
|
||||
#endif
|
||||
}
|
||||
else
|
||||
{
|
||||
/* incomplete multibyte character */
|
||||
*puc = 0xfffd;
|
||||
if (n == 1 || (s[1] ^ 0x80) >= 0x40)
|
||||
return 1;
|
||||
else if (n == 2 || (s[2] ^ 0x80) >= 0x40)
|
||||
return 2;
|
||||
else
|
||||
return 3;
|
||||
}
|
||||
}
|
||||
#if 0
|
||||
else if (c < 0xfc)
|
||||
{
|
||||
if (n >= 5)
|
||||
{
|
||||
#if CONFIG_UNICODE_SAFETY
|
||||
if ((s[1] ^ 0x80) < 0x40)
|
||||
{
|
||||
if ((s[2] ^ 0x80) < 0x40)
|
||||
{
|
||||
if ((s[3] ^ 0x80) < 0x40)
|
||||
{
|
||||
if ((s[4] ^ 0x80) < 0x40)
|
||||
{
|
||||
if (c >= 0xf9 || s[1] >= 0x88)
|
||||
#endif
|
||||
{
|
||||
*puc = ((unsigned int) (c & 0x03) << 24)
|
||||
| ((unsigned int) (s[1] ^ 0x80) << 18)
|
||||
| ((unsigned int) (s[2] ^ 0x80) << 12)
|
||||
| ((unsigned int) (s[3] ^ 0x80) << 6)
|
||||
| (unsigned int) (s[4] ^ 0x80);
|
||||
return 5;
|
||||
}
|
||||
#if CONFIG_UNICODE_SAFETY
|
||||
/* invalid multibyte character */
|
||||
*puc = 0xfffd;
|
||||
return 5;
|
||||
}
|
||||
/* invalid multibyte character */
|
||||
*puc = 0xfffd;
|
||||
return 4;
|
||||
}
|
||||
/* invalid multibyte character */
|
||||
*puc = 0xfffd;
|
||||
return 3;
|
||||
}
|
||||
/* invalid multibyte character */
|
||||
return 2;
|
||||
}
|
||||
/* invalid multibyte character */
|
||||
#endif
|
||||
}
|
||||
else
|
||||
{
|
||||
/* incomplete multibyte character */
|
||||
*puc = 0xfffd;
|
||||
return n;
|
||||
}
|
||||
}
|
||||
else if (c < 0xfe)
|
||||
{
|
||||
if (n >= 6)
|
||||
{
|
||||
#if CONFIG_UNICODE_SAFETY
|
||||
if ((s[1] ^ 0x80) < 0x40)
|
||||
{
|
||||
if ((s[2] ^ 0x80) < 0x40)
|
||||
{
|
||||
if ((s[3] ^ 0x80) < 0x40)
|
||||
{
|
||||
if ((s[4] ^ 0x80) < 0x40)
|
||||
{
|
||||
if ((s[5] ^ 0x80) < 0x40)
|
||||
{
|
||||
if (c >= 0xfd || s[1] >= 0x84)
|
||||
#endif
|
||||
{
|
||||
*puc = ((unsigned int) (c & 0x01) << 30)
|
||||
| ((unsigned int) (s[1] ^ 0x80) << 24)
|
||||
| ((unsigned int) (s[2] ^ 0x80) << 18)
|
||||
| ((unsigned int) (s[3] ^ 0x80) << 12)
|
||||
| ((unsigned int) (s[4] ^ 0x80) << 6)
|
||||
| (unsigned int) (s[5] ^ 0x80);
|
||||
return 6;
|
||||
}
|
||||
#if CONFIG_UNICODE_SAFETY
|
||||
/* invalid multibyte character */
|
||||
*puc = 0xfffd;
|
||||
return 6;
|
||||
}
|
||||
/* invalid multibyte character */
|
||||
*puc = 0xfffd;
|
||||
return 5;
|
||||
}
|
||||
/* invalid multibyte character */
|
||||
*puc = 0xfffd;
|
||||
return 4;
|
||||
}
|
||||
/* invalid multibyte character */
|
||||
*puc = 0xfffd;
|
||||
return 3;
|
||||
}
|
||||
/* invalid multibyte character */
|
||||
return 2;
|
||||
}
|
||||
/* invalid multibyte character */
|
||||
#endif
|
||||
}
|
||||
else
|
||||
{
|
||||
/* incomplete multibyte character */
|
||||
*puc = 0xfffd;
|
||||
return n;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
}
|
||||
/* invalid multibyte character */
|
||||
*puc = 0xfffd;
|
||||
return 1;
|
||||
}
|
||||
|
||||
#endif
|
|
@ -1,271 +0,0 @@
|
|||
/* Look at first character in UTF-8 string.
|
||||
Copyright (C) 1999-2002, 2006-2007, 2009-2016 Free Software Foundation, Inc.
|
||||
Written by Bruno Haible <bruno@clisp.org>, 2001.
|
||||
|
||||
This program 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 3 of the License, 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
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
||||
|
||||
#include <config.h>
|
||||
|
||||
#if defined IN_LIBUNISTRING
|
||||
/* Tell unistr.h to declare u8_mbtouc_unsafe as 'extern', not
|
||||
'static inline'. */
|
||||
# include "unistring-notinline.h"
|
||||
#endif
|
||||
|
||||
/* Specification. */
|
||||
#include "unistr.h"
|
||||
|
||||
#if !HAVE_INLINE
|
||||
|
||||
int
|
||||
u8_mbtouc_unsafe (ucs4_t *puc, const uint8_t *s, size_t n)
|
||||
{
|
||||
uint8_t c = *s;
|
||||
|
||||
if (c < 0x80)
|
||||
{
|
||||
*puc = c;
|
||||
return 1;
|
||||
}
|
||||
else if (c >= 0xc2)
|
||||
{
|
||||
if (c < 0xe0)
|
||||
{
|
||||
if (n >= 2)
|
||||
{
|
||||
#if CONFIG_UNICODE_SAFETY
|
||||
if ((s[1] ^ 0x80) < 0x40)
|
||||
#endif
|
||||
{
|
||||
*puc = ((unsigned int) (c & 0x1f) << 6)
|
||||
| (unsigned int) (s[1] ^ 0x80);
|
||||
return 2;
|
||||
}
|
||||
#if CONFIG_UNICODE_SAFETY
|
||||
/* invalid multibyte character */
|
||||
#endif
|
||||
}
|
||||
else
|
||||
{
|
||||
/* incomplete multibyte character */
|
||||
*puc = 0xfffd;
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
else if (c < 0xf0)
|
||||
{
|
||||
if (n >= 3)
|
||||
{
|
||||
#if CONFIG_UNICODE_SAFETY
|
||||
if ((s[1] ^ 0x80) < 0x40)
|
||||
{
|
||||
if ((s[2] ^ 0x80) < 0x40)
|
||||
{
|
||||
if ((c >= 0xe1 || s[1] >= 0xa0)
|
||||
&& (c != 0xed || s[1] < 0xa0))
|
||||
#endif
|
||||
{
|
||||
*puc = ((unsigned int) (c & 0x0f) << 12)
|
||||
| ((unsigned int) (s[1] ^ 0x80) << 6)
|
||||
| (unsigned int) (s[2] ^ 0x80);
|
||||
return 3;
|
||||
}
|
||||
#if CONFIG_UNICODE_SAFETY
|
||||
/* invalid multibyte character */
|
||||
*puc = 0xfffd;
|
||||
return 3;
|
||||
}
|
||||
/* invalid multibyte character */
|
||||
*puc = 0xfffd;
|
||||
return 2;
|
||||
}
|
||||
/* invalid multibyte character */
|
||||
#endif
|
||||
}
|
||||
else
|
||||
{
|
||||
/* incomplete multibyte character */
|
||||
*puc = 0xfffd;
|
||||
if (n == 1 || (s[1] ^ 0x80) >= 0x40)
|
||||
return 1;
|
||||
else
|
||||
return 2;
|
||||
}
|
||||
}
|
||||
else if (c < 0xf8)
|
||||
{
|
||||
if (n >= 4)
|
||||
{
|
||||
#if CONFIG_UNICODE_SAFETY
|
||||
if ((s[1] ^ 0x80) < 0x40)
|
||||
{
|
||||
if ((s[2] ^ 0x80) < 0x40)
|
||||
{
|
||||
if ((s[3] ^ 0x80) < 0x40)
|
||||
{
|
||||
if ((c >= 0xf1 || s[1] >= 0x90)
|
||||
#if 1
|
||||
&& (c < 0xf4 || (c == 0xf4 && s[1] < 0x90))
|
||||
#endif
|
||||
)
|
||||
#endif
|
||||
{
|
||||
*puc = ((unsigned int) (c & 0x07) << 18)
|
||||
| ((unsigned int) (s[1] ^ 0x80) << 12)
|
||||
| ((unsigned int) (s[2] ^ 0x80) << 6)
|
||||
| (unsigned int) (s[3] ^ 0x80);
|
||||
return 4;
|
||||
}
|
||||
#if CONFIG_UNICODE_SAFETY
|
||||
/* invalid multibyte character */
|
||||
*puc = 0xfffd;
|
||||
return 4;
|
||||
}
|
||||
/* invalid multibyte character */
|
||||
*puc = 0xfffd;
|
||||
return 3;
|
||||
}
|
||||
/* invalid multibyte character */
|
||||
*puc = 0xfffd;
|
||||
return 2;
|
||||
}
|
||||
/* invalid multibyte character */
|
||||
#endif
|
||||
}
|
||||
else
|
||||
{
|
||||
/* incomplete multibyte character */
|
||||
*puc = 0xfffd;
|
||||
if (n == 1 || (s[1] ^ 0x80) >= 0x40)
|
||||
return 1;
|
||||
else if (n == 2 || (s[2] ^ 0x80) >= 0x40)
|
||||
return 2;
|
||||
else
|
||||
return 3;
|
||||
}
|
||||
}
|
||||
#if 0
|
||||
else if (c < 0xfc)
|
||||
{
|
||||
if (n >= 5)
|
||||
{
|
||||
#if CONFIG_UNICODE_SAFETY
|
||||
if ((s[1] ^ 0x80) < 0x40)
|
||||
{
|
||||
if ((s[2] ^ 0x80) < 0x40)
|
||||
{
|
||||
if ((s[3] ^ 0x80) < 0x40)
|
||||
{
|
||||
if ((s[4] ^ 0x80) < 0x40)
|
||||
{
|
||||
if (c >= 0xf9 || s[1] >= 0x88)
|
||||
#endif
|
||||
{
|
||||
*puc = ((unsigned int) (c & 0x03) << 24)
|
||||
| ((unsigned int) (s[1] ^ 0x80) << 18)
|
||||
| ((unsigned int) (s[2] ^ 0x80) << 12)
|
||||
| ((unsigned int) (s[3] ^ 0x80) << 6)
|
||||
| (unsigned int) (s[4] ^ 0x80);
|
||||
return 5;
|
||||
}
|
||||
#if CONFIG_UNICODE_SAFETY
|
||||
/* invalid multibyte character */
|
||||
*puc = 0xfffd;
|
||||
return 5;
|
||||
}
|
||||
/* invalid multibyte character */
|
||||
*puc = 0xfffd;
|
||||
return 4;
|
||||
}
|
||||
/* invalid multibyte character */
|
||||
*puc = 0xfffd;
|
||||
return 3;
|
||||
}
|
||||
/* invalid multibyte character */
|
||||
return 2;
|
||||
}
|
||||
/* invalid multibyte character */
|
||||
#endif
|
||||
}
|
||||
else
|
||||
{
|
||||
/* incomplete multibyte character */
|
||||
*puc = 0xfffd;
|
||||
return n;
|
||||
}
|
||||
}
|
||||
else if (c < 0xfe)
|
||||
{
|
||||
if (n >= 6)
|
||||
{
|
||||
#if CONFIG_UNICODE_SAFETY
|
||||
if ((s[1] ^ 0x80) < 0x40)
|
||||
{
|
||||
if ((s[2] ^ 0x80) < 0x40)
|
||||
{
|
||||
if ((s[3] ^ 0x80) < 0x40)
|
||||
{
|
||||
if ((s[4] ^ 0x80) < 0x40)
|
||||
{
|
||||
if ((s[5] ^ 0x80) < 0x40)
|
||||
{
|
||||
if (c >= 0xfd || s[1] >= 0x84)
|
||||
#endif
|
||||
{
|
||||
*puc = ((unsigned int) (c & 0x01) << 30)
|
||||
| ((unsigned int) (s[1] ^ 0x80) << 24)
|
||||
| ((unsigned int) (s[2] ^ 0x80) << 18)
|
||||
| ((unsigned int) (s[3] ^ 0x80) << 12)
|
||||
| ((unsigned int) (s[4] ^ 0x80) << 6)
|
||||
| (unsigned int) (s[5] ^ 0x80);
|
||||
return 6;
|
||||
}
|
||||
#if CONFIG_UNICODE_SAFETY
|
||||
/* invalid multibyte character */
|
||||
*puc = 0xfffd;
|
||||
return 6;
|
||||
}
|
||||
/* invalid multibyte character */
|
||||
*puc = 0xfffd;
|
||||
return 5;
|
||||
}
|
||||
/* invalid multibyte character */
|
||||
*puc = 0xfffd;
|
||||
return 4;
|
||||
}
|
||||
/* invalid multibyte character */
|
||||
*puc = 0xfffd;
|
||||
return 3;
|
||||
}
|
||||
/* invalid multibyte character */
|
||||
return 2;
|
||||
}
|
||||
/* invalid multibyte character */
|
||||
#endif
|
||||
}
|
||||
else
|
||||
{
|
||||
/* incomplete multibyte character */
|
||||
*puc = 0xfffd;
|
||||
return n;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
}
|
||||
/* invalid multibyte character */
|
||||
*puc = 0xfffd;
|
||||
return 1;
|
||||
}
|
||||
|
||||
#endif
|
|
@ -1,250 +0,0 @@
|
|||
/* Look at first character in UTF-8 string.
|
||||
Copyright (C) 1999-2002, 2006-2007, 2009-2016 Free Software Foundation, Inc.
|
||||
Written by Bruno Haible <bruno@clisp.org>, 2001.
|
||||
|
||||
This program 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 3 of the License, 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
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
||||
|
||||
#include <config.h>
|
||||
|
||||
#if defined IN_LIBUNISTRING
|
||||
/* Tell unistr.h to declare u8_mbtouc as 'extern', not 'static inline'. */
|
||||
# include "unistring-notinline.h"
|
||||
#endif
|
||||
|
||||
/* Specification. */
|
||||
#include "unistr.h"
|
||||
|
||||
#if !HAVE_INLINE
|
||||
|
||||
int
|
||||
u8_mbtouc (ucs4_t *puc, const uint8_t *s, size_t n)
|
||||
{
|
||||
uint8_t c = *s;
|
||||
|
||||
if (c < 0x80)
|
||||
{
|
||||
*puc = c;
|
||||
return 1;
|
||||
}
|
||||
else if (c >= 0xc2)
|
||||
{
|
||||
if (c < 0xe0)
|
||||
{
|
||||
if (n >= 2)
|
||||
{
|
||||
if ((s[1] ^ 0x80) < 0x40)
|
||||
{
|
||||
*puc = ((unsigned int) (c & 0x1f) << 6)
|
||||
| (unsigned int) (s[1] ^ 0x80);
|
||||
return 2;
|
||||
}
|
||||
/* invalid multibyte character */
|
||||
}
|
||||
else
|
||||
{
|
||||
/* incomplete multibyte character */
|
||||
*puc = 0xfffd;
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
else if (c < 0xf0)
|
||||
{
|
||||
if (n >= 3)
|
||||
{
|
||||
if ((s[1] ^ 0x80) < 0x40)
|
||||
{
|
||||
if ((s[2] ^ 0x80) < 0x40)
|
||||
{
|
||||
if ((c >= 0xe1 || s[1] >= 0xa0)
|
||||
&& (c != 0xed || s[1] < 0xa0))
|
||||
{
|
||||
*puc = ((unsigned int) (c & 0x0f) << 12)
|
||||
| ((unsigned int) (s[1] ^ 0x80) << 6)
|
||||
| (unsigned int) (s[2] ^ 0x80);
|
||||
return 3;
|
||||
}
|
||||
/* invalid multibyte character */
|
||||
*puc = 0xfffd;
|
||||
return 3;
|
||||
}
|
||||
/* invalid multibyte character */
|
||||
*puc = 0xfffd;
|
||||
return 2;
|
||||
}
|
||||
/* invalid multibyte character */
|
||||
}
|
||||
else
|
||||
{
|
||||
/* incomplete multibyte character */
|
||||
*puc = 0xfffd;
|
||||
if (n == 1 || (s[1] ^ 0x80) >= 0x40)
|
||||
return 1;
|
||||
else
|
||||
return 2;
|
||||
}
|
||||
}
|
||||
else if (c < 0xf8)
|
||||
{
|
||||
if (n >= 4)
|
||||
{
|
||||
if ((s[1] ^ 0x80) < 0x40)
|
||||
{
|
||||
if ((s[2] ^ 0x80) < 0x40)
|
||||
{
|
||||
if ((s[3] ^ 0x80) < 0x40)
|
||||
{
|
||||
if ((c >= 0xf1 || s[1] >= 0x90)
|
||||
#if 1
|
||||
&& (c < 0xf4 || (c == 0xf4 && s[1] < 0x90))
|
||||
#endif
|
||||
)
|
||||
{
|
||||
*puc = ((unsigned int) (c & 0x07) << 18)
|
||||
| ((unsigned int) (s[1] ^ 0x80) << 12)
|
||||
| ((unsigned int) (s[2] ^ 0x80) << 6)
|
||||
| (unsigned int) (s[3] ^ 0x80);
|
||||
return 4;
|
||||
}
|
||||
/* invalid multibyte character */
|
||||
*puc = 0xfffd;
|
||||
return 4;
|
||||
}
|
||||
/* invalid multibyte character */
|
||||
*puc = 0xfffd;
|
||||
return 3;
|
||||
}
|
||||
/* invalid multibyte character */
|
||||
*puc = 0xfffd;
|
||||
return 2;
|
||||
}
|
||||
/* invalid multibyte character */
|
||||
}
|
||||
else
|
||||
{
|
||||
/* incomplete multibyte character */
|
||||
*puc = 0xfffd;
|
||||
if (n == 1 || (s[1] ^ 0x80) >= 0x40)
|
||||
return 1;
|
||||
else if (n == 2 || (s[2] ^ 0x80) >= 0x40)
|
||||
return 2;
|
||||
else
|
||||
return 3;
|
||||
}
|
||||
}
|
||||
#if 0
|
||||
else if (c < 0xfc)
|
||||
{
|
||||
if (n >= 5)
|
||||
{
|
||||
if ((s[1] ^ 0x80) < 0x40)
|
||||
{
|
||||
if ((s[2] ^ 0x80) < 0x40)
|
||||
{
|
||||
if ((s[3] ^ 0x80) < 0x40)
|
||||
{
|
||||
if ((s[4] ^ 0x80) < 0x40)
|
||||
{
|
||||
if (c >= 0xf9 || s[1] >= 0x88)
|
||||
{
|
||||
*puc = ((unsigned int) (c & 0x03) << 24)
|
||||
| ((unsigned int) (s[1] ^ 0x80) << 18)
|
||||
| ((unsigned int) (s[2] ^ 0x80) << 12)
|
||||
| ((unsigned int) (s[3] ^ 0x80) << 6)
|
||||
| (unsigned int) (s[4] ^ 0x80);
|
||||
return 5;
|
||||
}
|
||||
/* invalid multibyte character */
|
||||
*puc = 0xfffd;
|
||||
return 5;
|
||||
}
|
||||
/* invalid multibyte character */
|
||||
*puc = 0xfffd;
|
||||
return 4;
|
||||
}
|
||||
/* invalid multibyte character */
|
||||
*puc = 0xfffd;
|
||||
return 3;
|
||||
}
|
||||
/* invalid multibyte character */
|
||||
return 2;
|
||||
}
|
||||
/* invalid multibyte character */
|
||||
}
|
||||
else
|
||||
{
|
||||
/* incomplete multibyte character */
|
||||
*puc = 0xfffd;
|
||||
return n;
|
||||
}
|
||||
}
|
||||
else if (c < 0xfe)
|
||||
{
|
||||
if (n >= 6)
|
||||
{
|
||||
if ((s[1] ^ 0x80) < 0x40)
|
||||
{
|
||||
if ((s[2] ^ 0x80) < 0x40)
|
||||
{
|
||||
if ((s[3] ^ 0x80) < 0x40)
|
||||
{
|
||||
if ((s[4] ^ 0x80) < 0x40)
|
||||
{
|
||||
if ((s[5] ^ 0x80) < 0x40)
|
||||
{
|
||||
if (c >= 0xfd || s[1] >= 0x84)
|
||||
{
|
||||
*puc = ((unsigned int) (c & 0x01) << 30)
|
||||
| ((unsigned int) (s[1] ^ 0x80) << 24)
|
||||
| ((unsigned int) (s[2] ^ 0x80) << 18)
|
||||
| ((unsigned int) (s[3] ^ 0x80) << 12)
|
||||
| ((unsigned int) (s[4] ^ 0x80) << 6)
|
||||
| (unsigned int) (s[5] ^ 0x80);
|
||||
return 6;
|
||||
}
|
||||
/* invalid multibyte character */
|
||||
*puc = 0xfffd;
|
||||
return 6;
|
||||
}
|
||||
/* invalid multibyte character */
|
||||
*puc = 0xfffd;
|
||||
return 5;
|
||||
}
|
||||
/* invalid multibyte character */
|
||||
*puc = 0xfffd;
|
||||
return 4;
|
||||
}
|
||||
/* invalid multibyte character */
|
||||
*puc = 0xfffd;
|
||||
return 3;
|
||||
}
|
||||
/* invalid multibyte character */
|
||||
return 2;
|
||||
}
|
||||
/* invalid multibyte character */
|
||||
}
|
||||
else
|
||||
{
|
||||
/* incomplete multibyte character */
|
||||
*puc = 0xfffd;
|
||||
return n;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
}
|
||||
/* invalid multibyte character */
|
||||
*puc = 0xfffd;
|
||||
return 1;
|
||||
}
|
||||
|
||||
#endif
|
|
@ -1,285 +0,0 @@
|
|||
/* Look at first character in UTF-8 string, returning an error code.
|
||||
Copyright (C) 1999-2002, 2006-2007, 2009-2016 Free Software Foundation, Inc.
|
||||
Written by Bruno Haible <bruno@clisp.org>, 2001.
|
||||
|
||||
This program 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 3 of the License, 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
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
||||
|
||||
#include <config.h>
|
||||
|
||||
/* Specification. */
|
||||
#include "unistr.h"
|
||||
|
||||
int
|
||||
u8_mbtoucr (ucs4_t *puc, const uint8_t *s, size_t n)
|
||||
{
|
||||
uint8_t c = *s;
|
||||
|
||||
if (c < 0x80)
|
||||
{
|
||||
*puc = c;
|
||||
return 1;
|
||||
}
|
||||
else if (c >= 0xc2)
|
||||
{
|
||||
if (c < 0xe0)
|
||||
{
|
||||
if (n >= 2)
|
||||
{
|
||||
if ((s[1] ^ 0x80) < 0x40)
|
||||
{
|
||||
*puc = ((unsigned int) (c & 0x1f) << 6)
|
||||
| (unsigned int) (s[1] ^ 0x80);
|
||||
return 2;
|
||||
}
|
||||
/* invalid multibyte character */
|
||||
}
|
||||
else
|
||||
{
|
||||
/* incomplete multibyte character */
|
||||
*puc = 0xfffd;
|
||||
return -2;
|
||||
}
|
||||
}
|
||||
else if (c < 0xf0)
|
||||
{
|
||||
if (n >= 2)
|
||||
{
|
||||
if ((s[1] ^ 0x80) < 0x40
|
||||
&& (c >= 0xe1 || s[1] >= 0xa0)
|
||||
&& (c != 0xed || s[1] < 0xa0))
|
||||
{
|
||||
if (n >= 3)
|
||||
{
|
||||
if ((s[2] ^ 0x80) < 0x40)
|
||||
{
|
||||
*puc = ((unsigned int) (c & 0x0f) << 12)
|
||||
| ((unsigned int) (s[1] ^ 0x80) << 6)
|
||||
| (unsigned int) (s[2] ^ 0x80);
|
||||
return 3;
|
||||
}
|
||||
/* invalid multibyte character */
|
||||
}
|
||||
else
|
||||
{
|
||||
/* incomplete multibyte character */
|
||||
*puc = 0xfffd;
|
||||
return -2;
|
||||
}
|
||||
}
|
||||
/* invalid multibyte character */
|
||||
}
|
||||
else
|
||||
{
|
||||
/* incomplete multibyte character */
|
||||
*puc = 0xfffd;
|
||||
return -2;
|
||||
}
|
||||
}
|
||||
else if (c < 0xf8)
|
||||
{
|
||||
if (n >= 2)
|
||||
{
|
||||
if ((s[1] ^ 0x80) < 0x40
|
||||
&& (c >= 0xf1 || s[1] >= 0x90)
|
||||
#if 1
|
||||
&& (c < 0xf4 || (c == 0xf4 && s[1] < 0x90))
|
||||
#endif
|
||||
)
|
||||
{
|
||||
if (n >= 3)
|
||||
{
|
||||
if ((s[2] ^ 0x80) < 0x40)
|
||||
{
|
||||
if (n >= 4)
|
||||
{
|
||||
if ((s[3] ^ 0x80) < 0x40)
|
||||
{
|
||||
*puc = ((unsigned int) (c & 0x07) << 18)
|
||||
| ((unsigned int) (s[1] ^ 0x80) << 12)
|
||||
| ((unsigned int) (s[2] ^ 0x80) << 6)
|
||||
| (unsigned int) (s[3] ^ 0x80);
|
||||
return 4;
|
||||
}
|
||||
/* invalid multibyte character */
|
||||
}
|
||||
else
|
||||
{
|
||||
/* incomplete multibyte character */
|
||||
*puc = 0xfffd;
|
||||
return -2;
|
||||
}
|
||||
}
|
||||
/* invalid multibyte character */
|
||||
}
|
||||
else
|
||||
{
|
||||
/* incomplete multibyte character */
|
||||
*puc = 0xfffd;
|
||||
return -2;
|
||||
}
|
||||
}
|
||||
/* invalid multibyte character */
|
||||
}
|
||||
else
|
||||
{
|
||||
/* incomplete multibyte character */
|
||||
*puc = 0xfffd;
|
||||
return -2;
|
||||
}
|
||||
}
|
||||
#if 0
|
||||
else if (c < 0xfc)
|
||||
{
|
||||
if (n >= 2)
|
||||
{
|
||||
if ((s[1] ^ 0x80) < 0x40
|
||||
&& (c >= 0xf9 || s[1] >= 0x88))
|
||||
{
|
||||
if (n >= 3)
|
||||
{
|
||||
if ((s[2] ^ 0x80) < 0x40)
|
||||
{
|
||||
if (n >= 4)
|
||||
{
|
||||
if ((s[3] ^ 0x80) < 0x40)
|
||||
{
|
||||
if (n >= 5)
|
||||
{
|
||||
if ((s[4] ^ 0x80) < 0x40)
|
||||
{
|
||||
*puc = ((unsigned int) (c & 0x03) << 24)
|
||||
| ((unsigned int) (s[1] ^ 0x80) << 18)
|
||||
| ((unsigned int) (s[2] ^ 0x80) << 12)
|
||||
| ((unsigned int) (s[3] ^ 0x80) << 6)
|
||||
| (unsigned int) (s[4] ^ 0x80);
|
||||
return 5;
|
||||
}
|
||||
/* invalid multibyte character */
|
||||
}
|
||||
else
|
||||
{
|
||||
/* incomplete multibyte character */
|
||||
*puc = 0xfffd;
|
||||
return -2;
|
||||
}
|
||||
}
|
||||
/* invalid multibyte character */
|
||||
}
|
||||
else
|
||||
{
|
||||
/* incomplete multibyte character */
|
||||
*puc = 0xfffd;
|
||||
return -2;
|
||||
}
|
||||
}
|
||||
/* invalid multibyte character */
|
||||
}
|
||||
else
|
||||
{
|
||||
/* incomplete multibyte character */
|
||||
*puc = 0xfffd;
|
||||
return -2;
|
||||
}
|
||||
}
|
||||
/* invalid multibyte character */
|
||||
}
|
||||
else
|
||||
{
|
||||
/* incomplete multibyte character */
|
||||
*puc = 0xfffd;
|
||||
return -2;
|
||||
}
|
||||
}
|
||||
else if (c < 0xfe)
|
||||
{
|
||||
if (n >= 2)
|
||||
{
|
||||
if ((s[1] ^ 0x80) < 0x40
|
||||
&& (c >= 0xfd || s[1] >= 0x84))
|
||||
{
|
||||
if (n >= 3)
|
||||
{
|
||||
if ((s[2] ^ 0x80) < 0x40)
|
||||
{
|
||||
if (n >= 4)
|
||||
{
|
||||
if ((s[3] ^ 0x80) < 0x40)
|
||||
{
|
||||
if (n >= 5)
|
||||
{
|
||||
if ((s[4] ^ 0x80) < 0x40)
|
||||
{
|
||||
if (n >= 6)
|
||||
{
|
||||
if ((s[5] ^ 0x80) < 0x40)
|
||||
{
|
||||
*puc = ((unsigned int) (c & 0x01) << 30)
|
||||
| ((unsigned int) (s[1] ^ 0x80) << 24)
|
||||
| ((unsigned int) (s[2] ^ 0x80) << 18)
|
||||
| ((unsigned int) (s[3] ^ 0x80) << 12)
|
||||
| ((unsigned int) (s[4] ^ 0x80) << 6)
|
||||
| (unsigned int) (s[5] ^ 0x80);
|
||||
return 6;
|
||||
}
|
||||
/* invalid multibyte character */
|
||||
}
|
||||
else
|
||||
{
|
||||
/* incomplete multibyte character */
|
||||
*puc = 0xfffd;
|
||||
return -2;
|
||||
}
|
||||
}
|
||||
/* invalid multibyte character */
|
||||
}
|
||||
else
|
||||
{
|
||||
/* incomplete multibyte character */
|
||||
*puc = 0xfffd;
|
||||
return -2;
|
||||
}
|
||||
}
|
||||
/* invalid multibyte character */
|
||||
}
|
||||
else
|
||||
{
|
||||
/* incomplete multibyte character */
|
||||
*puc = 0xfffd;
|
||||
return -2;
|
||||
}
|
||||
}
|
||||
/* invalid multibyte character */
|
||||
}
|
||||
else
|
||||
{
|
||||
/* incomplete multibyte character */
|
||||
*puc = 0xfffd;
|
||||
return -2;
|
||||
}
|
||||
}
|
||||
/* invalid multibyte character */
|
||||
}
|
||||
else
|
||||
{
|
||||
/* incomplete multibyte character */
|
||||
*puc = 0xfffd;
|
||||
return -2;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
}
|
||||
/* invalid multibyte character */
|
||||
*puc = 0xfffd;
|
||||
return -1;
|
||||
}
|
|
@ -1,93 +0,0 @@
|
|||
/* Iterate over previous character in UTF-8 string.
|
||||
Copyright (C) 2002, 2006-2007, 2009-2016 Free Software Foundation, Inc.
|
||||
Written by Bruno Haible <bruno@clisp.org>, 2002.
|
||||
|
||||
This program 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 3 of the License, 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
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
||||
|
||||
#include <config.h>
|
||||
|
||||
/* Specification. */
|
||||
#include "unistr.h"
|
||||
|
||||
const uint8_t *
|
||||
u8_prev (ucs4_t *puc, const uint8_t *s, const uint8_t *start)
|
||||
{
|
||||
/* Keep in sync with unistr.h and u8-mbtouc-aux.c. */
|
||||
if (s != start)
|
||||
{
|
||||
uint8_t c_1 = s[-1];
|
||||
|
||||
if (c_1 < 0x80)
|
||||
{
|
||||
*puc = c_1;
|
||||
return s - 1;
|
||||
}
|
||||
#if CONFIG_UNICODE_SAFETY
|
||||
if ((c_1 ^ 0x80) < 0x40)
|
||||
#endif
|
||||
if (s - 1 != start)
|
||||
{
|
||||
uint8_t c_2 = s[-2];
|
||||
|
||||
if (c_2 >= 0xc2 && c_2 < 0xe0)
|
||||
{
|
||||
*puc = ((unsigned int) (c_2 & 0x1f) << 6)
|
||||
| (unsigned int) (c_1 ^ 0x80);
|
||||
return s - 2;
|
||||
}
|
||||
#if CONFIG_UNICODE_SAFETY
|
||||
if ((c_2 ^ 0x80) < 0x40)
|
||||
#endif
|
||||
if (s - 2 != start)
|
||||
{
|
||||
uint8_t c_3 = s[-3];
|
||||
|
||||
if (c_3 >= 0xe0 && c_3 < 0xf0
|
||||
#if CONFIG_UNICODE_SAFETY
|
||||
&& (c_3 >= 0xe1 || c_2 >= 0xa0)
|
||||
&& (c_3 != 0xed || c_2 < 0xa0)
|
||||
#endif
|
||||
)
|
||||
{
|
||||
*puc = ((unsigned int) (c_3 & 0x0f) << 12)
|
||||
| ((unsigned int) (c_2 ^ 0x80) << 6)
|
||||
| (unsigned int) (c_1 ^ 0x80);
|
||||
return s - 3;
|
||||
}
|
||||
#if CONFIG_UNICODE_SAFETY
|
||||
if ((c_3 ^ 0x80) < 0x40)
|
||||
#endif
|
||||
if (s - 3 != start)
|
||||
{
|
||||
uint8_t c_4 = s[-4];
|
||||
|
||||
if (c_4 >= 0xf0 && c_4 < 0xf8
|
||||
#if CONFIG_UNICODE_SAFETY
|
||||
&& (c_4 >= 0xf1 || c_3 >= 0x90)
|
||||
&& (c_4 < 0xf4 || (c_4 == 0xf4 && c_3 < 0x90))
|
||||
#endif
|
||||
)
|
||||
{
|
||||
*puc = ((unsigned int) (c_4 & 0x07) << 18)
|
||||
| ((unsigned int) (c_3 ^ 0x80) << 12)
|
||||
| ((unsigned int) (c_2 ^ 0x80) << 6)
|
||||
| (unsigned int) (c_1 ^ 0x80);
|
||||
return s - 4;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return NULL;
|
||||
}
|
|
@ -1,69 +0,0 @@
|
|||
/* Conversion UCS-4 to UTF-8.
|
||||
Copyright (C) 2002, 2006-2007, 2009-2016 Free Software Foundation, Inc.
|
||||
Written by Bruno Haible <bruno@clisp.org>, 2002.
|
||||
|
||||
This program 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 3 of the License, 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
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
||||
|
||||
#include <config.h>
|
||||
|
||||
/* Specification. */
|
||||
#include "unistr.h"
|
||||
|
||||
int
|
||||
u8_uctomb_aux (uint8_t *s, ucs4_t uc, int n)
|
||||
{
|
||||
int count;
|
||||
|
||||
if (uc < 0x80)
|
||||
/* The case n >= 1 is already handled by the caller. */
|
||||
return -2;
|
||||
else 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)
|
||||
return -2;
|
||||
|
||||
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;
|
||||
}
|
|
@ -1,88 +0,0 @@
|
|||
/* Store a character in UTF-8 string.
|
||||
Copyright (C) 2002, 2005-2006, 2009-2016 Free Software Foundation, Inc.
|
||||
Written by Bruno Haible <bruno@clisp.org>, 2002.
|
||||
|
||||
This program 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 3 of the License, 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
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
||||
|
||||
#include <config.h>
|
||||
|
||||
#if defined IN_LIBUNISTRING
|
||||
/* Tell unistr.h to declare u8_uctomb as 'extern', not 'static inline'. */
|
||||
# include "unistring-notinline.h"
|
||||
#endif
|
||||
|
||||
/* 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
|
|
@ -1,46 +0,0 @@
|
|||
/* Elementary types and macros for the GNU UniString library.
|
||||
Copyright (C) 2002, 2005-2006, 2009-2016 Free Software Foundation, Inc.
|
||||
|
||||
This program 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 3 of the License, 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
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
||||
|
||||
#ifndef _UNITYPES_H
|
||||
#define _UNITYPES_H
|
||||
|
||||
/* Get uint8_t, uint16_t, uint32_t. */
|
||||
#include <stdint.h>
|
||||
|
||||
/* Type representing a Unicode character. */
|
||||
typedef uint32_t ucs4_t;
|
||||
|
||||
/* Attribute of a function whose result depends only on the arguments
|
||||
(not pointers!) and which has no side effects. */
|
||||
#ifndef _UC_ATTRIBUTE_CONST
|
||||
# if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 95)
|
||||
# define _UC_ATTRIBUTE_CONST __attribute__ ((__const__))
|
||||
# else
|
||||
# define _UC_ATTRIBUTE_CONST
|
||||
# endif
|
||||
#endif
|
||||
|
||||
/* Attribute of a function whose result depends only on the arguments
|
||||
(possibly pointers) and global memory, and which has no side effects. */
|
||||
#ifndef _UC_ATTRIBUTE_PURE
|
||||
# if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 96)
|
||||
# define _UC_ATTRIBUTE_PURE __attribute__ ((__pure__))
|
||||
# else
|
||||
# define _UC_ATTRIBUTE_PURE
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#endif /* _UNITYPES_H */
|
|
@ -27,7 +27,7 @@
|
|||
|
||||
|
||||
# Specification in the form of a command-line invocation:
|
||||
# gnulib-tool --import --local-dir=gnulib-local --lib=libgnu --source-base=lib --m4-base=m4 --doc-base=doc --tests-base=tests --aux-dir=build-aux --avoid=lock --lgpl=3 --conditional-dependencies --libtool --macro-prefix=gl --no-vc-files accept alignof alloca-opt announce-gen autobuild bind byteswap c-strcase canonicalize-lgpl ceil clock-time close connect copysign dirfd duplocale environ extensions flock floor fpieee frexp fstat fsync full-read full-write func gendocs getaddrinfo getlogin getpeername getsockname getsockopt git-version-gen gitlog-to-changelog gnu-web-doc-update gnupload havelib iconv_open-utf inet_ntop inet_pton isfinite isinf isnan ldexp lib-symbol-versions lib-symbol-visibility libunistring link listen localcharset locale log1p lstat maintainer-makefile malloc-gnu malloca mkdir mkstemp nl_langinfo nproc open pipe-posix pipe2 poll putenv readlink recv recvfrom regex rename rmdir select send sendto setenv setsockopt shutdown socket stat-time stdlib strftime striconveh string sys_stat time times trunc unistd verify vsnprintf warnings wchar
|
||||
# gnulib-tool --import --local-dir=gnulib-local --lib=libgnu --source-base=lib --m4-base=m4 --doc-base=doc --tests-base=tests --aux-dir=build-aux --avoid=lock --avoid=unistr/base --avoid=unistr/u8-mbtouc --avoid=unistr/u8-mbtouc-unsafe --avoid=unistr/u8-mbtoucr --avoid=unistr/u8-prev --avoid=unistr/u8-uctomb --avoid=unitypes --lgpl=3 --conditional-dependencies --libtool --macro-prefix=gl --no-vc-files accept alignof alloca-opt announce-gen autobuild bind byteswap c-strcase canonicalize-lgpl ceil clock-time close connect copysign dirfd duplocale environ extensions flock floor fpieee frexp fstat fsync full-read full-write func gendocs getaddrinfo getlogin getpeername getsockname getsockopt git-version-gen gitlog-to-changelog gnu-web-doc-update gnupload havelib iconv_open-utf inet_ntop inet_pton isfinite isinf isnan ldexp lib-symbol-versions lib-symbol-visibility libunistring link listen localcharset locale log1p lstat maintainer-makefile malloc-gnu malloca mkdir mkstemp nl_langinfo nproc open pipe-posix pipe2 poll putenv readlink recv recvfrom regex rename rmdir select send sendto setenv setsockopt shutdown socket stat-time stdlib strftime striconveh string sys_stat time times trunc unistd verify vsnprintf warnings wchar
|
||||
|
||||
# Specification in the form of a few gnulib-tool.m4 macro invocations:
|
||||
gl_LOCAL_DIR([gnulib-local])
|
||||
|
@ -126,7 +126,7 @@ gl_MODULES([
|
|||
warnings
|
||||
wchar
|
||||
])
|
||||
gl_AVOID([ lock])
|
||||
gl_AVOID([ lock unistr/base unistr/u8-mbtouc unistr/u8-mbtouc-unsafe unistr/u8-mbtoucr unistr/u8-prev unistr/u8-uctomb unitypes])
|
||||
gl_SOURCE_BASE([lib])
|
||||
gl_M4_BASE([m4])
|
||||
gl_PO_BASE([])
|
||||
|
|
|
@ -42,7 +42,6 @@ AC_DEFUN([gl_EARLY],
|
|||
AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
|
||||
AC_REQUIRE([gl_PROG_AR_RANLIB])
|
||||
|
||||
AC_REQUIRE([AM_PROG_CC_C_O])
|
||||
# Code from module absolute-header:
|
||||
# Code from module accept:
|
||||
# Code from module alignof:
|
||||
|
@ -117,7 +116,6 @@ AC_DEFUN([gl_EARLY],
|
|||
# Code from module include_next:
|
||||
# Code from module inet_ntop:
|
||||
# Code from module inet_pton:
|
||||
# Code from module inline:
|
||||
# Code from module intprops:
|
||||
# Code from module isfinite:
|
||||
# Code from module isinf:
|
||||
|
@ -197,7 +195,6 @@ AC_DEFUN([gl_EARLY],
|
|||
# Code from module snippet/_Noreturn:
|
||||
# Code from module snippet/arg-nonnull:
|
||||
# Code from module snippet/c++defs:
|
||||
# Code from module snippet/unused-parameter:
|
||||
# Code from module snippet/warn-on-use:
|
||||
# Code from module snprintf:
|
||||
# Code from module socket:
|
||||
|
@ -234,13 +231,6 @@ AC_DEFUN([gl_EARLY],
|
|||
# Code from module times:
|
||||
# Code from module trunc:
|
||||
# Code from module unistd:
|
||||
# Code from module unistr/base:
|
||||
# Code from module unistr/u8-mbtouc:
|
||||
# Code from module unistr/u8-mbtouc-unsafe:
|
||||
# Code from module unistr/u8-mbtoucr:
|
||||
# Code from module unistr/u8-prev:
|
||||
# Code from module unistr/u8-uctomb:
|
||||
# Code from module unitypes:
|
||||
# Code from module unsetenv:
|
||||
# Code from module useless-if-before-free:
|
||||
# Code from module vasnprintf:
|
||||
|
@ -436,7 +426,6 @@ AC_DEFUN([gl_INIT],
|
|||
gl_PREREQ_INET_PTON
|
||||
fi
|
||||
gl_ARPA_INET_MODULE_INDICATOR([inet_pton])
|
||||
gl_INLINE
|
||||
gl_ISFINITE
|
||||
if test $REPLACE_ISFINITE = 1; then
|
||||
AC_LIBOBJ([isfinite])
|
||||
|
@ -702,17 +691,6 @@ AC_DEFUN([gl_INIT],
|
|||
fi
|
||||
gl_MATH_MODULE_INDICATOR([trunc])
|
||||
gl_UNISTD_H
|
||||
gl_LIBUNISTRING_LIBHEADER([0.9.4], [unistr.h])
|
||||
gl_MODULE_INDICATOR([unistr/u8-mbtouc])
|
||||
gl_LIBUNISTRING_MODULE([0.9.4], [unistr/u8-mbtouc])
|
||||
gl_MODULE_INDICATOR([unistr/u8-mbtouc-unsafe])
|
||||
gl_LIBUNISTRING_MODULE([0.9.4], [unistr/u8-mbtouc-unsafe])
|
||||
gl_MODULE_INDICATOR([unistr/u8-mbtoucr])
|
||||
gl_LIBUNISTRING_MODULE([0.9], [unistr/u8-mbtoucr])
|
||||
gl_LIBUNISTRING_MODULE([0.9], [unistr/u8-prev])
|
||||
gl_MODULE_INDICATOR([unistr/u8-uctomb])
|
||||
gl_LIBUNISTRING_MODULE([0.9], [unistr/u8-uctomb])
|
||||
gl_LIBUNISTRING_LIBHEADER([0.9.4], [unitypes.h])
|
||||
gl_FUNC_VSNPRINTF
|
||||
gl_STDIO_MODULE_INDICATOR([vsnprintf])
|
||||
gl_WCHAR_H
|
||||
|
@ -1698,7 +1676,6 @@ AC_DEFUN([gl_FILE_LIST], [
|
|||
build-aux/snippet/_Noreturn.h
|
||||
build-aux/snippet/arg-nonnull.h
|
||||
build-aux/snippet/c++defs.h
|
||||
build-aux/snippet/unused-parameter.h
|
||||
build-aux/snippet/warn-on-use.h
|
||||
build-aux/useless-if-before-free
|
||||
build-aux/vc-list-files
|
||||
|
@ -1906,16 +1883,6 @@ AC_DEFUN([gl_FILE_LIST], [
|
|||
lib/trunc.c
|
||||
lib/unistd.c
|
||||
lib/unistd.in.h
|
||||
lib/unistr.in.h
|
||||
lib/unistr/u8-mbtouc-aux.c
|
||||
lib/unistr/u8-mbtouc-unsafe-aux.c
|
||||
lib/unistr/u8-mbtouc-unsafe.c
|
||||
lib/unistr/u8-mbtouc.c
|
||||
lib/unistr/u8-mbtoucr.c
|
||||
lib/unistr/u8-prev.c
|
||||
lib/unistr/u8-uctomb-aux.c
|
||||
lib/unistr/u8-uctomb.c
|
||||
lib/unitypes.in.h
|
||||
lib/unsetenv.c
|
||||
lib/vasnprintf.c
|
||||
lib/vasnprintf.h
|
||||
|
@ -1983,7 +1950,6 @@ AC_DEFUN([gl_FILE_LIST], [
|
|||
m4/include_next.m4
|
||||
m4/inet_ntop.m4
|
||||
m4/inet_pton.m4
|
||||
m4/inline.m4
|
||||
m4/intmax_t.m4
|
||||
m4/inttypes_h.m4
|
||||
m4/isfinite.m4
|
||||
|
@ -1999,7 +1965,6 @@ AC_DEFUN([gl_FILE_LIST], [
|
|||
m4/lib-ld.m4
|
||||
m4/lib-link.m4
|
||||
m4/lib-prefix.m4
|
||||
m4/libunistring-base.m4
|
||||
m4/libunistring.m4
|
||||
m4/link.m4
|
||||
m4/localcharset.m4
|
||||
|
|
40
m4/inline.m4
40
m4/inline.m4
|
@ -1,40 +0,0 @@
|
|||
# inline.m4 serial 4
|
||||
dnl Copyright (C) 2006, 2009-2016 Free Software Foundation, Inc.
|
||||
dnl This file is free software; the Free Software Foundation
|
||||
dnl gives unlimited permission to copy and/or distribute it,
|
||||
dnl with or without modifications, as long as this notice is preserved.
|
||||
|
||||
dnl Test for the 'inline' keyword or equivalent.
|
||||
dnl Define 'inline' to a supported equivalent, or to nothing if not supported,
|
||||
dnl like AC_C_INLINE does. Also, define HAVE_INLINE if 'inline' or an
|
||||
dnl equivalent is effectively supported, i.e. if the compiler is likely to
|
||||
dnl drop unused 'static inline' functions.
|
||||
AC_DEFUN([gl_INLINE],
|
||||
[
|
||||
AC_REQUIRE([AC_C_INLINE])
|
||||
AC_CACHE_CHECK([whether the compiler generally respects inline],
|
||||
[gl_cv_c_inline_effective],
|
||||
[if test $ac_cv_c_inline = no; then
|
||||
gl_cv_c_inline_effective=no
|
||||
else
|
||||
dnl GCC defines __NO_INLINE__ if not optimizing or if -fno-inline is
|
||||
dnl specified.
|
||||
dnl Use AC_COMPILE_IFELSE here, not AC_EGREP_CPP, because the result
|
||||
dnl depends on optimization flags, which can be in CFLAGS.
|
||||
dnl (AC_EGREP_CPP looks only at the CPPFLAGS.)
|
||||
AC_COMPILE_IFELSE(
|
||||
[AC_LANG_PROGRAM([[]],
|
||||
[[#ifdef __NO_INLINE__
|
||||
#error "inline is not effective"
|
||||
#endif]])],
|
||||
[gl_cv_c_inline_effective=yes],
|
||||
[gl_cv_c_inline_effective=no])
|
||||
fi
|
||||
])
|
||||
if test $gl_cv_c_inline_effective = yes; then
|
||||
AC_DEFINE([HAVE_INLINE], [1],
|
||||
[Define to 1 if the compiler supports one of the keywords
|
||||
'inline', '__inline__', '__inline' and effectively inlines
|
||||
functions marked as such.])
|
||||
fi
|
||||
])
|
|
@ -1,141 +0,0 @@
|
|||
# libunistring-base.m4 serial 5
|
||||
dnl Copyright (C) 2010-2016 Free Software Foundation, Inc.
|
||||
dnl This file is free software; the Free Software Foundation
|
||||
dnl gives unlimited permission to copy and/or distribute it,
|
||||
dnl with or without modifications, as long as this notice is preserved.
|
||||
|
||||
dnl From Paolo Bonzini and Bruno Haible.
|
||||
|
||||
dnl gl_LIBUNISTRING_MODULE([VERSION], [Module])
|
||||
dnl Declares that the source files of Module should be compiled, unless we
|
||||
dnl are linking with libunistring and its version is >= the given VERSION.
|
||||
dnl Defines an automake conditional LIBUNISTRING_COMPILE_$MODULE that is
|
||||
dnl true if the source files of Module should be compiled.
|
||||
dnl This macro is to be used for public libunistring API, not for
|
||||
dnl undocumented API.
|
||||
dnl
|
||||
dnl You have to bump the VERSION argument to the next projected version
|
||||
dnl number each time you make a change that affects the behaviour of the
|
||||
dnl functions defined in Module (even if the sources of Module itself do not
|
||||
dnl change).
|
||||
|
||||
AC_DEFUN([gl_LIBUNISTRING_MODULE],
|
||||
[
|
||||
AC_REQUIRE([gl_LIBUNISTRING_LIB_PREPARE])
|
||||
dnl Use the variables HAVE_LIBUNISTRING, LIBUNISTRING_VERSION from
|
||||
dnl gl_LIBUNISTRING_CORE if that macro has been run.
|
||||
AM_CONDITIONAL(AS_TR_CPP([LIBUNISTRING_COMPILE_$2]),
|
||||
[gl_LIBUNISTRING_VERSION_CMP([$1])])
|
||||
])
|
||||
|
||||
dnl gl_LIBUNISTRING_LIBHEADER([VERSION], [HeaderFile])
|
||||
dnl Declares that HeaderFile should be created, unless we are linking
|
||||
dnl with libunistring and its version is >= the given VERSION.
|
||||
dnl HeaderFile should be relative to the lib directory and end in '.h'.
|
||||
dnl Prepares for substituting LIBUNISTRING_HEADERFILE (to HeaderFile or empty).
|
||||
dnl
|
||||
dnl When we are linking with the already installed libunistring and its version
|
||||
dnl is < VERSION, we create HeaderFile here, because we may compile functions
|
||||
dnl (via gl_LIBUNISTRING_MODULE above) that are not contained in the installed
|
||||
dnl version.
|
||||
dnl When we are linking with the already installed libunistring and its version
|
||||
dnl is > VERSION, we don't create HeaderFile here: it could cause compilation
|
||||
dnl errors in other libunistring header files if some types are missing.
|
||||
dnl
|
||||
dnl You have to bump the VERSION argument to the next projected version
|
||||
dnl number each time you make a non-comment change to the HeaderFile.
|
||||
|
||||
AC_DEFUN([gl_LIBUNISTRING_LIBHEADER],
|
||||
[
|
||||
AC_REQUIRE([gl_LIBUNISTRING_LIB_PREPARE])
|
||||
dnl Use the variables HAVE_LIBUNISTRING, LIBUNISTRING_VERSION from
|
||||
dnl gl_LIBUNISTRING_CORE if that macro has been run.
|
||||
if gl_LIBUNISTRING_VERSION_CMP([$1]); then
|
||||
LIBUNISTRING_[]AS_TR_CPP([$2])='$2'
|
||||
else
|
||||
LIBUNISTRING_[]AS_TR_CPP([$2])=
|
||||
fi
|
||||
AC_SUBST([LIBUNISTRING_]AS_TR_CPP([$2]))
|
||||
])
|
||||
|
||||
dnl Miscellaneous preparations/initializations.
|
||||
|
||||
AC_DEFUN([gl_LIBUNISTRING_LIB_PREPARE],
|
||||
[
|
||||
dnl Ensure that HAVE_LIBUNISTRING is fully determined at this point.
|
||||
m4_ifdef([gl_LIBUNISTRING], [AC_REQUIRE([gl_LIBUNISTRING])])
|
||||
|
||||
AC_REQUIRE([AC_PROG_AWK])
|
||||
|
||||
dnl Sed expressions to extract the parts of a version number.
|
||||
changequote(,)
|
||||
gl_libunistring_sed_extract_major='/^[0-9]/{s/^\([0-9]*\).*/\1/p;q;}
|
||||
i\
|
||||
0
|
||||
q
|
||||
'
|
||||
gl_libunistring_sed_extract_minor='/^[0-9][0-9]*[.][0-9]/{s/^[0-9]*[.]\([0-9]*\).*/\1/p;q;}
|
||||
i\
|
||||
0
|
||||
q
|
||||
'
|
||||
gl_libunistring_sed_extract_subminor='/^[0-9][0-9]*[.][0-9][0-9]*[.][0-9]/{s/^[0-9]*[.][0-9]*[.]\([0-9]*\).*/\1/p;q;}
|
||||
i\
|
||||
0
|
||||
q
|
||||
'
|
||||
changequote([,])
|
||||
|
||||
if test "$HAVE_LIBUNISTRING" = yes; then
|
||||
LIBUNISTRING_VERSION_MAJOR=`echo "$LIBUNISTRING_VERSION" | sed -n -e "$gl_libunistring_sed_extract_major"`
|
||||
LIBUNISTRING_VERSION_MINOR=`echo "$LIBUNISTRING_VERSION" | sed -n -e "$gl_libunistring_sed_extract_minor"`
|
||||
LIBUNISTRING_VERSION_SUBMINOR=`echo "$LIBUNISTRING_VERSION" | sed -n -e "$gl_libunistring_sed_extract_subminor"`
|
||||
fi
|
||||
])
|
||||
|
||||
dnl gl_LIBUNISTRING_VERSION_CMP([VERSION])
|
||||
dnl Expands to a shell statement that evaluates to true if LIBUNISTRING_VERSION
|
||||
dnl is less than the VERSION argument.
|
||||
AC_DEFUN([gl_LIBUNISTRING_VERSION_CMP],
|
||||
[ { test "$HAVE_LIBUNISTRING" != yes \
|
||||
|| {
|
||||
dnl AS_LITERAL_IF exists and works fine since autoconf-2.59 at least.
|
||||
AS_LITERAL_IF([$1],
|
||||
[dnl This is the optimized variant, that assumes the argument is a literal:
|
||||
m4_pushdef([requested_version_major],
|
||||
[gl_LIBUNISTRING_ARG_OR_ZERO(m4_bpatsubst([$1], [^\([0-9]*\).*], [\1]), [])])
|
||||
m4_pushdef([requested_version_minor],
|
||||
[gl_LIBUNISTRING_ARG_OR_ZERO(m4_bpatsubst([$1], [^[0-9]*[.]\([0-9]*\).*], [\1]), [$1])])
|
||||
m4_pushdef([requested_version_subminor],
|
||||
[gl_LIBUNISTRING_ARG_OR_ZERO(m4_bpatsubst([$1], [^[0-9]*[.][0-9]*[.]\([0-9]*\).*], [\1]), [$1])])
|
||||
test $LIBUNISTRING_VERSION_MAJOR -lt requested_version_major \
|
||||
|| { test $LIBUNISTRING_VERSION_MAJOR -eq requested_version_major \
|
||||
&& { test $LIBUNISTRING_VERSION_MINOR -lt requested_version_minor \
|
||||
|| { test $LIBUNISTRING_VERSION_MINOR -eq requested_version_minor \
|
||||
&& test $LIBUNISTRING_VERSION_SUBMINOR -lt requested_version_subminor
|
||||
}
|
||||
}
|
||||
}
|
||||
m4_popdef([requested_version_subminor])
|
||||
m4_popdef([requested_version_minor])
|
||||
m4_popdef([requested_version_major])
|
||||
],
|
||||
[dnl This is the unoptimized variant:
|
||||
requested_version_major=`echo '$1' | sed -n -e "$gl_libunistring_sed_extract_major"`
|
||||
requested_version_minor=`echo '$1' | sed -n -e "$gl_libunistring_sed_extract_minor"`
|
||||
requested_version_subminor=`echo '$1' | sed -n -e "$gl_libunistring_sed_extract_subminor"`
|
||||
test $LIBUNISTRING_VERSION_MAJOR -lt $requested_version_major \
|
||||
|| { test $LIBUNISTRING_VERSION_MAJOR -eq $requested_version_major \
|
||||
&& { test $LIBUNISTRING_VERSION_MINOR -lt $requested_version_minor \
|
||||
|| { test $LIBUNISTRING_VERSION_MINOR -eq $requested_version_minor \
|
||||
&& test $LIBUNISTRING_VERSION_SUBMINOR -lt $requested_version_subminor
|
||||
}
|
||||
}
|
||||
}
|
||||
])
|
||||
}
|
||||
}])
|
||||
|
||||
dnl gl_LIBUNISTRING_ARG_OR_ZERO([ARG], [ORIG]) expands to ARG if it is not the
|
||||
dnl same as ORIG, otherwise to 0.
|
||||
m4_define([gl_LIBUNISTRING_ARG_OR_ZERO], [m4_if([$1], [$2], [0], [$1])])
|
Loading…
Add table
Add a link
Reference in a new issue