2 Copyright 1999-2012 ImageMagick Studio LLC, a non-profit organization
3 dedicated to making software imaging solutions freely available.
5 You may not use this file except in compliance with the License.
6 obtain a copy of the License at
8 http://www.imagemagick.org/script/license.php
10 Unless required by applicable law or agreed to in writing, software
11 distributed under the License is distributed on an "AS IS" BASIS,
12 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 See the License for the specific language governing permissions and
14 limitations under the License.
16 MagickCore private token methods.
18 #ifndef _MAGICKCORE_TOKEN_PRIVATE_H
19 #define _MAGICKCORE_TOKEN_PRIVATE_H
21 #if defined(__cplusplus) || defined(c_plusplus)
29 #define MaxMultibyteCodes 6
31 extern MagickPrivate MagickBooleanType
44 utf_info[MaxMultibyteCodes] =
46 { 0x80, 0x00, 0x000007f, 0x0000000 }, /* 1 byte sequence */
47 { 0xE0, 0xC0, 0x00007ff, 0x0000080 }, /* 2 byte sequence */
48 { 0xF0, 0xE0, 0x000ffff, 0x0000800 }, /* 3 byte sequence */
49 { 0xF8, 0xF0, 0x01fffff, 0x0010000 }, /* 4 byte sequence */
50 { 0xFC, 0xF8, 0x03fffff, 0x0200000 }, /* 5 byte sequence */
51 { 0xFE, 0xFC, 0x7ffffff, 0x4000000 }, /* 6 byte sequence */
54 static inline unsigned char *ConvertLatin1ToUTF8(const unsigned char *content)
59 register const unsigned char
62 register unsigned char
72 for (p=content; *p != '\0'; p++)
73 length+=(*p & 0x80) != 0 ? 2 : 1;
74 utf8=(unsigned char *) NULL;
76 utf8=(unsigned char *) AcquireQuantumMemory(length+1UL,sizeof(*utf8));
77 if (utf8 == (unsigned char *) NULL)
78 return((unsigned char *) NULL);
80 for (p=content; *p != '\0'; p++)
84 *q++=(unsigned char) c;
87 *q++=(unsigned char) (0xc0 | ((c >> 6) & 0x3f));
88 *q++=(unsigned char) (0x80 | (c & 0x3f));
95 static inline int GetNextUTFCode(const char *text,unsigned int *octets)
108 if (text == (const char *) NULL)
113 code=(int) (*text++) & 0xff;
115 for (i=0; i < MaxMultibyteCodes; i++)
117 if ((code & utf_info[i].code_mask) == utf_info[i].code_value)
119 unicode&=utf_info[i].utf_mask;
120 if (unicode < utf_info[i].utf_value)
125 *octets=(unsigned int) (i+1);
128 c=(int) (*text++ ^ 0x80) & 0xff;
134 unicode=(unicode << 6) | c;
140 static inline int GetUTFCode(const char *text)
145 return(GetNextUTFCode(text,&octets));
148 static inline unsigned int GetUTFOctets(const char *text)
153 (void) GetNextUTFCode(text,&octets);
157 static inline MagickBooleanType IsUTFSpace(int code)
159 if (((code >= 0x0009) && (code <= 0x000d)) || (code == 0x0020) ||
160 (code == 0x0085) || (code == 0x00a0) || (code == 0x1680) ||
161 (code == 0x180e) || ((code >= 0x2000) && (code <= 0x200a)) ||
162 (code == 0x2028) || (code == 0x2029) || (code == 0x202f) ||
163 (code == 0x205f) || (code == 0x3000))
168 static inline MagickBooleanType IsUTFValid(int code)
173 mask=(int) 0x7fffffff;
174 if (((code & ~mask) != 0) && ((code < 0xd800) || (code > 0xdfff)) &&
175 (code != 0xfffe) && (code != 0xffff))
180 static inline MagickBooleanType IsUTFAscii(int code)
186 if ((code & ~mask) != 0)
191 #if defined(__cplusplus) || defined(c_plusplus)