2 Copyright 1999-2019 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. You may
6 obtain a copy of the License at
8 https://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
32 IsGlob(const char *) magick_attribute((__pure__));
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)
122 *octets=(unsigned int) (i+1);
125 c=(int) (*text++ ^ 0x80) & 0xff;
128 if (unicode > 0x10FFFF)
130 unicode=(unicode << 6) | c;
136 static inline int GetUTFCode(const char *text)
141 return(GetNextUTFCode(text,&octets));
144 static inline unsigned int GetUTFOctets(const char *text)
149 (void) GetNextUTFCode(text,&octets);
153 static inline MagickBooleanType IsUTFSpace(int code)
155 if (((code >= 0x0009) && (code <= 0x000d)) || (code == 0x0020) ||
156 (code == 0x0085) || (code == 0x00a0) || (code == 0x1680) ||
157 (code == 0x180e) || ((code >= 0x2000) && (code <= 0x200a)) ||
158 (code == 0x2028) || (code == 0x2029) || (code == 0x202f) ||
159 (code == 0x205f) || (code == 0x3000))
164 static inline MagickBooleanType IsUTFValid(int code)
169 mask=(int) 0x7fffffff;
170 if (((code & ~mask) != 0) && ((code < 0xd800) || (code > 0xdfff)) &&
171 (code != 0xfffe) && (code != 0xffff))
176 static inline MagickBooleanType IsUTFAscii(int code)
182 if ((code & ~mask) != 0)
187 #if defined(__cplusplus) || defined(c_plusplus)