1
1
/* - mode: c; c-basic-offset: 2; indent-tabs-mode: nil; -*-
2
2
vim:expandtab:shiftwidth=2:tabstop=2:smarttab:
4
Copyright (c) 1995-2006 International Business Machines Corporation and others
8
Permission is hereby granted, free of charge, to any person obtaining a copy
9
of this software and associated documentation files (the "Software"),
10
to deal in the Software without restriction, including without limitation
11
the rights to use, copy, modify, merge, publish, distribute, and/or sell
12
copies of the Software, and to permit persons
13
to whom the Software is furnished to do so, provided that the above
14
copyright notice(s) and this permission notice appear in all copies
15
of the Software and that both the above copyright notice(s) and this
16
permission notice appear in supporting documentation.
18
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI
20
INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
21
PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. IN NO EVENT SHALL
22
THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM,
23
OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER
24
RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
25
NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE
26
USE OR PERFORMANCE OF THIS SOFTWARE.
28
Except as contained in this notice, the name of a copyright holder shall not be
29
used in advertising or otherwise to promote the sale, use or other dealings in
30
this Software without prior written authorization of the copyright holder.
4
Copyright (C) 2010 Monty Taylor
6
This program is free software; you can redistribute it and/or modify
7
it under the terms of the GNU General Public License as published by
8
the Free Software Foundation; version 2 of the License.
10
This program is distributed in the hope that it will be useful,
11
but WITHOUT ANY WARRANTY; without even the implied warranty of
12
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
GNU General Public License for more details.
15
You should have received a copy of the GNU General Public License
16
along with this program; if not, write to the Free Software
17
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
19
Copyright (c) 1995-2006 International Business Machines Corporation and others
23
Permission is hereby granted, free of charge, to any person obtaining a copy
24
of this software and associated documentation files (the "Software"),
25
to deal in the Software without restriction, including without limitation
26
the rights to use, copy, modify, merge, publish, distribute, and/or sell
27
copies of the Software, and to permit persons
28
to whom the Software is furnished to do so, provided that the above
29
copyright notice(s) and this permission notice appear in all copies
30
of the Software and that both the above copyright notice(s) and this
31
permission notice appear in supporting documentation.
33
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
34
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
35
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS.
36
IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS NOTICE BE
37
LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR
38
ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER
39
IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
40
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
42
Except as contained in this notice, the name of a copyright holder shall not
43
be used in advertising or otherwise to promote the sale, use or other dealings
44
in this Software without prior written authorization of the copyright holder.
33
#ifndef DRIZZLED_INTERNAL_UTF8_H
34
#define DRIZZLED_INTERNAL_UTF8_H
47
#ifndef DRIZZLED_UTF8_UTF8_H
48
#define DRIZZLED_UTF8_UTF8_H
58
* The maximum number of UTF-8 code units (bytes) per Unicode code point (U+0000..U+10ffff).
60
static const int MAX_LENGTH= 4;
37
63
* Does this code unit (byte) encode a code point by itself (US-ASCII 0..0x7f)?
38
64
* @param c 8-bit code unit (byte)
39
65
* @return TRUE or FALSE
42
#define U8_IS_SINGLE(c) (((c)&0x80)==0)
45
* Is this code unit (byte) a UTF-8 lead byte?
46
* @param c 8-bit code unit (byte)
47
* @return TRUE or FALSE
50
#define U8_IS_LEAD(c) ((uint8_t)((c)-0xc0)<0x3e)
53
* Is this code unit (byte) a UTF-8 trail byte?
54
* @param c 8-bit code unit (byte)
55
* @return TRUE or FALSE
58
#define U8_IS_TRAIL(c) (((c)&0xc0)==0x80)
70
return (static_cast<uint8_t>(c) & 0x80) == 0;
61
74
* How many code units (bytes) are used for the UTF-8 encoding
62
75
* of this Unicode code point?
63
76
* @param c 32-bit code point
64
77
* @return 1..4, or 0 if c is a surrogate or not a Unicode code point
67
#define U8_LENGTH(c) \
68
((uint32_t)(c)<=0x7f ? 1 : \
69
((uint32_t)(c)<=0x7ff ? 2 : \
70
((uint32_t)(c)<=0xd7ff ? 3 : \
71
((uint32_t)(c)<=0xdfff || (uint32_t)(c)>0x10ffff ? 0 : \
72
((uint32_t)(c)<=0xffff ? 3 : 4)\
79
* The maximum number of UTF-8 code units (bytes) per Unicode code point (U+0000..U+10ffff).
83
#define U8_MAX_LENGTH 4
85
#endif /* DRIZZLED_INTERNAL_UTF8_H */
79
static inline int codepoint_length(uint32_t c)
81
return (c <= 0x7f ? 1 :
84
(c <= 0xdfff || c>0x10ffff ? 0 :
85
(c <= 0xffff ? 3 : 4)))));
89
* How many bytes are used for the UTF-8 encoding of the codepoint of which
90
* this is the first byte?
91
* @param c 8-bit leading byte
92
* @return 1..4, or 0 if c is a surrogate or not a Unicode code point
95
int sequence_length(T c)
97
return (static_cast<uint8_t>(c) < 0x80 ? 1 :
98
((static_cast<uint8_t>(c) >> 5) == 0x6 ? 2 :
99
((static_cast<uint8_t>(c) >> 4) == 0xe ? 3 :
100
((static_cast<uint8_t>(c) >> 3) == 0x1e ? 4 : 0))));
105
* How many logical characters does the given UTF-8 string occupy? Useful when
106
* needing to calculate char length rather than byte length of a string
107
* @param in_string string to measure
108
* @return length in characters of given string
110
static inline uint32_t char_length(const std::string &in_string)
113
std::string::const_iterator iter= in_string.begin();
114
while (iter < in_string.end())
117
iter += sequence_length(*iter);
123
* How many logical characters does the given UTF-8 string occupy? Useful when
124
* needing to calculate char length rather than byte length of a string
125
* @param in_string string to measure
126
* @return length in characters of given string
128
static inline uint32_t char_length(const char *in_string)
130
const std::string process_string(in_string);
131
return char_length(process_string);
135
} /* namespace utf8 */
136
} /* namespace drizzled */
138
#endif /* DRIZZLED_UTF8_UTF8_H */